@contractspec/lib.ui-kit-web 3.7.5 → 3.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (234) hide show
  1. package/README.md +33 -88
  2. package/dist/browser/ui/accordion.js +4 -4
  3. package/dist/browser/ui/alert-dialog.js +9 -9
  4. package/dist/browser/ui/alert.js +4 -4
  5. package/dist/browser/ui/atoms/FilterSelect/FilterSelect.js +51 -51
  6. package/dist/browser/ui/atoms/FilterSelect/index.js +51 -51
  7. package/dist/browser/ui/atoms/LoadingSpinner/LoadingSpinner.js +1 -1
  8. package/dist/browser/ui/atoms/Pagination/Pagination.js +13 -13
  9. package/dist/browser/ui/atoms/Pagination/index.js +13 -13
  10. package/dist/browser/ui/atoms/SearchInput/SearchInput.js +8 -8
  11. package/dist/browser/ui/atoms/SearchInput/index.js +8 -8
  12. package/dist/browser/ui/avatar.js +1 -1
  13. package/dist/browser/ui/badge.js +3 -3
  14. package/dist/browser/ui/breadcrumb.js +4 -4
  15. package/dist/browser/ui/button.js +5 -5
  16. package/dist/browser/ui/calendar.js +21 -21
  17. package/dist/browser/ui/card.js +2 -2
  18. package/dist/browser/ui/carousel.js +6 -6
  19. package/dist/browser/ui/checkbox.js +2 -2
  20. package/dist/browser/ui/command.js +14 -14
  21. package/dist/browser/ui/confirm-dialog.js +9 -9
  22. package/dist/browser/ui/context-menu.js +10 -10
  23. package/dist/browser/ui/cta.js +5 -5
  24. package/dist/browser/ui/data-table.js +1005 -0
  25. package/dist/browser/ui/data-table.parts.js +463 -0
  26. package/dist/browser/ui/date-picker.js +26 -26
  27. package/dist/browser/ui/date-range-picker.js +24 -24
  28. package/dist/browser/ui/datetime-picker.js +29 -29
  29. package/dist/browser/ui/dialog.js +5 -5
  30. package/dist/browser/ui/drawer.js +5 -5
  31. package/dist/browser/ui/dropdown-menu.js +10 -10
  32. package/dist/browser/ui/empty-state.js +5 -5
  33. package/dist/browser/ui/empty.js +7 -7
  34. package/dist/browser/ui/field.js +12 -12
  35. package/dist/browser/ui/form.js +4 -4
  36. package/dist/browser/ui/hover-card.js +2 -2
  37. package/dist/browser/ui/input-group.js +16 -16
  38. package/dist/browser/ui/input-otp.js +4 -4
  39. package/dist/browser/ui/input.js +1 -1
  40. package/dist/browser/ui/label.js +2 -2
  41. package/dist/browser/ui/loading-button.js +8 -8
  42. package/dist/browser/ui/marketing/FeatureGrid.js +3 -3
  43. package/dist/browser/ui/marketing/Hero.js +7 -7
  44. package/dist/browser/ui/marketing/PricingTable.js +10 -10
  45. package/dist/browser/ui/menubar.js +12 -12
  46. package/dist/browser/ui/molecules/Autocomplete/index.js +26 -26
  47. package/dist/browser/ui/molecules/SearchAndFilter/SearchAndFilter.js +62 -62
  48. package/dist/browser/ui/molecules/SearchAndFilter/index.js +62 -62
  49. package/dist/browser/ui/molecules/SkeletonList.js +1 -1
  50. package/dist/browser/ui/nav-layout.js +22 -22
  51. package/dist/browser/ui/navigation-menu.js +7 -7
  52. package/dist/browser/ui/organisms/ErrorBoundary/ErrorBoundary.js +11 -11
  53. package/dist/browser/ui/organisms/ListPage/ListPage.js +84 -84
  54. package/dist/browser/ui/page-header.js +4 -4
  55. package/dist/browser/ui/pagination.js +6 -6
  56. package/dist/browser/ui/popover.js +2 -2
  57. package/dist/browser/ui/progress.js +3 -3
  58. package/dist/browser/ui/radio-group.js +3 -3
  59. package/dist/browser/ui/resizable.js +3 -3
  60. package/dist/browser/ui/scroll-area.js +4 -4
  61. package/dist/browser/ui/section.js +1 -1
  62. package/dist/browser/ui/select.js +6 -6
  63. package/dist/browser/ui/separator.js +2 -2
  64. package/dist/browser/ui/sheet.js +5 -5
  65. package/dist/browser/ui/sidebar.js +64 -64
  66. package/dist/browser/ui/skeleton.js +1 -1
  67. package/dist/browser/ui/slider.js +6 -6
  68. package/dist/browser/ui/stack.js +1 -1
  69. package/dist/browser/ui/stat-card-group.js +5 -5
  70. package/dist/browser/ui/stepper.js +2 -2
  71. package/dist/browser/ui/switch.js +3 -3
  72. package/dist/browser/ui/table.js +5 -5
  73. package/dist/browser/ui/tabs.js +3 -3
  74. package/dist/browser/ui/text.js +2 -2
  75. package/dist/browser/ui/textarea.js +1 -1
  76. package/dist/browser/ui/time-picker.js +10 -10
  77. package/dist/browser/ui/toast.js +5 -5
  78. package/dist/browser/ui/toaster.js +5 -5
  79. package/dist/browser/ui/toggle-group.js +7 -7
  80. package/dist/browser/ui/toggle.js +5 -5
  81. package/dist/browser/ui/tooltip.js +3 -3
  82. package/dist/browser/ui/typography.js +14 -14
  83. package/dist/browser/ui/usecases/UseCaseCard.js +8 -8
  84. package/dist/browser/ui/usecases/UserStoryCard.js +3 -3
  85. package/dist/browser/ui/visualization/Visualization.js +439 -0
  86. package/dist/browser/ui/visualization/Visualization.support.js +128 -0
  87. package/dist/browser/ui/visualization/index.js +10 -0
  88. package/dist/ui/accordion.d.ts +2 -2
  89. package/dist/ui/accordion.js +4 -4
  90. package/dist/ui/alert-dialog.d.ts +2 -2
  91. package/dist/ui/alert-dialog.js +9 -9
  92. package/dist/ui/alert.d.ts +2 -2
  93. package/dist/ui/alert.js +4 -4
  94. package/dist/ui/atoms/FilterSelect/FilterSelect.js +51 -51
  95. package/dist/ui/atoms/FilterSelect/index.d.ts +1 -1
  96. package/dist/ui/atoms/FilterSelect/index.js +51 -51
  97. package/dist/ui/atoms/LoadingSpinner/LoadingSpinner.js +1 -1
  98. package/dist/ui/atoms/LoadingSpinner/index.d.ts +1 -1
  99. package/dist/ui/atoms/Pagination/Pagination.js +13 -13
  100. package/dist/ui/atoms/Pagination/index.js +13 -13
  101. package/dist/ui/atoms/SearchInput/SearchInput.js +8 -8
  102. package/dist/ui/atoms/SearchInput/index.js +8 -8
  103. package/dist/ui/avatar.d.ts +2 -2
  104. package/dist/ui/avatar.js +1 -1
  105. package/dist/ui/badge.d.ts +1 -1
  106. package/dist/ui/badge.js +3 -3
  107. package/dist/ui/breadcrumb.d.ts +1 -1
  108. package/dist/ui/breadcrumb.js +4 -4
  109. package/dist/ui/button.d.ts +1 -1
  110. package/dist/ui/button.js +5 -5
  111. package/dist/ui/calendar.js +21 -21
  112. package/dist/ui/card.d.ts +1 -1
  113. package/dist/ui/card.js +2 -2
  114. package/dist/ui/carousel.d.ts +2 -2
  115. package/dist/ui/carousel.js +6 -6
  116. package/dist/ui/checkbox.d.ts +1 -1
  117. package/dist/ui/checkbox.js +2 -2
  118. package/dist/ui/collapsible.d.ts +1 -1
  119. package/dist/ui/command.d.ts +2 -2
  120. package/dist/ui/command.js +14 -14
  121. package/dist/ui/confirm-dialog.js +9 -9
  122. package/dist/ui/context-menu.d.ts +2 -2
  123. package/dist/ui/context-menu.js +10 -10
  124. package/dist/ui/cta.js +5 -5
  125. package/dist/ui/data-table.d.ts +12 -0
  126. package/dist/ui/data-table.js +1000 -0
  127. package/dist/ui/data-table.parts.d.ts +14 -0
  128. package/dist/ui/data-table.parts.js +458 -0
  129. package/dist/ui/date-picker.js +26 -26
  130. package/dist/ui/date-range-picker.js +24 -24
  131. package/dist/ui/datetime-picker.js +29 -29
  132. package/dist/ui/dialog.d.ts +1 -1
  133. package/dist/ui/dialog.js +5 -5
  134. package/dist/ui/drawer.d.ts +1 -1
  135. package/dist/ui/drawer.js +5 -5
  136. package/dist/ui/dropdown-menu.d.ts +2 -2
  137. package/dist/ui/dropdown-menu.js +10 -10
  138. package/dist/ui/empty-state.d.ts +1 -1
  139. package/dist/ui/empty-state.js +5 -5
  140. package/dist/ui/empty.d.ts +2 -2
  141. package/dist/ui/empty.js +7 -7
  142. package/dist/ui/field.d.ts +2 -2
  143. package/dist/ui/field.js +12 -12
  144. package/dist/ui/form.d.ts +3 -3
  145. package/dist/ui/form.js +4 -4
  146. package/dist/ui/hover-card.d.ts +2 -2
  147. package/dist/ui/hover-card.js +2 -2
  148. package/dist/ui/input-group.d.ts +2 -2
  149. package/dist/ui/input-group.js +16 -16
  150. package/dist/ui/input-otp.d.ts +2 -2
  151. package/dist/ui/input-otp.js +4 -4
  152. package/dist/ui/input.js +1 -1
  153. package/dist/ui/label.d.ts +1 -1
  154. package/dist/ui/label.js +2 -2
  155. package/dist/ui/loading-button.js +8 -8
  156. package/dist/ui/map/index.d.ts +1 -1
  157. package/dist/ui/marketing/FeatureGrid.js +3 -3
  158. package/dist/ui/marketing/Hero.js +7 -7
  159. package/dist/ui/marketing/PricingTable.js +10 -10
  160. package/dist/ui/marketing/index.d.ts +1 -1
  161. package/dist/ui/menubar.d.ts +2 -2
  162. package/dist/ui/menubar.js +12 -12
  163. package/dist/ui/molecules/Autocomplete/index.js +26 -26
  164. package/dist/ui/molecules/SearchAndFilter/SearchAndFilter.js +62 -62
  165. package/dist/ui/molecules/SearchAndFilter/index.js +62 -62
  166. package/dist/ui/molecules/SkeletonList.js +1 -1
  167. package/dist/ui/nav-layout.d.ts +1 -1
  168. package/dist/ui/nav-layout.js +22 -22
  169. package/dist/ui/navigation-menu.d.ts +2 -2
  170. package/dist/ui/navigation-menu.js +7 -7
  171. package/dist/ui/organisms/ErrorBoundary/ErrorBoundary.js +11 -11
  172. package/dist/ui/organisms/ErrorBoundary/index.d.ts +1 -1
  173. package/dist/ui/organisms/ListPage/ListPage.js +84 -84
  174. package/dist/ui/organisms/ListPage/index.d.ts +1 -1
  175. package/dist/ui/organisms/ListPage/types.d.ts +1 -1
  176. package/dist/ui/page-header.d.ts +1 -1
  177. package/dist/ui/page-header.js +4 -4
  178. package/dist/ui/pagination.js +6 -6
  179. package/dist/ui/popover.d.ts +2 -2
  180. package/dist/ui/popover.js +2 -2
  181. package/dist/ui/progress.d.ts +1 -1
  182. package/dist/ui/progress.js +3 -3
  183. package/dist/ui/radio-group.d.ts +1 -1
  184. package/dist/ui/radio-group.js +3 -3
  185. package/dist/ui/resizable.d.ts +2 -2
  186. package/dist/ui/resizable.js +3 -3
  187. package/dist/ui/scroll-area.d.ts +1 -1
  188. package/dist/ui/scroll-area.js +4 -4
  189. package/dist/ui/section.d.ts +1 -1
  190. package/dist/ui/section.js +1 -1
  191. package/dist/ui/select.d.ts +1 -1
  192. package/dist/ui/select.js +6 -6
  193. package/dist/ui/separator.d.ts +1 -1
  194. package/dist/ui/separator.js +2 -2
  195. package/dist/ui/sheet.d.ts +2 -2
  196. package/dist/ui/sheet.js +5 -5
  197. package/dist/ui/sidebar.d.ts +1 -1
  198. package/dist/ui/sidebar.js +64 -64
  199. package/dist/ui/skeleton.js +1 -1
  200. package/dist/ui/slider.d.ts +1 -1
  201. package/dist/ui/slider.js +6 -6
  202. package/dist/ui/stack.d.ts +4 -4
  203. package/dist/ui/stack.js +1 -1
  204. package/dist/ui/stat-card-group.js +5 -5
  205. package/dist/ui/stepper.js +2 -2
  206. package/dist/ui/switch.d.ts +1 -1
  207. package/dist/ui/switch.js +3 -3
  208. package/dist/ui/table.d.ts +1 -1
  209. package/dist/ui/table.js +5 -5
  210. package/dist/ui/tabs.d.ts +2 -2
  211. package/dist/ui/tabs.js +3 -3
  212. package/dist/ui/text.js +2 -2
  213. package/dist/ui/textarea.js +1 -1
  214. package/dist/ui/time-picker.js +10 -10
  215. package/dist/ui/toast.d.ts +2 -2
  216. package/dist/ui/toast.js +5 -5
  217. package/dist/ui/toaster.js +5 -5
  218. package/dist/ui/toggle-group.d.ts +1 -1
  219. package/dist/ui/toggle-group.js +7 -7
  220. package/dist/ui/toggle.d.ts +1 -1
  221. package/dist/ui/toggle.js +5 -5
  222. package/dist/ui/tooltip.d.ts +2 -2
  223. package/dist/ui/tooltip.js +3 -3
  224. package/dist/ui/typography.js +14 -14
  225. package/dist/ui/use-toast.d.ts +1 -1
  226. package/dist/ui/usecases/UseCaseCard.js +8 -8
  227. package/dist/ui/usecases/UserStoryCard.js +3 -3
  228. package/dist/ui/visualization/Visualization.d.ts +9 -0
  229. package/dist/ui/visualization/Visualization.js +434 -0
  230. package/dist/ui/visualization/Visualization.support.d.ts +15 -0
  231. package/dist/ui/visualization/Visualization.support.js +123 -0
  232. package/dist/ui/visualization/index.d.ts +1 -0
  233. package/dist/ui/visualization/index.js +5 -0
  234. package/package.json +75 -12
@@ -0,0 +1,1000 @@
1
+ // @bun
2
+ var __require = import.meta.require;
3
+
4
+ // ui/button.tsx
5
+ import { cn } from "@contractspec/lib.ui-kit-core/utils";
6
+ import { Slot } from "@radix-ui/react-slot";
7
+ import { cva } from "class-variance-authority";
8
+ import { jsxDEV } from "react/jsx-dev-runtime";
9
+ var buttonVariants = cva("inline-flex shrink-0 items-center justify-center gap-2 whitespace-nowrap rounded-md font-medium text-sm outline-hidden transition-all focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0", {
10
+ variants: {
11
+ variant: {
12
+ default: "bg-primary text-primary-foreground hover:bg-primary/90",
13
+ destructive: "bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:bg-destructive/60 dark:focus-visible:ring-destructive/40",
14
+ outline: "border bg-background shadow-2xs hover:bg-accent hover:text-accent-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50",
15
+ secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80",
16
+ ghost: "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",
17
+ link: "text-primary underline-offset-4 hover:underline"
18
+ },
19
+ size: {
20
+ default: "h-9 px-4 py-2 has-[>svg]:px-3",
21
+ sm: "h-8 gap-1.5 rounded-md px-3 has-[>svg]:px-2.5",
22
+ lg: "h-10 rounded-md px-6 has-[>svg]:px-4",
23
+ icon: "size-9"
24
+ }
25
+ },
26
+ defaultVariants: {
27
+ variant: "default",
28
+ size: "default"
29
+ }
30
+ });
31
+ function Button({
32
+ className,
33
+ variant,
34
+ size,
35
+ asChild = false,
36
+ ref,
37
+ ...props
38
+ }) {
39
+ if (asChild) {
40
+ return /* @__PURE__ */ jsxDEV(Slot, {
41
+ "data-slot": "button",
42
+ className: cn(buttonVariants({ variant, size, className })),
43
+ ...props
44
+ }, undefined, false, undefined, this);
45
+ }
46
+ return /* @__PURE__ */ jsxDEV("button", {
47
+ ref,
48
+ "data-slot": "button",
49
+ className: cn(buttonVariants({ variant, size, className })),
50
+ ...props
51
+ }, undefined, false, undefined, this);
52
+ }
53
+ // ui/select.tsx
54
+ import { cn as cn2 } from "@contractspec/lib.ui-kit-core/utils";
55
+ import * as SelectPrimitive from "@radix-ui/react-select";
56
+ import { CheckIcon, ChevronDownIcon, ChevronUpIcon } from "lucide-react";
57
+ import { jsxDEV as jsxDEV2 } from "react/jsx-dev-runtime";
58
+ "use client";
59
+ function Select({
60
+ ...props
61
+ }) {
62
+ return /* @__PURE__ */ jsxDEV2(SelectPrimitive.Root, {
63
+ "data-slot": "select",
64
+ ...props
65
+ }, undefined, false, undefined, this);
66
+ }
67
+ function SelectGroup({
68
+ ...props
69
+ }) {
70
+ return /* @__PURE__ */ jsxDEV2(SelectPrimitive.Group, {
71
+ "data-slot": "select-group",
72
+ ...props
73
+ }, undefined, false, undefined, this);
74
+ }
75
+ function SelectValue({
76
+ ...props
77
+ }) {
78
+ return /* @__PURE__ */ jsxDEV2(SelectPrimitive.Value, {
79
+ "data-slot": "select-value",
80
+ ...props
81
+ }, undefined, false, undefined, this);
82
+ }
83
+ function SelectTrigger({
84
+ className,
85
+ size = "default",
86
+ children,
87
+ ...props
88
+ }) {
89
+ return /* @__PURE__ */ jsxDEV2(SelectPrimitive.Trigger, {
90
+ "data-slot": "select-trigger",
91
+ "data-size": size,
92
+ className: cn2("flex w-fit items-center justify-between gap-2 whitespace-nowrap rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-2xs outline-hidden transition-[color,box-shadow] focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 data-[size=default]:h-9 data-[size=sm]:h-8 data-placeholder:text-muted-foreground *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 dark:bg-input/30 dark:aria-invalid:ring-destructive/40 dark:hover:bg-input/50 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0", className),
93
+ ...props,
94
+ children: [
95
+ children,
96
+ /* @__PURE__ */ jsxDEV2(SelectPrimitive.Icon, {
97
+ asChild: true,
98
+ children: /* @__PURE__ */ jsxDEV2(ChevronDownIcon, {
99
+ className: "size-4 opacity-50"
100
+ }, undefined, false, undefined, this)
101
+ }, undefined, false, undefined, this)
102
+ ]
103
+ }, undefined, true, undefined, this);
104
+ }
105
+ function SelectContent({
106
+ className,
107
+ children,
108
+ position = "popper",
109
+ ...props
110
+ }) {
111
+ return /* @__PURE__ */ jsxDEV2(SelectPrimitive.Portal, {
112
+ children: /* @__PURE__ */ jsxDEV2(SelectPrimitive.Content, {
113
+ "data-slot": "select-content",
114
+ className: cn2("data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 relative z-50 max-h-(--radix-select-content-available-height) min-w-32 origin-(--radix-select-content-transform-origin) overflow-y-auto overflow-x-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=closed]:animate-out data-[state=open]:animate-in", position === "popper" && "data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=bottom]:translate-y-1 data-[side=top]:-translate-y-1", className),
115
+ position,
116
+ ...props,
117
+ children: [
118
+ /* @__PURE__ */ jsxDEV2(SelectScrollUpButton, {}, undefined, false, undefined, this),
119
+ /* @__PURE__ */ jsxDEV2(SelectPrimitive.Viewport, {
120
+ className: cn2("p-1", position === "popper" && "h-(--radix-select-trigger-height) w-full min-w-(--radix-select-trigger-width) scroll-my-1"),
121
+ children
122
+ }, undefined, false, undefined, this),
123
+ /* @__PURE__ */ jsxDEV2(SelectScrollDownButton, {}, undefined, false, undefined, this)
124
+ ]
125
+ }, undefined, true, undefined, this)
126
+ }, undefined, false, undefined, this);
127
+ }
128
+ function SelectLabel({
129
+ className,
130
+ ...props
131
+ }) {
132
+ return /* @__PURE__ */ jsxDEV2(SelectPrimitive.Label, {
133
+ "data-slot": "select-label",
134
+ className: cn2("px-2 py-1.5 text-muted-foreground text-xs", className),
135
+ ...props
136
+ }, undefined, false, undefined, this);
137
+ }
138
+ function SelectItem({
139
+ className,
140
+ children,
141
+ ...props
142
+ }) {
143
+ return /* @__PURE__ */ jsxDEV2(SelectPrimitive.Item, {
144
+ "data-slot": "select-item",
145
+ className: cn2("relative flex w-full cursor-default select-none items-center gap-2 rounded-xs py-1.5 pr-8 pl-2 text-sm outline-hidden focus:bg-accent focus:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2", className),
146
+ ...props,
147
+ children: [
148
+ /* @__PURE__ */ jsxDEV2("span", {
149
+ className: "absolute right-2 flex size-3.5 items-center justify-center",
150
+ children: /* @__PURE__ */ jsxDEV2(SelectPrimitive.ItemIndicator, {
151
+ children: /* @__PURE__ */ jsxDEV2(CheckIcon, {
152
+ className: "size-4"
153
+ }, undefined, false, undefined, this)
154
+ }, undefined, false, undefined, this)
155
+ }, undefined, false, undefined, this),
156
+ /* @__PURE__ */ jsxDEV2(SelectPrimitive.ItemText, {
157
+ children
158
+ }, undefined, false, undefined, this)
159
+ ]
160
+ }, undefined, true, undefined, this);
161
+ }
162
+ function SelectSeparator({
163
+ className,
164
+ ...props
165
+ }) {
166
+ return /* @__PURE__ */ jsxDEV2(SelectPrimitive.Separator, {
167
+ "data-slot": "select-separator",
168
+ className: cn2("pointer-events-none -mx-1 my-1 h-px bg-border", className),
169
+ ...props
170
+ }, undefined, false, undefined, this);
171
+ }
172
+ function SelectScrollUpButton({
173
+ className,
174
+ ...props
175
+ }) {
176
+ return /* @__PURE__ */ jsxDEV2(SelectPrimitive.ScrollUpButton, {
177
+ "data-slot": "select-scroll-up-button",
178
+ className: cn2("flex cursor-default items-center justify-center py-1", className),
179
+ ...props,
180
+ children: /* @__PURE__ */ jsxDEV2(ChevronUpIcon, {
181
+ className: "size-4"
182
+ }, undefined, false, undefined, this)
183
+ }, undefined, false, undefined, this);
184
+ }
185
+ function SelectScrollDownButton({
186
+ className,
187
+ ...props
188
+ }) {
189
+ return /* @__PURE__ */ jsxDEV2(SelectPrimitive.ScrollDownButton, {
190
+ "data-slot": "select-scroll-down-button",
191
+ className: cn2("flex cursor-default items-center justify-center py-1", className),
192
+ ...props,
193
+ children: /* @__PURE__ */ jsxDEV2(ChevronDownIcon, {
194
+ className: "size-4"
195
+ }, undefined, false, undefined, this)
196
+ }, undefined, false, undefined, this);
197
+ }
198
+ // ui/utils.ts
199
+ import { clsx } from "clsx";
200
+ import { twMerge } from "tailwind-merge";
201
+ function cn3(...inputs) {
202
+ return twMerge(clsx(inputs));
203
+ }
204
+
205
+ // ui/atoms/Pagination/Pagination.tsx
206
+ import {
207
+ ChevronLeft,
208
+ ChevronRight,
209
+ ChevronsLeft,
210
+ ChevronsRight
211
+ } from "lucide-react";
212
+ import { jsxDEV as jsxDEV3 } from "react/jsx-dev-runtime";
213
+ var Pagination = ({
214
+ currentPage,
215
+ totalPages,
216
+ totalItems,
217
+ itemsPerPage,
218
+ onPageChange,
219
+ onItemsPerPageChange,
220
+ disabled = false,
221
+ className = "",
222
+ showItemsPerPage = true,
223
+ itemsPerPageOptions = [10, 25, 50, 100]
224
+ }) => {
225
+ const startItem = (currentPage - 1) * itemsPerPage + 1;
226
+ const endItem = Math.min(currentPage * itemsPerPage, totalItems);
227
+ const canGoPrevious = currentPage > 1 && !disabled;
228
+ const canGoNext = currentPage < totalPages && !disabled;
229
+ const getVisiblePageNumbers = () => {
230
+ if (totalPages <= 7) {
231
+ return Array.from({ length: totalPages }, (_, i) => i + 1);
232
+ }
233
+ if (currentPage <= 3) {
234
+ return [1, 2, 3, 4, 5, -1, totalPages];
235
+ }
236
+ if (currentPage >= totalPages - 2) {
237
+ return [
238
+ 1,
239
+ -1,
240
+ totalPages - 4,
241
+ totalPages - 3,
242
+ totalPages - 2,
243
+ totalPages - 1,
244
+ totalPages
245
+ ];
246
+ }
247
+ return [
248
+ 1,
249
+ -1,
250
+ currentPage - 1,
251
+ currentPage,
252
+ currentPage + 1,
253
+ -1,
254
+ totalPages
255
+ ];
256
+ };
257
+ if (totalPages === 0)
258
+ return null;
259
+ return /* @__PURE__ */ jsxDEV3("div", {
260
+ className: `flex flex-col items-center justify-between gap-4 sm:flex-row ${className}`,
261
+ children: [
262
+ /* @__PURE__ */ jsxDEV3("div", {
263
+ className: "order-2 text-base text-muted-foreground sm:order-1",
264
+ children: [
265
+ "Affichage de ",
266
+ startItem,
267
+ " \xE0 ",
268
+ endItem,
269
+ " sur ",
270
+ totalItems,
271
+ " r\xE9sultats"
272
+ ]
273
+ }, undefined, true, undefined, this),
274
+ /* @__PURE__ */ jsxDEV3("div", {
275
+ className: "order-1 flex items-center gap-2 sm:order-2",
276
+ children: [
277
+ /* @__PURE__ */ jsxDEV3(Button, {
278
+ variant: "outline",
279
+ size: "sm",
280
+ onClick: () => onPageChange(1),
281
+ disabled: !canGoPrevious,
282
+ className: "hidden h-8 w-8 p-0 sm:flex",
283
+ children: [
284
+ /* @__PURE__ */ jsxDEV3(ChevronsLeft, {
285
+ className: "h-4 w-4"
286
+ }, undefined, false, undefined, this),
287
+ /* @__PURE__ */ jsxDEV3("span", {
288
+ className: "sr-only",
289
+ children: "Premi\xE8re page"
290
+ }, undefined, false, undefined, this)
291
+ ]
292
+ }, undefined, true, undefined, this),
293
+ /* @__PURE__ */ jsxDEV3(Button, {
294
+ variant: "outline",
295
+ size: "sm",
296
+ onClick: () => onPageChange(currentPage - 1),
297
+ disabled: !canGoPrevious,
298
+ className: "h-8 w-8 p-0",
299
+ children: [
300
+ /* @__PURE__ */ jsxDEV3(ChevronLeft, {
301
+ className: "h-4 w-4"
302
+ }, undefined, false, undefined, this),
303
+ /* @__PURE__ */ jsxDEV3("span", {
304
+ className: "sr-only",
305
+ children: "Page pr\xE9c\xE9dente"
306
+ }, undefined, false, undefined, this)
307
+ ]
308
+ }, undefined, true, undefined, this),
309
+ /* @__PURE__ */ jsxDEV3("div", {
310
+ className: "flex items-center gap-1",
311
+ children: getVisiblePageNumbers().map((page, index) => {
312
+ if (page === -1) {
313
+ return /* @__PURE__ */ jsxDEV3("span", {
314
+ className: "px-2 py-1 text-muted-foreground",
315
+ children: "..."
316
+ }, `ellipsis-${index}`, false, undefined, this);
317
+ }
318
+ return /* @__PURE__ */ jsxDEV3(Button, {
319
+ variant: page === currentPage ? "default" : "outline",
320
+ size: "sm",
321
+ onClick: () => onPageChange(page),
322
+ disabled,
323
+ className: "h-8 min-w-8 px-2",
324
+ children: page
325
+ }, page, false, undefined, this);
326
+ })
327
+ }, undefined, false, undefined, this),
328
+ /* @__PURE__ */ jsxDEV3(Button, {
329
+ variant: "outline",
330
+ size: "sm",
331
+ onClick: () => onPageChange(currentPage + 1),
332
+ disabled: !canGoNext,
333
+ className: "h-8 w-8 p-0",
334
+ children: [
335
+ /* @__PURE__ */ jsxDEV3(ChevronRight, {
336
+ className: "h-4 w-4"
337
+ }, undefined, false, undefined, this),
338
+ /* @__PURE__ */ jsxDEV3("span", {
339
+ className: "sr-only",
340
+ children: "Page suivante"
341
+ }, undefined, false, undefined, this)
342
+ ]
343
+ }, undefined, true, undefined, this),
344
+ /* @__PURE__ */ jsxDEV3(Button, {
345
+ variant: "outline",
346
+ size: "sm",
347
+ onClick: () => onPageChange(totalPages),
348
+ disabled: !canGoNext,
349
+ className: "hidden h-8 w-8 p-0 sm:flex",
350
+ children: [
351
+ /* @__PURE__ */ jsxDEV3(ChevronsRight, {
352
+ className: "h-4 w-4"
353
+ }, undefined, false, undefined, this),
354
+ /* @__PURE__ */ jsxDEV3("span", {
355
+ className: "sr-only",
356
+ children: "Derni\xE8re page"
357
+ }, undefined, false, undefined, this)
358
+ ]
359
+ }, undefined, true, undefined, this)
360
+ ]
361
+ }, undefined, true, undefined, this),
362
+ showItemsPerPage && onItemsPerPageChange && /* @__PURE__ */ jsxDEV3("div", {
363
+ className: "order-3 flex items-center gap-2 text-base",
364
+ children: [
365
+ /* @__PURE__ */ jsxDEV3("span", {
366
+ className: "text-muted-foreground",
367
+ children: "Afficher:"
368
+ }, undefined, false, undefined, this),
369
+ /* @__PURE__ */ jsxDEV3(Select, {
370
+ value: itemsPerPage.toString(),
371
+ onValueChange: (value) => onItemsPerPageChange(parseInt(value)),
372
+ disabled,
373
+ children: [
374
+ /* @__PURE__ */ jsxDEV3(SelectTrigger, {
375
+ className: "h-8 w-16",
376
+ children: /* @__PURE__ */ jsxDEV3(SelectValue, {}, undefined, false, undefined, this)
377
+ }, undefined, false, undefined, this),
378
+ /* @__PURE__ */ jsxDEV3(SelectContent, {
379
+ className: "bg-background",
380
+ children: itemsPerPageOptions.map((option) => /* @__PURE__ */ jsxDEV3(SelectItem, {
381
+ value: option.toString(),
382
+ children: option
383
+ }, option, false, undefined, this))
384
+ }, undefined, false, undefined, this)
385
+ ]
386
+ }, undefined, true, undefined, this)
387
+ ]
388
+ }, undefined, true, undefined, this)
389
+ ]
390
+ }, undefined, true, undefined, this);
391
+ };
392
+ // ui/checkbox.tsx
393
+ import { cn as cn4 } from "@contractspec/lib.ui-kit-core/utils";
394
+ import * as CheckboxPrimitive from "@radix-ui/react-checkbox";
395
+ import { CheckIcon as CheckIcon2 } from "lucide-react";
396
+ import { jsxDEV as jsxDEV4 } from "react/jsx-dev-runtime";
397
+ "use client";
398
+ function Checkbox({
399
+ className,
400
+ ...props
401
+ }) {
402
+ return /* @__PURE__ */ jsxDEV4(CheckboxPrimitive.Root, {
403
+ "data-slot": "checkbox",
404
+ className: cn4("peer size-4 shrink-0 rounded-[4px] border border-input shadow-xs outline-none transition-shadow focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 data-[state=checked]:border-primary data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground dark:bg-input/30 dark:data-[state=checked]:bg-primary dark:aria-invalid:ring-destructive/40", className),
405
+ ...props,
406
+ children: /* @__PURE__ */ jsxDEV4(CheckboxPrimitive.Indicator, {
407
+ "data-slot": "checkbox-indicator",
408
+ className: "grid place-content-center text-current transition-none",
409
+ children: /* @__PURE__ */ jsxDEV4(CheckIcon2, {
410
+ className: "size-3.5"
411
+ }, undefined, false, undefined, this)
412
+ }, undefined, false, undefined, this)
413
+ }, undefined, false, undefined, this);
414
+ }
415
+ // ui/dropdown-menu.tsx
416
+ import { cn as cn5 } from "@contractspec/lib.ui-kit-core/utils";
417
+ import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu";
418
+ import { CheckIcon as CheckIcon3, ChevronRightIcon, CircleIcon } from "lucide-react";
419
+ import { jsxDEV as jsxDEV5 } from "react/jsx-dev-runtime";
420
+ "use client";
421
+ function DropdownMenu({
422
+ ...props
423
+ }) {
424
+ return /* @__PURE__ */ jsxDEV5(DropdownMenuPrimitive.Root, {
425
+ "data-slot": "dropdown-menu",
426
+ ...props
427
+ }, undefined, false, undefined, this);
428
+ }
429
+ function DropdownMenuPortal({
430
+ ...props
431
+ }) {
432
+ return /* @__PURE__ */ jsxDEV5(DropdownMenuPrimitive.Portal, {
433
+ "data-slot": "dropdown-menu-portal",
434
+ ...props
435
+ }, undefined, false, undefined, this);
436
+ }
437
+ function DropdownMenuTrigger({
438
+ ...props
439
+ }) {
440
+ return /* @__PURE__ */ jsxDEV5(DropdownMenuPrimitive.Trigger, {
441
+ "data-slot": "dropdown-menu-trigger",
442
+ ...props
443
+ }, undefined, false, undefined, this);
444
+ }
445
+ function DropdownMenuContent({
446
+ className,
447
+ sideOffset = 4,
448
+ ...props
449
+ }) {
450
+ return /* @__PURE__ */ jsxDEV5(DropdownMenuPrimitive.Portal, {
451
+ children: /* @__PURE__ */ jsxDEV5(DropdownMenuPrimitive.Content, {
452
+ "data-slot": "dropdown-menu-content",
453
+ sideOffset,
454
+ className: cn5("data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 max-h-(--radix-dropdown-menu-content-available-height) min-w-32 origin-(--radix-dropdown-menu-content-transform-origin) overflow-y-auto overflow-x-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=closed]:animate-out data-[state=open]:animate-in", className),
455
+ ...props
456
+ }, undefined, false, undefined, this)
457
+ }, undefined, false, undefined, this);
458
+ }
459
+ function DropdownMenuGroup({
460
+ ...props
461
+ }) {
462
+ return /* @__PURE__ */ jsxDEV5(DropdownMenuPrimitive.Group, {
463
+ "data-slot": "dropdown-menu-group",
464
+ ...props
465
+ }, undefined, false, undefined, this);
466
+ }
467
+ function DropdownMenuItem({
468
+ className,
469
+ inset,
470
+ variant = "default",
471
+ ...props
472
+ }) {
473
+ return /* @__PURE__ */ jsxDEV5(DropdownMenuPrimitive.Item, {
474
+ "data-slot": "dropdown-menu-item",
475
+ "data-inset": inset,
476
+ "data-variant": variant,
477
+ className: cn5("relative flex cursor-default select-none items-center gap-2 rounded-xs px-2 py-1.5 text-sm outline-hidden focus:bg-accent focus:text-accent-foreground data-disabled:pointer-events-none data-inset:pl-8 data-[variant=destructive]:text-destructive data-disabled:opacity-50 data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 data-[variant=destructive]:*:[svg]:text-destructive!", className),
478
+ ...props
479
+ }, undefined, false, undefined, this);
480
+ }
481
+ function DropdownMenuCheckboxItem({
482
+ className,
483
+ children,
484
+ checked,
485
+ ...props
486
+ }) {
487
+ return /* @__PURE__ */ jsxDEV5(DropdownMenuPrimitive.CheckboxItem, {
488
+ "data-slot": "dropdown-menu-checkbox-item",
489
+ className: cn5("relative flex cursor-default select-none items-center gap-2 rounded-xs py-1.5 pr-2 pl-8 text-sm outline-hidden focus:bg-accent focus:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0", className),
490
+ checked,
491
+ ...props,
492
+ children: [
493
+ /* @__PURE__ */ jsxDEV5("span", {
494
+ className: "pointer-events-none absolute left-2 flex size-3.5 items-center justify-center",
495
+ children: /* @__PURE__ */ jsxDEV5(DropdownMenuPrimitive.ItemIndicator, {
496
+ children: /* @__PURE__ */ jsxDEV5(CheckIcon3, {
497
+ className: "size-4"
498
+ }, undefined, false, undefined, this)
499
+ }, undefined, false, undefined, this)
500
+ }, undefined, false, undefined, this),
501
+ children
502
+ ]
503
+ }, undefined, true, undefined, this);
504
+ }
505
+ function DropdownMenuRadioGroup({
506
+ ...props
507
+ }) {
508
+ return /* @__PURE__ */ jsxDEV5(DropdownMenuPrimitive.RadioGroup, {
509
+ "data-slot": "dropdown-menu-radio-group",
510
+ ...props
511
+ }, undefined, false, undefined, this);
512
+ }
513
+ function DropdownMenuRadioItem({
514
+ className,
515
+ children,
516
+ ...props
517
+ }) {
518
+ return /* @__PURE__ */ jsxDEV5(DropdownMenuPrimitive.RadioItem, {
519
+ "data-slot": "dropdown-menu-radio-item",
520
+ className: cn5("relative flex cursor-default select-none items-center gap-2 rounded-xs py-1.5 pr-2 pl-8 text-sm outline-hidden focus:bg-accent focus:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0", className),
521
+ ...props,
522
+ children: [
523
+ /* @__PURE__ */ jsxDEV5("span", {
524
+ className: "pointer-events-none absolute left-2 flex size-3.5 items-center justify-center",
525
+ children: /* @__PURE__ */ jsxDEV5(DropdownMenuPrimitive.ItemIndicator, {
526
+ children: /* @__PURE__ */ jsxDEV5(CircleIcon, {
527
+ className: "size-2 fill-current"
528
+ }, undefined, false, undefined, this)
529
+ }, undefined, false, undefined, this)
530
+ }, undefined, false, undefined, this),
531
+ children
532
+ ]
533
+ }, undefined, true, undefined, this);
534
+ }
535
+ function DropdownMenuLabel({
536
+ className,
537
+ inset,
538
+ ...props
539
+ }) {
540
+ return /* @__PURE__ */ jsxDEV5(DropdownMenuPrimitive.Label, {
541
+ "data-slot": "dropdown-menu-label",
542
+ "data-inset": inset,
543
+ className: cn5("px-2 py-1.5 font-medium text-sm data-inset:pl-8", className),
544
+ ...props
545
+ }, undefined, false, undefined, this);
546
+ }
547
+ function DropdownMenuSeparator({
548
+ className,
549
+ ...props
550
+ }) {
551
+ return /* @__PURE__ */ jsxDEV5(DropdownMenuPrimitive.Separator, {
552
+ "data-slot": "dropdown-menu-separator",
553
+ className: cn5("-mx-1 my-1 h-px bg-border", className),
554
+ ...props
555
+ }, undefined, false, undefined, this);
556
+ }
557
+ function DropdownMenuShortcut({
558
+ className,
559
+ ...props
560
+ }) {
561
+ return /* @__PURE__ */ jsxDEV5("span", {
562
+ "data-slot": "dropdown-menu-shortcut",
563
+ className: cn5("ml-auto text-muted-foreground text-xs tracking-widest", className),
564
+ ...props
565
+ }, undefined, false, undefined, this);
566
+ }
567
+ function DropdownMenuSub({
568
+ ...props
569
+ }) {
570
+ return /* @__PURE__ */ jsxDEV5(DropdownMenuPrimitive.Sub, {
571
+ "data-slot": "dropdown-menu-sub",
572
+ ...props
573
+ }, undefined, false, undefined, this);
574
+ }
575
+ function DropdownMenuSubTrigger({
576
+ className,
577
+ inset,
578
+ children,
579
+ ...props
580
+ }) {
581
+ return /* @__PURE__ */ jsxDEV5(DropdownMenuPrimitive.SubTrigger, {
582
+ "data-slot": "dropdown-menu-sub-trigger",
583
+ "data-inset": inset,
584
+ className: cn5("flex cursor-default select-none items-center rounded-xs px-2 py-1.5 text-sm outline-hidden focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-inset:pl-8 data-[state=open]:text-accent-foreground", className),
585
+ ...props,
586
+ children: [
587
+ children,
588
+ /* @__PURE__ */ jsxDEV5(ChevronRightIcon, {
589
+ className: "ml-auto size-4"
590
+ }, undefined, false, undefined, this)
591
+ ]
592
+ }, undefined, true, undefined, this);
593
+ }
594
+ function DropdownMenuSubContent({
595
+ className,
596
+ ...props
597
+ }) {
598
+ return /* @__PURE__ */ jsxDEV5(DropdownMenuPrimitive.SubContent, {
599
+ "data-slot": "dropdown-menu-sub-content",
600
+ className: cn5("data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-32 origin-(--radix-dropdown-menu-content-transform-origin) overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=closed]:animate-out data-[state=open]:animate-in", className),
601
+ ...props
602
+ }, undefined, false, undefined, this);
603
+ }
604
+ // ui/data-table.parts.tsx
605
+ import {
606
+ ChevronDown,
607
+ ChevronRight as ChevronRight2,
608
+ Columns3,
609
+ GripVertical,
610
+ PanelLeft,
611
+ PanelRight,
612
+ PinOff
613
+ } from "lucide-react";
614
+ import * as React from "react";
615
+ import { jsxDEV as jsxDEV6 } from "react/jsx-dev-runtime";
616
+ "use client";
617
+ function ColumnVisibilityMenu({
618
+ columns
619
+ }) {
620
+ const hideableColumns = columns.filter((column) => column.canHide);
621
+ if (!hideableColumns.length)
622
+ return null;
623
+ return /* @__PURE__ */ jsxDEV6(DropdownMenu, {
624
+ children: [
625
+ /* @__PURE__ */ jsxDEV6(DropdownMenuTrigger, {
626
+ asChild: true,
627
+ children: /* @__PURE__ */ jsxDEV6(Button, {
628
+ variant: "outline",
629
+ size: "sm",
630
+ children: [
631
+ /* @__PURE__ */ jsxDEV6(Columns3, {
632
+ className: "h-4 w-4"
633
+ }, undefined, false, undefined, this),
634
+ "Columns"
635
+ ]
636
+ }, undefined, true, undefined, this)
637
+ }, undefined, false, undefined, this),
638
+ /* @__PURE__ */ jsxDEV6(DropdownMenuContent, {
639
+ align: "end",
640
+ children: [
641
+ /* @__PURE__ */ jsxDEV6(DropdownMenuLabel, {
642
+ children: "Visible Columns"
643
+ }, undefined, false, undefined, this),
644
+ /* @__PURE__ */ jsxDEV6(DropdownMenuSeparator, {}, undefined, false, undefined, this),
645
+ hideableColumns.map((column) => /* @__PURE__ */ jsxDEV6(DropdownMenuCheckboxItem, {
646
+ checked: column.visible,
647
+ onCheckedChange: (checked) => column.toggleVisibility?.(Boolean(checked)),
648
+ children: column.label
649
+ }, column.id, false, undefined, this))
650
+ ]
651
+ }, undefined, true, undefined, this)
652
+ ]
653
+ }, undefined, true, undefined, this);
654
+ }
655
+ function PinMenu({
656
+ column
657
+ }) {
658
+ if (!column.canPin)
659
+ return null;
660
+ return /* @__PURE__ */ jsxDEV6(DropdownMenu, {
661
+ children: [
662
+ /* @__PURE__ */ jsxDEV6(DropdownMenuTrigger, {
663
+ asChild: true,
664
+ children: /* @__PURE__ */ jsxDEV6(Button, {
665
+ variant: "ghost",
666
+ size: "icon",
667
+ className: "h-6 w-6",
668
+ onClick: (event) => event.stopPropagation(),
669
+ children: /* @__PURE__ */ jsxDEV6(Columns3, {
670
+ className: "h-3.5 w-3.5"
671
+ }, undefined, false, undefined, this)
672
+ }, undefined, false, undefined, this)
673
+ }, undefined, false, undefined, this),
674
+ /* @__PURE__ */ jsxDEV6(DropdownMenuContent, {
675
+ align: "start",
676
+ children: [
677
+ /* @__PURE__ */ jsxDEV6(DropdownMenuItem, {
678
+ onClick: () => column.pin?.("left"),
679
+ children: [
680
+ /* @__PURE__ */ jsxDEV6(PanelLeft, {
681
+ className: "h-4 w-4"
682
+ }, undefined, false, undefined, this),
683
+ "Pin Left"
684
+ ]
685
+ }, undefined, true, undefined, this),
686
+ /* @__PURE__ */ jsxDEV6(DropdownMenuItem, {
687
+ onClick: () => column.pin?.("right"),
688
+ children: [
689
+ /* @__PURE__ */ jsxDEV6(PanelRight, {
690
+ className: "h-4 w-4"
691
+ }, undefined, false, undefined, this),
692
+ "Pin Right"
693
+ ]
694
+ }, undefined, true, undefined, this),
695
+ /* @__PURE__ */ jsxDEV6(DropdownMenuItem, {
696
+ onClick: () => column.pin?.(false),
697
+ children: [
698
+ /* @__PURE__ */ jsxDEV6(PinOff, {
699
+ className: "h-4 w-4"
700
+ }, undefined, false, undefined, this),
701
+ "Unpin"
702
+ ]
703
+ }, undefined, true, undefined, this)
704
+ ]
705
+ }, undefined, true, undefined, this)
706
+ ]
707
+ }, undefined, true, undefined, this);
708
+ }
709
+ function ResizeHandle({
710
+ column
711
+ }) {
712
+ const lastX = React.useRef(null);
713
+ const onMouseDown = React.useCallback((event) => {
714
+ event.preventDefault();
715
+ event.stopPropagation();
716
+ lastX.current = event.clientX;
717
+ const onMouseMove = (moveEvent) => {
718
+ if (lastX.current == null)
719
+ return;
720
+ const delta = moveEvent.clientX - lastX.current;
721
+ lastX.current = moveEvent.clientX;
722
+ column.resizeBy?.(delta);
723
+ };
724
+ const onMouseUp = () => {
725
+ lastX.current = null;
726
+ window.removeEventListener("mousemove", onMouseMove);
727
+ window.removeEventListener("mouseup", onMouseUp);
728
+ };
729
+ window.addEventListener("mousemove", onMouseMove);
730
+ window.addEventListener("mouseup", onMouseUp);
731
+ }, [column]);
732
+ return /* @__PURE__ */ jsxDEV6("span", {
733
+ role: "separator",
734
+ "aria-orientation": "vertical",
735
+ tabIndex: -1,
736
+ className: "absolute inset-y-0 right-0 flex w-3 cursor-col-resize items-center justify-center",
737
+ onMouseDown,
738
+ children: /* @__PURE__ */ jsxDEV6(GripVertical, {
739
+ className: "h-3.5 w-3.5 text-muted-foreground"
740
+ }, undefined, false, undefined, this)
741
+ }, undefined, false, undefined, this);
742
+ }
743
+ function renderHeaderContent(controller, column) {
744
+ if (column.kind === "selection" && controller.selectionMode === "multiple") {
745
+ return /* @__PURE__ */ jsxDEV6(Checkbox, {
746
+ checked: controller.allRowsSelected || (controller.someRowsSelected ? "indeterminate" : false),
747
+ onCheckedChange: (checked) => controller.toggleAllRowsSelected?.(Boolean(checked)),
748
+ onClick: (event) => event.stopPropagation()
749
+ }, undefined, false, undefined, this);
750
+ }
751
+ if (column.kind === "expansion")
752
+ return null;
753
+ return column.header;
754
+ }
755
+ function renderCellContent(row, cell) {
756
+ if (!cell)
757
+ return null;
758
+ if (cell.kind === "selection") {
759
+ return /* @__PURE__ */ jsxDEV6(Checkbox, {
760
+ checked: row.isSelected,
761
+ onCheckedChange: (checked) => row.toggleSelected?.(Boolean(checked))
762
+ }, undefined, false, undefined, this);
763
+ }
764
+ if (cell.kind === "expansion") {
765
+ return row.canExpand ? /* @__PURE__ */ jsxDEV6(Button, {
766
+ variant: "ghost",
767
+ size: "icon",
768
+ className: "h-7 w-7",
769
+ onClick: () => row.toggleExpanded?.(),
770
+ children: row.isExpanded ? /* @__PURE__ */ jsxDEV6(ChevronDown, {
771
+ className: "h-4 w-4"
772
+ }, undefined, false, undefined, this) : /* @__PURE__ */ jsxDEV6(ChevronRight2, {
773
+ className: "h-4 w-4"
774
+ }, undefined, false, undefined, this)
775
+ }, undefined, false, undefined, this) : null;
776
+ }
777
+ return cell.content;
778
+ }
779
+ function stickyStyle(column, isHeader = false) {
780
+ return {
781
+ width: column.size,
782
+ minWidth: column.size,
783
+ maxWidth: column.size,
784
+ left: column.pinState === "left" ? column.stickyOffset : undefined,
785
+ right: column.pinState === "right" ? column.stickyOffset : undefined,
786
+ position: column.pinState ? "sticky" : "relative",
787
+ zIndex: column.pinState ? isHeader ? 30 : 20 : undefined
788
+ };
789
+ }
790
+
791
+ // ui/skeleton.tsx
792
+ import { jsxDEV as jsxDEV7 } from "react/jsx-dev-runtime";
793
+ function Skeleton({
794
+ className,
795
+ ...props
796
+ }) {
797
+ return /* @__PURE__ */ jsxDEV7("div", {
798
+ "data-slot": "skeleton",
799
+ className: cn3("animate-pulse rounded-md bg-accent", className),
800
+ ...props
801
+ }, undefined, false, undefined, this);
802
+ }
803
+ // ui/table.tsx
804
+ import { cn as cn6 } from "@contractspec/lib.ui-kit-core/utils";
805
+ import { jsxDEV as jsxDEV8 } from "react/jsx-dev-runtime";
806
+ "use client";
807
+ function Table({
808
+ className,
809
+ ...props
810
+ }) {
811
+ return /* @__PURE__ */ jsxDEV8("div", {
812
+ "data-slot": "table-container",
813
+ className: "relative w-full overflow-x-auto",
814
+ children: /* @__PURE__ */ jsxDEV8("table", {
815
+ "data-slot": "table",
816
+ className: cn6("w-full caption-bottom text-sm", className),
817
+ ...props
818
+ }, undefined, false, undefined, this)
819
+ }, undefined, false, undefined, this);
820
+ }
821
+ function TableHeader({
822
+ className,
823
+ ...props
824
+ }) {
825
+ return /* @__PURE__ */ jsxDEV8("thead", {
826
+ "data-slot": "table-header",
827
+ className: cn6("[&_tr]:border-b", className),
828
+ ...props
829
+ }, undefined, false, undefined, this);
830
+ }
831
+ function TableBody({
832
+ className,
833
+ ...props
834
+ }) {
835
+ return /* @__PURE__ */ jsxDEV8("tbody", {
836
+ "data-slot": "table-body",
837
+ className: cn6("[&_tr:last-child]:border-0", className),
838
+ ...props
839
+ }, undefined, false, undefined, this);
840
+ }
841
+ function TableFooter({
842
+ className,
843
+ ...props
844
+ }) {
845
+ return /* @__PURE__ */ jsxDEV8("tfoot", {
846
+ "data-slot": "table-footer",
847
+ className: cn6("border-t bg-muted/50 font-medium [&>tr]:last:border-b-0", className),
848
+ ...props
849
+ }, undefined, false, undefined, this);
850
+ }
851
+ function TableRow({
852
+ className,
853
+ ...props
854
+ }) {
855
+ return /* @__PURE__ */ jsxDEV8("tr", {
856
+ "data-slot": "table-row",
857
+ className: cn6("border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted", className),
858
+ ...props
859
+ }, undefined, false, undefined, this);
860
+ }
861
+ function TableHead({
862
+ className,
863
+ ...props
864
+ }) {
865
+ return /* @__PURE__ */ jsxDEV8("th", {
866
+ "data-slot": "table-head",
867
+ className: cn6("h-10 whitespace-nowrap px-2 text-left align-middle font-medium text-foreground [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]", className),
868
+ ...props
869
+ }, undefined, false, undefined, this);
870
+ }
871
+ function TableCell({
872
+ className,
873
+ ...props
874
+ }) {
875
+ return /* @__PURE__ */ jsxDEV8("td", {
876
+ "data-slot": "table-cell",
877
+ className: cn6("whitespace-nowrap p-2 align-middle [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]", className),
878
+ ...props
879
+ }, undefined, false, undefined, this);
880
+ }
881
+ function TableCaption({
882
+ className,
883
+ ...props
884
+ }) {
885
+ return /* @__PURE__ */ jsxDEV8("caption", {
886
+ "data-slot": "table-caption",
887
+ className: cn6("mt-4 text-muted-foreground text-sm", className),
888
+ ...props
889
+ }, undefined, false, undefined, this);
890
+ }
891
+ // ui/data-table.tsx
892
+ import { cn as cn7 } from "@contractspec/lib.ui-kit-core/utils";
893
+ import * as React2 from "react";
894
+ import { jsxDEV as jsxDEV9 } from "react/jsx-dev-runtime";
895
+ "use client";
896
+ function DataTable({
897
+ controller,
898
+ className,
899
+ toolbar,
900
+ footer,
901
+ emptyState,
902
+ loading,
903
+ onRowPress
904
+ }) {
905
+ return /* @__PURE__ */ jsxDEV9("div", {
906
+ className: cn7("space-y-3", className),
907
+ children: [
908
+ /* @__PURE__ */ jsxDEV9("div", {
909
+ className: "flex items-center justify-between gap-3",
910
+ children: [
911
+ /* @__PURE__ */ jsxDEV9("div", {
912
+ children: toolbar
913
+ }, undefined, false, undefined, this),
914
+ /* @__PURE__ */ jsxDEV9(ColumnVisibilityMenu, {
915
+ columns: controller.columns
916
+ }, undefined, false, undefined, this)
917
+ ]
918
+ }, undefined, true, undefined, this),
919
+ /* @__PURE__ */ jsxDEV9(Table, {
920
+ children: [
921
+ /* @__PURE__ */ jsxDEV9(TableHeader, {
922
+ children: /* @__PURE__ */ jsxDEV9(TableRow, {
923
+ children: controller.visibleColumns.map((column) => /* @__PURE__ */ jsxDEV9(TableHead, {
924
+ className: cn7("relative bg-background", column.canSort && "cursor-pointer select-none"),
925
+ style: stickyStyle(column, true),
926
+ onClick: column.kind === "data" ? column.toggleSorting : undefined,
927
+ children: [
928
+ /* @__PURE__ */ jsxDEV9("div", {
929
+ className: "flex items-center gap-2",
930
+ children: [
931
+ renderHeaderContent(controller, column),
932
+ column.kind === "data" && column.sortDirection ? /* @__PURE__ */ jsxDEV9("span", {
933
+ className: "text-muted-foreground text-xs uppercase",
934
+ children: column.sortDirection
935
+ }, undefined, false, undefined, this) : null,
936
+ column.kind === "data" ? /* @__PURE__ */ jsxDEV9(PinMenu, {
937
+ column
938
+ }, undefined, false, undefined, this) : null
939
+ ]
940
+ }, undefined, true, undefined, this),
941
+ column.canResize ? /* @__PURE__ */ jsxDEV9(ResizeHandle, {
942
+ column
943
+ }, undefined, false, undefined, this) : null
944
+ ]
945
+ }, column.id, true, undefined, this))
946
+ }, undefined, false, undefined, this)
947
+ }, undefined, false, undefined, this),
948
+ /* @__PURE__ */ jsxDEV9(TableBody, {
949
+ children: loading ? Array.from({ length: 5 }).map((_, rowIndex) => /* @__PURE__ */ jsxDEV9(TableRow, {
950
+ children: controller.visibleColumns.map((column) => /* @__PURE__ */ jsxDEV9(TableCell, {
951
+ style: stickyStyle(column),
952
+ children: /* @__PURE__ */ jsxDEV9(Skeleton, {
953
+ className: "h-4 w-full"
954
+ }, undefined, false, undefined, this)
955
+ }, `${column.id}-${rowIndex}`, false, undefined, this))
956
+ }, `loading-${rowIndex}`, false, undefined, this)) : controller.rows.map((row) => /* @__PURE__ */ jsxDEV9(React2.Fragment, {
957
+ children: [
958
+ /* @__PURE__ */ jsxDEV9(TableRow, {
959
+ "data-state": row.isSelected ? "selected" : undefined,
960
+ className: onRowPress ? "cursor-pointer" : undefined,
961
+ onClick: () => onRowPress?.(row),
962
+ children: controller.visibleColumns.map((column) => {
963
+ const cell = row.cells.find((candidate) => candidate.columnId === column.id);
964
+ return /* @__PURE__ */ jsxDEV9(TableCell, {
965
+ style: stickyStyle(column),
966
+ children: renderCellContent(row, cell)
967
+ }, column.id, false, undefined, this);
968
+ })
969
+ }, undefined, false, undefined, this),
970
+ row.isExpanded && row.expandedContent ? /* @__PURE__ */ jsxDEV9(TableRow, {
971
+ children: /* @__PURE__ */ jsxDEV9(TableCell, {
972
+ className: "bg-muted/20 text-muted-foreground text-sm",
973
+ colSpan: controller.visibleColumns.length,
974
+ children: row.expandedContent
975
+ }, undefined, false, undefined, this)
976
+ }, undefined, false, undefined, this) : null
977
+ ]
978
+ }, row.id, true, undefined, this))
979
+ }, undefined, false, undefined, this)
980
+ ]
981
+ }, undefined, true, undefined, this),
982
+ !loading && controller.rows.length === 0 ? emptyState ?? /* @__PURE__ */ jsxDEV9("div", {
983
+ className: "rounded-md border border-dashed p-8 text-center text-muted-foreground text-sm",
984
+ children: "No rows available."
985
+ }, undefined, false, undefined, this) : null,
986
+ controller.pageCount > 0 ? /* @__PURE__ */ jsxDEV9(Pagination, {
987
+ currentPage: controller.pageIndex + 1,
988
+ totalPages: controller.pageCount,
989
+ totalItems: controller.totalItems,
990
+ itemsPerPage: controller.pageSize,
991
+ onPageChange: (page) => controller.setPageIndex(page - 1),
992
+ onItemsPerPageChange: (pageSize) => controller.setPageSize(pageSize)
993
+ }, undefined, false, undefined, this) : null,
994
+ footer
995
+ ]
996
+ }, undefined, true, undefined, this);
997
+ }
998
+ export {
999
+ DataTable
1000
+ };