@datum-cloud/datum-ui 0.6.0-alpha.a49f238 → 0.6.0-alpha.a9a8815

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 (103) 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/adapters/conform/conform-adapter.d.ts.map +1 -1
  23. package/dist/components/features/form/components/form-autosearch.d.ts +25 -0
  24. package/dist/components/features/form/components/form-autosearch.d.ts.map +1 -0
  25. package/dist/components/features/form/components/form-combobox.d.ts +76 -0
  26. package/dist/components/features/form/components/form-combobox.d.ts.map +1 -0
  27. package/dist/components/features/form/components/form-date-picker.d.ts +38 -0
  28. package/dist/components/features/form/components/form-date-picker.d.ts.map +1 -0
  29. package/dist/components/features/form/components/form-date-time-picker.d.ts +37 -0
  30. package/dist/components/features/form/components/form-date-time-picker.d.ts.map +1 -0
  31. package/dist/components/features/form/components/form-time-picker.d.ts +21 -0
  32. package/dist/components/features/form/components/form-time-picker.d.ts.map +1 -0
  33. package/dist/components/features/form/components/form-transfer.d.ts +37 -0
  34. package/dist/components/features/form/components/form-transfer.d.ts.map +1 -0
  35. package/dist/components/features/form/components/index.d.ts +6 -0
  36. package/dist/components/features/form/components/index.d.ts.map +1 -1
  37. package/dist/components/features/form/index.d.ts +8 -2
  38. package/dist/components/features/form/index.d.ts.map +1 -1
  39. package/dist/components/features/form/utils/get-field-constraints.d.ts +33 -1
  40. package/dist/components/features/form/utils/get-field-constraints.d.ts.map +1 -1
  41. package/dist/components/features/time-picker/index.d.ts +3 -0
  42. package/dist/components/features/time-picker/index.d.ts.map +1 -0
  43. package/dist/components/features/time-picker/time-picker.d.ts +22 -0
  44. package/dist/components/features/time-picker/time-picker.d.ts.map +1 -0
  45. package/dist/components/features/time-picker/types.d.ts +31 -0
  46. package/dist/components/features/time-picker/types.d.ts.map +1 -0
  47. package/dist/components/features/transfer/components/index.d.ts +9 -0
  48. package/dist/components/features/transfer/components/index.d.ts.map +1 -0
  49. package/dist/components/features/transfer/components/transfer-group.d.ts +7 -0
  50. package/dist/components/features/transfer/components/transfer-group.d.ts.map +1 -0
  51. package/dist/components/features/transfer/components/transfer-item.d.ts +10 -0
  52. package/dist/components/features/transfer/components/transfer-item.d.ts.map +1 -0
  53. package/dist/components/features/transfer/components/transfer-panel.d.ts +18 -0
  54. package/dist/components/features/transfer/components/transfer-panel.d.ts.map +1 -0
  55. package/dist/components/features/transfer/components/transfer-search.d.ts +9 -0
  56. package/dist/components/features/transfer/components/transfer-search.d.ts.map +1 -0
  57. package/dist/components/features/transfer/hooks/use-transfer-dnd.d.ts +26 -0
  58. package/dist/components/features/transfer/hooks/use-transfer-dnd.d.ts.map +1 -0
  59. package/dist/components/features/transfer/hooks/use-transfer-state.d.ts +20 -0
  60. package/dist/components/features/transfer/hooks/use-transfer-state.d.ts.map +1 -0
  61. package/dist/components/features/transfer/index.d.ts +3 -0
  62. package/dist/components/features/transfer/index.d.ts.map +1 -0
  63. package/dist/components/features/transfer/transfer.d.ts +6 -0
  64. package/dist/components/features/transfer/transfer.d.ts.map +1 -0
  65. package/dist/components/features/transfer/types.d.ts +69 -0
  66. package/dist/components/features/transfer/types.d.ts.map +1 -0
  67. package/dist/date-picker/index.mjs +1 -1
  68. package/dist/date-time-picker/index.mjs +2 -0
  69. package/dist/date-time-picker-Bx_n4nEJ.mjs +177 -0
  70. package/dist/form/adapters/conform/index.mjs +8 -2
  71. package/dist/form/adapters/rhf/index.mjs +2 -2
  72. package/dist/form/index.mjs +3 -3
  73. package/dist/form/stepper/index.mjs +2 -2
  74. package/dist/{form-C6AOB2f4.mjs → form-zf5QOnAk.mjs} +217 -3
  75. package/dist/{get-field-constraints-D4xnXJEg.mjs → get-field-constraints-CxfZ753o.mjs} +1 -0
  76. package/dist/grid/index.mjs +1 -1
  77. package/dist/hooks/index.mjs +2 -2
  78. package/dist/index.mjs +14 -14
  79. package/dist/input-number/index.mjs +1 -1
  80. package/dist/map/index.mjs +1 -1
  81. package/dist/{map-BqpteT_8.mjs → map-CWIQ-eql.mjs} +1 -1
  82. package/dist/more-actions/index.mjs +1 -1
  83. package/dist/page-title/index.mjs +1 -1
  84. package/dist/stepper/index.mjs +1 -1
  85. package/dist/tag-input/index.mjs +1 -1
  86. package/dist/task-queue/index.mjs +1 -1
  87. package/dist/time-picker/index.mjs +2 -0
  88. package/dist/time-picker-BoF7pZZ2.mjs +43 -0
  89. package/dist/transfer/index.mjs +2 -0
  90. package/dist/transfer-C55XfEXy.mjs +243 -0
  91. package/package.json +32 -1
  92. /package/dist/{adapter-context-BFqfq4Io.mjs → adapter-context-rWveHhDd.mjs} +0 -0
  93. /package/dist/{col-CiSpQPUT.mjs → col-1T0Q3SlH.mjs} +0 -0
  94. /package/dist/{hooks-DNjmSsJT.mjs → hooks-D8r2M2U6.mjs} +0 -0
  95. /package/dist/{input-number-BTQdHqVZ.mjs → input-number-a7uydAsw.mjs} +0 -0
  96. /package/dist/{map-leaflet-imports-CT4SpoDi.mjs → map-leaflet-imports-CRSKA79m.mjs} +0 -0
  97. /package/dist/{more-actions-CucrYUnA.mjs → more-actions-ILnEZq_E.mjs} +0 -0
  98. /package/dist/{page-title-CmsIi_A3.mjs → page-title-ChsnpBiH.mjs} +0 -0
  99. /package/dist/{stepper-C92Ib8Iy.mjs → stepper-DvIOp0hh.mjs} +0 -0
  100. /package/dist/{tag-input-B91C2wdr.mjs → tag-input-T9cUX9-G.mjs} +0 -0
  101. /package/dist/{task-queue-dropdown-OOFuJcHb.mjs → task-queue-dropdown-Wcbj-f0V.mjs} +0 -0
  102. /package/dist/{to-api-format-P0gmlqe8.mjs → to-api-format-Bh3c01gr.mjs} +0 -0
  103. /package/dist/{use-copy-to-clipboard-C2IEmhDn.mjs → use-copy-to-clipboard-uNeeVHC4.mjs} +0 -0
@@ -0,0 +1,243 @@
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
+ onClick: panelType === "source" && !disabled ? onClick : void 0,
23
+ children: [/* @__PURE__ */ jsx("div", {
24
+ className: "min-w-0 flex-1",
25
+ children: /* @__PURE__ */ jsx("div", {
26
+ className: "text-sm font-medium",
27
+ children: label
28
+ })
29
+ }), panelType === "target" && /* @__PURE__ */ jsx("button", {
30
+ type: "button",
31
+ 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",
32
+ onClick,
33
+ disabled,
34
+ children: /* @__PURE__ */ jsx(X, { className: "h-4 w-4" })
35
+ })]
36
+ });
37
+ };
38
+ //#endregion
39
+ //#region src/components/features/transfer/components/transfer-search.tsx
40
+ const TransferSearch = ({ value, onChange, placeholder = "Search...", disabled = false }) => {
41
+ return /* @__PURE__ */ jsxs("div", {
42
+ className: "relative",
43
+ 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", {
44
+ type: "text",
45
+ value,
46
+ onChange: (e) => onChange(e.target.value),
47
+ placeholder,
48
+ disabled,
49
+ "aria-label": placeholder,
50
+ 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")
51
+ })]
52
+ });
53
+ };
54
+ //#endregion
55
+ //#region src/components/features/transfer/components/transfer-panel.tsx
56
+ const TransferPanel = ({ items, groups, searchable, searchValue, onSearchChange, searchPlaceholder, onItemClick, onSelectAll, enableSelectAll, disabled = false, panelType }) => {
57
+ const groupedItems = React$1.useMemo(() => {
58
+ if (groups.length === 0) return { "": items };
59
+ const grouped = {};
60
+ groups.forEach((group) => {
61
+ grouped[group] = items.filter((item) => item.group === group);
62
+ });
63
+ return grouped;
64
+ }, [items, groups]);
65
+ const renderItems = (groupItems) => {
66
+ return groupItems.map((item) => /* @__PURE__ */ jsx(TransferItem, {
67
+ itemKey: item.key,
68
+ label: item.label,
69
+ onClick: () => onItemClick(item.key),
70
+ disabled,
71
+ panelType
72
+ }, item.key));
73
+ };
74
+ return /* @__PURE__ */ jsxs("div", {
75
+ className: "flex flex-col h-full bg-background",
76
+ children: [/* @__PURE__ */ jsxs("div", {
77
+ className: "border-b p-3",
78
+ children: [/* @__PURE__ */ jsxs("div", {
79
+ className: "flex min-h-[2.25rem] items-center justify-between mb-2",
80
+ children: [/* @__PURE__ */ jsx("span", {
81
+ className: "text-sm font-medium",
82
+ children: panelType === "source" ? `${items.length} items` : `${items.length} selected`
83
+ }), enableSelectAll && items.length > 0 && /* @__PURE__ */ jsx(Button, {
84
+ htmlType: "button",
85
+ type: "quaternary",
86
+ theme: "borderless",
87
+ size: "small",
88
+ onClick: onSelectAll,
89
+ disabled,
90
+ children: panelType === "source" ? "Select All" : "Clear All"
91
+ })]
92
+ }), searchable && /* @__PURE__ */ jsx(TransferSearch, {
93
+ value: searchValue,
94
+ onChange: onSearchChange,
95
+ placeholder: searchPlaceholder,
96
+ disabled
97
+ })]
98
+ }), /* @__PURE__ */ jsx("div", {
99
+ className: "flex-1 overflow-y-auto p-2",
100
+ children: items.length === 0 ? /* @__PURE__ */ jsx("div", {
101
+ className: "text-sm text-muted-foreground text-center py-8",
102
+ children: panelType === "source" ? "No items" : "No items selected"
103
+ }) : groups.length === 0 ? /* @__PURE__ */ jsx("div", {
104
+ className: "space-y-1",
105
+ children: renderItems(items)
106
+ }) : Object.entries(groupedItems).map(([group, groupItems]) => groupItems.length > 0 && /* @__PURE__ */ jsx(TransferGroup, {
107
+ title: group,
108
+ children: renderItems(groupItems)
109
+ }, group))
110
+ })]
111
+ });
112
+ };
113
+ //#endregion
114
+ //#region src/components/features/transfer/hooks/use-transfer-state.ts
115
+ function useTransferState({ items, value, itemKey, itemLabel, itemGroup }) {
116
+ const [sourceSearch, setSourceSearch] = useState("");
117
+ const [debouncedSourceSearch, setDebouncedSourceSearch] = useState("");
118
+ useEffect(() => {
119
+ const timer = setTimeout(() => {
120
+ setDebouncedSourceSearch(sourceSearch);
121
+ }, 300);
122
+ return () => clearTimeout(timer);
123
+ }, [sourceSearch]);
124
+ const getKey = useCallback((item) => {
125
+ return typeof itemKey === "function" ? itemKey(item) : String(item[itemKey]);
126
+ }, [itemKey]);
127
+ const getLabel = useCallback((item) => {
128
+ return typeof itemLabel === "function" ? itemLabel(item) : String(item[itemLabel]);
129
+ }, [itemLabel]);
130
+ const getGroup = useCallback((item) => {
131
+ if (!itemGroup) return void 0;
132
+ return typeof itemGroup === "function" ? itemGroup(item) : String(item[itemGroup]);
133
+ }, [itemGroup]);
134
+ const transferItems = useMemo(() => {
135
+ return items.map((item) => ({
136
+ key: getKey(item),
137
+ label: getLabel(item),
138
+ group: getGroup(item),
139
+ data: item
140
+ }));
141
+ }, [
142
+ items,
143
+ getKey,
144
+ getLabel,
145
+ getGroup
146
+ ]);
147
+ const { sourceItems, targetItems } = useMemo(() => {
148
+ const valueSet = new Set(value);
149
+ return {
150
+ sourceItems: transferItems.filter((item) => !valueSet.has(item.key)),
151
+ targetItems: transferItems.filter((item) => valueSet.has(item.key))
152
+ };
153
+ }, [transferItems, value]);
154
+ const filterItems = useCallback((items, search) => {
155
+ if (!search) return items;
156
+ const searchLower = search.toLowerCase();
157
+ return items.filter((item) => item.label.toLowerCase().includes(searchLower) || item.group?.toLowerCase().includes(searchLower) || item.key.toLowerCase().includes(searchLower));
158
+ }, []);
159
+ const filteredSourceItems = useMemo(() => filterItems(sourceItems, debouncedSourceSearch), [
160
+ sourceItems,
161
+ debouncedSourceSearch,
162
+ filterItems
163
+ ]);
164
+ const getGroups = useCallback((items) => {
165
+ const groups = /* @__PURE__ */ new Set();
166
+ items.forEach((item) => {
167
+ if (item.group) groups.add(item.group);
168
+ });
169
+ return Array.from(groups).sort();
170
+ }, []);
171
+ return {
172
+ sourceItems,
173
+ targetItems,
174
+ filteredSourceItems,
175
+ sourceGroups: useMemo(() => getGroups(filteredSourceItems), [filteredSourceItems, getGroups]),
176
+ targetGroups: useMemo(() => getGroups(targetItems), [targetItems, getGroups]),
177
+ sourceSearch,
178
+ setSourceSearch
179
+ };
180
+ }
181
+ //#endregion
182
+ //#region src/components/features/transfer/transfer.tsx
183
+ function Transfer({ items, value, onChange, itemKey, itemLabel, itemGroup, searchable = true, searchPlaceholder = "Search...", sourceTitle = "Available", targetTitle = "Selected", enableSelectAll = true, disabled = false, className }) {
184
+ const state = useTransferState({
185
+ items,
186
+ value,
187
+ itemKey,
188
+ itemLabel,
189
+ itemGroup
190
+ });
191
+ const handleSelect = (key) => {
192
+ if (value.includes(key)) return;
193
+ onChange([...value, key]);
194
+ };
195
+ const handleDeselect = (key) => {
196
+ onChange(value.filter((k) => k !== key));
197
+ };
198
+ const handleSelectAll = () => {
199
+ const sourceKeys = state.filteredSourceItems.map((item) => item.key);
200
+ onChange([...value, ...sourceKeys]);
201
+ };
202
+ const handleClearAll = () => {
203
+ onChange([]);
204
+ };
205
+ return /* @__PURE__ */ jsxs("div", {
206
+ className: cn("flex h-[400px]", className),
207
+ children: [/* @__PURE__ */ jsx("div", {
208
+ className: "flex-1 border-r",
209
+ children: /* @__PURE__ */ jsx(TransferPanel, {
210
+ title: sourceTitle,
211
+ items: state.filteredSourceItems,
212
+ groups: state.sourceGroups,
213
+ searchable,
214
+ searchValue: state.sourceSearch,
215
+ onSearchChange: state.setSourceSearch,
216
+ searchPlaceholder,
217
+ onItemClick: handleSelect,
218
+ onSelectAll: handleSelectAll,
219
+ enableSelectAll,
220
+ disabled,
221
+ panelType: "source"
222
+ })
223
+ }), /* @__PURE__ */ jsx("div", {
224
+ className: "flex-1",
225
+ children: /* @__PURE__ */ jsx(TransferPanel, {
226
+ title: targetTitle,
227
+ items: state.targetItems,
228
+ groups: state.targetGroups,
229
+ searchable: false,
230
+ searchValue: "",
231
+ onSearchChange: () => {},
232
+ onItemClick: handleDeselect,
233
+ onSelectAll: handleClearAll,
234
+ enableSelectAll,
235
+ disabled,
236
+ panelType: "target"
237
+ })
238
+ })]
239
+ });
240
+ }
241
+ Transfer.displayName = "Transfer";
242
+ //#endregion
243
+ export { Transfer as t };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@datum-cloud/datum-ui",
3
3
  "type": "module",
4
- "version": "0.6.0-alpha.a49f238",
4
+ "version": "0.6.0-alpha.a9a8815",
5
5
  "license": "MIT",
6
6
  "repository": {
7
7
  "url": "https://github.com/datum-cloud/datum-ui"
@@ -204,6 +204,11 @@
204
204
  "types": "./dist/components/features/autocomplete/index.d.ts",
205
205
  "default": "./dist/autocomplete/index.mjs"
206
206
  },
207
+ "./combobox": {
208
+ "source": "./src/components/features/combobox/index.ts",
209
+ "types": "./dist/components/features/combobox/index.d.ts",
210
+ "default": "./dist/combobox/index.mjs"
211
+ },
207
212
  "./avatar-stack": {
208
213
  "source": "./src/components/features/avatar-stack/index.ts",
209
214
  "types": "./dist/components/features/avatar-stack/index.d.ts",
@@ -323,6 +328,21 @@
323
328
  "source": "./src/components/features/data-table/index.ts",
324
329
  "types": "./dist/components/features/data-table/index.d.ts",
325
330
  "default": "./dist/data-table/index.mjs"
331
+ },
332
+ "./date-time-picker": {
333
+ "source": "./src/components/features/date-time-picker/index.ts",
334
+ "types": "./dist/components/features/date-time-picker/index.d.ts",
335
+ "default": "./dist/date-time-picker/index.mjs"
336
+ },
337
+ "./time-picker": {
338
+ "source": "./src/components/features/time-picker/index.ts",
339
+ "types": "./dist/components/features/time-picker/index.d.ts",
340
+ "default": "./dist/time-picker/index.mjs"
341
+ },
342
+ "./transfer": {
343
+ "source": "./src/components/features/transfer/index.ts",
344
+ "types": "./dist/components/features/transfer/index.d.ts",
345
+ "default": "./dist/transfer/index.mjs"
326
346
  }
327
347
  },
328
348
  "main": "./dist/index.mjs",
@@ -336,6 +356,8 @@
336
356
  "peerDependencies": {
337
357
  "@conform-to/react": ">=1",
338
358
  "@conform-to/zod": ">=1",
359
+ "@dnd-kit/core": ">=6",
360
+ "@dnd-kit/sortable": ">=8",
339
361
  "@hookform/resolvers": ">=5",
340
362
  "@monaco-editor/react": "^4.7.0",
341
363
  "@stepperize/react": ">=4",
@@ -372,6 +394,12 @@
372
394
  "@conform-to/zod": {
373
395
  "optional": true
374
396
  },
397
+ "@dnd-kit/core": {
398
+ "optional": true
399
+ },
400
+ "@dnd-kit/sortable": {
401
+ "optional": true
402
+ },
375
403
  "@hookform/resolvers": {
376
404
  "optional": true
377
405
  },
@@ -450,6 +478,7 @@
450
478
  }
451
479
  },
452
480
  "dependencies": {
481
+ "@dnd-kit/utilities": "^3.2.2",
453
482
  "@radix-ui/react-avatar": "^1",
454
483
  "@radix-ui/react-checkbox": "^1",
455
484
  "@radix-ui/react-collapsible": "^1",
@@ -475,6 +504,8 @@
475
504
  "devDependencies": {
476
505
  "@conform-to/react": "^1.17.1",
477
506
  "@conform-to/zod": "^1.17.1",
507
+ "@dnd-kit/core": "^6.3.1",
508
+ "@dnd-kit/sortable": "^10.0.0",
478
509
  "@hookform/resolvers": "^5.2.2",
479
510
  "@monaco-editor/react": "^4.7.0",
480
511
  "@stepperize/react": "^6.1.0",
File without changes
File without changes