@g4rcez/components 4.0.2 → 4.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (337) hide show
  1. package/ai/SKILL.md +120 -153
  2. package/ai/docs/Alert.md +47 -48
  3. package/ai/docs/AnimatedList.md +88 -87
  4. package/ai/docs/Autocomplete.md +102 -106
  5. package/ai/docs/Button.md +33 -33
  6. package/ai/docs/Calendar.md +67 -101
  7. package/ai/docs/Card.md +59 -55
  8. package/ai/docs/Checkbox.md +77 -82
  9. package/ai/docs/CommandPalette.md +154 -172
  10. package/ai/docs/DatePicker.md +45 -64
  11. package/ai/docs/Dropdown.md +98 -126
  12. package/ai/docs/Empty.md +41 -44
  13. package/ai/docs/Expand.md +40 -54
  14. package/ai/docs/FileUpload.md +102 -109
  15. package/ai/docs/Form.md +35 -29
  16. package/ai/docs/FormReset.md +37 -37
  17. package/ai/docs/Heading.md +4 -6
  18. package/ai/docs/Input.md +73 -98
  19. package/ai/docs/InputField.md +67 -67
  20. package/ai/docs/List.md +88 -85
  21. package/ai/docs/Menu.md +62 -60
  22. package/ai/docs/Modal.md +129 -136
  23. package/ai/docs/MultiSelect.md +65 -84
  24. package/ai/docs/Notifications.md +96 -96
  25. package/ai/docs/PageCalendar.md +88 -97
  26. package/ai/docs/Polymorph.md +25 -41
  27. package/ai/docs/Progress.md +55 -51
  28. package/ai/docs/Radiobox.md +49 -41
  29. package/ai/docs/RenderOnView.md +26 -32
  30. package/ai/docs/Resizable.md +60 -65
  31. package/ai/docs/Select.md +158 -158
  32. package/ai/docs/Shortcut.md +14 -14
  33. package/ai/docs/Skeleton.md +56 -60
  34. package/ai/docs/Slider.md +26 -49
  35. package/ai/docs/Slot.md +15 -17
  36. package/ai/docs/Spinner.md +17 -15
  37. package/ai/docs/Stats.md +44 -42
  38. package/ai/docs/Step.md +60 -60
  39. package/ai/docs/Switch.md +44 -54
  40. package/ai/docs/Table.md +124 -136
  41. package/ai/docs/Tabs.md +90 -90
  42. package/ai/docs/Tag.md +63 -65
  43. package/ai/docs/TaskList.md +40 -50
  44. package/ai/docs/Textarea.md +47 -70
  45. package/ai/docs/Timeline.md +98 -96
  46. package/ai/docs/Toolbar.md +46 -46
  47. package/ai/docs/Tooltip.md +103 -103
  48. package/ai/docs/Typography.md +55 -55
  49. package/ai/docs/Wizard.md +104 -109
  50. package/ai/docs/index.md +116 -116
  51. package/dist/autocomplete-DcTNOwyg.js +393 -0
  52. package/dist/autocomplete-DcTNOwyg.js.map +1 -0
  53. package/dist/{calendar-B5lSd0ID.js → calendar-BJMHRoy2.js} +104 -105
  54. package/dist/calendar-BJMHRoy2.js.map +1 -0
  55. package/dist/components/core/button.d.ts.map +1 -1
  56. package/dist/components/core/button.js +10 -10
  57. package/dist/components/core/button.js.map +1 -1
  58. package/dist/components/core/button.jsx +79 -0
  59. package/dist/components/core/heading.jsx +4 -0
  60. package/dist/components/core/polymorph.d.ts +1 -1
  61. package/dist/components/core/polymorph.d.ts.map +1 -1
  62. package/dist/components/core/polymorph.jsx +5 -0
  63. package/dist/components/core/render-on-view.jsx +31 -0
  64. package/dist/components/core/resizable.jsx +51 -0
  65. package/dist/components/core/slot.d.ts.map +1 -1
  66. package/dist/components/core/slot.jsx +156 -0
  67. package/dist/components/core/tag.d.ts +1 -1
  68. package/dist/components/core/tag.d.ts.map +1 -1
  69. package/dist/components/core/tag.js +4 -4
  70. package/dist/components/core/tag.js.map +1 -1
  71. package/dist/components/core/tag.jsx +51 -0
  72. package/dist/components/core/typography.jsx +18 -0
  73. package/dist/components/display/alert.d.ts +1 -1
  74. package/dist/components/display/alert.d.ts.map +1 -1
  75. package/dist/components/display/alert.js +48 -46
  76. package/dist/components/display/alert.js.map +1 -1
  77. package/dist/components/display/alert.jsx +61 -0
  78. package/dist/components/display/calendar.js +6 -6
  79. package/dist/components/display/calendar.jsx +299 -0
  80. package/dist/components/display/card.js +2 -2
  81. package/dist/components/display/card.js.map +1 -1
  82. package/dist/components/display/card.jsx +43 -0
  83. package/dist/components/display/empty.jsx +11 -0
  84. package/dist/components/display/list.js +1 -1
  85. package/dist/components/display/list.js.map +1 -1
  86. package/dist/components/display/list.jsx +81 -0
  87. package/dist/components/display/notifications.d.ts +1 -1
  88. package/dist/components/display/notifications.d.ts.map +1 -1
  89. package/dist/components/display/notifications.js +3 -3
  90. package/dist/components/display/notifications.jsx +126 -0
  91. package/dist/components/display/progress.jsx +11 -0
  92. package/dist/components/display/shortcut.jsx +23 -0
  93. package/dist/components/display/skeleton.d.ts.map +1 -1
  94. package/dist/components/display/skeleton.jsx +19 -0
  95. package/dist/components/display/spinner.d.ts.map +1 -1
  96. package/dist/components/display/spinner.jsx +11 -0
  97. package/dist/components/display/stats.js +1 -1
  98. package/dist/components/display/stats.jsx +20 -0
  99. package/dist/components/display/step.jsx +131 -0
  100. package/dist/components/display/tabs.d.ts +1 -1
  101. package/dist/components/display/tabs.d.ts.map +1 -1
  102. package/dist/components/display/tabs.js +2 -2
  103. package/dist/components/display/tabs.jsx +125 -0
  104. package/dist/components/display/timeline.js +1 -1
  105. package/dist/components/display/timeline.jsx +25 -0
  106. package/dist/components/floating/command-palette.d.ts.map +1 -1
  107. package/dist/components/floating/command-palette.jsx +197 -0
  108. package/dist/components/floating/dropdown.d.ts.map +1 -1
  109. package/dist/components/floating/dropdown.js +25 -17
  110. package/dist/components/floating/dropdown.js.map +1 -1
  111. package/dist/components/floating/dropdown.jsx +56 -0
  112. package/dist/components/floating/expand.js +7 -7
  113. package/dist/components/floating/expand.js.map +1 -1
  114. package/dist/components/floating/expand.jsx +44 -0
  115. package/dist/components/floating/menu.js +10 -10
  116. package/dist/components/floating/menu.js.map +1 -1
  117. package/dist/components/floating/menu.jsx +147 -0
  118. package/dist/components/floating/modal.d.ts +4 -4
  119. package/dist/components/floating/modal.d.ts.map +1 -1
  120. package/dist/components/floating/modal.js +106 -102
  121. package/dist/components/floating/modal.js.map +1 -1
  122. package/dist/components/floating/modal.jsx +301 -0
  123. package/dist/components/floating/toolbar.jsx +5 -0
  124. package/dist/components/floating/tooltip.d.ts.map +1 -1
  125. package/dist/components/floating/tooltip.js +14 -14
  126. package/dist/components/floating/tooltip.js.map +1 -1
  127. package/dist/components/floating/tooltip.jsx +58 -0
  128. package/dist/components/floating/wizard.jsx +161 -0
  129. package/dist/components/form/autocomplete.d.ts.map +1 -1
  130. package/dist/components/form/autocomplete.js +6 -6
  131. package/dist/components/form/autocomplete.jsx +278 -0
  132. package/dist/components/form/checkbox.js +1 -1
  133. package/dist/components/form/checkbox.jsx +12 -0
  134. package/dist/components/form/date-picker.d.ts.map +1 -1
  135. package/dist/components/form/date-picker.js +5 -5
  136. package/dist/components/form/date-picker.jsx +115 -0
  137. package/dist/components/form/file-upload.d.ts.map +1 -1
  138. package/dist/components/form/file-upload.js +2 -2
  139. package/dist/components/form/file-upload.jsx +134 -0
  140. package/dist/components/form/form.js.map +1 -1
  141. package/dist/components/form/form.jsx +10 -0
  142. package/dist/components/form/formReset.jsx +17 -0
  143. package/dist/components/form/free-text.d.ts.map +1 -1
  144. package/dist/components/form/free-text.jsx +41 -0
  145. package/dist/components/form/input-field.d.ts +11 -11
  146. package/dist/components/form/input-field.d.ts.map +1 -1
  147. package/dist/components/form/input-field.jsx +58 -0
  148. package/dist/components/form/input.js +1 -1
  149. package/dist/components/form/input.jsx +36 -0
  150. package/dist/components/form/multi-select.d.ts.map +1 -1
  151. package/dist/components/form/multi-select.jsx +336 -0
  152. package/dist/components/form/radiobox.js +1 -1
  153. package/dist/components/form/radiobox.jsx +6 -0
  154. package/dist/components/form/select.js +3 -3
  155. package/dist/components/form/select.jsx +42 -0
  156. package/dist/components/form/slider.jsx +45 -0
  157. package/dist/components/form/switch.js +2 -2
  158. package/dist/components/form/switch.js.map +1 -1
  159. package/dist/components/form/switch.jsx +46 -0
  160. package/dist/components/form/task-list.jsx +26 -0
  161. package/dist/components/form/textarea.jsx +12 -0
  162. package/dist/components/index.d.ts +0 -1
  163. package/dist/components/index.d.ts.map +1 -1
  164. package/dist/components/index.js +44 -0
  165. package/dist/components/page-calendar/calendar-header.jsx +83 -0
  166. package/dist/components/page-calendar/day-view.jsx +94 -0
  167. package/dist/components/page-calendar/event-pill.d.ts.map +1 -1
  168. package/dist/components/page-calendar/event-pill.jsx +25 -0
  169. package/dist/components/page-calendar/index.js +2 -0
  170. package/dist/components/page-calendar/month-view.jsx +46 -0
  171. package/dist/components/page-calendar/page-calendar.jsx +41 -0
  172. package/dist/components/page-calendar/page-calendar.types.js +1 -0
  173. package/dist/components/page-calendar/page-calendar.utils.js +93 -0
  174. package/dist/components/page-calendar/week-view.jsx +71 -0
  175. package/dist/components/table/filter.jsx +141 -0
  176. package/dist/components/table/group.jsx +68 -0
  177. package/dist/components/table/index.d.ts +2 -3
  178. package/dist/components/table/index.d.ts.map +1 -1
  179. package/dist/components/table/index.jsx +60 -0
  180. package/dist/components/table/inner-table.d.ts +2 -3
  181. package/dist/components/table/inner-table.d.ts.map +1 -1
  182. package/dist/components/table/inner-table.jsx +102 -0
  183. package/dist/components/table/metadata.jsx +36 -0
  184. package/dist/components/table/pagination.d.ts +3 -1
  185. package/dist/components/table/pagination.d.ts.map +1 -1
  186. package/dist/components/table/pagination.jsx +74 -0
  187. package/dist/components/table/row.d.ts +4 -5
  188. package/dist/components/table/row.d.ts.map +1 -1
  189. package/dist/components/table/row.jsx +49 -0
  190. package/dist/components/table/sort.d.ts.map +1 -1
  191. package/dist/components/table/sort.jsx +109 -0
  192. package/dist/components/table/table-lib.d.ts +1 -1
  193. package/dist/components/table/table-lib.d.ts.map +1 -1
  194. package/dist/components/table/table-lib.js +83 -0
  195. package/dist/components/table/table.context.jsx +4 -0
  196. package/dist/components/table/table.js +3 -3
  197. package/dist/components/table/thead.jsx +103 -0
  198. package/dist/config/context.js +12 -0
  199. package/dist/config/default-translations.d.ts +4 -0
  200. package/dist/config/default-translations.d.ts.map +1 -1
  201. package/dist/config/default-translations.jsx +87 -0
  202. package/dist/config/default-tweaks.js +4 -0
  203. package/dist/constants.js +2 -0
  204. package/dist/{date-picker-DwNo22lx.js → date-picker-Bnl07nd8.js} +8 -6
  205. package/dist/date-picker-Bnl07nd8.js.map +1 -0
  206. package/dist/{dom-Dl8XH0CK.js → dom-CyQHY7ID.js} +66 -61
  207. package/dist/dom-CyQHY7ID.js.map +1 -0
  208. package/dist/{file-upload-Brf2NkLr.js → file-upload-93d5DR4q.js} +139 -129
  209. package/dist/file-upload-93d5DR4q.js.map +1 -0
  210. package/dist/{floating-ui.react-QNHG9W4N.js → floating-ui.react-M2PGXLDp.js} +8 -8
  211. package/dist/floating-ui.react-M2PGXLDp.js.map +1 -0
  212. package/dist/{fns-D2eyJKd5.js → fns-C7Dt27Qd.js} +2 -2
  213. package/dist/fns-C7Dt27Qd.js.map +1 -0
  214. package/dist/hooks/use-click-outside.js +17 -0
  215. package/dist/hooks/use-color-parser.js +9 -0
  216. package/dist/hooks/use-components-provider.jsx +22 -0
  217. package/dist/hooks/use-debounce.d.ts +3 -3
  218. package/dist/hooks/use-debounce.d.ts.map +1 -1
  219. package/dist/hooks/use-debounce.js +12 -0
  220. package/dist/hooks/use-floating-ref.js +6 -0
  221. package/dist/hooks/use-form.d.ts +14 -13
  222. package/dist/hooks/use-form.d.ts.map +1 -1
  223. package/dist/hooks/use-form.js +563 -0
  224. package/dist/hooks/use-hover.js +18 -0
  225. package/dist/hooks/use-input-id.js +5 -0
  226. package/dist/hooks/use-is-coarse-device.js +12 -0
  227. package/dist/hooks/use-locale.js +10 -0
  228. package/dist/hooks/use-media-query.js +25 -0
  229. package/dist/hooks/use-on-event.js +7 -0
  230. package/dist/hooks/use-parent.js +21 -0
  231. package/dist/hooks/use-preferences.js +23 -0
  232. package/dist/hooks/use-previous.js +9 -0
  233. package/dist/hooks/use-reactive.js +9 -0
  234. package/dist/hooks/use-remove-scroll.d.ts.map +1 -1
  235. package/dist/hooks/use-remove-scroll.js +48 -0
  236. package/dist/hooks/use-resize-observer.js +17 -0
  237. package/dist/hooks/use-stable-ref.js +9 -0
  238. package/dist/hooks/use-swipe.js +17 -0
  239. package/dist/hooks/use-translations.d.ts +4 -0
  240. package/dist/hooks/use-translations.d.ts.map +1 -1
  241. package/dist/hooks/use-translations.js +9 -0
  242. package/dist/hooks/use-tweaks.js +9 -0
  243. package/dist/hooks/use-window-size.js +14 -0
  244. package/dist/index-BJ1ayTam.js +126 -0
  245. package/dist/index-BJ1ayTam.js.map +1 -0
  246. package/dist/index-C-PuFUZi.js.map +1 -1
  247. package/dist/{index-BelDtX5M.js → index-DDeQW0JW.js} +399 -404
  248. package/dist/index-DDeQW0JW.js.map +1 -0
  249. package/dist/index-DE4shK8D.js +215 -0
  250. package/dist/index-DE4shK8D.js.map +1 -0
  251. package/dist/{index-DJSMaZR4.js → index-DlJ_2RBL.js} +2 -2
  252. package/dist/index-DlJ_2RBL.js.map +1 -0
  253. package/dist/index.css +1 -1
  254. package/dist/index.esm-BaIwleSE.js.map +1 -1
  255. package/dist/index.js +20 -8177
  256. package/dist/index.js.map +1 -1
  257. package/dist/{input-CrGrSnUt.js → input-_MVxmIpu.js} +116 -114
  258. package/dist/input-_MVxmIpu.js.map +1 -0
  259. package/dist/{input-field-5vYcz5tT.js → input-field-CDCOODOl.js} +63 -47
  260. package/dist/input-field-CDCOODOl.js.map +1 -0
  261. package/dist/lib/combi-keys.js +60 -0
  262. package/dist/lib/dict.d.ts +1 -4
  263. package/dist/lib/dict.d.ts.map +1 -1
  264. package/dist/lib/dict.js +28 -0
  265. package/dist/lib/dom.d.ts +3 -2
  266. package/dist/lib/dom.d.ts.map +1 -1
  267. package/dist/lib/dom.js +66 -0
  268. package/dist/lib/fns.js +46 -0
  269. package/dist/lib/fzf.d.ts.map +1 -1
  270. package/dist/lib/fzf.js +115 -0
  271. package/dist/lib/keyboard-area.js +14 -0
  272. package/dist/notifications-Dp0ydKJS.js +2576 -0
  273. package/dist/notifications-Dp0ydKJS.js.map +1 -0
  274. package/dist/polymorph-B5n9fs_K.js.map +1 -1
  275. package/dist/preset/plugin.tailwind.d.ts.map +1 -1
  276. package/dist/preset/plugin.tailwind.js +20 -18
  277. package/dist/preset/preset.tailwind.js +24 -25
  278. package/dist/preset/src/styles/common.js +6 -3
  279. package/dist/preset/src/styles/dark.d.ts.map +1 -1
  280. package/dist/preset/src/styles/dark.js +9 -5
  281. package/dist/preset/src/styles/design-tokens.js +68 -89
  282. package/dist/preset/src/styles/light.d.ts.map +1 -1
  283. package/dist/preset/src/styles/light.js +9 -5
  284. package/dist/preset/src/styles/theme.js +7 -4
  285. package/dist/preset/src/styles/theme.types.d.ts +2 -1
  286. package/dist/preset/src/styles/theme.types.d.ts.map +1 -1
  287. package/dist/preset/src/styles/theme.types.js +2 -1
  288. package/dist/skeleton-BjJobYYf.js +24 -0
  289. package/dist/skeleton-BjJobYYf.js.map +1 -0
  290. package/dist/slot-CRyweuj0.js.map +1 -1
  291. package/dist/styles/common.js +6 -3
  292. package/dist/styles/dark.d.ts.map +1 -1
  293. package/dist/styles/dark.js +9 -5
  294. package/dist/styles/design-tokens.js +68 -89
  295. package/dist/styles/light.d.ts.map +1 -1
  296. package/dist/styles/light.js +9 -5
  297. package/dist/styles/theme.js +7 -4
  298. package/dist/styles/theme.types.d.ts +2 -1
  299. package/dist/styles/theme.types.d.ts.map +1 -1
  300. package/dist/styles/theme.types.js +2 -1
  301. package/dist/tabs-B0g7YtQv.js +123 -0
  302. package/dist/tabs-B0g7YtQv.js.map +1 -0
  303. package/dist/tsconfig.lib.tsbuildinfo +1 -0
  304. package/dist/types.d.ts +2 -2
  305. package/dist/types.d.ts.map +1 -1
  306. package/dist/types.js +1 -0
  307. package/dist/{context-BFXNJVn2.js → use-translations-DSltA7H_.js} +38 -30
  308. package/dist/use-translations-DSltA7H_.js.map +1 -0
  309. package/package.json +99 -86
  310. package/ai/docs/TransferList.md +0 -142
  311. package/dist/autocomplete-Cn9Z2hLq.js +0 -375
  312. package/dist/autocomplete-Cn9Z2hLq.js.map +0 -1
  313. package/dist/calendar-B5lSd0ID.js.map +0 -1
  314. package/dist/components/form/transfer-list.d.ts +0 -14
  315. package/dist/components/form/transfer-list.d.ts.map +0 -1
  316. package/dist/components/form/transfer-list.js +0 -55
  317. package/dist/components/form/transfer-list.js.map +0 -1
  318. package/dist/context-BFXNJVn2.js.map +0 -1
  319. package/dist/date-picker-DwNo22lx.js.map +0 -1
  320. package/dist/dom-Dl8XH0CK.js.map +0 -1
  321. package/dist/file-upload-Brf2NkLr.js.map +0 -1
  322. package/dist/floating-ui.react-QNHG9W4N.js.map +0 -1
  323. package/dist/fns-D2eyJKd5.js.map +0 -1
  324. package/dist/index-BelDtX5M.js.map +0 -1
  325. package/dist/index-DJSMaZR4.js.map +0 -1
  326. package/dist/index-Z-fZHxfJ.js +0 -335
  327. package/dist/index-Z-fZHxfJ.js.map +0 -1
  328. package/dist/input-CrGrSnUt.js.map +0 -1
  329. package/dist/input-field-5vYcz5tT.js.map +0 -1
  330. package/dist/notifications-cUdVPs-B.js +0 -2786
  331. package/dist/notifications-cUdVPs-B.js.map +0 -1
  332. package/dist/skeleton-D75GFBV6.js +0 -10
  333. package/dist/skeleton-D75GFBV6.js.map +0 -1
  334. package/dist/tabs-S00a8qq8.js +0 -106
  335. package/dist/tabs-S00a8qq8.js.map +0 -1
  336. package/dist/use-translations-BwLKTrZv.js +0 -10
  337. package/dist/use-translations-BwLKTrZv.js.map +0 -1
@@ -0,0 +1,17 @@
1
+ const inputFields = ["INPUT", "SELECT"];
2
+ export const formReset = (form) => {
3
+ if (!form)
4
+ return;
5
+ const elements = Array.from(form.elements);
6
+ elements.forEach((field) => {
7
+ if (!inputFields.includes(field.tagName))
8
+ return;
9
+ if (field.tagName === "INPUT") {
10
+ field.value = field.defaultValue;
11
+ }
12
+ if (field.tagName === "SELECT") {
13
+ field.value = "";
14
+ }
15
+ field.setAttribute("data-initialized", "false");
16
+ });
17
+ };
@@ -1 +1 @@
1
- {"version":3,"file":"free-text.d.ts","sourceRoot":"","sources":["../../../src/components/form/free-text.tsx"],"names":[],"mappings":"AAEA,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEvD,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAc,eAAe,EAAE,MAAM,eAAe,CAAC;AAE3E,KAAK,WAAW,GAAG,OAAO,GAAG,UAAU,CAAC;AAExC,MAAM,MAAM,aAAa,CAAC,CAAC,SAAS,WAAW,EAAE,UAAU,SAAS,GAAG,IAAI,QAAQ,CAC/E,eAAe,CAAC,CAAC,CAAC,GAAG,aAAa,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,UAAU,CAAA;CAAE,CAAC,EAChF,UAAU,CACb,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,KAAK,CAAC,CAAC,SAAS,WAAW,EAAE,KAAK,CAAC,IAAI,SAAS,gBAAgB,GAAG,mBAAmB,EAAE,KAAK,SAAS,GAAG,EACpI,SAAS,OAAO,GAAG,UAAU,GAAG,OAAO,SAAS,EAChD,aAAa,OAAO,GAAG,UAAU,EACjC,cAAc,aAAa,CAAC,CAAC,EAAE,KAAK,CAAC,EACrC,WAAW,CAAC,EAAE,EAAE,IAAI,KAAK,MAAM,IAAI,4CAyGtC,CAAC"}
1
+ {"version":3,"file":"free-text.d.ts","sourceRoot":"","sources":["../../../src/components/form/free-text.tsx"],"names":[],"mappings":"AAEA,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEvD,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAc,eAAe,EAAE,MAAM,eAAe,CAAC;AAE3E,KAAK,WAAW,GAAG,OAAO,GAAG,UAAU,CAAC;AAExC,MAAM,MAAM,aAAa,CAAC,CAAC,SAAS,WAAW,EAAE,UAAU,SAAS,GAAG,IAAI,QAAQ,CAC/E,eAAe,CAAC,CAAC,CAAC,GAAG,aAAa,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,UAAU,CAAA;CAAE,CAAC,EAChF,UAAU,CACb,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,KAAK,CAAC,CAAC,SAAS,WAAW,EAAE,KAAK,CAAC,IAAI,SAAS,gBAAgB,GAAG,mBAAmB,EAAE,KAAK,SAAS,GAAG,EACpI,SAAS,OAAO,GAAG,UAAU,GAAG,OAAO,SAAS,EAChD,aAAa,OAAO,GAAG,UAAU,EACjC,cAAc,aAAa,CAAC,CAAC,EAAE,KAAK,CAAC,EACrC,WAAW,CAAC,EAAE,EAAE,IAAI,KAAK,MAAM,IAAI,4CA2GtC,CAAC"}
@@ -0,0 +1,41 @@
1
+ "use client";
2
+ import React, { forwardRef, useEffect, useRef } from "react";
3
+ import { css, initializeInputDataset, mergeRefs } from "../../lib/dom";
4
+ import { InputField } from "./input-field";
5
+ export const createFreeText = (Element, elementName, defaultProps, register) => {
6
+ const FreeText = forwardRef(({ info, left, next, error, right, container, rightLabel, interactive, optionalText, type = "text", labelClassName, feedback = null, hideLeft = false, loading, hiddenLabel, ...props }, ref) => {
7
+ const Render = Element;
8
+ const id = props.id ?? props.name;
9
+ const inputRef = useRef(null);
10
+ useEffect(() => {
11
+ if (inputRef.current === null)
12
+ return;
13
+ const input = inputRef.current;
14
+ const focus = initializeInputDataset(inputRef.current);
15
+ const registered = register?.(input);
16
+ const goNextInputImpl = (e) => {
17
+ const event = e;
18
+ if (event.key === "Enter" && input.enterKeyHint === "next") {
19
+ const focusNext = input.getAttribute("data-next");
20
+ if (focusNext) {
21
+ const el = document.getElementById(focusNext);
22
+ if (el) {
23
+ el.focus();
24
+ return void event.preventDefault();
25
+ }
26
+ }
27
+ }
28
+ };
29
+ input.addEventListener("keydown", goNextInputImpl);
30
+ return () => {
31
+ registered?.();
32
+ focus();
33
+ input.removeEventListener("keydown", goNextInputImpl);
34
+ };
35
+ }, []);
36
+ return (<InputField {...defaultProps} info={info} left={left} error={error} right={right} form={props.form} loading={loading} name={props.name} feedback={feedback} hideLeft={hideLeft} title={props.title} rightLabel={rightLabel} disabled={props.disabled} hiddenLabel={hiddenLabel} interactive={interactive} required={props.required} componentName={elementName} id={props.name || props.id} optionalText={optionalText} labelClassName={labelClassName} placeholder={props.placeholder} container={css(container, defaultProps.container)}>
37
+ <Render {...defaultProps} {...props} id={id} name={id} type={type} data-next={next} aria-busy={loading} aria-invalid={!!error} aria-disabled={props.disabled} aria-readonly={props.readOnly} aria-describedby={error ? `${id}-error` : undefined} ref={mergeRefs(ref, inputRef)} className={css("input placeholder-input-mask group h-input-height w-full flex-1", "rounded-md bg-transparent px-input-x py-input-y text-base text-foreground", "outline-none transition-colors focus:ring-2 focus:ring-inset focus:ring-primary", "group-error:text-danger group-error:placeholder-input-mask-error", "resize-y group-focus-within:border-primary group-hover:border-primary", "disabled:cursor-not-allowed disabled:text-disabled", props.className)}/>
38
+ </InputField>);
39
+ });
40
+ return FreeText;
41
+ };
@@ -13,22 +13,22 @@ export type FeedbackProps = React.PropsWithChildren<Partial<{
13
13
  }>>;
14
14
  export declare const InputFeedback: ({ reportStatus, id, hideLeft, className, info, children, title }: FeedbackProps) => React.JSX.Element;
15
15
  export type InputFieldProps<T extends "input" | "select" | "textarea"> = PolymorphicProps<Partial<Override<FeedbackProps, {
16
- loading: boolean;
17
- componentName: string;
16
+ id: string;
18
17
  info: Label;
19
- labelClassName: string;
20
- error: string;
21
- hideLeft: boolean;
22
- interactive: boolean;
23
- container: string;
24
18
  left: Label;
25
- feedback: Label;
26
- optionalText: string;
19
+ name: string;
27
20
  right: Label;
21
+ error: string;
22
+ feedback: Label;
23
+ loading: boolean;
24
+ container: string;
25
+ hideLeft: boolean;
28
26
  rightLabel: Label;
29
- id: string;
30
- name: string;
31
27
  placeholder: string;
28
+ interactive: boolean;
29
+ optionalText: string;
30
+ componentName: string;
31
+ labelClassName: string;
32
32
  }>>, T>;
33
33
  export declare const InputField: <T extends "input" | "select" | "textarea">(props: PropsWithChildren<InputFieldProps<T>>) => React.ReactElement;
34
34
  //# sourceMappingURL=input-field.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"input-field.d.ts","sourceRoot":"","sources":["../../../src/components/form/input-field.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAAwB,KAAK,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAI5E,OAAO,EAAE,KAAK,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAG1D,MAAM,MAAM,aAAa,GAAG,KAAK,CAAC,iBAAiB,CAC/C,OAAO,CAAC;IACJ,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,KAAK,CAAC;IACZ,KAAK,EAAE,KAAK,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;IACtB,WAAW,EAAE,OAAO,CAAC;CACxB,CAAC,CACL,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,kEAA0E,aAAa,sBA+CpH,CAAC;AAEF,MAAM,MAAM,eAAe,CAAC,CAAC,SAAS,OAAO,GAAG,QAAQ,GAAG,UAAU,IAAI,gBAAgB,CACrF,OAAO,CACH,QAAQ,CACJ,aAAa,EACb;IACI,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,KAAK,CAAC;IACZ,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,KAAK,CAAC;IACZ,QAAQ,EAAE,KAAK,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,KAAK,CAAC;IACb,UAAU,EAAE,KAAK,CAAC;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACvB,CACJ,CACJ,EACD,CAAC,CACJ,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,CAAC,CAAC,SAAS,OAAO,GAAG,QAAQ,GAAG,UAAU,EAAE,KAAK,EAAE,iBAAiB,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,YAmFpH,CAAC"}
1
+ {"version":3,"file":"input-field.d.ts","sourceRoot":"","sources":["../../../src/components/form/input-field.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAAwB,KAAK,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAI5E,OAAO,EAAE,KAAK,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAG1D,MAAM,MAAM,aAAa,GAAG,KAAK,CAAC,iBAAiB,CAC/C,OAAO,CAAC;IACJ,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,KAAK,CAAC;IACZ,KAAK,EAAE,KAAK,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;IACtB,WAAW,EAAE,OAAO,CAAC;CACxB,CAAC,CACL,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,kEAA0E,aAAa,sBA+CpH,CAAC;AAEF,MAAM,MAAM,eAAe,CAAC,CAAC,SAAS,OAAO,GAAG,QAAQ,GAAG,UAAU,IAAI,gBAAgB,CACrF,OAAO,CACH,QAAQ,CACJ,aAAa,EACb;IACI,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,KAAK,CAAC;IACZ,IAAI,EAAE,KAAK,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,KAAK,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,KAAK,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,KAAK,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;CAC1B,CACJ,CACJ,EACD,CAAC,CACJ,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,CAAC,CAAC,SAAS,OAAO,GAAG,QAAQ,GAAG,UAAU,EAAE,KAAK,EAAE,iBAAiB,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,YAiGG,CAAC"}
@@ -0,0 +1,58 @@
1
+ "use client";
2
+ import { CheckCircleIcon, InfoIcon, XCircleIcon } from "@phosphor-icons/react";
3
+ import React, { forwardRef, Fragment } from "react";
4
+ import { useTranslations } from "../../hooks/use-translations";
5
+ import { useTweaks } from "../../hooks/use-tweaks";
6
+ import { css } from "../../lib/dom";
7
+ import { Tooltip } from "../floating/tooltip";
8
+ export const InputFeedback = ({ reportStatus, id, hideLeft = false, className, info, children, title }) => (<span className={css("w-full justify-between", hideLeft && children === null ? "hidden" : "flex", className)}>
9
+ {hideLeft ? null : (<span className="flex items-center gap-1 transition-colors group-focus-within:text-primary group-hover:text-primary group-disabled:text-disabled group-error:text-danger">
10
+ {title}
11
+ {reportStatus || info ? (<span className="flex items-center justify-center gap-1">
12
+ {info ? (<Tooltip as="button" type="button" aria-label={typeof info === "string" ? info : undefined} aria-describedby={typeof info === "string" ? undefined : id ? `tooltip-info-content-${id}` : undefined} title={<span className="cursor-help">
13
+ <InfoIcon className="aspect-square size-3" aria-hidden="true" size={16}/>
14
+ </span>}>
15
+ <div id={id ? `tooltip-info-content-${id}` : undefined} className="w-full max-w-48 whitespace-break-spaces break-words">
16
+ {info}
17
+ </div>
18
+ </Tooltip>) : null}
19
+ {reportStatus ? (<span className="flex h-3 min-w-6 items-center">
20
+ <CheckCircleIcon className="hidden aspect-square size-3 opacity-0 transition-opacity group-assert:block group-assert:text-success group-assert:opacity-100" aria-hidden="true" size={16}/>
21
+ <XCircleIcon className="hidden aspect-square size-3 opacity-0 transition-opacity group-error:block group-error:opacity-100" aria-hidden="true" size={16}/>
22
+ </span>) : null}
23
+ </span>) : null}
24
+ </span>)}
25
+ {children}
26
+ </span>);
27
+ export const InputField = forwardRef(({ optionalText: _optionalText, left, rightLabel, container, feedback, interactive, right, info, children, error, form, id, labelClassName = "", name, title, componentName, placeholder, hideLeft = false, required, disabled, reportStatus, hiddenLabel, }, ref) => {
28
+ const tweaks = useTweaks();
29
+ const reportStatusDefault = reportStatus !== undefined ? reportStatus : tweaks.input.iconFeedback;
30
+ const ID = id ?? name;
31
+ const translation = useTranslations();
32
+ const optionalText = _optionalText ?? translation.inputOptionalLabel;
33
+ return (<fieldset ref={ref} form={form} disabled={disabled} data-error={!!error} aria-disabled={disabled} data-component={componentName} data-interactive={!!interactive} className={css("group flex min-h-0 min-w-0 max-w-full flex-col items-start", container)}>
34
+ <label form={form} htmlFor={ID} className="relative inline-flex w-full max-w-full cursor-text flex-row flex-wrap justify-between gap-1 text-field-label text-sm transition-colors empty:hidden group-disabled:cursor-not-allowed group-error:text-danger">
35
+ {hiddenLabel ? (<span className="sr-only">
36
+ <InputFeedback info={info} hideLeft={hideLeft} reportStatus={reportStatusDefault} title={title} placeholder={placeholder}/>
37
+ </span>) : (<InputFeedback info={info} hideLeft={hideLeft} reportStatus={reportStatusDefault} title={title} placeholder={placeholder}>
38
+ {optionalText || rightLabel ? (<Fragment>
39
+ {!required ? (<span aria-disabled={disabled} className="text-opacity-70 transition-colors group-focus-within:text-primary group-hover:text-primary aria-disabled:text-disabled">
40
+ {optionalText}
41
+ </span>) : null}
42
+ {rightLabel ? <Fragment>{rightLabel}</Fragment> : null}
43
+ </Fragment>) : null}
44
+ </InputFeedback>)}
45
+ <div className={`group relative flex w-full flex-row flex-nowrap items-center gap-x-2 gap-y-1 rounded-md border border-input-border bg-transparent transition-colors group-hover:border-primary group-disabled:border-disabled group-error:border-danger ${labelClassName}`}>
46
+ {left ? <span className="flex flex-nowrap gap-1 whitespace-nowrap pl-2">{left}</span> : null}
47
+ {children}
48
+ {right ? <span className="flex flex-nowrap gap-2 whitespace-nowrap pr-2">{right}</span> : null}
49
+ </div>
50
+ </label>
51
+ <p id={`${ID}-error`} role="alert" className="mt-input-gap hidden whitespace-pre-wrap text-wrap text-xs empty:mt-0 empty:hidden group-has-[input:not(:focus):invalid[data-initialized=true]]:flex group-error:flex group-error:text-danger">
52
+ {error}
53
+ </p>
54
+ <p className="mt-input-gap text-xs empty:mt-0 empty:hidden group-has-[input:not(:focus):valid[data-initialized=true]]:block group-assert:block group-error:hidden">
55
+ {feedback}
56
+ </p>
57
+ </fieldset>);
58
+ }); // forwardRef return is non-generic; cast restores the polymorphic signature
@@ -1,4 +1,4 @@
1
- import { I as r } from "../../input-CrGrSnUt.js";
1
+ import { I as r } from "../../input-_MVxmIpu.js";
2
2
  export {
3
3
  r as Input
4
4
  };
@@ -0,0 +1,36 @@
1
+ "use client";
2
+ import MaskInput from "the-mask-input";
3
+ import { createFreeText } from "./free-text";
4
+ /**
5
+ * A text input component with advanced masking capabilities.
6
+ *
7
+ * Supports various input masks including:
8
+ * - Currency formatting with locale support
9
+ * - Percentage inputs
10
+ * - Custom regex patterns
11
+ * - Phone numbers, dates, and other formatted inputs
12
+ *
13
+ * @example
14
+ * ```tsx
15
+ * // Basic input
16
+ * <Input placeholder="Enter text..." />
17
+ *
18
+ * // Phone number mask
19
+ * <Input mask="(99) 99999-9999" placeholder="Phone" />
20
+ *
21
+ * // Currency input
22
+ * <Input mask="currency" currency="USD" locale="en-US" />
23
+ *
24
+ * // Percentage input
25
+ * <Input mask="percentage" />
26
+ *
27
+ * // Custom mask
28
+ * <Input mask={["999.999.999-99"]} placeholder="CPF" />
29
+ * ```
30
+ *
31
+ * @param props - Input props including mask, validation, and styling options
32
+ * @returns A masked input component with form integration
33
+ */
34
+ export const Input = createFreeText(MaskInput, "input", {
35
+ type: "text",
36
+ });
@@ -1 +1 @@
1
- {"version":3,"file":"multi-select.d.ts","sourceRoot":"","sources":["../../../src/components/form/multi-select.tsx"],"names":[],"mappings":"AAiBA,OAAO,KAA6F,MAAM,OAAO,CAAC;AASlH,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAG9C,OAAO,EAAc,eAAe,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5C,MAAM,MAAM,oBAAoB,GAAG,WAAW,GAAG;IAAE,MAAM,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,WAAW,CAAC,CAAA;CAAE,CAAC;AAEpF,MAAM,MAAM,gBAAgB,GAAG,QAAQ,CACnC,eAAe,CAAC,OAAO,CAAC,EACxB;IACI,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,YAAY,CAAC,EAAE,KAAK,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,OAAO,EAAE,oBAAoB,EAAE,CAAC;IAChC,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;CACjD,CACJ,CAAC;AA0DF,eAAO,MAAM,WAAW,wGAuavB,CAAC"}
1
+ {"version":3,"file":"multi-select.d.ts","sourceRoot":"","sources":["../../../src/components/form/multi-select.tsx"],"names":[],"mappings":"AAkBA,OAAO,KAA6F,MAAM,OAAO,CAAC;AASlH,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAG9C,OAAO,EAAc,eAAe,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5C,MAAM,MAAM,oBAAoB,GAAG,WAAW,GAAG;IAAE,MAAM,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,WAAW,CAAC,CAAA;CAAE,CAAC;AAEpF,MAAM,MAAM,gBAAgB,GAAG,QAAQ,CACnC,eAAe,CAAC,OAAO,CAAC,EACxB;IACI,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,YAAY,CAAC,EAAE,KAAK,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,OAAO,EAAE,oBAAoB,EAAE,CAAC;IAChC,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;CACjD,CACJ,CAAC;AA8DF,eAAO,MAAM,WAAW,wGAocvB,CAAC"}
@@ -0,0 +1,336 @@
1
+ "use client";
2
+ import { autoPlacement, autoUpdate, FloatingFocusManager, FloatingOverlay, FloatingPortal, offset, size, useDismiss, useFloating, useInteractions, useListNavigation, useRole, useTransitionStyles, } from "@floating-ui/react";
3
+ import { CaretDownIcon, XIcon } from "@phosphor-icons/react";
4
+ import { AnimatePresence, motion } from "motion/react";
5
+ import React, { forwardRef, Fragment, useEffect, useMemo, useRef, useState } from "react";
6
+ import { flushSync } from "react-dom";
7
+ import { Virtuoso } from "react-virtuoso";
8
+ import { useRemoveScroll } from "../../hooks/use-remove-scroll";
9
+ import { useTranslations } from "../../hooks/use-translations";
10
+ import { Dict } from "../../lib/dict";
11
+ import { css, getRemainingSize, initializeInputDataset } from "../../lib/dom";
12
+ import { noop } from "../../lib/fns";
13
+ import { fzf } from "../../lib/fzf";
14
+ import { Tag } from "../core/tag";
15
+ import { Checkbox } from "./checkbox";
16
+ import { InputField } from "./input-field";
17
+ const MIN_SIZE = 40;
18
+ const Frag = (props) => <Fragment>{props.children}</Fragment>;
19
+ const transitionStyles = {
20
+ duration: 200,
21
+ initial: { transform: "scaleY(0)", opacity: 0.2 },
22
+ open: { transform: "scaleY(1)", opacity: 1 },
23
+ close: { transform: "scaleY(0)", opacity: 0 },
24
+ };
25
+ const EMPTY_NODES = [];
26
+ const EMPTY_VALUES = [];
27
+ const List = forwardRef(function VirtualItem({ item, context, ...props }, ref) {
28
+ return <motion.li {...props} ref={ref} className="last:rounded-t-lg"/>;
29
+ });
30
+ const Item = forwardRef(function VirtualList({ context, ...props }, ref) {
31
+ return (<motion.ul {...props} role="listbox" ref={ref} className="w-full rounded-b-lg border-b border-tooltip-border last:border-transparent">
32
+ <AnimatePresence>{props.children}</AnimatePresence>
33
+ </motion.ul>);
34
+ });
35
+ const components = { List, Item };
36
+ const OverflowControl = (props) => {
37
+ const translate = useTranslations();
38
+ const ref = useRef(null);
39
+ const countable = React.Children.count(props.children);
40
+ const [normalView, setNormalView] = useState(false);
41
+ useEffect(() => {
42
+ if (ref.current === null)
43
+ return;
44
+ const parent = ref.current.parentElement.getBoundingClientRect();
45
+ const items = Array.from(ref.current.querySelectorAll("[data-component='tag']"));
46
+ const child = items.reduce((acc, el) => acc + el.getBoundingClientRect().width, 0);
47
+ const hasOnlyCounter = ref.current.querySelectorAll("[data-multicounter]").length;
48
+ if (hasOnlyCounter && countable <= 3)
49
+ return setNormalView(false);
50
+ if (child > parent.width)
51
+ return setNormalView(true);
52
+ }, [countable]);
53
+ return (<span ref={ref} className="flex flex-nowrap gap-x-2">
54
+ {!normalView ? (props.children) : (<Tag size="small" data-multicounter="true">
55
+ {countable} {translate.multiSelectSelectedLabel}
56
+ </Tag>)}
57
+ </span>);
58
+ };
59
+ export const MultiSelect = forwardRef(({ left, error, right, options, container, rightLabel, interactive, emptyMessage, optionalText, selectedLabel, labelClassName, feedback = null, hideLeft = false, required = false, dynamicOption = false, onChangeOptions, ...props }, externalRef) => {
60
+ const scroller = useRef(null);
61
+ const map = useMemo(() => new Dict(options.map((x) => [x.value, x])), [options]);
62
+ const fieldset = useRef(null);
63
+ const virtuoso = useRef(null);
64
+ const defaults = props.value ?? props.defaultValue ?? EMPTY_VALUES;
65
+ const translation = useTranslations();
66
+ const [open, setOpen] = useState(false);
67
+ const [shadow, setShadow] = useState("");
68
+ const [value, setValue] = useState(() => {
69
+ const d = new Dict();
70
+ defaults.forEach((x) => {
71
+ const result = map.get(x);
72
+ return result ? d.set(x, result) : undefined;
73
+ });
74
+ return d;
75
+ });
76
+ const [label, setLabel] = useState(() => {
77
+ const d = new Set(defaults);
78
+ return options.reduce((acc, x) => (d.has(x.value) ? [...acc, x.label ?? x.value] : acc), []) ?? defaults;
79
+ });
80
+ const [index, setIndex] = useState(null);
81
+ const listRef = useRef(EMPTY_NODES);
82
+ const [, tick] = useState(0);
83
+ const [h, setH] = useState(() => Math.min(320, MIN_SIZE * options.length));
84
+ const removeScrollRef = useRemoveScroll(open, "block-only");
85
+ const innerOptions = useMemo(() => (dynamicOption && shadow !== "" ? [{ value: shadow, label: shadow, "data-dynamic": "true" }, ...options] : options), [dynamicOption, shadow, options]);
86
+ const list = useMemo(() => shadow.length === 0
87
+ ? innerOptions
88
+ : fzf(innerOptions, "value", [
89
+ { key: "value", value: shadow },
90
+ { key: "label", value: shadow },
91
+ ]), [innerOptions, shadow]);
92
+ const displayList = useMemo(() => list.filter((x) => x.hidden !== true), [list]);
93
+ const values = useMemo(() => Array.from(value.keys()), [value]);
94
+ const isEmpty = displayList.length === 0;
95
+ const openDropdown = () => flushSync(() => setOpen(true));
96
+ const setClosed = () => {
97
+ setOpen(false);
98
+ setH(0);
99
+ };
100
+ const { x, y, strategy, refs, context, placement } = useFloating({
101
+ open,
102
+ transform: true,
103
+ placement: "bottom-start",
104
+ strategy: "absolute",
105
+ onOpenChange: setOpen,
106
+ whileElementsMounted: autoUpdate,
107
+ middleware: [
108
+ offset(4),
109
+ autoPlacement({ allowedPlacements: ["top-start", "bottom-start"], alignment: "start" }),
110
+ size({
111
+ padding: 10,
112
+ elementContext: "reference",
113
+ apply(args) {
114
+ const DEFAULT_SIZE = getRemainingSize(refs.reference.current, window.innerHeight);
115
+ const mw = `${fieldset.current?.getBoundingClientRect().width || DEFAULT_SIZE}px`;
116
+ Object.assign(args.elements.floating.style, { width: mw, maxWidth: mw });
117
+ },
118
+ }),
119
+ ],
120
+ });
121
+ const isTopPlacement = placement === "top" || placement === "top-start";
122
+ const transitions = useTransitionStyles(context, transitionStyles);
123
+ const { getReferenceProps, getFloatingProps, getItemProps } = useInteractions([
124
+ useRole(context, { role: "listbox" }),
125
+ useDismiss(context),
126
+ useListNavigation(context, {
127
+ cols: 0,
128
+ listRef,
129
+ loop: true,
130
+ virtual: true,
131
+ allowEscape: true,
132
+ activeIndex: index,
133
+ selectedIndex: index,
134
+ focusItemOnOpen: "auto",
135
+ openOnArrowKeyDown: true,
136
+ scrollItemIntoView: true,
137
+ onNavigate: (n) => setIndex((prev) => n ?? prev),
138
+ }),
139
+ ]);
140
+ useEffect(() => {
141
+ if (props.value) {
142
+ setValue(new Dict(props.value.map((x) => [x, map.get(x)])));
143
+ }
144
+ }, [props.value, map]);
145
+ useEffect(() => {
146
+ const input = refs.reference.current;
147
+ if (!input)
148
+ return;
149
+ return initializeInputDataset(input);
150
+ }, []);
151
+ useEffect(() => {
152
+ if (!open)
153
+ return;
154
+ const id = requestAnimationFrame(() => tick((n) => n + 1));
155
+ return () => cancelAnimationFrame(id);
156
+ }, [open]);
157
+ useEffect(() => {
158
+ if (!open) {
159
+ setH(0);
160
+ return;
161
+ }
162
+ const id = setTimeout(() => setH(Math.min(320, displayList.length * MIN_SIZE)), 100);
163
+ return () => clearTimeout(id);
164
+ }, [open, displayList.length]);
165
+ const onSelect = (opt, i) => {
166
+ const clone = value.clone((c) => {
167
+ if (c.has(opt.value))
168
+ return c.remove(opt.value);
169
+ return c.set(opt.value, opt);
170
+ });
171
+ setValue(clone);
172
+ const input = refs.reference.current;
173
+ if (!input)
174
+ return;
175
+ const opts = clone.map((x) => x.value);
176
+ input?.setAttribute("data-value", JSON.stringify(opts));
177
+ if (onChangeOptions)
178
+ onChangeOptions(opts);
179
+ setLabel((prev) => prev.concat(opt.label ?? ""));
180
+ setShadow("");
181
+ setIndex(i);
182
+ };
183
+ const onChange = (event) => {
184
+ const v = event.target.value;
185
+ setShadow(v);
186
+ if (!open && v === "")
187
+ return setOpen(true);
188
+ event.target.name = props.name || "";
189
+ return v ? setOpen(true) : undefined;
190
+ };
191
+ const onCaretDownClick = () => {
192
+ openDropdown();
193
+ setShadow("");
194
+ refs.reference.current?.focus();
195
+ };
196
+ const onFocus = () => {
197
+ openDropdown();
198
+ setShadow("");
199
+ };
200
+ const onClose = () => {
201
+ refs.reference.current?.setAttribute("data-value", "[]");
202
+ setShadow("");
203
+ setValue(new Dict());
204
+ onChangeOptions?.([]);
205
+ setClosed();
206
+ };
207
+ const id = props.id || props.name;
208
+ const tags = value.map((x, i) => (<Tag size="small" key={`MultiSelect-${x.value}-x`} icon={<button type="button" aria-label={`Remove ${x.label ?? x.value}`} className="text-current hover:text-danger focus:text-danger" onClick={(e) => {
209
+ e.preventDefault();
210
+ e.stopPropagation();
211
+ onSelect(x, i);
212
+ }}>
213
+ <XIcon size={14} aria-hidden="true"/>
214
+ </button>}>
215
+ {x.label ?? x.value}
216
+ </Tag>));
217
+ return (<InputField {...props} left={left} error={error} ref={fieldset} form={props.form} name={props.name} feedback={feedback} hideLeft={hideLeft} required={required} title={props.title} container={container} rightLabel={rightLabel} interactive={interactive} id={props.name || props.id} optionalText={optionalText} componentName="autocomplete" labelClassName={labelClassName} placeholder={props.placeholder} right={<span className="flex items-center gap-0.5">
218
+ {right}
219
+ <button type="button" className="transition-colors link:text-primary" onClick={onCaretDownClick}>
220
+ <CaretDownIcon size={20}/>
221
+ <span className="sr-only">{translation.inputCaretDown}</span>
222
+ </button>
223
+ {value ? (<button type="button" onClick={onClose} aria-label={translation.inputCloseValue} className="transition-colors link:text-danger">
224
+ <svg width="15" height="15" viewBox="0 0 15 15" fill="none" xmlns="http://www.w3.org/2000/svg">
225
+ <path d="M11.7816 4.03157C12.0062 3.80702 12.0062 3.44295 11.7816 3.2184C11.5571 2.99385 11.193 2.99385 10.9685 3.2184L7.50005 6.68682L4.03164 3.2184C3.80708 2.99385 3.44301 2.99385 3.21846 3.2184C2.99391 3.44295 2.99391 3.80702 3.21846 4.03157L6.68688 7.49999L3.21846 10.9684C2.99391 11.193 2.99391 11.557 3.21846 11.7816C3.44301 12.0061 3.80708 12.0061 4.03164 11.7816L7.50005 8.31316L10.9685 11.7816C11.193 12.0061 11.5571 12.0061 11.7816 11.7816C12.0062 11.557 12.0062 11.193 11.7816 10.9684L8.31322 7.49999L11.7816 4.03157Z" fill="currentColor" fillRule="evenodd" clipRule="evenodd"/>
226
+ </svg>
227
+ </button>) : null}
228
+ </span>}>
229
+ <ul {...getReferenceProps({
230
+ ...props,
231
+ onFocus,
232
+ id: `${id}-shadow`,
233
+ name: `${id}-shadow`,
234
+ ref: refs.setReference,
235
+ })} tabIndex={0} role="button" data-name={id} data-target={id} data-shadow="true" data-error={!!error} aria-autocomplete="list" data-value={values.join(",")} className={css("input placeholder-input-mask group h-input-height w-full text-base", "rounded-md bg-transparent px-input-x py-input-y text-foreground", "outline-none transition-colors focus:ring-2 focus:ring-inset focus:ring-primary", "group-error:text-danger group-error:placeholder-input-mask-error", "group-focus-within:border-primary group-hover:border-primary", "flex flex-row items-center gap-2 whitespace-nowrap text-left", "max-w-full overflow-x-auto truncate overflow-ellipsis", props.className)}>
236
+ {values.length > 0 ? null : <li className="text-input-placeholder">{props.placeholder}</li>}
237
+ <OverflowControl label={selectedLabel}>{tags}</OverflowControl>
238
+ </ul>
239
+ <input id={id} name={id} type="hidden" data-origin={id} ref={externalRef} required={required} defaultValue={props.value || values || undefined}/>
240
+ <FloatingPortal preserveTabOrder>
241
+ {open ? (<FloatingOverlay lockScroll className="z-floating">
242
+ <FloatingFocusManager modal guards returnFocus={false} context={context} initialFocus={-1} visuallyHiddenDismiss>
243
+ <div {...getFloatingProps({
244
+ ref: refs.setFloating,
245
+ style: {
246
+ ...transitions.styles,
247
+ left: x,
248
+ top: y ?? 0,
249
+ position: strategy,
250
+ },
251
+ })} data-floating="true" className={css("relative shadow-floating overflow-clip isolate z-floating m-0 max-h-96 list-none overscroll-contain rounded-b-lg rounded-t-lg border border-floating-border bg-floating-background p-0 text-foreground ease-in-out", isTopPlacement ? "origin-[bottom_center]" : "origin-[top_center]")}>
252
+ <input autoFocus value={shadow} onChange={onChange} title={props.title} placeholder={translation.multiSelectInnerPlaceholder} className="input placeholder-input-mask group mb-1 h-10 w-full flex-1 rounded-none border-b border-input-border bg-transparent px-input-x py-input-y outline-none transition-colors focus:border-primary" onKeyDown={(event) => {
253
+ if (event.key === "ArrowDown") {
254
+ let next = index + 1;
255
+ if (next > displayList.length - 1)
256
+ next = 0;
257
+ virtuoso.current?.scrollIntoView({ index: next });
258
+ return setIndex(next);
259
+ }
260
+ if (event.key === "ArrowUp") {
261
+ let next = index - 1;
262
+ if (next < 0)
263
+ next = displayList.length - 1;
264
+ virtuoso.current?.scrollIntoView({ index: next });
265
+ return setIndex(next);
266
+ }
267
+ if (event.key === "Escape") {
268
+ event.currentTarget.blur();
269
+ return setClosed();
270
+ }
271
+ if (event.key === "Enter") {
272
+ if (index !== null && displayList[index]) {
273
+ event.preventDefault();
274
+ return onSelect(displayList[index], index);
275
+ }
276
+ if (displayList.length === 1) {
277
+ event.preventDefault();
278
+ return onSelect(displayList[0], 0);
279
+ }
280
+ }
281
+ }}/>
282
+ {isEmpty ? (<li className="w-full border-b border-tooltip-border last:border-transparent">
283
+ <span className="flex w-full justify-between p-2 text-left text-disabled">
284
+ {emptyMessage || translation.autocompleteEmpty}
285
+ </span>
286
+ </li>) : null}
287
+ {isEmpty ? null : (<motion.div initial={false} animate={{ height: isEmpty ? "auto" : h }} className="max-h-72 w-full overscroll-contain" onAnimationComplete={() => {
288
+ if (!open) {
289
+ setH(0);
290
+ return;
291
+ }
292
+ const li = refs.floating.current?.querySelector("li");
293
+ const sum = (li?.getBoundingClientRect().height ?? MIN_SIZE) * displayList.length;
294
+ flushSync(() => setH(Math.min(320, sum + 2)));
295
+ }}>
296
+ <Virtuoso overscan={40} ref={virtuoso} hidden={isEmpty} data={displayList} style={{ height: h }} defaultItemHeight={MIN_SIZE} components={components} totalListHeightChanged={(totalHeight) => setH(Math.min(320, totalHeight))} scrollerRef={(e) => {
297
+ scroller.current = e;
298
+ removeScrollRef.current = e;
299
+ }} className="max-h-72 border-floating-border bg-floating-background p-0 text-foreground" itemContent={(i, option) => {
300
+ const Label = option.Render ?? Frag;
301
+ const active = value.has(option.value) || value.has(option.label ?? "");
302
+ const selected = index === i;
303
+ const children = option.label ?? option.value;
304
+ return (<button data-value={option.value} {...getItemProps({
305
+ ref: (node) => {
306
+ listRef.current[i] = node;
307
+ },
308
+ role: "option",
309
+ type: "button",
310
+ "aria-checked": active,
311
+ "aria-current": active,
312
+ "aria-selected": active,
313
+ "aria-disabled": option.disabled,
314
+ onClick: () => onSelect(option, i),
315
+ })} className={`flex w-full max-w-full cursor-pointer items-center justify-start p-2 text-left hover:bg-floating-hover focus:bg-floating-hover ${active || selected ? "bg-floating-hover text-floating-foreground" : ""}`}>
316
+ <Checkbox onChange={noop} checked={active} aria-checked={active} onClick={(e) => {
317
+ e.stopPropagation();
318
+ onSelect(option, i);
319
+ }}/>
320
+ <Label {...option} label={option.label} value={option.value}>
321
+ {children}
322
+ </Label>
323
+ </button>);
324
+ }}/>
325
+ </motion.div>)}
326
+ <div className="sticky bottom-0 flex w-full flex-nowrap items-center gap-2 overflow-x-auto rounded-b-lg bg-floating-background p-2">
327
+ {value.size === 0 ? (<Tag theme="muted" size="small">
328
+ {translation.autocompleteEmpty}
329
+ </Tag>) : (tags)}
330
+ </div>
331
+ </div>
332
+ </FloatingFocusManager>
333
+ </FloatingOverlay>) : null}
334
+ </FloatingPortal>
335
+ </InputField>);
336
+ });
@@ -1,5 +1,5 @@
1
1
  import { jsxs as o, jsx as d } from "react/jsx-runtime";
2
- import { c as i } from "../../dom-Dl8XH0CK.js";
2
+ import { c as i } from "../../dom-CyQHY7ID.js";
3
3
  const n = ({ children: r, className: e = "", size: l, ...a }) => /* @__PURE__ */ o(
4
4
  "label",
5
5
  {
@@ -0,0 +1,6 @@
1
+ import React from "react";
2
+ import { css } from "../../lib/dom";
3
+ export const Radiobox = ({ children, className = "", size, ...props }) => (<label data-component="radiobox" data-disabled={props.disabled} aria-disabled={props.disabled} className="group flex items-center gap-2 font-normal data-[disabled=true]:cursor-not-allowed">
4
+ <input {...props} type="radio" className={css("app form-radio inline-block h-4 w-4 appearance-none rounded-full border-card-border bg-origin-border text-primary focus:ring-primary disabled:opacity-70 group-aria-disabled:cursor-not-allowed", className)} {...props}/>
5
+ {children}
6
+ </label>);
@@ -1,9 +1,9 @@
1
1
  import { jsx as r, jsxs as a } from "react/jsx-runtime";
2
2
  import { forwardRef as R, useRef as E, useImperativeHandle as j, useEffect as z, createElement as A } from "react";
3
3
  import { e as D } from "../../CaretDown.es-Cj7klWI3.js";
4
- import { u as F } from "../../use-translations-BwLKTrZv.js";
5
- import { i as L, c as $, m as H } from "../../dom-Dl8XH0CK.js";
6
- import { I as S } from "../../input-field-5vYcz5tT.js";
4
+ import { u as F } from "../../use-translations-DSltA7H_.js";
5
+ import { i as L, c as $, m as H } from "../../dom-CyQHY7ID.js";
6
+ import { I as S } from "../../input-field-CDCOODOl.js";
7
7
  const P = R(
8
8
  ({
9
9
  required: o = !0,
@@ -0,0 +1,42 @@
1
+ "use client";
2
+ import { CaretDownIcon } from "@phosphor-icons/react";
3
+ import React, { forwardRef, useEffect, useImperativeHandle, useRef } from "react";
4
+ import { useTranslations } from "../../hooks/use-translations";
5
+ import { css, initializeInputDataset, mergeRefs } from "../../lib/dom";
6
+ import { InputField } from "./input-field";
7
+ export const Select = forwardRef(({ required = true, options, info, selectContainer = "", feedback = null, labelClassName, interactive, rightLabel, hiddenLabel, loading, optionalText, container, hideLeft = false, right, left, error, ...props }, ref) => {
8
+ const translation = useTranslations();
9
+ const inputRef = useRef(null);
10
+ const id = props.id ?? props.name;
11
+ useImperativeHandle(ref, () => inputRef.current);
12
+ useEffect(() => {
13
+ if (inputRef.current === null)
14
+ return;
15
+ const controller = new AbortController();
16
+ const input = inputRef.current;
17
+ const focus = initializeInputDataset(inputRef.current);
18
+ input.addEventListener("change", () => input.setAttribute("data-selected", "true"), {
19
+ once: true,
20
+ signal: controller.signal,
21
+ });
22
+ return () => {
23
+ focus();
24
+ controller.abort();
25
+ };
26
+ }, []);
27
+ const onClickLabel = () => inputRef.current?.focus();
28
+ return (<InputField info={info} left={left} error={error} form={props.form} loading={loading} name={props.name} feedback={feedback} hideLeft={hideLeft} required={required} title={props.title} container={container} componentName="select" rightLabel={rightLabel} hiddenLabel={hiddenLabel} interactive={interactive} id={props.name || props.id} optionalText={optionalText} labelClassName={labelClassName} placeholder={props.placeholder} right={<label htmlFor={id}>
29
+ {right}
30
+ <button onClick={onClickLabel} type="button" className="mt-2 transition-colors hover:text-primary">
31
+ <CaretDownIcon size={20}/>
32
+ <span className="sr-only">{translation.inputCaretDown}</span>
33
+ </button>
34
+ </label>}>
35
+ <select {...props} id={id} name={id} required={required} ref={mergeRefs(ref, inputRef)} data-selected={!!props.value || false} title={typeof props.title === "string" ? props.title : undefined} className={css("input select group h-10 w-full flex-1 appearance-none rounded-md text-base", "bg-transparent px-2 py-1 text-foreground placeholder-input-placeholder", "outline-none transition-colors group-error:text-danger group-error:placeholder-input-mask-error", "data-[selected=false]:text-input-placeholder", props.className)}>
36
+ <option value="" disabled hidden>
37
+ {props.placeholder}
38
+ </option>
39
+ {options.map((option) => (<option {...option} value={option.value} children={option.label ?? option.value} key={`${id}-select-option-${option.value}`}/>))}
40
+ </select>
41
+ </InputField>);
42
+ });