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