@datum-cloud/datum-ui 0.6.0-alpha.b817c77 → 0.6.0-alpha.b8a44ac

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 (126) hide show
  1. package/README.md +3 -0
  2. package/dist/combobox/index.mjs +2 -0
  3. package/dist/combobox-cKTFK4uN.mjs +96 -0
  4. package/dist/components/features/combobox/combobox.d.ts +27 -0
  5. package/dist/components/features/combobox/combobox.d.ts.map +1 -0
  6. package/dist/components/features/combobox/index.d.ts +3 -0
  7. package/dist/components/features/combobox/index.d.ts.map +1 -0
  8. package/dist/components/features/combobox/types.d.ts +78 -0
  9. package/dist/components/features/combobox/types.d.ts.map +1 -0
  10. package/dist/components/features/date-time-picker/date-time-picker.d.ts +9 -0
  11. package/dist/components/features/date-time-picker/date-time-picker.d.ts.map +1 -0
  12. package/dist/components/features/date-time-picker/index.d.ts +3 -0
  13. package/dist/components/features/date-time-picker/index.d.ts.map +1 -0
  14. package/dist/components/features/date-time-picker/types.d.ts +53 -0
  15. package/dist/components/features/date-time-picker/types.d.ts.map +1 -0
  16. package/dist/components/features/date-time-picker/utils/format.d.ts +13 -0
  17. package/dist/components/features/date-time-picker/utils/format.d.ts.map +1 -0
  18. package/dist/components/features/date-time-picker/utils/index.d.ts +3 -0
  19. package/dist/components/features/date-time-picker/utils/index.d.ts.map +1 -0
  20. package/dist/components/features/date-time-picker/utils/timezone.d.ts +23 -0
  21. package/dist/components/features/date-time-picker/utils/timezone.d.ts.map +1 -0
  22. package/dist/components/features/form/adapter-types.d.ts +20 -0
  23. package/dist/components/features/form/adapter-types.d.ts.map +1 -1
  24. package/dist/components/features/form/adapters/conform/conform-adapter.d.ts.map +1 -1
  25. package/dist/components/features/form/adapters/rhf/rhf-adapter.d.ts.map +1 -1
  26. package/dist/components/features/form/components/form-autosearch.d.ts +25 -0
  27. package/dist/components/features/form/components/form-autosearch.d.ts.map +1 -0
  28. package/dist/components/features/form/components/form-combobox.d.ts +76 -0
  29. package/dist/components/features/form/components/form-combobox.d.ts.map +1 -0
  30. package/dist/components/features/form/components/form-copy-box.d.ts +3 -0
  31. package/dist/components/features/form/components/form-copy-box.d.ts.map +1 -1
  32. package/dist/components/features/form/components/form-custom.d.ts.map +1 -1
  33. package/dist/components/features/form/components/form-date-picker.d.ts +38 -0
  34. package/dist/components/features/form/components/form-date-picker.d.ts.map +1 -0
  35. package/dist/components/features/form/components/form-date-time-picker.d.ts +37 -0
  36. package/dist/components/features/form/components/form-date-time-picker.d.ts.map +1 -0
  37. package/dist/components/features/form/components/form-dialog.d.ts.map +1 -1
  38. package/dist/components/features/form/components/form-radio-group.d.ts.map +1 -1
  39. package/dist/components/features/form/components/form-root.d.ts.map +1 -1
  40. package/dist/components/features/form/components/form-time-picker.d.ts +21 -0
  41. package/dist/components/features/form/components/form-time-picker.d.ts.map +1 -0
  42. package/dist/components/features/form/components/form-transfer.d.ts +37 -0
  43. package/dist/components/features/form/components/form-transfer.d.ts.map +1 -0
  44. package/dist/components/features/form/components/index.d.ts +7 -1
  45. package/dist/components/features/form/components/index.d.ts.map +1 -1
  46. package/dist/components/features/form/components/stepper/form-stepper.d.ts.map +1 -1
  47. package/dist/components/features/form/hooks/index.d.ts +1 -1
  48. package/dist/components/features/form/hooks/index.d.ts.map +1 -1
  49. package/dist/components/features/form/hooks/use-form-state.d.ts +36 -0
  50. package/dist/components/features/form/hooks/use-form-state.d.ts.map +1 -0
  51. package/dist/components/features/form/index.d.ts +39 -21
  52. package/dist/components/features/form/index.d.ts.map +1 -1
  53. package/dist/components/features/form/stepper/index.d.ts +17 -0
  54. package/dist/components/features/form/stepper/index.d.ts.map +1 -0
  55. package/dist/components/features/form/types/index.d.ts +36 -0
  56. package/dist/components/features/form/types/index.d.ts.map +1 -1
  57. package/dist/components/features/form/utils/get-field-constraints.d.ts +23 -1
  58. package/dist/components/features/form/utils/get-field-constraints.d.ts.map +1 -1
  59. package/dist/components/features/form/utils/get-schema-defaults.d.ts +24 -0
  60. package/dist/components/features/form/utils/get-schema-defaults.d.ts.map +1 -0
  61. package/dist/components/features/form/utils/zod-helpers.d.ts +12 -0
  62. package/dist/components/features/form/utils/zod-helpers.d.ts.map +1 -0
  63. package/dist/components/features/time-picker/index.d.ts +3 -0
  64. package/dist/components/features/time-picker/index.d.ts.map +1 -0
  65. package/dist/components/features/time-picker/time-picker.d.ts +22 -0
  66. package/dist/components/features/time-picker/time-picker.d.ts.map +1 -0
  67. package/dist/components/features/time-picker/types.d.ts +31 -0
  68. package/dist/components/features/time-picker/types.d.ts.map +1 -0
  69. package/dist/components/features/transfer/components/index.d.ts +9 -0
  70. package/dist/components/features/transfer/components/index.d.ts.map +1 -0
  71. package/dist/components/features/transfer/components/transfer-group.d.ts +7 -0
  72. package/dist/components/features/transfer/components/transfer-group.d.ts.map +1 -0
  73. package/dist/components/features/transfer/components/transfer-item.d.ts +10 -0
  74. package/dist/components/features/transfer/components/transfer-item.d.ts.map +1 -0
  75. package/dist/components/features/transfer/components/transfer-panel.d.ts +18 -0
  76. package/dist/components/features/transfer/components/transfer-panel.d.ts.map +1 -0
  77. package/dist/components/features/transfer/components/transfer-search.d.ts +9 -0
  78. package/dist/components/features/transfer/components/transfer-search.d.ts.map +1 -0
  79. package/dist/components/features/transfer/hooks/use-transfer-dnd.d.ts +26 -0
  80. package/dist/components/features/transfer/hooks/use-transfer-dnd.d.ts.map +1 -0
  81. package/dist/components/features/transfer/hooks/use-transfer-state.d.ts +20 -0
  82. package/dist/components/features/transfer/hooks/use-transfer-state.d.ts.map +1 -0
  83. package/dist/components/features/transfer/index.d.ts +3 -0
  84. package/dist/components/features/transfer/index.d.ts.map +1 -0
  85. package/dist/components/features/transfer/transfer.d.ts +6 -0
  86. package/dist/components/features/transfer/transfer.d.ts.map +1 -0
  87. package/dist/components/features/transfer/types.d.ts +69 -0
  88. package/dist/components/features/transfer/types.d.ts.map +1 -0
  89. package/dist/date-picker/index.mjs +1 -1
  90. package/dist/date-time-picker/index.mjs +2 -0
  91. package/dist/date-time-picker-Dy2jrJoN.mjs +175 -0
  92. package/dist/form/adapters/conform/index.mjs +102 -12
  93. package/dist/form/adapters/rhf/index.mjs +112 -26
  94. package/dist/form/index.mjs +3 -3
  95. package/dist/form/stepper/index.mjs +541 -0
  96. package/dist/form-context-Ccxm-wqL.mjs +17 -0
  97. package/dist/{form-BE1xBne4.mjs → form-mlNLKaB5.mjs} +350 -592
  98. package/dist/{get-field-constraints-BPMW8VvY.mjs → get-field-constraints-BicgDkfH.mjs} +19 -16
  99. package/dist/grid/index.mjs +1 -1
  100. package/dist/hooks/index.mjs +2 -2
  101. package/dist/index.mjs +14 -14
  102. package/dist/input-number/index.mjs +1 -1
  103. package/dist/map/index.mjs +1 -1
  104. package/dist/{map-Cw7u8r6E.mjs → map-CWIQ-eql.mjs} +1 -1
  105. package/dist/more-actions/index.mjs +1 -1
  106. package/dist/page-title/index.mjs +1 -1
  107. package/dist/stepper/index.mjs +1 -320
  108. package/dist/stepper-DvIOp0hh.mjs +321 -0
  109. package/dist/tag-input/index.mjs +1 -1
  110. package/dist/task-queue/index.mjs +1 -1
  111. package/dist/time-picker/index.mjs +2 -0
  112. package/dist/time-picker-BoF7pZZ2.mjs +43 -0
  113. package/dist/transfer/index.mjs +2 -0
  114. package/dist/transfer-B2n8pgEQ.mjs +260 -0
  115. package/package.json +37 -1
  116. /package/dist/{adapter-context-B7L2ucTr.mjs → adapter-context-rWveHhDd.mjs} +0 -0
  117. /package/dist/{col-YBbQ5wlb.mjs → col-1T0Q3SlH.mjs} +0 -0
  118. /package/dist/{hooks-DYjN7lvC.mjs → hooks-D8r2M2U6.mjs} +0 -0
  119. /package/dist/{input-number-DEjXG2I6.mjs → input-number-a7uydAsw.mjs} +0 -0
  120. /package/dist/{map-leaflet-imports-D6nTEOIh.mjs → map-leaflet-imports-CRSKA79m.mjs} +0 -0
  121. /package/dist/{more-actions-BNQ2yfWZ.mjs → more-actions-ILnEZq_E.mjs} +0 -0
  122. /package/dist/{page-title-CNiRNZ7p.mjs → page-title-ChsnpBiH.mjs} +0 -0
  123. /package/dist/{tag-input-BKed-cul.mjs → tag-input-T9cUX9-G.mjs} +0 -0
  124. /package/dist/{task-queue-dropdown-Di_Wjspz.mjs → task-queue-dropdown-Wcbj-f0V.mjs} +0 -0
  125. /package/dist/{to-api-format-Cq4prffn.mjs → to-api-format-Bh3c01gr.mjs} +0 -0
  126. /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-BKed-cul.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-Di_Wjspz.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 };