@jbpark/ui-kit 10.2.0 → 10.3.0

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 (351) hide show
  1. package/dist/Alert.d.mts +2 -2
  2. package/dist/Alert.d.mts.map +1 -1
  3. package/dist/Alert.mjs +1 -1
  4. package/dist/Anchor.d.mts +29 -0
  5. package/dist/Anchor.d.mts.map +1 -0
  6. package/dist/Anchor.mjs +120 -0
  7. package/dist/Anchor.mjs.map +1 -0
  8. package/dist/AutoComplete.d.mts +34 -0
  9. package/dist/AutoComplete.d.mts.map +1 -0
  10. package/dist/AutoComplete.mjs +82 -0
  11. package/dist/AutoComplete.mjs.map +1 -0
  12. package/dist/Avatar.d.mts +2 -2
  13. package/dist/Avatar.d.mts.map +1 -1
  14. package/dist/Avatar.mjs +2 -2
  15. package/dist/Badge.d.mts +2 -2
  16. package/dist/Badge.d.mts.map +1 -1
  17. package/dist/Breadcrumb.d.mts +3 -3
  18. package/dist/Breadcrumb.d.mts.map +1 -1
  19. package/dist/Breadcrumb.mjs +1 -1
  20. package/dist/Breadcrumb.mjs.map +1 -1
  21. package/dist/Button.d.mts +3 -3
  22. package/dist/Button.d.mts.map +1 -1
  23. package/dist/Button.mjs +1 -1
  24. package/dist/Calendar.d.mts +28 -0
  25. package/dist/Calendar.d.mts.map +1 -0
  26. package/dist/Calendar.mjs +64 -0
  27. package/dist/Calendar.mjs.map +1 -0
  28. package/dist/Card.d.mts +2 -2
  29. package/dist/Card.d.mts.map +1 -1
  30. package/dist/Cascader.d.mts +34 -0
  31. package/dist/Cascader.d.mts.map +1 -0
  32. package/dist/Cascader.mjs +144 -0
  33. package/dist/Cascader.mjs.map +1 -0
  34. package/dist/CodeEditor.d.mts +2 -2
  35. package/dist/CodeEditor.d.mts.map +1 -1
  36. package/dist/ContextMenu.d.mts +33 -0
  37. package/dist/ContextMenu.d.mts.map +1 -0
  38. package/dist/ContextMenu.mjs +92 -0
  39. package/dist/ContextMenu.mjs.map +1 -0
  40. package/dist/Descriptions.d.mts +31 -0
  41. package/dist/Descriptions.d.mts.map +1 -0
  42. package/dist/Descriptions.mjs +67 -0
  43. package/dist/Descriptions.mjs.map +1 -0
  44. package/dist/Divider.d.mts +18 -0
  45. package/dist/Divider.d.mts.map +1 -0
  46. package/dist/Divider.mjs +44 -0
  47. package/dist/Divider.mjs.map +1 -0
  48. package/dist/Form.d.mts +12 -0
  49. package/dist/Form.d.mts.map +1 -0
  50. package/dist/Form.mjs +11 -0
  51. package/dist/Form.mjs.map +1 -0
  52. package/dist/Layout.d.mts.map +1 -1
  53. package/dist/Mentions.d.mts +34 -0
  54. package/dist/Mentions.d.mts.map +1 -0
  55. package/dist/Mentions.mjs +207 -0
  56. package/dist/Mentions.mjs.map +1 -0
  57. package/dist/Menu.mjs +1 -2
  58. package/dist/Pagination.d.mts +2 -2
  59. package/dist/Pagination.d.mts.map +1 -1
  60. package/dist/Pagination.mjs +1 -1
  61. package/dist/Popconfirm.d.mts +33 -0
  62. package/dist/Popconfirm.d.mts.map +1 -0
  63. package/dist/Popconfirm.mjs +119 -0
  64. package/dist/Popconfirm.mjs.map +1 -0
  65. package/dist/Rate.d.mts +27 -0
  66. package/dist/Rate.d.mts.map +1 -0
  67. package/dist/Rate.mjs +81 -0
  68. package/dist/Rate.mjs.map +1 -0
  69. package/dist/Reveals.d.mts.map +1 -1
  70. package/dist/ScrollArea.d.mts +8 -0
  71. package/dist/ScrollArea.d.mts.map +1 -0
  72. package/dist/ScrollArea.mjs +11 -0
  73. package/dist/ScrollArea.mjs.map +1 -0
  74. package/dist/Segmented.d.mts +3 -3
  75. package/dist/Segmented.d.mts.map +1 -1
  76. package/dist/Space.d.mts +2 -2
  77. package/dist/Space.d.mts.map +1 -1
  78. package/dist/Statistic.d.mts +22 -0
  79. package/dist/Statistic.d.mts.map +1 -0
  80. package/dist/Statistic.mjs +53 -0
  81. package/dist/Statistic.mjs.map +1 -0
  82. package/dist/Steps.d.mts +3 -3
  83. package/dist/Steps.d.mts.map +1 -1
  84. package/dist/Steps.mjs +1 -1
  85. package/dist/Table.d.mts +4 -4
  86. package/dist/Table.d.mts.map +1 -1
  87. package/dist/Tag.d.mts +3 -3
  88. package/dist/Tag.d.mts.map +1 -1
  89. package/dist/TimePicker.d.mts +26 -0
  90. package/dist/TimePicker.d.mts.map +1 -0
  91. package/dist/TimePicker.mjs +77 -0
  92. package/dist/TimePicker.mjs.map +1 -0
  93. package/dist/Timeline.d.mts +35 -0
  94. package/dist/Timeline.d.mts.map +1 -0
  95. package/dist/Timeline.mjs +59 -0
  96. package/dist/Timeline.mjs.map +1 -0
  97. package/dist/Tour.d.mts +37 -0
  98. package/dist/Tour.d.mts.map +1 -0
  99. package/dist/Tour.mjs +192 -0
  100. package/dist/Tour.mjs.map +1 -0
  101. package/dist/Transfer.d.mts +36 -0
  102. package/dist/Transfer.d.mts.map +1 -0
  103. package/dist/Transfer.mjs +147 -0
  104. package/dist/Transfer.mjs.map +1 -0
  105. package/dist/Tree.d.mts +62 -0
  106. package/dist/Tree.d.mts.map +1 -0
  107. package/dist/Tree.mjs +462 -0
  108. package/dist/Tree.mjs.map +1 -0
  109. package/dist/TreeSelect.d.mts +34 -0
  110. package/dist/TreeSelect.d.mts.map +1 -0
  111. package/dist/TreeSelect.mjs +135 -0
  112. package/dist/TreeSelect.mjs.map +1 -0
  113. package/dist/Typography.d.mts.map +1 -1
  114. package/dist/components/atoms/checkbox/checkbox.d.mts +5 -3
  115. package/dist/components/atoms/checkbox/checkbox.d.mts.map +1 -1
  116. package/dist/components/atoms/checkbox/checkbox.mjs +8 -4
  117. package/dist/components/atoms/checkbox/checkbox.mjs.map +1 -1
  118. package/dist/components/atoms/checkbox/group.d.mts +2 -2
  119. package/dist/components/atoms/checkbox/group.d.mts.map +1 -1
  120. package/dist/components/atoms/checkbox/index.d.mts.map +1 -1
  121. package/dist/components/atoms/color-picker.d.mts +2 -2
  122. package/dist/components/atoms/color-picker.d.mts.map +1 -1
  123. package/dist/components/atoms/date-picker.d.mts +5 -1
  124. package/dist/components/atoms/date-picker.d.mts.map +1 -1
  125. package/dist/components/atoms/date-picker.mjs +54 -10
  126. package/dist/components/atoms/date-picker.mjs.map +1 -1
  127. package/dist/components/atoms/float-button/back-top.d.mts +2 -2
  128. package/dist/components/atoms/float-button/back-top.d.mts.map +1 -1
  129. package/dist/components/atoms/float-button/back-top.mjs +1 -1
  130. package/dist/components/atoms/float-button/float-button.d.mts +2 -2
  131. package/dist/components/atoms/float-button/float-button.d.mts.map +1 -1
  132. package/dist/components/atoms/float-button/index.d.mts.map +1 -1
  133. package/dist/components/atoms/index.d.mts +13 -6
  134. package/dist/components/atoms/input/index.d.mts +3 -1
  135. package/dist/components/atoms/input/index.d.mts.map +1 -1
  136. package/dist/components/atoms/input/index.mjs +3 -1
  137. package/dist/components/atoms/input/index.mjs.map +1 -1
  138. package/dist/components/atoms/input/number.d.mts +2 -2
  139. package/dist/components/atoms/input/number.d.mts.map +1 -1
  140. package/dist/components/atoms/input/number.mjs +1 -1
  141. package/dist/components/atoms/input/otp.d.mts +26 -0
  142. package/dist/components/atoms/input/otp.d.mts.map +1 -0
  143. package/dist/components/atoms/input/otp.mjs +52 -0
  144. package/dist/components/atoms/input/otp.mjs.map +1 -0
  145. package/dist/components/atoms/input/search.d.mts +2 -2
  146. package/dist/components/atoms/input/search.d.mts.map +1 -1
  147. package/dist/components/atoms/input/search.mjs +2 -2
  148. package/dist/components/atoms/mentions-token.mjs +31 -0
  149. package/dist/components/atoms/mentions-token.mjs.map +1 -0
  150. package/dist/components/atoms/option-group.d.mts +4 -5
  151. package/dist/components/atoms/option-group.d.mts.map +1 -1
  152. package/dist/components/atoms/popover.d.mts +2 -2
  153. package/dist/components/atoms/popover.d.mts.map +1 -1
  154. package/dist/components/atoms/progress.d.mts +2 -2
  155. package/dist/components/atoms/progress.d.mts.map +1 -1
  156. package/dist/components/atoms/radio/group.d.mts +2 -2
  157. package/dist/components/atoms/radio/group.d.mts.map +1 -1
  158. package/dist/components/atoms/radio/group.mjs +1 -1
  159. package/dist/components/atoms/radio/index.d.mts.map +1 -1
  160. package/dist/components/atoms/radio/radio.d.mts +2 -2
  161. package/dist/components/atoms/radio/radio.d.mts.map +1 -1
  162. package/dist/components/atoms/radio/radio.mjs +1 -1
  163. package/dist/components/atoms/rich-text-editor/rich-text-editor.d.mts +2 -2
  164. package/dist/components/atoms/rich-text-editor/rich-text-editor.d.mts.map +1 -1
  165. package/dist/components/atoms/rich-text-editor/toolbar-presets.mjs +2 -2
  166. package/dist/components/atoms/rich-text-editor/types.d.mts +2 -3
  167. package/dist/components/atoms/rich-text-editor/types.d.mts.map +1 -1
  168. package/dist/components/atoms/select-multiple.d.mts +2 -3
  169. package/dist/components/atoms/select-multiple.d.mts.map +1 -1
  170. package/dist/components/atoms/select-multiple.mjs +4 -3
  171. package/dist/components/atoms/select-multiple.mjs.map +1 -1
  172. package/dist/components/atoms/select-searchable-options.d.mts +3 -4
  173. package/dist/components/atoms/select-searchable-options.d.mts.map +1 -1
  174. package/dist/components/atoms/select-searchable.d.mts +2 -3
  175. package/dist/components/atoms/select-searchable.d.mts.map +1 -1
  176. package/dist/components/atoms/select-searchable.mjs +4 -3
  177. package/dist/components/atoms/select-searchable.mjs.map +1 -1
  178. package/dist/components/atoms/select.d.mts +3 -3
  179. package/dist/components/atoms/select.d.mts.map +1 -1
  180. package/dist/components/atoms/skeleton/button.d.mts.map +1 -1
  181. package/dist/components/atoms/skeleton/index.d.mts.map +1 -1
  182. package/dist/components/atoms/skeleton/node.d.mts.map +1 -1
  183. package/dist/components/atoms/skeleton/skeleton.d.mts +2 -2
  184. package/dist/components/atoms/skeleton/skeleton.d.mts.map +1 -1
  185. package/dist/components/atoms/slider/slider.d.mts +3 -3
  186. package/dist/components/atoms/slider/slider.d.mts.map +1 -1
  187. package/dist/components/atoms/spin.d.mts +2 -2
  188. package/dist/components/atoms/spin.d.mts.map +1 -1
  189. package/dist/components/atoms/spin.mjs +1 -1
  190. package/dist/components/atoms/switch.d.mts +2 -2
  191. package/dist/components/atoms/switch.d.mts.map +1 -1
  192. package/dist/components/atoms/tooltip.d.mts +2 -2
  193. package/dist/components/atoms/tooltip.d.mts.map +1 -1
  194. package/dist/components/atoms/typography/link.d.mts +2 -2
  195. package/dist/components/atoms/typography/link.d.mts.map +1 -1
  196. package/dist/components/atoms/typography/paragraph.d.mts +2 -2
  197. package/dist/components/atoms/typography/paragraph.d.mts.map +1 -1
  198. package/dist/components/atoms/typography/text.d.mts +2 -2
  199. package/dist/components/atoms/typography/text.d.mts.map +1 -1
  200. package/dist/components/atoms/typography/title.d.mts +2 -2
  201. package/dist/components/atoms/typography/title.d.mts.map +1 -1
  202. package/dist/components/atoms/typography/typography.d.mts +2 -2
  203. package/dist/components/atoms/typography/typography.d.mts.map +1 -1
  204. package/dist/components/molecules/collapse.d.mts +2 -2
  205. package/dist/components/molecules/collapse.d.mts.map +1 -1
  206. package/dist/components/molecules/dropdown.d.mts +2 -2
  207. package/dist/components/molecules/dropdown.d.mts.map +1 -1
  208. package/dist/components/molecules/index.d.mts +22 -14
  209. package/dist/components/molecules/marquees/index.d.mts.map +1 -1
  210. package/dist/components/molecules/marquees/item.d.mts +4 -4
  211. package/dist/components/molecules/marquees/item.d.mts.map +1 -1
  212. package/dist/components/molecules/marquees/item.mjs +5 -5
  213. package/dist/components/molecules/marquees/item.mjs.map +1 -1
  214. package/dist/components/molecules/marquees/marquees.d.mts +2 -2
  215. package/dist/components/molecules/marquees/marquees.d.mts.map +1 -1
  216. package/dist/components/molecules/marquees/marquees.mjs +4 -5
  217. package/dist/components/molecules/marquees/marquees.mjs.map +1 -1
  218. package/dist/components/molecules/menu/item/item.mjs +1 -1
  219. package/dist/components/molecules/menu/menu.d.mts +9 -9
  220. package/dist/components/molecules/menu/menu.d.mts.map +1 -1
  221. package/dist/components/molecules/reveals/item.d.mts +2 -2
  222. package/dist/components/molecules/reveals/item.d.mts.map +1 -1
  223. package/dist/components/molecules/reveals/reveals.d.mts +5 -5
  224. package/dist/components/molecules/reveals/reveals.d.mts.map +1 -1
  225. package/dist/components/molecules/splitter/index.d.mts.map +1 -1
  226. package/dist/components/molecules/splitter/panel.d.mts +3 -3
  227. package/dist/components/molecules/splitter/panel.d.mts.map +1 -1
  228. package/dist/components/molecules/splitter/splitter.d.mts +3 -3
  229. package/dist/components/molecules/splitter/splitter.d.mts.map +1 -1
  230. package/dist/components/molecules/tabs.d.mts +4 -4
  231. package/dist/components/molecules/tabs.d.mts.map +1 -1
  232. package/dist/components/molecules/upload.d.mts +3 -3
  233. package/dist/components/molecules/upload.d.mts.map +1 -1
  234. package/dist/components/molecules/upload.mjs +1 -1
  235. package/dist/components/organisms/drawer.d.mts +2 -2
  236. package/dist/components/organisms/drawer.d.mts.map +1 -1
  237. package/dist/components/organisms/drawer.mjs +2 -2
  238. package/dist/components/organisms/form/context.d.mts +4 -0
  239. package/dist/components/organisms/form/context.d.mts.map +1 -0
  240. package/dist/components/organisms/form/context.mjs +9 -0
  241. package/dist/components/organisms/form/context.mjs.map +1 -0
  242. package/dist/components/organisms/form/control.d.mts +11 -0
  243. package/dist/components/organisms/form/control.d.mts.map +1 -0
  244. package/dist/components/organisms/form/control.mjs +19 -0
  245. package/dist/components/organisms/form/control.mjs.map +1 -0
  246. package/dist/components/organisms/form/field.d.mts +25 -0
  247. package/dist/components/organisms/form/field.d.mts.map +1 -0
  248. package/dist/components/organisms/form/field.mjs +54 -0
  249. package/dist/components/organisms/form/field.mjs.map +1 -0
  250. package/dist/components/organisms/form/form.d.mts +14 -0
  251. package/dist/components/organisms/form/form.d.mts.map +1 -0
  252. package/dist/components/organisms/form/form.mjs +23 -0
  253. package/dist/components/organisms/form/form.mjs.map +1 -0
  254. package/dist/components/organisms/index.d.mts +14 -6
  255. package/dist/components/organisms/list/index.d.mts.map +1 -1
  256. package/dist/components/organisms/list/list.d.mts +2 -2
  257. package/dist/components/organisms/list/list.d.mts.map +1 -1
  258. package/dist/components/organisms/modal.d.mts +6 -3
  259. package/dist/components/organisms/modal.d.mts.map +1 -1
  260. package/dist/components/organisms/modal.mjs +25 -18
  261. package/dist/components/organisms/modal.mjs.map +1 -1
  262. package/dist/components/organisms/swiper/index.d.mts.map +1 -1
  263. package/dist/components/organisms/swiper/swiper.d.mts +2 -2
  264. package/dist/components/organisms/swiper/swiper.d.mts.map +1 -1
  265. package/dist/components/organisms/toast.d.mts +2 -2
  266. package/dist/components/organisms/toast.d.mts.map +1 -1
  267. package/dist/components/organisms/toast.mjs +1 -1
  268. package/dist/components/templates/container.d.mts +2 -2
  269. package/dist/components/templates/container.d.mts.map +1 -1
  270. package/dist/components/templates/empty.d.mts +2 -2
  271. package/dist/components/templates/empty.d.mts.map +1 -1
  272. package/dist/components/templates/empty.mjs +1 -1
  273. package/dist/components/templates/grid/col.d.mts +2 -2
  274. package/dist/components/templates/grid/col.d.mts.map +1 -1
  275. package/dist/components/templates/grid/row.d.mts +2 -2
  276. package/dist/components/templates/grid/row.d.mts.map +1 -1
  277. package/dist/components/templates/layout/content.d.mts +2 -2
  278. package/dist/components/templates/layout/content.d.mts.map +1 -1
  279. package/dist/components/templates/layout/footer.d.mts +2 -2
  280. package/dist/components/templates/layout/footer.d.mts.map +1 -1
  281. package/dist/components/templates/layout/header.d.mts +2 -2
  282. package/dist/components/templates/layout/header.d.mts.map +1 -1
  283. package/dist/components/templates/layout/layout.d.mts +2 -2
  284. package/dist/components/templates/layout/layout.d.mts.map +1 -1
  285. package/dist/components/templates/layout/sider.d.mts +2 -2
  286. package/dist/components/templates/layout/sider.d.mts.map +1 -1
  287. package/dist/components/templates/layout/sider.mjs +1 -1
  288. package/dist/components/templates/page-header.d.mts +2 -2
  289. package/dist/components/templates/page-header.d.mts.map +1 -1
  290. package/dist/components/templates/page-header.mjs +1 -1
  291. package/dist/components/templates/result.d.mts +2 -2
  292. package/dist/components/templates/result.d.mts.map +1 -1
  293. package/dist/components/templates/result.mjs +1 -1
  294. package/dist/core/accordion.mjs +1 -1
  295. package/dist/core/autocomplete.d.mts +2 -0
  296. package/dist/core/autocomplete.mjs +48 -0
  297. package/dist/core/autocomplete.mjs.map +1 -0
  298. package/dist/core/badge.d.mts +5 -3
  299. package/dist/core/badge.d.mts.map +1 -1
  300. package/dist/core/button.d.mts +6 -4
  301. package/dist/core/button.d.mts.map +1 -1
  302. package/dist/core/calendar.d.mts +13 -3
  303. package/dist/core/calendar.d.mts.map +1 -0
  304. package/dist/core/calendar.mjs +1 -1
  305. package/dist/core/checkbox.mjs +11 -8
  306. package/dist/core/checkbox.mjs.map +1 -1
  307. package/dist/core/combobox.d.mts +26 -4
  308. package/dist/core/combobox.d.mts.map +1 -1
  309. package/dist/core/combobox.mjs +2 -2
  310. package/dist/core/combobox.mjs.map +1 -1
  311. package/dist/core/dialog.mjs +2 -2
  312. package/dist/core/dialog.mjs.map +1 -1
  313. package/dist/core/form.d.mts +8 -0
  314. package/dist/core/form.d.mts.map +1 -0
  315. package/dist/core/form.mjs +3 -0
  316. package/dist/core/index.d.mts +13 -9
  317. package/dist/core/popover.mjs +10 -2
  318. package/dist/core/popover.mjs.map +1 -1
  319. package/dist/core/radio-group.mjs +1 -1
  320. package/dist/core/resizable.d.mts +7 -2
  321. package/dist/core/resizable.d.mts.map +1 -1
  322. package/dist/core/resizable.mjs +1 -1
  323. package/dist/core/scroll-area.d.mts +20 -0
  324. package/dist/core/scroll-area.d.mts.map +1 -0
  325. package/dist/core/scroll-area.mjs +57 -0
  326. package/dist/core/scroll-area.mjs.map +1 -0
  327. package/dist/core/select.d.mts +24 -2
  328. package/dist/core/select.d.mts.map +1 -1
  329. package/dist/core/select.mjs +1 -1
  330. package/dist/core/separator.d.mts +13 -2
  331. package/dist/core/separator.d.mts.map +1 -0
  332. package/dist/core/tabs.d.mts +16 -2
  333. package/dist/core/tabs.d.mts.map +1 -1
  334. package/dist/index.d.mts +59 -36
  335. package/dist/index.mjs +25 -6
  336. package/dist/lib/colors.d.mts +2 -3
  337. package/dist/lib/colors.d.mts.map +1 -1
  338. package/dist/providers/config/context.d.mts +2 -3
  339. package/dist/providers/config/context.d.mts.map +1 -1
  340. package/dist/providers/config/context.mjs +3 -1
  341. package/dist/providers/config/context.mjs.map +1 -1
  342. package/dist/providers/config/registry.d.mts +2 -3
  343. package/dist/providers/config/registry.d.mts.map +1 -1
  344. package/dist/providers/config/types.d.mts +8 -7
  345. package/dist/providers/config/types.d.mts.map +1 -1
  346. package/dist/style.css +689 -332
  347. package/dist/utils.d.mts +2 -3
  348. package/dist/utils.d.mts.map +1 -1
  349. package/package.json +122 -26
  350. package/dist/components/molecules/marquees/use-pause-on-hover.mjs +0 -26
  351. package/dist/components/molecules/marquees/use-pause-on-hover.mjs.map +0 -1
package/dist/Rate.mjs ADDED
@@ -0,0 +1,81 @@
1
+ "use client";
2
+ import { cn } from "./utils.mjs";
3
+ import { useConfig } from "./providers/config/context.mjs";
4
+ import Button from "./Button.mjs";
5
+ import { useId, useState } from "react";
6
+ import { DirectionProvider } from "@base-ui/react/direction-provider";
7
+ import { jsx, jsxs } from "react/jsx-runtime";
8
+ import { Star } from "lucide-react";
9
+ import { Radio } from "@base-ui/react/radio";
10
+ import { RadioGroup } from "@base-ui/react/radio-group";
11
+ //#region src/components/atoms/rate.tsx
12
+ const Rate = ({ count = 5, value, defaultValue = 0, onChange, allowClear = true, disabled = false, readOnly = false, name, icon, getItemLabel = (score, total) => `${score} of ${total} stars`, getValueText = (score, total) => score === 0 ? "No rating" : `${score} of ${total} stars`, className, classNames, dir, "aria-label": ariaLabel, "aria-labelledby": ariaLabelledBy, "aria-describedby": ariaDescribedBy, ...props }) => {
13
+ const total = Number.isFinite(count) ? Math.max(1, Math.floor(count)) : 5;
14
+ const [internalValue, setInternalValue] = useState(defaultValue);
15
+ const rawValue = value ?? internalValue;
16
+ const score = Number.isFinite(rawValue) ? Math.min(total, Math.max(0, Math.floor(rawValue))) : 0;
17
+ const { direction } = useConfig();
18
+ const resolvedDirection = dir === "ltr" || dir === "rtl" ? dir : direction;
19
+ const statusId = useId();
20
+ const changeValue = (next) => {
21
+ if (disabled || readOnly || next === score) return;
22
+ if (value === void 0) setInternalValue(next);
23
+ onChange?.(next);
24
+ };
25
+ return /* @__PURE__ */ jsx(DirectionProvider, {
26
+ direction: resolvedDirection,
27
+ children: /* @__PURE__ */ jsxs(RadioGroup, {
28
+ ...props,
29
+ "data-slot": "rate",
30
+ dir: dir ?? resolvedDirection,
31
+ "aria-label": ariaLabel ?? (ariaLabelledBy ? void 0 : "Rating"),
32
+ "aria-labelledby": ariaLabelledBy,
33
+ "aria-describedby": [ariaDescribedBy, statusId].filter(Boolean).join(" "),
34
+ disabled,
35
+ readOnly,
36
+ name,
37
+ value: score === 0 ? "" : String(score),
38
+ onValueChange: (next) => changeValue(Number(next)),
39
+ className: cn("inline-flex w-fit max-w-full flex-wrap items-center gap-1", className),
40
+ children: [Array.from({ length: total }, (_, index) => {
41
+ const itemScore = index + 1;
42
+ const isFilled = itemScore <= score;
43
+ return /* @__PURE__ */ jsx(Radio.Root, {
44
+ value: String(itemScore),
45
+ nativeButton: true,
46
+ "data-slot": "rate-item",
47
+ "data-filled": isFilled ? "" : void 0,
48
+ "aria-label": getItemLabel(itemScore, total),
49
+ onClick: (event) => {
50
+ if (allowClear && itemScore === score && !disabled && !readOnly) {
51
+ event.preventDefault();
52
+ changeValue(0);
53
+ }
54
+ },
55
+ render: /* @__PURE__ */ jsx(Button, {
56
+ variant: "text",
57
+ size: "small",
58
+ disabled,
59
+ className: cn("text-muted-foreground size-8 shrink-0 p-1", readOnly && "cursor-default", isFilled && "text-primary", classNames?.item, isFilled && classNames?.filledItem)
60
+ }),
61
+ children: /* @__PURE__ */ jsx("span", {
62
+ "data-slot": "rate-icon",
63
+ "aria-hidden": "true",
64
+ className: cn("flex size-5 items-center justify-center [&>svg]:size-full", isFilled && "[&>svg]:fill-current", classNames?.icon),
65
+ children: icon ?? /* @__PURE__ */ jsx(Star, {})
66
+ })
67
+ }, itemScore);
68
+ }), /* @__PURE__ */ jsx("span", {
69
+ id: statusId,
70
+ "data-slot": "rate-status",
71
+ className: "sr-only",
72
+ "aria-live": "polite",
73
+ children: getValueText(score, total)
74
+ })]
75
+ })
76
+ });
77
+ };
78
+ //#endregion
79
+ export { Rate as default };
80
+
81
+ //# sourceMappingURL=Rate.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Rate.mjs","names":[],"sources":["../src/components/atoms/rate.tsx"],"sourcesContent":["'use client';\n\nimport {\n type ComponentPropsWithRef,\n type ReactNode,\n useId,\n useState,\n} from 'react';\n\nimport { DirectionProvider } from '@base-ui/react/direction-provider';\nimport { Radio } from '@base-ui/react/radio';\nimport { RadioGroup } from '@base-ui/react/radio-group';\nimport { Star } from 'lucide-react';\n\nimport { useConfig } from '@repo/ui/providers';\nimport { cn } from '@repo/ui/utils';\n\nimport Button from './button';\n\nexport interface Props extends Omit<\n ComponentPropsWithRef<'div'>,\n 'children' | 'value' | 'defaultValue' | 'onChange'\n> {\n /** Positive whole-step count. Defaults to five. */\n count?: number;\n /** Zero means no rating. Values are rounded down and clamped to 0–count. */\n value?: number;\n defaultValue?: number;\n onChange?: (value: number) => void;\n /** Activating the selected score clears it to zero. Defaults to true. */\n allowClear?: boolean;\n disabled?: boolean;\n readOnly?: boolean;\n name?: string;\n icon?: ReactNode;\n getItemLabel?: (score: number, count: number) => string;\n getValueText?: (value: number, count: number) => string;\n classNames?: { item?: string; filledItem?: string; icon?: string };\n}\n\nconst Rate = ({\n count = 5,\n value,\n defaultValue = 0,\n onChange,\n allowClear = true,\n disabled = false,\n readOnly = false,\n name,\n icon,\n getItemLabel = (score, total) => `${score} of ${total} stars`,\n getValueText = (score, total) =>\n score === 0 ? 'No rating' : `${score} of ${total} stars`,\n className,\n classNames,\n dir,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n 'aria-describedby': ariaDescribedBy,\n ...props\n}: Props) => {\n const total = Number.isFinite(count) ? Math.max(1, Math.floor(count)) : 5;\n const [internalValue, setInternalValue] = useState(defaultValue);\n const rawValue = value ?? internalValue;\n const score = Number.isFinite(rawValue)\n ? Math.min(total, Math.max(0, Math.floor(rawValue)))\n : 0;\n const { direction } = useConfig();\n const resolvedDirection = dir === 'ltr' || dir === 'rtl' ? dir : direction;\n const statusId = useId();\n\n const changeValue = (next: number) => {\n if (disabled || readOnly || next === score) {\n return;\n }\n\n if (value === undefined) {\n setInternalValue(next);\n }\n\n onChange?.(next);\n };\n\n return (\n <DirectionProvider direction={resolvedDirection}>\n <RadioGroup\n {...props}\n data-slot=\"rate\"\n dir={dir ?? resolvedDirection}\n aria-label={ariaLabel ?? (ariaLabelledBy ? undefined : 'Rating')}\n aria-labelledby={ariaLabelledBy}\n aria-describedby={[ariaDescribedBy, statusId].filter(Boolean).join(' ')}\n disabled={disabled}\n readOnly={readOnly}\n name={name}\n value={score === 0 ? '' : String(score)}\n onValueChange={next => changeValue(Number(next))}\n className={cn(\n 'inline-flex w-fit max-w-full flex-wrap items-center gap-1',\n className, //\n )}\n >\n {Array.from({ length: total }, (_, index) => {\n const itemScore = index + 1;\n const isFilled = itemScore <= score;\n\n return (\n <Radio.Root\n key={itemScore}\n value={String(itemScore)}\n nativeButton\n data-slot=\"rate-item\"\n data-filled={isFilled ? '' : undefined}\n aria-label={getItemLabel(itemScore, total)}\n onClick={event => {\n if (\n allowClear &&\n itemScore === score &&\n !disabled &&\n !readOnly\n ) {\n event.preventDefault();\n changeValue(0);\n }\n }}\n render={\n <Button\n variant=\"text\"\n size=\"small\"\n disabled={disabled}\n className={cn(\n 'text-muted-foreground size-8 shrink-0 p-1',\n readOnly && 'cursor-default',\n isFilled && 'text-primary',\n classNames?.item,\n isFilled && classNames?.filledItem, //\n )}\n />\n }\n >\n <span\n data-slot=\"rate-icon\"\n aria-hidden=\"true\"\n className={cn(\n 'flex size-5 items-center justify-center [&>svg]:size-full',\n isFilled && '[&>svg]:fill-current',\n classNames?.icon, //\n )}\n >\n {icon ?? <Star />}\n </span>\n </Radio.Root>\n );\n })}\n <span\n id={statusId}\n data-slot=\"rate-status\"\n className=\"sr-only\"\n aria-live=\"polite\"\n >\n {getValueText(score, total)}\n </span>\n </RadioGroup>\n </DirectionProvider>\n );\n};\n\nexport default Rate;\n"],"mappings":";;;;;;;;;;;AAwCA,MAAM,QAAQ,EACZ,QAAQ,GACR,OACA,eAAe,GACf,UACA,aAAa,MACb,WAAW,OACX,WAAW,OACX,MACA,MACA,gBAAgB,OAAO,UAAU,GAAG,MAAM,MAAM,MAAM,SACtD,gBAAgB,OAAO,UACrB,UAAU,IAAI,cAAc,GAAG,MAAM,MAAM,MAAM,SACnD,WACA,YACA,KACA,cAAc,WACd,mBAAmB,gBACnB,oBAAoB,iBACpB,GAAG,YACQ;CACX,MAAM,QAAQ,OAAO,SAAS,KAAK,IAAI,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,CAAC,IAAI;CACxE,MAAM,CAAC,eAAe,oBAAoB,SAAS,YAAY;CAC/D,MAAM,WAAW,SAAS;CAC1B,MAAM,QAAQ,OAAO,SAAS,QAAQ,IAClC,KAAK,IAAI,OAAO,KAAK,IAAI,GAAG,KAAK,MAAM,QAAQ,CAAC,CAAC,IACjD;CACJ,MAAM,EAAE,cAAc,UAAU;CAChC,MAAM,oBAAoB,QAAQ,SAAS,QAAQ,QAAQ,MAAM;CACjE,MAAM,WAAW,MAAM;CAEvB,MAAM,eAAe,SAAiB;EACpC,IAAI,YAAY,YAAY,SAAS,OACnC;EAGF,IAAI,UAAU,KAAA,GACZ,iBAAiB,IAAI;EAGvB,WAAW,IAAI;CACjB;CAEA,OACE,oBAAC,mBAAD;EAAmB,WAAW;EAC5B,UAAA,qBAAC,YAAD;GACE,GAAI;GACJ,aAAU;GACV,KAAK,OAAO;GACZ,cAAY,cAAc,iBAAiB,KAAA,IAAY;GACvD,mBAAiB;GACjB,oBAAkB,CAAC,iBAAiB,QAAQ,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;GAC5D;GACA;GACJ;GACN,OAAO,UAAU,IAAI,KAAK,OAAO,KAAK;GACtC,gBAAe,SAAQ,YAAY,OAAO,IAAI,CAAC;GAC/C,WAAW,GACT,6DACA,SACF;GAfF,UAAA,CAiBG,MAAM,KAAK,EAAE,QAAQ,MAAM,IAAI,GAAG,UAAU;IAC3C,MAAM,YAAY,QAAQ;IAC1B,MAAM,WAAW,aAAa;IAE9B,OACE,oBAAC,MAAM,MAAP;KAEE,OAAO,OAAO,SAAS;KACvB,cAAA;KACA,aAAU;KACV,eAAa,WAAW,KAAK,KAAA;KAC7B,cAAY,aAAa,WAAW,KAAK;KACzC,UAAS,UAAS;MAChB,IACE,cACA,cAAc,SACd,CAAC,YACD,CAAC,UACD;OACA,MAAM,eAAe;OACrB,YAAY,CAAC;MACf;KACF;KACA,QACE,oBAAC,QAAD;MACE,SAAQ;MACR,MAAK;MACK;MACV,WAAW,GACT,6CACA,YAAY,kBACZ,YAAY,gBACZ,YAAY,MACZ,YAAY,YAAY,UAC1B;KACD,CAAA;KAGH,UAAA,oBAAC,QAAD;MACE,aAAU;MACV,eAAY;MACZ,WAAW,GACT,6DACA,YAAY,wBACZ,YAAY,IACd;MAEC,UAAA,QAAQ,oBAAC,MAAD,CAAO,CAAA;KACZ,CAAA;IACI,GA3CL,SA2CK;GAEhB,CAAC,GACD,oBAAC,QAAD;IACE,IAAI;IACJ,aAAU;IACV,WAAU;IACV,aAAU;IAET,UAAA,aAAa,OAAO,KAAK;GACtB,CAAA,CACI;;CACK,CAAA;AAEvB"}
@@ -1 +1 @@
1
- {"version":3,"file":"Reveals.d.mts","names":[],"sources":["../src/components/molecules/reveals/index.ts"],"mappings":";;;KAGK,0BAA0B;EAAgB,aAAa;;cAEtD,SAAyB"}
1
+ {"version":3,"file":"Reveals.d.mts","names":["RevealsImpl"],"sources":["../src/components/molecules/reveals/index.ts"],"mappings":";;;KAGK,0BAA0BA;EAAgB,aAAa;;cAEtD,SAAyB"}
@@ -0,0 +1,8 @@
1
+ import { Props as Props$1 } from "./core/scroll-area.mjs";
2
+ import "./core/index.mjs";
3
+ //#region src/components/molecules/scroll-area.d.ts
4
+ export interface Props extends Props$1 {}
5
+ declare const ScrollArea: (props: Props) => import("react").JSX.Element;
6
+ //#endregion
7
+ export { ScrollArea as default };
8
+ //# sourceMappingURL=ScrollArea.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScrollArea.d.mts","names":["scrollArea.Props"],"sources":["../src/components/molecules/scroll-area.tsx"],"mappings":";;;iBAIiB,cAAcA;cAEzB,aAAc,OAAO,0BAAK,IAAA"}
@@ -0,0 +1,11 @@
1
+ "use client";
2
+ import { ScrollArea as ScrollArea$1 } from "./core/scroll-area.mjs";
3
+ import { jsx } from "react/jsx-runtime";
4
+ //#region src/components/molecules/scroll-area.tsx
5
+ const ScrollArea = (props) => {
6
+ return /* @__PURE__ */ jsx(ScrollArea$1, { ...props });
7
+ };
8
+ //#endregion
9
+ export { ScrollArea as default };
10
+
11
+ //# sourceMappingURL=ScrollArea.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScrollArea.mjs","names":["scrollArea.ScrollArea"],"sources":["../src/components/molecules/scroll-area.tsx"],"sourcesContent":["'use client';\n\nimport { scrollArea } from '../../core';\n\nexport interface Props extends scrollArea.Props {}\n\nconst ScrollArea = (props: Props) => {\n return <scrollArea.ScrollArea {...props} />;\n};\n\nexport default ScrollArea;\n"],"mappings":";;;;AAMA,MAAM,cAAc,UAAiB;CACnC,OAAO,oBAACA,cAAD,EAAuB,GAAI,MAAQ,CAAA;AAC5C"}
@@ -2,13 +2,13 @@ import { ComponentSize } from "./providers/config/types.mjs";
2
2
  import * as React$1 from "react";
3
3
  import { ToggleGroup } from "@base-ui/react/toggle-group";
4
4
  //#region src/components/atoms/segmented.d.ts
5
- interface Option {
5
+ export interface Option {
6
6
  label: string;
7
7
  value: string;
8
8
  icon?: React$1.ReactNode;
9
9
  disabled?: boolean;
10
10
  }
11
- interface Props extends Omit<ToggleGroup.Props, 'children' | 'value' | 'defaultValue' | 'onValueChange' | 'onChange' | 'multiple'> {
11
+ export interface Props extends Omit<ToggleGroup.Props, 'children' | 'value' | 'defaultValue' | 'onValueChange' | 'onChange' | 'multiple'> {
12
12
  options: readonly (string | Option)[];
13
13
  value?: string;
14
14
  defaultValue?: string;
@@ -22,5 +22,5 @@ interface Props extends Omit<ToggleGroup.Props, 'children' | 'value' | 'defaultV
22
22
  }
23
23
  declare const Segmented: ({ options, value, defaultValue, onChange, size, className, classNames, disabled, orientation, ...props }: Props) => React$1.JSX.Element;
24
24
  //#endregion
25
- export { Option, Props, Segmented as default };
25
+ export { Segmented as default };
26
26
  //# sourceMappingURL=Segmented.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Segmented.d.mts","names":[],"sources":["../src/components/atoms/segmented.tsx"],"mappings":";;;;UAUiB;EACf;EACA;EACA,OAAO,QAAM;EACb;;UASe,cAAc,KAC7B,YAAY;EAGZ,4BAA4B;EAC5B;EACA;;EAEA,YAAY;EACZ,OAAO;EACP;IACE;IACA;;;cAIE,cAAa,SAAA,OAAA,cAAA,UAAA,MAAA,WAAA,YAAA,UAAA,gBAAA,SAWhB,UAAK,QAAA,IAAA"}
1
+ {"version":3,"file":"Segmented.d.mts","names":["React"],"sources":["../src/components/atoms/segmented.tsx"],"mappings":";;;;iBAUiB;EACf;EACA;EACA,OAAOA,QAAM;EACb;;iBASe,cAAc,KAC7B,YAAY;EAGZ,4BAA4B;EAC5B;EACA;;EAEA,YAAY;EACZ,OAAO;EACP;IACE;IACA;;;cAIE,cAAa,SAAA,OAAA,cAAA,UAAA,MAAA,WAAA,YAAA,UAAA,gBAAA,SAWhB,UAAKA,QAAA,IAAA"}
package/dist/Space.d.mts CHANGED
@@ -1,5 +1,5 @@
1
1
  //#region src/components/molecules/space.d.ts
2
- interface Props extends React.ComponentPropsWithRef<'div'> {
2
+ export interface Props extends React.ComponentPropsWithRef<'div'> {
3
3
  loading?: boolean;
4
4
  loader?: React.ReactNode;
5
5
  orientation?: 'horizontal' | 'vertical';
@@ -14,5 +14,5 @@ interface Props extends React.ComponentPropsWithRef<'div'> {
14
14
  }
15
15
  declare const Space: ({ loading, loader, children, size, orientation, align, wrap, split, className, grid, hidden, style, ...props }: Props) => import("react").JSX.Element;
16
16
  //#endregion
17
- export { Props, Space as default };
17
+ export { Space as default };
18
18
  //# sourceMappingURL=Space.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Space.d.mts","names":[],"sources":["../src/components/molecules/space.tsx"],"mappings":";UASiB,cAAc,MAAM;EACnC;EACA,SAAS,MAAM;EACf;EACA;EACA;EACA;EACA,QAAQ,MAAM;EACd;IACE;IACA;;;cAiBE,UAAS,SAAA,QAAA,UAAA,MAAA,aAAA,OAAA,MAAA,OAAA,WAAA,MAAA,QAAA,UAAA,SAcZ,0BAAK,IAAA"}
1
+ {"version":3,"file":"Space.d.mts","names":[],"sources":["../src/components/molecules/space.tsx"],"mappings":";iBASiB,cAAc,MAAM;EACnC;EACA,SAAS,MAAM;EACf;EACA;EACA;EACA;EACA,QAAQ,MAAM;EACd;IACE;IACA;;;cAiBE,UAAS,SAAA,QAAA,UAAA,MAAA,aAAA,OAAA,MAAA,OAAA,WAAA,MAAA,QAAA,UAAA,SAcZ,0BAAK,IAAA"}
@@ -0,0 +1,22 @@
1
+ import { ComponentProps, ReactNode } from "react";
2
+ //#region src/components/molecules/statistic.d.ts
3
+ export interface Props extends Omit<ComponentProps<'div'>, 'title' | 'children' | 'prefix'> {
4
+ title?: ReactNode;
5
+ value?: string | number;
6
+ prefix?: ReactNode;
7
+ suffix?: ReactNode;
8
+ precision?: number;
9
+ locale?: string;
10
+ formatter?: (value: string | number) => ReactNode;
11
+ loading?: boolean;
12
+ classNames?: {
13
+ title?: string;
14
+ value?: string;
15
+ prefix?: string;
16
+ suffix?: string;
17
+ };
18
+ }
19
+ declare const Statistic: ({ title, value, prefix, suffix, precision, locale, formatter, loading, className, classNames, ...props }: Props) => import("react").JSX.Element;
20
+ //#endregion
21
+ export { Statistic as default };
22
+ //# sourceMappingURL=Statistic.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Statistic.d.mts","names":[],"sources":["../src/components/molecules/statistic.tsx"],"mappings":";;iBAQiB,cAAc,KAC7B;EAGA,QAAQ;EACR;EACA,SAAS;EACT,SAAS;EACT;EACA;EACA,aAAa,2BAA2B;EACxC;EACA;IACE;IACA;IACA;IACA;;;cAIE,cAAa,OAAA,OAAA,QAAA,QAAA,WAAA,QAAA,WAAA,SAAA,WAAA,eAAA,SAYhB,0BAAK,IAAA"}
@@ -0,0 +1,53 @@
1
+ "use client";
2
+ import { cn } from "./utils.mjs";
3
+ import Skeleton from "./components/atoms/skeleton/index.mjs";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ //#region src/components/molecules/statistic.tsx
6
+ const Statistic = ({ title, value, prefix, suffix, precision, locale = "en-US", formatter, loading = false, className, classNames, ...props }) => {
7
+ const hasValue = value !== void 0 && value !== "" && (typeof value !== "number" || Number.isFinite(value));
8
+ let formatted = "—";
9
+ if (!loading && hasValue && value !== void 0) {
10
+ if (formatter) formatted = formatter(value);
11
+ else if (typeof value === "string") formatted = value;
12
+ else {
13
+ const digits = precision !== void 0 && Number.isFinite(precision) ? Math.min(20, Math.max(0, Math.trunc(precision))) : void 0;
14
+ const options = digits === void 0 ? void 0 : {
15
+ minimumFractionDigits: digits,
16
+ maximumFractionDigits: digits
17
+ };
18
+ try {
19
+ formatted = new Intl.NumberFormat(locale, options).format(value);
20
+ } catch {
21
+ formatted = new Intl.NumberFormat("en-US", options).format(value);
22
+ }
23
+ }
24
+ }
25
+ return /* @__PURE__ */ jsxs("div", {
26
+ ...props,
27
+ "data-slot": "statistic",
28
+ "aria-busy": loading || void 0,
29
+ className: cn("min-w-0", className),
30
+ children: [title !== void 0 && title !== null && /* @__PURE__ */ jsx("div", {
31
+ className: cn("text-muted-foreground mb-1 text-sm", classNames?.title),
32
+ children: title
33
+ }), loading ? /* @__PURE__ */ jsx(Skeleton, { className: "h-8 w-24" }) : /* @__PURE__ */ jsxs("div", {
34
+ className: cn(`text-foreground flex flex-wrap items-baseline gap-1 text-2xl
35
+ font-semibold [overflow-wrap:anywhere] tabular-nums`, classNames?.value),
36
+ children: [
37
+ prefix !== void 0 && prefix !== null && /* @__PURE__ */ jsx("span", {
38
+ className: classNames?.prefix,
39
+ children: prefix
40
+ }),
41
+ /* @__PURE__ */ jsx("span", { children: formatted }),
42
+ suffix !== void 0 && suffix !== null && /* @__PURE__ */ jsx("span", {
43
+ className: cn("text-base font-normal", classNames?.suffix),
44
+ children: suffix
45
+ })
46
+ ]
47
+ })]
48
+ });
49
+ };
50
+ //#endregion
51
+ export { Statistic as default };
52
+
53
+ //# sourceMappingURL=Statistic.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Statistic.mjs","names":[],"sources":["../src/components/molecules/statistic.tsx"],"sourcesContent":["'use client';\n\nimport type { ComponentProps, ReactNode } from 'react';\n\nimport { cn } from '@repo/ui/utils';\n\nimport Skeleton from '../atoms/skeleton';\n\nexport interface Props extends Omit<\n ComponentProps<'div'>,\n 'title' | 'children' | 'prefix'\n> {\n title?: ReactNode;\n value?: string | number;\n prefix?: ReactNode;\n suffix?: ReactNode;\n precision?: number;\n locale?: string;\n formatter?: (value: string | number) => ReactNode;\n loading?: boolean;\n classNames?: {\n title?: string;\n value?: string;\n prefix?: string;\n suffix?: string;\n };\n}\n\nconst Statistic = ({\n title,\n value,\n prefix,\n suffix,\n precision,\n locale = 'en-US',\n formatter,\n loading = false,\n className,\n classNames,\n ...props\n}: Props) => {\n const hasValue =\n value !== undefined &&\n value !== '' &&\n (typeof value !== 'number' || Number.isFinite(value));\n let formatted: ReactNode = '—';\n\n if (!loading && hasValue && value !== undefined) {\n if (formatter) {\n formatted = formatter(value);\n } else if (typeof value === 'string') {\n formatted = value;\n } else {\n const digits =\n precision !== undefined && Number.isFinite(precision)\n ? Math.min(20, Math.max(0, Math.trunc(precision)))\n : undefined;\n const options =\n digits === undefined\n ? undefined\n : {\n minimumFractionDigits: digits,\n maximumFractionDigits: digits,\n };\n\n try {\n formatted = new Intl.NumberFormat(locale, options).format(value);\n } catch {\n formatted = new Intl.NumberFormat('en-US', options).format(value);\n }\n }\n }\n\n return (\n <div\n {...props}\n data-slot=\"statistic\"\n aria-busy={loading || undefined}\n className={cn(\n 'min-w-0',\n className,\n //\n )}\n >\n {title !== undefined && title !== null && (\n <div\n className={cn(\n 'text-muted-foreground mb-1 text-sm',\n classNames?.title,\n //\n )}\n >\n {title}\n </div>\n )}\n {loading ? (\n <Skeleton className=\"h-8 w-24\" />\n ) : (\n <div\n className={cn(\n `text-foreground flex flex-wrap items-baseline gap-1 text-2xl\n font-semibold [overflow-wrap:anywhere] tabular-nums`,\n classNames?.value,\n //\n )}\n >\n {prefix !== undefined && prefix !== null && (\n <span className={classNames?.prefix}>{prefix}</span>\n )}\n <span>{formatted}</span>\n {suffix !== undefined && suffix !== null && (\n <span\n className={cn(\n 'text-base font-normal',\n classNames?.suffix,\n //\n )}\n >\n {suffix}\n </span>\n )}\n </div>\n )}\n </div>\n );\n};\n\nexport default Statistic;\n"],"mappings":";;;;;AA4BA,MAAM,aAAa,EACjB,OACA,OACA,QACA,QACA,WACA,SAAS,SACT,WACA,UAAU,OACV,WACA,YACA,GAAG,YACQ;CACX,MAAM,WACJ,UAAU,KAAA,KACV,UAAU,OACT,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK;CACrD,IAAI,YAAuB;CAE3B,IAAI,CAAC,WAAW,YAAY,UAAU,KAAA,GAAW;EAC/C,IAAI,WACF,YAAY,UAAU,KAAK;OACtB,IAAI,OAAO,UAAU,UAC1B,YAAY;OACP;GACL,MAAM,SACJ,cAAc,KAAA,KAAa,OAAO,SAAS,SAAS,IAChD,KAAK,IAAI,IAAI,KAAK,IAAI,GAAG,KAAK,MAAM,SAAS,CAAC,CAAC,IAC/C,KAAA;GACN,MAAM,UACJ,WAAW,KAAA,IACP,KAAA,IACA;IACE,uBAAuB;IACvB,uBAAuB;GACzB;GAEN,IAAI;IACF,YAAY,IAAI,KAAK,aAAa,QAAQ,OAAO,CAAC,CAAC,OAAO,KAAK;GACjE,QAAQ;IACN,YAAY,IAAI,KAAK,aAAa,SAAS,OAAO,CAAC,CAAC,OAAO,KAAK;GAClE;EACF;CACF;CAEA,OACE,qBAAC,OAAD;EACE,GAAI;EACJ,aAAU;EACV,aAAW,WAAW,KAAA;EACtB,WAAW,GACT,WACA,SAEF;EARF,UAAA,CAUG,UAAU,KAAA,KAAa,UAAU,QAChC,oBAAC,OAAD;GACE,WAAW,GACT,sCACA,YAAY,KAEd;GAEC,UAAA;EACE,CAAA,GAEN,UACC,oBAAC,UAAD,EAAU,WAAU,WAAY,CAAA,IAEhC,qBAAC,OAAD;GACE,WAAW,GACT;oEAEA,YAAY,KAEd;GANF,UAAA;IAQG,WAAW,KAAA,KAAa,WAAW,QAClC,oBAAC,QAAD;KAAM,WAAW,YAAY;KAAS,UAAA;IAAa,CAAA;IAErD,oBAAC,QAAD,EAAA,UAAO,UAAgB,CAAA;IACtB,WAAW,KAAA,KAAa,WAAW,QAClC,oBAAC,QAAD;KACE,WAAW,GACT,yBACA,YAAY,MAEd;KAEC,UAAA;IACG,CAAA;GAEL;EAEJ,CAAA,CAAA;;AAET"}
package/dist/Steps.d.mts CHANGED
@@ -1,6 +1,6 @@
1
1
  import * as React$1 from "react";
2
2
  //#region src/components/molecules/steps.d.ts
3
- interface Item {
3
+ export interface Item {
4
4
  key?: React$1.Key;
5
5
  title: React$1.ReactNode;
6
6
  description?: React$1.ReactNode;
@@ -8,7 +8,7 @@ interface Item {
8
8
  /** Mark a failed step regardless of its position. */
9
9
  status?: 'error';
10
10
  }
11
- interface Props extends Omit<React$1.ComponentPropsWithoutRef<'nav'>, 'children'> {
11
+ export interface Props extends Omit<React$1.ComponentPropsWithoutRef<'nav'>, 'children'> {
12
12
  items: readonly Item[];
13
13
  /** Zero-based index of the current step. */
14
14
  current?: number;
@@ -24,5 +24,5 @@ interface Props extends Omit<React$1.ComponentPropsWithoutRef<'nav'>, 'children'
24
24
  }
25
25
  declare const Steps: ({ items, current, orientation, className, classNames, dir, "aria-label": ariaLabel, ...props }: Props) => React$1.JSX.Element;
26
26
  //#endregion
27
- export { Item, Props, Steps as default };
27
+ export { Steps as default };
28
28
  //# sourceMappingURL=Steps.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Steps.d.mts","names":[],"sources":["../src/components/molecules/steps.tsx"],"mappings":";;UASiB;EACf,MAAM,QAAM;EACZ,OAAO,QAAM;EACb,cAAc,QAAM;EACpB,OAAO,QAAM;;EAEb;;UAGe,cAAc,KAC7B,QAAM;EAGN,gBAAgB;;EAEhB;EACA;EACA;IACE;IACA;IACA;IACA;IACA;IACA;;;cAIE,UAAS,OAAA,SAAA,aAAA,WAAA,YAAA,mBAAA,cAAA,SASZ,UAAK,QAAA,IAAA"}
1
+ {"version":3,"file":"Steps.d.mts","names":["React"],"sources":["../src/components/molecules/steps.tsx"],"mappings":";;iBASiB;EACf,MAAMA,QAAM;EACZ,OAAOA,QAAM;EACb,cAAcA,QAAM;EACpB,OAAOA,QAAM;;EAEb;;iBAGe,cAAc,KAC7BA,QAAM;EAGN,gBAAgB;;EAEhB;EACA;EACA;IACE;IACA;IACA;IACA;IACA;IACA;;;cAIE,UAAS,OAAA,SAAA,aAAA,WAAA,YAAA,mBAAA,cAAA,SASZ,UAAKA,QAAA,IAAA"}
package/dist/Steps.mjs CHANGED
@@ -1,9 +1,9 @@
1
1
  "use client";
2
2
  import { cn } from "./utils.mjs";
3
3
  import { useConfig } from "./providers/config/context.mjs";
4
- import { Check, TriangleAlert } from "lucide-react";
5
4
  import "react";
6
5
  import { jsx, jsxs } from "react/jsx-runtime";
6
+ import { Check, TriangleAlert } from "lucide-react";
7
7
  //#region src/components/molecules/steps.tsx
8
8
  const Steps = ({ items, current = 0, orientation = "horizontal", className, classNames, dir, "aria-label": ariaLabel, ...props }) => {
9
9
  const { direction } = useConfig();
package/dist/Table.d.mts CHANGED
@@ -1,13 +1,13 @@
1
1
  import { Props as Props$1 } from "./Pagination.mjs";
2
2
  //#region src/components/organisms/table.d.ts
3
- type PaginationOptions = Omit<Props$1, 'total'> & ({
3
+ export type PaginationOptions = Omit<Props$1, 'total'> & ({
4
4
  mode?: 'client';
5
5
  total?: never;
6
6
  } | {
7
7
  mode: 'server';
8
8
  total: number;
9
9
  });
10
- interface Column<T> {
10
+ export interface Column<T> {
11
11
  key: React.Key;
12
12
  title: React.ReactNode;
13
13
  /** Field displayed when render is omitted. */
@@ -18,7 +18,7 @@ interface Column<T> {
18
18
  className?: string;
19
19
  headerClassName?: string;
20
20
  }
21
- interface Props<T> extends Omit<React.ComponentPropsWithoutRef<'table'>, 'children'> {
21
+ export interface Props<T> extends Omit<React.ComponentPropsWithoutRef<'table'>, 'children'> {
22
22
  columns: Column<T>[];
23
23
  data?: T[];
24
24
  /** Use a stable key when rows may be reordered or paged. */
@@ -44,5 +44,5 @@ interface Props<T> extends Omit<React.ComponentPropsWithoutRef<'table'>, 'childr
44
44
  }
45
45
  declare const Table: <T>({ columns, data, rowKey, loading, empty, size, bordered, striped, hoverable, pagination, caption, className, classNames, ...props }: Props<T>) => import("react").JSX.Element;
46
46
  //#endregion
47
- export { Column, PaginationOptions, Props, Table as default };
47
+ export { Table as default };
48
48
  //# sourceMappingURL=Table.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Table.d.mts","names":[],"sources":["../src/components/organisms/table.tsx"],"mappings":";;KAaY,oBAAoB,KAAK;EAChC;EAAiB;;EAAoB;EAAgB;;UAEzC,OAAO;EACtB,KAAK,MAAM;EACX,OAAO,MAAM;;EAEb,kBAAkB;EAClB,UAAU,QAAQ,GAAG,kBAAkB,MAAM;EAC7C;EACA;EACA;EACA;;UAGe,MAAM,WAAW,KAChC,MAAM;EAGN,SAAS,OAAO;EAChB,OAAO;;EAEP,UAAU,QAAQ,GAAG,kBAAkB,MAAM;EAC7C,UAAU,MAAM;EAChB;EACA,QAAQ,MAAM;EACd;EACA;EACA;EACA;;EAEA,uBAAuB;EACvB;IACE;IACA;IACA;IACA;IACA;IACA;IACA;;;cAaE,QAAS,KAAI,SAAA,MAAA,QAAA,SAAA,OAAA,MAAA,UAAA,SAAA,WAAA,YAAA,SAAA,WAAA,eAAA,SAehB,MAAM,uBAAE,IAAA"}
1
+ {"version":3,"file":"Table.d.mts","names":["PaginationProps"],"sources":["../src/components/organisms/table.tsx"],"mappings":";;YAaY,oBAAoB,KAAKA;EAChC;EAAiB;;EAAoB;EAAgB;;iBAEzC,OAAO;EACtB,KAAK,MAAM;EACX,OAAO,MAAM;;EAEb,kBAAkB;EAClB,UAAU,QAAQ,GAAG,kBAAkB,MAAM;EAC7C;EACA;EACA;EACA;;iBAGe,MAAM,WAAW,KAChC,MAAM;EAGN,SAAS,OAAO;EAChB,OAAO;;EAEP,UAAU,QAAQ,GAAG,kBAAkB,MAAM;EAC7C,UAAU,MAAM;EAChB;EACA,QAAQ,MAAM;EACd;EACA;EACA;EACA;;EAEA,uBAAuB;EACvB;IACE;IACA;IACA;IACA;IACA;IACA;IACA;;;cAaE,QAAS,KAAI,SAAA,MAAA,QAAA,SAAA,OAAA,MAAA,UAAA,SAAA,WAAA,YAAA,SAAA,WAAA,eAAA,SAehB,MAAM,uBAAE,IAAA"}
package/dist/Tag.d.mts CHANGED
@@ -1,10 +1,10 @@
1
- import { Badge } from "./core/badge.mjs";
1
+ import { Badge, badge_d_exports } from "./core/badge.mjs";
2
2
  import "./core/index.mjs";
3
3
  import { PresetColor } from "./lib/colors.mjs";
4
4
  import * as React$1 from "react";
5
5
  //#region src/components/atoms/tag.d.ts
6
6
  declare const Core: typeof Badge;
7
- interface Props extends Omit<React$1.ComponentProps<typeof Core>, 'variant' | 'color'> {
7
+ export interface Props extends Omit<React$1.ComponentProps<typeof Core>, 'variant' | 'color'> {
8
8
  /**
9
9
  * Fill style, aligned with `Button`'s vocabulary (#320). The pre-7.0
10
10
  * `'default'` spelling was removed — use `'filled'`, which renders
@@ -26,5 +26,5 @@ interface Props extends Omit<React$1.ComponentProps<typeof Core>, 'variant' | 'c
26
26
  }
27
27
  declare const Tag: ({ className, variant, color, children, ...props }: Props) => React$1.JSX.Element;
28
28
  //#endregion
29
- export { Props, Tag as default };
29
+ export { Tag as default };
30
30
  //# sourceMappingURL=Tag.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Tag.d.mts","names":[],"sources":["../src/components/atoms/tag.tsx"],"mappings":";;;;;cAUM,aAAI;UAEO,cAAc,KAC7B,QAAM,sBAAsB;;;;;;EAQ5B;;;;;;;;;;;;EAYA,mEAC6D;;cAuBzD,QAAO,WAAA,SAAA,OAAA,aAAA,SAAmD,UAAK,QAAA,IAAA"}
1
+ {"version":3,"file":"Tag.d.mts","names":["badge","badge.Badge","React"],"sources":["../src/components/atoms/tag.tsx"],"mappings":";;;;;cAUM,aAAIC;iBAEO,cAAc,KAC7BC,QAAM,sBAAsB;;;;;;EAQ5B;;;;;;;;;;;;EAYA,mEAC6D;;cAuBzD,QAAO,WAAA,SAAA,OAAA,aAAA,SAAmD,UAAKA,QAAA,IAAA"}
@@ -0,0 +1,26 @@
1
+ import { ComponentSize } from "./providers/config/types.mjs";
2
+ import * as React$1 from "react";
3
+ //#region src/components/atoms/time-picker.d.ts
4
+ export interface Props extends Omit<React$1.ComponentPropsWithRef<'input'>, 'children' | 'defaultValue' | 'onChange' | 'size' | 'step' | 'type' | 'value'> {
5
+ /** Visible label. An external label or aria-label can be used instead. */
6
+ label?: string;
7
+ /** A local time in 24-hour HH:mm form; null keeps a controlled field empty. */
8
+ value?: string | null;
9
+ defaultValue?: string;
10
+ /** Called with HH:mm, or null when the field is cleared. */
11
+ onChange?: (value: string | null) => void;
12
+ /** Positive whole-minute interval. Native time inputs use seconds for step. */
13
+ minuteStep?: number;
14
+ allowClear?: boolean;
15
+ clearLabel?: string;
16
+ size?: ComponentSize;
17
+ classNames?: {
18
+ label?: string;
19
+ input?: string;
20
+ clear?: string;
21
+ };
22
+ }
23
+ declare const TimePicker: ({ ref, id, label, value, defaultValue, onChange, minuteStep, allowClear, clearLabel, size, disabled, readOnly, className, classNames, ...props }: Props) => React$1.JSX.Element;
24
+ //#endregion
25
+ export { TimePicker as default };
26
+ //# sourceMappingURL=TimePicker.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TimePicker.d.mts","names":["React"],"sources":["../src/components/atoms/time-picker.tsx"],"mappings":";;;iBAmBiB,cAAc,KAC7BA,QAAM;;EAIN;;EAEA;EACA;;EAEA,YAAY;;EAEZ;EACA;EACA;EACA,OAAO;EACP;IACE;IACA;IACA;;;cAIE,eAAc,KAAA,IAAA,OAAA,OAAA,cAAA,UAAA,YAAA,YAAA,YAAA,MAAA,UAAA,UAAA,WAAA,eAAA,SAgBjB,UAAKA,QAAA,IAAA"}
@@ -0,0 +1,77 @@
1
+ "use client";
2
+ import { cn } from "./utils.mjs";
3
+ import { useConfig } from "./providers/config/context.mjs";
4
+ import Button from "./Button.mjs";
5
+ import Input from "./components/atoms/input/index.mjs";
6
+ import * as React$1 from "react";
7
+ import { useMergedRef } from "@jbpark/use-hooks";
8
+ import { jsx, jsxs } from "react/jsx-runtime";
9
+ import { CircleX } from "lucide-react";
10
+ //#region src/components/atoms/time-picker.tsx
11
+ const sizes = {
12
+ small: "h-8",
13
+ middle: "h-9",
14
+ large: "h-10"
15
+ };
16
+ const TimePicker = ({ ref, id, label, value, defaultValue, onChange, minuteStep = 1, allowClear = true, clearLabel = "Clear time", size, disabled, readOnly, className, classNames, ...props }) => {
17
+ const generatedId = React$1.useId();
18
+ const inputId = id ?? generatedId;
19
+ const inputRef = React$1.useRef(null);
20
+ const mergedRef = useMergedRef(inputRef, ref);
21
+ const { componentSize } = useConfig();
22
+ const resolvedSize = size ?? componentSize ?? "middle";
23
+ const isControlled = value !== void 0;
24
+ const [uncontrolledValue, setUncontrolledValue] = React$1.useState(defaultValue ?? "");
25
+ const currentValue = isControlled ? value ?? "" : uncontrolledValue;
26
+ const handleChange = (event) => {
27
+ const nextValue = event.currentTarget.value;
28
+ if (!isControlled) setUncontrolledValue(nextValue);
29
+ onChange?.(nextValue || null);
30
+ };
31
+ const handleClear = () => {
32
+ if (!isControlled && inputRef.current) {
33
+ inputRef.current.value = "";
34
+ setUncontrolledValue("");
35
+ }
36
+ onChange?.(null);
37
+ inputRef.current?.focus();
38
+ };
39
+ return /* @__PURE__ */ jsxs("div", {
40
+ "data-slot": "time-picker",
41
+ className: cn("w-full", className),
42
+ children: [label && /* @__PURE__ */ jsx("label", {
43
+ htmlFor: inputId,
44
+ className: cn("mb-1.5 block text-sm font-medium", classNames?.label),
45
+ children: label
46
+ }), /* @__PURE__ */ jsxs("div", {
47
+ className: "flex items-center gap-1",
48
+ children: [/* @__PURE__ */ jsx(Input, {
49
+ ...props,
50
+ ref: mergedRef,
51
+ id: inputId,
52
+ type: "time",
53
+ step: minuteStep * 60,
54
+ disabled,
55
+ readOnly,
56
+ value: isControlled ? value ?? "" : void 0,
57
+ defaultValue: isControlled ? void 0 : defaultValue,
58
+ onChange: handleChange,
59
+ className: cn("min-w-0 flex-1", sizes[resolvedSize], classNames?.input)
60
+ }), allowClear && currentValue && !disabled && !readOnly && /* @__PURE__ */ jsx(Button, {
61
+ htmlType: "button",
62
+ variant: "text",
63
+ shape: "circle",
64
+ size: resolvedSize,
65
+ icon: /* @__PURE__ */ jsx(CircleX, {}),
66
+ "aria-label": clearLabel,
67
+ "data-time-picker-clear": "",
68
+ className: cn(classNames?.clear),
69
+ onClick: handleClear
70
+ })]
71
+ })]
72
+ });
73
+ };
74
+ //#endregion
75
+ export { TimePicker as default };
76
+
77
+ //# sourceMappingURL=TimePicker.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TimePicker.mjs","names":["React"],"sources":["../src/components/atoms/time-picker.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\n\nimport { useMergedRef } from '@jbpark/use-hooks';\nimport { CircleX } from 'lucide-react';\n\nimport { type ComponentSize, useConfig } from '@repo/ui/providers';\nimport { cn } from '@repo/ui/utils';\n\nimport Button from './button';\nimport Input from './input';\n\nconst sizes: Record<ComponentSize, string> = {\n small: 'h-8',\n middle: 'h-9',\n large: 'h-10',\n};\n\nexport interface Props extends Omit<\n React.ComponentPropsWithRef<'input'>,\n 'children' | 'defaultValue' | 'onChange' | 'size' | 'step' | 'type' | 'value'\n> {\n /** Visible label. An external label or aria-label can be used instead. */\n label?: string;\n /** A local time in 24-hour HH:mm form; null keeps a controlled field empty. */\n value?: string | null;\n defaultValue?: string;\n /** Called with HH:mm, or null when the field is cleared. */\n onChange?: (value: string | null) => void;\n /** Positive whole-minute interval. Native time inputs use seconds for step. */\n minuteStep?: number;\n allowClear?: boolean;\n clearLabel?: string;\n size?: ComponentSize;\n classNames?: {\n label?: string;\n input?: string;\n clear?: string;\n };\n}\n\nconst TimePicker = ({\n ref,\n id,\n label,\n value,\n defaultValue,\n onChange,\n minuteStep = 1,\n allowClear = true,\n clearLabel = 'Clear time',\n size,\n disabled,\n readOnly,\n className,\n classNames,\n ...props\n}: Props) => {\n const generatedId = React.useId();\n const inputId = id ?? generatedId;\n const inputRef = React.useRef<HTMLInputElement>(null);\n const mergedRef = useMergedRef(inputRef, ref);\n const { componentSize } = useConfig();\n const resolvedSize = size ?? componentSize ?? 'middle';\n const isControlled = value !== undefined;\n const [uncontrolledValue, setUncontrolledValue] = React.useState(\n defaultValue ?? '',\n );\n const currentValue = isControlled ? (value ?? '') : uncontrolledValue;\n\n const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n const nextValue = event.currentTarget.value;\n\n if (!isControlled) {\n setUncontrolledValue(nextValue);\n }\n\n onChange?.(nextValue || null);\n };\n\n const handleClear = () => {\n if (!isControlled && inputRef.current) {\n inputRef.current.value = '';\n setUncontrolledValue('');\n }\n\n onChange?.(null);\n inputRef.current?.focus();\n };\n\n return (\n <div data-slot=\"time-picker\" className={cn('w-full', className)}>\n {label && (\n <label\n htmlFor={inputId}\n className={cn('mb-1.5 block text-sm font-medium', classNames?.label)}\n >\n {label}\n </label>\n )}\n <div className=\"flex items-center gap-1\">\n <Input\n {...props}\n ref={mergedRef}\n id={inputId}\n type=\"time\"\n step={minuteStep * 60}\n disabled={disabled}\n readOnly={readOnly}\n value={isControlled ? (value ?? '') : undefined}\n defaultValue={isControlled ? undefined : defaultValue}\n onChange={handleChange}\n className={cn(\n 'min-w-0 flex-1',\n sizes[resolvedSize],\n classNames?.input,\n //\n )}\n />\n {allowClear && currentValue && !disabled && !readOnly && (\n <Button\n htmlType=\"button\"\n variant=\"text\"\n shape=\"circle\"\n size={resolvedSize}\n icon={<CircleX />}\n aria-label={clearLabel}\n data-time-picker-clear=\"\"\n className={cn(classNames?.clear)}\n onClick={handleClear}\n />\n )}\n </div>\n </div>\n );\n};\n\nexport default TimePicker;\n"],"mappings":";;;;;;;;;;AAaA,MAAM,QAAuC;CAC3C,OAAO;CACP,QAAQ;CACR,OAAO;AACT;AAyBA,MAAM,cAAc,EAClB,KACA,IACA,OACA,OACA,cACA,UACA,aAAa,GACb,aAAa,MACb,aAAa,cACb,MACA,UACA,UACA,WACA,YACA,GAAG,YACQ;CACX,MAAM,cAAcA,QAAM,MAAM;CAChC,MAAM,UAAU,MAAM;CACtB,MAAM,WAAWA,QAAM,OAAyB,IAAI;CACpD,MAAM,YAAY,aAAa,UAAU,GAAG;CAC5C,MAAM,EAAE,kBAAkB,UAAU;CACpC,MAAM,eAAe,QAAQ,iBAAiB;CAC9C,MAAM,eAAe,UAAU,KAAA;CAC/B,MAAM,CAAC,mBAAmB,wBAAwBA,QAAM,SACtD,gBAAgB,EAClB;CACA,MAAM,eAAe,eAAgB,SAAS,KAAM;CAEpD,MAAM,gBAAgB,UAA+C;EACnE,MAAM,YAAY,MAAM,cAAc;EAEtC,IAAI,CAAC,cACH,qBAAqB,SAAS;EAGhC,WAAW,aAAa,IAAI;CAC9B;CAEA,MAAM,oBAAoB;EACxB,IAAI,CAAC,gBAAgB,SAAS,SAAS;GACrC,SAAS,QAAQ,QAAQ;GACzB,qBAAqB,EAAE;EACzB;EAEA,WAAW,IAAI;EACf,SAAS,SAAS,MAAM;CAC1B;CAEA,OACE,qBAAC,OAAD;EAAK,aAAU;EAAc,WAAW,GAAG,UAAU,SAAS;EAA9D,UAAA,CACG,SACC,oBAAC,SAAD;GACE,SAAS;GACT,WAAW,GAAG,oCAAoC,YAAY,KAAK;GAElE,UAAA;EACI,CAAA,GAET,qBAAC,OAAD;GAAK,WAAU;GAAf,UAAA,CACE,oBAAC,OAAD;IACE,GAAI;IACJ,KAAK;IACL,IAAI;IACJ,MAAK;IACL,MAAM,aAAa;IACT;IACA;IACV,OAAO,eAAgB,SAAS,KAAM,KAAA;IACtC,cAAc,eAAe,KAAA,IAAY;IACzC,UAAU;IACV,WAAW,GACT,kBACA,MAAM,eACN,YAAY,KAEd;GACD,CAAA,GACA,cAAc,gBAAgB,CAAC,YAAY,CAAC,YAC3C,oBAAC,QAAD;IACE,UAAS;IACT,SAAQ;IACR,OAAM;IACN,MAAM;IACN,MAAM,oBAAC,SAAD,CAAU,CAAA;IAChB,cAAY;IACZ,0BAAuB;IACvB,WAAW,GAAG,YAAY,KAAK;IAC/B,SAAS;GACV,CAAA,CAEA;EACF,CAAA,CAAA;;AAET"}
@@ -0,0 +1,35 @@
1
+ import { ComponentPropsWithRef, Key, ReactNode } from "react";
2
+ //#region src/components/molecules/timeline.d.ts
3
+ export interface Timestamp {
4
+ /** Caller-formatted text. No locale or timezone conversion is performed. */
5
+ label: ReactNode;
6
+ /** A valid HTML time value, such as an ISO date or timestamp. */
7
+ dateTime?: string;
8
+ }
9
+ export interface Item {
10
+ key: Key;
11
+ title: ReactNode;
12
+ description?: ReactNode;
13
+ timestamp?: Timestamp;
14
+ /** Decorative marker treatment. Include meaningful status in the event text. */
15
+ status?: 'neutral' | 'primary' | 'error';
16
+ /** Decorative content, such as an icon; do not supply interactive elements. */
17
+ marker?: ReactNode;
18
+ }
19
+ export interface Props extends Omit<ComponentPropsWithRef<'ol'>, 'children' | 'reversed' | 'start' | 'type'> {
20
+ /** Events render in this order; the component does not sort by timestamp. */
21
+ items: readonly Item[];
22
+ classNames?: {
23
+ item?: string;
24
+ marker?: string;
25
+ connector?: string;
26
+ content?: string;
27
+ title?: string;
28
+ description?: string;
29
+ timestamp?: string;
30
+ };
31
+ }
32
+ declare const Timeline: ({ items, className, classNames, ...props }: Props) => import("react").JSX.Element;
33
+ //#endregion
34
+ export { Timeline as default };
35
+ //# sourceMappingURL=Timeline.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Timeline.d.mts","names":[],"sources":["../src/components/molecules/timeline.tsx"],"mappings":";;iBAIiB;;EAEf,OAAO;;EAEP;;iBAGe;EACf,KAAK;EACL,OAAO;EACP,cAAc;EACd,YAAY;;EAEZ;;EAEA,SAAS;;iBAGM,cAAc,KAC7B;;EAIA,gBAAgB;EAChB;IACE;IACA;IACA;IACA;IACA;IACA;IACA;;;cAIE,aAAY,OAAA,WAAA,eAAA,SAA4C,0BAAK,IAAA"}
@@ -0,0 +1,59 @@
1
+ import { cn } from "./utils.mjs";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ //#region src/components/molecules/timeline.tsx
4
+ const Timeline = ({ items, className, classNames, ...props }) => {
5
+ return /* @__PURE__ */ jsx("ol", {
6
+ ...props,
7
+ "data-slot": "timeline",
8
+ role: "list",
9
+ className: cn("text-foreground m-0 w-full min-w-0 list-none p-0", className),
10
+ children: items.map((item, index) => {
11
+ const TimestampElement = item.timestamp?.dateTime ? "time" : "span";
12
+ return /* @__PURE__ */ jsxs("li", {
13
+ "data-slot": "timeline-item",
14
+ "data-status": item.status ?? "neutral",
15
+ className: cn("relative m-0 flex min-w-0 gap-3", index < items.length - 1 && "pb-6", classNames?.item),
16
+ children: [/* @__PURE__ */ jsxs("div", {
17
+ "aria-hidden": "true",
18
+ className: "relative w-5 shrink-0",
19
+ children: [/* @__PURE__ */ jsx("span", {
20
+ "data-slot": "timeline-marker",
21
+ className: cn(`border-border bg-background text-muted-foreground relative
22
+ z-10 flex size-5 items-center justify-center rounded-full
23
+ border-2 [&>svg]:size-3`, item.status === "primary" && "border-primary text-primary", item.status === "error" && "border-destructive text-destructive", classNames?.marker),
24
+ children: item.marker
25
+ }), index < items.length - 1 && /* @__PURE__ */ jsx("span", {
26
+ "data-slot": "timeline-connector",
27
+ className: cn(`bg-border absolute start-[calc(50%-0.5px)] top-5 -bottom-6
28
+ w-px`, classNames?.connector)
29
+ })]
30
+ }), /* @__PURE__ */ jsxs("div", {
31
+ "data-slot": "timeline-content",
32
+ className: cn("min-w-0 flex-1 text-sm [overflow-wrap:anywhere]", classNames?.content),
33
+ children: [
34
+ /* @__PURE__ */ jsx("div", {
35
+ "data-slot": "timeline-title",
36
+ className: cn("leading-5 font-medium", classNames?.title),
37
+ children: item.title
38
+ }),
39
+ item.timestamp != null && /* @__PURE__ */ jsx(TimestampElement, {
40
+ "data-slot": "timeline-timestamp",
41
+ dateTime: TimestampElement === "time" ? item.timestamp.dateTime : void 0,
42
+ className: cn("text-muted-foreground mt-1 block text-xs", classNames?.timestamp),
43
+ children: item.timestamp.label
44
+ }),
45
+ item.description != null && /* @__PURE__ */ jsx("div", {
46
+ "data-slot": "timeline-description",
47
+ className: cn("text-muted-foreground mt-2", classNames?.description),
48
+ children: item.description
49
+ })
50
+ ]
51
+ })]
52
+ }, item.key);
53
+ })
54
+ });
55
+ };
56
+ //#endregion
57
+ export { Timeline as default };
58
+
59
+ //# sourceMappingURL=Timeline.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Timeline.mjs","names":[],"sources":["../src/components/molecules/timeline.tsx"],"sourcesContent":["import type { ComponentPropsWithRef, Key, ReactNode } from 'react';\n\nimport { cn } from '@repo/ui/utils';\n\nexport interface Timestamp {\n /** Caller-formatted text. No locale or timezone conversion is performed. */\n label: ReactNode;\n /** A valid HTML time value, such as an ISO date or timestamp. */\n dateTime?: string;\n}\n\nexport interface Item {\n key: Key;\n title: ReactNode;\n description?: ReactNode;\n timestamp?: Timestamp;\n /** Decorative marker treatment. Include meaningful status in the event text. */\n status?: 'neutral' | 'primary' | 'error';\n /** Decorative content, such as an icon; do not supply interactive elements. */\n marker?: ReactNode;\n}\n\nexport interface Props extends Omit<\n ComponentPropsWithRef<'ol'>,\n 'children' | 'reversed' | 'start' | 'type'\n> {\n /** Events render in this order; the component does not sort by timestamp. */\n items: readonly Item[];\n classNames?: {\n item?: string;\n marker?: string;\n connector?: string;\n content?: string;\n title?: string;\n description?: string;\n timestamp?: string;\n };\n}\n\nconst Timeline = ({ items, className, classNames, ...props }: Props) => {\n return (\n <ol\n {...props}\n data-slot=\"timeline\"\n role=\"list\"\n className={cn(\n 'text-foreground m-0 w-full min-w-0 list-none p-0',\n className, //\n )}\n >\n {items.map((item, index) => {\n const TimestampElement = item.timestamp?.dateTime ? 'time' : 'span';\n\n return (\n <li\n key={item.key}\n data-slot=\"timeline-item\"\n data-status={item.status ?? 'neutral'}\n className={cn(\n 'relative m-0 flex min-w-0 gap-3',\n index < items.length - 1 && 'pb-6',\n classNames?.item, //\n )}\n >\n <div aria-hidden=\"true\" className=\"relative w-5 shrink-0\">\n <span\n data-slot=\"timeline-marker\"\n className={cn(\n `border-border bg-background text-muted-foreground relative\n z-10 flex size-5 items-center justify-center rounded-full\n border-2 [&>svg]:size-3`,\n item.status === 'primary' && 'border-primary text-primary',\n item.status === 'error' &&\n 'border-destructive text-destructive',\n classNames?.marker, //\n )}\n >\n {item.marker}\n </span>\n {index < items.length - 1 && (\n <span\n data-slot=\"timeline-connector\"\n className={cn(\n `bg-border absolute start-[calc(50%-0.5px)] top-5 -bottom-6\n w-px`,\n classNames?.connector, //\n )}\n />\n )}\n </div>\n <div\n data-slot=\"timeline-content\"\n className={cn(\n 'min-w-0 flex-1 text-sm [overflow-wrap:anywhere]',\n classNames?.content, //\n )}\n >\n <div\n data-slot=\"timeline-title\"\n className={cn(\n 'leading-5 font-medium',\n classNames?.title, //\n )}\n >\n {item.title}\n </div>\n {item.timestamp != null && (\n <TimestampElement\n data-slot=\"timeline-timestamp\"\n dateTime={\n TimestampElement === 'time'\n ? item.timestamp.dateTime\n : undefined\n }\n className={cn(\n 'text-muted-foreground mt-1 block text-xs',\n classNames?.timestamp, //\n )}\n >\n {item.timestamp.label}\n </TimestampElement>\n )}\n {item.description != null && (\n <div\n data-slot=\"timeline-description\"\n className={cn(\n 'text-muted-foreground mt-2',\n classNames?.description, //\n )}\n >\n {item.description}\n </div>\n )}\n </div>\n </li>\n );\n })}\n </ol>\n );\n};\n\nexport default Timeline;\n"],"mappings":";;;AAuCA,MAAM,YAAY,EAAE,OAAO,WAAW,YAAY,GAAG,YAAmB;CACtE,OACE,oBAAC,MAAD;EACE,GAAI;EACJ,aAAU;EACV,MAAK;EACL,WAAW,GACT,oDACA,SACF;EAEC,UAAA,MAAM,KAAK,MAAM,UAAU;GAC1B,MAAM,mBAAmB,KAAK,WAAW,WAAW,SAAS;GAE7D,OACE,qBAAC,MAAD;IAEE,aAAU;IACV,eAAa,KAAK,UAAU;IAC5B,WAAW,GACT,mCACA,QAAQ,MAAM,SAAS,KAAK,QAC5B,YAAY,IACd;IARF,UAAA,CAUE,qBAAC,OAAD;KAAK,eAAY;KAAO,WAAU;KAAlC,UAAA,CACE,oBAAC,QAAD;MACE,aAAU;MACV,WAAW,GACT;;4CAGA,KAAK,WAAW,aAAa,+BAC7B,KAAK,WAAW,WACd,uCACF,YAAY,MACd;MAEC,UAAA,KAAK;KACF,CAAA,GACL,QAAQ,MAAM,SAAS,KACtB,oBAAC,QAAD;MACE,aAAU;MACV,WAAW,GACT;2BAEA,YAAY,SACd;KACD,CAAA,CAEA;IACL,CAAA,GAAA,qBAAC,OAAD;KACE,aAAU;KACV,WAAW,GACT,mDACA,YAAY,OACd;KALF,UAAA;MAOE,oBAAC,OAAD;OACE,aAAU;OACV,WAAW,GACT,yBACA,YAAY,KACd;OAEC,UAAA,KAAK;MACH,CAAA;MACJ,KAAK,aAAa,QACjB,oBAAC,kBAAD;OACE,aAAU;OACV,UACE,qBAAqB,SACjB,KAAK,UAAU,WACf,KAAA;OAEN,WAAW,GACT,4CACA,YAAY,SACd;OAEC,UAAA,KAAK,UAAU;MACA,CAAA;MAEnB,KAAK,eAAe,QACnB,oBAAC,OAAD;OACE,aAAU;OACV,WAAW,GACT,8BACA,YAAY,WACd;OAEC,UAAA,KAAK;MACH,CAAA;KAEJ;IACH,CAAA,CAAA;GA/EG,GAAA,KAAK,GA+ER;EAER,CAAC;CACC,CAAA;AAER"}