@datum-cloud/datum-ui 0.5.0 → 0.6.0-alpha.3e04d8c

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 (175) hide show
  1. package/README.md +78 -40
  2. package/dist/adapter-context-rWveHhDd.mjs +25 -0
  3. package/dist/autocomplete/index.mjs +1 -1
  4. package/dist/{autocomplete-V5-qslzS.mjs → autocomplete-CkYJueBL.mjs} +2 -2
  5. package/dist/autosearch/index.mjs +195 -0
  6. package/dist/{calendar-date-picker-DWK94_DC.mjs → calendar-date-picker-CDT-8Ha8.mjs} +2 -1
  7. package/dist/combobox/index.mjs +2 -0
  8. package/dist/combobox-B-C9lJeD.mjs +97 -0
  9. package/dist/components/features/autocomplete/autocomplete.d.ts +1 -1
  10. package/dist/components/features/autocomplete/autocomplete.d.ts.map +1 -1
  11. package/dist/components/features/autocomplete/autocomplete.types.d.ts +2 -0
  12. package/dist/components/features/autocomplete/autocomplete.types.d.ts.map +1 -1
  13. package/dist/components/features/autosearch/autosearch.d.ts +35 -0
  14. package/dist/components/features/autosearch/autosearch.d.ts.map +1 -0
  15. package/dist/components/features/autosearch/autosearch.types.d.ts +51 -0
  16. package/dist/components/features/autosearch/autosearch.types.d.ts.map +1 -0
  17. package/dist/components/features/autosearch/index.d.ts +3 -0
  18. package/dist/components/features/autosearch/index.d.ts.map +1 -0
  19. package/dist/components/features/calendar-date-picker/calendar-date-picker.d.ts +2 -1
  20. package/dist/components/features/calendar-date-picker/calendar-date-picker.d.ts.map +1 -1
  21. package/dist/components/features/combobox/combobox.d.ts +27 -0
  22. package/dist/components/features/combobox/combobox.d.ts.map +1 -0
  23. package/dist/components/features/combobox/index.d.ts +3 -0
  24. package/dist/components/features/combobox/index.d.ts.map +1 -0
  25. package/dist/components/features/combobox/types.d.ts +84 -0
  26. package/dist/components/features/combobox/types.d.ts.map +1 -0
  27. package/dist/components/features/date-time-picker/date-time-picker.d.ts +9 -0
  28. package/dist/components/features/date-time-picker/date-time-picker.d.ts.map +1 -0
  29. package/dist/components/features/date-time-picker/index.d.ts +3 -0
  30. package/dist/components/features/date-time-picker/index.d.ts.map +1 -0
  31. package/dist/components/features/date-time-picker/types.d.ts +59 -0
  32. package/dist/components/features/date-time-picker/types.d.ts.map +1 -0
  33. package/dist/components/features/date-time-picker/utils/format.d.ts +13 -0
  34. package/dist/components/features/date-time-picker/utils/format.d.ts.map +1 -0
  35. package/dist/components/features/date-time-picker/utils/index.d.ts +3 -0
  36. package/dist/components/features/date-time-picker/utils/index.d.ts.map +1 -0
  37. package/dist/components/features/date-time-picker/utils/timezone.d.ts +23 -0
  38. package/dist/components/features/date-time-picker/utils/timezone.d.ts.map +1 -0
  39. package/dist/components/features/form/adapter-context.d.ts +17 -0
  40. package/dist/components/features/form/adapter-context.d.ts.map +1 -0
  41. package/dist/components/features/form/adapter-types.d.ts +120 -0
  42. package/dist/components/features/form/adapter-types.d.ts.map +1 -0
  43. package/dist/components/features/form/adapters/conform/conform-adapter.d.ts +9 -0
  44. package/dist/components/features/form/adapters/conform/conform-adapter.d.ts.map +1 -0
  45. package/dist/components/features/form/adapters/conform/conform-provider.d.ts +22 -0
  46. package/dist/components/features/form/adapters/conform/conform-provider.d.ts.map +1 -0
  47. package/dist/components/features/form/adapters/conform/index.d.ts +3 -0
  48. package/dist/components/features/form/adapters/conform/index.d.ts.map +1 -0
  49. package/dist/components/features/form/adapters/rhf/index.d.ts +3 -0
  50. package/dist/components/features/form/adapters/rhf/index.d.ts.map +1 -0
  51. package/dist/components/features/form/adapters/rhf/rhf-adapter.d.ts +10 -0
  52. package/dist/components/features/form/adapters/rhf/rhf-adapter.d.ts.map +1 -0
  53. package/dist/components/features/form/adapters/rhf/rhf-provider.d.ts +22 -0
  54. package/dist/components/features/form/adapters/rhf/rhf-provider.d.ts.map +1 -0
  55. package/dist/components/features/form/components/form-autocomplete.d.ts.map +1 -1
  56. package/dist/components/features/form/components/form-autosearch.d.ts +37 -0
  57. package/dist/components/features/form/components/form-autosearch.d.ts.map +1 -0
  58. package/dist/components/features/form/components/form-checkbox.d.ts.map +1 -1
  59. package/dist/components/features/form/components/form-combobox.d.ts +80 -0
  60. package/dist/components/features/form/components/form-combobox.d.ts.map +1 -0
  61. package/dist/components/features/form/components/form-copy-box.d.ts +3 -0
  62. package/dist/components/features/form/components/form-copy-box.d.ts.map +1 -1
  63. package/dist/components/features/form/components/form-custom.d.ts.map +1 -1
  64. package/dist/components/features/form/components/form-date-picker.d.ts +40 -0
  65. package/dist/components/features/form/components/form-date-picker.d.ts.map +1 -0
  66. package/dist/components/features/form/components/form-date-time-picker.d.ts +39 -0
  67. package/dist/components/features/form/components/form-date-time-picker.d.ts.map +1 -0
  68. package/dist/components/features/form/components/form-dialog.d.ts.map +1 -1
  69. package/dist/components/features/form/components/form-field-array.d.ts +5 -17
  70. package/dist/components/features/form/components/form-field-array.d.ts.map +1 -1
  71. package/dist/components/features/form/components/form-field.d.ts +7 -21
  72. package/dist/components/features/form/components/form-field.d.ts.map +1 -1
  73. package/dist/components/features/form/components/form-input-group.d.ts +4 -4
  74. package/dist/components/features/form/components/form-input-group.d.ts.map +1 -1
  75. package/dist/components/features/form/components/form-input.d.ts.map +1 -1
  76. package/dist/components/features/form/components/form-radio-group.d.ts.map +1 -1
  77. package/dist/components/features/form/components/form-root.d.ts +5 -25
  78. package/dist/components/features/form/components/form-root.d.ts.map +1 -1
  79. package/dist/components/features/form/components/form-select.d.ts.map +1 -1
  80. package/dist/components/features/form/components/form-switch.d.ts.map +1 -1
  81. package/dist/components/features/form/components/form-textarea.d.ts.map +1 -1
  82. package/dist/components/features/form/components/form-time-picker.d.ts +21 -0
  83. package/dist/components/features/form/components/form-time-picker.d.ts.map +1 -0
  84. package/dist/components/features/form/components/form-transfer.d.ts +37 -0
  85. package/dist/components/features/form/components/form-transfer.d.ts.map +1 -0
  86. package/dist/components/features/form/components/index.d.ts +7 -1
  87. package/dist/components/features/form/components/index.d.ts.map +1 -1
  88. package/dist/components/features/form/components/stepper/form-stepper.d.ts.map +1 -1
  89. package/dist/components/features/form/context/form-context.d.ts +2 -2
  90. package/dist/components/features/form/context/form-context.d.ts.map +1 -1
  91. package/dist/components/features/form/hooks/index.d.ts +1 -1
  92. package/dist/components/features/form/hooks/index.d.ts.map +1 -1
  93. package/dist/components/features/form/hooks/use-field.d.ts +12 -18
  94. package/dist/components/features/form/hooks/use-field.d.ts.map +1 -1
  95. package/dist/components/features/form/hooks/use-form-state.d.ts +36 -0
  96. package/dist/components/features/form/hooks/use-form-state.d.ts.map +1 -0
  97. package/dist/components/features/form/hooks/use-watch.d.ts +9 -20
  98. package/dist/components/features/form/hooks/use-watch.d.ts.map +1 -1
  99. package/dist/components/features/form/index.d.ts +69 -45
  100. package/dist/components/features/form/index.d.ts.map +1 -1
  101. package/dist/components/features/form/stepper/index.d.ts +17 -0
  102. package/dist/components/features/form/stepper/index.d.ts.map +1 -0
  103. package/dist/components/features/form/types/index.d.ts +68 -32
  104. package/dist/components/features/form/types/index.d.ts.map +1 -1
  105. package/dist/components/features/form/utils/get-field-constraints.d.ts +33 -0
  106. package/dist/components/features/form/utils/get-field-constraints.d.ts.map +1 -0
  107. package/dist/components/features/form/utils/get-schema-defaults.d.ts +24 -0
  108. package/dist/components/features/form/utils/get-schema-defaults.d.ts.map +1 -0
  109. package/dist/components/features/form/utils/zod-helpers.d.ts +12 -0
  110. package/dist/components/features/form/utils/zod-helpers.d.ts.map +1 -0
  111. package/dist/components/features/time-picker/index.d.ts +3 -0
  112. package/dist/components/features/time-picker/index.d.ts.map +1 -0
  113. package/dist/components/features/time-picker/time-picker.d.ts +22 -0
  114. package/dist/components/features/time-picker/time-picker.d.ts.map +1 -0
  115. package/dist/components/features/time-picker/types.d.ts +31 -0
  116. package/dist/components/features/time-picker/types.d.ts.map +1 -0
  117. package/dist/components/features/transfer/components/index.d.ts +9 -0
  118. package/dist/components/features/transfer/components/index.d.ts.map +1 -0
  119. package/dist/components/features/transfer/components/transfer-group.d.ts +7 -0
  120. package/dist/components/features/transfer/components/transfer-group.d.ts.map +1 -0
  121. package/dist/components/features/transfer/components/transfer-item.d.ts +10 -0
  122. package/dist/components/features/transfer/components/transfer-item.d.ts.map +1 -0
  123. package/dist/components/features/transfer/components/transfer-panel.d.ts +18 -0
  124. package/dist/components/features/transfer/components/transfer-panel.d.ts.map +1 -0
  125. package/dist/components/features/transfer/components/transfer-search.d.ts +9 -0
  126. package/dist/components/features/transfer/components/transfer-search.d.ts.map +1 -0
  127. package/dist/components/features/transfer/hooks/use-transfer-dnd.d.ts +26 -0
  128. package/dist/components/features/transfer/hooks/use-transfer-dnd.d.ts.map +1 -0
  129. package/dist/components/features/transfer/hooks/use-transfer-state.d.ts +20 -0
  130. package/dist/components/features/transfer/hooks/use-transfer-state.d.ts.map +1 -0
  131. package/dist/components/features/transfer/index.d.ts +3 -0
  132. package/dist/components/features/transfer/index.d.ts.map +1 -0
  133. package/dist/components/features/transfer/transfer.d.ts +6 -0
  134. package/dist/components/features/transfer/transfer.d.ts.map +1 -0
  135. package/dist/components/features/transfer/types.d.ts +69 -0
  136. package/dist/components/features/transfer/types.d.ts.map +1 -0
  137. package/dist/data-table/index.mjs +1 -1
  138. package/dist/date-picker/index.mjs +2 -2
  139. package/dist/date-time-picker/index.mjs +2 -0
  140. package/dist/date-time-picker-BomrW07W.mjs +178 -0
  141. package/dist/form/adapters/conform/index.mjs +327 -0
  142. package/dist/form/adapters/rhf/index.mjs +267 -0
  143. package/dist/form/index.mjs +3 -2
  144. package/dist/form/stepper/index.mjs +541 -0
  145. package/dist/form-D8OnRHdd.mjs +1653 -0
  146. package/dist/form-context-Ccxm-wqL.mjs +17 -0
  147. package/dist/get-field-constraints-BicgDkfH.mjs +51 -0
  148. package/dist/grid/index.mjs +1 -1
  149. package/dist/hooks/index.mjs +2 -2
  150. package/dist/index.mjs +16 -15
  151. package/dist/input-number/index.mjs +1 -1
  152. package/dist/map/index.mjs +1 -1
  153. package/dist/{map-ClxB41Hg.mjs → map-CWIQ-eql.mjs} +1 -1
  154. package/dist/more-actions/index.mjs +1 -1
  155. package/dist/page-title/index.mjs +1 -1
  156. package/dist/stepper/index.mjs +1 -320
  157. package/dist/stepper-DvIOp0hh.mjs +321 -0
  158. package/dist/tag-input/index.mjs +1 -1
  159. package/dist/task-queue/index.mjs +1 -1
  160. package/dist/time-picker/index.mjs +2 -0
  161. package/dist/time-picker-BoF7pZZ2.mjs +43 -0
  162. package/dist/transfer/index.mjs +2 -0
  163. package/dist/transfer-B2n8pgEQ.mjs +260 -0
  164. package/package.json +63 -2
  165. package/dist/form-Co3fM4B7.mjs +0 -2114
  166. /package/dist/{col-q-J99UHe.mjs → col-1T0Q3SlH.mjs} +0 -0
  167. /package/dist/{hooks-Cb7YlxN4.mjs → hooks-D8r2M2U6.mjs} +0 -0
  168. /package/dist/{input-number-mDB-5M5C.mjs → input-number-a7uydAsw.mjs} +0 -0
  169. /package/dist/{map-leaflet-imports-CaMm_rdF.mjs → map-leaflet-imports-CRSKA79m.mjs} +0 -0
  170. /package/dist/{more-actions-CGagbIDT.mjs → more-actions-ILnEZq_E.mjs} +0 -0
  171. /package/dist/{page-title-R7QbfbWp.mjs → page-title-ChsnpBiH.mjs} +0 -0
  172. /package/dist/{tag-input-BVSwNcRd.mjs → tag-input-T9cUX9-G.mjs} +0 -0
  173. /package/dist/{task-queue-dropdown-DyM5R8KF.mjs → task-queue-dropdown-Wcbj-f0V.mjs} +0 -0
  174. /package/dist/{to-api-format-BnbRFYQI.mjs → to-api-format-Bh3c01gr.mjs} +0 -0
  175. /package/dist/{use-copy-to-clipboard-BGdTmkFV.mjs → use-copy-to-clipboard-uNeeVHC4.mjs} +0 -0
@@ -0,0 +1,321 @@
1
+ import { t as cn } from "./cn-D2KYQ917.mjs";
2
+ import { t as Button } from "./button-D3RrsMfQ.mjs";
3
+ import { cva } from "class-variance-authority";
4
+ import * as React$1 from "react";
5
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
6
+ import { Slot } from "@radix-ui/react-slot";
7
+ import * as Stepperize from "@stepperize/react";
8
+ //#region src/components/features/stepper/stepper.tsx
9
+ const StepperContext = React$1.createContext(null);
10
+ function useStepperProvider() {
11
+ const context = React$1.use(StepperContext);
12
+ if (!context) throw new Error("useStepper must be used within a StepperProvider.");
13
+ return context;
14
+ }
15
+ const classForNavigationList = cva("flex gap-2", { variants: { variant: {
16
+ horizontal: "flex-row items-center justify-between",
17
+ vertical: "flex-col",
18
+ circle: "flex-row items-center justify-between"
19
+ } } });
20
+ const classForSeparator = cva([
21
+ "bg-muted",
22
+ "data-[state=completed]:bg-primary data-[disabled]:opacity-50",
23
+ "transition-all duration-300 ease-in-out"
24
+ ], { variants: {
25
+ orientation: {
26
+ horizontal: "h-0.5 flex-1",
27
+ vertical: "h-full w-0.5"
28
+ },
29
+ labelOrientation: { vertical: "absolute left-[calc(50%+30px)] right-[calc(-50%+20px)] top-5 block shrink-0" }
30
+ } });
31
+ function defineStepper(...steps) {
32
+ const { Scoped, useStepper, steps: stepList, Stepper: StepperizePrimitives } = Stepperize.defineStepper(...steps);
33
+ const StepperContainer = ({ children, className, ...props }) => {
34
+ const methods = useStepper();
35
+ return /* @__PURE__ */ jsx("div", {
36
+ "date-component": "stepper",
37
+ className: cn("w-full", className),
38
+ ...props,
39
+ children: typeof children === "function" ? children({ methods }) : children
40
+ });
41
+ };
42
+ return {
43
+ steps: stepList,
44
+ useStepper,
45
+ Stepper: {
46
+ ...StepperizePrimitives,
47
+ Provider: ({ variant = "horizontal", labelOrientation = "horizontal", tracking = false, children, className, ...props }) => {
48
+ return /* @__PURE__ */ jsx(StepperContext, {
49
+ value: {
50
+ variant,
51
+ labelOrientation,
52
+ tracking
53
+ },
54
+ children: /* @__PURE__ */ jsx(Scoped, {
55
+ initialStep: props.initialStep,
56
+ initialMetadata: props.initialMetadata,
57
+ children: /* @__PURE__ */ jsx(StepperContainer, {
58
+ className,
59
+ ...props,
60
+ children
61
+ })
62
+ })
63
+ });
64
+ },
65
+ Navigation: ({ children, "aria-label": ariaLabel = "Stepper Navigation", ...props }) => {
66
+ const { variant } = useStepperProvider();
67
+ return /* @__PURE__ */ jsx("nav", {
68
+ "date-component": "stepper-navigation",
69
+ "aria-label": ariaLabel,
70
+ role: "tablist",
71
+ ...props,
72
+ children: /* @__PURE__ */ jsx("ol", {
73
+ "date-component": "stepper-navigation-list",
74
+ className: classForNavigationList({ variant }),
75
+ children
76
+ })
77
+ });
78
+ },
79
+ Step: ({ children, className, icon, ...props }) => {
80
+ const { variant, labelOrientation } = useStepperProvider();
81
+ const stepper = useStepper();
82
+ const steps = stepList;
83
+ const stepIndex = stepper.lookup.getIndex(props.of);
84
+ const step = steps[stepIndex];
85
+ const currentIndex = stepper.lookup.getIndex(stepper.state.current.data.id);
86
+ const isLast = stepper.lookup.getLast().id === props.of;
87
+ const isActive = stepper.state.current.data.id === props.of;
88
+ const dataState = getStepState(currentIndex, stepIndex);
89
+ const childMap = useStepChildren(children);
90
+ const title = childMap.get("title");
91
+ const description = childMap.get("description");
92
+ const panel = childMap.get("panel");
93
+ if (variant === "circle") return /* @__PURE__ */ jsxs("li", {
94
+ "date-component": "stepper-step",
95
+ className: cn("flex shrink-0 items-center gap-4 rounded-md transition-colors", className),
96
+ children: [/* @__PURE__ */ jsx(CircleStepIndicator, {
97
+ currentStep: stepIndex + 1,
98
+ totalSteps: steps.length
99
+ }), /* @__PURE__ */ jsxs("div", {
100
+ "date-component": "stepper-step-content",
101
+ className: "flex flex-col items-start gap-1",
102
+ children: [title, description]
103
+ })]
104
+ });
105
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [
106
+ /* @__PURE__ */ jsxs("li", {
107
+ "date-component": "stepper-step",
108
+ className: cn([
109
+ "group peer relative flex items-center gap-2",
110
+ "data-[variant=vertical]:flex-row",
111
+ "data-[label-orientation=vertical]:w-full",
112
+ "data-[label-orientation=vertical]:flex-col",
113
+ "data-[label-orientation=vertical]:justify-center"
114
+ ]),
115
+ "data-variant": variant,
116
+ "data-label-orientation": labelOrientation,
117
+ "data-state": dataState,
118
+ "data-disabled": props.disabled,
119
+ children: [
120
+ /* @__PURE__ */ jsx(Button, {
121
+ id: `step-${step.id}`,
122
+ "date-component": "stepper-step-indicator",
123
+ type: "button",
124
+ role: "tab",
125
+ tabIndex: dataState !== "inactive" ? 0 : -1,
126
+ className: cn("rounded-full", className),
127
+ variant: dataState !== "inactive" ? "default" : "secondary",
128
+ size: "icon",
129
+ "aria-controls": `step-panel-${props.of}`,
130
+ "aria-current": isActive ? "step" : void 0,
131
+ "aria-posinset": stepIndex + 1,
132
+ "aria-setsize": steps.length,
133
+ "aria-selected": isActive,
134
+ onKeyDown: (e) => onStepKeyDown(e, stepper.lookup.getNext(props.of), stepper.lookup.getPrev(props.of)),
135
+ ...props,
136
+ children: icon ?? stepIndex + 1
137
+ }),
138
+ variant === "horizontal" && labelOrientation === "vertical" && /* @__PURE__ */ jsx(StepperSeparator, {
139
+ orientation: "horizontal",
140
+ labelOrientation,
141
+ isLast,
142
+ state: dataState,
143
+ disabled: props.disabled
144
+ }),
145
+ /* @__PURE__ */ jsxs("div", {
146
+ "date-component": "stepper-step-content",
147
+ className: "flex flex-col items-start",
148
+ children: [title, description]
149
+ })
150
+ ]
151
+ }),
152
+ variant === "horizontal" && labelOrientation === "horizontal" && /* @__PURE__ */ jsx(StepperSeparator, {
153
+ orientation: "horizontal",
154
+ isLast,
155
+ state: dataState,
156
+ disabled: props.disabled
157
+ }),
158
+ variant === "vertical" && /* @__PURE__ */ jsxs("div", {
159
+ className: "flex gap-4",
160
+ children: [!isLast && /* @__PURE__ */ jsx("div", {
161
+ className: "flex justify-center ps-[calc(var(--spacing)_*_4.5_-_1px)]",
162
+ children: /* @__PURE__ */ jsx(StepperSeparator, {
163
+ orientation: "vertical",
164
+ isLast,
165
+ state: dataState,
166
+ disabled: props.disabled
167
+ })
168
+ }), /* @__PURE__ */ jsx("div", {
169
+ className: "my-3 flex-1 ps-4",
170
+ children: panel
171
+ })]
172
+ })
173
+ ] });
174
+ },
175
+ Title,
176
+ Description,
177
+ Panel: ({ children, asChild, ...props }) => {
178
+ const Comp = asChild ? Slot : "div";
179
+ const { tracking } = useStepperProvider();
180
+ return /* @__PURE__ */ jsx(Comp, {
181
+ "date-component": "stepper-step-panel",
182
+ ref: (node) => scrollIntoStepperPanel(node, tracking),
183
+ ...props,
184
+ children
185
+ });
186
+ },
187
+ Controls: ({ children, className, asChild, ...props }) => {
188
+ return /* @__PURE__ */ jsx(asChild ? Slot : "div", {
189
+ "date-component": "stepper-controls",
190
+ className: cn("flex justify-end gap-4", className),
191
+ ...props,
192
+ children
193
+ });
194
+ }
195
+ }
196
+ };
197
+ }
198
+ function Title({ children, className, asChild, ...props }) {
199
+ return /* @__PURE__ */ jsx(asChild ? Slot : "h4", {
200
+ "date-component": "stepper-step-title",
201
+ className: cn("text-base font-medium", className),
202
+ ...props,
203
+ children
204
+ });
205
+ }
206
+ function Description({ children, className, asChild, ...props }) {
207
+ return /* @__PURE__ */ jsx(asChild ? Slot : "p", {
208
+ "date-component": "stepper-step-description",
209
+ className: cn("text-muted-foreground text-sm", className),
210
+ ...props,
211
+ children
212
+ });
213
+ }
214
+ function StepperSeparator({ orientation, isLast, labelOrientation, state, disabled }) {
215
+ if (isLast) return null;
216
+ return /* @__PURE__ */ jsx("div", {
217
+ "date-component": "stepper-separator",
218
+ "data-orientation": orientation,
219
+ "data-state": state,
220
+ "data-disabled": disabled,
221
+ role: "separator",
222
+ tabIndex: -1,
223
+ className: classForSeparator({
224
+ orientation,
225
+ labelOrientation
226
+ })
227
+ });
228
+ }
229
+ function CircleStepIndicator({ currentStep, totalSteps, size = 80, strokeWidth = 6 }) {
230
+ const radius = (size - strokeWidth) / 2;
231
+ const circumference = radius * 2 * Math.PI;
232
+ const dashOffset = circumference - circumference * (currentStep / totalSteps * 100) / 100;
233
+ return /* @__PURE__ */ jsxs("div", {
234
+ "date-component": "stepper-step-indicator",
235
+ role: "progressbar",
236
+ "aria-valuenow": currentStep,
237
+ "aria-valuemin": 1,
238
+ "aria-valuemax": totalSteps,
239
+ tabIndex: -1,
240
+ className: "relative inline-flex items-center justify-center",
241
+ children: [/* @__PURE__ */ jsxs("svg", {
242
+ width: size,
243
+ height: size,
244
+ children: [
245
+ /* @__PURE__ */ jsx("title", { children: "Step Indicator" }),
246
+ /* @__PURE__ */ jsx("circle", {
247
+ cx: size / 2,
248
+ cy: size / 2,
249
+ r: radius,
250
+ fill: "none",
251
+ stroke: "currentColor",
252
+ strokeWidth,
253
+ className: "text-muted-foreground"
254
+ }),
255
+ /* @__PURE__ */ jsx("circle", {
256
+ cx: size / 2,
257
+ cy: size / 2,
258
+ r: radius,
259
+ fill: "none",
260
+ stroke: "currentColor",
261
+ strokeWidth,
262
+ strokeDasharray: circumference,
263
+ strokeDashoffset: dashOffset,
264
+ className: "text-primary transition-all duration-300 ease-in-out",
265
+ transform: `rotate(-90 ${size / 2} ${size / 2})`
266
+ })
267
+ ]
268
+ }), /* @__PURE__ */ jsx("div", {
269
+ className: "absolute inset-0 flex items-center justify-center",
270
+ children: /* @__PURE__ */ jsxs("span", {
271
+ className: "text-sm font-medium",
272
+ "aria-live": "polite",
273
+ children: [
274
+ currentStep,
275
+ " ",
276
+ "of",
277
+ totalSteps
278
+ ]
279
+ })
280
+ })]
281
+ });
282
+ }
283
+ function scrollIntoStepperPanel(node, tracking) {
284
+ if (tracking) node?.scrollIntoView({
285
+ behavior: "smooth",
286
+ block: "center"
287
+ });
288
+ }
289
+ function useStepChildren(children) {
290
+ return React$1.useMemo(() => extractChildren(children), [children]);
291
+ }
292
+ function extractChildren(children) {
293
+ const childrenArray = React$1.Children.toArray(children);
294
+ const map = /* @__PURE__ */ new Map();
295
+ for (const child of childrenArray) if (React$1.isValidElement(child)) if (child.type === Title) map.set("title", child);
296
+ else if (child.type === Description) map.set("description", child);
297
+ else map.set("panel", child);
298
+ return map;
299
+ }
300
+ function onStepKeyDown(e, nextStep, prevStep) {
301
+ const { key } = e;
302
+ const directions = {
303
+ next: ["ArrowRight", "ArrowDown"],
304
+ prev: ["ArrowLeft", "ArrowUp"]
305
+ };
306
+ if (directions.next.includes(key) || directions.prev.includes(key)) {
307
+ const direction = directions.next.includes(key) ? "next" : "prev";
308
+ const step = direction === "next" ? nextStep : prevStep;
309
+ if (!step) return;
310
+ const stepElement = document.getElementById(`step-${step.id}`);
311
+ if (!stepElement) return;
312
+ if (stepElement.parentElement?.getAttribute("data-state") !== "inactive" || direction === "prev") stepElement.focus();
313
+ }
314
+ }
315
+ function getStepState(currentIndex, stepIndex) {
316
+ if (currentIndex === stepIndex) return "active";
317
+ if (currentIndex > stepIndex) return "completed";
318
+ return "inactive";
319
+ }
320
+ //#endregion
321
+ export { defineStepper as t };
@@ -1,2 +1,2 @@
1
- import { t as TagsInput } from "../tag-input-BVSwNcRd.mjs";
1
+ import { t as TagsInput } from "../tag-input-T9cUX9-G.mjs";
2
2
  export { TagsInput };
@@ -1,2 +1,2 @@
1
- import { _ as RedisTaskStorage, a as TaskPanelItem, b as createProjectMetadata, c as TaskPanelHeader, d as useCurrentScope, f as useTasksWithLabels, g as detectStorage, h as TaskQueue, i as TaskPanel, l as getContextLabel, m as TaskQueueProvider, n as TaskSummaryDialog, o as TaskPanelCounter, p as useTaskQueue, r as TaskQueueTrigger, s as TaskPanelActions, t as TaskQueueDropdown, u as matchesCurrentScope, v as LocalTaskStorage, x as createUserMetadata, y as createOrgMetadata } from "../task-queue-dropdown-DyM5R8KF.mjs";
1
+ import { _ as RedisTaskStorage, a as TaskPanelItem, b as createProjectMetadata, c as TaskPanelHeader, d as useCurrentScope, f as useTasksWithLabels, g as detectStorage, h as TaskQueue, i as TaskPanel, l as getContextLabel, m as TaskQueueProvider, n as TaskSummaryDialog, o as TaskPanelCounter, p as useTaskQueue, r as TaskQueueTrigger, s as TaskPanelActions, t as TaskQueueDropdown, u as matchesCurrentScope, v as LocalTaskStorage, x as createUserMetadata, y as createOrgMetadata } from "../task-queue-dropdown-Wcbj-f0V.mjs";
2
2
  export { LocalTaskStorage, RedisTaskStorage, TaskPanel, TaskPanelActions, TaskPanelCounter, TaskPanelHeader, TaskPanelItem, TaskQueue, TaskQueueDropdown, TaskQueueProvider, TaskQueueTrigger, TaskSummaryDialog, createOrgMetadata, createProjectMetadata, createUserMetadata, detectStorage, getContextLabel, matchesCurrentScope, useCurrentScope, useTaskQueue, useTasksWithLabels };
@@ -0,0 +1,2 @@
1
+ import { t as TimePicker } from "../time-picker-BoF7pZZ2.mjs";
2
+ export { TimePicker };
@@ -0,0 +1,43 @@
1
+ import { t as cn } from "./cn-D2KYQ917.mjs";
2
+ import { t as Input } from "./input-FKGqZypx.mjs";
3
+ import * as React$1 from "react";
4
+ import { jsx } from "react/jsx-runtime";
5
+ //#region src/components/features/time-picker/time-picker.tsx
6
+ /**
7
+ * TimePicker - Simple time input component
8
+ *
9
+ * Provides a native HTML time input for selecting hours and minutes.
10
+ * Value format: "HH:mm" (e.g., "14:30")
11
+ *
12
+ * @example
13
+ * ```tsx
14
+ * <TimePicker
15
+ * value="14:30"
16
+ * onChange={(time) => console.log(time)}
17
+ * min="09:00"
18
+ * max="17:00"
19
+ * />
20
+ * ```
21
+ */
22
+ function TimePicker({ value, onChange, min, max, step, placeholder, disabled, className, id, "aria-invalid": ariaInvalid, "aria-describedby": ariaDescribedBy }) {
23
+ const handleChange = React$1.useCallback((e) => {
24
+ onChange?.(e.target.value);
25
+ }, [onChange]);
26
+ return /* @__PURE__ */ jsx(Input, {
27
+ id,
28
+ type: "time",
29
+ value: value || "",
30
+ onChange: handleChange,
31
+ min,
32
+ max,
33
+ step,
34
+ placeholder,
35
+ disabled,
36
+ className: cn(className),
37
+ "aria-invalid": ariaInvalid,
38
+ "aria-describedby": ariaDescribedBy
39
+ });
40
+ }
41
+ TimePicker.displayName = "TimePicker";
42
+ //#endregion
43
+ export { TimePicker as t };
@@ -0,0 +1,2 @@
1
+ import { t as Transfer } from "../transfer-B2n8pgEQ.mjs";
2
+ export { Transfer };
@@ -0,0 +1,260 @@
1
+ import { t as cn } from "./cn-D2KYQ917.mjs";
2
+ import { t as Button } from "./button-BllvE9Lm.mjs";
3
+ import { Search, X } from "lucide-react";
4
+ import * as React$1 from "react";
5
+ import { useCallback, useEffect, useMemo, useState } from "react";
6
+ import { jsx, jsxs } from "react/jsx-runtime";
7
+ //#region src/components/features/transfer/components/transfer-group.tsx
8
+ const TransferGroup = ({ title, children }) => {
9
+ return /* @__PURE__ */ jsxs("div", {
10
+ className: "space-y-1",
11
+ children: [/* @__PURE__ */ jsx("div", {
12
+ className: "text-xs font-semibold text-muted-foreground px-2 py-1",
13
+ children: title
14
+ }), children]
15
+ });
16
+ };
17
+ //#endregion
18
+ //#region src/components/features/transfer/components/transfer-item.tsx
19
+ const TransferItem = ({ label, onClick, disabled = false, panelType }) => {
20
+ return /* @__PURE__ */ jsxs("div", {
21
+ className: cn("group flex items-center gap-2 rounded p-2", "hover:bg-accent transition-colors", panelType === "source" && "cursor-pointer", disabled && "opacity-50 cursor-not-allowed"),
22
+ role: panelType === "source" && !disabled ? "button" : void 0,
23
+ tabIndex: panelType === "source" && !disabled ? 0 : void 0,
24
+ onClick: panelType === "source" && !disabled ? onClick : void 0,
25
+ onKeyDown: (e) => {
26
+ if (!disabled && panelType === "source" && (e.key === "Enter" || e.key === " ")) {
27
+ e.preventDefault();
28
+ onClick();
29
+ }
30
+ },
31
+ children: [/* @__PURE__ */ jsx("div", {
32
+ className: "min-w-0 flex-1",
33
+ children: /* @__PURE__ */ jsx("div", {
34
+ className: "text-sm font-medium",
35
+ children: label
36
+ })
37
+ }), panelType === "target" && /* @__PURE__ */ jsx("button", {
38
+ type: "button",
39
+ "aria-label": `Remove ${label}`,
40
+ className: "h-6 w-6 p-0 rounded opacity-0 group-hover:opacity-100 hover:bg-muted transition-opacity inline-flex items-center justify-center",
41
+ onClick,
42
+ disabled,
43
+ children: /* @__PURE__ */ jsx(X, { className: "h-4 w-4" })
44
+ })]
45
+ });
46
+ };
47
+ //#endregion
48
+ //#region src/components/features/transfer/components/transfer-search.tsx
49
+ const TransferSearch = ({ value, onChange, placeholder = "Search...", disabled = false }) => {
50
+ return /* @__PURE__ */ jsxs("div", {
51
+ className: "relative",
52
+ children: [/* @__PURE__ */ jsx(Search, { className: "absolute left-2 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground" }), /* @__PURE__ */ jsx("input", {
53
+ type: "text",
54
+ value,
55
+ onChange: (e) => onChange(e.target.value),
56
+ placeholder,
57
+ disabled,
58
+ "aria-label": placeholder,
59
+ className: cn("flex h-9 w-full rounded-md border border-input bg-transparent pl-8 pr-3 py-1", "text-sm shadow-sm transition-colors", "placeholder:text-muted-foreground", "focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring", "disabled:cursor-not-allowed disabled:opacity-50")
60
+ })]
61
+ });
62
+ };
63
+ //#endregion
64
+ //#region src/components/features/transfer/components/transfer-panel.tsx
65
+ const TransferPanel = ({ title, items, groups, searchable, searchValue, onSearchChange, searchPlaceholder, onItemClick, onSelectAll, enableSelectAll, disabled = false, panelType }) => {
66
+ const groupedItems = React$1.useMemo(() => {
67
+ if (groups.length === 0) return { "": items };
68
+ const grouped = {};
69
+ groups.forEach((group) => {
70
+ grouped[group] = items.filter((item) => item.group === group);
71
+ });
72
+ return grouped;
73
+ }, [items, groups]);
74
+ const renderItems = (groupItems) => {
75
+ return groupItems.map((item) => /* @__PURE__ */ jsx(TransferItem, {
76
+ itemKey: item.key,
77
+ label: item.label,
78
+ onClick: () => onItemClick(item.key),
79
+ disabled,
80
+ panelType
81
+ }, item.key));
82
+ };
83
+ return /* @__PURE__ */ jsxs("div", {
84
+ className: "flex flex-col h-full bg-background",
85
+ children: [/* @__PURE__ */ jsxs("div", {
86
+ className: "border-b p-3",
87
+ children: [/* @__PURE__ */ jsxs("div", {
88
+ className: "flex min-h-[2.25rem] items-center justify-between mb-2",
89
+ children: [/* @__PURE__ */ jsxs("span", {
90
+ className: "text-sm font-medium",
91
+ children: [
92
+ title,
93
+ " ",
94
+ "(",
95
+ items.length,
96
+ ")"
97
+ ]
98
+ }), enableSelectAll && items.length > 0 && /* @__PURE__ */ jsx(Button, {
99
+ htmlType: "button",
100
+ type: "quaternary",
101
+ theme: "borderless",
102
+ size: "small",
103
+ onClick: onSelectAll,
104
+ disabled,
105
+ children: panelType === "source" ? "Select All" : "Clear All"
106
+ })]
107
+ }), searchable && /* @__PURE__ */ jsx(TransferSearch, {
108
+ value: searchValue,
109
+ onChange: onSearchChange,
110
+ placeholder: searchPlaceholder,
111
+ disabled
112
+ })]
113
+ }), /* @__PURE__ */ jsx("div", {
114
+ className: "flex-1 overflow-y-auto p-2",
115
+ children: items.length === 0 ? /* @__PURE__ */ jsx("div", {
116
+ className: "text-sm text-muted-foreground text-center py-8",
117
+ children: panelType === "source" ? "No items" : "No items selected"
118
+ }) : groups.length === 0 ? /* @__PURE__ */ jsx("div", {
119
+ className: "space-y-1",
120
+ children: renderItems(items)
121
+ }) : Object.entries(groupedItems).map(([group, groupItems]) => groupItems.length > 0 && /* @__PURE__ */ jsx(TransferGroup, {
122
+ title: group,
123
+ children: renderItems(groupItems)
124
+ }, group))
125
+ })]
126
+ });
127
+ };
128
+ //#endregion
129
+ //#region src/components/features/transfer/hooks/use-transfer-state.ts
130
+ function useTransferState({ items, value, itemKey, itemLabel, itemGroup }) {
131
+ const [sourceSearch, setSourceSearch] = useState("");
132
+ const [debouncedSourceSearch, setDebouncedSourceSearch] = useState("");
133
+ useEffect(() => {
134
+ const timer = setTimeout(() => {
135
+ setDebouncedSourceSearch(sourceSearch);
136
+ }, 300);
137
+ return () => clearTimeout(timer);
138
+ }, [sourceSearch]);
139
+ const getKey = useCallback((item) => {
140
+ return typeof itemKey === "function" ? itemKey(item) : String(item[itemKey]);
141
+ }, [itemKey]);
142
+ const getLabel = useCallback((item) => {
143
+ return typeof itemLabel === "function" ? itemLabel(item) : String(item[itemLabel]);
144
+ }, [itemLabel]);
145
+ const getGroup = useCallback((item) => {
146
+ if (!itemGroup) return void 0;
147
+ return typeof itemGroup === "function" ? itemGroup(item) : String(item[itemGroup]);
148
+ }, [itemGroup]);
149
+ const transferItems = useMemo(() => {
150
+ return items.map((item) => ({
151
+ key: getKey(item),
152
+ label: getLabel(item),
153
+ group: getGroup(item),
154
+ data: item
155
+ }));
156
+ }, [
157
+ items,
158
+ getKey,
159
+ getLabel,
160
+ getGroup
161
+ ]);
162
+ const { sourceItems, targetItems } = useMemo(() => {
163
+ const valueSet = new Set(value);
164
+ return {
165
+ sourceItems: transferItems.filter((item) => !valueSet.has(item.key)),
166
+ targetItems: transferItems.filter((item) => valueSet.has(item.key))
167
+ };
168
+ }, [transferItems, value]);
169
+ const filterItems = useCallback((items, search) => {
170
+ if (!search) return items;
171
+ const searchLower = search.toLowerCase();
172
+ return items.filter((item) => item.label.toLowerCase().includes(searchLower) || item.group?.toLowerCase().includes(searchLower) || item.key.toLowerCase().includes(searchLower));
173
+ }, []);
174
+ const filteredSourceItems = useMemo(() => filterItems(sourceItems, debouncedSourceSearch), [
175
+ sourceItems,
176
+ debouncedSourceSearch,
177
+ filterItems
178
+ ]);
179
+ const getGroups = useCallback((items) => {
180
+ const groups = /* @__PURE__ */ new Set();
181
+ items.forEach((item) => {
182
+ if (item.group) groups.add(item.group);
183
+ });
184
+ return Array.from(groups).sort();
185
+ }, []);
186
+ return {
187
+ sourceItems,
188
+ targetItems,
189
+ filteredSourceItems,
190
+ sourceGroups: useMemo(() => getGroups(filteredSourceItems), [filteredSourceItems, getGroups]),
191
+ targetGroups: useMemo(() => getGroups(targetItems), [targetItems, getGroups]),
192
+ sourceSearch,
193
+ setSourceSearch
194
+ };
195
+ }
196
+ //#endregion
197
+ //#region src/components/features/transfer/transfer.tsx
198
+ function Transfer({ items, value, onChange, itemKey, itemLabel, itemGroup, searchable = true, searchPlaceholder = "Search...", sourceTitle = "Available", targetTitle = "Selected", enableSelectAll = true, disabled = false, className }) {
199
+ const state = useTransferState({
200
+ items,
201
+ value,
202
+ itemKey,
203
+ itemLabel,
204
+ itemGroup
205
+ });
206
+ const handleSelect = (key) => {
207
+ if (value.includes(key)) return;
208
+ onChange([...value, key]);
209
+ };
210
+ const handleDeselect = (key) => {
211
+ onChange(value.filter((k) => k !== key));
212
+ };
213
+ const handleSelectAll = () => {
214
+ const sourceKeys = state.filteredSourceItems.map((item) => item.key);
215
+ const existing = new Set(value);
216
+ const newKeys = sourceKeys.filter((k) => !existing.has(k));
217
+ onChange([...value, ...newKeys]);
218
+ };
219
+ const handleClearAll = () => {
220
+ onChange([]);
221
+ };
222
+ return /* @__PURE__ */ jsxs("div", {
223
+ className: cn("flex h-[400px]", className),
224
+ children: [/* @__PURE__ */ jsx("div", {
225
+ className: "flex-1 border-r",
226
+ children: /* @__PURE__ */ jsx(TransferPanel, {
227
+ title: sourceTitle,
228
+ items: state.filteredSourceItems,
229
+ groups: state.sourceGroups,
230
+ searchable,
231
+ searchValue: state.sourceSearch,
232
+ onSearchChange: state.setSourceSearch,
233
+ searchPlaceholder,
234
+ onItemClick: handleSelect,
235
+ onSelectAll: handleSelectAll,
236
+ enableSelectAll,
237
+ disabled,
238
+ panelType: "source"
239
+ })
240
+ }), /* @__PURE__ */ jsx("div", {
241
+ className: "flex-1",
242
+ children: /* @__PURE__ */ jsx(TransferPanel, {
243
+ title: targetTitle,
244
+ items: state.targetItems,
245
+ groups: state.targetGroups,
246
+ searchable: false,
247
+ searchValue: "",
248
+ onSearchChange: () => {},
249
+ onItemClick: handleDeselect,
250
+ onSelectAll: handleClearAll,
251
+ enableSelectAll,
252
+ disabled,
253
+ panelType: "target"
254
+ })
255
+ })]
256
+ });
257
+ }
258
+ Transfer.displayName = "Transfer";
259
+ //#endregion
260
+ export { Transfer as t };