@g4rcez/components 4.1.1 → 4.1.3

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 (310) hide show
  1. package/dist/components/core/button.d.ts +77 -0
  2. package/dist/components/core/button.d.ts.map +1 -0
  3. package/dist/components/core/button.jsx +79 -0
  4. package/dist/components/core/heading.d.ts +3 -0
  5. package/dist/components/core/heading.d.ts.map +1 -0
  6. package/dist/components/core/heading.jsx +4 -0
  7. package/dist/components/core/polymorph.d.ts +10 -0
  8. package/dist/components/core/polymorph.d.ts.map +1 -0
  9. package/dist/components/core/polymorph.jsx +5 -0
  10. package/dist/components/core/render-on-view.d.ts +7 -0
  11. package/dist/components/core/render-on-view.d.ts.map +1 -0
  12. package/dist/components/core/render-on-view.jsx +31 -0
  13. package/dist/components/core/resizable.d.ts +3 -0
  14. package/dist/components/core/resizable.d.ts.map +1 -0
  15. package/dist/components/core/resizable.jsx +51 -0
  16. package/dist/components/core/slot.d.ts +16 -0
  17. package/dist/components/core/slot.d.ts.map +1 -0
  18. package/dist/components/core/slot.jsx +156 -0
  19. package/dist/components/core/tag.d.ts +35 -0
  20. package/dist/components/core/tag.d.ts.map +1 -0
  21. package/dist/components/core/tag.jsx +51 -0
  22. package/dist/components/core/typography.d.ts +25 -0
  23. package/dist/components/core/typography.d.ts.map +1 -0
  24. package/dist/components/core/typography.jsx +18 -0
  25. package/dist/components/display/alert.d.ts +28 -0
  26. package/dist/components/display/alert.d.ts.map +1 -0
  27. package/dist/components/display/alert.jsx +61 -0
  28. package/dist/components/display/calendar.d.ts +42 -0
  29. package/dist/components/display/calendar.d.ts.map +1 -0
  30. package/dist/components/display/calendar.jsx +299 -0
  31. package/dist/components/display/card.d.ts +29 -0
  32. package/dist/components/display/card.d.ts.map +1 -0
  33. package/dist/components/display/card.jsx +43 -0
  34. package/dist/components/display/empty.d.ts +8 -0
  35. package/dist/components/display/empty.d.ts.map +1 -0
  36. package/dist/components/display/empty.jsx +11 -0
  37. package/dist/components/display/list.d.ts +16 -0
  38. package/dist/components/display/list.d.ts.map +1 -0
  39. package/dist/components/display/list.jsx +81 -0
  40. package/dist/components/display/notifications.d.ts +27 -0
  41. package/dist/components/display/notifications.d.ts.map +1 -0
  42. package/dist/components/display/notifications.jsx +126 -0
  43. package/dist/components/display/progress.d.ts +13 -0
  44. package/dist/components/display/progress.d.ts.map +1 -0
  45. package/dist/components/display/progress.jsx +11 -0
  46. package/dist/components/display/shortcut.d.ts +4 -0
  47. package/dist/components/display/shortcut.d.ts.map +1 -0
  48. package/dist/components/display/shortcut.jsx +23 -0
  49. package/dist/components/display/skeleton.d.ts +12 -0
  50. package/dist/components/display/skeleton.d.ts.map +1 -0
  51. package/dist/components/display/skeleton.jsx +19 -0
  52. package/dist/components/display/spinner.d.ts +5 -0
  53. package/dist/components/display/spinner.d.ts.map +1 -0
  54. package/dist/components/display/spinner.jsx +11 -0
  55. package/dist/components/display/stats.d.ts +12 -0
  56. package/dist/components/display/stats.d.ts.map +1 -0
  57. package/dist/components/display/stats.jsx +20 -0
  58. package/dist/components/display/step.d.ts +24 -0
  59. package/dist/components/display/step.d.ts.map +1 -0
  60. package/dist/components/display/step.jsx +131 -0
  61. package/dist/components/display/tabs.d.ts +24 -0
  62. package/dist/components/display/tabs.d.ts.map +1 -0
  63. package/dist/components/display/tabs.jsx +125 -0
  64. package/dist/components/display/timeline.d.ts +10 -0
  65. package/dist/components/display/timeline.d.ts.map +1 -0
  66. package/dist/components/display/timeline.jsx +25 -0
  67. package/dist/components/floating/command-palette.d.ts +49 -0
  68. package/dist/components/floating/command-palette.d.ts.map +1 -0
  69. package/dist/components/floating/command-palette.jsx +197 -0
  70. package/dist/components/floating/dropdown.d.ts +15 -0
  71. package/dist/components/floating/dropdown.d.ts.map +1 -0
  72. package/dist/components/floating/dropdown.jsx +56 -0
  73. package/dist/components/floating/expand.d.ts +11 -0
  74. package/dist/components/floating/expand.d.ts.map +1 -0
  75. package/dist/components/floating/expand.jsx +44 -0
  76. package/dist/components/floating/menu.d.ts +52 -0
  77. package/dist/components/floating/menu.d.ts.map +1 -0
  78. package/dist/components/floating/menu.jsx +147 -0
  79. package/dist/components/floating/modal.d.ts +60 -0
  80. package/dist/components/floating/modal.d.ts.map +1 -0
  81. package/dist/components/floating/modal.jsx +301 -0
  82. package/dist/components/floating/toolbar.d.ts +6 -0
  83. package/dist/components/floating/toolbar.d.ts.map +1 -0
  84. package/dist/components/floating/toolbar.jsx +5 -0
  85. package/dist/components/floating/tooltip.d.ts +17 -0
  86. package/dist/components/floating/tooltip.d.ts.map +1 -0
  87. package/dist/components/floating/tooltip.jsx +58 -0
  88. package/dist/components/floating/wizard.d.ts +26 -0
  89. package/dist/components/floating/wizard.d.ts.map +1 -0
  90. package/dist/components/floating/wizard.jsx +161 -0
  91. package/dist/components/form/autocomplete.d.ts +16 -0
  92. package/dist/components/form/autocomplete.d.ts.map +1 -0
  93. package/dist/components/form/autocomplete.jsx +278 -0
  94. package/dist/components/form/checkbox.d.ts +12 -0
  95. package/dist/components/form/checkbox.d.ts.map +1 -0
  96. package/dist/components/form/checkbox.jsx +12 -0
  97. package/dist/components/form/date-picker.d.ts +10 -0
  98. package/dist/components/form/date-picker.d.ts.map +1 -0
  99. package/dist/components/form/date-picker.jsx +115 -0
  100. package/dist/components/form/file-upload.d.ts +15 -0
  101. package/dist/components/form/file-upload.d.ts.map +1 -0
  102. package/dist/components/form/file-upload.jsx +134 -0
  103. package/dist/components/form/form.d.ts +3 -0
  104. package/dist/components/form/form.d.ts.map +1 -0
  105. package/dist/components/form/form.jsx +10 -0
  106. package/dist/components/form/formReset.d.ts +2 -0
  107. package/dist/components/form/formReset.d.ts.map +1 -0
  108. package/dist/components/form/formReset.jsx +17 -0
  109. package/dist/components/form/free-text.d.ts +11 -0
  110. package/dist/components/form/free-text.d.ts.map +1 -0
  111. package/dist/components/form/free-text.jsx +41 -0
  112. package/dist/components/form/input-field.d.ts +34 -0
  113. package/dist/components/form/input-field.d.ts.map +1 -0
  114. package/dist/components/form/input-field.jsx +58 -0
  115. package/dist/components/form/input.d.ts +52 -0
  116. package/dist/components/form/input.d.ts.map +1 -0
  117. package/dist/components/form/input.jsx +36 -0
  118. package/dist/components/form/multi-select.d.ts +19 -0
  119. package/dist/components/form/multi-select.d.ts.map +1 -0
  120. package/dist/components/form/multi-select.jsx +336 -0
  121. package/dist/components/form/radiobox.d.ts +7 -0
  122. package/dist/components/form/radiobox.d.ts.map +1 -0
  123. package/dist/components/form/radiobox.jsx +6 -0
  124. package/dist/components/form/select.d.ts +13 -0
  125. package/dist/components/form/select.d.ts.map +1 -0
  126. package/dist/components/form/select.jsx +42 -0
  127. package/dist/components/form/slider.d.ts +7 -0
  128. package/dist/components/form/slider.d.ts.map +1 -0
  129. package/dist/components/form/slider.jsx +45 -0
  130. package/dist/components/form/switch.d.ts +9 -0
  131. package/dist/components/form/switch.d.ts.map +1 -0
  132. package/dist/components/form/switch.jsx +46 -0
  133. package/dist/components/form/task-list.d.ts +3 -0
  134. package/dist/components/form/task-list.d.ts.map +1 -0
  135. package/dist/components/form/task-list.jsx +26 -0
  136. package/dist/components/form/textarea.d.ts +6 -0
  137. package/dist/components/form/textarea.d.ts.map +1 -0
  138. package/dist/components/form/textarea.jsx +12 -0
  139. package/dist/components/index.d.ts +45 -0
  140. package/dist/components/index.d.ts.map +1 -0
  141. package/dist/components/index.js +44 -0
  142. package/dist/components/page-calendar/calendar-header.d.ts +16 -0
  143. package/dist/components/page-calendar/calendar-header.d.ts.map +1 -0
  144. package/dist/components/page-calendar/calendar-header.jsx +83 -0
  145. package/dist/components/page-calendar/day-view.d.ts +12 -0
  146. package/dist/components/page-calendar/day-view.d.ts.map +1 -0
  147. package/dist/components/page-calendar/day-view.jsx +94 -0
  148. package/dist/components/page-calendar/event-pill.d.ts +9 -0
  149. package/dist/components/page-calendar/event-pill.d.ts.map +1 -0
  150. package/dist/components/page-calendar/event-pill.jsx +25 -0
  151. package/dist/components/page-calendar/index.d.ts +4 -0
  152. package/dist/components/page-calendar/index.d.ts.map +1 -0
  153. package/dist/components/page-calendar/index.js +2 -0
  154. package/dist/components/page-calendar/month-view.d.ts +11 -0
  155. package/dist/components/page-calendar/month-view.d.ts.map +1 -0
  156. package/dist/components/page-calendar/month-view.jsx +46 -0
  157. package/dist/components/page-calendar/page-calendar.d.ts +18 -0
  158. package/dist/components/page-calendar/page-calendar.d.ts.map +1 -0
  159. package/dist/components/page-calendar/page-calendar.jsx +41 -0
  160. package/dist/components/page-calendar/page-calendar.types.d.ts +18 -0
  161. package/dist/components/page-calendar/page-calendar.types.d.ts.map +1 -0
  162. package/dist/components/page-calendar/page-calendar.types.js +1 -0
  163. package/dist/components/page-calendar/page-calendar.utils.d.ts +24 -0
  164. package/dist/components/page-calendar/page-calendar.utils.d.ts.map +1 -0
  165. package/dist/components/page-calendar/page-calendar.utils.js +93 -0
  166. package/dist/components/page-calendar/week-view.d.ts +11 -0
  167. package/dist/components/page-calendar/week-view.d.ts.map +1 -0
  168. package/dist/components/page-calendar/week-view.jsx +71 -0
  169. package/dist/components/table/filter.d.ts +42 -0
  170. package/dist/components/table/filter.d.ts.map +1 -0
  171. package/dist/components/table/filter.jsx +141 -0
  172. package/dist/components/table/group.d.ts +17 -0
  173. package/dist/components/table/group.d.ts.map +1 -0
  174. package/dist/components/table/group.jsx +68 -0
  175. package/dist/components/table/index.d.ts +19 -0
  176. package/dist/components/table/index.d.ts.map +1 -0
  177. package/dist/components/table/index.jsx +60 -0
  178. package/dist/components/table/inner-table.d.ts +29 -0
  179. package/dist/components/table/inner-table.d.ts.map +1 -0
  180. package/dist/components/table/inner-table.jsx +102 -0
  181. package/dist/components/table/metadata.d.ts +4 -0
  182. package/dist/components/table/metadata.d.ts.map +1 -0
  183. package/dist/components/table/metadata.jsx +36 -0
  184. package/dist/components/table/pagination.d.ts +5 -0
  185. package/dist/components/table/pagination.d.ts.map +1 -0
  186. package/dist/components/table/pagination.jsx +74 -0
  187. package/dist/components/table/row.d.ts +11 -0
  188. package/dist/components/table/row.d.ts.map +1 -0
  189. package/dist/components/table/row.jsx +49 -0
  190. package/dist/components/table/sort.d.ts +28 -0
  191. package/dist/components/table/sort.d.ts.map +1 -0
  192. package/dist/components/table/sort.jsx +109 -0
  193. package/dist/components/table/table-lib.d.ts +135 -0
  194. package/dist/components/table/table-lib.d.ts.map +1 -0
  195. package/dist/components/table/table-lib.js +83 -0
  196. package/dist/components/table/table.context.d.ts +10 -0
  197. package/dist/components/table/table.context.d.ts.map +1 -0
  198. package/dist/components/table/table.context.jsx +4 -0
  199. package/dist/components/table/thead.d.ts +9 -0
  200. package/dist/components/table/thead.d.ts.map +1 -0
  201. package/dist/components/table/thead.jsx +103 -0
  202. package/dist/config/context.d.ts +21 -0
  203. package/dist/config/context.d.ts.map +1 -0
  204. package/dist/config/context.js +12 -0
  205. package/dist/config/default-translations.d.ts +94 -0
  206. package/dist/config/default-translations.d.ts.map +1 -0
  207. package/dist/config/default-translations.jsx +87 -0
  208. package/dist/config/default-tweaks.d.ts +13 -0
  209. package/dist/config/default-tweaks.d.ts.map +1 -0
  210. package/dist/config/default-tweaks.js +4 -0
  211. package/dist/constants.d.ts +3 -0
  212. package/dist/constants.d.ts.map +1 -0
  213. package/dist/constants.js +2 -0
  214. package/dist/hooks/use-click-outside.d.ts +3 -0
  215. package/dist/hooks/use-click-outside.d.ts.map +1 -0
  216. package/dist/hooks/use-click-outside.js +17 -0
  217. package/dist/hooks/use-color-parser.d.ts +2 -0
  218. package/dist/hooks/use-color-parser.d.ts.map +1 -0
  219. package/dist/hooks/use-color-parser.js +9 -0
  220. package/dist/hooks/use-components-provider.d.ts +15 -0
  221. package/dist/hooks/use-components-provider.d.ts.map +1 -0
  222. package/dist/hooks/use-components-provider.jsx +22 -0
  223. package/dist/hooks/use-debounce.d.ts +5 -0
  224. package/dist/hooks/use-debounce.d.ts.map +1 -0
  225. package/dist/hooks/use-debounce.js +12 -0
  226. package/dist/hooks/use-floating-ref.d.ts +2 -0
  227. package/dist/hooks/use-floating-ref.d.ts.map +1 -0
  228. package/dist/hooks/use-floating-ref.js +6 -0
  229. package/dist/hooks/use-form.d.ts +394 -0
  230. package/dist/hooks/use-form.d.ts.map +1 -0
  231. package/dist/hooks/use-form.js +563 -0
  232. package/dist/hooks/use-hover.d.ts +3 -0
  233. package/dist/hooks/use-hover.d.ts.map +1 -0
  234. package/dist/hooks/use-hover.js +18 -0
  235. package/dist/hooks/use-input-id.d.ts +4 -0
  236. package/dist/hooks/use-input-id.d.ts.map +1 -0
  237. package/dist/hooks/use-input-id.js +5 -0
  238. package/dist/hooks/use-is-coarse-device.d.ts +2 -0
  239. package/dist/hooks/use-is-coarse-device.d.ts.map +1 -0
  240. package/dist/hooks/use-is-coarse-device.js +12 -0
  241. package/dist/hooks/use-locale.d.ts +3 -0
  242. package/dist/hooks/use-locale.d.ts.map +1 -0
  243. package/dist/hooks/use-locale.js +10 -0
  244. package/dist/hooks/use-media-query.d.ts +2 -0
  245. package/dist/hooks/use-media-query.d.ts.map +1 -0
  246. package/dist/hooks/use-media-query.js +25 -0
  247. package/dist/hooks/use-on-event.d.ts +4 -0
  248. package/dist/hooks/use-on-event.d.ts.map +1 -0
  249. package/dist/hooks/use-on-event.js +7 -0
  250. package/dist/hooks/use-parent.d.ts +3 -0
  251. package/dist/hooks/use-parent.d.ts.map +1 -0
  252. package/dist/hooks/use-parent.js +21 -0
  253. package/dist/hooks/use-preferences.d.ts +2 -0
  254. package/dist/hooks/use-preferences.d.ts.map +1 -0
  255. package/dist/hooks/use-preferences.js +23 -0
  256. package/dist/hooks/use-previous.d.ts +2 -0
  257. package/dist/hooks/use-previous.d.ts.map +1 -0
  258. package/dist/hooks/use-previous.js +9 -0
  259. package/dist/hooks/use-reactive.d.ts +2 -0
  260. package/dist/hooks/use-reactive.d.ts.map +1 -0
  261. package/dist/hooks/use-reactive.js +9 -0
  262. package/dist/hooks/use-remove-scroll.d.ts +4 -0
  263. package/dist/hooks/use-remove-scroll.d.ts.map +1 -0
  264. package/dist/hooks/use-remove-scroll.js +48 -0
  265. package/dist/hooks/use-resize-observer.d.ts +2 -0
  266. package/dist/hooks/use-resize-observer.d.ts.map +1 -0
  267. package/dist/hooks/use-resize-observer.js +17 -0
  268. package/dist/hooks/use-stable-ref.d.ts +2 -0
  269. package/dist/hooks/use-stable-ref.d.ts.map +1 -0
  270. package/dist/hooks/use-stable-ref.js +9 -0
  271. package/dist/hooks/use-swipe.d.ts +8 -0
  272. package/dist/hooks/use-swipe.d.ts.map +1 -0
  273. package/dist/hooks/use-swipe.js +17 -0
  274. package/dist/hooks/use-translations.d.ts +92 -0
  275. package/dist/hooks/use-translations.d.ts.map +1 -0
  276. package/dist/hooks/use-translations.js +9 -0
  277. package/dist/hooks/use-tweaks.d.ts +3 -0
  278. package/dist/hooks/use-tweaks.d.ts.map +1 -0
  279. package/dist/hooks/use-tweaks.js +9 -0
  280. package/dist/hooks/use-window-size.d.ts +5 -0
  281. package/dist/hooks/use-window-size.d.ts.map +1 -0
  282. package/dist/hooks/use-window-size.js +14 -0
  283. package/dist/index-DDeQW0JW.js.map +1 -1
  284. package/dist/index.d.ts +22 -0
  285. package/dist/index.d.ts.map +1 -0
  286. package/dist/index.js +20 -8231
  287. package/dist/index.js.map +1 -1
  288. package/dist/lib/combi-keys.d.ts +15 -0
  289. package/dist/lib/combi-keys.d.ts.map +1 -0
  290. package/dist/lib/combi-keys.js +60 -0
  291. package/dist/lib/dict.d.ts +9 -0
  292. package/dist/lib/dict.d.ts.map +1 -0
  293. package/dist/lib/dict.js +28 -0
  294. package/dist/lib/dom.d.ts +20 -0
  295. package/dist/lib/dom.d.ts.map +1 -0
  296. package/dist/lib/dom.js +66 -0
  297. package/dist/lib/fns.d.ts +11 -0
  298. package/dist/lib/fns.d.ts.map +1 -0
  299. package/dist/lib/fns.js +46 -0
  300. package/dist/lib/fzf.d.ts +16 -0
  301. package/dist/lib/fzf.d.ts.map +1 -0
  302. package/dist/lib/fzf.js +115 -0
  303. package/dist/lib/keyboard-area.d.ts +16 -0
  304. package/dist/lib/keyboard-area.d.ts.map +1 -0
  305. package/dist/lib/keyboard-area.js +14 -0
  306. package/dist/tsconfig.lib.tsbuildinfo +1 -1
  307. package/dist/types.d.ts +26 -0
  308. package/dist/types.d.ts.map +1 -0
  309. package/dist/types.js +1 -0
  310. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alert.d.ts","sourceRoot":"","sources":["../../../src/components/display/alert.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAmB,eAAe,EAA0C,MAAM,cAAc,CAAC;AAExG,OAAO,KAAK,EAAE,EAAc,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAG7D,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAa,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAahE,KAAK,aAAa,GAAG,eAAe,CAAC,SAAS,CAAC,GAAG;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC;AAEpE,eAAO,MAAM,QAAQ,GAAI,OAAO,iBAAiB,CAAC,aAAa,CAAC,sBAiB/D,CAAC;AAEF,QAAA,MAAM,aAAa;;;;;;;;;;CAUlB,CAAC;AAOF,MAAM,MAAM,UAAU,CAAC,CAAC,SAAS,KAAK,CAAC,WAAW,GAAG,KAAK,IAAI,gBAAgB,CAC1E,WAAW,CAAC,OAAO,aAAa,CAAC,GAC7B,OAAO,CAAC;IACJ,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,KAAK,CAAC,YAAY,CAAC;IACzB,OAAO,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC;CACzC,CAAC,EACN,CAAC,CACJ,CAAC;AAEF,eAAO,MAAM,KAAK,EAAE,CAAC,CAAC,SAAS,KAAK,CAAC,WAAW,GAAG,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,SAoD9E,CAAC"}
@@ -0,0 +1,61 @@
1
+ "use client";
2
+ import { cva } from "class-variance-authority";
3
+ import { AnimatePresence, motion } from "motion/react";
4
+ import { CheckCircleIcon, InfoIcon, WarningIcon, XIcon } from "@phosphor-icons/react";
5
+ import React, { forwardRef } from "react";
6
+ import { useTranslations } from "../../hooks/use-translations";
7
+ import { css } from "../../lib/dom";
8
+ import { Polymorph } from "../core/polymorph";
9
+ const variants = {
10
+ true: { opacity: 1, height: "auto" },
11
+ false: { opacity: [0.7, 0.3, 0], height: 0 },
12
+ };
13
+ const transition = {
14
+ type: "tween",
15
+ duration: 0.7,
16
+ ease: [0.04, 0.62, 0.23, 0.98],
17
+ };
18
+ export const Collapse = (props) => (<motion.div {...props} layout layoutRoot layoutScroll initial={false} variants={variants} exit={variants.false} transition={transition} aria-hidden={!props.open} data-component="collapse" animate={props.open.toString()} className={css("aria-hidden:pointer-events-none", props.className)}>
19
+ {props.children}
20
+ </motion.div>);
21
+ const themeVariants = {
22
+ theme: {
23
+ primary: "bg-alert-primary-bg text-alert-primary-text border-alert-primary-border",
24
+ danger: "bg-alert-danger-bg text-alert-danger-text border-alert-danger-border",
25
+ info: "bg-alert-info-bg text-alert-info-text border-alert-info-border",
26
+ success: "bg-alert-success-bg text-alert-success-text border-alert-success-border",
27
+ secondary: "bg-alert-secondary-bg text-alert-secondary-text border-alert-secondary-border",
28
+ warn: "bg-alert-warn-bg text-alert-warn-text border-alert-warn-border",
29
+ neutral: "bg-transparent border border-card-border text-alert-primary-text",
30
+ },
31
+ };
32
+ const alertVariants = cva("relative block w-full rounded-lg border p-4 text-sm", {
33
+ variants: themeVariants,
34
+ defaultVariants: { theme: "neutral" },
35
+ });
36
+ export const Alert = forwardRef(function Alert({ className, theme, Icon, onClose, open = true, ...props }, ref) {
37
+ const t = useTranslations();
38
+ const close = () => onClose?.(false);
39
+ const liveRole = theme === "danger" || theme === "warn" ? "alert" : "status";
40
+ return (<AnimatePresence presenceAffectsLayout propagate mode="sync">
41
+ {open ? (<motion.div data-open={!!open} aria-hidden={!open} data-component="alert" className={css("isolate w-full", open ? "pointer-events-auto" : "pointer-events-none")}>
42
+ <Collapse data-open={!!open} open={!!open}>
43
+ <Polymorph {...props} ref={ref} role={liveRole} data-theme={theme} as={props.as || "div"} className={css(alertVariants({ theme }), className)}>
44
+ <div className="grid grid-cols-[auto_1fr] gap-base">
45
+ {onClose !== undefined && open ? (<button type="button" onClick={close} aria-label={t.closeButton} className="absolute right-3 top-3 text-foreground transition-colors duration-300 ease-in-out hover:text-danger">
46
+ <XIcon size={20} aria-hidden="true"/>
47
+ </button>) : null}
48
+ <div className={css("flex items-center gap-2", props.title ? "" : "w-fit")}>
49
+ {!Icon && theme === "success" ? <CheckCircleIcon aria-hidden="true" size={20}/> : null}
50
+ {!Icon && theme === "info" ? <InfoIcon aria-hidden="true" size={20}/> : null}
51
+ {!Icon && theme === "danger" ? <WarningIcon aria-hidden="true" size={20}/> : null}
52
+ {Icon}
53
+ </div>
54
+ {props.title ? <h4 className="tracking-3 col-start-2 text-balance text-lg font-semibold">{props.title}</h4> : null}
55
+ <div className="col-start-2 w-full">{props.children}</div>
56
+ </div>
57
+ </Polymorph>
58
+ </Collapse>
59
+ </motion.div>) : null}
60
+ </AnimatePresence>);
61
+ });
@@ -0,0 +1,42 @@
1
+ import React from "react";
2
+ import { type Locales } from "the-mask-input";
3
+ type Range = {
4
+ from?: Date;
5
+ to?: Date;
6
+ };
7
+ type OnChangeDate = (d: Date | undefined) => void;
8
+ type OnChangeRange = (d: Range | undefined) => void;
9
+ type DateStyle = (d: Date) => string;
10
+ type CalendarStyles = Partial<{
11
+ day: string | DateStyle;
12
+ weekDay: string | DateStyle;
13
+ dayFrame: string | DateStyle;
14
+ week: string | ((week: Date[]) => string);
15
+ calendar: string | ((daysOfMonth: Date[]) => string);
16
+ }>;
17
+ export type CalendarProps = Partial<{
18
+ date: Date;
19
+ range: Range;
20
+ markRange: boolean;
21
+ markToday: boolean;
22
+ rangeMode: boolean;
23
+ datetimeTitle: string;
24
+ styles: CalendarStyles;
25
+ type?: "date" | "datetime";
26
+ changeOnlyOnClick: boolean;
27
+ locale: Locales | undefined;
28
+ onChangeYear: (d: Date) => void;
29
+ onChangeMonth: (d: Date) => void;
30
+ disabledDate: (date: Date) => boolean;
31
+ RenderOnDay: React.FC<{
32
+ date: Date;
33
+ }>;
34
+ onChange: OnChangeRange | OnChangeDate;
35
+ labelRange: {
36
+ to: string;
37
+ from: string;
38
+ };
39
+ }>;
40
+ export declare const Calendar: ({ RenderOnDay, changeOnlyOnClick, labelRange, disabledDate, locale, markToday, onChangeMonth, onChangeYear, rangeMode, onChange, styles, markRange, type, datetimeTitle, ...props }: CalendarProps) => React.JSX.Element;
41
+ export {};
42
+ //# sourceMappingURL=calendar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar.d.ts","sourceRoot":"","sources":["../../../src/components/display/calendar.tsx"],"names":[],"mappings":"AAmBA,OAAO,KAA4C,MAAM,OAAO,CAAC;AAEjE,OAAqB,EAAE,KAAK,OAAO,EAAE,MAAM,gBAAgB,CAAC;AA0B5D,KAAK,KAAK,GAAG;IAAE,IAAI,CAAC,EAAE,IAAI,CAAC;IAAC,EAAE,CAAC,EAAE,IAAI,CAAA;CAAE,CAAC;AAExC,KAAK,YAAY,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,SAAS,KAAK,IAAI,CAAC;AAElD,KAAK,aAAa,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,SAAS,KAAK,IAAI,CAAC;AAEpD,KAAK,SAAS,GAAG,CAAC,CAAC,EAAE,IAAI,KAAK,MAAM,CAAC;AAErC,KAAK,cAAc,GAAG,OAAO,CAAC;IAC1B,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,IAAI,EAAE,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,MAAM,CAAC,CAAC;IAC1C,QAAQ,EAAE,MAAM,GAAG,CAAC,CAAC,WAAW,EAAE,IAAI,EAAE,KAAK,MAAM,CAAC,CAAC;CACxD,CAAC,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,OAAO,CAAC;IAChC,IAAI,EAAE,IAAI,CAAC;IACX,KAAK,EAAE,KAAK,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,cAAc,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;IAC3B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,MAAM,EAAE,OAAO,GAAG,SAAS,CAAC;IAC5B,YAAY,EAAE,CAAC,CAAC,EAAE,IAAI,KAAK,IAAI,CAAC;IAChC,aAAa,EAAE,CAAC,CAAC,EAAE,IAAI,KAAK,IAAI,CAAC;IACjC,YAAY,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC;IACtC,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC;QAAE,IAAI,EAAE,IAAI,CAAA;KAAE,CAAC,CAAC;IACtC,QAAQ,EAAE,aAAa,GAAG,YAAY,CAAC;IACvC,UAAU,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5C,CAAC,CAAC;AA2IH,eAAO,MAAM,QAAQ,GAAI,qLAgBtB,aAAa,sBAwRf,CAAC"}
@@ -0,0 +1,299 @@
1
+ "use client";
2
+ import { add, eachDayOfInterval, endOfWeek, isAfter, isBefore, isSameMonth, isToday, setYear, startOfDay, startOfMonth, startOfWeek, sub, format, set, } from "date-fns";
3
+ import { CaretLeftIcon, CaretRightIcon } from "@phosphor-icons/react";
4
+ import { AnimatePresence, motion, MotionConfig } from "motion/react";
5
+ import React, { useEffect, useRef } from "react";
6
+ import { Is } from "sidekicker";
7
+ import TheMaskInput from "the-mask-input";
8
+ import { useReducer } from "use-typed-reducer";
9
+ import { useDebounce } from "../../hooks/use-debounce";
10
+ import { useLocale } from "../../hooks/use-locale";
11
+ import { useSwipe } from "../../hooks/use-swipe";
12
+ import { useTranslations } from "../../hooks/use-translations";
13
+ import { css } from "../../lib/dom";
14
+ import { splitInto, uuid } from "../../lib/fns";
15
+ import { Input } from "../form/input";
16
+ const timeRegex = /^(?<hour>\d\d):(?<min>\d\d)$/;
17
+ const transition = { type: "spring", bounce: 0.3, duration: 0.6 };
18
+ const dir = (mod) => (n = 1) => ({ x: `${100 * mod * n}%`, opacity: 0.25 });
19
+ const variants = {
20
+ enter: dir(1),
21
+ exit: dir(-1),
22
+ middle: { x: "0%", opacity: 1 },
23
+ };
24
+ const removeImmediately = { exit: { visibility: "hidden" } };
25
+ const createDays = (month) => {
26
+ const start = startOfWeek(startOfMonth(month));
27
+ return eachDayOfInterval({ start, end: add(start, { days: 41 }) });
28
+ };
29
+ const formatMonth = (d, locale) => d.toLocaleDateString(locale, { month: "long" });
30
+ const getOptionsMonth = (id, date, locale) => Array.from({ length: 12 }).map((_, i) => {
31
+ const month = startOfMonth(new Date(1970, i, 1).setMonth(i));
32
+ const label = formatMonth(month, locale);
33
+ return (<option value={label} key={`${id}-${label}`} data-index={i}>
34
+ {label}
35
+ </option>);
36
+ });
37
+ const onChangeUsingKeyboard = {
38
+ ArrowLeft: (date, duration) => (duration === "days" ? sub(date, { days: 1 }) : sub(date, { months: 1 })),
39
+ ArrowRight: (date, duration) => (duration === "days" ? add(date, { days: 1 }) : add(date, { months: 1 })),
40
+ ArrowUp: (date, duration) => (duration === "days" ? sub(date, { weeks: 1 }) : sub(date, { years: 1 })),
41
+ ArrowDown: (date, duration) => (duration === "days" ? add(date, { weeks: 1 }) : add(date, { years: 1 })),
42
+ };
43
+ const focusDate = (origin, root, next, delay = 0) => {
44
+ const d = next.toISOString();
45
+ const select = () => {
46
+ if (origin?.dataset.focustrap) {
47
+ const el = root.current?.querySelector(`button[data-focustrap="${origin?.dataset.focustrap}"]`);
48
+ return setTimeout(() => el?.focus({ preventScroll: true }), delay);
49
+ }
50
+ if (root.current) {
51
+ const element = root.current.querySelector(`button[data-date="${d}"]`);
52
+ if (element)
53
+ return element.focus({ preventScroll: true });
54
+ }
55
+ };
56
+ if (delay === 0)
57
+ select();
58
+ setTimeout(select, delay);
59
+ };
60
+ const formatYear = (now) => now.getFullYear().toString().padStart(4, "0");
61
+ const inRange = (start, middle, end) => {
62
+ if (start === undefined || end === undefined)
63
+ return false;
64
+ return isAfter(middle, start) && isBefore(middle, end);
65
+ };
66
+ const CalendarBody = (props) => {
67
+ const translate = useTranslations();
68
+ return (<motion.tbody layout variants={variants} custom={props.direction} onKeyDown={props.onKeyDown} className={css(props.styles?.week)}>
69
+ {props.zip.map((week, index) => {
70
+ const weekClassName = Is.function(props.styles?.week) ? props.styles?.week(week) : props.styles?.week;
71
+ return (<tr key={`week-${week.length}-${index}`} className={weekClassName}>
72
+ {week.map((day) => {
73
+ const key = day.toISOString();
74
+ const isSelected = props.rangeMode
75
+ ? key === props.range?.to?.toISOString() || key === props.range?.from?.toISOString()
76
+ : key === (props.date ? startOfDay(props.date).toISOString() : undefined);
77
+ const today = isToday(day) && props.markToday;
78
+ const disabledByFn = props.disabledDate?.(day) || false;
79
+ const sameMonth = isSameMonth(day, props.stateDate);
80
+ const disableDate = !sameMonth || disabledByFn;
81
+ const isInRange = props.rangeMode ? inRange(props.range?.from, day, props.range?.to) : false;
82
+ return (<td key={key} align="center" className={css("relative p-1", Is.function(props.styles?.dayFrame) ? props.styles?.dayFrame(day) : props.styles?.dayFrame)}>
83
+ <button type="button" data-date={key} disabled={disabledByFn} data-samemonth={sameMonth} data-range={props.rangeMode} onClick={props.dispatch.onSelectDate} data-view={props.stateDate.getMonth().toString()} className={css(`relative flex size-9 items-center justify-center rounded-full proportional-nums disabled:cursor-not-allowed ${today ? "text-emphasis" : ""} ${disableDate ? "text-disabled" : ""} ${isSelected ? "bg-primary text-primary-foreground" : ""}`, isInRange && props.markRange ? "size-9 border border-dashed border-card-border" : "", Is.function(props.styles?.day) ? props.styles?.day(day) : props.styles?.day)}>
84
+ <div></div>
85
+ {day.getDate()}
86
+ {isSelected && props.stateRange.from?.toISOString() === key ? (<span className="absolute -top-2 left-0 h-full w-full">
87
+ <span className="text-xs text-foreground">
88
+ {props.labelRange?.from ?? translate.calendarFromDate}
89
+ </span>
90
+ </span>) : null}
91
+ {isSelected && props.stateRange.to?.toISOString() === key ? (<span className="absolute -top-2 left-0 h-full w-full">
92
+ <span className="text-xs text-foreground">{props.labelRange?.to ?? translate.calendarToDate}</span>
93
+ </span>) : null}
94
+ </button>
95
+ {props.RenderOnDay ? <props.RenderOnDay date={day}/> : null}
96
+ </td>);
97
+ })}
98
+ </tr>);
99
+ })}
100
+ </motion.tbody>);
101
+ };
102
+ const getToday = () => startOfDay(new Date());
103
+ export const Calendar = ({ RenderOnDay, changeOnlyOnClick = false, labelRange, disabledDate, locale, markToday = true, onChangeMonth, onChangeYear, rangeMode = false, onChange, styles, markRange = true, type = "date", datetimeTitle, ...props }) => {
104
+ const id = useRef(uuid());
105
+ const translations = useTranslations();
106
+ const currentLocale = useLocale(locale);
107
+ const root = useRef(null);
108
+ const { date, range } = props;
109
+ const providedDate = date || new Date();
110
+ const monthClicked = useRef(null);
111
+ const [state, dispatch] = useReducer({
112
+ date: providedDate,
113
+ isAnimating: false,
114
+ year: formatYear(providedDate),
115
+ direction: undefined,
116
+ range: { from: range?.from, to: range?.to },
117
+ months: getOptionsMonth(id.current, providedDate, currentLocale),
118
+ selectMode: (rangeMode ? "from" : undefined),
119
+ week: eachDayOfInterval({ start: startOfWeek(providedDate), end: endOfWeek(providedDate) }),
120
+ }, (get) => ({
121
+ onChangeYear: (year) => ({ year }),
122
+ onExitComplete: () => {
123
+ focusDate(monthClicked.current || null, root, get.state().date, 200);
124
+ monthClicked.current = null;
125
+ return { isAnimating: false };
126
+ },
127
+ date: (callback) => {
128
+ const newDate = callback(get.state().date);
129
+ return { date: newDate, year: formatYear(newDate) };
130
+ },
131
+ nextMonth: (e) => {
132
+ if (e)
133
+ monthClicked.current = e.currentTarget;
134
+ const state = get.state();
135
+ if (state.isAnimating)
136
+ return state;
137
+ const date = add(state.date, { months: 1 });
138
+ return { date, isAnimating: true, direction: 1, year: formatYear(date) };
139
+ },
140
+ previousMonth: (e) => {
141
+ if (e)
142
+ monthClicked.current = e.currentTarget;
143
+ const state = get.state();
144
+ if (state.isAnimating)
145
+ return state;
146
+ const date = sub(state.date, { months: 1 });
147
+ return { date, isAnimating: true, direction: -1, year: formatYear(date) };
148
+ },
149
+ onSelectDate: (e) => {
150
+ const state = get.state();
151
+ const isRangeMode = e.currentTarget.dataset.range === "true";
152
+ const d = e.currentTarget.dataset.date || "";
153
+ const date = new Date(d);
154
+ return {
155
+ date,
156
+ year: formatYear(date),
157
+ selectMode: state.selectMode === undefined ? undefined : state.selectMode === "from" ? "to" : "from",
158
+ range: !isRangeMode
159
+ ? state.range
160
+ : {
161
+ from: state.selectMode === "from" ? date : state.range.from,
162
+ to: state.selectMode === "to" ? date : state.range.to,
163
+ },
164
+ };
165
+ },
166
+ onChangeMonth: (e) => {
167
+ const value = e.target.value;
168
+ const array = Array.from(e.target.options);
169
+ const month = array.find((x) => x.value === value);
170
+ const state = get.state();
171
+ if (month) {
172
+ const i = month.dataset.index || "";
173
+ const d = new Date(get.state().date);
174
+ d.setMonth(+i);
175
+ return { ...state, date: d, year: formatYear(d) };
176
+ }
177
+ return state;
178
+ },
179
+ onKeyDown: (e) => {
180
+ const key = e.key;
181
+ const state = get.state();
182
+ if (key in onChangeUsingKeyboard) {
183
+ if (key === "ArrowUp" || key === "ArrowDown")
184
+ e.preventDefault();
185
+ const prev = get.state().date;
186
+ const date = Is.keyof(onChangeUsingKeyboard, key) ? onChangeUsingKeyboard[key](prev, e.shiftKey ? "month" : "days") : null;
187
+ if (date !== null) {
188
+ focusDate(e.target, root, date);
189
+ return { ...state, date, year: formatYear(date) };
190
+ }
191
+ }
192
+ return get.state();
193
+ },
194
+ }), {
195
+ props: { onChangeMonth, onChangeYear },
196
+ postMiddleware: [
197
+ (state, _, args) => {
198
+ const isValidMethod = args.method === "onChangeMonth" || args.method === "previousMonth" || args.method === "nextMonth";
199
+ if (isValidMethod)
200
+ args.props.onChangeMonth?.(state.date);
201
+ return state;
202
+ },
203
+ (state, _, args) => {
204
+ const isValidMethod = args.method === "onChangeYear";
205
+ if (isValidMethod)
206
+ args.props.onChangeYear?.(state.date);
207
+ return state;
208
+ },
209
+ (state, _, args) => {
210
+ const isValidMethod = args.method === "onSelectDate" || args.method === "setToday" || args.method === "onKeyDown";
211
+ if (rangeMode && isValidMethod && changeOnlyOnClick) {
212
+ onChange?.(state.range);
213
+ return state;
214
+ }
215
+ if (isValidMethod && changeOnlyOnClick)
216
+ onChange?.(state.date);
217
+ return state;
218
+ },
219
+ ],
220
+ });
221
+ const allDaysOfMonth = createDays(state.date);
222
+ const zip = splitInto(allDaysOfMonth, 7);
223
+ const currentAsString = state.date.toISOString();
224
+ const monthString = formatMonth(state.date, currentLocale);
225
+ useEffect(() => {
226
+ if (!changeOnlyOnClick)
227
+ onChange?.(state.date);
228
+ }, [currentAsString, changeOnlyOnClick]);
229
+ const defer = useDebounce((y) => dispatch.date((prev) => setYear(new Date(prev), +y)), 1200);
230
+ const internalOnChangeYear = (e) => {
231
+ const value = e.currentTarget.value;
232
+ dispatch.onChangeYear(value);
233
+ onChangeYear?.(new Date(value));
234
+ defer(value);
235
+ };
236
+ const swipe = useSwipe((event, direction) => {
237
+ event.preventDefault();
238
+ return direction === "right" ? dispatch.previousMonth() : dispatch.nextMonth();
239
+ }, 10);
240
+ const onSetToday = () => {
241
+ const d = getToday();
242
+ dispatch.date(() => d);
243
+ onChange?.(d);
244
+ };
245
+ return (<MotionConfig transition={transition}>
246
+ <div ref={root} data-component="calendar" onTouchEnd={swipe.onTouchEnd} onTouchStart={swipe.onTouchStart} className={css("relative overflow-hidden", Is.function(styles?.calendar) ? styles?.calendar(allDaysOfMonth) : styles?.calendar)}>
247
+ <div className="flex flex-col justify-center rounded text-center">
248
+ <AnimatePresence initial={false} mode="popLayout" custom={state.direction} onExitComplete={dispatch.onExitComplete}>
249
+ <motion.div key={monthString} initial="enter" animate="middle" exit="exit">
250
+ <header className="relative flex justify-between">
251
+ <motion.button layout type="button" data-focustrap="prev" variants={removeImmediately} onClick={dispatch.previousMonth} title={translations.calendarBackMonth} className="z-calendar rounded-full p-1.5 hover:bg-primary hover:text-primary-foreground">
252
+ <CaretLeftIcon className="h-4 w-4"/>
253
+ </motion.button>
254
+ <motion.span layout variants={variants} custom={state.direction} className="absolute inset-0 isolate z-normal flex items-center justify-center font-semibold">
255
+ <span className="flex w-fit items-center justify-center gap-0.5 py-1">
256
+ <select value={monthString} onChange={dispatch.onChangeMonth} aria-label={translations.calendarMonthLabel} style={{ width: `${monthString.length + 1}ch` }} className="cursor-pointer appearance-none bg-transparent capitalize proportional-nums hover:text-primary">
257
+ {state.months}
258
+ </select>
259
+ <TheMaskInput mask="int" maxLength={4} placeholder="YYYY" value={state.year} onChange={internalOnChangeYear} style={{ width: `${state.year.length}ch` }} className="w-16 cursor-pointer appearance-none bg-transparent hover:text-primary"/>
260
+ </span>
261
+ </motion.span>
262
+ <motion.button layout type="button" data-focustrap="next" variants={removeImmediately} onClick={dispatch.nextMonth} title={translations.calendarNextMonth} className="z-calendar rounded-full p-1.5 hover:bg-primary hover:text-primary-foreground">
263
+ <CaretRightIcon className="h-4 w-4"/>
264
+ </motion.button>
265
+ </header>
266
+ <motion.table className="mt-2 table min-w-full table-auto border-0">
267
+ <thead>
268
+ <tr>
269
+ {state.week.map((dayOfWeek) => (<th role="columnheader" key={dayOfWeek.toString()} className={css("py-2 text-sm font-medium capitalize", Is.function(styles?.weekDay) ? styles.weekDay(dayOfWeek) : styles?.weekDay)}>
270
+ {dayOfWeek.toLocaleDateString(currentLocale, { weekday: "short" })}
271
+ </th>))}
272
+ </tr>
273
+ </thead>
274
+ <CalendarBody zip={zip} range={range} styles={styles} date={date || null} dispatch={dispatch} markRange={markRange} markToday={markToday} rangeMode={rangeMode} stateDate={state.date} labelRange={labelRange} stateRange={state.range} RenderOnDay={RenderOnDay} direction={state.direction} disabledDate={disabledDate} onKeyDown={dispatch.onKeyDown}/>
275
+ </motion.table>
276
+ </motion.div>
277
+ </AnimatePresence>
278
+ </div>
279
+ {type === "datetime" ? (<section className="my-4 grid items-center">
280
+ <Input info={null} mask="time" optionalText=" " container="w-full" reportStatus={false} defaultValue={date ? format(date, "HH:mm") : undefined} title={datetimeTitle || translations.calendarDatetimeTitle} onChange={(e) => {
281
+ const value = e.target.value;
282
+ const match = timeRegex.exec(value);
283
+ if (!match)
284
+ return;
285
+ const hour = match.groups.hour;
286
+ const min = match.groups.min;
287
+ const d = set(state.date, { hours: Number(hour), minutes: Number(min), seconds: 0 });
288
+ dispatch.date(() => d);
289
+ onChange?.(d);
290
+ }}/>
291
+ </section>) : null}
292
+ <footer className="mt-2 text-center text-primary">
293
+ <button type="button" onClick={onSetToday} className="transition-transform duration-300 hover:scale-105">
294
+ {translations.calendarToday}
295
+ </button>
296
+ </footer>
297
+ </div>
298
+ </MotionConfig>);
299
+ };
@@ -0,0 +1,29 @@
1
+ import { type Icon } from "@phosphor-icons/react";
2
+ import React, { type PropsWithChildren } from "react";
3
+ import { Label } from "../../types";
4
+ import { PolymorphicProps } from "../core/polymorph";
5
+ export type CardProps<T extends React.ElementType = "div"> = PolymorphicProps<{
6
+ title?: Label;
7
+ loading?: boolean;
8
+ container?: string;
9
+ titleClassName?: string;
10
+ header?: React.ReactElement | null;
11
+ }, T>;
12
+ export declare const Card: {
13
+ <T extends React.ElementType = "div">({ title, loading, children, as, header, container, titleClassName, ...props }: PropsWithChildren<CardProps<T>>): React.JSX.Element;
14
+ Title({ as, titleTag, navTag, children, ...props }: PropsWithChildren<CardHeaderTitleProps>): React.JSX.Element;
15
+ };
16
+ export type CardHeaderTitleProps<T extends React.ElementType = "div"> = PolymorphicProps<{
17
+ navTag?: React.ElementType;
18
+ titleTag?: React.ElementType;
19
+ title: React.ReactElement | string;
20
+ }, T>;
21
+ export type StatsCardProps = CardProps<React.ElementType> & {
22
+ Icon?: Icon;
23
+ title: string;
24
+ value: Label;
25
+ mark?: string;
26
+ interactive?: boolean;
27
+ };
28
+ export declare const StatsCard: (props: StatsCardProps) => React.JSX.Element;
29
+ //# sourceMappingURL=card.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"card.d.ts","sourceRoot":"","sources":["../../../src/components/display/card.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,EAAE,KAAK,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAGtD,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAa,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAGhE,MAAM,MAAM,SAAS,CAAC,CAAC,SAAS,KAAK,CAAC,WAAW,GAAG,KAAK,IAAI,gBAAgB,CACzE;IACI,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC;CACtC,EACD,CAAC,CACJ,CAAC;AAEF,eAAO,MAAM,IAAI;KAAI,CAAC,SAAS,KAAK,CAAC,WAAW,yFAS7C,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;wDAyC0B,iBAAiB,CAAC,oBAAoB,CAAC;CAXlG,CAAC;AAEF,MAAM,MAAM,oBAAoB,CAAC,CAAC,SAAS,KAAK,CAAC,WAAW,GAAG,KAAK,IAAI,gBAAgB,CACpF;IACI,MAAM,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC;IAC3B,QAAQ,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC;IAC7B,KAAK,EAAE,KAAK,CAAC,YAAY,GAAG,MAAM,CAAC;CACtC,EACD,CAAC,CACJ,CAAC;AAoBF,MAAM,MAAM,cAAc,GAAG,SAAS,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG;IACxD,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,KAAK,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,OAAO,CAAC;CACzB,CAAC;AAEF,eAAO,MAAM,SAAS,GAAI,OAAO,cAAc,sBAuB9C,CAAC"}
@@ -0,0 +1,43 @@
1
+ import { InfoIcon } from "@phosphor-icons/react";
2
+ import React from "react";
3
+ import { Is } from "sidekicker";
4
+ import { css } from "../../lib/dom";
5
+ import { Polymorph } from "../core/polymorph";
6
+ import { Skeleton } from "./skeleton";
7
+ export const Card = ({ title, loading, children, as, header = null, container = "", titleClassName = "", ...props }) => (<Polymorph {...props} as={as || "div"} data-component="card" className={css("flex w-full flex-col gap-4 rounded-card border border-card-border bg-card-background py-3 shadow-shadow-card", container)}>
8
+ {title ? (<header data-component="card-title" className={css("mb-2 w-full border-b border-card-border px-6 pb-2 text-xl font-medium", titleClassName)}>
9
+ {title}
10
+ </header>) : (header)}
11
+ <div data-component="card-body" className={css("min-w-full px-6", props.className)}>
12
+ {loading ? (<div className="flex flex-col gap-4">
13
+ <Skeleton className="w-full"/>
14
+ <Skeleton className="w-8/12"/>
15
+ <Skeleton className="w-10/12"/>
16
+ <Skeleton className="w-1/2"/>
17
+ </div>) : (children)}
18
+ </div>
19
+ </Polymorph>);
20
+ Card.Title = ({ as, titleTag, navTag, children, ...props }) => {
21
+ const Component = (as || "div");
22
+ const Title = (titleTag || "h2");
23
+ const Nav = (navTag || "nav");
24
+ return (<Component {...props} title={Is.string(props.title) ? props.title : undefined} className={css("flex w-full flex-col flex-wrap items-start justify-between gap-base sm:flex-row sm:items-center", props.className)}>
25
+ <Title className="font-semibold">{props.title}</Title>
26
+ {children ? (<Nav className="gap-kilo flex flex-col items-start justify-start sm:flex-row sm:items-center sm:justify-end">{children}</Nav>) : null}
27
+ </Component>);
28
+ };
29
+ export const StatsCard = (props) => {
30
+ const interactive = props.interactive ?? true;
31
+ const Icon = props.Icon ?? InfoIcon;
32
+ return (<Card {...props} title={null} loading={undefined} container="px-0 py-0" className="flex items-center gap-4 px-0">
33
+ <div className={`flex w-full items-center gap-4 rounded-card px-0 lg:px-0 ${interactive ? "transition-colors duration-300 ease-linear hover:bg-primary-hover/10" : ""}`}>
34
+ <div className={css("flex aspect-square h-[stretch] w-20 items-center justify-center rounded-l-card bg-primary p-4 text-primary-foreground", props.mark)}>
35
+ {<Icon size={48}/>}
36
+ </div>
37
+ <div className="flex flex-col justify-center gap-2 py-2">
38
+ <p className="text-lg">{props.title}</p>
39
+ {props.loading ? <Skeleton className="h-10"/> : <p className="text-4xl font-bold tracking-wide">{props.value}</p>}
40
+ </div>
41
+ </div>
42
+ </Card>);
43
+ };
@@ -0,0 +1,8 @@
1
+ import { type Icon } from "@phosphor-icons/react";
2
+ import React from "react";
3
+ export type EmptyProps = {
4
+ Icon?: Icon;
5
+ message?: string;
6
+ };
7
+ export declare const Empty: (props: EmptyProps) => React.JSX.Element;
8
+ //# sourceMappingURL=empty.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"empty.d.ts","sourceRoot":"","sources":["../../../src/components/display/empty.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,MAAM,UAAU,GAAG;IAAE,IAAI,CAAC,EAAE,IAAI,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3D,eAAO,MAAM,KAAK,GAAI,OAAO,UAAU,sBAStC,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { FileIcon } from "@phosphor-icons/react";
2
+ import React from "react";
3
+ import { useTranslations } from "../../hooks/use-translations";
4
+ export const Empty = (props) => {
5
+ const Icon = props.Icon ?? FileIcon;
6
+ const translate = useTranslations();
7
+ return (<div className="flex w-full flex-col items-center justify-center gap-4 px-8 py-12">
8
+ <Icon size={64} className="text-disabled"/>
9
+ <p className="text-disabled">{props.message ?? translate.emptyDataMessage}</p>
10
+ </div>);
11
+ };
@@ -0,0 +1,16 @@
1
+ import React, { PropsWithChildren } from "react";
2
+ import { Label } from "../../types";
3
+ type AnimatedItemProps = {
4
+ title: Label;
5
+ description: Label;
6
+ children: Label;
7
+ avatar?: Label;
8
+ leading?: React.FC<{
9
+ open: () => void;
10
+ }>;
11
+ };
12
+ type AnimatedListProps = object;
13
+ export declare const AnimatedList: (props: PropsWithChildren<AnimatedListProps>) => React.JSX.Element;
14
+ export declare const AnimatedListItem: (props: PropsWithChildren<AnimatedItemProps>) => React.JSX.Element;
15
+ export {};
16
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/components/display/list.tsx"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,EAAY,iBAAiB,EAAgC,MAAM,OAAO,CAAC;AACzF,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpC,KAAK,iBAAiB,GAAG;IACrB,KAAK,EAAE,KAAK,CAAC;IACb,WAAW,EAAE,KAAK,CAAC;IACnB,QAAQ,EAAE,KAAK,CAAC;IAChB,MAAM,CAAC,EAAE,KAAK,CAAC;IACf,OAAO,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC;QAAE,IAAI,EAAE,MAAM,IAAI,CAAA;KAAE,CAAC,CAAC;CAC5C,CAAC;AAIF,KAAK,iBAAiB,GAAG,MAAM,CAAC;AA4DhC,eAAO,MAAM,YAAY,GAAI,OAAO,iBAAiB,CAAC,iBAAiB,CAAC,sBAoEvE,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,OAAO,iBAAiB,CAAC,iBAAiB,CAAC,sBAA0C,CAAC"}
@@ -0,0 +1,81 @@
1
+ "use client";
2
+ import { FloatingFocusManager, FloatingOverlay, FloatingPortal, useClick, useDismiss, useFloating, useInteractions, useRole, } from "@floating-ui/react";
3
+ import { AnimatePresence, motion, MotionConfig } from "motion/react";
4
+ import { XIcon } from "@phosphor-icons/react";
5
+ import React, { Fragment, useCallback, useId, useState } from "react";
6
+ const FloatItem = ({ item, context, setter, get, refs }) => (<FloatingPortal>
7
+ <MotionConfig reducedMotion="user" transition={{ type: "spring", damping: 30, stiffness: 350 }}>
8
+ <AnimatePresence mode="wait" presenceAffectsLayout>
9
+ {item ? (<motion.div key="overlay" exit={{ opacity: 0 }} animate={{ opacity: 1 }} initial={{ opacity: 0 }} transition={{ type: "tween", duration: 0.15, ease: "easeOut" }} className="pointer-events-none fixed inset-0 top-0 z-overlay h-screen w-screen bg-floating-overlay/70"/>) : null}
10
+ {item ? (<FloatingOverlay key="card" lockScroll className="absolute inset-0 z-floating flex items-center justify-center">
11
+ <FloatingFocusManager visuallyHiddenDismiss modal closeOnFocusOut context={context}>
12
+ <motion.div layout layoutId={`item-${item.id}`} initial={{ opacity: 0.6, scale: 0.98 }} animate={{ opacity: 1, scale: 1 }} exit={{ opacity: 0, scale: 0.98 }} className="relative flex h-min w-min min-w-xs flex-col gap-4 rounded-card border border-card-border bg-card-background p-6 py-4 pb-8 shadow-shadow-card" ref={refs.setFloating} {...get()}>
13
+ <nav className="absolute right-4 top-1 lg:right-2">
14
+ <button type="button" onClick={setter} className="p-1 opacity-70 transition-colors hover:text-danger hover:opacity-100 focus:text-danger">
15
+ <XIcon />
16
+ </button>
17
+ </nav>
18
+ <motion.header layout className="flex w-full flex-wrap items-center justify-between gap-2">
19
+ <h3 className="min-w-full text-balance text-2xl font-medium">{item.title}</h3>
20
+ <p className="text-sm leading-snug text-secondary">{item.description}</p>
21
+ </motion.header>
22
+ <motion.div layout>{item.children}</motion.div>
23
+ </motion.div>
24
+ </FloatingFocusManager>
25
+ </FloatingOverlay>) : null}
26
+ </AnimatePresence>
27
+ </MotionConfig>
28
+ </FloatingPortal>);
29
+ export const AnimatedList = (props) => {
30
+ const [selected, setSelected] = useState(null);
31
+ const id = useId();
32
+ const { context, refs } = useFloating({
33
+ open: selected !== null,
34
+ transform: true,
35
+ onOpenChange: (open) => (open ? undefined : setSelected(null)),
36
+ });
37
+ const click = useClick(context);
38
+ const role = useRole(context, { role: "dialog" });
39
+ const dismiss = useDismiss(context, { escapeKey: true, referencePress: true, outsidePress: true });
40
+ const { getFloatingProps } = useInteractions([click, role, dismiss]);
41
+ const clear = useCallback(() => {
42
+ setSelected(null);
43
+ }, []);
44
+ const items = React.Children.toArray(props.children);
45
+ return (<Fragment>
46
+ <FloatItem refs={refs} context={context} get={getFloatingProps} item={selected} setter={clear}/>
47
+ <ul role="list">
48
+ {items.map((x, index) => {
49
+ const item = x.props;
50
+ const innerId = `${id}-${index}`;
51
+ const setter = () => setSelected({ ...item, id: innerId });
52
+ const Leading = item.leading;
53
+ return (<motion.li layout key={innerId} layoutId={`item-${innerId}`} className={`border-b border-card-border py-2 last:border-transparent`}>
54
+ <motion.div layoutId={`toast-${innerId}`} className="relative">
55
+ <div className="relative flex items-start space-x-3">
56
+ <Fragment>
57
+ {item.avatar ? (<div>
58
+ <div className="relative px-1">
59
+ <button onClick={setter} className="flex size-10 items-center justify-center ring-primary">
60
+ {item.avatar}
61
+ </button>
62
+ </div>
63
+ </div>) : null}
64
+ <div className="min-w-0 flex-1 py-1 text-foreground">
65
+ <div className="flex flex-row flex-nowrap justify-between gap-4">
66
+ <button onClick={setter} className="cursor-pointer text-left transition-all ease-out hover:text-primary">
67
+ <h3>{item.title}</h3>
68
+ <p className="text-sm leading-snug text-secondary">{item.description}</p>
69
+ </button>
70
+ {Leading ? <Leading open={setter}/> : null}
71
+ </div>
72
+ </div>
73
+ </Fragment>
74
+ </div>
75
+ </motion.div>
76
+ </motion.li>);
77
+ })}
78
+ </ul>
79
+ </Fragment>);
80
+ };
81
+ export const AnimatedListItem = (props) => <Fragment>{props.children}</Fragment>;