@godxjp/ui 5.0.2 → 6.0.1

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 (242) hide show
  1. package/README.md +101 -142
  2. package/dist/app/index.d.ts +140 -0
  3. package/dist/app/index.js +38 -0
  4. package/dist/app.prop-IobwLwaM.d.ts +90 -0
  5. package/dist/checkbox-NkFkqsQ8.d.ts +13 -0
  6. package/dist/chunk-2XW7J3EI.js +226 -0
  7. package/dist/chunk-3F2AKYRD.js +416 -0
  8. package/dist/chunk-3KPEZ5CF.js +37 -0
  9. package/dist/chunk-3UGU5TYP.js +89 -0
  10. package/dist/chunk-6RA3KSVK.js +588 -0
  11. package/dist/chunk-7NZFVD24.js +122 -0
  12. package/dist/chunk-7PWBC4BY.js +25 -0
  13. package/dist/chunk-7S7MYFXE.js +61 -0
  14. package/dist/chunk-7WRZG2IG.js +71 -0
  15. package/dist/chunk-B775Y6BE.js +1 -0
  16. package/dist/chunk-BHV2FUOA.js +111 -0
  17. package/dist/chunk-BI3HERR7.js +70 -0
  18. package/dist/chunk-BPSKQUL2.js +68 -0
  19. package/dist/chunk-CDWPQ5RP.js +187 -0
  20. package/dist/chunk-CP2LET6N.js +244 -0
  21. package/dist/chunk-CQBADMFG.js +20 -0
  22. package/dist/chunk-CRERCLIZ.js +33 -0
  23. package/dist/chunk-DU6ZYZRP.js +238 -0
  24. package/dist/chunk-DY5C44UP.js +55 -0
  25. package/dist/chunk-E4HJNQ62.js +117 -0
  26. package/dist/chunk-E76QIYSY.js +93 -0
  27. package/dist/chunk-F7PG4OEV.js +37 -0
  28. package/dist/chunk-GDSVW62T.js +171 -0
  29. package/dist/chunk-H2FHJOLU.js +178 -0
  30. package/dist/chunk-HJEBRCXL.js +55 -0
  31. package/dist/chunk-ICM6XBST.js +16 -0
  32. package/dist/chunk-IK7I3ABN.js +88 -0
  33. package/dist/chunk-L6J44O74.js +144 -0
  34. package/dist/chunk-LDSLS6HE.js +1 -0
  35. package/dist/chunk-LVNUHUEZ.js +191 -0
  36. package/dist/chunk-M64MVRLS.js +92 -0
  37. package/dist/chunk-NGQW3KEM.js +402 -0
  38. package/dist/chunk-NZ4FOC5N.js +559 -0
  39. package/dist/chunk-PIIRNAXA.js +26 -0
  40. package/dist/chunk-S66TJXJU.js +33 -0
  41. package/dist/chunk-SMLKNECP.js +133 -0
  42. package/dist/chunk-TAHBM3F2.js +66 -0
  43. package/dist/chunk-TO33OY4L.js +150 -0
  44. package/dist/chunk-TO7URV7U.js +51 -0
  45. package/dist/chunk-TOO5AEKL.js +81 -0
  46. package/dist/chunk-U3GHAOIJ.js +299 -0
  47. package/dist/chunk-U7N2A7A3.js +9 -0
  48. package/dist/chunk-UX634MYF.js +123 -0
  49. package/dist/chunk-V6UWJKZF.js +28 -0
  50. package/dist/chunk-VOHTRR5X.js +28 -0
  51. package/dist/chunk-WRFKVUPW.js +332 -0
  52. package/dist/chunk-WXW43RK5.js +24 -0
  53. package/dist/chunk-XG7XDYIM.js +60 -0
  54. package/dist/chunk-YFCQKO3B.js +842 -0
  55. package/dist/chunk-ZDWXGWLY.js +73 -0
  56. package/dist/chunk-ZLK5SPT6.js +11 -0
  57. package/dist/chunk-ZS6DTAM2.js +31 -0
  58. package/dist/chunk-ZT5UEUBO.js +1 -0
  59. package/dist/components/admin/index.d.ts +80 -0
  60. package/dist/components/admin/index.js +38 -0
  61. package/dist/components/data-display/badge.d.ts +12 -0
  62. package/dist/components/data-display/badge.js +3 -0
  63. package/dist/components/data-display/card.d.ts +87 -0
  64. package/dist/components/data-display/card.js +2 -0
  65. package/dist/components/data-display/index.d.ts +72 -0
  66. package/dist/components/data-display/index.js +89 -0
  67. package/dist/components/data-display/popover.d.ts +13 -0
  68. package/dist/components/data-display/popover.js +2 -0
  69. package/dist/components/data-display/scroll-area.d.ts +7 -0
  70. package/dist/components/data-display/scroll-area.js +2 -0
  71. package/dist/components/data-display/table.d.ts +10 -0
  72. package/dist/components/data-display/table.js +3 -0
  73. package/dist/components/data-entry/autocomplete.d.ts +16 -0
  74. package/dist/components/data-entry/autocomplete.js +8 -0
  75. package/dist/components/data-entry/calendar.d.ts +16 -0
  76. package/dist/components/data-entry/calendar.js +4 -0
  77. package/dist/components/data-entry/cascader.d.ts +32 -0
  78. package/dist/components/data-entry/cascader.js +13 -0
  79. package/dist/components/data-entry/checkbox.d.ts +13 -0
  80. package/dist/components/data-entry/checkbox.js +4 -0
  81. package/dist/components/data-entry/color-picker.d.ts +16 -0
  82. package/dist/components/data-entry/color-picker.js +6 -0
  83. package/dist/components/data-entry/command.d.ts +69 -0
  84. package/dist/components/data-entry/command.js +3 -0
  85. package/dist/components/data-entry/date-picker.d.ts +16 -0
  86. package/dist/components/data-entry/date-picker.js +8 -0
  87. package/dist/components/data-entry/date-range-picker.d.ts +16 -0
  88. package/dist/components/data-entry/date-range-picker.js +8 -0
  89. package/dist/components/data-entry/index.d.ts +53 -0
  90. package/dist/components/data-entry/index.js +152 -0
  91. package/dist/components/data-entry/input.d.ts +6 -0
  92. package/dist/components/data-entry/input.js +2 -0
  93. package/dist/components/data-entry/label.d.ts +8 -0
  94. package/dist/components/data-entry/label.js +2 -0
  95. package/dist/components/data-entry/radio.d.ts +24 -0
  96. package/dist/components/data-entry/radio.js +4 -0
  97. package/dist/components/data-entry/select.d.ts +18 -0
  98. package/dist/components/data-entry/select.js +3 -0
  99. package/dist/components/data-entry/slider.d.ts +16 -0
  100. package/dist/components/data-entry/slider.js +2 -0
  101. package/dist/components/data-entry/switch.d.ts +17 -0
  102. package/dist/components/data-entry/switch.js +2 -0
  103. package/dist/components/data-entry/textarea.d.ts +6 -0
  104. package/dist/components/data-entry/textarea.js +3 -0
  105. package/dist/components/data-entry/time-picker.d.ts +16 -0
  106. package/dist/components/data-entry/time-picker.js +7 -0
  107. package/dist/components/data-entry/transfer.d.ts +17 -0
  108. package/dist/components/data-entry/transfer.js +11 -0
  109. package/dist/components/data-entry/tree-select.d.ts +26 -0
  110. package/dist/components/data-entry/tree-select.js +13 -0
  111. package/dist/components/data-entry/upload.d.ts +42 -0
  112. package/dist/components/data-entry/upload.js +11 -0
  113. package/dist/components/feedback/alert.d.ts +60 -0
  114. package/dist/components/feedback/alert.js +7 -0
  115. package/dist/components/feedback/dialog.d.ts +64 -0
  116. package/dist/components/feedback/dialog.js +7 -0
  117. package/dist/components/feedback/index.d.ts +16 -0
  118. package/dist/components/feedback/index.js +14 -0
  119. package/dist/components/feedback/sheet.d.ts +24 -0
  120. package/dist/components/feedback/sheet.js +2 -0
  121. package/dist/components/feedback/sonner.d.ts +6 -0
  122. package/dist/components/feedback/sonner.js +1 -0
  123. package/dist/components/general/button.d.ts +20 -0
  124. package/dist/components/general/button.js +2 -0
  125. package/dist/components/general/index.d.ts +6 -0
  126. package/dist/components/general/index.js +2 -0
  127. package/dist/components/layout/index.d.ts +71 -0
  128. package/dist/components/layout/index.js +5 -0
  129. package/dist/components/navigation/dropdown-menu.d.ts +28 -0
  130. package/dist/components/navigation/dropdown-menu.js +2 -0
  131. package/dist/components/navigation/index.d.ts +32 -0
  132. package/dist/components/navigation/index.js +12 -0
  133. package/dist/components/navigation/pagination.d.ts +11 -0
  134. package/dist/components/navigation/pagination.js +7 -0
  135. package/dist/components/navigation/steps.d.ts +12 -0
  136. package/dist/components/navigation/steps.js +3 -0
  137. package/dist/components/navigation/tabs-items.d.ts +12 -0
  138. package/dist/components/navigation/tabs-items.js +3 -0
  139. package/dist/components/navigation/tabs.d.ts +12 -0
  140. package/dist/components/navigation/tabs.js +2 -0
  141. package/dist/components/query/index.d.ts +43 -0
  142. package/dist/components/query/index.js +8 -0
  143. package/dist/components/ui/index.d.ts +57 -0
  144. package/dist/components/ui/index.js +37 -0
  145. package/dist/content.prop-D1Dd3TAc.d.ts +31 -0
  146. package/dist/data-display.prop-DNTAzmDy.d.ts +58 -0
  147. package/dist/data-entry.prop-BEGA1lTq.d.ts +323 -0
  148. package/dist/data-table-D1u_rKLK.d.ts +83 -0
  149. package/dist/data.prop-BVvfKC_g.d.ts +41 -0
  150. package/dist/feedback.prop-BmxUlpAW.d.ts +64 -0
  151. package/dist/filter-bar-B7OGFO9S.d.ts +10 -0
  152. package/dist/form/index.d.ts +21 -0
  153. package/dist/form/index.js +4 -0
  154. package/dist/form.prop-BHgpuFFm.d.ts +41 -0
  155. package/dist/format-date-ByyZoqI5.d.ts +51 -0
  156. package/dist/general.prop-D7brMPNL.d.ts +16 -0
  157. package/dist/i18n/index.d.ts +217 -0
  158. package/dist/i18n/index.js +2 -0
  159. package/dist/index.d.ts +46 -26
  160. package/dist/index.js +39 -13062
  161. package/dist/inline-C5u6ptJV.d.ts +10 -0
  162. package/dist/interaction.prop-Cdn7wOtq.d.ts +25 -0
  163. package/dist/layout.prop-4TCNvyQZ.d.ts +20 -0
  164. package/dist/layout.prop-C795F0qg.d.ts +112 -0
  165. package/dist/lib/datetime/index.d.ts +31 -0
  166. package/dist/lib/datetime/index.js +1 -0
  167. package/dist/lib/utils.d.ts +5 -0
  168. package/dist/lib/utils.js +1 -0
  169. package/dist/navigation.prop-DpZqcXey.d.ts +78 -0
  170. package/dist/navigation.prop-DxBiClEH.d.ts +20 -0
  171. package/dist/props/components/index.d.ts +27 -0
  172. package/dist/props/components/index.js +1 -0
  173. package/dist/props/index.d.ts +28 -0
  174. package/dist/props/index.js +3 -0
  175. package/dist/props/registry.d.ts +649 -0
  176. package/dist/props/registry.js +1 -0
  177. package/dist/props/vocabulary/index.d.ts +7 -0
  178. package/dist/props/vocabulary/index.js +1 -0
  179. package/dist/query.prop-hIPrk2zI.d.ts +71 -0
  180. package/dist/search-input-uP01rY1L.d.ts +22 -0
  181. package/dist/shared.prop-BNRJc9K0.d.ts +45 -0
  182. package/dist/styles/alert-layout.css +191 -0
  183. package/dist/styles/badge-layout.css +22 -0
  184. package/dist/styles/card-layout.css +373 -0
  185. package/dist/styles/control.css +504 -0
  186. package/dist/styles/data-display-layout.css +246 -0
  187. package/dist/styles/density.css +43 -0
  188. package/dist/styles/dialog-layout.css +84 -0
  189. package/dist/styles/index.css +105 -0
  190. package/dist/styles/layout.css +479 -0
  191. package/dist/styles/shell-layout.css +604 -0
  192. package/dist/styles/table-layout.css +109 -0
  193. package/dist/theme/example.service.css +37 -0
  194. package/dist/tokens/base.css +13 -0
  195. package/dist/tokens/foundation.css +151 -0
  196. package/dist/tokens/primitives/badge.css +13 -0
  197. package/dist/tokens/primitives/card.css +29 -0
  198. package/dist/tokens/primitives/control.css +55 -0
  199. package/dist/tokens/primitives/feedback.css +17 -0
  200. package/dist/tokens/primitives/layout.css +20 -0
  201. package/dist/tokens/primitives/navigation.css +13 -0
  202. package/dist/tokens/primitives/table.css +10 -0
  203. package/dist/types-mvzYGrma.d.ts +37 -0
  204. package/dist/use-toast-Dol5bdY3.d.ts +34 -0
  205. package/package.json +279 -117
  206. package/scripts/ui-audit.mjs +179 -0
  207. package/BRAND.md +0 -296
  208. package/CHANGELOG.md +0 -668
  209. package/config/eslint.js +0 -54
  210. package/config/prettier.cjs +0 -20
  211. package/config/tsconfig.base.json +0 -22
  212. package/config/vitest.base.ts +0 -26
  213. package/dist/MiniMonth-YAmPGEpC.d.ts +0 -143
  214. package/dist/Table.types-BbsxoIYE.d.ts +0 -352
  215. package/dist/color-DO0qqUAb.d.ts +0 -38
  216. package/dist/components/composites.d.ts +0 -963
  217. package/dist/components/composites.js +0 -7343
  218. package/dist/components/composites.js.map +0 -1
  219. package/dist/components/primitives.d.ts +0 -2744
  220. package/dist/components/primitives.js +0 -7356
  221. package/dist/components/primitives.js.map +0 -1
  222. package/dist/components/shell.d.ts +0 -182
  223. package/dist/components/shell.js +0 -774
  224. package/dist/components/shell.js.map +0 -1
  225. package/dist/hooks.d.ts +0 -100
  226. package/dist/hooks.js +0 -558
  227. package/dist/hooks.js.map +0 -1
  228. package/dist/i18n.d.ts +0 -61
  229. package/dist/i18n.js +0 -860
  230. package/dist/i18n.js.map +0 -1
  231. package/dist/index.js.map +0 -1
  232. package/dist/padding-DY0JV5Ja.d.ts +0 -16
  233. package/dist/preferences.d.ts +0 -132
  234. package/dist/preferences.js +0 -262
  235. package/dist/preferences.js.map +0 -1
  236. package/dist/props.d.ts +0 -86
  237. package/dist/props.js +0 -16
  238. package/dist/props.js.map +0 -1
  239. package/dist/size-CQwNvOWd.d.ts +0 -19
  240. package/dist/types-LTj-2bl-.d.ts +0 -30
  241. package/dist/useTableViews-D5NIAJ7h.d.ts +0 -154
  242. package/src/tokens/tailwind.css +0 -158
@@ -0,0 +1,133 @@
1
+ // src/components/data-entry/tree-utils.ts
2
+ function reactNodeText(value) {
3
+ if (value == null || typeof value === "boolean") return "";
4
+ if (typeof value === "string" || typeof value === "number" || typeof value === "bigint") {
5
+ return String(value);
6
+ }
7
+ if (Array.isArray(value)) {
8
+ return value.map((item) => reactNodeText(item)).join("");
9
+ }
10
+ return "";
11
+ }
12
+ function unknownText(value) {
13
+ if (typeof value === "string" || typeof value === "number" || typeof value === "bigint") {
14
+ return String(value);
15
+ }
16
+ return "";
17
+ }
18
+ function normalizeTreeOptions(nodes, fieldNames) {
19
+ if (!nodes?.length) return [];
20
+ const labelKey = fieldNames?.label ?? "label";
21
+ const valueKey = fieldNames?.value ?? "value";
22
+ const childrenKey = fieldNames?.children ?? "children";
23
+ return nodes.map((node) => {
24
+ const children = node[childrenKey];
25
+ const value = unknownText(node[valueKey]);
26
+ const label = node[labelKey];
27
+ return {
28
+ value,
29
+ label: label ?? value,
30
+ disabled: Boolean(node.disabled),
31
+ disableCheckbox: Boolean(node.disableCheckbox),
32
+ isLeaf: node.isLeaf,
33
+ children: Array.isArray(children) ? normalizeTreeOptions(children, fieldNames) : void 0
34
+ };
35
+ });
36
+ }
37
+ function getNodeByPath(options, path) {
38
+ const chain = [];
39
+ let level = options;
40
+ for (const segment of path) {
41
+ const found = level.find((n) => n.value === segment);
42
+ if (!found) break;
43
+ chain.push(found);
44
+ level = found.children ?? [];
45
+ }
46
+ return chain;
47
+ }
48
+ function formatPathLabels(chain, separator = " / ") {
49
+ return chain.map((n) => reactNodeText(n.label)).join(separator);
50
+ }
51
+ function collectLeafPaths(options, prefix = [], root = options) {
52
+ const out = [];
53
+ for (const node of options) {
54
+ const path = [...prefix, node.value];
55
+ const hasChildren = (node.children?.length ?? 0) > 0;
56
+ if (!hasChildren || node.isLeaf === true) {
57
+ out.push({ path, labels: getNodeByPath(root, path).map((n) => reactNodeText(n.label)) });
58
+ }
59
+ if (hasChildren) out.push(...collectLeafPaths(node.children, path, root));
60
+ }
61
+ return out;
62
+ }
63
+ function pathKey(path) {
64
+ return path.join("\0");
65
+ }
66
+ function pathsEqual(a, b) {
67
+ return a.length === b.length && a.every((v, i) => v === b[i]);
68
+ }
69
+ function filterTreeOptions(options, query, filter) {
70
+ const q = query.trim().toLowerCase();
71
+ if (!q) return [];
72
+ const paths = collectLeafPaths(options);
73
+ return paths.filter(({ path }) => {
74
+ const chain = getNodeByPath(options, path);
75
+ if (filter) return filter(query, chain);
76
+ return chain.some((n) => reactNodeText(n.label).toLowerCase().includes(q));
77
+ });
78
+ }
79
+ function getDescendantValues(node) {
80
+ const values = [node.value];
81
+ for (const child of node.children ?? []) values.push(...getDescendantValues(child));
82
+ return values;
83
+ }
84
+ function flattenVisibleTree(options, expandedKeys, depth = 0) {
85
+ const out = [];
86
+ for (const node of options) {
87
+ const hasChildren = (node.children?.length ?? 0) > 0 && node.isLeaf !== true;
88
+ out.push({ node, depth, hasChildren });
89
+ if (hasChildren && expandedKeys.has(node.value)) {
90
+ out.push(...flattenVisibleTree(node.children, expandedKeys, depth + 1));
91
+ }
92
+ }
93
+ return out;
94
+ }
95
+ function filterVisibleTree(options, query) {
96
+ const q = query.trim().toLowerCase();
97
+ if (!q) return flattenVisibleTree(options, new Set(collectAllExpandableKeys(options)));
98
+ const expanded = /* @__PURE__ */ new Set();
99
+ function walk(nodes, depth) {
100
+ let branchMatch = false;
101
+ for (const node of nodes) {
102
+ const selfMatch = reactNodeText(node.label).toLowerCase().includes(q);
103
+ const childMatch = node.children?.length ? walk(node.children) : false;
104
+ if (selfMatch || childMatch) {
105
+ branchMatch = true;
106
+ if (childMatch) expanded.add(node.value);
107
+ }
108
+ }
109
+ return branchMatch;
110
+ }
111
+ walk(options);
112
+ return flattenVisibleTree(options, expanded);
113
+ }
114
+ function collectAllExpandableKeys(options) {
115
+ const keys = [];
116
+ for (const node of options) {
117
+ if ((node.children?.length ?? 0) > 0 && node.isLeaf !== true) {
118
+ keys.push(node.value);
119
+ keys.push(...collectAllExpandableKeys(node.children));
120
+ }
121
+ }
122
+ return keys;
123
+ }
124
+ function findNodeByValue(options, value) {
125
+ for (const node of options) {
126
+ if (node.value === value) return node;
127
+ const nested = node.children ? findNodeByValue(node.children, value) : void 0;
128
+ if (nested) return nested;
129
+ }
130
+ return void 0;
131
+ }
132
+
133
+ export { collectAllExpandableKeys, filterTreeOptions, filterVisibleTree, findNodeByValue, flattenVisibleTree, formatPathLabels, getDescendantValues, getNodeByPath, normalizeTreeOptions, pathKey, pathsEqual, reactNodeText };
@@ -0,0 +1,66 @@
1
+ import { Calendar } from './chunk-IK7I3ABN.js';
2
+ import { Popover, PopoverTrigger, PopoverContent } from './chunk-DY5C44UP.js';
3
+ import { Button } from './chunk-HJEBRCXL.js';
4
+ import { useTranslation, usePickerLocales } from './chunk-3F2AKYRD.js';
5
+ import { formatDate } from './chunk-YFCQKO3B.js';
6
+ import { cn } from './chunk-U7N2A7A3.js';
7
+ import * as React from 'react';
8
+ import { CalendarIcon } from 'lucide-react';
9
+ import { jsxs, jsx } from 'react/jsx-runtime';
10
+
11
+ function DatePicker({
12
+ value,
13
+ onChange,
14
+ placeholder,
15
+ disabled,
16
+ className,
17
+ id,
18
+ locale: localeProp,
19
+ fromDate,
20
+ toDate
21
+ }) {
22
+ const { t } = useTranslation();
23
+ const { dayPickerLocale } = usePickerLocales(localeProp);
24
+ const [open, setOpen] = React.useState(false);
25
+ const resolvedPlaceholder = placeholder ?? t("dataEntry.datePicker.placeholder");
26
+ return /* @__PURE__ */ jsxs(Popover, { open, onOpenChange: setOpen, children: [
27
+ /* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(
28
+ Button,
29
+ {
30
+ id,
31
+ type: "button",
32
+ variant: "outline",
33
+ disabled,
34
+ className: cn(
35
+ "w-full justify-start text-left font-normal",
36
+ !value && "text-muted-foreground",
37
+ className
38
+ ),
39
+ children: [
40
+ /* @__PURE__ */ jsx(CalendarIcon, { className: "mr-2 size-4 shrink-0", "aria-hidden": "true" }),
41
+ value ? formatDate(value, { kind: "calendar" }) : resolvedPlaceholder
42
+ ]
43
+ }
44
+ ) }),
45
+ /* @__PURE__ */ jsx(PopoverContent, { className: "w-auto p-0", align: "start", children: /* @__PURE__ */ jsx(
46
+ Calendar,
47
+ {
48
+ mode: "single",
49
+ selected: value,
50
+ onSelect: (date) => {
51
+ onChange?.(date);
52
+ setOpen(false);
53
+ },
54
+ locale: dayPickerLocale,
55
+ disabled: [
56
+ ...fromDate ? [{ before: fromDate }] : [],
57
+ ...toDate ? [{ after: toDate }] : []
58
+ ],
59
+ startMonth: fromDate,
60
+ endMonth: toDate
61
+ }
62
+ ) })
63
+ ] });
64
+ }
65
+
66
+ export { DatePicker };
@@ -0,0 +1,150 @@
1
+ import { cn } from './chunk-U7N2A7A3.js';
2
+ import * as React from 'react';
3
+ import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';
4
+ import { Check, ChevronRight } from 'lucide-react';
5
+ import { jsx, jsxs } from 'react/jsx-runtime';
6
+
7
+ function DropdownMenu(props) {
8
+ return /* @__PURE__ */ jsx(DropdownMenuPrimitive.Root, { "data-slot": "dropdown-menu", ...props });
9
+ }
10
+ function DropdownMenuTrigger(props) {
11
+ return /* @__PURE__ */ jsx(DropdownMenuPrimitive.Trigger, { "data-slot": "dropdown-menu-trigger", ...props });
12
+ }
13
+ function DropdownMenuPortal(props) {
14
+ return /* @__PURE__ */ jsx(DropdownMenuPrimitive.Portal, { "data-slot": "dropdown-menu-portal", ...props });
15
+ }
16
+ function DropdownMenuGroup(props) {
17
+ return /* @__PURE__ */ jsx(DropdownMenuPrimitive.Group, { "data-slot": "dropdown-menu-group", ...props });
18
+ }
19
+ function DropdownMenuRadioGroup(props) {
20
+ return /* @__PURE__ */ jsx(DropdownMenuPrimitive.RadioGroup, { "data-slot": "dropdown-menu-radio-group", ...props });
21
+ }
22
+ function DropdownMenuSub(props) {
23
+ return /* @__PURE__ */ jsx(DropdownMenuPrimitive.Sub, { "data-slot": "dropdown-menu-sub", ...props });
24
+ }
25
+ var DropdownMenuContent = React.forwardRef(({ className, sideOffset = 4, ...props }, ref) => /* @__PURE__ */ jsx(DropdownMenuPortal, { children: /* @__PURE__ */ jsx(
26
+ DropdownMenuPrimitive.Content,
27
+ {
28
+ ref,
29
+ "data-slot": "dropdown-menu-content",
30
+ sideOffset,
31
+ className: cn(
32
+ "bg-popover text-popover-foreground data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 z-50 max-h-[var(--radix-dropdown-menu-content-available-height)] min-w-32 origin-[var(--radix-dropdown-menu-content-transform-origin)] overflow-x-hidden overflow-y-auto rounded-md border p-1 shadow-md",
33
+ className
34
+ ),
35
+ ...props
36
+ }
37
+ ) }));
38
+ DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName;
39
+ var DropdownMenuItem = React.forwardRef(({ className, inset, variant = "default", ...props }, ref) => /* @__PURE__ */ jsx(
40
+ DropdownMenuPrimitive.Item,
41
+ {
42
+ ref,
43
+ "data-slot": "dropdown-menu-item",
44
+ "data-inset": inset,
45
+ "data-variant": variant,
46
+ className: cn(
47
+ "focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm transition-colors outline-none select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset=true]:ps-8 [&_svg]:pointer-events-none [&_svg]:shrink-0",
48
+ className
49
+ ),
50
+ ...props
51
+ }
52
+ ));
53
+ DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName;
54
+ var DropdownMenuLabel = React.forwardRef(({ className, inset, ...props }, ref) => /* @__PURE__ */ jsx(
55
+ DropdownMenuPrimitive.Label,
56
+ {
57
+ ref,
58
+ "data-slot": "dropdown-menu-label",
59
+ "data-inset": inset,
60
+ className: cn("px-2 py-1.5 text-sm font-semibold data-[inset=true]:ps-8", className),
61
+ ...props
62
+ }
63
+ ));
64
+ DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName;
65
+ var DropdownMenuSeparator = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
66
+ DropdownMenuPrimitive.Separator,
67
+ {
68
+ ref,
69
+ "data-slot": "dropdown-menu-separator",
70
+ className: cn("bg-border -mx-1 my-1 h-px", className),
71
+ ...props
72
+ }
73
+ ));
74
+ DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName;
75
+ var DropdownMenuCheckboxItem = React.forwardRef(({ className, children, checked, ...props }, ref) => /* @__PURE__ */ jsxs(
76
+ DropdownMenuPrimitive.CheckboxItem,
77
+ {
78
+ ref,
79
+ "data-slot": "dropdown-menu-checkbox-item",
80
+ className: cn(
81
+ "focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 ps-8 pe-2 text-sm transition-colors outline-none select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0",
82
+ className
83
+ ),
84
+ checked,
85
+ ...props,
86
+ children: [
87
+ /* @__PURE__ */ jsx("span", { className: "pointer-events-none absolute start-2 flex size-3.5 items-center justify-center", children: /* @__PURE__ */ jsx(DropdownMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx(Check, { className: "size-4", "aria-hidden": "true" }) }) }),
88
+ children
89
+ ]
90
+ }
91
+ ));
92
+ DropdownMenuCheckboxItem.displayName = DropdownMenuPrimitive.CheckboxItem.displayName;
93
+ var DropdownMenuRadioItem = React.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsx(
94
+ DropdownMenuPrimitive.RadioItem,
95
+ {
96
+ ref,
97
+ "data-slot": "dropdown-menu-radio-item",
98
+ className: cn(
99
+ "focus:bg-accent focus:text-accent-foreground data-[state=checked]:bg-primary/10 data-[state=checked]:text-primary relative flex cursor-default items-center gap-2 rounded-sm px-2.5 py-1.5 text-sm transition-colors outline-none select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[state=checked]:font-medium [&_svg]:pointer-events-none [&_svg]:shrink-0",
100
+ className
101
+ ),
102
+ ...props,
103
+ children
104
+ }
105
+ ));
106
+ DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName;
107
+ var DropdownMenuSubTrigger = React.forwardRef(({ className, inset, children, ...props }, ref) => /* @__PURE__ */ jsxs(
108
+ DropdownMenuPrimitive.SubTrigger,
109
+ {
110
+ ref,
111
+ "data-slot": "dropdown-menu-sub-trigger",
112
+ "data-inset": inset,
113
+ className: cn(
114
+ "focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm transition-colors outline-none select-none data-[inset=true]:ps-8 [&_svg]:pointer-events-none [&_svg]:shrink-0",
115
+ className
116
+ ),
117
+ ...props,
118
+ children: [
119
+ children,
120
+ /* @__PURE__ */ jsx(ChevronRight, { className: "ms-auto size-4", "aria-hidden": "true" })
121
+ ]
122
+ }
123
+ ));
124
+ DropdownMenuSubTrigger.displayName = DropdownMenuPrimitive.SubTrigger.displayName;
125
+ var DropdownMenuSubContent = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
126
+ DropdownMenuPrimitive.SubContent,
127
+ {
128
+ ref,
129
+ "data-slot": "dropdown-menu-sub-content",
130
+ className: cn(
131
+ "bg-popover text-popover-foreground data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 z-50 min-w-32 origin-[var(--radix-dropdown-menu-content-transform-origin)] overflow-hidden rounded-md border p-1 shadow-lg",
132
+ className
133
+ ),
134
+ ...props
135
+ }
136
+ ));
137
+ DropdownMenuSubContent.displayName = DropdownMenuPrimitive.SubContent.displayName;
138
+ var DropdownMenuShortcut = ({
139
+ className,
140
+ ...props
141
+ }) => /* @__PURE__ */ jsx(
142
+ "span",
143
+ {
144
+ "data-slot": "dropdown-menu-shortcut",
145
+ className: cn("text-muted-foreground ms-auto text-xs tracking-widest", className),
146
+ ...props
147
+ }
148
+ );
149
+
150
+ export { DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger };
@@ -0,0 +1,51 @@
1
+ import * as React from 'react';
2
+ import { Loader2, OctagonX, TriangleAlert, Info, CheckCircle2 } from 'lucide-react';
3
+ import { Toaster as Toaster$1 } from 'sonner';
4
+ import { jsx } from 'react/jsx-runtime';
5
+
6
+ // src/components/feedback/sonner.tsx
7
+ function useDocumentTheme() {
8
+ return React.useSyncExternalStore(
9
+ (onStoreChange) => {
10
+ if (typeof document === "undefined") return () => void 0;
11
+ const mq = window.matchMedia("(prefers-color-scheme: dark)");
12
+ mq.addEventListener("change", onStoreChange);
13
+ const obs = new MutationObserver(onStoreChange);
14
+ obs.observe(document.documentElement, { attributes: true, attributeFilter: ["class"] });
15
+ return () => {
16
+ mq.removeEventListener("change", onStoreChange);
17
+ obs.disconnect();
18
+ };
19
+ },
20
+ () => document.documentElement.classList.contains("dark") ? "dark" : "light",
21
+ () => "light"
22
+ );
23
+ }
24
+ function Toaster({ ...props }) {
25
+ const theme = useDocumentTheme();
26
+ return /* @__PURE__ */ jsx(
27
+ Toaster$1,
28
+ {
29
+ theme,
30
+ className: "toaster group",
31
+ icons: {
32
+ success: /* @__PURE__ */ jsx(CheckCircle2, { className: "size-4", "aria-hidden": "true" }),
33
+ info: /* @__PURE__ */ jsx(Info, { className: "size-4", "aria-hidden": "true" }),
34
+ warning: /* @__PURE__ */ jsx(TriangleAlert, { className: "size-4", "aria-hidden": "true" }),
35
+ error: /* @__PURE__ */ jsx(OctagonX, { className: "size-4", "aria-hidden": "true" }),
36
+ loading: /* @__PURE__ */ jsx(Loader2, { className: "size-4 animate-spin", "aria-hidden": "true" })
37
+ },
38
+ style: {
39
+ "--normal-bg": "var(--popover)",
40
+ "--normal-text": "var(--popover-foreground)",
41
+ "--normal-border": "var(--border)",
42
+ "--border-radius": "var(--radius)"
43
+ },
44
+ position: "bottom-right",
45
+ mobileOffset: { bottom: "16px", right: "16px" },
46
+ ...props
47
+ }
48
+ );
49
+ }
50
+
51
+ export { Toaster };
@@ -0,0 +1,81 @@
1
+ import { Command, CommandInput, CommandList, CommandEmpty, CommandGroup, CommandItem } from './chunk-V6UWJKZF.js';
2
+ import { Popover, PopoverTrigger, PopoverContent } from './chunk-DY5C44UP.js';
3
+ import { Button } from './chunk-HJEBRCXL.js';
4
+ import { useTranslation } from './chunk-3F2AKYRD.js';
5
+ import { cn } from './chunk-U7N2A7A3.js';
6
+ import * as React from 'react';
7
+ import { ChevronsUpDown, Check } from 'lucide-react';
8
+ import { jsxs, jsx } from 'react/jsx-runtime';
9
+
10
+ function Autocomplete({
11
+ options,
12
+ value,
13
+ onValueChange,
14
+ placeholder,
15
+ emptyMessage,
16
+ disabled,
17
+ className,
18
+ id,
19
+ searchPlaceholder
20
+ }) {
21
+ const { t } = useTranslation();
22
+ const [open, setOpen] = React.useState(false);
23
+ const selected = options.find((option) => option.value === value);
24
+ const resolvedPlaceholder = placeholder ?? t("dataEntry.autocomplete.placeholder");
25
+ const resolvedEmpty = emptyMessage ?? t("dataEntry.autocomplete.empty");
26
+ return /* @__PURE__ */ jsxs(Popover, { open, onOpenChange: setOpen, children: [
27
+ /* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(
28
+ Button,
29
+ {
30
+ id,
31
+ type: "button",
32
+ variant: "outline",
33
+ role: "combobox",
34
+ "aria-expanded": open,
35
+ disabled,
36
+ className: cn(
37
+ "w-full justify-between font-normal",
38
+ !selected && "text-muted-foreground",
39
+ className
40
+ ),
41
+ children: [
42
+ /* @__PURE__ */ jsx("span", { className: "truncate", children: selected?.label ?? resolvedPlaceholder }),
43
+ /* @__PURE__ */ jsx(ChevronsUpDown, { className: "ml-2 size-4 shrink-0 opacity-50", "aria-hidden": "true" })
44
+ ]
45
+ }
46
+ ) }),
47
+ /* @__PURE__ */ jsx(PopoverContent, { className: "w-[var(--radix-popover-trigger-width)] p-0", align: "start", children: /* @__PURE__ */ jsxs(Command, { children: [
48
+ /* @__PURE__ */ jsx(CommandInput, { placeholder: searchPlaceholder ?? resolvedPlaceholder }),
49
+ /* @__PURE__ */ jsxs(CommandList, { children: [
50
+ /* @__PURE__ */ jsx(CommandEmpty, { children: resolvedEmpty }),
51
+ /* @__PURE__ */ jsx(CommandGroup, { children: options.map((option) => /* @__PURE__ */ jsxs(
52
+ CommandItem,
53
+ {
54
+ value: option.label,
55
+ keywords: [option.value, option.label],
56
+ onSelect: () => {
57
+ onValueChange?.(option.value);
58
+ setOpen(false);
59
+ },
60
+ children: [
61
+ /* @__PURE__ */ jsx(
62
+ Check,
63
+ {
64
+ className: cn(
65
+ "mr-2 size-4",
66
+ value === option.value ? "opacity-100" : "opacity-0"
67
+ ),
68
+ "aria-hidden": "true"
69
+ }
70
+ ),
71
+ option.label
72
+ ]
73
+ },
74
+ option.value
75
+ )) })
76
+ ] })
77
+ ] }) })
78
+ ] });
79
+ }
80
+
81
+ export { Autocomplete };