@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
@@ -0,0 +1,64 @@
1
+ "use client";
2
+ import { cn } from "./utils.mjs";
3
+ import { useConfig } from "./providers/config/context.mjs";
4
+ import { Calendar as Calendar$1, CalendarDayButton } from "./core/calendar.mjs";
5
+ import { createContext, useContext } from "react";
6
+ import { useControllableState } from "@jbpark/use-hooks";
7
+ import { jsx, jsxs } from "react/jsx-runtime";
8
+ //#region src/components/organisms/calendar.tsx
9
+ const CellContext = createContext(void 0);
10
+ function DayButton(props) {
11
+ const renderDate = useContext(CellContext);
12
+ return /* @__PURE__ */ jsxs(CalendarDayButton, {
13
+ ...props,
14
+ children: [props.children, renderDate && /* @__PURE__ */ jsx("span", {
15
+ "aria-hidden": "true",
16
+ className: "max-w-full text-xs",
17
+ children: renderDate(props.day.date)
18
+ })]
19
+ });
20
+ }
21
+ const Calendar = ({ value, defaultValue, onChange, month, defaultMonth, onMonthChange, disabledDate, minDate, maxDate, locale, weekStartsOn, expanded = false, renderDate, className, classNames, dir, ...props }) => {
22
+ const { direction } = useConfig();
23
+ const [selected, setSelected] = useControllableState({
24
+ value,
25
+ defaultValue,
26
+ onChange: (date) => onChange?.(date ?? void 0)
27
+ });
28
+ const [visibleMonth, setVisibleMonth] = useControllableState({
29
+ value: month,
30
+ defaultValue: defaultMonth ?? value ?? defaultValue ?? /* @__PURE__ */ new Date(),
31
+ onChange: onMonthChange
32
+ });
33
+ const disabled = [
34
+ ...disabledDate ? [disabledDate] : [],
35
+ ...minDate ? [{ before: minDate }] : [],
36
+ ...maxDate ? [{ after: maxDate }] : []
37
+ ];
38
+ return /* @__PURE__ */ jsx("div", {
39
+ ...props,
40
+ "data-slot": "calendar",
41
+ dir: dir ?? direction,
42
+ className: cn("min-w-0", className),
43
+ children: /* @__PURE__ */ jsx(CellContext, {
44
+ value: renderDate,
45
+ children: /* @__PURE__ */ jsx(Calendar$1, {
46
+ mode: "single",
47
+ selected: selected ?? void 0,
48
+ onSelect: (date) => setSelected(date ?? null),
49
+ month: visibleMonth,
50
+ onMonthChange: setVisibleMonth,
51
+ disabled,
52
+ locale,
53
+ weekStartsOn,
54
+ dir: dir ?? direction,
55
+ components: { DayButton },
56
+ className: cn(expanded && "w-full [--cell-size:3.5rem] [&_.rdp-month]:w-full", classNames?.calendar)
57
+ })
58
+ })
59
+ });
60
+ };
61
+ //#endregion
62
+ export { Calendar as default };
63
+
64
+ //# sourceMappingURL=Calendar.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Calendar.mjs","names":["calendar.CalendarDayButton","calendar.Calendar"],"sources":["../src/components/organisms/calendar.tsx"],"sourcesContent":["'use client';\n\nimport {\n type ComponentProps,\n type ReactNode,\n createContext,\n useContext,\n} from 'react';\n\nimport { useControllableState } from '@jbpark/use-hooks';\n\nimport { useConfig } from '@repo/ui/providers';\nimport { cn } from '@repo/ui/utils';\n\nimport { calendar } from '../../core';\n\ntype CellRenderer = (date: Date) => ReactNode;\nconst CellContext = createContext<CellRenderer | undefined>(undefined);\n\nfunction DayButton(props: ComponentProps<typeof calendar.CalendarDayButton>) {\n const renderDate = useContext(CellContext);\n\n return (\n <calendar.CalendarDayButton {...props}>\n {props.children}\n {renderDate && (\n <span aria-hidden=\"true\" className=\"max-w-full text-xs\">\n {renderDate(props.day.date)}\n </span>\n )}\n </calendar.CalendarDayButton>\n );\n}\n\nexport interface Props extends Omit<\n ComponentProps<'div'>,\n 'onChange' | 'children' | 'defaultValue'\n> {\n /** Pass null for an explicitly empty controlled selection. */\n value?: Date | null;\n defaultValue?: Date;\n onChange?: (date: Date | undefined) => void;\n month?: Date;\n defaultMonth?: Date;\n onMonthChange?: (month: Date) => void;\n disabledDate?: (date: Date) => boolean;\n minDate?: Date;\n maxDate?: Date;\n locale?: ComponentProps<typeof calendar.Calendar>['locale'];\n weekStartsOn?: ComponentProps<typeof calendar.Calendar>['weekStartsOn'];\n expanded?: boolean;\n renderDate?: CellRenderer;\n classNames?: { calendar?: string };\n}\n\nconst Calendar = ({\n value,\n defaultValue,\n onChange,\n month,\n defaultMonth,\n onMonthChange,\n disabledDate,\n minDate,\n maxDate,\n locale,\n weekStartsOn,\n expanded = false,\n renderDate,\n className,\n classNames,\n dir,\n ...props\n}: Props) => {\n const { direction } = useConfig();\n const [selected, setSelected] = useControllableState<Date | null | undefined>(\n {\n value,\n defaultValue,\n onChange: date => onChange?.(date ?? undefined),\n },\n );\n const [visibleMonth, setVisibleMonth] = useControllableState<Date>({\n value: month,\n defaultValue: defaultMonth ?? value ?? defaultValue ?? new Date(),\n onChange: onMonthChange,\n });\n const disabled = [\n ...(disabledDate ? [disabledDate] : []),\n ...(minDate ? [{ before: minDate }] : []),\n ...(maxDate ? [{ after: maxDate }] : []),\n ];\n\n return (\n <div\n {...props}\n data-slot=\"calendar\"\n dir={dir ?? direction}\n className={cn(\n 'min-w-0',\n className,\n //\n )}\n >\n <CellContext value={renderDate}>\n <calendar.Calendar\n mode=\"single\"\n selected={selected ?? undefined}\n onSelect={date => setSelected(date ?? null)}\n month={visibleMonth}\n onMonthChange={setVisibleMonth}\n disabled={disabled}\n locale={locale}\n weekStartsOn={weekStartsOn}\n dir={dir ?? direction}\n components={{ DayButton }}\n className={cn(\n expanded && 'w-full [--cell-size:3.5rem] [&_.rdp-month]:w-full',\n classNames?.calendar,\n //\n )}\n />\n </CellContext>\n </div>\n );\n};\n\nexport default Calendar;\n"],"mappings":";;;;;;;;AAiBA,MAAM,cAAc,cAAwC,KAAA,CAAS;AAErE,SAAS,UAAU,OAA0D;CAC3E,MAAM,aAAa,WAAW,WAAW;CAEzC,OACE,qBAACA,mBAAD;EAA4B,GAAI;EAAhC,UAAA,CACG,MAAM,UACN,cACC,oBAAC,QAAD;GAAM,eAAY;GAAO,WAAU;GAChC,UAAA,WAAW,MAAM,IAAI,IAAI;EACtB,CAAA,CAEkB;;AAEhC;AAuBA,MAAM,YAAY,EAChB,OACA,cACA,UACA,OACA,cACA,eACA,cACA,SACA,SACA,QACA,cACA,WAAW,OACX,YACA,WACA,YACA,KACA,GAAG,YACQ;CACX,MAAM,EAAE,cAAc,UAAU;CAChC,MAAM,CAAC,UAAU,eAAe,qBAC9B;EACE;EACA;EACA,WAAU,SAAQ,WAAW,QAAQ,KAAA,CAAS;CAChD,CACF;CACA,MAAM,CAAC,cAAc,mBAAmB,qBAA2B;EACjE,OAAO;EACP,cAAc,gBAAgB,SAAS,gCAAgB,IAAI,KAAK;EAChE,UAAU;CACZ,CAAC;CACD,MAAM,WAAW;EACf,GAAI,eAAe,CAAC,YAAY,IAAI,CAAC;EACrC,GAAI,UAAU,CAAC,EAAE,QAAQ,QAAQ,CAAC,IAAI,CAAC;EACvC,GAAI,UAAU,CAAC,EAAE,OAAO,QAAQ,CAAC,IAAI,CAAC;CACxC;CAEA,OACE,oBAAC,OAAD;EACE,GAAI;EACJ,aAAU;EACV,KAAK,OAAO;EACZ,WAAW,GACT,WACA,SAEF;EAEA,UAAA,oBAAC,aAAD;GAAa,OAAO;GAClB,UAAA,oBAACC,YAAD;IACE,MAAK;IACL,UAAU,YAAY,KAAA;IACtB,WAAU,SAAQ,YAAY,QAAQ,IAAI;IAC1C,OAAO;IACP,eAAe;IACL;IACF;IACM;IACd,KAAK,OAAO;IACZ,YAAY,EAAE,UAAU;IACxB,WAAW,GACT,YAAY,qDACZ,YAAY,QAEd;GACD,CAAA;EACU,CAAA;CACV,CAAA;AAET"}
package/dist/Card.d.mts CHANGED
@@ -1,5 +1,5 @@
1
1
  //#region src/components/molecules/card.d.ts
2
- interface Props extends Omit<React.ComponentPropsWithRef<'div'>, 'title'> {
2
+ export interface Props extends Omit<React.ComponentPropsWithRef<'div'>, 'title'> {
3
3
  title?: React.ReactNode;
4
4
  variant?: 'outlined' | 'borderless';
5
5
  classNames?: {
@@ -9,5 +9,5 @@ interface Props extends Omit<React.ComponentPropsWithRef<'div'>, 'title'> {
9
9
  }
10
10
  declare const Card: ({ title, children, className, classNames, variant, ...props }: Props) => import("react").JSX.Element;
11
11
  //#endregion
12
- export { Props, Card as default };
12
+ export { Card as default };
13
13
  //# sourceMappingURL=Card.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Card.d.mts","names":[],"sources":["../src/components/molecules/card.tsx"],"mappings":";UAEiB,cAAc,KAC7B,MAAM;EAGN,QAAQ,MAAM;EACd;EACA;IACE;IACA;;;cAIE,SAAQ,OAAA,UAAA,WAAA,YAAA,YAAA,SAOX,0BAAK,IAAA"}
1
+ {"version":3,"file":"Card.d.mts","names":[],"sources":["../src/components/molecules/card.tsx"],"mappings":";iBAEiB,cAAc,KAC7B,MAAM;EAGN,QAAQ,MAAM;EACd;EACA;IACE;IACA;;;cAIE,SAAQ,OAAA,UAAA,WAAA,YAAA,YAAA,SAOX,0BAAK,IAAA"}
@@ -0,0 +1,34 @@
1
+ import { ComponentPropsWithRef } from "react";
2
+ //#region src/components/atoms/cascader.d.ts
3
+ export interface Option {
4
+ /** Unique among siblings. Values can repeat under different parents. */
5
+ value: string;
6
+ label: string;
7
+ disabled?: boolean;
8
+ /** Missing or empty children make this option a selectable leaf. */
9
+ children?: readonly Option[];
10
+ }
11
+ export interface Props extends Omit<ComponentPropsWithRef<'div'>, 'children' | 'value' | 'defaultValue' | 'onChange'> {
12
+ options: readonly Option[];
13
+ value?: readonly string[];
14
+ defaultValue?: readonly string[];
15
+ onChange?: (path: string[]) => void;
16
+ disabled?: boolean;
17
+ allowClear?: boolean;
18
+ placeholder?: string;
19
+ backLabel?: string;
20
+ clearLabel?: string;
21
+ emptyText?: string;
22
+ getLevelLabel?: (level: number) => string;
23
+ classNames?: {
24
+ trigger?: string;
25
+ popup?: string;
26
+ breadcrumb?: string;
27
+ select?: string;
28
+ clear?: string;
29
+ };
30
+ }
31
+ declare const Cascader: ({ options, value, defaultValue, onChange, disabled, allowClear, placeholder, backLabel, clearLabel, emptyText, getLevelLabel, className, classNames, dir, "aria-label": ariaLabel, "aria-labelledby": ariaLabelledBy, "aria-describedby": ariaDescribedBy, ...props }: Props) => import("react").JSX.Element;
32
+ //#endregion
33
+ export { Cascader as default };
34
+ //# sourceMappingURL=Cascader.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Cascader.d.mts","names":[],"sources":["../src/components/atoms/cascader.tsx"],"mappings":";;iBAciB;;EAEf;EACA;EACA;;EAEA,oBAAoB;;iBAGL,cAAc,KAC7B;EAGA,kBAAkB;EAClB;EACA;EACA,YAAY;EACZ;EACA;EACA;EACA;EACA;EACA;EACA,iBAAiB;EACjB;IACE;IACA;IACA;IACA;IACA;;;cAwBE,aAAY,SAAA,OAAA,cAAA,UAAA,UAAA,YAAA,aAAA,WAAA,YAAA,WAAA,eAAA,WAAA,YAAA,mBAAA,8BAAA,oCAAA,oBAAA,SAmBf,0BAAK,IAAA"}
@@ -0,0 +1,144 @@
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 Popover from "./components/atoms/popover.mjs";
6
+ import Select from "./components/atoms/select.mjs";
7
+ import { useId, useState } from "react";
8
+ import { DirectionProvider } from "@base-ui/react/direction-provider";
9
+ import { jsx, jsxs } from "react/jsx-runtime";
10
+ import { ChevronDown, X } from "lucide-react";
11
+ //#region src/components/atoms/cascader.tsx
12
+ const resolvePath = (options, path) => {
13
+ const result = [];
14
+ let siblings = options;
15
+ for (const value of path) {
16
+ const option = siblings.find((item) => item.value === value && !item.disabled);
17
+ if (!option) break;
18
+ result.push(option);
19
+ siblings = option.children ?? [];
20
+ }
21
+ return result;
22
+ };
23
+ const Cascader = ({ options, value, defaultValue = [], onChange, disabled = false, allowClear = true, placeholder = "Choose a path", backLabel = "Back", clearLabel = "Clear selection", emptyText = "No options", getLevelLabel = (level) => `Level ${level}`, className, classNames, dir, "aria-label": ariaLabel, "aria-labelledby": ariaLabelledBy, "aria-describedby": ariaDescribedBy, ...props }) => {
24
+ const [internalValue, setInternalValue] = useState(defaultValue);
25
+ const [isOpen, setIsOpen] = useState(false);
26
+ const [browsePath, setBrowsePath] = useState([]);
27
+ const selectedPath = value ?? internalValue;
28
+ const selectedNodes = resolvePath(options, selectedPath);
29
+ const lastSelected = selectedNodes.at(-1);
30
+ const hasSelection = selectedPath.length > 0 && selectedNodes.length === selectedPath.length && !lastSelected?.children?.length;
31
+ const selectedText = hasSelection ? selectedNodes.map((node) => node.label).join(" / ") : placeholder;
32
+ const resolvedBrowse = resolvePath(options, browsePath);
33
+ const activeNodes = resolvedBrowse.length === browsePath.length && (browsePath.length === 0 || resolvedBrowse.at(-1)?.children?.length) ? resolvedBrowse : [];
34
+ const activePath = activeNodes.map((node) => node.value);
35
+ const currentOptions = activeNodes.at(-1)?.children ?? options;
36
+ const level = activePath.length + 1;
37
+ const { direction } = useConfig();
38
+ const resolvedDirection = dir === "ltr" || dir === "rtl" ? dir : direction;
39
+ const statusId = useId();
40
+ const commit = (path) => {
41
+ if (disabled) return;
42
+ if (value === void 0) setInternalValue(path);
43
+ if (path.length !== selectedPath.length || path.some((part, index) => part !== selectedPath[index])) onChange?.(path);
44
+ setIsOpen(false);
45
+ };
46
+ const changeOpen = (open) => {
47
+ if (open && disabled) return;
48
+ if (open) setBrowsePath(hasSelection ? [...selectedPath.slice(0, -1)] : []);
49
+ setIsOpen(open);
50
+ };
51
+ return /* @__PURE__ */ jsx(DirectionProvider, {
52
+ direction: resolvedDirection,
53
+ children: /* @__PURE__ */ jsxs("div", {
54
+ ...props,
55
+ "data-slot": "cascader",
56
+ dir: dir ?? resolvedDirection,
57
+ className: cn("flex w-full min-w-0 items-center gap-1", className),
58
+ children: [
59
+ /* @__PURE__ */ jsx(Popover, {
60
+ open: isOpen && !disabled,
61
+ onOpenChange: changeOpen,
62
+ placement: "bottomLeft",
63
+ title: ariaLabel ?? placeholder,
64
+ dir: resolvedDirection,
65
+ className: cn("w-72 max-w-[calc(100vw-2rem)] p-3", classNames?.popup),
66
+ content: /* @__PURE__ */ jsxs("div", {
67
+ "data-slot": "cascader-panel",
68
+ className: "min-w-0 space-y-3",
69
+ children: [
70
+ /* @__PURE__ */ jsx("div", {
71
+ "data-slot": "cascader-breadcrumb",
72
+ "aria-live": "polite",
73
+ className: cn("text-muted-foreground text-sm [overflow-wrap:anywhere]", classNames?.breadcrumb),
74
+ children: activeNodes.length ? activeNodes.map((node) => node.label).join(" / ") : getLevelLabel(1)
75
+ }),
76
+ activePath.length > 0 && /* @__PURE__ */ jsx(Button, {
77
+ variant: "text",
78
+ size: "small",
79
+ onClick: () => setBrowsePath(activePath.slice(0, -1)),
80
+ children: backLabel
81
+ }),
82
+ currentOptions.length ? /* @__PURE__ */ jsx(Select, {
83
+ value: null,
84
+ dir: resolvedDirection,
85
+ "aria-label": getLevelLabel(level),
86
+ placeholder: getLevelLabel(level),
87
+ className: cn("w-full max-w-full", classNames?.select),
88
+ options: currentOptions.map((option) => ({
89
+ label: option.label,
90
+ value: option.value,
91
+ disabled: option.disabled
92
+ })),
93
+ onChange: (next) => {
94
+ const option = currentOptions.find((item) => item.value === next && !item.disabled);
95
+ if (!option) return;
96
+ const path = [...activePath, option.value];
97
+ if (option.children?.length) setBrowsePath(path);
98
+ else commit(path);
99
+ }
100
+ }) : /* @__PURE__ */ jsx("p", {
101
+ className: "text-muted-foreground m-0 text-sm",
102
+ children: emptyText
103
+ })
104
+ ]
105
+ }),
106
+ children: /* @__PURE__ */ jsxs(Button, {
107
+ disabled,
108
+ "aria-label": ariaLabel,
109
+ "aria-labelledby": ariaLabelledBy,
110
+ "aria-describedby": [ariaDescribedBy, statusId].filter(Boolean).join(" "),
111
+ className: cn("min-w-0 flex-1 justify-between", classNames?.trigger),
112
+ children: [/* @__PURE__ */ jsx("span", {
113
+ className: "truncate",
114
+ children: selectedText
115
+ }), /* @__PURE__ */ jsx(ChevronDown, {
116
+ "aria-hidden": "true",
117
+ className: "size-4 shrink-0"
118
+ })]
119
+ })
120
+ }),
121
+ allowClear && selectedPath.length > 0 && /* @__PURE__ */ jsx(Button, {
122
+ variant: "text",
123
+ size: "small",
124
+ disabled,
125
+ "aria-label": clearLabel,
126
+ icon: /* @__PURE__ */ jsx(X, {}),
127
+ onClick: () => commit([]),
128
+ className: cn("shrink-0", classNames?.clear)
129
+ }),
130
+ /* @__PURE__ */ jsx("span", {
131
+ id: statusId,
132
+ "data-slot": "cascader-status",
133
+ className: "sr-only",
134
+ "aria-live": "polite",
135
+ children: selectedText
136
+ })
137
+ ]
138
+ })
139
+ });
140
+ };
141
+ //#endregion
142
+ export { Cascader as default };
143
+
144
+ //# sourceMappingURL=Cascader.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Cascader.mjs","names":[],"sources":["../src/components/atoms/cascader.tsx"],"sourcesContent":["'use client';\n\nimport { type ComponentPropsWithRef, useId, useState } from 'react';\n\nimport { DirectionProvider } from '@base-ui/react/direction-provider';\nimport { ChevronDown, X } from 'lucide-react';\n\nimport { useConfig } from '@repo/ui/providers';\nimport { cn } from '@repo/ui/utils';\n\nimport Button from './button';\nimport Popover from './popover';\nimport Select from './select';\n\nexport interface Option {\n /** Unique among siblings. Values can repeat under different parents. */\n value: string;\n label: string;\n disabled?: boolean;\n /** Missing or empty children make this option a selectable leaf. */\n children?: readonly Option[];\n}\n\nexport interface Props extends Omit<\n ComponentPropsWithRef<'div'>,\n 'children' | 'value' | 'defaultValue' | 'onChange'\n> {\n options: readonly Option[];\n value?: readonly string[];\n defaultValue?: readonly string[];\n onChange?: (path: string[]) => void;\n disabled?: boolean;\n allowClear?: boolean;\n placeholder?: string;\n backLabel?: string;\n clearLabel?: string;\n emptyText?: string;\n getLevelLabel?: (level: number) => string;\n classNames?: {\n trigger?: string;\n popup?: string;\n breadcrumb?: string;\n select?: string;\n clear?: string;\n };\n}\n\nconst resolvePath = (options: readonly Option[], path: readonly string[]) => {\n const result: Option[] = [];\n let siblings = options;\n\n for (const value of path) {\n const option = siblings.find(\n item => item.value === value && !item.disabled,\n );\n\n if (!option) {\n break;\n }\n\n result.push(option);\n siblings = option.children ?? [];\n }\n\n return result;\n};\n\nconst Cascader = ({\n options,\n value,\n defaultValue = [],\n onChange,\n disabled = false,\n allowClear = true,\n placeholder = 'Choose a path',\n backLabel = 'Back',\n clearLabel = 'Clear selection',\n emptyText = 'No options',\n getLevelLabel = level => `Level ${level}`,\n className,\n classNames,\n dir,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n 'aria-describedby': ariaDescribedBy,\n ...props\n}: Props) => {\n const [internalValue, setInternalValue] =\n useState<readonly string[]>(defaultValue);\n const [isOpen, setIsOpen] = useState(false);\n const [browsePath, setBrowsePath] = useState<string[]>([]);\n const selectedPath = value ?? internalValue;\n const selectedNodes = resolvePath(options, selectedPath);\n const lastSelected = selectedNodes.at(-1);\n const hasSelection =\n selectedPath.length > 0 &&\n selectedNodes.length === selectedPath.length &&\n !lastSelected?.children?.length;\n const selectedText = hasSelection\n ? selectedNodes.map(node => node.label).join(' / ')\n : placeholder;\n const resolvedBrowse = resolvePath(options, browsePath);\n const activeNodes =\n resolvedBrowse.length === browsePath.length &&\n (browsePath.length === 0 || resolvedBrowse.at(-1)?.children?.length)\n ? resolvedBrowse\n : [];\n const activePath = activeNodes.map(node => node.value);\n const currentOptions = activeNodes.at(-1)?.children ?? options;\n const level = activePath.length + 1;\n const { direction } = useConfig();\n const resolvedDirection = dir === 'ltr' || dir === 'rtl' ? dir : direction;\n const statusId = useId();\n\n const commit = (path: string[]) => {\n if (disabled) {\n return;\n }\n\n if (value === undefined) {\n setInternalValue(path);\n }\n\n if (\n path.length !== selectedPath.length ||\n path.some((part, index) => part !== selectedPath[index])\n ) {\n onChange?.(path);\n }\n\n setIsOpen(false);\n };\n\n const changeOpen = (open: boolean) => {\n if (open && disabled) {\n return;\n }\n\n if (open) {\n setBrowsePath(hasSelection ? [...selectedPath.slice(0, -1)] : []);\n }\n\n setIsOpen(open);\n };\n\n return (\n <DirectionProvider direction={resolvedDirection}>\n <div\n {...props}\n data-slot=\"cascader\"\n dir={dir ?? resolvedDirection}\n className={cn(\n 'flex w-full min-w-0 items-center gap-1',\n className, //\n )}\n >\n <Popover\n open={isOpen && !disabled}\n onOpenChange={changeOpen}\n placement=\"bottomLeft\"\n title={ariaLabel ?? placeholder}\n dir={resolvedDirection}\n className={cn(\n 'w-72 max-w-[calc(100vw-2rem)] p-3',\n classNames?.popup, //\n )}\n content={\n <div data-slot=\"cascader-panel\" className=\"min-w-0 space-y-3\">\n <div\n data-slot=\"cascader-breadcrumb\"\n aria-live=\"polite\"\n className={cn(\n 'text-muted-foreground text-sm [overflow-wrap:anywhere]',\n classNames?.breadcrumb, //\n )}\n >\n {activeNodes.length\n ? activeNodes.map(node => node.label).join(' / ')\n : getLevelLabel(1)}\n </div>\n {activePath.length > 0 && (\n <Button\n variant=\"text\"\n size=\"small\"\n onClick={() => setBrowsePath(activePath.slice(0, -1))}\n >\n {backLabel}\n </Button>\n )}\n {currentOptions.length ? (\n <Select\n value={null}\n dir={resolvedDirection}\n aria-label={getLevelLabel(level)}\n placeholder={getLevelLabel(level)}\n className={cn(\n 'w-full max-w-full',\n classNames?.select, //\n )}\n options={currentOptions.map(option => ({\n label: option.label,\n value: option.value,\n disabled: option.disabled,\n }))}\n onChange={next => {\n const option = currentOptions.find(\n item => item.value === next && !item.disabled,\n );\n\n if (!option) {\n return;\n }\n\n const path = [...activePath, option.value];\n\n if (option.children?.length) {\n setBrowsePath(path);\n } else {\n commit(path);\n }\n }}\n />\n ) : (\n <p className=\"text-muted-foreground m-0 text-sm\">{emptyText}</p>\n )}\n </div>\n }\n >\n <Button\n disabled={disabled}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n aria-describedby={[ariaDescribedBy, statusId]\n .filter(Boolean)\n .join(' ')}\n className={cn(\n 'min-w-0 flex-1 justify-between',\n classNames?.trigger, //\n )}\n >\n <span className=\"truncate\">{selectedText}</span>\n <ChevronDown aria-hidden=\"true\" className=\"size-4 shrink-0\" />\n </Button>\n </Popover>\n {allowClear && selectedPath.length > 0 && (\n <Button\n variant=\"text\"\n size=\"small\"\n disabled={disabled}\n aria-label={clearLabel}\n icon={<X />}\n onClick={() => commit([])}\n className={cn(\n 'shrink-0',\n classNames?.clear, //\n )}\n />\n )}\n <span\n id={statusId}\n data-slot=\"cascader-status\"\n className=\"sr-only\"\n aria-live=\"polite\"\n >\n {selectedText}\n </span>\n </div>\n </DirectionProvider>\n );\n};\n\nexport default Cascader;\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import CodeMirror, { Extension } from "@uiw/react-codemirror";
2
2
  //#region src/components/atoms/code-editor.d.ts
3
- interface Props extends Omit<React.ComponentProps<typeof CodeMirror>, 'value' | 'extensions' | 'onChange' | 'ref' | 'theme'> {
3
+ export interface Props extends Omit<React.ComponentProps<typeof CodeMirror>, 'value' | 'extensions' | 'onChange' | 'ref' | 'theme'> {
4
4
  value: string;
5
5
  /** Passed through to CodeMirror; `'100%'` fills the wrapper. */
6
6
  height?: string;
@@ -47,5 +47,5 @@ interface Props extends Omit<React.ComponentProps<typeof CodeMirror>, 'value' |
47
47
  }
48
48
  declare const CodeEditor: ({ value, theme, height, className, extensions: extraExtensions, diff, formatCode, onChange, onSave, onFormatError, ...props }: Props) => import("react").JSX.Element;
49
49
  //#endregion
50
- export { Props, CodeEditor as default };
50
+ export { CodeEditor as default };
51
51
  //# sourceMappingURL=CodeEditor.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"CodeEditor.d.mts","names":[],"sources":["../src/components/atoms/code-editor.tsx"],"mappings":";;UA2BiB,cAAc,KAC7B,MAAM,sBAAsB;EAG5B;;EAEA;;;;;;;;;;;EAWA,6CAA6C;;EAE7C,aAAa;;;;;;EAMb;IACE;IACA;;;;;;;;EAQF,cAAc,iBAAiB;EAC/B;EACA,YAAY;;EAEZ,UAAU;;;;;;;EAOV,iBAAiB;;cAGb,eAAc,OAAA,OAAA,QAAA,WAAA,YAAA,iBAAA,MAAA,YAAA,UAAA,QAAA,kBAAA,SAYjB,0BAAK,IAAA"}
1
+ {"version":3,"file":"CodeEditor.d.mts","names":[],"sources":["../src/components/atoms/code-editor.tsx"],"mappings":";;iBA2BiB,cAAc,KAC7B,MAAM,sBAAsB;EAG5B;;EAEA;;;;;;;;;;;EAWA,6CAA6C;;EAE7C,aAAa;;;;;;EAMb;IACE;IACA;;;;;;;;EAQF,cAAc,iBAAiB;EAC/B;EACA,YAAY;;EAEZ,UAAU;;;;;;;EAOV,iBAAiB;;cAGb,eAAc,OAAA,OAAA,QAAA,WAAA,YAAA,iBAAA,MAAA,YAAA,UAAA,QAAA,kBAAA,SAYjB,0BAAK,IAAA"}
@@ -0,0 +1,33 @@
1
+ import * as React$1 from "react";
2
+ import { ContextMenu as ContextMenu$1 } from "@base-ui/react/context-menu";
3
+ //#region src/components/molecules/context-menu.d.ts
4
+ export type Item = {
5
+ key: React$1.Key;
6
+ label: React$1.ReactNode;
7
+ disabled?: boolean;
8
+ type?: 'action';
9
+ onSelect?: () => void;
10
+ } | {
11
+ key: React$1.Key;
12
+ type: 'separator';
13
+ };
14
+ export interface Props extends Omit<React$1.ComponentProps<typeof ContextMenu$1.Root>, 'children'> {
15
+ children: React$1.ReactNode;
16
+ items: Item[];
17
+ onSelect?: (key: React$1.Key, item: Extract<Item, {
18
+ label: React$1.ReactNode;
19
+ }>) => void;
20
+ /** Visible action button for touch and discoverability; omit to hide it. */
21
+ actionLabel?: string;
22
+ triggerProps?: Omit<React$1.ComponentProps<typeof ContextMenu$1.Trigger>, 'children' | 'render' | 'ref'>;
23
+ classNames?: {
24
+ trigger?: string;
25
+ popup?: string;
26
+ item?: string;
27
+ separator?: string;
28
+ };
29
+ }
30
+ declare const ContextMenu: ({ children, items, onSelect, actionLabel, triggerProps, classNames, disabled, open, defaultOpen, onOpenChange, ...props }: Props) => React$1.JSX.Element;
31
+ //#endregion
32
+ export { ContextMenu as default };
33
+ //# sourceMappingURL=ContextMenu.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ContextMenu.d.mts","names":["React","BaseContextMenu"],"sources":["../src/components/molecules/context-menu.tsx"],"mappings":";;;YAcY;EAEN,KAAKA,QAAM;EACX,OAAOA,QAAM;EACb;EACA;EACA;;EAEA,KAAKA,QAAM;EAAK;;iBAEL,cAAc,KAC7BA,QAAM,sBAAsBC,cAAgB;EAG5C,UAAUD,QAAM;EAChB,OAAO;EACP,YACE,KAAKA,QAAM,KACX,MAAM,QAAQ;IAAQ,OAAOA,QAAM;;;EAGrC;EACA,eAAe,KACbA,QAAM,sBAAsBC,cAAgB;EAG9C;IACE;IACA;IACA;IACA;;;cAIE,gBAAe,UAAA,OAAA,UAAA,aAAA,cAAA,YAAA,UAAA,MAAA,aAAA,iBAAA,SAYlB,UAAKD,QAAA,IAAA"}
@@ -0,0 +1,92 @@
1
+ "use client";
2
+ import { cn } from "./utils.mjs";
3
+ import { useConfig } from "./providers/config/context.mjs";
4
+ import { OVERLAY_LAYER } from "./lib/z-layers.mjs";
5
+ import Button from "./Button.mjs";
6
+ import * as React$1 from "react";
7
+ import { DirectionProvider } from "@base-ui/react/direction-provider";
8
+ import { jsx, jsxs } from "react/jsx-runtime";
9
+ import { ContextMenu as ContextMenu$1 } from "@base-ui/react/context-menu";
10
+ import { Menu } from "@base-ui/react/menu";
11
+ //#region src/components/molecules/context-menu.tsx
12
+ const ContextMenu = ({ children, items, onSelect, actionLabel, triggerProps, classNames, disabled = false, open, defaultOpen = false, onOpenChange, ...props }) => {
13
+ const { getContainer, direction } = useConfig();
14
+ const triggerRef = React$1.useRef(null);
15
+ const actionRef = React$1.useRef(null);
16
+ const [isOpen, setIsOpen] = React$1.useState(defaultOpen);
17
+ const [source, setSource] = React$1.useState("context");
18
+ const hasActions = items.some((item) => item.type !== "separator");
19
+ const isInactive = disabled || !hasActions;
20
+ const resolvedOpen = open ?? isOpen;
21
+ const resolvedDirection = triggerProps?.dir === "rtl" || triggerProps?.dir === "ltr" ? triggerProps.dir : direction;
22
+ const handleOpenChange = (nextOpen, details, nextSource) => {
23
+ onOpenChange?.(nextOpen, details);
24
+ if (details.isCanceled) return;
25
+ if (nextOpen) setSource(nextSource);
26
+ setIsOpen(nextOpen);
27
+ };
28
+ const popup = /* @__PURE__ */ jsx(Menu.Portal, {
29
+ container: getContainer(),
30
+ children: /* @__PURE__ */ jsx(Menu.Positioner, {
31
+ sideOffset: 4,
32
+ className: OVERLAY_LAYER,
33
+ children: /* @__PURE__ */ jsx(Menu.Popup, {
34
+ "data-slot": "context-menu",
35
+ dir: resolvedDirection,
36
+ finalFocus: source === "context" ? triggerRef : actionRef,
37
+ className: cn(`bg-popover text-popover-foreground border-border
38
+ max-h-[var(--available-height)] max-w-[var(--available-width)]
39
+ min-w-40 overflow-auto rounded-md border p-1 shadow-md outline-none`, classNames?.popup),
40
+ children: items.map((item) => item.type === "separator" ? /* @__PURE__ */ jsx(Menu.Separator, { className: cn("bg-border my-1 h-px", classNames?.separator) }, item.key) : /* @__PURE__ */ jsx(Menu.Item, {
41
+ disabled: item.disabled,
42
+ className: cn(`data-highlighted:bg-accent
43
+ data-highlighted:text-accent-foreground cursor-default
44
+ rounded-sm px-3 py-2 text-sm break-words outline-none
45
+ data-disabled:opacity-50`, classNames?.item),
46
+ onClick: () => {
47
+ item.onSelect?.();
48
+ onSelect?.(item.key, item);
49
+ },
50
+ children: item.label
51
+ }, item.key))
52
+ })
53
+ })
54
+ });
55
+ return /* @__PURE__ */ jsxs(DirectionProvider, {
56
+ direction: resolvedDirection,
57
+ children: [/* @__PURE__ */ jsxs(ContextMenu$1.Root, {
58
+ ...props,
59
+ actionsRef: source === "context" ? props.actionsRef : void 0,
60
+ disabled: isInactive,
61
+ open: resolvedOpen && source === "context",
62
+ onOpenChange: (nextOpen, details) => handleOpenChange(nextOpen, details, "context"),
63
+ children: [/* @__PURE__ */ jsx(ContextMenu$1.Trigger, {
64
+ ...triggerProps,
65
+ ref: triggerRef,
66
+ "data-slot": "context-menu-trigger",
67
+ dir: triggerProps?.dir ?? resolvedDirection,
68
+ tabIndex: actionLabel ? -1 : triggerProps?.tabIndex ?? 0,
69
+ className: cn("focus-visible:ring-ring outline-none focus-visible:ring-2", classNames?.trigger, triggerProps?.className),
70
+ children
71
+ }), popup]
72
+ }), actionLabel && /* @__PURE__ */ jsxs(Menu.Root, {
73
+ ...props,
74
+ actionsRef: source === "action" ? props.actionsRef : void 0,
75
+ disabled: isInactive,
76
+ open: resolvedOpen && source === "action",
77
+ onOpenChange: (nextOpen, details) => handleOpenChange(nextOpen, details, "action"),
78
+ children: [/* @__PURE__ */ jsx(Menu.Trigger, {
79
+ ref: actionRef,
80
+ render: /* @__PURE__ */ jsx(Button, {
81
+ size: "small",
82
+ variant: "text"
83
+ }),
84
+ children: actionLabel
85
+ }), popup]
86
+ })]
87
+ });
88
+ };
89
+ //#endregion
90
+ export { ContextMenu as default };
91
+
92
+ //# sourceMappingURL=ContextMenu.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ContextMenu.mjs","names":["React","BaseMenu","BaseContextMenu"],"sources":["../src/components/molecules/context-menu.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\n\nimport { ContextMenu as BaseContextMenu } from '@base-ui/react/context-menu';\nimport { DirectionProvider } from '@base-ui/react/direction-provider';\nimport { Menu as BaseMenu } from '@base-ui/react/menu';\n\nimport { useConfig } from '@repo/ui/providers';\nimport { cn } from '@repo/ui/utils';\n\nimport { OVERLAY_LAYER } from '../../lib/z-layers';\nimport Button from '../atoms/button';\n\nexport type Item =\n | {\n key: React.Key;\n label: React.ReactNode;\n disabled?: boolean;\n type?: 'action';\n onSelect?: () => void;\n }\n | { key: React.Key; type: 'separator' };\n\nexport interface Props extends Omit<\n React.ComponentProps<typeof BaseContextMenu.Root>,\n 'children'\n> {\n children: React.ReactNode;\n items: Item[];\n onSelect?: (\n key: React.Key,\n item: Extract<Item, { label: React.ReactNode }>,\n ) => void;\n /** Visible action button for touch and discoverability; omit to hide it. */\n actionLabel?: string;\n triggerProps?: Omit<\n React.ComponentProps<typeof BaseContextMenu.Trigger>,\n 'children' | 'render' | 'ref'\n >;\n classNames?: {\n trigger?: string;\n popup?: string;\n item?: string;\n separator?: string;\n };\n}\n\nconst ContextMenu = ({\n children,\n items,\n onSelect,\n actionLabel,\n triggerProps,\n classNames,\n disabled = false,\n open,\n defaultOpen = false,\n onOpenChange,\n ...props\n}: Props) => {\n const { getContainer, direction } = useConfig();\n const triggerRef = React.useRef<HTMLDivElement>(null);\n const actionRef = React.useRef<HTMLButtonElement>(null);\n const [isOpen, setIsOpen] = React.useState(defaultOpen);\n const [source, setSource] = React.useState<'context' | 'action'>('context');\n const hasActions = items.some(item => item.type !== 'separator');\n const isInactive = disabled || !hasActions;\n const resolvedOpen = open ?? isOpen;\n const resolvedDirection =\n triggerProps?.dir === 'rtl' || triggerProps?.dir === 'ltr'\n ? triggerProps.dir\n : direction;\n const handleOpenChange = (\n nextOpen: boolean,\n details: Parameters<NonNullable<Props['onOpenChange']>>[1],\n nextSource: typeof source,\n ) => {\n onOpenChange?.(nextOpen, details);\n\n if (details.isCanceled) {\n return;\n }\n\n if (nextOpen) {\n setSource(nextSource);\n }\n\n setIsOpen(nextOpen);\n };\n\n const popup = (\n <BaseMenu.Portal container={getContainer()}>\n <BaseMenu.Positioner sideOffset={4} className={OVERLAY_LAYER}>\n <BaseMenu.Popup\n data-slot=\"context-menu\"\n dir={resolvedDirection}\n finalFocus={source === 'context' ? triggerRef : actionRef}\n className={cn(\n `bg-popover text-popover-foreground border-border\n max-h-[var(--available-height)] max-w-[var(--available-width)]\n min-w-40 overflow-auto rounded-md border p-1 shadow-md outline-none`,\n classNames?.popup,\n //\n )}\n >\n {items.map(item =>\n item.type === 'separator' ? (\n <BaseMenu.Separator\n key={item.key}\n className={cn(\n 'bg-border my-1 h-px',\n classNames?.separator,\n //\n )}\n />\n ) : (\n <BaseMenu.Item\n key={item.key}\n disabled={item.disabled}\n className={cn(\n `data-highlighted:bg-accent\n data-highlighted:text-accent-foreground cursor-default\n rounded-sm px-3 py-2 text-sm break-words outline-none\n data-disabled:opacity-50`,\n classNames?.item,\n //\n )}\n onClick={() => {\n item.onSelect?.();\n onSelect?.(item.key, item);\n }}\n >\n {item.label}\n </BaseMenu.Item>\n ),\n )}\n </BaseMenu.Popup>\n </BaseMenu.Positioner>\n </BaseMenu.Portal>\n );\n\n return (\n <DirectionProvider direction={resolvedDirection}>\n <BaseContextMenu.Root\n {...props}\n actionsRef={source === 'context' ? props.actionsRef : undefined}\n disabled={isInactive}\n open={resolvedOpen && source === 'context'}\n onOpenChange={(nextOpen, details) =>\n handleOpenChange(nextOpen, details, 'context')\n }\n >\n <BaseContextMenu.Trigger\n {...triggerProps}\n ref={triggerRef}\n data-slot=\"context-menu-trigger\"\n dir={triggerProps?.dir ?? resolvedDirection}\n tabIndex={actionLabel ? -1 : (triggerProps?.tabIndex ?? 0)}\n className={cn(\n 'focus-visible:ring-ring outline-none focus-visible:ring-2',\n classNames?.trigger,\n triggerProps?.className,\n //\n )}\n >\n {children}\n </BaseContextMenu.Trigger>\n {popup}\n </BaseContextMenu.Root>\n {actionLabel && (\n <BaseMenu.Root\n {...props}\n actionsRef={source === 'action' ? props.actionsRef : undefined}\n disabled={isInactive}\n open={resolvedOpen && source === 'action'}\n onOpenChange={(nextOpen, details) =>\n handleOpenChange(nextOpen, details, 'action')\n }\n >\n <BaseMenu.Trigger\n ref={actionRef}\n render={<Button size=\"small\" variant=\"text\" />}\n >\n {actionLabel}\n </BaseMenu.Trigger>\n {popup}\n </BaseMenu.Root>\n )}\n </DirectionProvider>\n );\n};\nexport default ContextMenu;\n"],"mappings":";;;;;;;;;;;AAgDA,MAAM,eAAe,EACnB,UACA,OACA,UACA,aACA,cACA,YACA,WAAW,OACX,MACA,cAAc,OACd,cACA,GAAG,YACQ;CACX,MAAM,EAAE,cAAc,cAAc,UAAU;CAC9C,MAAM,aAAaA,QAAM,OAAuB,IAAI;CACpD,MAAM,YAAYA,QAAM,OAA0B,IAAI;CACtD,MAAM,CAAC,QAAQ,aAAaA,QAAM,SAAS,WAAW;CACtD,MAAM,CAAC,QAAQ,aAAaA,QAAM,SAA+B,SAAS;CAC1E,MAAM,aAAa,MAAM,MAAK,SAAQ,KAAK,SAAS,WAAW;CAC/D,MAAM,aAAa,YAAY,CAAC;CAChC,MAAM,eAAe,QAAQ;CAC7B,MAAM,oBACJ,cAAc,QAAQ,SAAS,cAAc,QAAQ,QACjD,aAAa,MACb;CACN,MAAM,oBACJ,UACA,SACA,eACG;EACH,eAAe,UAAU,OAAO;EAEhC,IAAI,QAAQ,YACV;EAGF,IAAI,UACF,UAAU,UAAU;EAGtB,UAAU,QAAQ;CACpB;CAEA,MAAM,QACJ,oBAACC,KAAS,QAAV;EAAiB,WAAW,aAAa;EACvC,UAAA,oBAACA,KAAS,YAAV;GAAqB,YAAY;GAAG,WAAW;GAC7C,UAAA,oBAACA,KAAS,OAAV;IACE,aAAU;IACV,KAAK;IACL,YAAY,WAAW,YAAY,aAAa;IAChD,WAAW,GACT;;kFAGA,YAAY,KAEd;IAEC,UAAA,MAAM,KAAI,SACT,KAAK,SAAS,cACZ,oBAACA,KAAS,WAAV,EAEE,WAAW,GACT,uBACA,YAAY,SAEd,EACD,GANM,KAAK,GAMX,IAED,oBAACA,KAAS,MAAV;KAEE,UAAU,KAAK;KACf,WAAW,GACT;;;+CAIA,YAAY,IAEd;KACA,eAAe;MACb,KAAK,WAAW;MAChB,WAAW,KAAK,KAAK,IAAI;KAC3B;KAEC,UAAA,KAAK;IACO,GAhBR,KAAK,GAgBG,CAEnB;GACc,CAAA;EACG,CAAA;CACN,CAAA;CAGnB,OACE,qBAAC,mBAAD;EAAmB,WAAW;EAA9B,UAAA,CACE,qBAACC,cAAgB,MAAjB;GACE,GAAI;GACJ,YAAY,WAAW,YAAY,MAAM,aAAa,KAAA;GACtD,UAAU;GACV,MAAM,gBAAgB,WAAW;GACjC,eAAe,UAAU,YACvB,iBAAiB,UAAU,SAAS,SAAS;GANjD,UAAA,CASE,oBAACA,cAAgB,SAAjB;IACE,GAAI;IACJ,KAAK;IACL,aAAU;IACV,KAAK,cAAc,OAAO;IAC1B,UAAU,cAAc,KAAM,cAAc,YAAY;IACxD,WAAW,GACT,6DACA,YAAY,SACZ,cAAc,SAEhB;IAEC;GACsB,CAAA,GACxB,KACmB;EACrB,CAAA,GAAA,eACC,qBAACD,KAAS,MAAV;GACE,GAAI;GACJ,YAAY,WAAW,WAAW,MAAM,aAAa,KAAA;GACrD,UAAU;GACV,MAAM,gBAAgB,WAAW;GACjC,eAAe,UAAU,YACvB,iBAAiB,UAAU,SAAS,QAAQ;GANhD,UAAA,CASE,oBAACA,KAAS,SAAV;IACE,KAAK;IACL,QAAQ,oBAAC,QAAD;KAAQ,MAAK;KAAQ,SAAQ;IAAQ,CAAA;IAE5C,UAAA;GACe,CAAA,GACjB,KACY;EAEA,CAAA,CAAA;;AAEvB"}
@@ -0,0 +1,31 @@
1
+ import { ComponentPropsWithRef, Key, ReactNode } from "react";
2
+ //#region src/components/molecules/descriptions.d.ts
3
+ type ColumnCount = 1 | 2 | 3 | 4;
4
+ type Breakpoint = 'base' | 'sm' | 'md' | 'lg' | 'xl' | '2xl';
5
+ export type Columns = ColumnCount | Partial<Record<Breakpoint, ColumnCount>>;
6
+ export interface Item {
7
+ /** Stable key for the label/value pair. */
8
+ key: Key;
9
+ label: ReactNode;
10
+ /** Missing or null values render empty; zero is preserved. */
11
+ value?: ReactNode;
12
+ }
13
+ export interface Props extends Omit<ComponentPropsWithRef<'div'>, 'children' | 'title'> {
14
+ items: readonly Item[];
15
+ title?: ReactNode;
16
+ /** Defaults to one column, two at md, and three at lg. Omitted breakpoints inherit the previous count. */
17
+ columns?: Columns;
18
+ /** Label placement relative to the value. Defaults to horizontal. */
19
+ orientation?: 'horizontal' | 'vertical';
20
+ classNames?: {
21
+ title?: string;
22
+ list?: string;
23
+ item?: string;
24
+ label?: string;
25
+ value?: string;
26
+ };
27
+ }
28
+ declare const Descriptions: ({ items, title, columns, orientation, className, classNames, style, ...props }: Props) => import("react").JSX.Element;
29
+ //#endregion
30
+ export { Descriptions as default };
31
+ //# sourceMappingURL=Descriptions.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Descriptions.d.mts","names":[],"sources":["../src/components/molecules/descriptions.tsx"],"mappings":";;KASK;KACA;YAEO,UAAU,cAAc,QAAQ,OAAO,YAAY;iBAE9C;;EAEf,KAAK;EACL,OAAO;;EAEP,QAAQ;;iBAGO,cAAc,KAC7B;EAGA,gBAAgB;EAChB,QAAQ;;EAER,UAAU;;EAEV;EACA;IACE;IACA;IACA;IACA;IACA;;;cAME,iBAAgB,OAAA,OAAA,SAAA,aAAA,WAAA,YAAA,UAAA,SASnB,0BAAK,IAAA"}
@@ -0,0 +1,67 @@
1
+ import { cn } from "./utils.mjs";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ //#region src/components/molecules/descriptions.tsx
4
+ const BREAKPOINTS = [
5
+ "base",
6
+ "sm",
7
+ "md",
8
+ "lg",
9
+ "xl",
10
+ "2xl"
11
+ ];
12
+ const Descriptions = ({ items, title, columns = {
13
+ base: 1,
14
+ md: 2,
15
+ lg: 3
16
+ }, orientation = "horizontal", className, classNames, style, ...props }) => {
17
+ const columnStyles = {};
18
+ let count = 1;
19
+ for (const breakpoint of BREAKPOINTS) {
20
+ const requested = typeof columns === "number" ? columns : columns[breakpoint];
21
+ if (requested !== void 0 && Number.isFinite(requested)) count = Math.min(4, Math.max(1, Math.floor(requested)));
22
+ columnStyles[`--descriptions-columns-${breakpoint}`] = count;
23
+ }
24
+ return /* @__PURE__ */ jsxs("div", {
25
+ ...props,
26
+ "data-slot": "descriptions",
27
+ "data-orientation": orientation,
28
+ className: cn("text-foreground w-full min-w-0", className),
29
+ style: {
30
+ ...columnStyles,
31
+ ...style
32
+ },
33
+ children: [title != null && /* @__PURE__ */ jsx("div", {
34
+ "data-slot": "descriptions-title",
35
+ className: cn("mb-4 text-base font-semibold", classNames?.title),
36
+ children: title
37
+ }), /* @__PURE__ */ jsx("dl", {
38
+ "data-slot": "descriptions-list",
39
+ className: cn(`m-0 grid
40
+ grid-cols-[repeat(var(--descriptions-columns-base),minmax(0,1fr))]
41
+ gap-x-6 gap-y-4
42
+ sm:grid-cols-[repeat(var(--descriptions-columns-sm),minmax(0,1fr))]
43
+ md:grid-cols-[repeat(var(--descriptions-columns-md),minmax(0,1fr))]
44
+ lg:grid-cols-[repeat(var(--descriptions-columns-lg),minmax(0,1fr))]
45
+ xl:grid-cols-[repeat(var(--descriptions-columns-xl),minmax(0,1fr))]
46
+ 2xl:grid-cols-[repeat(var(--descriptions-columns-2xl),minmax(0,1fr))]`, classNames?.list),
47
+ children: items.map((item) => /* @__PURE__ */ jsxs("div", {
48
+ "data-slot": "descriptions-item",
49
+ className: cn("grid min-w-0 gap-2 text-sm", orientation === "horizontal" ? "grid-cols-[minmax(0,1fr)_minmax(0,2fr)] items-start" : "grid-cols-1 content-start", classNames?.item),
50
+ children: [/* @__PURE__ */ jsx("dt", {
51
+ "data-slot": "descriptions-label",
52
+ className: cn(`text-muted-foreground min-w-0 font-medium
53
+ [overflow-wrap:anywhere]`, classNames?.label),
54
+ children: item.label
55
+ }), /* @__PURE__ */ jsx("dd", {
56
+ "data-slot": "descriptions-value",
57
+ className: cn("m-0 min-w-0 [overflow-wrap:anywhere]", classNames?.value),
58
+ children: item.value
59
+ })]
60
+ }, item.key))
61
+ })]
62
+ });
63
+ };
64
+ //#endregion
65
+ export { Descriptions as default };
66
+
67
+ //# sourceMappingURL=Descriptions.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Descriptions.mjs","names":[],"sources":["../src/components/molecules/descriptions.tsx"],"sourcesContent":["import type {\n CSSProperties,\n ComponentPropsWithRef,\n Key,\n ReactNode,\n} from 'react';\n\nimport { cn } from '@repo/ui/utils';\n\ntype ColumnCount = 1 | 2 | 3 | 4;\ntype Breakpoint = 'base' | 'sm' | 'md' | 'lg' | 'xl' | '2xl';\n\nexport type Columns = ColumnCount | Partial<Record<Breakpoint, ColumnCount>>;\n\nexport interface Item {\n /** Stable key for the label/value pair. */\n key: Key;\n label: ReactNode;\n /** Missing or null values render empty; zero is preserved. */\n value?: ReactNode;\n}\n\nexport interface Props extends Omit<\n ComponentPropsWithRef<'div'>,\n 'children' | 'title'\n> {\n items: readonly Item[];\n title?: ReactNode;\n /** Defaults to one column, two at md, and three at lg. Omitted breakpoints inherit the previous count. */\n columns?: Columns;\n /** Label placement relative to the value. Defaults to horizontal. */\n orientation?: 'horizontal' | 'vertical';\n classNames?: {\n title?: string;\n list?: string;\n item?: string;\n label?: string;\n value?: string;\n };\n}\n\nconst BREAKPOINTS: Breakpoint[] = ['base', 'sm', 'md', 'lg', 'xl', '2xl'];\n\nconst Descriptions = ({\n items,\n title,\n columns = { base: 1, md: 2, lg: 3 },\n orientation = 'horizontal',\n className,\n classNames,\n style,\n ...props\n}: Props) => {\n const columnStyles: Record<string, number> = {};\n let count = 1;\n\n for (const breakpoint of BREAKPOINTS) {\n const requested =\n typeof columns === 'number' ? columns : columns[breakpoint];\n\n if (requested !== undefined && Number.isFinite(requested)) {\n count = Math.min(4, Math.max(1, Math.floor(requested)));\n }\n\n columnStyles[`--descriptions-columns-${breakpoint}`] = count;\n }\n\n return (\n <div\n {...props}\n data-slot=\"descriptions\"\n data-orientation={orientation}\n className={cn(\n 'text-foreground w-full min-w-0',\n className, //\n )}\n style={{ ...columnStyles, ...style } as CSSProperties}\n >\n {title != null && (\n <div\n data-slot=\"descriptions-title\"\n className={cn(\n 'mb-4 text-base font-semibold',\n classNames?.title, //\n )}\n >\n {title}\n </div>\n )}\n <dl\n data-slot=\"descriptions-list\"\n className={cn(\n `m-0 grid\n grid-cols-[repeat(var(--descriptions-columns-base),minmax(0,1fr))]\n gap-x-6 gap-y-4\n sm:grid-cols-[repeat(var(--descriptions-columns-sm),minmax(0,1fr))]\n md:grid-cols-[repeat(var(--descriptions-columns-md),minmax(0,1fr))]\n lg:grid-cols-[repeat(var(--descriptions-columns-lg),minmax(0,1fr))]\n xl:grid-cols-[repeat(var(--descriptions-columns-xl),minmax(0,1fr))]\n 2xl:grid-cols-[repeat(var(--descriptions-columns-2xl),minmax(0,1fr))]`,\n classNames?.list,\n //\n )}\n >\n {items.map(item => (\n <div\n key={item.key}\n data-slot=\"descriptions-item\"\n className={cn(\n 'grid min-w-0 gap-2 text-sm',\n orientation === 'horizontal'\n ? 'grid-cols-[minmax(0,1fr)_minmax(0,2fr)] items-start'\n : 'grid-cols-1 content-start',\n classNames?.item,\n //\n )}\n >\n <dt\n data-slot=\"descriptions-label\"\n className={cn(\n `text-muted-foreground min-w-0 font-medium\n [overflow-wrap:anywhere]`,\n classNames?.label, //\n )}\n >\n {item.label}\n </dt>\n <dd\n data-slot=\"descriptions-value\"\n className={cn(\n 'm-0 min-w-0 [overflow-wrap:anywhere]',\n classNames?.value, //\n )}\n >\n {item.value}\n </dd>\n </div>\n ))}\n </dl>\n </div>\n );\n};\n\nexport default Descriptions;\n"],"mappings":";;;AAyCA,MAAM,cAA4B;CAAC;CAAQ;CAAM;CAAM;CAAM;CAAM;AAAK;AAExE,MAAM,gBAAgB,EACpB,OACA,OACA,UAAU;CAAE,MAAM;CAAG,IAAI;CAAG,IAAI;AAAE,GAClC,cAAc,cACd,WACA,YACA,OACA,GAAG,YACQ;CACX,MAAM,eAAuC,CAAC;CAC9C,IAAI,QAAQ;CAEZ,KAAK,MAAM,cAAc,aAAa;EACpC,MAAM,YACJ,OAAO,YAAY,WAAW,UAAU,QAAQ;EAElD,IAAI,cAAc,KAAA,KAAa,OAAO,SAAS,SAAS,GACtD,QAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,MAAM,SAAS,CAAC,CAAC;EAGxD,aAAa,0BAA0B,gBAAgB;CACzD;CAEA,OACE,qBAAC,OAAD;EACE,GAAI;EACJ,aAAU;EACV,oBAAkB;EAClB,WAAW,GACT,kCACA,SACF;EACA,OAAO;GAAE,GAAG;GAAc,GAAG;EAAM;EARrC,UAAA,CAUG,SAAS,QACR,oBAAC,OAAD;GACE,aAAU;GACV,WAAW,GACT,gCACA,YAAY,KACd;GAEC,UAAA;EACE,CAAA,GAEP,oBAAC,MAAD;GACE,aAAU;GACV,WAAW,GACT;;;;;;;kFAQA,YAAY,IAEd;GAEC,UAAA,MAAM,KAAI,SACT,qBAAC,OAAD;IAEE,aAAU;IACV,WAAW,GACT,8BACA,gBAAgB,eACZ,wDACA,6BACJ,YAAY,IAEd;IAVF,UAAA,CAYE,oBAAC,MAAD;KACE,aAAU;KACV,WAAW,GACT;2CAEA,YAAY,KACd;KAEC,UAAA,KAAK;IACJ,CAAA,GACJ,oBAAC,MAAD;KACE,aAAU;KACV,WAAW,GACT,wCACA,YAAY,KACd;KAEC,UAAA,KAAK;IACJ,CAAA,CACD;GA9BE,GAAA,KAAK,GA8BP,CACN;EACC,CAAA,CACD;;AAET"}
@@ -0,0 +1,18 @@
1
+ import { Separator, separator_d_exports } from "./core/separator.mjs";
2
+ import "./core/index.mjs";
3
+ import { ComponentProps, ReactNode } from "react";
4
+ //#region src/components/atoms/divider.d.ts
5
+ export interface Props extends Omit<ComponentProps<typeof Separator>, 'children' | 'className'> {
6
+ children?: ReactNode;
7
+ variant?: 'solid' | 'dashed' | 'dotted';
8
+ titlePlacement?: 'start' | 'center' | 'end';
9
+ className?: string;
10
+ classNames?: {
11
+ line?: string;
12
+ label?: string;
13
+ };
14
+ }
15
+ declare const Divider: ({ children, orientation, decorative, variant, titlePlacement, className, classNames, dir, "aria-label": ariaLabel, ...props }: Props) => import("react").JSX.Element;
16
+ //#endregion
17
+ export { Divider as default };
18
+ //# sourceMappingURL=Divider.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Divider.d.mts","names":["separator","separator.Separator"],"sources":["../src/components/atoms/divider.tsx"],"mappings":";;;;iBASiB,cAAc,KAC7B,sBAAsBC;EAGtB,WAAW;EACX;EACA;EACA;EACA;IACE;IACA;;;cAUE,YAAW,UAAA,aAAA,YAAA,SAAA,gBAAA,WAAA,YAAA,mBAAA,cAAA,SAWd,0BAAK,IAAA"}