@contractspec/lib.ui-kit-web 3.7.6 → 3.9.2

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 +1009 -0
  25. package/dist/browser/ui/data-table.parts.js +467 -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 +447 -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 +1004 -0
  127. package/dist/ui/data-table.parts.d.ts +14 -0
  128. package/dist/ui/data-table.parts.js +462 -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 +442 -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,1009 @@
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-label": `Resize ${column.label} column`,
740
+ "aria-orientation": "vertical",
741
+ tabIndex: -1,
742
+ className: "absolute inset-y-0 right-0 flex w-3 cursor-col-resize items-center justify-center",
743
+ onMouseDown,
744
+ children: /* @__PURE__ */ jsxDEV6(GripVertical, {
745
+ className: "h-3.5 w-3.5 text-muted-foreground"
746
+ }, undefined, false, undefined, this)
747
+ }, undefined, false, undefined, this);
748
+ }
749
+ function renderHeaderContent(controller, column) {
750
+ if (column.kind === "selection" && controller.selectionMode === "multiple") {
751
+ return /* @__PURE__ */ jsxDEV6(Checkbox, {
752
+ "aria-label": "Select all rows",
753
+ checked: controller.allRowsSelected || (controller.someRowsSelected ? "indeterminate" : false),
754
+ onCheckedChange: (checked) => controller.toggleAllRowsSelected?.(Boolean(checked)),
755
+ onClick: (event) => event.stopPropagation()
756
+ }, undefined, false, undefined, this);
757
+ }
758
+ if (column.kind === "expansion")
759
+ return null;
760
+ return column.header;
761
+ }
762
+ function renderCellContent(row, cell) {
763
+ if (!cell)
764
+ return null;
765
+ if (cell.kind === "selection") {
766
+ return /* @__PURE__ */ jsxDEV6(Checkbox, {
767
+ "aria-label": `Select row ${row.id}`,
768
+ checked: row.isSelected,
769
+ onCheckedChange: (checked) => row.toggleSelected?.(Boolean(checked))
770
+ }, undefined, false, undefined, this);
771
+ }
772
+ if (cell.kind === "expansion") {
773
+ return row.canExpand ? /* @__PURE__ */ jsxDEV6(Button, {
774
+ variant: "ghost",
775
+ size: "icon",
776
+ className: "h-7 w-7",
777
+ "aria-label": row.isExpanded ? `Collapse row ${row.id}` : `Expand row ${row.id}`,
778
+ onClick: () => row.toggleExpanded?.(),
779
+ children: row.isExpanded ? /* @__PURE__ */ jsxDEV6(ChevronDown, {
780
+ className: "h-4 w-4"
781
+ }, undefined, false, undefined, this) : /* @__PURE__ */ jsxDEV6(ChevronRight2, {
782
+ className: "h-4 w-4"
783
+ }, undefined, false, undefined, this)
784
+ }, undefined, false, undefined, this) : null;
785
+ }
786
+ return cell.content;
787
+ }
788
+ function stickyStyle(column, isHeader = false) {
789
+ return {
790
+ width: column.size,
791
+ minWidth: column.size,
792
+ maxWidth: column.size,
793
+ left: column.pinState === "left" ? column.stickyOffset : undefined,
794
+ right: column.pinState === "right" ? column.stickyOffset : undefined,
795
+ position: column.pinState ? "sticky" : "relative",
796
+ zIndex: column.pinState ? isHeader ? 30 : 20 : undefined
797
+ };
798
+ }
799
+
800
+ // ui/skeleton.tsx
801
+ import { jsxDEV as jsxDEV7 } from "react/jsx-dev-runtime";
802
+ function Skeleton({
803
+ className,
804
+ ...props
805
+ }) {
806
+ return /* @__PURE__ */ jsxDEV7("div", {
807
+ "data-slot": "skeleton",
808
+ className: cn3("animate-pulse rounded-md bg-accent", className),
809
+ ...props
810
+ }, undefined, false, undefined, this);
811
+ }
812
+ // ui/table.tsx
813
+ import { cn as cn6 } from "@contractspec/lib.ui-kit-core/utils";
814
+ import { jsxDEV as jsxDEV8 } from "react/jsx-dev-runtime";
815
+ "use client";
816
+ function Table({
817
+ className,
818
+ ...props
819
+ }) {
820
+ return /* @__PURE__ */ jsxDEV8("div", {
821
+ "data-slot": "table-container",
822
+ className: "relative w-full overflow-x-auto",
823
+ children: /* @__PURE__ */ jsxDEV8("table", {
824
+ "data-slot": "table",
825
+ className: cn6("w-full caption-bottom text-sm", className),
826
+ ...props
827
+ }, undefined, false, undefined, this)
828
+ }, undefined, false, undefined, this);
829
+ }
830
+ function TableHeader({
831
+ className,
832
+ ...props
833
+ }) {
834
+ return /* @__PURE__ */ jsxDEV8("thead", {
835
+ "data-slot": "table-header",
836
+ className: cn6("[&_tr]:border-b", className),
837
+ ...props
838
+ }, undefined, false, undefined, this);
839
+ }
840
+ function TableBody({
841
+ className,
842
+ ...props
843
+ }) {
844
+ return /* @__PURE__ */ jsxDEV8("tbody", {
845
+ "data-slot": "table-body",
846
+ className: cn6("[&_tr:last-child]:border-0", className),
847
+ ...props
848
+ }, undefined, false, undefined, this);
849
+ }
850
+ function TableFooter({
851
+ className,
852
+ ...props
853
+ }) {
854
+ return /* @__PURE__ */ jsxDEV8("tfoot", {
855
+ "data-slot": "table-footer",
856
+ className: cn6("border-t bg-muted/50 font-medium [&>tr]:last:border-b-0", className),
857
+ ...props
858
+ }, undefined, false, undefined, this);
859
+ }
860
+ function TableRow({
861
+ className,
862
+ ...props
863
+ }) {
864
+ return /* @__PURE__ */ jsxDEV8("tr", {
865
+ "data-slot": "table-row",
866
+ className: cn6("border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted", className),
867
+ ...props
868
+ }, undefined, false, undefined, this);
869
+ }
870
+ function TableHead({
871
+ className,
872
+ ...props
873
+ }) {
874
+ return /* @__PURE__ */ jsxDEV8("th", {
875
+ "data-slot": "table-head",
876
+ 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),
877
+ ...props
878
+ }, undefined, false, undefined, this);
879
+ }
880
+ function TableCell({
881
+ className,
882
+ ...props
883
+ }) {
884
+ return /* @__PURE__ */ jsxDEV8("td", {
885
+ "data-slot": "table-cell",
886
+ className: cn6("whitespace-nowrap p-2 align-middle [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]", className),
887
+ ...props
888
+ }, undefined, false, undefined, this);
889
+ }
890
+ function TableCaption({
891
+ className,
892
+ ...props
893
+ }) {
894
+ return /* @__PURE__ */ jsxDEV8("caption", {
895
+ "data-slot": "table-caption",
896
+ className: cn6("mt-4 text-muted-foreground text-sm", className),
897
+ ...props
898
+ }, undefined, false, undefined, this);
899
+ }
900
+ // ui/data-table.tsx
901
+ import { cn as cn7 } from "@contractspec/lib.ui-kit-core/utils";
902
+ import * as React2 from "react";
903
+ import { jsxDEV as jsxDEV9 } from "react/jsx-dev-runtime";
904
+ "use client";
905
+ function DataTable({
906
+ controller,
907
+ className,
908
+ toolbar,
909
+ footer,
910
+ emptyState,
911
+ loading,
912
+ onRowPress
913
+ }) {
914
+ return /* @__PURE__ */ jsxDEV9("div", {
915
+ className: cn7("space-y-3", className),
916
+ children: [
917
+ /* @__PURE__ */ jsxDEV9("div", {
918
+ className: "flex items-center justify-between gap-3",
919
+ children: [
920
+ /* @__PURE__ */ jsxDEV9("div", {
921
+ children: toolbar
922
+ }, undefined, false, undefined, this),
923
+ /* @__PURE__ */ jsxDEV9(ColumnVisibilityMenu, {
924
+ columns: controller.columns
925
+ }, undefined, false, undefined, this)
926
+ ]
927
+ }, undefined, true, undefined, this),
928
+ /* @__PURE__ */ jsxDEV9(Table, {
929
+ children: [
930
+ /* @__PURE__ */ jsxDEV9(TableHeader, {
931
+ children: /* @__PURE__ */ jsxDEV9(TableRow, {
932
+ children: controller.visibleColumns.map((column) => /* @__PURE__ */ jsxDEV9(TableHead, {
933
+ className: cn7("relative bg-background", column.canSort && "cursor-pointer select-none"),
934
+ style: stickyStyle(column, true),
935
+ onClick: column.kind === "data" ? column.toggleSorting : undefined,
936
+ children: [
937
+ /* @__PURE__ */ jsxDEV9("div", {
938
+ className: "flex items-center gap-2",
939
+ children: [
940
+ renderHeaderContent(controller, column),
941
+ column.kind === "data" && column.sortDirection ? /* @__PURE__ */ jsxDEV9("span", {
942
+ className: "text-muted-foreground text-xs uppercase",
943
+ children: column.sortDirection
944
+ }, undefined, false, undefined, this) : null,
945
+ column.kind === "data" ? /* @__PURE__ */ jsxDEV9(PinMenu, {
946
+ column
947
+ }, undefined, false, undefined, this) : null
948
+ ]
949
+ }, undefined, true, undefined, this),
950
+ column.canResize ? /* @__PURE__ */ jsxDEV9(ResizeHandle, {
951
+ column
952
+ }, undefined, false, undefined, this) : null
953
+ ]
954
+ }, column.id, true, undefined, this))
955
+ }, undefined, false, undefined, this)
956
+ }, undefined, false, undefined, this),
957
+ /* @__PURE__ */ jsxDEV9(TableBody, {
958
+ children: loading ? Array.from({ length: 5 }).map((_, rowIndex) => /* @__PURE__ */ jsxDEV9(TableRow, {
959
+ children: controller.visibleColumns.map((column) => /* @__PURE__ */ jsxDEV9(TableCell, {
960
+ style: stickyStyle(column),
961
+ children: /* @__PURE__ */ jsxDEV9(Skeleton, {
962
+ className: "h-4 w-full"
963
+ }, undefined, false, undefined, this)
964
+ }, `${column.id}-${rowIndex}`, false, undefined, this))
965
+ }, `loading-${rowIndex}`, false, undefined, this)) : controller.rows.map((row) => /* @__PURE__ */ jsxDEV9(React2.Fragment, {
966
+ children: [
967
+ /* @__PURE__ */ jsxDEV9(TableRow, {
968
+ "data-state": row.isSelected ? "selected" : undefined,
969
+ className: onRowPress ? "cursor-pointer" : undefined,
970
+ onClick: () => onRowPress?.(row),
971
+ children: controller.visibleColumns.map((column) => {
972
+ const cell = row.cells.find((candidate) => candidate.columnId === column.id);
973
+ return /* @__PURE__ */ jsxDEV9(TableCell, {
974
+ style: stickyStyle(column),
975
+ children: renderCellContent(row, cell)
976
+ }, column.id, false, undefined, this);
977
+ })
978
+ }, undefined, false, undefined, this),
979
+ row.isExpanded && row.expandedContent ? /* @__PURE__ */ jsxDEV9(TableRow, {
980
+ children: /* @__PURE__ */ jsxDEV9(TableCell, {
981
+ className: "bg-muted/20 text-muted-foreground text-sm",
982
+ colSpan: controller.visibleColumns.length,
983
+ children: row.expandedContent
984
+ }, undefined, false, undefined, this)
985
+ }, undefined, false, undefined, this) : null
986
+ ]
987
+ }, row.id, true, undefined, this))
988
+ }, undefined, false, undefined, this)
989
+ ]
990
+ }, undefined, true, undefined, this),
991
+ !loading && controller.rows.length === 0 ? emptyState ?? /* @__PURE__ */ jsxDEV9("div", {
992
+ className: "rounded-md border border-dashed p-8 text-center text-muted-foreground text-sm",
993
+ children: "No rows available."
994
+ }, undefined, false, undefined, this) : null,
995
+ controller.pageCount > 0 ? /* @__PURE__ */ jsxDEV9(Pagination, {
996
+ currentPage: controller.pageIndex + 1,
997
+ totalPages: controller.pageCount,
998
+ totalItems: controller.totalItems,
999
+ itemsPerPage: controller.pageSize,
1000
+ onPageChange: (page) => controller.setPageIndex(page - 1),
1001
+ onItemsPerPageChange: (pageSize) => controller.setPageSize(pageSize)
1002
+ }, undefined, false, undefined, this) : null,
1003
+ footer
1004
+ ]
1005
+ }, undefined, true, undefined, this);
1006
+ }
1007
+ export {
1008
+ DataTable
1009
+ };