@jbpark/ui-kit 10.1.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 (375) hide show
  1. package/dist/Alert.d.mts +24 -0
  2. package/dist/Alert.d.mts.map +1 -0
  3. package/dist/Alert.mjs +68 -0
  4. package/dist/Alert.mjs.map +1 -0
  5. package/dist/Anchor.d.mts +29 -0
  6. package/dist/Anchor.d.mts.map +1 -0
  7. package/dist/Anchor.mjs +120 -0
  8. package/dist/Anchor.mjs.map +1 -0
  9. package/dist/AutoComplete.d.mts +34 -0
  10. package/dist/AutoComplete.d.mts.map +1 -0
  11. package/dist/AutoComplete.mjs +82 -0
  12. package/dist/AutoComplete.mjs.map +1 -0
  13. package/dist/Avatar.d.mts +19 -0
  14. package/dist/Avatar.d.mts.map +1 -0
  15. package/dist/Avatar.mjs +43 -0
  16. package/dist/Avatar.mjs.map +1 -0
  17. package/dist/Badge.d.mts +23 -0
  18. package/dist/Badge.d.mts.map +1 -0
  19. package/dist/Badge.mjs +41 -0
  20. package/dist/Badge.mjs.map +1 -0
  21. package/dist/Breadcrumb.d.mts +3 -3
  22. package/dist/Breadcrumb.d.mts.map +1 -1
  23. package/dist/Breadcrumb.mjs +1 -1
  24. package/dist/Breadcrumb.mjs.map +1 -1
  25. package/dist/Button.d.mts +3 -3
  26. package/dist/Button.d.mts.map +1 -1
  27. package/dist/Button.mjs +1 -1
  28. package/dist/Calendar.d.mts +28 -0
  29. package/dist/Calendar.d.mts.map +1 -0
  30. package/dist/Calendar.mjs +64 -0
  31. package/dist/Calendar.mjs.map +1 -0
  32. package/dist/Card.d.mts +2 -2
  33. package/dist/Card.d.mts.map +1 -1
  34. package/dist/Cascader.d.mts +34 -0
  35. package/dist/Cascader.d.mts.map +1 -0
  36. package/dist/Cascader.mjs +144 -0
  37. package/dist/Cascader.mjs.map +1 -0
  38. package/dist/CodeEditor.d.mts +2 -2
  39. package/dist/CodeEditor.d.mts.map +1 -1
  40. package/dist/ContextMenu.d.mts +33 -0
  41. package/dist/ContextMenu.d.mts.map +1 -0
  42. package/dist/ContextMenu.mjs +92 -0
  43. package/dist/ContextMenu.mjs.map +1 -0
  44. package/dist/Descriptions.d.mts +31 -0
  45. package/dist/Descriptions.d.mts.map +1 -0
  46. package/dist/Descriptions.mjs +67 -0
  47. package/dist/Descriptions.mjs.map +1 -0
  48. package/dist/Divider.d.mts +18 -0
  49. package/dist/Divider.d.mts.map +1 -0
  50. package/dist/Divider.mjs +44 -0
  51. package/dist/Divider.mjs.map +1 -0
  52. package/dist/Form.d.mts +12 -0
  53. package/dist/Form.d.mts.map +1 -0
  54. package/dist/Form.mjs +11 -0
  55. package/dist/Form.mjs.map +1 -0
  56. package/dist/Layout.d.mts.map +1 -1
  57. package/dist/Mentions.d.mts +34 -0
  58. package/dist/Mentions.d.mts.map +1 -0
  59. package/dist/Mentions.mjs +207 -0
  60. package/dist/Mentions.mjs.map +1 -0
  61. package/dist/Menu.mjs +1 -2
  62. package/dist/Pagination.d.mts +2 -2
  63. package/dist/Pagination.d.mts.map +1 -1
  64. package/dist/Pagination.mjs +1 -1
  65. package/dist/Popconfirm.d.mts +33 -0
  66. package/dist/Popconfirm.d.mts.map +1 -0
  67. package/dist/Popconfirm.mjs +119 -0
  68. package/dist/Popconfirm.mjs.map +1 -0
  69. package/dist/Rate.d.mts +27 -0
  70. package/dist/Rate.d.mts.map +1 -0
  71. package/dist/Rate.mjs +81 -0
  72. package/dist/Rate.mjs.map +1 -0
  73. package/dist/Reveals.d.mts.map +1 -1
  74. package/dist/ScrollArea.d.mts +8 -0
  75. package/dist/ScrollArea.d.mts.map +1 -0
  76. package/dist/ScrollArea.mjs +11 -0
  77. package/dist/ScrollArea.mjs.map +1 -0
  78. package/dist/Segmented.d.mts +26 -0
  79. package/dist/Segmented.d.mts.map +1 -0
  80. package/dist/Segmented.mjs +57 -0
  81. package/dist/Segmented.mjs.map +1 -0
  82. package/dist/Space.d.mts +2 -2
  83. package/dist/Space.d.mts.map +1 -1
  84. package/dist/Statistic.d.mts +22 -0
  85. package/dist/Statistic.d.mts.map +1 -0
  86. package/dist/Statistic.mjs +53 -0
  87. package/dist/Statistic.mjs.map +1 -0
  88. package/dist/Steps.d.mts +28 -0
  89. package/dist/Steps.d.mts.map +1 -0
  90. package/dist/Steps.mjs +70 -0
  91. package/dist/Steps.mjs.map +1 -0
  92. package/dist/Table.d.mts +4 -4
  93. package/dist/Table.d.mts.map +1 -1
  94. package/dist/Tag.d.mts +3 -3
  95. package/dist/Tag.d.mts.map +1 -1
  96. package/dist/TimePicker.d.mts +26 -0
  97. package/dist/TimePicker.d.mts.map +1 -0
  98. package/dist/TimePicker.mjs +77 -0
  99. package/dist/TimePicker.mjs.map +1 -0
  100. package/dist/Timeline.d.mts +35 -0
  101. package/dist/Timeline.d.mts.map +1 -0
  102. package/dist/Timeline.mjs +59 -0
  103. package/dist/Timeline.mjs.map +1 -0
  104. package/dist/Tour.d.mts +37 -0
  105. package/dist/Tour.d.mts.map +1 -0
  106. package/dist/Tour.mjs +192 -0
  107. package/dist/Tour.mjs.map +1 -0
  108. package/dist/Transfer.d.mts +36 -0
  109. package/dist/Transfer.d.mts.map +1 -0
  110. package/dist/Transfer.mjs +147 -0
  111. package/dist/Transfer.mjs.map +1 -0
  112. package/dist/Tree.d.mts +62 -0
  113. package/dist/Tree.d.mts.map +1 -0
  114. package/dist/Tree.mjs +462 -0
  115. package/dist/Tree.mjs.map +1 -0
  116. package/dist/TreeSelect.d.mts +34 -0
  117. package/dist/TreeSelect.d.mts.map +1 -0
  118. package/dist/TreeSelect.mjs +135 -0
  119. package/dist/TreeSelect.mjs.map +1 -0
  120. package/dist/Typography.d.mts.map +1 -1
  121. package/dist/components/atoms/checkbox/checkbox.d.mts +5 -3
  122. package/dist/components/atoms/checkbox/checkbox.d.mts.map +1 -1
  123. package/dist/components/atoms/checkbox/checkbox.mjs +8 -4
  124. package/dist/components/atoms/checkbox/checkbox.mjs.map +1 -1
  125. package/dist/components/atoms/checkbox/group.d.mts +2 -2
  126. package/dist/components/atoms/checkbox/group.d.mts.map +1 -1
  127. package/dist/components/atoms/checkbox/index.d.mts.map +1 -1
  128. package/dist/components/atoms/color-picker.d.mts +2 -2
  129. package/dist/components/atoms/color-picker.d.mts.map +1 -1
  130. package/dist/components/atoms/date-picker.d.mts +5 -1
  131. package/dist/components/atoms/date-picker.d.mts.map +1 -1
  132. package/dist/components/atoms/date-picker.mjs +54 -10
  133. package/dist/components/atoms/date-picker.mjs.map +1 -1
  134. package/dist/components/atoms/float-button/back-top.d.mts +2 -2
  135. package/dist/components/atoms/float-button/back-top.d.mts.map +1 -1
  136. package/dist/components/atoms/float-button/back-top.mjs +1 -1
  137. package/dist/components/atoms/float-button/float-button.d.mts +2 -2
  138. package/dist/components/atoms/float-button/float-button.d.mts.map +1 -1
  139. package/dist/components/atoms/float-button/index.d.mts.map +1 -1
  140. package/dist/components/atoms/index.d.mts +13 -2
  141. package/dist/components/atoms/input/index.d.mts +5 -1
  142. package/dist/components/atoms/input/index.d.mts.map +1 -1
  143. package/dist/components/atoms/input/index.mjs +5 -1
  144. package/dist/components/atoms/input/index.mjs.map +1 -1
  145. package/dist/components/atoms/input/number.d.mts +23 -0
  146. package/dist/components/atoms/input/number.d.mts.map +1 -0
  147. package/dist/components/atoms/input/number.mjs +71 -0
  148. package/dist/components/atoms/input/number.mjs.map +1 -0
  149. package/dist/components/atoms/input/otp.d.mts +26 -0
  150. package/dist/components/atoms/input/otp.d.mts.map +1 -0
  151. package/dist/components/atoms/input/otp.mjs +52 -0
  152. package/dist/components/atoms/input/otp.mjs.map +1 -0
  153. package/dist/components/atoms/input/search.d.mts +2 -7
  154. package/dist/components/atoms/input/search.d.mts.map +1 -1
  155. package/dist/components/atoms/input/search.mjs +6 -8
  156. package/dist/components/atoms/input/search.mjs.map +1 -1
  157. package/dist/components/atoms/mentions-token.mjs +31 -0
  158. package/dist/components/atoms/mentions-token.mjs.map +1 -0
  159. package/dist/components/atoms/option-group.d.mts +4 -5
  160. package/dist/components/atoms/option-group.d.mts.map +1 -1
  161. package/dist/components/atoms/popover.d.mts +2 -2
  162. package/dist/components/atoms/popover.d.mts.map +1 -1
  163. package/dist/components/atoms/progress.d.mts +5 -3
  164. package/dist/components/atoms/progress.d.mts.map +1 -1
  165. package/dist/components/atoms/progress.mjs +2 -2
  166. package/dist/components/atoms/progress.mjs.map +1 -1
  167. package/dist/components/atoms/radio/group.d.mts +2 -2
  168. package/dist/components/atoms/radio/group.d.mts.map +1 -1
  169. package/dist/components/atoms/radio/group.mjs +1 -1
  170. package/dist/components/atoms/radio/index.d.mts.map +1 -1
  171. package/dist/components/atoms/radio/radio.d.mts +2 -2
  172. package/dist/components/atoms/radio/radio.d.mts.map +1 -1
  173. package/dist/components/atoms/radio/radio.mjs +1 -1
  174. package/dist/components/atoms/rich-text-editor/rich-text-editor.d.mts +8 -3
  175. package/dist/components/atoms/rich-text-editor/rich-text-editor.d.mts.map +1 -1
  176. package/dist/components/atoms/rich-text-editor/rich-text-editor.mjs +7 -2
  177. package/dist/components/atoms/rich-text-editor/rich-text-editor.mjs.map +1 -1
  178. package/dist/components/atoms/rich-text-editor/toolbar-presets.mjs +2 -2
  179. package/dist/components/atoms/rich-text-editor/types.d.mts +2 -3
  180. package/dist/components/atoms/rich-text-editor/types.d.mts.map +1 -1
  181. package/dist/components/atoms/select-multiple.d.mts +2 -3
  182. package/dist/components/atoms/select-multiple.d.mts.map +1 -1
  183. package/dist/components/atoms/select-multiple.mjs +4 -3
  184. package/dist/components/atoms/select-multiple.mjs.map +1 -1
  185. package/dist/components/atoms/select-searchable-options.d.mts +3 -4
  186. package/dist/components/atoms/select-searchable-options.d.mts.map +1 -1
  187. package/dist/components/atoms/select-searchable.d.mts +2 -3
  188. package/dist/components/atoms/select-searchable.d.mts.map +1 -1
  189. package/dist/components/atoms/select-searchable.mjs +4 -3
  190. package/dist/components/atoms/select-searchable.mjs.map +1 -1
  191. package/dist/components/atoms/select.d.mts +4 -4
  192. package/dist/components/atoms/select.d.mts.map +1 -1
  193. package/dist/components/atoms/select.mjs +1 -1
  194. package/dist/components/atoms/select.mjs.map +1 -1
  195. package/dist/components/atoms/skeleton/button.d.mts.map +1 -1
  196. package/dist/components/atoms/skeleton/index.d.mts.map +1 -1
  197. package/dist/components/atoms/skeleton/node.d.mts.map +1 -1
  198. package/dist/components/atoms/skeleton/skeleton.d.mts +5 -3
  199. package/dist/components/atoms/skeleton/skeleton.d.mts.map +1 -1
  200. package/dist/components/atoms/skeleton/skeleton.mjs +2 -2
  201. package/dist/components/atoms/skeleton/skeleton.mjs.map +1 -1
  202. package/dist/components/atoms/slider/slider.d.mts +3 -3
  203. package/dist/components/atoms/slider/slider.d.mts.map +1 -1
  204. package/dist/components/atoms/spin.d.mts +2 -2
  205. package/dist/components/atoms/spin.d.mts.map +1 -1
  206. package/dist/components/atoms/spin.mjs +1 -1
  207. package/dist/components/atoms/switch.d.mts +2 -2
  208. package/dist/components/atoms/switch.d.mts.map +1 -1
  209. package/dist/components/atoms/tooltip.d.mts +2 -2
  210. package/dist/components/atoms/tooltip.d.mts.map +1 -1
  211. package/dist/components/atoms/typography/link.d.mts +2 -2
  212. package/dist/components/atoms/typography/link.d.mts.map +1 -1
  213. package/dist/components/atoms/typography/paragraph.d.mts +2 -2
  214. package/dist/components/atoms/typography/paragraph.d.mts.map +1 -1
  215. package/dist/components/atoms/typography/text.d.mts +2 -2
  216. package/dist/components/atoms/typography/text.d.mts.map +1 -1
  217. package/dist/components/atoms/typography/title.d.mts +2 -2
  218. package/dist/components/atoms/typography/title.d.mts.map +1 -1
  219. package/dist/components/atoms/typography/typography.d.mts +2 -2
  220. package/dist/components/atoms/typography/typography.d.mts.map +1 -1
  221. package/dist/components/molecules/collapse.d.mts +9 -9
  222. package/dist/components/molecules/collapse.d.mts.map +1 -1
  223. package/dist/components/molecules/collapse.mjs +11 -2
  224. package/dist/components/molecules/collapse.mjs.map +1 -1
  225. package/dist/components/molecules/dropdown.d.mts +2 -2
  226. package/dist/components/molecules/dropdown.d.mts.map +1 -1
  227. package/dist/components/molecules/index.d.mts +23 -13
  228. package/dist/components/molecules/marquees/index.d.mts.map +1 -1
  229. package/dist/components/molecules/marquees/item.d.mts +4 -4
  230. package/dist/components/molecules/marquees/item.d.mts.map +1 -1
  231. package/dist/components/molecules/marquees/item.mjs +5 -5
  232. package/dist/components/molecules/marquees/item.mjs.map +1 -1
  233. package/dist/components/molecules/marquees/marquees.d.mts +2 -2
  234. package/dist/components/molecules/marquees/marquees.d.mts.map +1 -1
  235. package/dist/components/molecules/marquees/marquees.mjs +4 -5
  236. package/dist/components/molecules/marquees/marquees.mjs.map +1 -1
  237. package/dist/components/molecules/menu/item/item.mjs +1 -1
  238. package/dist/components/molecules/menu/menu.d.mts +9 -9
  239. package/dist/components/molecules/menu/menu.d.mts.map +1 -1
  240. package/dist/components/molecules/menu/menu.mjs +3 -1
  241. package/dist/components/molecules/menu/menu.mjs.map +1 -1
  242. package/dist/components/molecules/reveals/item.d.mts +2 -2
  243. package/dist/components/molecules/reveals/item.d.mts.map +1 -1
  244. package/dist/components/molecules/reveals/reveals.d.mts +5 -5
  245. package/dist/components/molecules/reveals/reveals.d.mts.map +1 -1
  246. package/dist/components/molecules/splitter/index.d.mts.map +1 -1
  247. package/dist/components/molecules/splitter/panel.d.mts +3 -3
  248. package/dist/components/molecules/splitter/panel.d.mts.map +1 -1
  249. package/dist/components/molecules/splitter/splitter.d.mts +3 -3
  250. package/dist/components/molecules/splitter/splitter.d.mts.map +1 -1
  251. package/dist/components/molecules/tabs.d.mts +9 -5
  252. package/dist/components/molecules/tabs.d.mts.map +1 -1
  253. package/dist/components/molecules/tabs.mjs +5 -1
  254. package/dist/components/molecules/tabs.mjs.map +1 -1
  255. package/dist/components/molecules/upload.d.mts +3 -3
  256. package/dist/components/molecules/upload.d.mts.map +1 -1
  257. package/dist/components/molecules/upload.mjs +1 -1
  258. package/dist/components/organisms/drawer.d.mts +3 -3
  259. package/dist/components/organisms/drawer.d.mts.map +1 -1
  260. package/dist/components/organisms/drawer.mjs +4 -3
  261. package/dist/components/organisms/drawer.mjs.map +1 -1
  262. package/dist/components/organisms/form/context.d.mts +4 -0
  263. package/dist/components/organisms/form/context.d.mts.map +1 -0
  264. package/dist/components/organisms/form/context.mjs +9 -0
  265. package/dist/components/organisms/form/context.mjs.map +1 -0
  266. package/dist/components/organisms/form/control.d.mts +11 -0
  267. package/dist/components/organisms/form/control.d.mts.map +1 -0
  268. package/dist/components/organisms/form/control.mjs +19 -0
  269. package/dist/components/organisms/form/control.mjs.map +1 -0
  270. package/dist/components/organisms/form/field.d.mts +25 -0
  271. package/dist/components/organisms/form/field.d.mts.map +1 -0
  272. package/dist/components/organisms/form/field.mjs +54 -0
  273. package/dist/components/organisms/form/field.mjs.map +1 -0
  274. package/dist/components/organisms/form/form.d.mts +14 -0
  275. package/dist/components/organisms/form/form.d.mts.map +1 -0
  276. package/dist/components/organisms/form/form.mjs +23 -0
  277. package/dist/components/organisms/form/form.mjs.map +1 -0
  278. package/dist/components/organisms/index.d.mts +14 -6
  279. package/dist/components/organisms/list/index.d.mts.map +1 -1
  280. package/dist/components/organisms/list/list.d.mts +2 -2
  281. package/dist/components/organisms/list/list.d.mts.map +1 -1
  282. package/dist/components/organisms/modal.d.mts +6 -3
  283. package/dist/components/organisms/modal.d.mts.map +1 -1
  284. package/dist/components/organisms/modal.mjs +25 -18
  285. package/dist/components/organisms/modal.mjs.map +1 -1
  286. package/dist/components/organisms/swiper/index.d.mts.map +1 -1
  287. package/dist/components/organisms/swiper/swiper.d.mts +2 -2
  288. package/dist/components/organisms/swiper/swiper.d.mts.map +1 -1
  289. package/dist/components/organisms/toast.d.mts +2 -2
  290. package/dist/components/organisms/toast.d.mts.map +1 -1
  291. package/dist/components/organisms/toast.mjs +1 -1
  292. package/dist/components/templates/container.d.mts +2 -2
  293. package/dist/components/templates/container.d.mts.map +1 -1
  294. package/dist/components/templates/empty.d.mts +2 -2
  295. package/dist/components/templates/empty.d.mts.map +1 -1
  296. package/dist/components/templates/empty.mjs +1 -1
  297. package/dist/components/templates/grid/col.d.mts +2 -2
  298. package/dist/components/templates/grid/col.d.mts.map +1 -1
  299. package/dist/components/templates/grid/row.d.mts +2 -2
  300. package/dist/components/templates/grid/row.d.mts.map +1 -1
  301. package/dist/components/templates/layout/content.d.mts +2 -2
  302. package/dist/components/templates/layout/content.d.mts.map +1 -1
  303. package/dist/components/templates/layout/footer.d.mts +2 -2
  304. package/dist/components/templates/layout/footer.d.mts.map +1 -1
  305. package/dist/components/templates/layout/header.d.mts +2 -2
  306. package/dist/components/templates/layout/header.d.mts.map +1 -1
  307. package/dist/components/templates/layout/layout.d.mts +2 -2
  308. package/dist/components/templates/layout/layout.d.mts.map +1 -1
  309. package/dist/components/templates/layout/sider.d.mts +2 -2
  310. package/dist/components/templates/layout/sider.d.mts.map +1 -1
  311. package/dist/components/templates/layout/sider.mjs +1 -1
  312. package/dist/components/templates/page-header.d.mts +2 -2
  313. package/dist/components/templates/page-header.d.mts.map +1 -1
  314. package/dist/components/templates/page-header.mjs +1 -1
  315. package/dist/components/templates/result.d.mts +2 -2
  316. package/dist/components/templates/result.d.mts.map +1 -1
  317. package/dist/components/templates/result.mjs +1 -1
  318. package/dist/core/accordion.mjs +1 -1
  319. package/dist/core/autocomplete.d.mts +2 -0
  320. package/dist/core/autocomplete.mjs +48 -0
  321. package/dist/core/autocomplete.mjs.map +1 -0
  322. package/dist/core/badge.d.mts +5 -3
  323. package/dist/core/badge.d.mts.map +1 -1
  324. package/dist/core/button.d.mts +6 -4
  325. package/dist/core/button.d.mts.map +1 -1
  326. package/dist/core/calendar.d.mts +13 -3
  327. package/dist/core/calendar.d.mts.map +1 -0
  328. package/dist/core/calendar.mjs +1 -1
  329. package/dist/core/checkbox.mjs +11 -8
  330. package/dist/core/checkbox.mjs.map +1 -1
  331. package/dist/core/combobox.d.mts +26 -4
  332. package/dist/core/combobox.d.mts.map +1 -1
  333. package/dist/core/combobox.mjs +2 -2
  334. package/dist/core/combobox.mjs.map +1 -1
  335. package/dist/core/dialog.mjs +2 -2
  336. package/dist/core/dialog.mjs.map +1 -1
  337. package/dist/core/form.d.mts +8 -0
  338. package/dist/core/form.d.mts.map +1 -0
  339. package/dist/core/form.mjs +3 -0
  340. package/dist/core/index.d.mts +13 -9
  341. package/dist/core/popover.mjs +10 -2
  342. package/dist/core/popover.mjs.map +1 -1
  343. package/dist/core/radio-group.mjs +1 -1
  344. package/dist/core/resizable.d.mts +7 -2
  345. package/dist/core/resizable.d.mts.map +1 -1
  346. package/dist/core/resizable.mjs +1 -1
  347. package/dist/core/scroll-area.d.mts +20 -0
  348. package/dist/core/scroll-area.d.mts.map +1 -0
  349. package/dist/core/scroll-area.mjs +57 -0
  350. package/dist/core/scroll-area.mjs.map +1 -0
  351. package/dist/core/select.d.mts +24 -2
  352. package/dist/core/select.d.mts.map +1 -1
  353. package/dist/core/select.mjs +1 -1
  354. package/dist/core/separator.d.mts +13 -2
  355. package/dist/core/separator.d.mts.map +1 -0
  356. package/dist/core/tabs.d.mts +16 -2
  357. package/dist/core/tabs.d.mts.map +1 -1
  358. package/dist/index.d.mts +63 -34
  359. package/dist/index.mjs +29 -5
  360. package/dist/lib/colors.d.mts +2 -3
  361. package/dist/lib/colors.d.mts.map +1 -1
  362. package/dist/providers/config/context.d.mts +2 -3
  363. package/dist/providers/config/context.d.mts.map +1 -1
  364. package/dist/providers/config/context.mjs +3 -1
  365. package/dist/providers/config/context.mjs.map +1 -1
  366. package/dist/providers/config/registry.d.mts +2 -3
  367. package/dist/providers/config/registry.d.mts.map +1 -1
  368. package/dist/providers/config/types.d.mts +8 -7
  369. package/dist/providers/config/types.d.mts.map +1 -1
  370. package/dist/style.css +838 -288
  371. package/dist/utils.d.mts +2 -3
  372. package/dist/utils.d.mts.map +1 -1
  373. package/package.json +147 -26
  374. package/dist/components/molecules/marquees/use-pause-on-hover.mjs +0 -26
  375. package/dist/components/molecules/marquees/use-pause-on-hover.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"Breadcrumb.mjs","names":[],"sources":["../src/components/molecules/breadcrumb.tsx"],"sourcesContent":["'use client';\n\nimport { Fragment } from 'react';\n\nimport { useConfig } from '@repo/ui/providers';\nimport { cn } from '@repo/ui/utils';\n\nimport Button from '../atoms/button';\nimport Popover from '../atoms/popover';\n\nexport interface Item {\n key?: React.Key;\n title: React.ReactNode;\n href?: string;\n target?: React.HTMLAttributeAnchorTarget;\n rel?: string;\n onClick?: React.MouseEventHandler<HTMLElement>;\n className?: string;\n 'aria-label'?: string;\n /** Decorative icon placed before the title. */\n icon?: React.ReactNode;\n /** Overrides the separator after this item. */\n separator?: React.ReactNode;\n}\n\nexport interface Props extends Omit<\n React.ComponentPropsWithoutRef<'nav'>,\n 'children'\n> {\n items: Item[];\n separator?: React.ReactNode;\n /** Collapse middle items when the trail has more than this many entries. */\n maxItems?: number;\n itemsBeforeCollapse?: number;\n itemsAfterCollapse?: number;\n expandText?: string;\n /** Render custom router links. The renderer owns aria-current for the last item. */\n itemRender?: (\n item: Item,\n index: number,\n isCurrent: boolean,\n ) => React.ReactNode;\n classNames?: {\n list?: string;\n item?: string;\n link?: string;\n current?: string;\n separator?: string;\n collapsed?: string;\n popup?: string;\n };\n}\n\nconst safeCount = (value: number, minimum: number) =>\n Number.isFinite(value) ? Math.max(minimum, Math.floor(value)) : minimum;\n\nconst Breadcrumb = ({\n items,\n separator = '/',\n maxItems = 8,\n itemsBeforeCollapse = 1,\n itemsAfterCollapse = 1,\n expandText = 'Show path',\n itemRender,\n className,\n classNames,\n dir,\n 'aria-label': ariaLabel,\n ...props\n}: Props) => {\n const { direction } = useConfig();\n const limit = safeCount(maxItems, 3);\n const before = Math.min(safeCount(itemsBeforeCollapse, 1), limit - 2);\n const after = Math.min(safeCount(itemsAfterCollapse, 1), limit - before - 1);\n const collapsed = items.length > limit && items.length - before - after > 0;\n const visibleIndices = collapsed\n ? [\n ...Array.from({ length: before }, (_, index) => index),\n ...Array.from(\n { length: after },\n (_, index) => items.length - after + index,\n ),\n ]\n : items.map((_, index) => index);\n const hiddenIndices = collapsed\n ? Array.from(\n { length: items.length - before - after },\n (_, index) => before + index,\n )\n : [];\n\n const renderItem = (index: number) => {\n const item = items[index]!;\n const isCurrent = index === items.length - 1;\n\n if (itemRender) {\n return itemRender(item, index, isCurrent);\n }\n\n const content = (\n <>\n {item.icon != null && (\n <span\n data-slot=\"breadcrumb-icon\"\n aria-hidden=\"true\"\n className=\"inline-flex shrink-0\"\n >\n {item.icon}\n </span>\n )}\n {item.title}\n </>\n );\n const itemClassName = cn(\n 'inline-flex items-center gap-1.5 rounded-sm',\n (item.href !== undefined || item.onClick) &&\n 'hover:text-foreground focus-visible:outline-ring focus-visible:outline-2',\n isCurrent ? 'text-foreground font-medium' : 'text-muted-foreground',\n (item.href !== undefined || item.onClick) && classNames?.link,\n isCurrent && classNames?.current,\n item.className,\n //\n );\n\n if (item.href !== undefined) {\n return (\n <a\n href={item.href}\n target={item.target}\n rel={item.rel}\n onClick={item.onClick}\n aria-label={item['aria-label']}\n aria-current={isCurrent ? 'page' : undefined}\n className={itemClassName}\n >\n {content}\n </a>\n );\n }\n\n if (item.onClick) {\n return (\n <Button\n variant=\"text\"\n size=\"small\"\n onClick={item.onClick}\n aria-label={item['aria-label']}\n aria-current={isCurrent ? 'page' : undefined}\n className={cn('h-auto px-0 py-0 font-normal', itemClassName)}\n >\n {content}\n </Button>\n );\n }\n\n return (\n <span\n aria-label={item['aria-label']}\n aria-current={isCurrent ? 'page' : undefined}\n className={itemClassName}\n >\n {content}\n </span>\n );\n };\n\n const renderSeparator = (index: number) => (\n <li\n data-slot=\"breadcrumb-separator\"\n aria-hidden=\"true\"\n className={cn(\n 'text-muted-foreground mx-2 shrink-0',\n classNames?.separator,\n //\n )}\n >\n {items[index]?.separator ?? separator}\n </li>\n );\n\n return (\n <nav\n {...props}\n data-slot=\"breadcrumb\"\n dir={dir ?? direction}\n aria-label={ariaLabel ?? 'Breadcrumb'}\n className={cn(\n 'text-sm',\n className, //\n )}\n >\n <ol\n data-slot=\"breadcrumb-list\"\n className={cn(\n 'm-0 flex min-w-0 flex-wrap items-center p-0',\n classNames?.list,\n //\n )}\n >\n {visibleIndices.map((index, position) => (\n <Fragment key={items[index]?.key ?? index}>\n {position > 0 &&\n renderSeparator(\n collapsed && position === before\n ? index - 1\n : visibleIndices[position - 1]!,\n )}\n <li\n data-slot=\"breadcrumb-item\"\n className={cn(\n 'inline-flex min-w-0 items-center',\n classNames?.item, //\n )}\n >\n {renderItem(index)}\n </li>\n {collapsed && position === before - 1 && (\n <>\n {renderSeparator(index)}\n <li\n data-slot=\"breadcrumb-collapsed\"\n className={classNames?.collapsed}\n >\n <Popover\n placement=\"bottom\"\n className={classNames?.popup}\n content={\n <ol className=\"m-0 grid list-none gap-1 p-0\">\n {hiddenIndices.map(hiddenIndex => (\n <li key={items[hiddenIndex]?.key ?? hiddenIndex}>\n {renderItem(hiddenIndex)}\n </li>\n ))}\n </ol>\n }\n >\n <Button\n variant=\"text\"\n size=\"small\"\n aria-label={expandText}\n className=\"h-auto px-1\"\n >\n …\n </Button>\n </Popover>\n </li>\n </>\n )}\n </Fragment>\n ))}\n </ol>\n </nav>\n );\n};\n\nexport default Breadcrumb;\n"],"mappings":"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"}
1
+ {"version":3,"file":"Breadcrumb.mjs","names":[],"sources":["../src/components/molecules/breadcrumb.tsx"],"sourcesContent":["'use client';\n\nimport { Fragment } from 'react';\n\nimport { useConfig } from '@repo/ui/providers';\nimport { cn } from '@repo/ui/utils';\n\nimport Button from '../atoms/button';\nimport Popover from '../atoms/popover';\n\nexport interface Item {\n key?: React.Key;\n title: React.ReactNode;\n href?: string;\n target?: React.HTMLAttributeAnchorTarget;\n rel?: string;\n onClick?: React.MouseEventHandler<HTMLElement>;\n className?: string;\n 'aria-label'?: string;\n /** Decorative icon placed before the title. */\n icon?: React.ReactNode;\n /** Overrides the separator after this item. */\n separator?: React.ReactNode;\n}\n\nexport interface Props extends Omit<\n React.ComponentPropsWithoutRef<'nav'>,\n 'children'\n> {\n items: Item[];\n separator?: React.ReactNode;\n /** Collapse middle items when the trail has more than this many entries. */\n maxItems?: number;\n itemsBeforeCollapse?: number;\n itemsAfterCollapse?: number;\n expandText?: string;\n /** Render custom router links. The renderer owns aria-current for the last item. */\n itemRender?: (\n item: Item,\n index: number,\n isCurrent: boolean,\n ) => React.ReactNode;\n classNames?: {\n list?: string;\n item?: string;\n link?: string;\n current?: string;\n separator?: string;\n collapsed?: string;\n popup?: string;\n };\n}\n\nconst safeCount = (value: number, minimum: number) =>\n Number.isFinite(value) ? Math.max(minimum, Math.floor(value)) : minimum;\n\nconst Breadcrumb = ({\n items,\n separator = '/',\n maxItems = 8,\n itemsBeforeCollapse = 1,\n itemsAfterCollapse = 1,\n expandText = 'Show path',\n itemRender,\n className,\n classNames,\n dir,\n 'aria-label': ariaLabel,\n ...props\n}: Props) => {\n const { direction } = useConfig();\n const limit = safeCount(maxItems, 3);\n const before = Math.min(safeCount(itemsBeforeCollapse, 1), limit - 2);\n const after = Math.min(safeCount(itemsAfterCollapse, 1), limit - before - 1);\n const collapsed = items.length > limit && items.length - before - after > 0;\n const visibleIndices = collapsed\n ? [\n ...Array.from({ length: before }, (_, index) => index),\n ...Array.from(\n { length: after },\n (_, index) => items.length - after + index,\n ),\n ]\n : items.map((_, index) => index);\n const hiddenIndices = collapsed\n ? Array.from(\n { length: items.length - before - after },\n (_, index) => before + index,\n )\n : [];\n\n const renderItem = (index: number) => {\n const item = items[index]!;\n const isCurrent = index === items.length - 1;\n\n if (itemRender) {\n return itemRender(item, index, isCurrent);\n }\n\n const content = (\n <>\n {item.icon != null && (\n <span\n data-slot=\"breadcrumb-icon\"\n aria-hidden=\"true\"\n className=\"inline-flex shrink-0\"\n >\n {item.icon}\n </span>\n )}\n {item.title}\n </>\n );\n const itemClassName = cn(\n 'inline-flex items-center gap-1.5 rounded-sm',\n (item.href !== undefined || item.onClick) &&\n 'hover:text-foreground focus-visible:outline-ring focus-visible:outline-2',\n isCurrent ? 'text-foreground font-medium' : 'text-muted-foreground',\n (item.href !== undefined || item.onClick) && classNames?.link,\n isCurrent && classNames?.current,\n item.className,\n //\n );\n\n if (item.href !== undefined) {\n return (\n <a\n href={item.href}\n target={item.target}\n rel={item.rel}\n onClick={item.onClick}\n aria-label={item['aria-label']}\n aria-current={isCurrent ? 'page' : undefined}\n className={itemClassName}\n >\n {content}\n </a>\n );\n }\n\n if (item.onClick) {\n return (\n <Button\n variant=\"text\"\n size=\"small\"\n onClick={item.onClick}\n aria-label={item['aria-label']}\n aria-current={isCurrent ? 'page' : undefined}\n className={cn('h-auto px-0 py-0 font-normal', itemClassName)}\n >\n {content}\n </Button>\n );\n }\n\n return (\n <span\n aria-label={item['aria-label']}\n aria-current={isCurrent ? 'page' : undefined}\n className={itemClassName}\n >\n {content}\n </span>\n );\n };\n\n const renderSeparator = (index: number) => (\n <li\n data-slot=\"breadcrumb-separator\"\n aria-hidden=\"true\"\n className={cn(\n 'text-muted-foreground mx-2 shrink-0',\n classNames?.separator,\n //\n )}\n >\n {items[index]?.separator ?? separator}\n </li>\n );\n\n return (\n <nav\n {...props}\n data-slot=\"breadcrumb\"\n dir={dir ?? direction}\n aria-label={ariaLabel ?? 'Breadcrumb'}\n className={cn(\n 'text-sm',\n className, //\n )}\n >\n <ol\n data-slot=\"breadcrumb-list\"\n className={cn(\n 'm-0 flex min-w-0 list-none flex-wrap items-center p-0',\n classNames?.list,\n //\n )}\n >\n {visibleIndices.map((index, position) => (\n <Fragment key={items[index]?.key ?? index}>\n {position > 0 &&\n renderSeparator(\n collapsed && position === before\n ? index - 1\n : visibleIndices[position - 1]!,\n )}\n <li\n data-slot=\"breadcrumb-item\"\n className={cn(\n 'inline-flex min-w-0 items-center',\n classNames?.item, //\n )}\n >\n {renderItem(index)}\n </li>\n {collapsed && position === before - 1 && (\n <>\n {renderSeparator(index)}\n <li\n data-slot=\"breadcrumb-collapsed\"\n className={classNames?.collapsed}\n >\n <Popover\n placement=\"bottom\"\n className={classNames?.popup}\n content={\n <ol className=\"m-0 grid list-none gap-1 p-0\">\n {hiddenIndices.map(hiddenIndex => (\n <li key={items[hiddenIndex]?.key ?? hiddenIndex}>\n {renderItem(hiddenIndex)}\n </li>\n ))}\n </ol>\n }\n >\n <Button\n variant=\"text\"\n size=\"small\"\n aria-label={expandText}\n className=\"h-auto px-1\"\n >\n …\n </Button>\n </Popover>\n </li>\n </>\n )}\n </Fragment>\n ))}\n </ol>\n </nav>\n );\n};\n\nexport default Breadcrumb;\n"],"mappings":"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"}
package/dist/Button.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { Button as Button$1 } from "./core/button.mjs";
1
+ import { Button as Button$1, button_d_exports } from "./core/button.mjs";
2
2
  import "./core/index.mjs";
3
3
  import { PresetColor } from "./lib/colors.mjs";
4
4
  import * as React$1 from "react";
@@ -25,7 +25,7 @@ type ShadcnVariant = 'default' | 'destructive' | 'outline' | 'secondary' | 'ghos
25
25
  * would render a normal padded button.
26
26
  */
27
27
  type ShadcnSize = 'default' | 'xs' | 'sm' | 'lg' | 'icon' | 'icon-xs' | 'icon-sm' | 'icon-lg';
28
- interface Props extends Omit<React$1.ComponentProps<typeof Core>, 'size' | 'variant' | 'type'> {
28
+ export interface Props extends Omit<React$1.ComponentProps<typeof Core>, 'size' | 'variant' | 'type'> {
29
29
  icon?: React$1.ReactNode;
30
30
  block?: boolean;
31
31
  danger?: boolean;
@@ -92,5 +92,5 @@ interface Props extends Omit<React$1.ComponentProps<typeof Core>, 'size' | 'vari
92
92
  }
93
93
  declare const Button: ({ icon, className, type, variant, htmlType, size, color, shape, block, disabled, loading, danger, nativeButton, children, onMouseDown, ...props }: Props) => React$1.JSX.Element;
94
94
  //#endregion
95
- export { Props, Button as default };
95
+ export { Button as default };
96
96
  //# sourceMappingURL=Button.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Button.d.mts","names":[],"sources":["../src/components/atoms/button.tsx"],"mappings":";;;;;cAYM,aAAI;;;;;;;;;;;;;KAcL;;;;;;;;KAUA;UAGY,cAAc,KAC7B,QAAM,sBAAsB;EAG5B,OAAO,QAAM;EACb;EACA;EACA;;;;;;;;EAQA,sCAAsC;;;;;;;;;;;;;;;;;;EAkBtC;;;;;;;;;;;;;;;;EAgBA,yEAOI;;;;;;EAMJ;EACA;;;;;;;EAOA,QAAQ;EACR;IAAsB,MAAM,QAAM;;;cAmH9B,WAAU,MAAA,WAAA,MAAA,SAAA,UAAA,MAAA,OAAA,OAAA,OAAA,UAAA,SAAA,QAAA,cAAA,UAAA,gBAAA,SAiBb,UAAK,QAAA,IAAA"}
1
+ {"version":3,"file":"Button.d.mts","names":["button","button.Button","React"],"sources":["../src/components/atoms/button.tsx"],"mappings":";;;;;cAYM,aAAIC;;;;;;;;;;;;;KAcL;;;;;;;;KAUA;iBAGY,cAAc,KAC7BC,QAAM,sBAAsB;EAG5B,OAAOA,QAAM;EACb;EACA;EACA;;;;;;;;EAQA,sCAAsC;;;;;;;;;;;;;;;;;;EAkBtC;;;;;;;;;;;;;;;;EAgBA,yEAOI;;;;;;EAMJ;EACA;;;;;;;EAOA,QAAQ;EACR;IAAsB,MAAMA,QAAM;;;cAmH9B,WAAU,MAAA,WAAA,MAAA,SAAA,UAAA,MAAA,OAAA,OAAA,OAAA,UAAA,SAAA,QAAA,cAAA,UAAA,gBAAA,SAiBb,UAAKA,QAAA,IAAA"}
package/dist/Button.mjs CHANGED
@@ -3,8 +3,8 @@ import { cn } from "./utils.mjs";
3
3
  import { useConfig } from "./providers/config/context.mjs";
4
4
  import { Button as Button$1 } from "./core/button.mjs";
5
5
  import "react";
6
- import { LoaderCircle } from "lucide-react";
7
6
  import { jsx, jsxs } from "react/jsx-runtime";
7
+ import { LoaderCircle } from "lucide-react";
8
8
  //#region src/components/atoms/button.tsx
9
9
  const Core = Button$1;
10
10
  const BUTTON_BASE = cn("gap-2 whitespace-nowrap font-medium transition-all", "has-[>svg]:px-3");
@@ -0,0 +1,28 @@
1
+ import { Calendar as Calendar$1, calendar_d_exports } from "./core/calendar.mjs";
2
+ import "./core/index.mjs";
3
+ import { ComponentProps, ReactNode } from "react";
4
+ //#region src/components/organisms/calendar.d.ts
5
+ type CellRenderer = (date: Date) => ReactNode;
6
+ export interface Props extends Omit<ComponentProps<'div'>, 'onChange' | 'children' | 'defaultValue'> {
7
+ /** Pass null for an explicitly empty controlled selection. */
8
+ value?: Date | null;
9
+ defaultValue?: Date;
10
+ onChange?: (date: Date | undefined) => void;
11
+ month?: Date;
12
+ defaultMonth?: Date;
13
+ onMonthChange?: (month: Date) => void;
14
+ disabledDate?: (date: Date) => boolean;
15
+ minDate?: Date;
16
+ maxDate?: Date;
17
+ locale?: ComponentProps<typeof Calendar$1>['locale'];
18
+ weekStartsOn?: ComponentProps<typeof Calendar$1>['weekStartsOn'];
19
+ expanded?: boolean;
20
+ renderDate?: CellRenderer;
21
+ classNames?: {
22
+ calendar?: string;
23
+ };
24
+ }
25
+ declare const Calendar: ({ value, defaultValue, onChange, month, defaultMonth, onMonthChange, disabledDate, minDate, maxDate, locale, weekStartsOn, expanded, renderDate, className, classNames, dir, ...props }: Props) => import("react").JSX.Element;
26
+ //#endregion
27
+ export { Calendar as default };
28
+ //# sourceMappingURL=Calendar.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Calendar.d.mts","names":["calendar","calendar.Calendar"],"sources":["../src/components/organisms/calendar.tsx"],"mappings":";;;;KAgBK,gBAAgB,MAAM,SAAS;iBAkBnB,cAAc,KAC7B;;EAIA,QAAQ;EACR,eAAe;EACf,YAAY,MAAM;EAClB,QAAQ;EACR,eAAe;EACf,iBAAiB,OAAO;EACxB,gBAAgB,MAAM;EACtB,UAAU;EACV,UAAU;EACV,SAAS,sBAAsBC;EAC/B,eAAe,sBAAsBA;EACrC;EACA,aAAa;EACb;IAAe;;;cAGX,aAAY,OAAA,cAAA,UAAA,OAAA,cAAA,eAAA,cAAA,SAAA,SAAA,QAAA,cAAA,UAAA,YAAA,WAAA,YAAA,QAAA,SAkBf,0BAAK,IAAA"}
@@ -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"}