@jbpark/ui-kit 10.3.0 → 10.4.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 (252) hide show
  1. package/README.ko.md +97 -76
  2. package/README.md +91 -70
  3. package/dist/AutoComplete.mjs +1 -1
  4. package/dist/Breadcrumb.mjs +1 -1
  5. package/dist/Cascader.mjs +2 -2
  6. package/dist/Checkbox.d.mts +10 -0
  7. package/dist/Checkbox.d.mts.map +1 -0
  8. package/dist/Checkbox.mjs +9 -0
  9. package/dist/Checkbox.mjs.map +1 -0
  10. package/dist/CodeEditor.d.mts +8 -2
  11. package/dist/CodeEditor.d.mts.map +1 -1
  12. package/dist/CodeEditor.mjs +9 -4
  13. package/dist/CodeEditor.mjs.map +1 -1
  14. package/dist/{components/molecules/collapse.d.mts → Collapse.d.mts} +1 -1
  15. package/dist/Collapse.d.mts.map +1 -0
  16. package/dist/{components/molecules/collapse.mjs → Collapse.mjs} +3 -3
  17. package/dist/Collapse.mjs.map +1 -0
  18. package/dist/{components/atoms/color-picker.d.mts → ColorPicker.d.mts} +1 -1
  19. package/dist/ColorPicker.d.mts.map +1 -0
  20. package/dist/{components/atoms/color-picker.mjs → ColorPicker.mjs} +3 -3
  21. package/dist/ColorPicker.mjs.map +1 -0
  22. package/dist/{components/templates/container.d.mts → Container.d.mts} +1 -1
  23. package/dist/Container.d.mts.map +1 -0
  24. package/dist/{components/templates/container.mjs → Container.mjs} +2 -2
  25. package/dist/Container.mjs.map +1 -0
  26. package/dist/{components/atoms/date-picker.d.mts → DatePicker.d.mts} +1 -1
  27. package/dist/DatePicker.d.mts.map +1 -0
  28. package/dist/{components/atoms/date-picker.mjs → DatePicker.mjs} +6 -6
  29. package/dist/DatePicker.mjs.map +1 -0
  30. package/dist/{components/organisms/drawer.d.mts → Drawer.d.mts} +1 -1
  31. package/dist/Drawer.d.mts.map +1 -0
  32. package/dist/{components/organisms/drawer.mjs → Drawer.mjs} +5 -5
  33. package/dist/Drawer.mjs.map +1 -0
  34. package/dist/{components/molecules/dropdown.d.mts → Dropdown.d.mts} +2 -2
  35. package/dist/Dropdown.d.mts.map +1 -0
  36. package/dist/{components/molecules/dropdown.mjs → Dropdown.mjs} +4 -4
  37. package/dist/Dropdown.mjs.map +1 -0
  38. package/dist/{components/templates/empty.d.mts → Empty.d.mts} +2 -2
  39. package/dist/Empty.d.mts.map +1 -0
  40. package/dist/{components/templates/empty.mjs → Empty.mjs} +3 -3
  41. package/dist/Empty.mjs.map +1 -0
  42. package/dist/FloatButton.d.mts +10 -0
  43. package/dist/FloatButton.d.mts.map +1 -0
  44. package/dist/FloatButton.mjs +9 -0
  45. package/dist/FloatButton.mjs.map +1 -0
  46. package/dist/Input.d.mts +16 -0
  47. package/dist/Input.d.mts.map +1 -0
  48. package/dist/Input.mjs +15 -0
  49. package/dist/Input.mjs.map +1 -0
  50. package/dist/{components/organisms/list/index.d.mts → List.d.mts} +3 -3
  51. package/dist/List.d.mts.map +1 -0
  52. package/dist/List.mjs +9 -0
  53. package/dist/List.mjs.map +1 -0
  54. package/dist/Marquees.d.mts +10 -0
  55. package/dist/Marquees.d.mts.map +1 -0
  56. package/dist/Marquees.mjs +9 -0
  57. package/dist/Marquees.mjs.map +1 -0
  58. package/dist/Mentions.d.mts.map +1 -1
  59. package/dist/Mentions.mjs +8 -7
  60. package/dist/Mentions.mjs.map +1 -1
  61. package/dist/{components/organisms/modal.d.mts → Modal.d.mts} +1 -1
  62. package/dist/Modal.d.mts.map +1 -0
  63. package/dist/{components/organisms/modal.mjs → Modal.mjs} +6 -6
  64. package/dist/Modal.mjs.map +1 -0
  65. package/dist/{components/templates/page-header.d.mts → PageHeader.d.mts} +1 -1
  66. package/dist/PageHeader.d.mts.map +1 -0
  67. package/dist/{components/templates/page-header.mjs → PageHeader.mjs} +4 -4
  68. package/dist/PageHeader.mjs.map +1 -0
  69. package/dist/Pagination.mjs +2 -2
  70. package/dist/Popconfirm.d.mts +1 -1
  71. package/dist/Popconfirm.mjs +1 -1
  72. package/dist/{components/atoms/popover.d.mts → Popover.d.mts} +1 -1
  73. package/dist/Popover.d.mts.map +1 -0
  74. package/dist/{components/atoms/popover.mjs → Popover.mjs} +4 -4
  75. package/dist/Popover.mjs.map +1 -0
  76. package/dist/{components/atoms/progress.d.mts → Progress.d.mts} +1 -1
  77. package/dist/Progress.d.mts.map +1 -0
  78. package/dist/{components/atoms/progress.mjs → Progress.mjs} +3 -3
  79. package/dist/Progress.mjs.map +1 -0
  80. package/dist/Radio.d.mts +10 -0
  81. package/dist/Radio.d.mts.map +1 -0
  82. package/dist/Radio.mjs +9 -0
  83. package/dist/Radio.mjs.map +1 -0
  84. package/dist/{components/templates/result.d.mts → Result.d.mts} +1 -1
  85. package/dist/Result.d.mts.map +1 -0
  86. package/dist/{components/templates/result.mjs → Result.mjs} +2 -2
  87. package/dist/Result.mjs.map +1 -0
  88. package/dist/RichTextEditor.d.mts +3 -0
  89. package/dist/RichTextEditor.mjs +1 -0
  90. package/dist/{components/atoms/select.d.mts → Select.d.mts} +5 -5
  91. package/dist/Select.d.mts.map +1 -0
  92. package/dist/{components/atoms/select.mjs → Select.mjs} +5 -5
  93. package/dist/Select.mjs.map +1 -0
  94. package/dist/Skeleton.d.mts +12 -0
  95. package/dist/Skeleton.d.mts.map +1 -0
  96. package/dist/Skeleton.mjs +11 -0
  97. package/dist/Skeleton.mjs.map +1 -0
  98. package/dist/Slider.d.mts +2 -0
  99. package/dist/{components/atoms/slider/index.mjs → Slider.mjs} +2 -2
  100. package/dist/Slider.mjs.map +1 -0
  101. package/dist/Space.d.mts +3 -2
  102. package/dist/Space.d.mts.map +1 -1
  103. package/dist/Space.mjs +13 -4
  104. package/dist/Space.mjs.map +1 -1
  105. package/dist/{components/atoms/spin.d.mts → Spin.d.mts} +1 -1
  106. package/dist/Spin.d.mts.map +1 -0
  107. package/dist/{components/atoms/spin.mjs → Spin.mjs} +3 -3
  108. package/dist/Spin.mjs.map +1 -0
  109. package/dist/Splitter.d.mts +10 -0
  110. package/dist/Splitter.d.mts.map +1 -0
  111. package/dist/Splitter.mjs +9 -0
  112. package/dist/Splitter.mjs.map +1 -0
  113. package/dist/Statistic.mjs +1 -1
  114. package/dist/Swiper.d.mts +10 -0
  115. package/dist/Swiper.d.mts.map +1 -0
  116. package/dist/Swiper.mjs +9 -0
  117. package/dist/Swiper.mjs.map +1 -0
  118. package/dist/{components/atoms/switch.d.mts → Switch.d.mts} +2 -2
  119. package/dist/Switch.d.mts.map +1 -0
  120. package/dist/{components/atoms/switch.mjs → Switch.mjs} +4 -4
  121. package/dist/Switch.mjs.map +1 -0
  122. package/dist/Table.mjs +2 -2
  123. package/dist/Table.mjs.map +1 -1
  124. package/dist/{components/molecules/tabs.d.mts → Tabs.d.mts} +3 -3
  125. package/dist/Tabs.d.mts.map +1 -0
  126. package/dist/{components/molecules/tabs.mjs → Tabs.mjs} +3 -3
  127. package/dist/Tabs.mjs.map +1 -0
  128. package/dist/TimePicker.mjs +1 -1
  129. package/dist/{components/organisms/toast.d.mts → Toast.d.mts} +12 -2
  130. package/dist/Toast.d.mts.map +1 -0
  131. package/dist/Toast.mjs +198 -0
  132. package/dist/Toast.mjs.map +1 -0
  133. package/dist/ToggleGroup.d.mts +28 -0
  134. package/dist/ToggleGroup.d.mts.map +1 -0
  135. package/dist/ToggleGroup.mjs +58 -0
  136. package/dist/ToggleGroup.mjs.map +1 -0
  137. package/dist/{components/atoms/tooltip.d.mts → Tooltip.d.mts} +1 -1
  138. package/dist/Tooltip.d.mts.map +1 -0
  139. package/dist/{components/atoms/tooltip.mjs → Tooltip.mjs} +2 -2
  140. package/dist/Tooltip.mjs.map +1 -0
  141. package/dist/Tour.d.mts.map +1 -1
  142. package/dist/Tour.mjs +47 -64
  143. package/dist/Tour.mjs.map +1 -1
  144. package/dist/Transfer.mjs +2 -2
  145. package/dist/Tree.mjs +1 -1
  146. package/dist/{components/molecules/upload.d.mts → Upload.d.mts} +1 -1
  147. package/dist/Upload.d.mts.map +1 -0
  148. package/dist/{components/molecules/upload.mjs → Upload.mjs} +7 -7
  149. package/dist/Upload.mjs.map +1 -0
  150. package/dist/components/atoms/index.d.mts +34 -27
  151. package/dist/components/atoms/input/input.d.mts +2 -1
  152. package/dist/components/atoms/input/input.d.mts.map +1 -1
  153. package/dist/components/atoms/input/input.mjs.map +1 -1
  154. package/dist/components/atoms/rich-text-editor/toolbar-presets.mjs +4 -4
  155. package/dist/components/atoms/select-multiple.mjs +1 -1
  156. package/dist/components/atoms/select-searchable.mjs +1 -1
  157. package/dist/components/molecules/index.d.mts +22 -21
  158. package/dist/components/organisms/form/control.mjs +1 -1
  159. package/dist/components/organisms/imperative-stack.mjs +16 -1
  160. package/dist/components/organisms/imperative-stack.mjs.map +1 -1
  161. package/dist/components/organisms/index.d.mts +15 -15
  162. package/dist/components/organisms/list/list.d.mts +1 -1
  163. package/dist/components/organisms/list/list.mjs +1 -1
  164. package/dist/components/organisms/swiper/swiper.d.mts +6 -0
  165. package/dist/components/organisms/swiper/swiper.d.mts.map +1 -1
  166. package/dist/components/organisms/swiper/swiper.mjs +1 -1
  167. package/dist/components/templates/index.d.mts +11 -12
  168. package/dist/components/templates/layout/sider.d.mts.map +1 -1
  169. package/dist/components/templates/layout/sider.mjs +4 -6
  170. package/dist/components/templates/layout/sider.mjs.map +1 -1
  171. package/dist/core/badge.d.mts +1 -1
  172. package/dist/core/button.d.mts +2 -2
  173. package/dist/index.d.mts +81 -74
  174. package/dist/index.mjs +31 -30
  175. package/dist/style.css +21 -0
  176. package/package.json +157 -2
  177. package/dist/components/atoms/checkbox/index.d.mts +0 -10
  178. package/dist/components/atoms/checkbox/index.d.mts.map +0 -1
  179. package/dist/components/atoms/checkbox/index.mjs +0 -9
  180. package/dist/components/atoms/checkbox/index.mjs.map +0 -1
  181. package/dist/components/atoms/color-picker.d.mts.map +0 -1
  182. package/dist/components/atoms/color-picker.mjs.map +0 -1
  183. package/dist/components/atoms/date-picker.d.mts.map +0 -1
  184. package/dist/components/atoms/date-picker.mjs.map +0 -1
  185. package/dist/components/atoms/float-button/index.d.mts +0 -10
  186. package/dist/components/atoms/float-button/index.d.mts.map +0 -1
  187. package/dist/components/atoms/float-button/index.mjs +0 -9
  188. package/dist/components/atoms/float-button/index.mjs.map +0 -1
  189. package/dist/components/atoms/input/index.d.mts +0 -16
  190. package/dist/components/atoms/input/index.d.mts.map +0 -1
  191. package/dist/components/atoms/input/index.mjs +0 -15
  192. package/dist/components/atoms/input/index.mjs.map +0 -1
  193. package/dist/components/atoms/popover.d.mts.map +0 -1
  194. package/dist/components/atoms/popover.mjs.map +0 -1
  195. package/dist/components/atoms/progress.d.mts.map +0 -1
  196. package/dist/components/atoms/progress.mjs.map +0 -1
  197. package/dist/components/atoms/radio/index.d.mts +0 -10
  198. package/dist/components/atoms/radio/index.d.mts.map +0 -1
  199. package/dist/components/atoms/radio/index.mjs +0 -9
  200. package/dist/components/atoms/radio/index.mjs.map +0 -1
  201. package/dist/components/atoms/rich-text-editor/index.d.mts +0 -3
  202. package/dist/components/atoms/select.d.mts.map +0 -1
  203. package/dist/components/atoms/select.mjs.map +0 -1
  204. package/dist/components/atoms/skeleton/index.d.mts +0 -12
  205. package/dist/components/atoms/skeleton/index.d.mts.map +0 -1
  206. package/dist/components/atoms/skeleton/index.mjs +0 -11
  207. package/dist/components/atoms/skeleton/index.mjs.map +0 -1
  208. package/dist/components/atoms/slider/index.mjs.map +0 -1
  209. package/dist/components/atoms/spin.d.mts.map +0 -1
  210. package/dist/components/atoms/spin.mjs.map +0 -1
  211. package/dist/components/atoms/switch.d.mts.map +0 -1
  212. package/dist/components/atoms/switch.mjs.map +0 -1
  213. package/dist/components/atoms/tooltip.d.mts.map +0 -1
  214. package/dist/components/atoms/tooltip.mjs.map +0 -1
  215. package/dist/components/molecules/collapse.d.mts.map +0 -1
  216. package/dist/components/molecules/collapse.mjs.map +0 -1
  217. package/dist/components/molecules/dropdown.d.mts.map +0 -1
  218. package/dist/components/molecules/dropdown.mjs.map +0 -1
  219. package/dist/components/molecules/marquees/index.d.mts +0 -10
  220. package/dist/components/molecules/marquees/index.d.mts.map +0 -1
  221. package/dist/components/molecules/marquees/index.mjs +0 -9
  222. package/dist/components/molecules/marquees/index.mjs.map +0 -1
  223. package/dist/components/molecules/splitter/index.d.mts +0 -10
  224. package/dist/components/molecules/splitter/index.d.mts.map +0 -1
  225. package/dist/components/molecules/splitter/index.mjs +0 -9
  226. package/dist/components/molecules/splitter/index.mjs.map +0 -1
  227. package/dist/components/molecules/tabs.d.mts.map +0 -1
  228. package/dist/components/molecules/tabs.mjs.map +0 -1
  229. package/dist/components/molecules/upload.d.mts.map +0 -1
  230. package/dist/components/molecules/upload.mjs.map +0 -1
  231. package/dist/components/organisms/drawer.d.mts.map +0 -1
  232. package/dist/components/organisms/drawer.mjs.map +0 -1
  233. package/dist/components/organisms/list/index.d.mts.map +0 -1
  234. package/dist/components/organisms/list/index.mjs +0 -9
  235. package/dist/components/organisms/list/index.mjs.map +0 -1
  236. package/dist/components/organisms/modal.d.mts.map +0 -1
  237. package/dist/components/organisms/modal.mjs.map +0 -1
  238. package/dist/components/organisms/swiper/index.d.mts +0 -10
  239. package/dist/components/organisms/swiper/index.d.mts.map +0 -1
  240. package/dist/components/organisms/swiper/index.mjs +0 -9
  241. package/dist/components/organisms/swiper/index.mjs.map +0 -1
  242. package/dist/components/organisms/toast.d.mts.map +0 -1
  243. package/dist/components/organisms/toast.mjs +0 -126
  244. package/dist/components/organisms/toast.mjs.map +0 -1
  245. package/dist/components/templates/container.d.mts.map +0 -1
  246. package/dist/components/templates/container.mjs.map +0 -1
  247. package/dist/components/templates/empty.d.mts.map +0 -1
  248. package/dist/components/templates/empty.mjs.map +0 -1
  249. package/dist/components/templates/page-header.d.mts.map +0 -1
  250. package/dist/components/templates/page-header.mjs.map +0 -1
  251. package/dist/components/templates/result.d.mts.map +0 -1
  252. package/dist/components/templates/result.mjs.map +0 -1
@@ -1,6 +1,6 @@
1
1
  "use client";
2
- import { cn } from "../../utils.mjs";
3
- import { DEFAULT_LOCALE, useConfig } from "../../providers/config/context.mjs";
2
+ import { cn } from "./utils.mjs";
3
+ import { DEFAULT_LOCALE, useConfig } from "./providers/config/context.mjs";
4
4
  import { jsx, jsxs } from "react/jsx-runtime";
5
5
  import { Loader2 } from "lucide-react";
6
6
  //#region src/components/atoms/spin.tsx
@@ -35,4 +35,4 @@ const Spin = ({ spinning, className, children, ...props }) => {
35
35
  //#endregion
36
36
  export { Spin as default };
37
37
 
38
- //# sourceMappingURL=spin.mjs.map
38
+ //# sourceMappingURL=Spin.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Spin.mjs","names":[],"sources":["../src/components/atoms/spin.tsx"],"sourcesContent":["'use client';\n\nimport { Loader2 } from 'lucide-react';\n\nimport { DEFAULT_LOCALE, useConfig } from '@repo/ui/providers';\nimport { cn } from '@repo/ui/utils';\n\nexport interface Props extends React.ComponentPropsWithoutRef<'div'> {\n spinning?: boolean;\n}\n\nconst Spin = ({ spinning, className, children, ...props }: Props) => {\n const { locale } = useConfig();\n const loadingLabel = locale.loading ?? DEFAULT_LOCALE.loading;\n\n // With no children there's nothing to render at all while idle — unlike\n // the branch below, there's no wrapper for `className`/`props` to land\n // on regardless, so returning null here isn't the same bug.\n if (!children) {\n if (!spinning) {\n return null;\n }\n\n return (\n <div\n role=\"status\"\n aria-label={loadingLabel}\n className={cn('flex h-full items-center justify-center', className)}\n {...props}\n >\n <Loader2 className=\"animate-spin\" />\n </div>\n );\n }\n\n // Idle: return children as-is rather than inserting a wrapper div, same\n // policy Skeleton follows and for the same reason — a wrapper here could\n // produce invalid markup (e.g. inside a <tr>/<li>) or break flex/grid\n // child layout. className/props only ever describe the spinning overlay\n // below, so there's nothing for them to apply to while idle.\n if (!spinning) {\n return children;\n }\n\n return (\n <div className={cn('relative', className)} {...props}>\n <div className=\"pointer-events-none opacity-50\">{children}</div>\n <div\n role=\"status\"\n aria-label={loadingLabel}\n className=\"absolute inset-0 flex items-center justify-center\"\n >\n <Loader2 className=\"animate-spin\" />\n </div>\n </div>\n );\n};\n\nexport default Spin;\n"],"mappings":";;;;;;AAWA,MAAM,QAAQ,EAAE,UAAU,WAAW,UAAU,GAAG,YAAmB;CACnE,MAAM,EAAE,WAAW,UAAU;CAC7B,MAAM,eAAe,OAAO,WAAW,eAAe;CAKtD,IAAI,CAAC,UAAU;EACb,IAAI,CAAC,UACH,OAAO;EAGT,OACE,oBAAC,OAAD;GACE,MAAK;GACL,cAAY;GACZ,WAAW,GAAG,2CAA2C,SAAS;GAClE,GAAI;GAEJ,UAAA,oBAAC,SAAD,EAAS,WAAU,eAAgB,CAAA;EAChC,CAAA;CAET;CAOA,IAAI,CAAC,UACH,OAAO;CAGT,OACE,qBAAC,OAAD;EAAK,WAAW,GAAG,YAAY,SAAS;EAAG,GAAI;EAA/C,UAAA,CACE,oBAAC,OAAD;GAAK,WAAU;GAAkC;EAAc,CAAA,GAC/D,oBAAC,OAAD;GACE,MAAK;GACL,cAAY;GACZ,WAAU;GAEV,UAAA,oBAAC,SAAD,EAAS,WAAU,eAAgB,CAAA;EAChC,CAAA,CACF;;AAET"}
@@ -0,0 +1,10 @@
1
+ import Panel, { Props as Props$1 } from "./components/molecules/splitter/panel.mjs";
2
+ import Splitter$1, { Props } from "./components/molecules/splitter/splitter.mjs";
3
+ //#region src/components/molecules/splitter/index.d.ts
4
+ type SplitterComponent = typeof Splitter$1 & {
5
+ Panel: typeof Panel;
6
+ };
7
+ declare const Splitter: SplitterComponent;
8
+ //#endregion
9
+ export { type Props, type Props$1 as SplitterPanelProps, Splitter as default };
10
+ //# sourceMappingURL=Splitter.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Splitter.d.mts","names":["SplitterImpl"],"sources":["../src/components/molecules/splitter/index.ts"],"mappings":";;;KAGK,2BAA2BA;EAAiB,cAAc;;cAEzD,UAA2B"}
@@ -0,0 +1,9 @@
1
+ import Panel from "./components/molecules/splitter/panel.mjs";
2
+ import Splitter$1 from "./components/molecules/splitter/splitter.mjs";
3
+ //#region src/components/molecules/splitter/index.ts
4
+ const Splitter = Splitter$1;
5
+ Splitter.Panel = Panel;
6
+ //#endregion
7
+ export { Splitter as default };
8
+
9
+ //# sourceMappingURL=Splitter.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Splitter.mjs","names":["SplitterImpl"],"sources":["../src/components/molecules/splitter/index.ts"],"sourcesContent":["import Panel, { type Props as SplitterPanelProps } from './panel';\nimport SplitterImpl, { type Props } from './splitter';\n\ntype SplitterComponent = typeof SplitterImpl & { Panel: typeof Panel };\n\nconst Splitter = SplitterImpl as SplitterComponent;\n\nSplitter.Panel = Panel;\n\nexport default Splitter;\nexport type { Props, SplitterPanelProps };\n"],"mappings":";;;AAKA,MAAM,WAAWA;AAEjB,SAAS,QAAQ"}
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import { cn } from "./utils.mjs";
3
- import Skeleton from "./components/atoms/skeleton/index.mjs";
3
+ import Skeleton from "./Skeleton.mjs";
4
4
  import { jsx, jsxs } from "react/jsx-runtime";
5
5
  //#region src/components/molecules/statistic.tsx
6
6
  const Statistic = ({ title, value, prefix, suffix, precision, locale = "en-US", formatter, loading = false, className, classNames, ...props }) => {
@@ -0,0 +1,10 @@
1
+ import Slide from "./components/organisms/swiper/slide.mjs";
2
+ import Swiper$1, { Props, initialOptions } from "./components/organisms/swiper/swiper.mjs";
3
+ //#region src/components/organisms/swiper/index.d.ts
4
+ type SwiperComponent = typeof Swiper$1 & {
5
+ Slide: typeof Slide;
6
+ };
7
+ declare const Swiper: SwiperComponent;
8
+ //#endregion
9
+ export { type Props as SwiperProps, Swiper as default, initialOptions };
10
+ //# sourceMappingURL=Swiper.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Swiper.d.mts","names":["SwiperImpl"],"sources":["../src/components/organisms/swiper/index.ts"],"mappings":";;;KAGK,yBAAyBA;EAAe,cAAc;;cAErD,QAAuB"}
@@ -0,0 +1,9 @@
1
+ import Slide from "./components/organisms/swiper/slide.mjs";
2
+ import Swiper$1, { initialOptions } from "./components/organisms/swiper/swiper.mjs";
3
+ //#region src/components/organisms/swiper/index.ts
4
+ const Swiper = Swiper$1;
5
+ Swiper.Slide = Slide;
6
+ //#endregion
7
+ export { Swiper as default, initialOptions };
8
+
9
+ //# sourceMappingURL=Swiper.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Swiper.mjs","names":["SwiperImpl"],"sources":["../src/components/organisms/swiper/index.ts"],"sourcesContent":["import Slide from './slide';\nimport SwiperImpl, { initialOptions } from './swiper';\n\ntype SwiperComponent = typeof SwiperImpl & { Slide: typeof Slide };\n\nconst Swiper = SwiperImpl as SwiperComponent;\n\nSwiper.Slide = Slide;\n\nexport default Swiper;\nexport { initialOptions };\nexport type { Props as SwiperProps } from './swiper';\n"],"mappings":";;;AAKA,MAAM,SAASA;AAEf,OAAO,QAAQ"}
@@ -1,4 +1,4 @@
1
- import { ComponentSize } from "../../providers/config/types.mjs";
1
+ import { ComponentSize } from "./providers/config/types.mjs";
2
2
  //#region src/components/atoms/switch.d.ts
3
3
  export interface Props extends Omit<React.ComponentPropsWithoutRef<'span'>, 'onChange'> {
4
4
  classNames?: {
@@ -23,4 +23,4 @@ export interface Props extends Omit<React.ComponentPropsWithoutRef<'span'>, 'onC
23
23
  declare const Switch: ({ className, classNames, size, defaultChecked, checked: _checked, onChange: _onChange, checkedChildren, unCheckedChildren, ...props }: Props) => import("react").JSX.Element;
24
24
  //#endregion
25
25
  export { Switch as default };
26
- //# sourceMappingURL=switch.d.mts.map
26
+ //# sourceMappingURL=Switch.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Switch.d.mts","names":[],"sources":["../src/components/atoms/switch.tsx"],"mappings":";;iBAiDiB,cAAc,KAC7B,MAAM;EAGN;IACE;IACA;;;;;;;;;EASF,OAAO;EACP;EACA;EACA;EACA,YAAY;EACZ,kBAAkB,MAAM;EACxB,oBAAoB,MAAM;;cAGtB,WAAU,WAAA,YAAA,MAAA,gBAAA,SAAA,UAAA,UAAA,WAAA,iBAAA,sBAAA,SAUb,0BAAK,IAAA"}
@@ -1,7 +1,7 @@
1
1
  "use client";
2
- import { cn } from "../../utils.mjs";
3
- import { useConfig } from "../../providers/config/context.mjs";
4
- import { switch_exports } from "../../core/switch.mjs";
2
+ import { cn } from "./utils.mjs";
3
+ import { useConfig } from "./providers/config/context.mjs";
4
+ import { switch_exports } from "./core/switch.mjs";
5
5
  import { useControllableState } from "@jbpark/use-hooks";
6
6
  import { jsx, jsxs } from "react/jsx-runtime";
7
7
  //#region src/components/atoms/switch.tsx
@@ -70,4 +70,4 @@ const Switch = ({ className, classNames, size, defaultChecked, checked: _checked
70
70
  //#endregion
71
71
  export { Switch as default };
72
72
 
73
- //# sourceMappingURL=switch.mjs.map
73
+ //# sourceMappingURL=Switch.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Switch.mjs","names":["switchComponent"],"sources":["../src/components/atoms/switch.tsx"],"sourcesContent":["'use client';\n\nimport { useControllableState } from '@jbpark/use-hooks';\n\nimport { type ComponentSize, useConfig } from '@repo/ui/providers';\nimport { cn } from '@repo/ui/utils';\n\nimport { switchComponent } from '../../core';\n\nconst { Switch: Core } = switchComponent;\n\n// Keyed by the shared `ComponentSize` vocabulary (#350). The `calc` offset on\n// each `handleChecked` is `handle width + 2px` (the `left-0.5` inset), so the\n// handle lands flush at both ends — it must be recomputed per row, not copied.\nconst sizeConfig = {\n small: {\n core: 'sm' as const,\n track: 'h-6! w-10!',\n handle: 'size-5!',\n handleChecked:\n 'data-unchecked:left-0.5 data-checked:left-[calc(100%-22px)]',\n fontSize: 'text-[10px]',\n marginChecked: 'mr-6 ml-1.5',\n marginUnchecked: 'mr-1.5 ml-6',\n },\n middle: {\n core: 'default' as const,\n track: 'h-8! w-12!',\n handle: 'size-6!',\n handleChecked:\n 'data-unchecked:left-0.5 data-checked:left-[calc(100%-26px)]',\n fontSize: 'text-xs',\n marginChecked: 'mr-7 ml-2',\n marginUnchecked: 'mr-2 ml-7',\n },\n large: {\n core: 'default' as const,\n track: 'h-10! w-16!',\n handle: 'size-8!',\n handleChecked:\n 'data-unchecked:left-0.5 data-checked:left-[calc(100%-34px)]',\n fontSize: 'text-sm',\n marginChecked: 'mr-9 ml-2.5',\n marginUnchecked: 'mr-2.5 ml-9',\n },\n} satisfies Record<ComponentSize, unknown>;\n\n// Base UI's Switch renders a `<span>` (plus a hidden `<input>`), not the\n// `<button>` Radix used — so the forwarded host props are span-based now.\nexport interface Props extends Omit<\n React.ComponentPropsWithoutRef<'span'>,\n 'onChange'\n> {\n classNames?: {\n track?: string;\n handle?: string;\n };\n /**\n * Density on the shared `ComponentSize` scale (`small` | `middle` | `large`),\n * falling back to the nearest `Config`'s `componentSize`, then `middle`.\n *\n * `medium` is accepted as a deprecated alias of `middle` — kept so existing\n * `size=\"medium\"` calls keep working; removed in the next major.\n */\n size?: ComponentSize | 'medium';\n defaultChecked?: boolean;\n checked?: boolean;\n disabled?: boolean;\n onChange?: (checked: boolean) => void;\n checkedChildren?: React.ReactNode;\n unCheckedChildren?: React.ReactNode;\n}\n\nconst Switch = ({\n className,\n classNames,\n size,\n defaultChecked,\n checked: _checked,\n onChange: _onChange = () => {},\n checkedChildren,\n unCheckedChildren,\n ...props\n}: Props) => {\n const [checked, onChange] = useControllableState<boolean>({\n value: _checked,\n defaultValue: defaultChecked ?? false,\n onChange: _onChange,\n });\n\n const { componentSize } = useConfig();\n // `medium` is the deprecated spelling of `middle`; an explicit `size` wins,\n // then the Config default, then `middle`.\n const resolvedSize =\n (size === 'medium' ? 'middle' : size) ?? componentSize ?? 'middle';\n\n const hasChildren = !!(checkedChildren || unCheckedChildren);\n const config = sizeConfig[resolvedSize];\n\n return (\n <Core\n checked={checked}\n size={config.core}\n className={cn(\n 'relative',\n config.track,\n hasChildren && 'w-auto! overflow-hidden',\n className,\n classNames?.track,\n //\n )}\n handleClassName={cn(\n config.handle,\n '!absolute top-1/2 !-translate-y-1/2 !translate-x-0',\n 'transition-[left] duration-200 will-change-[left]',\n config.handleChecked,\n classNames?.handle,\n //\n )}\n onCheckedChange={checked => {\n onChange(checked);\n }}\n {...props}\n >\n {hasChildren && (\n <span\n className={cn(\n `grid leading-none transition-[margin] duration-200\n will-change-[margin]`,\n config.fontSize,\n checked\n ? [config.marginChecked, 'text-primary-foreground']\n : [config.marginUnchecked, 'text-foreground'],\n //\n )}\n >\n <span\n className={cn(\n 'col-start-1 row-start-1 transition-opacity duration-200',\n checked ? 'opacity-100' : 'opacity-0',\n )}\n >\n {checkedChildren}\n </span>\n <span\n className={cn(\n 'col-start-1 row-start-1 transition-opacity duration-200',\n checked ? 'opacity-0' : 'opacity-100',\n )}\n >\n {unCheckedChildren}\n </span>\n </span>\n )}\n </Core>\n );\n};\n\nexport default Switch;\n"],"mappings":";;;;;;;AASA,MAAM,EAAE,QAAQ,SAASA;AAKzB,MAAM,aAAa;CACjB,OAAO;EACL,MAAM;EACN,OAAO;EACP,QAAQ;EACR,eACE;EACF,UAAU;EACV,eAAe;EACf,iBAAiB;CACnB;CACA,QAAQ;EACN,MAAM;EACN,OAAO;EACP,QAAQ;EACR,eACE;EACF,UAAU;EACV,eAAe;EACf,iBAAiB;CACnB;CACA,OAAO;EACL,MAAM;EACN,OAAO;EACP,QAAQ;EACR,eACE;EACF,UAAU;EACV,eAAe;EACf,iBAAiB;CACnB;AACF;AA4BA,MAAM,UAAU,EACd,WACA,YACA,MACA,gBACA,SAAS,UACT,UAAU,kBAAkB,CAAC,GAC7B,iBACA,mBACA,GAAG,YACQ;CACX,MAAM,CAAC,SAAS,YAAY,qBAA8B;EACxD,OAAO;EACP,cAAc,kBAAkB;EAChC,UAAU;CACZ,CAAC;CAED,MAAM,EAAE,kBAAkB,UAAU;CAGpC,MAAM,gBACH,SAAS,WAAW,WAAW,SAAS,iBAAiB;CAE5D,MAAM,cAAc,CAAC,EAAE,mBAAmB;CAC1C,MAAM,SAAS,WAAW;CAE1B,OACE,oBAAC,MAAD;EACW;EACT,MAAM,OAAO;EACb,WAAW,GACT,YACA,OAAO,OACP,eAAe,2BACf,WACA,YAAY,KAEd;EACA,iBAAiB,GACf,OAAO,QACP,sDACA,qDACA,OAAO,eACP,YAAY,MAEd;EACA,kBAAiB,YAAW;GAC1B,SAAS,OAAO;EAClB;EACA,GAAI;EAEH,UAAA,eACC,qBAAC,QAAD;GACE,WAAW,GACT;mCAEA,OAAO,UACP,UACI,CAAC,OAAO,eAAe,yBAAyB,IAChD,CAAC,OAAO,iBAAiB,iBAAiB,CAEhD;GATF,UAAA,CAWE,oBAAC,QAAD;IACE,WAAW,GACT,2DACA,UAAU,gBAAgB,WAC5B;IAEC,UAAA;GACG,CAAA,GACN,oBAAC,QAAD;IACE,WAAW,GACT,2DACA,UAAU,cAAc,aAC1B;IAEC,UAAA;GACG,CAAA,CACF;;CAEJ,CAAA;AAEV"}
package/dist/Table.mjs CHANGED
@@ -1,9 +1,9 @@
1
1
  "use client";
2
2
  import { cn } from "./utils.mjs";
3
3
  import { useConfig } from "./providers/config/context.mjs";
4
- import Skeleton from "./components/atoms/skeleton/index.mjs";
4
+ import Skeleton from "./Skeleton.mjs";
5
5
  import Pagination from "./Pagination.mjs";
6
- import Empty from "./components/templates/empty.mjs";
6
+ import Empty from "./Empty.mjs";
7
7
  import { useState } from "react";
8
8
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
9
9
  //#region src/components/organisms/table.tsx
@@ -1 +1 @@
1
- {"version":3,"file":"Table.mjs","names":[],"sources":["../src/components/organisms/table.tsx"],"sourcesContent":["'use client';\n\nimport { useState } from 'react';\n\nimport { useConfig } from '@repo/ui/providers';\nimport { cn } from '@repo/ui/utils';\n\nimport Skeleton from '../atoms/skeleton';\nimport Pagination, {\n type Props as PaginationProps,\n} from '../molecules/pagination';\nimport Empty from '../templates/empty';\n\nexport type PaginationOptions = Omit<PaginationProps, 'total'> &\n ({ mode?: 'client'; total?: never } | { mode: 'server'; total: number });\n\nexport interface Column<T> {\n key: React.Key;\n title: React.ReactNode;\n /** Field displayed when render is omitted. */\n dataIndex?: keyof T;\n render?: (record: T, index: number) => React.ReactNode;\n align?: 'left' | 'center' | 'right';\n width?: string | number;\n className?: string;\n headerClassName?: string;\n}\n\nexport interface Props<T> extends Omit<\n React.ComponentPropsWithoutRef<'table'>,\n 'children'\n> {\n columns: Column<T>[];\n data?: T[];\n /** Use a stable key when rows may be reordered or paged. */\n rowKey?: (record: T, index: number) => React.Key;\n caption?: React.ReactNode;\n loading?: boolean;\n empty?: React.ReactNode;\n size?: 'small' | 'middle' | 'large';\n bordered?: boolean;\n striped?: boolean;\n hoverable?: boolean;\n /** true paginates data locally; server mode expects current-page data. */\n pagination?: boolean | PaginationOptions;\n classNames?: {\n container?: string;\n header?: string;\n body?: string;\n row?: string;\n cell?: string;\n empty?: string;\n pagination?: string;\n };\n}\n\nconst clampPage = (page: number, pageCount: number) =>\n Math.min(\n Math.max(1, Number.isFinite(page) ? Math.floor(page) : 1),\n Math.max(1, pageCount),\n );\n\nconst normalizePageSize = (value: number) =>\n Number.isFinite(value) && value >= 1 ? Math.floor(value) : 10;\n\nconst Table = <T,>({\n columns,\n data = [],\n rowKey,\n loading = false,\n empty,\n size,\n bordered = false,\n striped = false,\n hoverable = true,\n pagination = false,\n caption,\n className,\n classNames,\n ...props\n}: Props<T>) => {\n const { componentSize } = useConfig();\n const paginationOptions: PaginationOptions =\n typeof pagination === 'object' ? pagination : {};\n const {\n mode = 'client',\n total: serverTotal,\n page: controlledPage,\n defaultPage = 1,\n pageSize: controlledPageSize,\n defaultPageSize = 10,\n onChange,\n onPageSizeChange,\n ...paginationProps\n } = paginationOptions;\n const [internal, setInternal] = useState(() => ({\n page: defaultPage,\n pageSize: normalizePageSize(defaultPageSize),\n pageCount: 0,\n }));\n const pageSize = normalizePageSize(controlledPageSize ?? internal.pageSize);\n const total = mode === 'server' ? (serverTotal ?? 0) : data.length;\n const pageCount = Math.ceil(total / pageSize);\n\n if (\n pagination &&\n controlledPage === undefined &&\n internal.pageCount !== pageCount\n ) {\n setInternal(current => ({\n ...current,\n page: clampPage(current.page, pageCount),\n pageCount,\n }));\n }\n\n const page = clampPage(controlledPage ?? internal.page, pageCount);\n const visibleData =\n pagination && mode === 'client'\n ? data.slice((page - 1) * pageSize, page * pageSize)\n : data;\n const resolvedSize = size ?? componentSize ?? 'middle';\n const cellPadding = {\n small: 'px-3 py-2',\n middle: 'px-4 py-3',\n large: 'px-5 py-4',\n }[resolvedSize];\n\n const handlePageChange = (next: number) => {\n if (controlledPage === undefined) {\n setInternal(current => ({ ...current, page: next }));\n }\n\n onChange?.(next);\n };\n\n const handlePageSizeChange = (next: number) => {\n if (controlledPageSize === undefined || controlledPage === undefined) {\n setInternal(current => ({\n ...current,\n page: controlledPage === undefined ? 1 : current.page,\n pageSize: controlledPageSize === undefined ? next : current.pageSize,\n pageCount: Math.ceil(total / next),\n }));\n }\n\n onPageSizeChange?.(next);\n };\n\n return (\n <>\n <div\n data-slot=\"table-container\"\n className={cn(\n 'w-full overflow-x-auto',\n bordered && 'rounded-md border',\n classNames?.container,\n //\n )}\n >\n <table\n {...props}\n data-slot=\"table\"\n aria-busy={loading || undefined}\n className={cn(\n 'w-full min-w-max border-collapse text-sm',\n className,\n //\n )}\n >\n {caption && <caption className=\"mb-2 text-start\">{caption}</caption>}\n <thead\n data-slot=\"table-header\"\n className={cn(\n 'bg-muted/50 border-b',\n classNames?.header,\n //\n )}\n >\n <tr>\n {columns.map(column => (\n <th\n key={column.key}\n scope=\"col\"\n style={{ width: column.width }}\n className={cn(\n 'text-foreground font-medium',\n cellPadding,\n column.align === 'center' && 'text-center',\n column.align === 'right' && 'text-right',\n column.align === undefined && 'text-start',\n bordered && 'border-e last:border-e-0',\n classNames?.cell,\n column.headerClassName,\n //\n )}\n >\n {column.title}\n </th>\n ))}\n </tr>\n </thead>\n <tbody data-slot=\"table-body\" className={classNames?.body}>\n {loading ? (\n <tr>\n <td\n colSpan={Math.max(columns.length, 1)}\n className={cellPadding}\n >\n <Skeleton count={3} className=\"py-2\" />\n </td>\n </tr>\n ) : visibleData.length === 0 ? (\n <tr>\n <td\n colSpan={Math.max(columns.length, 1)}\n className={cn(cellPadding, classNames?.empty)}\n >\n {empty ?? <Empty />}\n </td>\n </tr>\n ) : (\n visibleData.map((record, index) => (\n <tr\n key={rowKey?.(record, index) ?? index}\n data-slot=\"table-row\"\n className={cn(\n 'border-b last:border-b-0',\n striped && 'even:bg-muted/30',\n hoverable && 'hover:bg-muted/50',\n classNames?.row,\n //\n )}\n >\n {columns.map(column => {\n const value =\n column.dataIndex === undefined\n ? undefined\n : record[column.dataIndex];\n\n return (\n <td\n key={column.key}\n data-slot=\"table-cell\"\n className={cn(\n cellPadding,\n column.align === 'center' && 'text-center',\n column.align === 'right' && 'text-right',\n bordered && 'border-e last:border-e-0',\n classNames?.cell,\n column.className,\n //\n )}\n >\n {column.render\n ? column.render(record, index)\n : value == null\n ? null\n : String(value)}\n </td>\n );\n })}\n </tr>\n ))\n )}\n </tbody>\n </table>\n </div>\n {pagination && (\n <div\n data-slot=\"table-pagination\"\n className={cn(\n 'mt-4 flex justify-end',\n classNames?.pagination,\n //\n )}\n >\n <Pagination\n {...paginationProps}\n total={total}\n page={page}\n pageSize={pageSize}\n onChange={handlePageChange}\n onPageSizeChange={handlePageSizeChange}\n />\n </div>\n )}\n </>\n );\n};\n\nexport default Table;\n"],"mappings":"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"}
1
+ {"version":3,"file":"Table.mjs","names":[],"sources":["../src/components/organisms/table.tsx"],"sourcesContent":["'use client';\n\nimport { useState } from 'react';\n\nimport { useConfig } from '@repo/ui/providers';\nimport { cn } from '@repo/ui/utils';\n\nimport Skeleton from '../atoms/skeleton';\nimport Empty from '../molecules/empty';\nimport Pagination, {\n type Props as PaginationProps,\n} from '../molecules/pagination';\n\nexport type PaginationOptions = Omit<PaginationProps, 'total'> &\n ({ mode?: 'client'; total?: never } | { mode: 'server'; total: number });\n\nexport interface Column<T> {\n key: React.Key;\n title: React.ReactNode;\n /** Field displayed when render is omitted. */\n dataIndex?: keyof T;\n render?: (record: T, index: number) => React.ReactNode;\n align?: 'left' | 'center' | 'right';\n width?: string | number;\n className?: string;\n headerClassName?: string;\n}\n\nexport interface Props<T> extends Omit<\n React.ComponentPropsWithoutRef<'table'>,\n 'children'\n> {\n columns: Column<T>[];\n data?: T[];\n /** Use a stable key when rows may be reordered or paged. */\n rowKey?: (record: T, index: number) => React.Key;\n caption?: React.ReactNode;\n loading?: boolean;\n empty?: React.ReactNode;\n size?: 'small' | 'middle' | 'large';\n bordered?: boolean;\n striped?: boolean;\n hoverable?: boolean;\n /** true paginates data locally; server mode expects current-page data. */\n pagination?: boolean | PaginationOptions;\n classNames?: {\n container?: string;\n header?: string;\n body?: string;\n row?: string;\n cell?: string;\n empty?: string;\n pagination?: string;\n };\n}\n\nconst clampPage = (page: number, pageCount: number) =>\n Math.min(\n Math.max(1, Number.isFinite(page) ? Math.floor(page) : 1),\n Math.max(1, pageCount),\n );\n\nconst normalizePageSize = (value: number) =>\n Number.isFinite(value) && value >= 1 ? Math.floor(value) : 10;\n\nconst Table = <T,>({\n columns,\n data = [],\n rowKey,\n loading = false,\n empty,\n size,\n bordered = false,\n striped = false,\n hoverable = true,\n pagination = false,\n caption,\n className,\n classNames,\n ...props\n}: Props<T>) => {\n const { componentSize } = useConfig();\n const paginationOptions: PaginationOptions =\n typeof pagination === 'object' ? pagination : {};\n const {\n mode = 'client',\n total: serverTotal,\n page: controlledPage,\n defaultPage = 1,\n pageSize: controlledPageSize,\n defaultPageSize = 10,\n onChange,\n onPageSizeChange,\n ...paginationProps\n } = paginationOptions;\n const [internal, setInternal] = useState(() => ({\n page: defaultPage,\n pageSize: normalizePageSize(defaultPageSize),\n pageCount: 0,\n }));\n const pageSize = normalizePageSize(controlledPageSize ?? internal.pageSize);\n const total = mode === 'server' ? (serverTotal ?? 0) : data.length;\n const pageCount = Math.ceil(total / pageSize);\n\n if (\n pagination &&\n controlledPage === undefined &&\n internal.pageCount !== pageCount\n ) {\n setInternal(current => ({\n ...current,\n page: clampPage(current.page, pageCount),\n pageCount,\n }));\n }\n\n const page = clampPage(controlledPage ?? internal.page, pageCount);\n const visibleData =\n pagination && mode === 'client'\n ? data.slice((page - 1) * pageSize, page * pageSize)\n : data;\n const resolvedSize = size ?? componentSize ?? 'middle';\n const cellPadding = {\n small: 'px-3 py-2',\n middle: 'px-4 py-3',\n large: 'px-5 py-4',\n }[resolvedSize];\n\n const handlePageChange = (next: number) => {\n if (controlledPage === undefined) {\n setInternal(current => ({ ...current, page: next }));\n }\n\n onChange?.(next);\n };\n\n const handlePageSizeChange = (next: number) => {\n if (controlledPageSize === undefined || controlledPage === undefined) {\n setInternal(current => ({\n ...current,\n page: controlledPage === undefined ? 1 : current.page,\n pageSize: controlledPageSize === undefined ? next : current.pageSize,\n pageCount: Math.ceil(total / next),\n }));\n }\n\n onPageSizeChange?.(next);\n };\n\n return (\n <>\n <div\n data-slot=\"table-container\"\n className={cn(\n 'w-full overflow-x-auto',\n bordered && 'rounded-md border',\n classNames?.container,\n //\n )}\n >\n <table\n {...props}\n data-slot=\"table\"\n aria-busy={loading || undefined}\n className={cn(\n 'w-full min-w-max border-collapse text-sm',\n className,\n //\n )}\n >\n {caption && <caption className=\"mb-2 text-start\">{caption}</caption>}\n <thead\n data-slot=\"table-header\"\n className={cn(\n 'bg-muted/50 border-b',\n classNames?.header,\n //\n )}\n >\n <tr>\n {columns.map(column => (\n <th\n key={column.key}\n scope=\"col\"\n style={{ width: column.width }}\n className={cn(\n 'text-foreground font-medium',\n cellPadding,\n column.align === 'center' && 'text-center',\n column.align === 'right' && 'text-right',\n column.align === undefined && 'text-start',\n bordered && 'border-e last:border-e-0',\n classNames?.cell,\n column.headerClassName,\n //\n )}\n >\n {column.title}\n </th>\n ))}\n </tr>\n </thead>\n <tbody data-slot=\"table-body\" className={classNames?.body}>\n {loading ? (\n <tr>\n <td\n colSpan={Math.max(columns.length, 1)}\n className={cellPadding}\n >\n <Skeleton count={3} className=\"py-2\" />\n </td>\n </tr>\n ) : visibleData.length === 0 ? (\n <tr>\n <td\n colSpan={Math.max(columns.length, 1)}\n className={cn(cellPadding, classNames?.empty)}\n >\n {empty ?? <Empty />}\n </td>\n </tr>\n ) : (\n visibleData.map((record, index) => (\n <tr\n key={rowKey?.(record, index) ?? index}\n data-slot=\"table-row\"\n className={cn(\n 'border-b last:border-b-0',\n striped && 'even:bg-muted/30',\n hoverable && 'hover:bg-muted/50',\n classNames?.row,\n //\n )}\n >\n {columns.map(column => {\n const value =\n column.dataIndex === undefined\n ? undefined\n : record[column.dataIndex];\n\n return (\n <td\n key={column.key}\n data-slot=\"table-cell\"\n className={cn(\n cellPadding,\n column.align === 'center' && 'text-center',\n column.align === 'right' && 'text-right',\n bordered && 'border-e last:border-e-0',\n classNames?.cell,\n column.className,\n //\n )}\n >\n {column.render\n ? column.render(record, index)\n : value == null\n ? null\n : String(value)}\n </td>\n );\n })}\n </tr>\n ))\n )}\n </tbody>\n </table>\n </div>\n {pagination && (\n <div\n data-slot=\"table-pagination\"\n className={cn(\n 'mt-4 flex justify-end',\n classNames?.pagination,\n //\n )}\n >\n <Pagination\n {...paginationProps}\n total={total}\n page={page}\n pageSize={pageSize}\n onChange={handlePageChange}\n onPageSizeChange={handlePageSizeChange}\n />\n </div>\n )}\n </>\n );\n};\n\nexport default Table;\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import { Tabs as Tabs$1, tabs_d_exports } from "../../core/tabs.mjs";
2
- import "../../core/index.mjs";
1
+ import { Tabs as Tabs$1, tabs_d_exports } from "./core/tabs.mjs";
2
+ import "./core/index.mjs";
3
3
  import { ReactNode } from "react";
4
4
  //#region src/components/molecules/tabs.d.ts
5
5
  declare const Core: typeof Tabs$1;
@@ -38,4 +38,4 @@ export interface Props extends Omit<React.ComponentProps<typeof Core>, 'children
38
38
  declare const Tabs: ({ items, listLabel, keepMounted, activateOnFocus, scrollable, fitted, extra, classNames, defaultValue, onChange, onValueChange, orientation, ...props }: Props) => import("react").JSX.Element;
39
39
  //#endregion
40
40
  export { Tabs as default };
41
- //# sourceMappingURL=tabs.d.mts.map
41
+ //# sourceMappingURL=Tabs.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Tabs.d.mts","names":["tabs","tabs.Tabs"],"sources":["../src/components/molecules/tabs.tsx"],"mappings":";;;;cAQc,aAAIC;iBAED;EACf;EACA,OAAO;EACP,UAAU;EACV;;EAEA,OAAO;;iBAGQ,cAAc,KAC7B,MAAM,sBAAsB;EAG5B,OAAO;;EAEP,YAAY;;EAEZ,gBAAgB,MAAM,sBAAsB;EAC5C;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA,QAAQ;EACR;IACE;IACA;IACA;IACA;;;cAIE,SAAQ,OAAA,WAAA,aAAA,iBAAA,YAAA,QAAA,OAAA,YAAA,cAAA,UAAA,eAAA,gBAAA,SAcX,0BAAK,IAAA"}
@@ -1,6 +1,6 @@
1
1
  "use client";
2
- import { cn } from "../../utils.mjs";
3
- import { tabs_exports } from "../../core/tabs.mjs";
2
+ import { cn } from "./utils.mjs";
3
+ import { tabs_exports } from "./core/tabs.mjs";
4
4
  import { jsx, jsxs } from "react/jsx-runtime";
5
5
  //#region src/components/molecules/tabs.tsx
6
6
  const { Tabs: Core, TabsList, TabsTab, TabsPanel } = tabs_exports;
@@ -52,4 +52,4 @@ const Tabs = ({ items, listLabel = "Tabs", keepMounted = false, activateOnFocus
52
52
  //#endregion
53
53
  export { Tabs as default };
54
54
 
55
- //# sourceMappingURL=tabs.mjs.map
55
+ //# sourceMappingURL=Tabs.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Tabs.mjs","names":["tabs"],"sources":["../src/components/molecules/tabs.tsx"],"sourcesContent":["'use client';\n\nimport type { ReactNode } from 'react';\n\nimport { cn } from '@repo/ui/utils';\n\nimport { tabs } from '../../core';\n\nconst { Tabs: Core, TabsList, TabsTab, TabsPanel } = tabs;\n\nexport interface Item {\n key: string;\n label: ReactNode;\n children: ReactNode;\n disabled?: boolean;\n /** Decorative icon rendered before the label with consistent spacing. */\n icon?: ReactNode;\n}\n\nexport interface Props extends Omit<\n React.ComponentProps<typeof Core>,\n 'children' | 'onChange'\n> {\n items: Item[];\n /** Called when the selected tab changes. */\n onChange?: (value: string | number | null) => void;\n /** @deprecated Use `onChange` for the selected value. */\n onValueChange?: React.ComponentProps<typeof Core>['onValueChange'];\n listLabel?: string;\n /** Preserve inactive panel DOM and local state. */\n keepMounted?: boolean;\n /** Select a tab when arrow-key focus moves to it. */\n activateOnFocus?: boolean;\n /** Scroll the tab list when its items exceed the available space. */\n scrollable?: boolean;\n /** Give tabs equal width in horizontal mode; ignored when scrollable. */\n fitted?: boolean;\n /** Content shown after the tab list, outside the tablist role. */\n extra?: ReactNode;\n classNames?: {\n list?: string;\n tab?: string;\n panel?: string;\n extra?: string;\n };\n}\n\nconst Tabs = ({\n items,\n listLabel = 'Tabs',\n keepMounted = false,\n activateOnFocus = false,\n scrollable = false,\n fitted = false,\n extra,\n classNames,\n defaultValue,\n onChange,\n onValueChange,\n orientation = 'horizontal',\n ...props\n}: Props) => {\n const initialValue =\n defaultValue === undefined\n ? items.find(item => !item.disabled)?.key\n : defaultValue;\n\n return (\n <Core\n defaultValue={props.value === undefined ? initialValue : undefined}\n orientation={orientation}\n onValueChange={(value, eventDetails) => {\n onChange?.(value);\n onValueChange?.(value, eventDetails);\n }}\n {...props}\n >\n <div\n data-slot=\"tabs-bar\"\n className={cn(\n 'flex min-w-0 items-stretch',\n orientation === 'vertical' && 'min-h-0 shrink-0 flex-col',\n //\n )}\n >\n <TabsList\n aria-label={listLabel}\n activateOnFocus={activateOnFocus}\n className={cn(\n 'min-w-0 flex-1',\n scrollable &&\n (orientation === 'vertical'\n ? 'min-h-0 overflow-y-auto'\n : `[scrollbar-width:none] overflow-x-auto overflow-y-hidden\n [&::-webkit-scrollbar]:hidden`),\n classNames?.list,\n //\n )}\n >\n {items.map(item => (\n <TabsTab\n key={item.key}\n value={item.key}\n disabled={item.disabled}\n className={cn(\n fitted &&\n !scrollable &&\n orientation === 'horizontal' &&\n 'flex-1',\n scrollable && 'shrink-0',\n classNames?.tab,\n //\n )}\n >\n {item.icon != null && (\n <span\n data-slot=\"tabs-icon\"\n aria-hidden=\"true\"\n className=\"inline-flex shrink-0 items-center\"\n >\n {item.icon}\n </span>\n )}\n {item.label}\n </TabsTab>\n ))}\n </TabsList>\n {extra != null && (\n <div\n data-slot=\"tabs-extra\"\n className={cn(\n `border-border flex shrink-0 items-center border-b px-3\n data-[orientation=vertical]:border-r\n data-[orientation=vertical]:border-b-0`,\n classNames?.extra,\n //\n )}\n data-orientation={orientation}\n >\n {extra}\n </div>\n )}\n </div>\n {items.map(item => (\n <TabsPanel\n key={item.key}\n value={item.key}\n keepMounted={keepMounted}\n className={classNames?.panel}\n >\n {item.children}\n </TabsPanel>\n ))}\n </Core>\n );\n};\n\nexport default Tabs;\n"],"mappings":";;;;;AAQA,MAAM,EAAE,MAAM,MAAM,UAAU,SAAS,cAAcA;AAuCrD,MAAM,QAAQ,EACZ,OACA,YAAY,QACZ,cAAc,OACd,kBAAkB,OAClB,aAAa,OACb,SAAS,OACT,OACA,YACA,cACA,UACA,eACA,cAAc,cACd,GAAG,YACQ;CACX,MAAM,eACJ,iBAAiB,KAAA,IACb,MAAM,MAAK,SAAQ,CAAC,KAAK,QAAQ,CAAC,EAAE,MACpC;CAEN,OACE,qBAAC,MAAD;EACE,cAAc,MAAM,UAAU,KAAA,IAAY,eAAe,KAAA;EAC5C;EACb,gBAAgB,OAAO,iBAAiB;GACtC,WAAW,KAAK;GAChB,gBAAgB,OAAO,YAAY;EACrC;EACA,GAAI;EAPN,UAAA,CASE,qBAAC,OAAD;GACE,aAAU;GACV,WAAW,GACT,8BACA,gBAAgB,cAAc,2BAEhC;GANF,UAAA,CAQE,oBAAC,UAAD;IACE,cAAY;IACK;IACjB,WAAW,GACT,kBACA,eACG,gBAAgB,aACb,4BACA;mDAEN,YAAY,IAEd;IAEC,UAAA,MAAM,KAAI,SACT,qBAAC,SAAD;KAEE,OAAO,KAAK;KACZ,UAAU,KAAK;KACf,WAAW,GACT,UACE,CAAC,cACD,gBAAgB,gBAChB,UACF,cAAc,YACd,YAAY,GAEd;KAZF,UAAA,CAcG,KAAK,QAAQ,QACZ,oBAAC,QAAD;MACE,aAAU;MACV,eAAY;MACZ,WAAU;MAET,UAAA,KAAK;KACF,CAAA,GAEP,KAAK,KACC;IAvBF,GAAA,KAAK,GAuBH,CACV;GACO,CAAA,GACT,SAAS,QACR,oBAAC,OAAD;IACE,aAAU;IACV,WAAW,GACT;;uDAGA,YAAY,KAEd;IACA,oBAAkB;IAEjB,UAAA;GACE,CAAA,CAEJ;EACJ,CAAA,GAAA,MAAM,KAAI,SACT,oBAAC,WAAD;GAEE,OAAO,KAAK;GACC;GACb,WAAW,YAAY;GAEtB,UAAA,KAAK;EACG,GANJ,KAAK,GAMD,CACZ,CACG;;AAEV"}
@@ -2,7 +2,7 @@
2
2
  import { cn } from "./utils.mjs";
3
3
  import { useConfig } from "./providers/config/context.mjs";
4
4
  import Button from "./Button.mjs";
5
- import Input from "./components/atoms/input/index.mjs";
5
+ import Input from "./Input.mjs";
6
6
  import * as React$1 from "react";
7
7
  import { useMergedRef } from "@jbpark/use-hooks";
8
8
  import { jsx, jsxs } from "react/jsx-runtime";
@@ -1,5 +1,6 @@
1
1
  //#region src/components/organisms/toast.d.ts
2
- type ToastStatus = 'info' | 'success' | 'error' | 'warning';
2
+ type ToastStatus = 'info' | 'success' | 'error' | 'warning' | 'loading';
3
+ export type Placement = 'top-start' | 'top' | 'top-end' | 'bottom-start' | 'bottom' | 'bottom-end';
3
4
  export interface Props {
4
5
  status?: ToastStatus;
5
6
  title: React.ReactNode;
@@ -14,17 +15,26 @@ interface StaticProps extends Props {
14
15
  id?: string;
15
16
  duration?: number;
16
17
  container?: HTMLElement;
18
+ placement?: Placement;
19
+ }
20
+ export interface GlobalConfig {
21
+ placement?: Placement;
22
+ duration?: number;
23
+ maxCount?: number;
17
24
  }
18
25
  declare const Toast: {
19
26
  ({ status, title, description, icon, closable, action, className, onClose }: Props): import("react").JSX.Element;
20
27
  destroy: (id?: string) => void;
21
28
  destroyAll(): void;
29
+ config(config: GlobalConfig): void;
30
+ open(props: StaticProps): string | undefined;
22
31
  info(title: React.ReactNode, props?: TriggerOptions): string | undefined;
23
32
  success(title: React.ReactNode, props?: TriggerOptions): string | undefined;
24
33
  error(title: React.ReactNode, props?: TriggerOptions): string | undefined;
25
34
  warning(title: React.ReactNode, props?: TriggerOptions): string | undefined;
35
+ loading(title: React.ReactNode, props?: TriggerOptions): string | undefined;
26
36
  };
27
37
  type TriggerOptions = Omit<StaticProps, 'status' | 'title'>;
28
38
  //#endregion
29
39
  export { type StaticProps as ToastOptions, Toast as default };
30
- //# sourceMappingURL=toast.d.mts.map
40
+ //# sourceMappingURL=Toast.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Toast.d.mts","names":[],"sources":["../src/components/organisms/toast.tsx"],"mappings":";KAyBK;YAEO;iBAGK;EACf,SAAS;EACT,OAAO,MAAM;EACb,cAAc,MAAM;EACpB,OAAO,MAAM;EACb;EACA,SAAS,MAAM;EACf;EACA;;UAGQ,oBAAoB;EAC5B;EACA;EACA,YAAY;EACZ,YAAY;;iBAGG;EACf,YAAY;EACZ;EAEA;;cAiBI;KASH,QAAA,OAAA,aAAA,MAAA,UAAA,QAAA,WAAA,WAAA,wBAAK,IAAA;EA0Mc,UAAA;;EAcE,OAAA,QAAA;EAMH,KAAA,OAAA;EACA,KAAA,OAAA,MAAM,WAAS,QAAU;EAEtB,QAAA,OAAA,MAAM,WAAS,QAAU;EAE3B,MAAA,OAAA,MAAM,WAAS,QAAU;EAEvB,QAAA,OAAA,MAAM,WAAS,QAAU;EAGzB,QAAA,OAAA,MAAM,WAAS,QAAU;;KAZ5C,iBAAiB,KAAK"}
package/dist/Toast.mjs ADDED
@@ -0,0 +1,198 @@
1
+ "use client";
2
+ import { cn } from "./utils.mjs";
3
+ import { DEFAULT_LOCALE, useConfig } from "./providers/config/context.mjs";
4
+ import Button from "./Button.mjs";
5
+ import { createImperativeStack, isBrowser } from "./components/organisms/imperative-stack.mjs";
6
+ import { useEffect, useRef, useState } from "react";
7
+ import { useTimeout } from "@jbpark/use-hooks";
8
+ import { jsx, jsxs } from "react/jsx-runtime";
9
+ import { Check, Info, LoaderCircle, OctagonAlert, OctagonX, X } from "lucide-react";
10
+ import { createPortal } from "react-dom";
11
+ //#region src/components/organisms/toast.tsx
12
+ const STATUS_ICONS = {
13
+ info: /* @__PURE__ */ jsx(Info, { className: "text-blue-400" }),
14
+ success: /* @__PURE__ */ jsx(Check, { className: "text-green-400" }),
15
+ error: /* @__PURE__ */ jsx(OctagonX, { className: "text-red-400" }),
16
+ warning: /* @__PURE__ */ jsx(OctagonAlert, { className: "text-yellow-400" }),
17
+ loading: /* @__PURE__ */ jsx(LoaderCircle, { className: "text-muted-foreground animate-spin" })
18
+ };
19
+ const Toast = ({ status, title, description, icon, closable = true, action, className, onClose }) => {
20
+ const { locale } = useConfig();
21
+ return /* @__PURE__ */ jsxs("div", {
22
+ "data-slot": "toast",
23
+ role: status === "error" ? "alert" : "status",
24
+ className: cn(`pointer-events-auto flex w-80 max-w-[calc(100vw-2rem)] items-start
25
+ gap-3 rounded-lg`, "bg-background text-foreground border p-4 shadow-lg", className),
26
+ children: [
27
+ (icon || status) && /* @__PURE__ */ jsx("div", {
28
+ className: "mt-0.5 shrink-0 [&_svg]:size-5",
29
+ children: icon || status && STATUS_ICONS[status]
30
+ }),
31
+ /* @__PURE__ */ jsxs("div", {
32
+ className: "flex-1 space-y-1",
33
+ children: [
34
+ /* @__PURE__ */ jsx("p", {
35
+ className: "text-sm font-medium",
36
+ children: title
37
+ }),
38
+ description && /* @__PURE__ */ jsx("p", {
39
+ className: "text-muted-foreground text-sm",
40
+ children: description
41
+ }),
42
+ action && /* @__PURE__ */ jsx("div", {
43
+ className: "pt-1",
44
+ children: action
45
+ })
46
+ ]
47
+ }),
48
+ closable && /* @__PURE__ */ jsx(Button, {
49
+ variant: "text",
50
+ shape: "circle",
51
+ size: "small",
52
+ "aria-label": locale.close ?? DEFAULT_LOCALE.close,
53
+ icon: /* @__PURE__ */ jsx(X, {}),
54
+ onClick: onClose
55
+ })
56
+ ]
57
+ });
58
+ };
59
+ const DEFAULT_DURATION = 4e3;
60
+ const PLACEMENTS = [
61
+ "top-start",
62
+ "top",
63
+ "top-end",
64
+ "bottom-start",
65
+ "bottom",
66
+ "bottom-end"
67
+ ];
68
+ const EXIT_CLASSES = {
69
+ "top-start": "-translate-x-2",
70
+ top: "-translate-y-2",
71
+ "top-end": "translate-x-2",
72
+ "bottom-start": "-translate-x-2",
73
+ bottom: "translate-y-2",
74
+ "bottom-end": "translate-x-2"
75
+ };
76
+ const globalConfig = {};
77
+ const StaticToast = ({ id, index, revision, duration = globalConfig.duration ?? DEFAULT_DURATION, container, placement = "bottom-end", onClose, ...props }) => {
78
+ const [visible, setVisible] = useState(true);
79
+ const isClosingRef = useRef(false);
80
+ const maxCount = globalConfig.maxCount;
81
+ const isQueued = maxCount !== void 0 && index >= Math.max(1, maxCount);
82
+ const close = () => {
83
+ if (isClosingRef.current) return;
84
+ isClosingRef.current = true;
85
+ onClose?.();
86
+ setVisible(false);
87
+ setTimeout(() => {
88
+ destroy(id);
89
+ }, 200);
90
+ };
91
+ const { reset, clear } = useTimeout(close, isQueued || !duration ? null : duration);
92
+ useEffect(() => {
93
+ if (revision > 0) reset();
94
+ }, [revision, reset]);
95
+ if (!isBrowser || isQueued) return null;
96
+ return createPortal(/* @__PURE__ */ jsx("div", {
97
+ className: cn("transition-all duration-200", visible ? "opacity-100" : cn("opacity-0", EXIT_CLASSES[placement])),
98
+ onMouseEnter: clear,
99
+ onMouseLeave: reset,
100
+ onFocus: clear,
101
+ onBlur: reset,
102
+ children: /* @__PURE__ */ jsx(Toast, {
103
+ ...props,
104
+ onClose: close
105
+ })
106
+ }), stacks[placement].getRootElement(container));
107
+ };
108
+ const createRootElement = (placement) => () => {
109
+ const el = document.createElement("div");
110
+ const [vertical, horizontal = "center"] = placement.split("-");
111
+ el.setAttribute("role", "region");
112
+ el.setAttribute("aria-label", "Notifications");
113
+ el.dataset.slot = "toast-stack";
114
+ el.dataset.placement = placement;
115
+ el.style.zIndex = "10000";
116
+ el.style.position = "fixed";
117
+ el.style.display = "flex";
118
+ el.style.flexDirection = vertical === "top" ? "column" : "column-reverse";
119
+ el.style.gap = "8px";
120
+ el.style.padding = "16px";
121
+ el.style.pointerEvents = "none";
122
+ el.style[vertical === "top" ? "top" : "bottom"] = "0";
123
+ if (horizontal === "start") {
124
+ el.style.insetInlineStart = "0";
125
+ el.style.alignItems = "flex-start";
126
+ } else if (horizontal === "end") {
127
+ el.style.insetInlineEnd = "0";
128
+ el.style.alignItems = "flex-end";
129
+ } else {
130
+ el.style.left = "0";
131
+ el.style.right = "0";
132
+ el.style.alignItems = "center";
133
+ }
134
+ return el;
135
+ };
136
+ const stacks = Object.fromEntries(PLACEMENTS.map((placement) => [placement, createImperativeStack({
137
+ createRootElement: createRootElement(placement),
138
+ StackItem: StaticToast
139
+ })]));
140
+ let revisionCounter = 0;
141
+ const show = (props) => {
142
+ if (props.id) {
143
+ const revision = revisionCounter += 1;
144
+ for (const placement of PLACEMENTS) if (stacks[placement].update(props.id, (current) => ({
145
+ ...props,
146
+ placement: current.placement,
147
+ container: current.container,
148
+ revision
149
+ }))) return props.id;
150
+ }
151
+ const placement = props.placement ?? globalConfig.placement ?? "bottom-end";
152
+ return stacks[placement].render({
153
+ ...props,
154
+ placement,
155
+ revision: 0
156
+ });
157
+ };
158
+ const destroy = (id) => {
159
+ for (const placement of PLACEMENTS) stacks[placement].destroy(id);
160
+ };
161
+ Toast.destroy = destroy;
162
+ Toast.destroyAll = () => {
163
+ destroy();
164
+ };
165
+ Toast.config = (config) => {
166
+ Object.assign(globalConfig, config);
167
+ };
168
+ Toast.open = (props) => show(props);
169
+ Toast.info = (title, props) => show({
170
+ status: "info",
171
+ title,
172
+ ...props
173
+ });
174
+ Toast.success = (title, props) => show({
175
+ status: "success",
176
+ title,
177
+ ...props
178
+ });
179
+ Toast.error = (title, props) => show({
180
+ status: "error",
181
+ title,
182
+ ...props
183
+ });
184
+ Toast.warning = (title, props) => show({
185
+ status: "warning",
186
+ title,
187
+ ...props
188
+ });
189
+ Toast.loading = (title, props) => show({
190
+ status: "loading",
191
+ title,
192
+ duration: 0,
193
+ ...props
194
+ });
195
+ //#endregion
196
+ export { Toast as default };
197
+
198
+ //# sourceMappingURL=Toast.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Toast.mjs","names":[],"sources":["../src/components/organisms/toast.tsx"],"sourcesContent":["'use client';\n\nimport { useEffect, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\n\nimport { useTimeout } from '@jbpark/use-hooks';\nimport {\n Check,\n Info,\n LoaderCircle,\n OctagonAlert,\n OctagonX,\n X,\n} from 'lucide-react';\n\nimport { DEFAULT_LOCALE, useConfig } from '@repo/ui/providers';\nimport { cn } from '@repo/ui/utils';\n\nimport Button from '../atoms/button';\nimport {\n type ImperativeStack,\n createImperativeStack,\n isBrowser,\n} from './imperative-stack';\n\ntype ToastStatus = 'info' | 'success' | 'error' | 'warning' | 'loading';\n\nexport type Placement =\n 'top-start' | 'top' | 'top-end' | 'bottom-start' | 'bottom' | 'bottom-end';\n\nexport interface Props {\n status?: ToastStatus;\n title: React.ReactNode;\n description?: React.ReactNode;\n icon?: React.ReactNode;\n closable?: boolean;\n action?: React.ReactNode;\n className?: string;\n onClose?: () => void;\n}\n\ninterface StaticProps extends Props {\n id?: string;\n duration?: number;\n container?: HTMLElement;\n placement?: Placement;\n}\n\nexport interface GlobalConfig {\n placement?: Placement;\n duration?: number;\n // Visible toasts per stack; later toasts wait until one closes.\n maxCount?: number;\n}\n\ninterface StackEntry extends StaticProps {\n revision: number;\n}\n\ntype StackItemProps = StackEntry & { id: string; index: number };\n\nconst STATUS_ICONS: Record<ToastStatus, React.ReactNode> = {\n info: <Info className=\"text-blue-400\" />,\n success: <Check className=\"text-green-400\" />,\n error: <OctagonX className=\"text-red-400\" />,\n warning: <OctagonAlert className=\"text-yellow-400\" />,\n loading: <LoaderCircle className=\"text-muted-foreground animate-spin\" />,\n};\n\nconst Toast = ({\n status,\n title,\n description,\n icon,\n closable = true,\n action,\n className,\n onClose,\n}: Props) => {\n const { locale } = useConfig();\n\n return (\n <div\n data-slot=\"toast\"\n role={status === 'error' ? 'alert' : 'status'}\n className={cn(\n `pointer-events-auto flex w-80 max-w-[calc(100vw-2rem)] items-start\n gap-3 rounded-lg`,\n 'bg-background text-foreground border p-4 shadow-lg',\n className,\n //\n )}\n >\n {(icon || status) && (\n <div className=\"mt-0.5 shrink-0 [&_svg]:size-5\">\n {icon || (status && STATUS_ICONS[status])}\n </div>\n )}\n <div className=\"flex-1 space-y-1\">\n <p className=\"text-sm font-medium\">{title}</p>\n {description && (\n <p className=\"text-muted-foreground text-sm\">{description}</p>\n )}\n {action && <div className=\"pt-1\">{action}</div>}\n </div>\n {closable && (\n <Button\n variant=\"text\"\n shape=\"circle\"\n size=\"small\"\n aria-label={locale.close ?? DEFAULT_LOCALE.close}\n icon={<X />}\n onClick={onClose}\n />\n )}\n </div>\n );\n};\n\nconst DEFAULT_DURATION = 4000;\n\nconst PLACEMENTS: readonly Placement[] = [\n 'top-start',\n 'top',\n 'top-end',\n 'bottom-start',\n 'bottom',\n 'bottom-end',\n];\n\nconst EXIT_CLASSES: Record<Placement, string> = {\n 'top-start': '-translate-x-2',\n top: '-translate-y-2',\n 'top-end': 'translate-x-2',\n 'bottom-start': '-translate-x-2',\n bottom: 'translate-y-2',\n 'bottom-end': 'translate-x-2',\n};\n\nconst globalConfig: GlobalConfig = {};\n\nconst StaticToast = ({\n id,\n index,\n revision,\n duration = globalConfig.duration ?? DEFAULT_DURATION,\n container,\n placement = 'bottom-end',\n onClose,\n ...props\n}: StackItemProps): React.ReactPortal | null => {\n const [visible, setVisible] = useState(true);\n const isClosingRef = useRef(false);\n\n const maxCount = globalConfig.maxCount;\n const isQueued = maxCount !== undefined && index >= Math.max(1, maxCount);\n\n const close = () => {\n if (isClosingRef.current) {\n return;\n }\n\n isClosingRef.current = true;\n onClose?.();\n setVisible(false);\n setTimeout(() => {\n destroy(id);\n }, 200);\n };\n\n const { reset, clear } = useTimeout(\n close,\n isQueued || !duration ? null : duration,\n );\n\n // An update restarts the visible duration.\n useEffect(() => {\n if (revision > 0) {\n reset();\n }\n }, [revision, reset]);\n\n if (!isBrowser || isQueued) {\n return null;\n }\n\n return createPortal(\n <div\n className={cn(\n 'transition-all duration-200',\n visible ? 'opacity-100' : cn('opacity-0', EXIT_CLASSES[placement]),\n )}\n // Without this, a toast with a closable/action button (or one the\n // user is mid-read on) could auto-dismiss itself out from under\n // them — hovering or focusing anything inside pauses the timer,\n // moving away restarts it from the full duration.\n onMouseEnter={clear}\n onMouseLeave={reset}\n onFocus={clear}\n onBlur={reset}\n >\n <Toast {...props} onClose={close} />\n </div>,\n stacks[placement].getRootElement(container)!,\n );\n};\n\nconst createRootElement = (placement: Placement) => () => {\n const el = document.createElement('div');\n const [vertical, horizontal = 'center'] = placement.split('-');\n\n el.setAttribute('role', 'region');\n // Plain DOM, created outside any React tree — no Config to read a\n // locale override from until #226 gives the imperative stack a way\n // to inherit one.\n el.setAttribute('aria-label', 'Notifications');\n el.dataset.slot = 'toast-stack';\n el.dataset.placement = placement;\n el.style.zIndex = '10000';\n el.style.position = 'fixed';\n el.style.display = 'flex';\n // The oldest toast sits nearest the screen edge.\n el.style.flexDirection = vertical === 'top' ? 'column' : 'column-reverse';\n el.style.gap = '8px';\n el.style.padding = '16px';\n el.style.pointerEvents = 'none';\n el.style[vertical === 'top' ? 'top' : 'bottom'] = '0';\n\n if (horizontal === 'start') {\n el.style.insetInlineStart = '0';\n el.style.alignItems = 'flex-start';\n } else if (horizontal === 'end') {\n el.style.insetInlineEnd = '0';\n el.style.alignItems = 'flex-end';\n } else {\n el.style.left = '0';\n el.style.right = '0';\n el.style.alignItems = 'center';\n }\n\n return el;\n};\n\nconst stacks = Object.fromEntries(\n PLACEMENTS.map(placement => [\n placement,\n createImperativeStack<StackEntry>({\n createRootElement: createRootElement(placement),\n StackItem: StaticToast,\n }),\n ]),\n) as Record<Placement, ImperativeStack<StackEntry>>;\n\nlet revisionCounter = 0;\n\nconst show = (props: StaticProps): string | undefined => {\n if (props.id) {\n const revision = (revisionCounter += 1);\n\n // An update replaces the content but stays in the toast's stack and\n // container, so `placement` and `container` from the new call are ignored.\n for (const placement of PLACEMENTS) {\n if (\n stacks[placement].update(props.id, current => ({\n ...props,\n placement: current.placement,\n container: current.container,\n revision,\n }))\n ) {\n return props.id;\n }\n }\n }\n\n const placement = props.placement ?? globalConfig.placement ?? 'bottom-end';\n\n return stacks[placement].render({ ...props, placement, revision: 0 });\n};\n\nconst destroy = (id?: string) => {\n for (const placement of PLACEMENTS) {\n stacks[placement].destroy(id);\n }\n};\n\nToast.destroy = destroy;\n\nToast.destroyAll = () => {\n destroy();\n};\n\n// Sets defaults for toasts shown afterwards. `maxCount` also applies to\n// queued toasts the next time their stack changes.\nToast.config = (config: GlobalConfig) => {\n Object.assign(globalConfig, config);\n};\n\ntype TriggerOptions = Omit<StaticProps, 'status' | 'title'>;\n\nToast.open = (props: StaticProps) => show(props);\nToast.info = (title: React.ReactNode, props?: TriggerOptions) =>\n show({ status: 'info', title, ...props });\nToast.success = (title: React.ReactNode, props?: TriggerOptions) =>\n show({ status: 'success', title, ...props });\nToast.error = (title: React.ReactNode, props?: TriggerOptions) =>\n show({ status: 'error', title, ...props });\nToast.warning = (title: React.ReactNode, props?: TriggerOptions) =>\n show({ status: 'warning', title, ...props });\n// Stays until updated or closed unless `duration` is given.\nToast.loading = (title: React.ReactNode, props?: TriggerOptions) =>\n show({ status: 'loading', title, duration: 0, ...props });\n\nexport default Toast;\nexport type { StaticProps as ToastOptions };\n"],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import { ComponentSize } from "./providers/config/types.mjs";
2
+ import { ReactNode } from "react";
3
+ import { ToggleGroup as ToggleGroup$1 } from "@base-ui/react/toggle-group";
4
+ //#region src/components/atoms/toggle-group.d.ts
5
+ export interface Option {
6
+ value: string;
7
+ label: string;
8
+ icon?: ReactNode;
9
+ disabled?: boolean;
10
+ iconOnly?: boolean;
11
+ }
12
+ export interface Props extends Omit<ToggleGroup$1.Props, 'children' | 'value' | 'defaultValue' | 'onValueChange' | 'multiple' | 'className' | 'onChange' | 'dir'> {
13
+ options: readonly Option[];
14
+ value?: readonly string[];
15
+ defaultValue?: readonly string[];
16
+ onChange?: (values: string[]) => void;
17
+ size?: ComponentSize;
18
+ dir?: 'ltr' | 'rtl';
19
+ className?: string;
20
+ classNames?: {
21
+ item?: string;
22
+ pressedItem?: string;
23
+ };
24
+ }
25
+ declare const ToggleGroup: ({ options, value, defaultValue, onChange, size, disabled, orientation, dir, className, classNames, ...props }: Props) => import("react").JSX.Element;
26
+ //#endregion
27
+ export { ToggleGroup as default };
28
+ //# sourceMappingURL=ToggleGroup.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToggleGroup.d.mts","names":["ToggleGroupPrimitive"],"sources":["../src/components/atoms/toggle-group.tsx"],"mappings":";;;;iBAciB;EACf;EACA;EACA,OAAO;EACP;EAEA;;iBAGe,cAAc,KAC7BA,cAAqB;EAUrB,kBAAkB;EAClB;EACA;EAGA,YAAY;EACZ,OAAO;EACP;EACA;EACA;IACE;IACA;;;cAIE,gBAAe,SAAA,OAAA,cAAA,UAAA,MAAA,UAAA,aAAA,KAAA,WAAA,eAAA,SAYlB,0BAAK,IAAA"}