@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,45 @@
1
+ "use client";
2
+ import { Slider as Base } from "@base-ui/react/slider";
3
+ import { Is } from "sidekicker";
4
+ import { css } from "../../lib/dom";
5
+ import { Tooltip } from "../floating/tooltip";
6
+ import { useEffect, useRef, useState } from "react";
7
+ import { uuid } from "../../lib/fns";
8
+ import { useLocale } from "../../hooks/use-locale";
9
+ const Thumb = (props) => {
10
+ const [float, setFloat] = useState(null);
11
+ const ref = useRef(null);
12
+ useEffect(() => {
13
+ const html = ref.current;
14
+ if (html === null)
15
+ return;
16
+ const initialValue = Number(html.getAttribute("aria-valuenow"));
17
+ if (Is.number(initialValue)) {
18
+ setFloat(initialValue);
19
+ }
20
+ const observer = new MutationObserver((changes) => {
21
+ const span = changes[0].target;
22
+ const value = Number(span.getAttribute("aria-valuenow"));
23
+ setFloat(Is.number(value) ? value : null);
24
+ });
25
+ observer.observe(html, { attributeFilter: ["aria-valuenow"] });
26
+ return () => observer.disconnect();
27
+ }, []);
28
+ return (<Tooltip title="" ref={ref} as={Base.Thumb} enabled={props.tooltip} className="focus-within::scale-105 block size-5 cursor-grab rounded-full border-2 border-input-border bg-input-switch shadow-shadow-floating focus-within:border-primary focus-within:outline active:cursor-grabbing">
29
+ {float}
30
+ </Tooltip>);
31
+ };
32
+ export const Slider = (props) => {
33
+ const { tooltip, className, defaultValue, value, ...restProps } = props;
34
+ const id = useRef(uuid());
35
+ const array = defaultValue || value || [];
36
+ const locale = useLocale();
37
+ return (<Base.Root {...restProps} value={value} locale={locale} defaultValue={defaultValue}>
38
+ <Base.Control className={css("relative flex h-5 w-full touch-none select-none items-center", className)}>
39
+ <Base.Track className="relative h-2 grow rounded-full bg-background">
40
+ <Base.Indicator className="absolute h-full rounded-full bg-primary"/>
41
+ </Base.Track>
42
+ {Array.isArray(array) ? array.map((_, i) => <Thumb tooltip={tooltip ?? false} key={`${id.current}-${i}`}/>) : null}
43
+ </Base.Control>
44
+ </Base.Root>);
45
+ };
@@ -1,7 +1,7 @@
1
1
  import { jsxs as o, jsx as a } from "react/jsx-runtime";
2
2
  import { forwardRef as x, useId as w, useState as p, useRef as C, useImperativeHandle as y, useEffect as v } from "react";
3
3
  import { u as N } from "../../use-stable-ref-CYh-YkID.js";
4
- import { c as E } from "../../dom-Dl8XH0CK.js";
4
+ import { c as E } from "../../dom-CyQHY7ID.js";
5
5
  const L = x(({ children: u, loading: s, container: h, error: f, ...e }, m) => {
6
6
  const r = w(), [b, i] = p(e.checked ?? !1), c = b, t = C(null), d = N(e.onChange);
7
7
  y(m, () => t.current), v(() => {
@@ -36,8 +36,8 @@ const L = x(({ children: u, loading: s, container: h, error: f, ...e }, m) => {
36
36
  /* @__PURE__ */ a(
37
37
  "button",
38
38
  {
39
- type: "button",
40
39
  role: "switch",
40
+ type: "button",
41
41
  onClick: k,
42
42
  "aria-checked": c,
43
43
  "data-checked": c,
@@ -1 +1 @@
1
- {"version":3,"file":"switch.js","sources":["../../../src/components/form/switch.tsx"],"sourcesContent":["\"use client\";\nimport React, { forwardRef, useEffect, useId, useImperativeHandle, useRef, useState } from \"react\";\nimport { useStableRef } from \"../../hooks/use-stable-ref\";\nimport { css } from \"../../lib/dom\";\n\nexport type SwitchProps = React.ComponentProps<\"input\"> & {\n error?: string;\n loading?: boolean;\n container?: string;\n onCheck?: (nextValue: boolean) => void;\n};\n\nexport const Switch = forwardRef<HTMLInputElement, SwitchProps>(({ children, loading, container, error, ...props }: SwitchProps, ref) => {\n const id = useId();\n const [innerChecked, setInnerChecked] = useState(props.checked ?? false);\n const checked = innerChecked;\n const innerRef = useRef<HTMLInputElement>(null);\n const stableOnChange = useStableRef(props.onChange);\n useImperativeHandle(ref, () => innerRef.current!);\n\n useEffect(() => {\n if (innerRef.current !== null) {\n if (stableOnChange.current) {\n const onChange = (e: any) => {\n if (stableOnChange.current) stableOnChange.current(e);\n };\n const ref = innerRef.current;\n ref.addEventListener(\"change\", onChange);\n return () => ref?.removeEventListener(\"change\", onChange);\n }\n }\n }, []);\n\n const onCheck = () => {\n const checked = !innerRef.current?.checked;\n setInnerChecked(checked);\n props?.onCheck?.(checked);\n if (innerRef.current !== null) {\n innerRef.current.checked = checked;\n innerRef.current.dispatchEvent(new Event(\"change\", { bubbles: true }));\n }\n };\n\n return (\n <fieldset className={css(\"flex flex-col flex-wrap justify-center\", container)} data-component=\"switch\" disabled={props.disabled || loading}>\n <span className=\"flex flex-row flex-wrap items-center\">\n <input\n {...props}\n hidden\n ref={innerRef}\n type=\"checkbox\"\n checked={checked}\n id={props.id || id}\n data-trigger=\"change\"\n data-checked={checked}\n disabled={props.disabled || loading}\n onChange={(e) => setInnerChecked(e.target.checked)}\n />\n <button\n type=\"button\"\n role=\"switch\"\n onClick={onCheck}\n aria-checked={checked}\n data-checked={checked}\n aria-labelledby={`${id}-label`}\n disabled={props.disabled || loading}\n className=\"relative inline-flex h-6 w-11 flex-shrink-0 cursor-pointer rounded-full border-2 border-transparent transition-colors duration-300 ease-in-out focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2 data-[checked=false]:bg-input-switch-bg data-[checked=true]:bg-primary\"\n >\n <span\n aria-hidden=\"true\"\n data-checked={checked}\n className=\"inline-block aspect-square size-5 transform rounded-full shadow ring-0 transition duration-300 ease-in-out data-[checked=false]:translate-x-0 data-[checked=true]:translate-x-5 data-[checked=false]:bg-disabled data-[checked=true]:bg-input-switch\"\n />\n </button>\n <label htmlFor={props.id || id} className=\"ml-3 inline-block text-sm\" id={`${id}-label`}>\n <span className=\"font-medium text-foreground\">{children}</span>\n </label>\n </span>\n <span className=\"mt-1 flex-1 whitespace-nowrap text-xs text-danger empty:mt-0 empty:hidden\">{error}</span>\n </fieldset>\n );\n});\n"],"names":["Switch","forwardRef","children","loading","container","error","props","ref","id","useId","innerChecked","setInnerChecked","useState","checked","innerRef","useRef","stableOnChange","useStableRef","useImperativeHandle","useEffect","onChange","e","onCheck","jsxs","css","jsx"],"mappings":";;;;AAYO,MAAMA,IAASC,EAA0C,CAAC,EAAE,UAAAC,GAAU,SAAAC,GAAS,WAAAC,GAAW,OAAAC,GAAO,GAAGC,EAAA,GAAsBC,MAAQ;AACrI,QAAMC,IAAKC,EAAA,GACL,CAACC,GAAcC,CAAe,IAAIC,EAASN,EAAM,WAAW,EAAK,GACjEO,IAAUH,GACVI,IAAWC,EAAyB,IAAI,GACxCC,IAAiBC,EAAaX,EAAM,QAAQ;AAClD,EAAAY,EAAoBX,GAAK,MAAMO,EAAS,OAAQ,GAEhDK,EAAU,MAAM;AACZ,QAAIL,EAAS,YAAY,QACjBE,EAAe,SAAS;AACxB,YAAMI,IAAW,CAACC,MAAW;AACzB,QAAIL,EAAe,WAASA,EAAe,QAAQK,CAAC;AAAA,MAAA,GAElDd,IAAMO,EAAS;AACrBP,aAAAA,EAAI,iBAAiB,UAAUa,CAAQ,GAChC,MAAMb,GAAK,oBAAoB,UAAUa,CAAQ;AAAA,IAAA;AAAA,EAEhE,GACD,EAAE;AAEL,QAAME,IAAU,MAAM;AAClB,UAAMT,IAAU,CAACC,EAAS,SAAS;AACnC,IAAAH,EAAgBE,CAAO,GACvBP,GAAO,UAAUO,CAAO,GACpBC,EAAS,YAAY,SACrBA,EAAS,QAAQ,UAAUD,GAC3BC,EAAS,QAAQ,cAAc,IAAI,MAAM,UAAU,EAAE,SAAS,GAAA,CAAM,CAAC;AAAA,EACzE;AAGJ,SACI,gBAAAS,EAAC,YAAA,EAAS,WAAWC,EAAI,0CAA0CpB,CAAS,GAAG,kBAAe,UAAS,UAAUE,EAAM,YAAYH,GAC/H,UAAA;AAAA,IAAA,gBAAAoB,EAAC,QAAA,EAAK,WAAU,wCACZ,UAAA;AAAA,MAAA,gBAAAE;AAAA,QAAC;AAAA,QAAA;AAAA,UACI,GAAGnB;AAAA,UACJ,QAAM;AAAA,UACN,KAAKQ;AAAA,UACL,MAAK;AAAA,UACL,SAAAD;AAAA,UACA,IAAIP,EAAM,MAAME;AAAA,UAChB,gBAAa;AAAA,UACb,gBAAcK;AAAA,UACd,UAAUP,EAAM,YAAYH;AAAA,UAC5B,UAAU,CAACkB,MAAMV,EAAgBU,EAAE,OAAO,OAAO;AAAA,QAAA;AAAA,MAAA;AAAA,MAErD,gBAAAI;AAAA,QAAC;AAAA,QAAA;AAAA,UACG,MAAK;AAAA,UACL,MAAK;AAAA,UACL,SAASH;AAAA,UACT,gBAAcT;AAAA,UACd,gBAAcA;AAAA,UACd,mBAAiB,GAAGL,CAAE;AAAA,UACtB,UAAUF,EAAM,YAAYH;AAAA,UAC5B,WAAU;AAAA,UAEV,UAAA,gBAAAsB;AAAA,YAAC;AAAA,YAAA;AAAA,cACG,eAAY;AAAA,cACZ,gBAAcZ;AAAA,cACd,WAAU;AAAA,YAAA;AAAA,UAAA;AAAA,QACd;AAAA,MAAA;AAAA,wBAEH,SAAA,EAAM,SAASP,EAAM,MAAME,GAAI,WAAU,6BAA4B,IAAI,GAAGA,CAAE,UAC3E,UAAA,gBAAAiB,EAAC,UAAK,WAAU,+BAA+B,UAAAvB,GAAS,EAAA,CAC5D;AAAA,IAAA,GACJ;AAAA,IACA,gBAAAuB,EAAC,QAAA,EAAK,WAAU,6EAA6E,UAAApB,EAAA,CAAM;AAAA,EAAA,GACvG;AAER,CAAC;"}
1
+ {"version":3,"file":"switch.js","sources":["../../../src/components/form/switch.tsx"],"sourcesContent":["\"use client\";\nimport React, { forwardRef, useEffect, useId, useImperativeHandle, useRef, useState } from \"react\";\nimport { useStableRef } from \"../../hooks/use-stable-ref\";\nimport { css } from \"../../lib/dom\";\n\nexport type SwitchProps = React.ComponentProps<\"input\"> & {\n error?: string;\n loading?: boolean;\n container?: string;\n onCheck?: (nextValue: boolean) => void;\n};\n\nexport const Switch = forwardRef<HTMLInputElement, SwitchProps>(({ children, loading, container, error, ...props }: SwitchProps, ref) => {\n const id = useId();\n const [innerChecked, setInnerChecked] = useState(props.checked ?? false);\n const checked = innerChecked;\n const innerRef = useRef<HTMLInputElement>(null);\n const stableOnChange = useStableRef(props.onChange);\n useImperativeHandle(ref, () => innerRef.current!);\n\n useEffect(() => {\n if (innerRef.current !== null) {\n if (stableOnChange.current) {\n const onChange = (e: Event) => {\n if (stableOnChange.current) stableOnChange.current(e as unknown as React.ChangeEvent<HTMLInputElement>);\n };\n const ref = innerRef.current;\n ref.addEventListener(\"change\", onChange);\n return () => ref?.removeEventListener(\"change\", onChange);\n }\n }\n }, []);\n\n const onCheck = () => {\n const checked = !innerRef.current?.checked;\n setInnerChecked(checked);\n props?.onCheck?.(checked);\n if (innerRef.current !== null) {\n innerRef.current.checked = checked;\n innerRef.current.dispatchEvent(new Event(\"change\", { bubbles: true }));\n }\n };\n\n return (\n <fieldset className={css(\"flex flex-col flex-wrap justify-center\", container)} data-component=\"switch\" disabled={props.disabled || loading}>\n <span className=\"flex flex-row flex-wrap items-center\">\n <input\n {...props}\n hidden\n ref={innerRef}\n type=\"checkbox\"\n checked={checked}\n id={props.id || id}\n data-trigger=\"change\"\n data-checked={checked}\n disabled={props.disabled || loading}\n onChange={(e) => setInnerChecked(e.target.checked)}\n />\n <button\n role=\"switch\"\n type=\"button\"\n onClick={onCheck}\n aria-checked={checked}\n data-checked={checked}\n aria-labelledby={`${id}-label`}\n disabled={props.disabled || loading}\n className=\"relative inline-flex h-6 w-11 flex-shrink-0 cursor-pointer rounded-full border-2 border-transparent transition-colors duration-300 ease-in-out focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2 data-[checked=false]:bg-input-switch-bg data-[checked=true]:bg-primary\"\n >\n <span\n aria-hidden=\"true\"\n data-checked={checked}\n className=\"inline-block aspect-square size-5 transform rounded-full shadow ring-0 transition duration-300 ease-in-out data-[checked=false]:translate-x-0 data-[checked=true]:translate-x-5 data-[checked=false]:bg-disabled data-[checked=true]:bg-input-switch\"\n />\n </button>\n <label htmlFor={props.id || id} className=\"ml-3 inline-block text-sm\" id={`${id}-label`}>\n <span className=\"font-medium text-foreground\">{children}</span>\n </label>\n </span>\n <span className=\"mt-1 flex-1 whitespace-nowrap text-xs text-danger empty:mt-0 empty:hidden\">{error}</span>\n </fieldset>\n );\n});\n"],"names":["Switch","forwardRef","children","loading","container","error","props","ref","id","useId","innerChecked","setInnerChecked","useState","checked","innerRef","useRef","stableOnChange","useStableRef","useImperativeHandle","useEffect","onChange","e","onCheck","jsxs","css","jsx"],"mappings":";;;;AAYO,MAAMA,IAASC,EAA0C,CAAC,EAAE,UAAAC,GAAU,SAAAC,GAAS,WAAAC,GAAW,OAAAC,GAAO,GAAGC,EAAA,GAAsBC,MAAQ;AACrI,QAAMC,IAAKC,EAAA,GACL,CAACC,GAAcC,CAAe,IAAIC,EAASN,EAAM,WAAW,EAAK,GACjEO,IAAUH,GACVI,IAAWC,EAAyB,IAAI,GACxCC,IAAiBC,EAAaX,EAAM,QAAQ;AAClD,EAAAY,EAAoBX,GAAK,MAAMO,EAAS,OAAQ,GAEhDK,EAAU,MAAM;AACZ,QAAIL,EAAS,YAAY,QACjBE,EAAe,SAAS;AACxB,YAAMI,IAAW,CAACC,MAAa;AAC3B,QAAIL,EAAe,WAASA,EAAe,QAAQK,CAAmD;AAAA,MAAA,GAEpGd,IAAMO,EAAS;AACrBP,aAAAA,EAAI,iBAAiB,UAAUa,CAAQ,GAChC,MAAMb,GAAK,oBAAoB,UAAUa,CAAQ;AAAA,IAAA;AAAA,EAEhE,GACD,EAAE;AAEL,QAAME,IAAU,MAAM;AAClB,UAAMT,IAAU,CAACC,EAAS,SAAS;AACnC,IAAAH,EAAgBE,CAAO,GACvBP,GAAO,UAAUO,CAAO,GACpBC,EAAS,YAAY,SACrBA,EAAS,QAAQ,UAAUD,GAC3BC,EAAS,QAAQ,cAAc,IAAI,MAAM,UAAU,EAAE,SAAS,GAAA,CAAM,CAAC;AAAA,EACzE;AAGJ,SACI,gBAAAS,EAAC,YAAA,EAAS,WAAWC,EAAI,0CAA0CpB,CAAS,GAAG,kBAAe,UAAS,UAAUE,EAAM,YAAYH,GAC/H,UAAA;AAAA,IAAA,gBAAAoB,EAAC,QAAA,EAAK,WAAU,wCACZ,UAAA;AAAA,MAAA,gBAAAE;AAAA,QAAC;AAAA,QAAA;AAAA,UACI,GAAGnB;AAAA,UACJ,QAAM;AAAA,UACN,KAAKQ;AAAA,UACL,MAAK;AAAA,UACL,SAAAD;AAAA,UACA,IAAIP,EAAM,MAAME;AAAA,UAChB,gBAAa;AAAA,UACb,gBAAcK;AAAA,UACd,UAAUP,EAAM,YAAYH;AAAA,UAC5B,UAAU,CAACkB,MAAMV,EAAgBU,EAAE,OAAO,OAAO;AAAA,QAAA;AAAA,MAAA;AAAA,MAErD,gBAAAI;AAAA,QAAC;AAAA,QAAA;AAAA,UACG,MAAK;AAAA,UACL,MAAK;AAAA,UACL,SAASH;AAAA,UACT,gBAAcT;AAAA,UACd,gBAAcA;AAAA,UACd,mBAAiB,GAAGL,CAAE;AAAA,UACtB,UAAUF,EAAM,YAAYH;AAAA,UAC5B,WAAU;AAAA,UAEV,UAAA,gBAAAsB;AAAA,YAAC;AAAA,YAAA;AAAA,cACG,eAAY;AAAA,cACZ,gBAAcZ;AAAA,cACd,WAAU;AAAA,YAAA;AAAA,UAAA;AAAA,QACd;AAAA,MAAA;AAAA,wBAEH,SAAA,EAAM,SAASP,EAAM,MAAME,GAAI,WAAU,6BAA4B,IAAI,GAAGA,CAAE,UAC3E,UAAA,gBAAAiB,EAAC,UAAK,WAAU,+BAA+B,UAAAvB,GAAS,EAAA,CAC5D;AAAA,IAAA,GACJ;AAAA,IACA,gBAAAuB,EAAC,QAAA,EAAK,WAAU,6EAA6E,UAAApB,EAAA,CAAM;AAAA,EAAA,GACvG;AAER,CAAC;"}
@@ -0,0 +1,46 @@
1
+ "use client";
2
+ import React, { forwardRef, useEffect, useId, useImperativeHandle, useRef, useState } from "react";
3
+ import { useStableRef } from "../../hooks/use-stable-ref";
4
+ import { css } from "../../lib/dom";
5
+ export const Switch = forwardRef(({ children, loading, container, error, ...props }, ref) => {
6
+ const id = useId();
7
+ const [innerChecked, setInnerChecked] = useState(props.checked ?? false);
8
+ const checked = innerChecked;
9
+ const innerRef = useRef(null);
10
+ const stableOnChange = useStableRef(props.onChange);
11
+ useImperativeHandle(ref, () => innerRef.current);
12
+ useEffect(() => {
13
+ if (innerRef.current !== null) {
14
+ if (stableOnChange.current) {
15
+ const onChange = (e) => {
16
+ if (stableOnChange.current)
17
+ stableOnChange.current(e);
18
+ };
19
+ const ref = innerRef.current;
20
+ ref.addEventListener("change", onChange);
21
+ return () => ref?.removeEventListener("change", onChange);
22
+ }
23
+ }
24
+ }, []);
25
+ const onCheck = () => {
26
+ const checked = !innerRef.current?.checked;
27
+ setInnerChecked(checked);
28
+ props?.onCheck?.(checked);
29
+ if (innerRef.current !== null) {
30
+ innerRef.current.checked = checked;
31
+ innerRef.current.dispatchEvent(new Event("change", { bubbles: true }));
32
+ }
33
+ };
34
+ return (<fieldset className={css("flex flex-col flex-wrap justify-center", container)} data-component="switch" disabled={props.disabled || loading}>
35
+ <span className="flex flex-row flex-wrap items-center">
36
+ <input {...props} hidden ref={innerRef} type="checkbox" checked={checked} id={props.id || id} data-trigger="change" data-checked={checked} disabled={props.disabled || loading} onChange={(e) => setInnerChecked(e.target.checked)}/>
37
+ <button role="switch" type="button" onClick={onCheck} aria-checked={checked} data-checked={checked} aria-labelledby={`${id}-label`} disabled={props.disabled || loading} className="relative inline-flex h-6 w-11 flex-shrink-0 cursor-pointer rounded-full border-2 border-transparent transition-colors duration-300 ease-in-out focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2 data-[checked=false]:bg-input-switch-bg data-[checked=true]:bg-primary">
38
+ <span aria-hidden="true" data-checked={checked} className="inline-block aspect-square size-5 transform rounded-full shadow ring-0 transition duration-300 ease-in-out data-[checked=false]:translate-x-0 data-[checked=true]:translate-x-5 data-[checked=false]:bg-disabled data-[checked=true]:bg-input-switch"/>
39
+ </button>
40
+ <label htmlFor={props.id || id} className="ml-3 inline-block text-sm" id={`${id}-label`}>
41
+ <span className="font-medium text-foreground">{children}</span>
42
+ </label>
43
+ </span>
44
+ <span className="mt-1 flex-1 whitespace-nowrap text-xs text-danger empty:mt-0 empty:hidden">{error}</span>
45
+ </fieldset>);
46
+ });
@@ -0,0 +1,26 @@
1
+ "use client";
2
+ import { stagger, useAnimate } from "motion/react";
3
+ import { useEffect } from "react";
4
+ export const TaskList = (props) => {
5
+ const [ref, animate] = useAnimate();
6
+ useEffect(() => {
7
+ const container = ref.current;
8
+ if (!container)
9
+ return;
10
+ const handler = (e) => {
11
+ const input = e.target;
12
+ const items = Array.from(container.querySelectorAll("input[data-task=true]"));
13
+ const allTaskChecked = items.every((el) => el.checked);
14
+ const index = items.indexOf(input);
15
+ if (allTaskChecked && index !== -1) {
16
+ animate("input", { scale: [1, 1.35, 1], rotate: [0, 20, -20, 0] }, {
17
+ duration: 0.5,
18
+ delay: stagger(0.075, { from: index }),
19
+ });
20
+ }
21
+ };
22
+ container.addEventListener("change", handler);
23
+ return () => container.removeEventListener("change", handler);
24
+ }, []);
25
+ return <fieldset {...props} data-component="task-list" ref={ref}/>;
26
+ };
@@ -0,0 +1,12 @@
1
+ "use client";
2
+ import { createFreeText } from "./free-text";
3
+ export const Textarea = createFreeText("textarea", "textarea", { container: "w-full" }, (textarea) => {
4
+ const adjustHeight = () => {
5
+ const lineBreakers = textarea.value.split("\n");
6
+ textarea.style.height = "auto";
7
+ if (lineBreakers.length > 1)
8
+ return void (textarea.style.height = `${textarea.scrollHeight}px`);
9
+ };
10
+ textarea.addEventListener("input", adjustHeight);
11
+ return () => textarea.removeEventListener("input", adjustHeight);
12
+ });
@@ -35,7 +35,6 @@ export * from "./form/input-field";
35
35
  export * from "./floating/dropdown";
36
36
  export * from "./form/autocomplete";
37
37
  export * from "./form/multi-select";
38
- export * from "./form/transfer-list";
39
38
  export * from "./core/render-on-view";
40
39
  export * from "./display/notifications";
41
40
  export * from "./floating/command-palette";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,4BAA4B,CAAC;AAC3C,OAAO,EAAE,cAAc,IAAI,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACzE,cAAc,iBAAiB,CAAC;AAChC,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,KAAK,OAAO,EAAE,mBAAmB,EAAE,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,4BAA4B,CAAC;AAC3C,OAAO,EAAE,cAAc,IAAI,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACzE,cAAc,iBAAiB,CAAC;AAChC,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,KAAK,OAAO,EAAE,mBAAmB,EAAE,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,44 @@
1
+ export * from "./core/tag";
2
+ export * from "./form/form";
3
+ export * from "./form/input";
4
+ export * from "./core/button";
5
+ export * from "./form/select";
6
+ export * from "./form/slider";
7
+ export * from "./form/switch";
8
+ export * from "./table/index";
9
+ export * from "./display/card";
10
+ export * from "./display/list";
11
+ export * from "./display/step";
12
+ export * from "./display/tabs";
13
+ export * from "./display/alert";
14
+ export * from "./display/empty";
15
+ export * from "./display/stats";
16
+ export * from "./floating/menu";
17
+ export * from "./form/checkbox";
18
+ export * from "./form/radiobox";
19
+ export * from "./form/textarea";
20
+ export * from "./core/polymorph";
21
+ export * from "./floating/modal";
22
+ export * from "./form/task-list";
23
+ export * from "./core/typography";
24
+ export * from "./display/spinner";
25
+ export * from "./floating/expand";
26
+ export * from "./floating/wizard";
27
+ export * from "./display/calendar";
28
+ export * from "./display/progress";
29
+ export * from "./display/timeline";
30
+ export * from "./floating/toolbar";
31
+ export * from "./floating/tooltip";
32
+ export * from "./form/date-picker";
33
+ export * from "./form/file-upload";
34
+ export * from "./form/input-field";
35
+ export * from "./floating/dropdown";
36
+ export * from "./form/autocomplete";
37
+ export * from "./form/multi-select";
38
+ export * from "./core/render-on-view";
39
+ export * from "./display/notifications";
40
+ export * from "./floating/command-palette";
41
+ export { CommandPalette as Commander } from "./floating/command-palette";
42
+ export * from "./page-calendar";
43
+ export { formReset } from "./form/formReset";
44
+ export { createColumns, createOptionCols, useTablePreferences } from "./table/table-lib";
@@ -0,0 +1,83 @@
1
+ import { Button } from "../core/button";
2
+ import { Tag } from "../core/tag";
3
+ import { useLocale } from "../../hooks/use-locale";
4
+ import { useTranslations } from "../../hooks/use-translations";
5
+ import { CaretLeftIcon, CaretRightIcon, PlusCircleIcon, CalendarIcon } from "@phosphor-icons/react";
6
+ import { addDays, addMonths, addWeeks, isToday, subDays, subMonths, subWeeks } from "date-fns";
7
+ import { formatDay, formatMonthShort, formatMonthYear, getWeekNumber } from "./page-calendar.utils";
8
+ import { useMemo } from "react";
9
+ export function CalendarHeader({ currentDate, currentView, filters, filterArea, setCurrentDate, setCurrentView, onToggleFilter, onAddEvent, }) {
10
+ const locale = useLocale();
11
+ const t = useTranslations();
12
+ const isDateToday = isToday(currentDate);
13
+ const VIEWS = useMemo(() => [
14
+ { value: "month", label: t.pageCalendarMonthView },
15
+ { value: "week", label: t.pageCalendarWeekView },
16
+ { value: "day", label: t.pageCalendarDayView },
17
+ ], [t]);
18
+ const handlePrev = () => {
19
+ setCurrentDate((currentDate) => {
20
+ if (currentView === "month")
21
+ return subMonths(currentDate, 1);
22
+ if (currentView === "week")
23
+ return subWeeks(currentDate, 1);
24
+ return subDays(currentDate, 1);
25
+ });
26
+ };
27
+ const handleNext = () => {
28
+ setCurrentDate((currentDate) => {
29
+ if (currentView === "month")
30
+ return addMonths(currentDate, 1);
31
+ if (currentView === "week")
32
+ return addWeeks(currentDate, 1);
33
+ return addDays(currentDate, 1);
34
+ });
35
+ };
36
+ const weekNum = getWeekNumber(currentDate);
37
+ return (<header className="flex flex-col gap-4">
38
+ <div className="flex items-center justify-between gap-4">
39
+ <div className="flex items-center gap-3">
40
+ <div aria-hidden="true" className={`flex size-12 flex-col items-center justify-center overflow-hidden rounded-lg text-xs ${isDateToday ? "bg-primary text-primary-foreground" : "bg-card text-foreground"}`}>
41
+ <span className="font-light uppercase leading-none">{formatMonthShort(currentDate, locale)}</span>
42
+ <span className="text-xl font-medium leading-none">{formatDay(currentDate, locale)}</span>
43
+ </div>
44
+ <div>
45
+ <h1 aria-live="polite" aria-atomic="true" className="text-xl font-bold leading-tight">
46
+ {formatMonthYear(currentDate, locale)}
47
+ </h1>
48
+ <span className="text-xs text-muted-foreground">{t.pageCalendarWeekLabel(weekNum)}</span>
49
+ </div>
50
+ </div>
51
+ <nav aria-label={t.pageCalendarNavigation} className="flex items-center gap-2">
52
+ <div className="flex items-center gap-1">
53
+ <Button size="small" title={t.pageCalendarPrevious} aria-label={t.pageCalendarPrevious} theme="ghost-muted" onClick={handlePrev}>
54
+ <CaretLeftIcon size={16}/>
55
+ </Button>
56
+ <button type="button" aria-label={t.pageCalendarToday} onClick={() => setCurrentDate(new Date())} className="rounded-md px-3 py-1.5 text-sm transition-colors hover:bg-muted/50">
57
+ {t.pageCalendarToday}
58
+ </button>
59
+ <Button size="small" title={t.pageCalendarNext} aria-label={t.pageCalendarNext} theme="ghost-muted" onClick={handleNext}>
60
+ <CaretRightIcon size={16}/>
61
+ </Button>
62
+ </div>
63
+ <div className="flex rounded-md">
64
+ {VIEWS.map((v) => (<Button size="small" key={v.value} onClick={() => setCurrentView(v.value)} theme={currentView === v.value ? "primary" : "muted"} aria-pressed={currentView === v.value} className="rounded-none first:rounded-l-button last:rounded-r-button">
65
+ {v.label}
66
+ </Button>))}
67
+ </div>
68
+ {onAddEvent && (<Button theme="primary" size="small" onClick={onAddEvent}>
69
+ <PlusCircleIcon size={14}/>
70
+ {t.pageCalendarAddEvent}
71
+ </Button>)}
72
+ </nav>
73
+ </div>
74
+ {filterArea ??
75
+ (filters.length > 0 && (<div role="group" aria-label={t.pageCalendarFilter} className="flex flex-wrap items-center gap-1.5">
76
+ <CalendarIcon size={14} className="text-muted-foreground" aria-hidden="true"/>
77
+ <span className="mr-1 text-xs text-muted-foreground">{t.pageCalendarFilter}</span>
78
+ {filters.map((filter) => (<Tag as="button" size="small" type="button" key={filter.id} theme={filter.theme} indicator={filter.enabled ? filter.theme : undefined} aria-pressed={filter.enabled} aria-label={`${filter.label}, ${filter.enabled ? t.pageCalendarFilterEnabled : t.pageCalendarFilterDisabled}`} onClick={() => onToggleFilter(filter.id)}>
79
+ {filter.label}
80
+ </Tag>))}
81
+ </div>))}
82
+ </header>);
83
+ }
@@ -0,0 +1,94 @@
1
+ import { isToday } from "date-fns";
2
+ import { useEffect, useRef, useState } from "react";
3
+ import { Tag } from "../core/tag";
4
+ import { useLocale } from "../../hooks/use-locale";
5
+ import { EventPill } from "./event-pill";
6
+ import { Calendar } from "../display/calendar";
7
+ import { getHourSlots, toDateKey, formatDay, formatWeekdayLong, formatMonthYear, formatHourLabel, formatFullDate, formatTime, computeEventColumns, } from "./page-calendar.utils";
8
+ const HOUR_HEIGHT = 48;
9
+ function getTopOffset(event) {
10
+ const hour = event.date.getHours();
11
+ const minutes = event.date.getMinutes();
12
+ return hour * HOUR_HEIGHT + (minutes / 60) * HOUR_HEIGHT;
13
+ }
14
+ export function DayView({ currentDate, onSlotClick, renderEvent, eventsByDate, onDateChange, onEventClick, }) {
15
+ const locale = useLocale();
16
+ const currentHourRef = useRef(null);
17
+ const scrollBodyRef = useRef(null);
18
+ const hours = getHourSlots();
19
+ const [selectedEvent, setSelectedEvent] = useState(null);
20
+ useEffect(() => {
21
+ if (scrollBodyRef.current && currentHourRef.current) {
22
+ const top = currentHourRef.current.offsetTop;
23
+ scrollBodyRef.current.scrollTop = top - scrollBodyRef.current.clientHeight / 2;
24
+ }
25
+ }, []);
26
+ const dayKey = toDateKey(currentDate);
27
+ const events = eventsByDate.get(dayKey) || [];
28
+ const RenderOnDay = ({ date }) => {
29
+ const key = toDateKey(date);
30
+ const hasEvents = (eventsByDate.get(key) || []).length > 0;
31
+ const isSelected = toDateKey(date) === toDateKey(currentDate);
32
+ if (!hasEvents || isSelected)
33
+ return null;
34
+ return <span className="absolute bottom-0.5 left-1/2 h-1 w-1 -translate-x-1/2 rounded-full bg-primary"/>;
35
+ };
36
+ const handleEventClick = (event) => {
37
+ setSelectedEvent(event);
38
+ onEventClick(event);
39
+ };
40
+ return (<div className="flex min-w-full flex-1">
41
+ <div className="flex w-full flex-1 flex-col">
42
+ <div aria-label={formatFullDate(currentDate, locale)} className="flex flex-shrink-0 items-center gap-3 border-b border-border px-4 py-2">
43
+ <span className={`inline-flex h-8 w-8 items-center justify-center rounded-full font-bold ${isToday(currentDate) ? "bg-primary text-primary-foreground" : "text-foreground"}`}>
44
+ {formatDay(currentDate, locale)}
45
+ </span>
46
+ <div>
47
+ <div className="font-semibold">{formatWeekdayLong(currentDate, locale)}</div>
48
+ <div className="text-xs text-muted-foreground">{formatMonthYear(currentDate, locale)}</div>
49
+ </div>
50
+ </div>
51
+ <div ref={scrollBodyRef} className="flex flex-1 items-start overflow-y-auto">
52
+ <div className="w-[60px] flex-shrink-0">
53
+ {hours.map((hour) => (<div key={hour} className="relative" style={{ height: HOUR_HEIGHT }}>
54
+ <span className="absolute -top-2.5 right-2 text-[10px] text-muted-foreground">
55
+ {hour === 0 ? "" : formatHourLabel(hour, locale)}
56
+ </span>
57
+ {hour === new Date().getHours() && <div ref={currentHourRef}/>}
58
+ </div>))}
59
+ </div>
60
+ <div className="relative flex-1 border-l border-card-border">
61
+ {hours.map((hour) => {
62
+ const slotDate = new Date(currentDate);
63
+ slotDate.setHours(hour, 0, 0, 0);
64
+ return (<div key={hour} role="button" tabIndex={0} aria-label={formatHourLabel(hour, locale)} className="cursor-pointer border-b border-border/50 hover:bg-muted/20" style={{ height: HOUR_HEIGHT }} onClick={() => onSlotClick?.(slotDate)} onKeyDown={(e) => {
65
+ if (e.key === "Enter" || e.key === " ") {
66
+ e.preventDefault();
67
+ onSlotClick?.(slotDate);
68
+ }
69
+ }}/>);
70
+ })}
71
+ {computeEventColumns(events).map(({ event, columnIndex, columnCount }) => (<div key={event.id} className="absolute" style={{
72
+ top: getTopOffset(event),
73
+ height: HOUR_HEIGHT,
74
+ left: `calc(${(columnIndex / columnCount) * 100}% + 2px)`,
75
+ width: `calc(${100 / columnCount}% - 4px)`,
76
+ }} onClick={(e) => e.stopPropagation()}>
77
+ <EventPill event={event} onClick={() => handleEventClick(event)}/>
78
+ </div>))}
79
+ </div>
80
+ </div>
81
+ </div>
82
+ <div className="flex flex-col overflow-y-auto border-l border-card-border px-4">
83
+ <Calendar date={currentDate} markToday changeOnlyOnClick RenderOnDay={RenderOnDay} onChange={(d) => d && onDateChange(d)}/>
84
+ {selectedEvent && (<div className="flex flex-col gap-2 border-t p-3">
85
+ {renderEvent ? (renderEvent(selectedEvent)) : (<>
86
+ <div className="truncate text-sm font-semibold">{selectedEvent.title}</div>
87
+ <div className="text-xs text-muted-foreground">{formatFullDate(selectedEvent.date, locale)}</div>
88
+ <div className="text-xs text-muted-foreground">{formatTime(selectedEvent.date, locale)}</div>
89
+ <Tag theme={selectedEvent.className ? "custom" : "primary"} size="small" className={`self-start${selectedEvent.className ? ` ${selectedEvent.className}` : ""}`}/>
90
+ </>)}
91
+ </div>)}
92
+ </div>
93
+ </div>);
94
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"event-pill.d.ts","sourceRoot":"","sources":["../../../src/components/page-calendar/event-pill.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAI3D,KAAK,cAAc,GAAG;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,KAAK,EAAE,aAAa,CAAC;CACxB,CAAC;AAEF,wBAAgB,SAAS,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAe,EAAE,EAAE,cAAc,+BAyB5E"}
1
+ {"version":3,"file":"event-pill.d.ts","sourceRoot":"","sources":["../../../src/components/page-calendar/event-pill.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAI3D,KAAK,cAAc,GAAG;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,KAAK,EAAE,aAAa,CAAC;CACxB,CAAC;AAEF,wBAAgB,SAAS,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAe,EAAE,EAAE,cAAc,+BAuC5E"}
@@ -0,0 +1,25 @@
1
+ import { Button } from "../core/button";
2
+ import { css } from "../../lib/dom";
3
+ import { useTranslations } from "../../hooks/use-translations";
4
+ import { formatEventTime } from "./page-calendar.utils";
5
+ export function EventPill({ event, onClick, compact = false }) {
6
+ const t = useTranslations();
7
+ const props = {
8
+ style: {
9
+ border: "0",
10
+ padding: "0 0.5rem",
11
+ height: "1.25rem",
12
+ borderRadius: "0.25rem",
13
+ },
14
+ className: css("w-full border-0 justify-start rounded text-xs truncate text-ellipsis overflow-hidden border leading-tight", event.className),
15
+ };
16
+ if (compact) {
17
+ return (<Button {...props} size="small" onClick={onClick} title={event.title} aria-label={t.pageCalendarEventAt(event.title, formatEventTime(event.date))} theme={event.className ? "raw" : "primary"}>
18
+ {event.title}
19
+ </Button>);
20
+ }
21
+ return (<Button {...props} size="small" onClick={onClick} title={event.title} aria-label={t.pageCalendarEventAt(event.title, formatEventTime(event.date))} theme={event.className ? "raw" : "primary"}>
22
+ <div className="truncate font-medium">{event.title}</div>
23
+ <div className="text-xs opacity-60">{formatEventTime(event.date)}</div>
24
+ </Button>);
25
+ }
@@ -0,0 +1,2 @@
1
+ export { PageCalendar } from "./page-calendar";
2
+ export { toDateKey, groupEventsByDate, getMonthDays, getWeekDays, getHourSlots, formatEventTime, formatDay, formatWeekdayLong, formatWeekdayShort, formatMonthYear, formatMonthShort, formatHourLabel, formatFullDate, formatTime, getWeekNumber, } from "./page-calendar.utils";
@@ -0,0 +1,46 @@
1
+ import { isSameMonth, isToday } from "date-fns";
2
+ import { useLocale } from "../../hooks/use-locale";
3
+ import { useTranslations } from "../../hooks/use-translations";
4
+ import { EventPill } from "./event-pill";
5
+ import { toDateKey, formatDay, getWeekDays, formatWeekDay, formatFullDate } from "./page-calendar.utils";
6
+ import { useMemo } from "react";
7
+ export function MonthView({ days, eventsByDate, currentDate, onEventClick, onDayClick }) {
8
+ const locale = useLocale();
9
+ const t = useTranslations();
10
+ const WEEKDAY_LABELS = useMemo(() => getWeekDays(new Date()), []);
11
+ return (<div className="flex h-full flex-1 flex-col">
12
+ <ul role="row" aria-hidden="true" className="grid grid-cols-7 border-b border-border">
13
+ {WEEKDAY_LABELS.map((date) => {
14
+ const day = formatWeekDay(date, locale);
15
+ return (<li key={day} className="py-2 text-center text-xs font-medium text-muted-foreground">
16
+ {day}
17
+ </li>);
18
+ })}
19
+ </ul>
20
+ <div role="grid" aria-label={t.pageCalendarMonthGrid} className="grid flex-1 auto-rows-fr grid-cols-7">
21
+ {days.map((day, idx) => {
22
+ const key = toDateKey(day);
23
+ const events = eventsByDate.get(key) || [];
24
+ const isCurrentMonth = isSameMonth(day, currentDate);
25
+ const isCurrentDay = isToday(day);
26
+ return (<button key={idx} type="button" onClick={() => onDayClick(day)} aria-label={`${formatFullDate(day, locale)}${events.length > 0 ? `, ${t.pageCalendarEventCount(events.length)}` : ""}`} className={`group flex min-h-32 cursor-pointer flex-col gap-1 border-b border-r border-border p-2 transition-colors hover:bg-muted hover:bg-opacity-20 ${!isCurrentMonth ? "opacity-50" : ""}`}>
27
+ <div className="flex items-center justify-between">
28
+ <span className={`flex h-6 w-6 items-center justify-center rounded-full text-xs font-medium ${isCurrentDay ? "bg-primary text-primary-foreground" : "text-foreground"}`}>
29
+ {formatDay(day, locale)}
30
+ </span>
31
+ <span aria-hidden="true" className="text-lg leading-none text-muted-foreground opacity-0 transition-opacity group-hover:opacity-40">
32
+ +
33
+ </span>
34
+ </div>
35
+ <div className="min-h-0 flex-1 overflow-y-auto">
36
+ <div className="flex flex-col gap-0.5">
37
+ {events.map((event) => (<div key={event.id} onClick={(e) => e.stopPropagation()}>
38
+ <EventPill compact event={event} onClick={() => onEventClick(event)}/>
39
+ </div>))}
40
+ </div>
41
+ </div>
42
+ </button>);
43
+ })}
44
+ </div>
45
+ </div>);
46
+ }
@@ -0,0 +1,41 @@
1
+ import { useMemo, useState } from "react";
2
+ import { useTranslations } from "../../hooks/use-translations";
3
+ import { groupEventsByDate, getMonthDays, getWeekDays } from "./page-calendar.utils";
4
+ import { CalendarHeader } from "./calendar-header";
5
+ import { MonthView } from "./month-view";
6
+ import { WeekView } from "./week-view";
7
+ import { DayView } from "./day-view";
8
+ const noop = [];
9
+ export function PageCalendar({ events, filterArea, onAddEvent, defaultDate, onSlotClick, getFilterId, renderEvent, onEventClick, filters = noop, defaultView = "month", onChangeFilters: onActiveFiltersChange, }) {
10
+ const t = useTranslations();
11
+ const [currentView, setCurrentView] = useState(defaultView);
12
+ const [currentDate, setCurrentDate] = useState(() => defaultDate ?? new Date());
13
+ const [internalFilters, setInternalFilters] = useState(filters);
14
+ const toggleFilter = (id) => {
15
+ setInternalFilters((prev) => {
16
+ const next = prev.map((f) => (f.id === id ? { ...f, enabled: !f.enabled } : f));
17
+ onActiveFiltersChange?.(next);
18
+ return next;
19
+ });
20
+ };
21
+ const filteredEvents = useMemo(() => {
22
+ if (filters.length === 0)
23
+ return events;
24
+ const get = getFilterId ?? ((e) => e?.filterId);
25
+ return events.filter((e) => internalFilters.find((f) => f.id === get(e))?.enabled ?? true);
26
+ }, [events, internalFilters, filters]);
27
+ const eventsByDate = useMemo(() => groupEventsByDate(filteredEvents), [filteredEvents]);
28
+ const monthDays = useMemo(() => getMonthDays(currentDate), [currentDate]);
29
+ const weekDays = useMemo(() => getWeekDays(currentDate), [currentDate]);
30
+ const handleEventClick = (event) => onEventClick?.(event);
31
+ const handleDayClick = (date) => {
32
+ setCurrentDate(date);
33
+ setCurrentView("day");
34
+ };
35
+ return (<div role="application" aria-label={t.pageCalendarLabel} className="flex h-full w-full flex-grow flex-col gap-4">
36
+ <CalendarHeader filters={internalFilters} filterArea={filterArea} onAddEvent={onAddEvent} currentDate={currentDate} currentView={currentView} setCurrentDate={setCurrentDate} setCurrentView={setCurrentView} onToggleFilter={toggleFilter}/>
37
+ {currentView === "month" && (<MonthView days={monthDays} currentDate={currentDate} eventsByDate={eventsByDate} onDayClick={handleDayClick} onEventClick={handleEventClick}/>)}
38
+ {currentView === "week" && (<WeekView days={weekDays} currentDate={currentDate} onSlotClick={onSlotClick} eventsByDate={eventsByDate} onEventClick={handleEventClick}/>)}
39
+ {currentView === "day" && (<DayView currentDate={currentDate} onSlotClick={onSlotClick} renderEvent={renderEvent} eventsByDate={eventsByDate} onDateChange={setCurrentDate} onEventClick={handleEventClick}/>)}
40
+ </div>);
41
+ }