@evinvest/uikit 0.32.0 → 0.33.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 (288) hide show
  1. package/README.md +21 -10
  2. package/dist/components/atomic/accordion.js +2 -1
  3. package/dist/components/atomic/accordion.js.map +1 -1
  4. package/dist/components/atomic/alert.js +4 -4
  5. package/dist/components/atomic/alert.js.map +1 -1
  6. package/dist/components/atomic/badge.js +4 -3
  7. package/dist/components/atomic/badge.js.map +1 -1
  8. package/dist/components/atomic/breadcrumb.js +7 -9
  9. package/dist/components/atomic/breadcrumb.js.map +1 -1
  10. package/dist/components/atomic/button.js +4 -3
  11. package/dist/components/atomic/button.js.map +1 -1
  12. package/dist/components/atomic/calendar.js +10 -25
  13. package/dist/components/atomic/calendar.js.map +1 -1
  14. package/dist/components/atomic/checkbox.js +2 -1
  15. package/dist/components/atomic/checkbox.js.map +1 -1
  16. package/dist/components/atomic/command.js +5 -20
  17. package/dist/components/atomic/command.js.map +1 -1
  18. package/dist/components/atomic/context-menu.js +6 -13
  19. package/dist/components/atomic/context-menu.js.map +1 -1
  20. package/dist/components/atomic/dialog.js +4 -2
  21. package/dist/components/atomic/dialog.js.map +1 -1
  22. package/dist/components/atomic/dropdown-menu.js +6 -14
  23. package/dist/components/atomic/dropdown-menu.js.map +1 -1
  24. package/dist/components/atomic/hover-card.js.map +1 -1
  25. package/dist/components/atomic/info-tip.js +8 -9
  26. package/dist/components/atomic/info-tip.js.map +1 -1
  27. package/dist/components/atomic/input-otp.js +2 -1
  28. package/dist/components/atomic/input-otp.js.map +1 -1
  29. package/dist/components/atomic/key-value.js +5 -4
  30. package/dist/components/atomic/key-value.js.map +1 -1
  31. package/dist/components/atomic/menubar.js +7 -18
  32. package/dist/components/atomic/menubar.js.map +1 -1
  33. package/dist/components/atomic/native-select.js +1 -1
  34. package/dist/components/atomic/native-select.js.map +1 -1
  35. package/dist/components/atomic/navigation-menu.js +6 -14
  36. package/dist/components/atomic/navigation-menu.js.map +1 -1
  37. package/dist/components/atomic/pagination.js +18 -19
  38. package/dist/components/atomic/pagination.js.map +1 -1
  39. package/dist/components/atomic/popover.js.map +1 -1
  40. package/dist/components/atomic/radio-group.js +5 -4
  41. package/dist/components/atomic/radio-group.js.map +1 -1
  42. package/dist/components/atomic/section-descriptor.js +5 -8
  43. package/dist/components/atomic/section-descriptor.js.map +1 -1
  44. package/dist/components/atomic/select-listbox.js +2 -2
  45. package/dist/components/atomic/select-listbox.js.map +1 -1
  46. package/dist/components/atomic/select.js +5 -13
  47. package/dist/components/atomic/select.js.map +1 -1
  48. package/dist/components/atomic/sheet.js +4 -2
  49. package/dist/components/atomic/sheet.js.map +1 -1
  50. package/dist/components/atomic/sidebar.js +7 -26
  51. package/dist/components/atomic/sidebar.js.map +1 -1
  52. package/dist/components/atomic/slider.js.map +1 -1
  53. package/dist/components/atomic/sonner.js +20 -18
  54. package/dist/components/atomic/sonner.js.map +1 -1
  55. package/dist/components/atomic/spinner.js +6 -3
  56. package/dist/components/atomic/spinner.js.map +1 -1
  57. package/dist/components/atomic/tabs.js.map +1 -1
  58. package/dist/components/atomic/toggle-group.js +2 -2
  59. package/dist/components/atomic/toggle-group.js.map +1 -1
  60. package/dist/components/atomic/toggle.js +3 -6
  61. package/dist/components/atomic/toggle.js.map +1 -1
  62. package/dist/components/atomic/tooltip.js.map +1 -1
  63. package/dist/components/derived/carousel.js +6 -6
  64. package/dist/components/derived/carousel.js.map +1 -1
  65. package/dist/components/derived/command-palette.js +8 -7
  66. package/dist/components/derived/command-palette.js.map +1 -1
  67. package/dist/components/derived/confirm-dialog.js +8 -13
  68. package/dist/components/derived/confirm-dialog.js.map +1 -1
  69. package/dist/components/derived/date-time-picker.js +10 -14
  70. package/dist/components/derived/date-time-picker.js.map +1 -1
  71. package/dist/components/derived/field.js.map +1 -1
  72. package/dist/components/derived/form.js +0 -1
  73. package/dist/components/derived/form.js.map +1 -1
  74. package/dist/components/derived/icon-button.js.map +1 -1
  75. package/dist/components/derived/item.js +0 -1
  76. package/dist/components/derived/item.js.map +1 -1
  77. package/dist/components/derived/popover-form.js +4 -3
  78. package/dist/components/derived/popover-form.js.map +1 -1
  79. package/dist/components/derived/settings.js +4 -4
  80. package/dist/components/derived/settings.js.map +1 -1
  81. package/dist/components/shell/account-menu-profile.js +1 -1
  82. package/dist/components/shell/account-menu-profile.js.map +1 -1
  83. package/dist/components/shell/account-settings-dialog.js +3 -2
  84. package/dist/components/shell/account-settings-dialog.js.map +1 -1
  85. package/dist/components/shell/aside.js +6 -4
  86. package/dist/components/shell/aside.js.map +1 -1
  87. package/dist/components/shell/auth-wall.js +3 -5
  88. package/dist/components/shell/auth-wall.js.map +1 -1
  89. package/dist/components/shell/bottom-tab-bar.js +3 -3
  90. package/dist/components/shell/bottom-tab-bar.js.map +1 -1
  91. package/dist/components/shell/chat-composer.js +9 -7
  92. package/dist/components/shell/chat-composer.js.map +1 -1
  93. package/dist/components/shell/chat-message.js.map +1 -1
  94. package/dist/components/shell/chat-typing.js +2 -1
  95. package/dist/components/shell/chat-typing.js.map +1 -1
  96. package/dist/components/shell/footer.js +26 -24
  97. package/dist/components/shell/footer.js.map +1 -1
  98. package/dist/components/shell/header-controls.js +17 -15
  99. package/dist/components/shell/header-controls.js.map +1 -1
  100. package/dist/components/shell/hotbar.js +158 -0
  101. package/dist/components/shell/hotbar.js.map +1 -0
  102. package/dist/components/shell/logo.js +3 -2
  103. package/dist/components/shell/logo.js.map +1 -1
  104. package/dist/components/shell/mobile-app-bar.js +4 -4
  105. package/dist/components/shell/mobile-app-bar.js.map +1 -1
  106. package/dist/components/shell/nav-collapse.js +6 -5
  107. package/dist/components/shell/nav-collapse.js.map +1 -1
  108. package/dist/components/shell/resource-error.js +2 -2
  109. package/dist/components/shell/resource-error.js.map +1 -1
  110. package/dist/components/shell/section-nav.js +3 -3
  111. package/dist/components/shell/section-nav.js.map +1 -1
  112. package/dist/components/shell/shell-icons.js +7 -22
  113. package/dist/components/shell/shell-icons.js.map +1 -1
  114. package/dist/components/shell/shell-nav.js +4 -4
  115. package/dist/components/shell/shell-nav.js.map +1 -1
  116. package/dist/components/shell/smart-header.js.map +1 -1
  117. package/dist/components/shell/status-screen.js +35 -35
  118. package/dist/components/shell/status-screen.js.map +1 -1
  119. package/dist/components/shell/system-banner.js +6 -6
  120. package/dist/components/shell/system-banner.js.map +1 -1
  121. package/dist/components/shell/workspace-tab.js +2 -1
  122. package/dist/components/shell/workspace-tab.js.map +1 -1
  123. package/dist/generated/accent.js +10 -10
  124. package/dist/generated/accent.js.map +1 -1
  125. package/dist/generated/accordion.js +6 -2
  126. package/dist/generated/accordion.js.map +1 -1
  127. package/dist/generated/account-list.js +4 -4
  128. package/dist/generated/account-list.js.map +1 -1
  129. package/dist/generated/account-settings-dialog.js +6 -2
  130. package/dist/generated/account-settings-dialog.js.map +1 -1
  131. package/dist/generated/alert-dialog.js +1 -1
  132. package/dist/generated/alert-dialog.js.map +1 -1
  133. package/dist/generated/alert.js +3 -10
  134. package/dist/generated/alert.js.map +1 -1
  135. package/dist/generated/aside.js +7 -0
  136. package/dist/generated/aside.js.map +1 -1
  137. package/dist/generated/badge.js +2 -11
  138. package/dist/generated/badge.js.map +1 -1
  139. package/dist/generated/band.js +10 -10
  140. package/dist/generated/band.js.map +1 -1
  141. package/dist/generated/breadcrumb.js +1 -1
  142. package/dist/generated/breadcrumb.js.map +1 -1
  143. package/dist/generated/button-group.js +3 -3
  144. package/dist/generated/button-group.js.map +1 -1
  145. package/dist/generated/button.js +4 -20
  146. package/dist/generated/button.js.map +1 -1
  147. package/dist/generated/calendar.js +5 -5
  148. package/dist/generated/calendar.js.map +1 -1
  149. package/dist/generated/card.js +1 -1
  150. package/dist/generated/card.js.map +1 -1
  151. package/dist/generated/carousel.js +1 -1
  152. package/dist/generated/carousel.js.map +1 -1
  153. package/dist/generated/chat-composer.js +9 -2
  154. package/dist/generated/chat-composer.js.map +1 -1
  155. package/dist/generated/chat-message.js +25 -19
  156. package/dist/generated/chat-message.js.map +1 -1
  157. package/dist/generated/checkbox.js +1 -1
  158. package/dist/generated/checkbox.js.map +1 -1
  159. package/dist/generated/command-palette.js +10 -1
  160. package/dist/generated/command-palette.js.map +1 -1
  161. package/dist/generated/command.js +8 -6
  162. package/dist/generated/command.js.map +1 -1
  163. package/dist/generated/confirm-dialog.js +8 -8
  164. package/dist/generated/confirm-dialog.js.map +1 -1
  165. package/dist/generated/context-menu.js +7 -5
  166. package/dist/generated/context-menu.js.map +1 -1
  167. package/dist/generated/copy.js +97 -0
  168. package/dist/generated/copy.js.map +1 -0
  169. package/dist/generated/date-time-picker.js +10 -0
  170. package/dist/generated/date-time-picker.js.map +1 -1
  171. package/dist/generated/dialog.js +2 -2
  172. package/dist/generated/dialog.js.map +1 -1
  173. package/dist/generated/drawer.js +6 -6
  174. package/dist/generated/drawer.js.map +1 -1
  175. package/dist/generated/dropdown-menu.js +7 -5
  176. package/dist/generated/dropdown-menu.js.map +1 -1
  177. package/dist/generated/empty.js +5 -5
  178. package/dist/generated/empty.js.map +1 -1
  179. package/dist/generated/field.js +9 -7
  180. package/dist/generated/field.js.map +1 -1
  181. package/dist/generated/footer.js +45 -0
  182. package/dist/generated/footer.js.map +1 -0
  183. package/dist/generated/header-controls.js +5 -10
  184. package/dist/generated/header-controls.js.map +1 -1
  185. package/dist/generated/hover-card.js +1 -1
  186. package/dist/generated/hover-card.js.map +1 -1
  187. package/dist/generated/icon-button.js +4 -2
  188. package/dist/generated/icon-button.js.map +1 -1
  189. package/dist/generated/icons.js +36 -0
  190. package/dist/generated/icons.js.map +1 -0
  191. package/dist/generated/info-tip.js +5 -0
  192. package/dist/generated/info-tip.js.map +1 -0
  193. package/dist/generated/input-group.js +10 -10
  194. package/dist/generated/input-group.js.map +1 -1
  195. package/dist/generated/input-otp.js +2 -2
  196. package/dist/generated/input-otp.js.map +1 -1
  197. package/dist/generated/input.js +4 -4
  198. package/dist/generated/input.js.map +1 -1
  199. package/dist/generated/item.js +11 -11
  200. package/dist/generated/item.js.map +1 -1
  201. package/dist/generated/kbd.js +1 -1
  202. package/dist/generated/kbd.js.map +1 -1
  203. package/dist/generated/key-value.js +7 -1
  204. package/dist/generated/key-value.js.map +1 -1
  205. package/dist/generated/label.js +1 -1
  206. package/dist/generated/label.js.map +1 -1
  207. package/dist/generated/logo.js +9 -0
  208. package/dist/generated/logo.js.map +1 -0
  209. package/dist/generated/menu.js +7 -0
  210. package/dist/generated/menu.js.map +1 -0
  211. package/dist/generated/menubar.js +10 -8
  212. package/dist/generated/menubar.js.map +1 -1
  213. package/dist/generated/navigation-menu.js +11 -5
  214. package/dist/generated/navigation-menu.js.map +1 -1
  215. package/dist/generated/orientation.js +5 -0
  216. package/dist/generated/orientation.js.map +1 -0
  217. package/dist/generated/pagination.js +15 -0
  218. package/dist/generated/pagination.js.map +1 -0
  219. package/dist/generated/popover-form.js +5 -0
  220. package/dist/generated/popover-form.js.map +1 -1
  221. package/dist/generated/popover.js +1 -1
  222. package/dist/generated/popover.js.map +1 -1
  223. package/dist/generated/primitives.js +7 -0
  224. package/dist/generated/primitives.js.map +1 -0
  225. package/dist/generated/radio-group.js +5 -1
  226. package/dist/generated/radio-group.js.map +1 -1
  227. package/dist/generated/section-descriptor.js +7 -0
  228. package/dist/generated/section-descriptor.js.map +1 -0
  229. package/dist/generated/select.js +16 -10
  230. package/dist/generated/select.js.map +1 -1
  231. package/dist/generated/settings.js +2 -7
  232. package/dist/generated/settings.js.map +1 -1
  233. package/dist/generated/sheet.js +1 -1
  234. package/dist/generated/sheet.js.map +1 -1
  235. package/dist/generated/sidebar.js +24 -12
  236. package/dist/generated/sidebar.js.map +1 -1
  237. package/dist/generated/size.js +12 -0
  238. package/dist/generated/size.js.map +1 -0
  239. package/dist/generated/skeleton.js +1 -1
  240. package/dist/generated/skeleton.js.map +1 -1
  241. package/dist/generated/slider.js +2 -2
  242. package/dist/generated/slider.js.map +1 -1
  243. package/dist/generated/slot.js +5 -0
  244. package/dist/generated/slot.js.map +1 -0
  245. package/dist/generated/smart-header.js +2 -0
  246. package/dist/generated/smart-header.js.map +1 -1
  247. package/dist/generated/sonner.js +11 -13
  248. package/dist/generated/sonner.js.map +1 -1
  249. package/dist/generated/spinner.js +5 -0
  250. package/dist/generated/spinner.js.map +1 -0
  251. package/dist/generated/status-screen.js +27 -0
  252. package/dist/generated/status-screen.js.map +1 -0
  253. package/dist/generated/switch.js +2 -2
  254. package/dist/generated/switch.js.map +1 -1
  255. package/dist/generated/system-banner.js +6 -16
  256. package/dist/generated/system-banner.js.map +1 -1
  257. package/dist/generated/table.js +9 -9
  258. package/dist/generated/table.js.map +1 -1
  259. package/dist/generated/tabs.js +2 -2
  260. package/dist/generated/tabs.js.map +1 -1
  261. package/dist/generated/textarea.js +1 -1
  262. package/dist/generated/textarea.js.map +1 -1
  263. package/dist/generated/toggle-group.js +9 -0
  264. package/dist/generated/toggle-group.js.map +1 -0
  265. package/dist/generated/toggle.js +1 -9
  266. package/dist/generated/toggle.js.map +1 -1
  267. package/dist/generated/tone.js +12 -0
  268. package/dist/generated/tone.js.map +1 -0
  269. package/dist/generated/tooltip.js +1 -1
  270. package/dist/generated/tooltip.js.map +1 -1
  271. package/dist/generated/workspace-tab.js +3 -3
  272. package/dist/generated/workspace-tab.js.map +1 -1
  273. package/dist/icons/icon-shapes.js +10 -0
  274. package/dist/icons/icon-shapes.js.map +1 -0
  275. package/dist/icons/select-chevron.js +2 -1
  276. package/dist/icons/select-chevron.js.map +1 -1
  277. package/dist/icons/ui-icons.js +3 -57
  278. package/dist/icons/ui-icons.js.map +1 -1
  279. package/dist/index.d.ts +203 -155
  280. package/dist/index.js +1 -0
  281. package/dist/lib/cn.js +1 -0
  282. package/dist/lib/cn.js.map +1 -1
  283. package/dist/primitives/use-floating.js.map +1 -1
  284. package/dist/primitives/use-roving-focus.js.map +1 -1
  285. package/package.json +1 -1
  286. package/styles/ev.css +13 -76
  287. package/styles/theme.css +133 -66
  288. package/styles/tokens.css +157 -149
@@ -4,28 +4,9 @@ import * as React from "react";
4
4
  import { cn } from "../../lib/cn.js";
5
5
  import { Slot } from "../../primitives/slot.js";
6
6
  import { useControllableState } from "../../primitives/use-controllable-state.js";
7
- import {
8
- SIDEBAR_MENU_BUTTON_BASE,
9
- sidebarMenuButtonSizeClasses,
10
- SIDEBAR_WRAPPER,
11
- SIDEBAR_FLAT,
12
- SIDEBAR_INNER,
13
- SIDEBAR_TRIGGER,
14
- SIDEBAR_RAIL,
15
- SIDEBAR_INSET,
16
- SIDEBAR_HEADER,
17
- SIDEBAR_FOOTER,
18
- SIDEBAR_SEPARATOR,
19
- SIDEBAR_CONTENT,
20
- SIDEBAR_GROUP,
21
- SIDEBAR_GROUP_LABEL,
22
- SIDEBAR_GROUP_CONTENT,
23
- SIDEBAR_MENU,
24
- SIDEBAR_MENU_ITEM
25
- } from "../../generated/sidebar.js";
7
+ import { SIDEBAR_CONTENT, SIDEBAR_FLAT, SIDEBAR_FOOTER, SIDEBAR_GROUP, SIDEBAR_GROUP_CONTENT, SIDEBAR_GROUP_LABEL, SIDEBAR_HEADER, SIDEBAR_INNER, SIDEBAR_INSET, SIDEBAR_MENU, SIDEBAR_MENU_BUTTON_BASE, SIDEBAR_MENU_ITEM, SIDEBAR_RAIL, SIDEBAR_ROOT, SIDEBAR_SEPARATOR, SIDEBAR_TRIGGER, SIDEBAR_WIDTH, SIDEBAR_WIDTH_ICON, SIDEBAR_WRAPPER, sidebarMenuButtonSizeClasses } from "../../generated/sidebar.js";
26
8
  import { buttonVariantClasses } from "../../generated/button.js";
27
- const SIDEBAR_WIDTH = "16rem";
28
- const SIDEBAR_WIDTH_ICON = "3rem";
9
+ import * as copy from "../../generated/copy.js";
29
10
  const SidebarContext = React.createContext(null);
30
11
  function useSidebar() {
31
12
  const ctx = React.useContext(SidebarContext);
@@ -93,7 +74,7 @@ function Sidebar({
93
74
  return /* @__PURE__ */ jsx(
94
75
  "div",
95
76
  {
96
- className: "group peer text-ink hidden md:block",
77
+ className: SIDEBAR_ROOT,
97
78
  "data-state": state,
98
79
  "data-collapsible": state === "collapsed" ? collapsible : "",
99
80
  "data-variant": variant,
@@ -124,7 +105,7 @@ function SidebarTrigger({
124
105
  type: "button",
125
106
  "data-sidebar": "trigger",
126
107
  "data-slot": "sidebar-trigger",
127
- "aria-label": "Toggle Sidebar",
108
+ "aria-label": copy.SIDEBAR_TOGGLE,
128
109
  className: cn(SIDEBAR_TRIGGER, className),
129
110
  onClick: (event) => {
130
111
  onClick?.(event);
@@ -133,7 +114,7 @@ function SidebarTrigger({
133
114
  ...props,
134
115
  children: [
135
116
  children,
136
- /* @__PURE__ */ jsx("span", { className: "sr-only", children: "Toggle Sidebar" })
117
+ /* @__PURE__ */ jsx("span", { className: "sr-only", children: copy.SIDEBAR_TOGGLE })
137
118
  ]
138
119
  }
139
120
  );
@@ -149,10 +130,10 @@ function SidebarRail({
149
130
  type: "button",
150
131
  "data-sidebar": "rail",
151
132
  "data-slot": "sidebar-rail",
152
- "aria-label": "Toggle Sidebar",
133
+ "aria-label": copy.SIDEBAR_TOGGLE,
153
134
  tabIndex: -1,
154
135
  onClick: toggleSidebar,
155
- title: "Toggle Sidebar",
136
+ title: copy.SIDEBAR_TOGGLE,
156
137
  className: cn(SIDEBAR_RAIL, className),
157
138
  ...props
158
139
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/atomic/sidebar.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\nimport { Slot } from \"../../primitives/slot\";\nimport { useControllableState } from \"../../primitives/use-controllable-state\";\nimport {\n SIDEBAR_MENU_BUTTON_BASE,\n sidebarMenuButtonSizeClasses,\n SIDEBAR_WRAPPER,\n SIDEBAR_FLAT,\n SIDEBAR_INNER,\n SIDEBAR_TRIGGER,\n SIDEBAR_RAIL,\n SIDEBAR_INSET,\n SIDEBAR_HEADER,\n SIDEBAR_FOOTER,\n SIDEBAR_SEPARATOR,\n SIDEBAR_CONTENT,\n SIDEBAR_GROUP,\n SIDEBAR_GROUP_LABEL,\n SIDEBAR_GROUP_CONTENT,\n SIDEBAR_MENU,\n SIDEBAR_MENU_ITEM,\n type SidebarMenuButtonSize,\n} from \"../../generated/sidebar\";\nimport { buttonVariantClasses, type ButtonVariant } from \"../../generated/button\";\n\nexport type { SidebarMenuButtonSize };\n\n// omitted: mobile sheet, cookie, kbd shortcut — see README Limitations\n\nconst SIDEBAR_WIDTH = \"16rem\";\nconst SIDEBAR_WIDTH_ICON = \"3rem\";\n\ninterface SidebarContextValue {\n state: \"expanded\" | \"collapsed\";\n open: boolean;\n setOpen: (open: boolean) => void;\n toggleSidebar: () => void;\n}\n\nconst SidebarContext = React.createContext<SidebarContextValue | null>(null);\n\nexport function useSidebar(): SidebarContextValue {\n const ctx = React.useContext(SidebarContext);\n if (!ctx) throw new Error(\"useSidebar must be used within a SidebarProvider.\");\n return ctx;\n}\n\nexport interface SidebarProviderProps extends React.ComponentProps<\"div\"> {\n defaultOpen?: boolean;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n}\n\nexport function SidebarProvider({\n defaultOpen = true,\n open: openProp,\n onOpenChange,\n className,\n style,\n children,\n ...props\n}: SidebarProviderProps) {\n const [open, setOpen] = useControllableState<boolean>({\n ...(openProp !== undefined ? { value: openProp } : {}),\n defaultValue: defaultOpen,\n ...(onOpenChange ? { onChange: onOpenChange } : {}),\n });\n const toggleSidebar = React.useCallback(\n () => setOpen(!open),\n [open, setOpen],\n );\n const state = open ? \"expanded\" : \"collapsed\";\n\n const contextValue = React.useMemo<SidebarContextValue>(\n () => ({ state, open, setOpen, toggleSidebar }),\n [state, open, setOpen, toggleSidebar],\n );\n\n return (\n <SidebarContext.Provider value={contextValue}>\n <div\n data-slot=\"sidebar-wrapper\"\n style={\n {\n \"--sidebar-width\": SIDEBAR_WIDTH,\n \"--sidebar-width-icon\": SIDEBAR_WIDTH_ICON,\n ...style,\n } as React.CSSProperties\n }\n className={cn(SIDEBAR_WRAPPER, className)}\n {...props}\n >\n {children}\n </div>\n </SidebarContext.Provider>\n );\n}\n\nexport interface SidebarProps extends React.ComponentProps<\"div\"> {\n side?: \"left\" | \"right\";\n variant?: \"sidebar\" | \"floating\" | \"inset\";\n collapsible?: \"offcanvas\" | \"icon\" | \"none\";\n}\n\nexport function Sidebar({\n side = \"left\",\n variant = \"sidebar\",\n collapsible = \"offcanvas\",\n className,\n children,\n ...props\n}: SidebarProps) {\n const { state } = useSidebar();\n\n if (collapsible === \"none\") {\n return (\n <div\n data-slot=\"sidebar\"\n className={cn(SIDEBAR_FLAT, className)}\n {...props}\n >\n {children}\n </div>\n );\n }\n\n return (\n <div\n className=\"group peer text-ink hidden md:block\"\n data-state={state}\n data-collapsible={state === \"collapsed\" ? collapsible : \"\"}\n data-variant={variant}\n data-side={side}\n data-slot=\"sidebar\"\n >\n <div\n data-slot=\"sidebar-inner\"\n className={cn(SIDEBAR_INNER, className)}\n {...props}\n >\n {children}\n </div>\n </div>\n );\n}\n\nexport function SidebarTrigger({\n className,\n onClick,\n children,\n ...props\n}: React.ComponentProps<\"button\">) {\n const { toggleSidebar } = useSidebar();\n\n return (\n <button\n type=\"button\"\n data-sidebar=\"trigger\"\n data-slot=\"sidebar-trigger\"\n aria-label=\"Toggle Sidebar\"\n className={cn(SIDEBAR_TRIGGER, className)}\n onClick={(event) => {\n onClick?.(event);\n toggleSidebar();\n }}\n {...props}\n >\n {children}\n <span className=\"sr-only\">Toggle Sidebar</span>\n </button>\n );\n}\n\nexport function SidebarRail({\n className,\n ...props\n}: React.ComponentProps<\"button\">) {\n const { toggleSidebar } = useSidebar();\n\n return (\n <button\n type=\"button\"\n data-sidebar=\"rail\"\n data-slot=\"sidebar-rail\"\n aria-label=\"Toggle Sidebar\"\n tabIndex={-1}\n onClick={toggleSidebar}\n title=\"Toggle Sidebar\"\n className={cn(SIDEBAR_RAIL, className)}\n {...props}\n />\n );\n}\n\nexport function SidebarInset({ className, ...props }: React.ComponentProps<\"main\">) {\n return (\n <main\n data-slot=\"sidebar-inset\"\n className={cn(SIDEBAR_INSET, className)}\n {...props}\n />\n );\n}\n\nexport function SidebarHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-header\"\n data-sidebar=\"header\"\n className={cn(SIDEBAR_HEADER, className)}\n {...props}\n />\n );\n}\n\nexport function SidebarFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-footer\"\n data-sidebar=\"footer\"\n className={cn(SIDEBAR_FOOTER, className)}\n {...props}\n />\n );\n}\n\nexport function SidebarSeparator({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-separator\"\n data-sidebar=\"separator\"\n role=\"separator\"\n className={cn(SIDEBAR_SEPARATOR, className)}\n {...props}\n />\n );\n}\n\nexport function SidebarContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-content\"\n data-sidebar=\"content\"\n className={cn(SIDEBAR_CONTENT, className)}\n {...props}\n />\n );\n}\n\nexport function SidebarGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-group\"\n data-sidebar=\"group\"\n className={cn(SIDEBAR_GROUP, className)}\n {...props}\n />\n );\n}\n\nexport interface SidebarGroupLabelProps extends React.ComponentProps<\"div\"> {\n asChild?: boolean;\n}\n\nexport function SidebarGroupLabel({\n className,\n asChild = false,\n ...props\n}: SidebarGroupLabelProps) {\n const Comp = asChild ? Slot : \"div\";\n\n return (\n <Comp\n data-slot=\"sidebar-group-label\"\n data-sidebar=\"group-label\"\n className={cn(SIDEBAR_GROUP_LABEL, className)}\n {...(props as Record<string, unknown>)}\n />\n );\n}\n\nexport function SidebarGroupContent({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-group-content\"\n data-sidebar=\"group-content\"\n className={cn(SIDEBAR_GROUP_CONTENT, className)}\n {...props}\n />\n );\n}\n\nexport function SidebarMenu({ className, ...props }: React.ComponentProps<\"ul\">) {\n return (\n <ul\n data-slot=\"sidebar-menu\"\n data-sidebar=\"menu\"\n className={cn(SIDEBAR_MENU, className)}\n {...props}\n />\n );\n}\n\nexport function SidebarMenuItem({ className, ...props }: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"sidebar-menu-item\"\n data-sidebar=\"menu-item\"\n className={cn(SIDEBAR_MENU_ITEM, className)}\n {...props}\n />\n );\n}\n\nexport interface SidebarMenuButtonProps extends React.ComponentProps<\"button\"> {\n asChild?: boolean;\n isActive?: boolean;\n variant?: ButtonVariant;\n size?: SidebarMenuButtonSize;\n}\n\nexport function SidebarMenuButton({\n asChild = false,\n isActive = false,\n variant = \"ghost\",\n size = \"sm\",\n className,\n ...props\n}: SidebarMenuButtonProps) {\n const Comp = asChild ? Slot : \"button\";\n\n return (\n <Comp\n data-slot=\"sidebar-menu-button\"\n data-sidebar=\"menu-button\"\n data-size={size}\n data-active={isActive}\n className={cn(\n SIDEBAR_MENU_BUTTON_BASE,\n buttonVariantClasses[variant],\n sidebarMenuButtonSizeClasses[size],\n className,\n )}\n {...(props as Record<string, unknown>)}\n />\n );\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/components/atomic/sidebar.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\nimport { Slot } from \"../../primitives/slot\";\nimport { useControllableState } from \"../../primitives/use-controllable-state\";\nimport { SIDEBAR_CONTENT, SIDEBAR_FLAT, SIDEBAR_FOOTER, SIDEBAR_GROUP, SIDEBAR_GROUP_CONTENT, SIDEBAR_GROUP_LABEL, SIDEBAR_HEADER, SIDEBAR_INNER, SIDEBAR_INSET, SIDEBAR_MENU, SIDEBAR_MENU_BUTTON_BASE, SIDEBAR_MENU_ITEM, SIDEBAR_RAIL, SIDEBAR_ROOT, SIDEBAR_SEPARATOR, SIDEBAR_TRIGGER, SIDEBAR_WIDTH, SIDEBAR_WIDTH_ICON, SIDEBAR_WRAPPER, sidebarMenuButtonSizeClasses, type SidebarMenuButtonSize } from \"../../generated/sidebar\";\nimport { buttonVariantClasses, type ButtonVariant } from \"../../generated/button\";\nimport type { SidebarCollapsible, SidebarSide, SidebarVariant } from \"../../generated/sidebar\";\nimport * as copy from \"../../generated/copy\";\n\nexport type { SidebarMenuButtonSize };\n\n// omitted: mobile sheet, cookie, kbd shortcut — see README Limitations\n\n\ninterface SidebarContextValue {\n state: \"expanded\" | \"collapsed\";\n open: boolean;\n setOpen: (open: boolean) => void;\n toggleSidebar: () => void;\n}\n\nconst SidebarContext = React.createContext<SidebarContextValue | null>(null);\n\nexport function useSidebar(): SidebarContextValue {\n const ctx = React.useContext(SidebarContext);\n if (!ctx) throw new Error(\"useSidebar must be used within a SidebarProvider.\");\n return ctx;\n}\n\nexport interface SidebarProviderProps extends React.ComponentProps<\"div\"> {\n defaultOpen?: boolean;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n}\n\nexport function SidebarProvider({\n defaultOpen = true,\n open: openProp,\n onOpenChange,\n className,\n style,\n children,\n ...props\n}: SidebarProviderProps) {\n const [open, setOpen] = useControllableState<boolean>({\n ...(openProp !== undefined ? { value: openProp } : {}),\n defaultValue: defaultOpen,\n ...(onOpenChange ? { onChange: onOpenChange } : {}),\n });\n const toggleSidebar = React.useCallback(\n () => setOpen(!open),\n [open, setOpen],\n );\n const state = open ? \"expanded\" : \"collapsed\";\n\n const contextValue = React.useMemo<SidebarContextValue>(\n () => ({ state, open, setOpen, toggleSidebar }),\n [state, open, setOpen, toggleSidebar],\n );\n\n return (\n <SidebarContext.Provider value={contextValue}>\n <div\n data-slot=\"sidebar-wrapper\"\n style={\n {\n \"--sidebar-width\": SIDEBAR_WIDTH,\n \"--sidebar-width-icon\": SIDEBAR_WIDTH_ICON,\n ...style,\n } as React.CSSProperties\n }\n className={cn(SIDEBAR_WRAPPER, className)}\n {...props}\n >\n {children}\n </div>\n </SidebarContext.Provider>\n );\n}\n\nexport interface SidebarProps extends React.ComponentProps<\"div\"> {\n side?: SidebarSide;\n variant?: SidebarVariant;\n collapsible?: SidebarCollapsible;\n}\n\nexport function Sidebar({\n side = \"left\",\n variant = \"sidebar\",\n collapsible = \"offcanvas\",\n className,\n children,\n ...props\n}: SidebarProps) {\n const { state } = useSidebar();\n\n if (collapsible === \"none\") {\n return (\n <div\n data-slot=\"sidebar\"\n className={cn(SIDEBAR_FLAT, className)}\n {...props}\n >\n {children}\n </div>\n );\n }\n\n return (\n <div\n className={SIDEBAR_ROOT}\n data-state={state}\n data-collapsible={state === \"collapsed\" ? collapsible : \"\"}\n data-variant={variant}\n data-side={side}\n data-slot=\"sidebar\"\n >\n <div\n data-slot=\"sidebar-inner\"\n className={cn(SIDEBAR_INNER, className)}\n {...props}\n >\n {children}\n </div>\n </div>\n );\n}\n\nexport function SidebarTrigger({\n className,\n onClick,\n children,\n ...props\n}: React.ComponentProps<\"button\">) {\n const { toggleSidebar } = useSidebar();\n\n return (\n <button\n type=\"button\"\n data-sidebar=\"trigger\"\n data-slot=\"sidebar-trigger\"\n aria-label={copy.SIDEBAR_TOGGLE}\n className={cn(SIDEBAR_TRIGGER, className)}\n onClick={(event) => {\n onClick?.(event);\n toggleSidebar();\n }}\n {...props}\n >\n {children}\n <span className=\"sr-only\">{copy.SIDEBAR_TOGGLE}</span>\n </button>\n );\n}\n\nexport function SidebarRail({\n className,\n ...props\n}: React.ComponentProps<\"button\">) {\n const { toggleSidebar } = useSidebar();\n\n return (\n <button\n type=\"button\"\n data-sidebar=\"rail\"\n data-slot=\"sidebar-rail\"\n aria-label={copy.SIDEBAR_TOGGLE}\n tabIndex={-1}\n onClick={toggleSidebar}\n title={copy.SIDEBAR_TOGGLE}\n className={cn(SIDEBAR_RAIL, className)}\n {...props}\n />\n );\n}\n\nexport function SidebarInset({ className, ...props }: React.ComponentProps<\"main\">) {\n return (\n <main\n data-slot=\"sidebar-inset\"\n className={cn(SIDEBAR_INSET, className)}\n {...props}\n />\n );\n}\n\nexport function SidebarHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-header\"\n data-sidebar=\"header\"\n className={cn(SIDEBAR_HEADER, className)}\n {...props}\n />\n );\n}\n\nexport function SidebarFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-footer\"\n data-sidebar=\"footer\"\n className={cn(SIDEBAR_FOOTER, className)}\n {...props}\n />\n );\n}\n\nexport function SidebarSeparator({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-separator\"\n data-sidebar=\"separator\"\n role=\"separator\"\n className={cn(SIDEBAR_SEPARATOR, className)}\n {...props}\n />\n );\n}\n\nexport function SidebarContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-content\"\n data-sidebar=\"content\"\n className={cn(SIDEBAR_CONTENT, className)}\n {...props}\n />\n );\n}\n\nexport function SidebarGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-group\"\n data-sidebar=\"group\"\n className={cn(SIDEBAR_GROUP, className)}\n {...props}\n />\n );\n}\n\nexport interface SidebarGroupLabelProps extends React.ComponentProps<\"div\"> {\n asChild?: boolean;\n}\n\nexport function SidebarGroupLabel({\n className,\n asChild = false,\n ...props\n}: SidebarGroupLabelProps) {\n const Comp = asChild ? Slot : \"div\";\n\n return (\n <Comp\n data-slot=\"sidebar-group-label\"\n data-sidebar=\"group-label\"\n className={cn(SIDEBAR_GROUP_LABEL, className)}\n {...(props as Record<string, unknown>)}\n />\n );\n}\n\nexport function SidebarGroupContent({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-group-content\"\n data-sidebar=\"group-content\"\n className={cn(SIDEBAR_GROUP_CONTENT, className)}\n {...props}\n />\n );\n}\n\nexport function SidebarMenu({ className, ...props }: React.ComponentProps<\"ul\">) {\n return (\n <ul\n data-slot=\"sidebar-menu\"\n data-sidebar=\"menu\"\n className={cn(SIDEBAR_MENU, className)}\n {...props}\n />\n );\n}\n\nexport function SidebarMenuItem({ className, ...props }: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"sidebar-menu-item\"\n data-sidebar=\"menu-item\"\n className={cn(SIDEBAR_MENU_ITEM, className)}\n {...props}\n />\n );\n}\n\nexport interface SidebarMenuButtonProps extends React.ComponentProps<\"button\"> {\n asChild?: boolean;\n isActive?: boolean;\n variant?: ButtonVariant;\n size?: SidebarMenuButtonSize;\n}\n\nexport function SidebarMenuButton({\n asChild = false,\n isActive = false,\n variant = \"ghost\",\n size = \"sm\",\n className,\n ...props\n}: SidebarMenuButtonProps) {\n const Comp = asChild ? Slot : \"button\";\n\n return (\n <Comp\n data-slot=\"sidebar-menu-button\"\n data-sidebar=\"menu-button\"\n data-size={size}\n data-active={isActive}\n className={cn(\n SIDEBAR_MENU_BUTTON_BASE,\n buttonVariantClasses[variant],\n sidebarMenuButtonSizeClasses[size],\n className,\n )}\n {...(props as Record<string, unknown>)}\n />\n );\n}\n"],"mappings":"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","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/atomic/slider.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\nimport { useControllableState } from \"../../primitives/use-controllable-state\";\nimport { SLIDER_RANGE, SLIDER_ROOT, SLIDER_THUMB, SLIDER_TRACK } from \"../../generated/slider\";\n\ntype Orientation = \"horizontal\" | \"vertical\";\n\nfunction clampStep(value: number, min: number, max: number, step: number): number {\n const clamped = Math.min(max, Math.max(min, value));\n if (step <= 0) return clamped;\n const steps = Math.round((clamped - min) / step);\n return Math.min(max, Math.max(min, min + steps * step));\n}\n\nexport interface SliderProps\n extends Omit<React.ComponentProps<\"span\">, \"defaultValue\" | \"onChange\"> {\n value?: number;\n defaultValue?: number;\n onValueChange?: (value: number) => void;\n min?: number;\n max?: number;\n step?: number;\n orientation?: Orientation;\n disabled?: boolean;\n}\n\nexport function Slider({\n className,\n value,\n defaultValue = 0,\n onValueChange,\n min = 0,\n max = 100,\n step = 1,\n orientation = \"horizontal\",\n disabled = false,\n ...props\n}: SliderProps) {\n const [raw, setRaw] = useControllableState<number>({\n ...(value !== undefined ? { value } : {}),\n defaultValue,\n ...(onValueChange ? { onChange: onValueChange } : {}),\n });\n const current = clampStep(raw, min, max, step);\n const span = Math.max(max - min, Number.EPSILON);\n const percent = Math.min(100, Math.max(0, ((current - min) / span) * 100));\n\n const trackRef = React.useRef<HTMLSpanElement>(null);\n const draggingRef = React.useRef(false);\n\n const valueFromPointer = React.useCallback(\n (clientX: number, clientY: number) => {\n const rect = trackRef.current?.getBoundingClientRect();\n if (!rect) return current;\n const ratio =\n orientation === \"vertical\"\n ? (rect.bottom - clientY) / rect.height\n : (clientX - rect.left) / rect.width;\n return clampStep(min + ratio * (max - min), min, max, step);\n },\n [current, orientation, min, max, step],\n );\n\n const onKeyDown = (event: React.KeyboardEvent) => {\n if (disabled) return;\n let next: number;\n switch (event.key) {\n case \"ArrowRight\":\n case \"ArrowUp\":\n next = current + step;\n break;\n case \"ArrowLeft\":\n case \"ArrowDown\":\n next = current - step;\n break;\n case \"Home\":\n next = min;\n break;\n case \"End\":\n next = max;\n break;\n default:\n return;\n }\n event.preventDefault();\n setRaw(clampStep(next, min, max, step));\n };\n\n const onPointerDown = (event: React.PointerEvent) => {\n if (disabled) return;\n draggingRef.current = true;\n event.currentTarget.setPointerCapture?.(event.pointerId);\n setRaw(valueFromPointer(event.clientX, event.clientY));\n };\n\n const onPointerMove = (event: React.PointerEvent) => {\n if (!draggingRef.current || disabled) return;\n setRaw(valueFromPointer(event.clientX, event.clientY));\n };\n\n const onPointerUp = (event: React.PointerEvent) => {\n draggingRef.current = false;\n event.currentTarget.releasePointerCapture?.(event.pointerId);\n };\n\n const rangeStyle: React.CSSProperties =\n orientation === \"vertical\" ? { height: `${percent}%` } : { width: `${percent}%` };\n // The thumb is absolutely positioned within the (relative) root and centered\n // on the value point; without `position:absolute` the `%` offset is ignored and\n // flow layout parks it at the end of the row.\n const thumbStyle: React.CSSProperties =\n orientation === \"vertical\"\n ? { position: \"absolute\", bottom: `${percent}%`, left: \"50%\", transform: \"translate(-50%, 50%)\" }\n : { position: \"absolute\", left: `${percent}%`, top: \"50%\", transform: \"translate(-50%, -50%)\" };\n\n return (\n <span\n data-slot=\"slider\"\n data-orientation={orientation}\n data-disabled={disabled || undefined}\n className={cn(SLIDER_ROOT, className)}\n {...props}\n // Pointer handling lives on the root, not the track: the thumb sits above\n // the track (absolute), so grabbing it must still start a drag.\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={onPointerUp}\n >\n <span\n ref={trackRef}\n data-slot=\"slider-track\"\n data-orientation={orientation}\n className={SLIDER_TRACK}\n >\n <span\n data-slot=\"slider-range\"\n data-orientation={orientation}\n className={SLIDER_RANGE}\n style={rangeStyle}\n />\n </span>\n <span\n data-slot=\"slider-thumb\"\n data-orientation={orientation}\n className={SLIDER_THUMB}\n style={thumbStyle}\n role=\"slider\"\n tabIndex={disabled ? -1 : 0}\n aria-valuenow={current}\n aria-valuemin={min}\n aria-valuemax={max}\n aria-orientation={orientation}\n aria-disabled={disabled || undefined}\n onKeyDown={onKeyDown}\n />\n </span>\n );\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/components/atomic/slider.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\nimport { useControllableState } from \"../../primitives/use-controllable-state\";\nimport { SLIDER_RANGE, SLIDER_ROOT, SLIDER_THUMB, SLIDER_TRACK } from \"../../generated/slider\";\nimport type { Orientation } from \"../../generated/orientation\";\n\n\nfunction clampStep(value: number, min: number, max: number, step: number): number {\n const clamped = Math.min(max, Math.max(min, value));\n if (step <= 0) return clamped;\n const steps = Math.round((clamped - min) / step);\n return Math.min(max, Math.max(min, min + steps * step));\n}\n\nexport interface SliderProps\n extends Omit<React.ComponentProps<\"span\">, \"defaultValue\" | \"onChange\"> {\n value?: number;\n defaultValue?: number;\n onValueChange?: (value: number) => void;\n min?: number;\n max?: number;\n step?: number;\n orientation?: Orientation;\n disabled?: boolean;\n}\n\nexport function Slider({\n className,\n value,\n defaultValue = 0,\n onValueChange,\n min = 0,\n max = 100,\n step = 1,\n orientation = \"horizontal\",\n disabled = false,\n ...props\n}: SliderProps) {\n const [raw, setRaw] = useControllableState<number>({\n ...(value !== undefined ? { value } : {}),\n defaultValue,\n ...(onValueChange ? { onChange: onValueChange } : {}),\n });\n const current = clampStep(raw, min, max, step);\n const span = Math.max(max - min, Number.EPSILON);\n const percent = Math.min(100, Math.max(0, ((current - min) / span) * 100));\n\n const trackRef = React.useRef<HTMLSpanElement>(null);\n const draggingRef = React.useRef(false);\n\n const valueFromPointer = React.useCallback(\n (clientX: number, clientY: number) => {\n const rect = trackRef.current?.getBoundingClientRect();\n if (!rect) return current;\n const ratio =\n orientation === \"vertical\"\n ? (rect.bottom - clientY) / rect.height\n : (clientX - rect.left) / rect.width;\n return clampStep(min + ratio * (max - min), min, max, step);\n },\n [current, orientation, min, max, step],\n );\n\n const onKeyDown = (event: React.KeyboardEvent) => {\n if (disabled) return;\n let next: number;\n switch (event.key) {\n case \"ArrowRight\":\n case \"ArrowUp\":\n next = current + step;\n break;\n case \"ArrowLeft\":\n case \"ArrowDown\":\n next = current - step;\n break;\n case \"Home\":\n next = min;\n break;\n case \"End\":\n next = max;\n break;\n default:\n return;\n }\n event.preventDefault();\n setRaw(clampStep(next, min, max, step));\n };\n\n const onPointerDown = (event: React.PointerEvent) => {\n if (disabled) return;\n draggingRef.current = true;\n event.currentTarget.setPointerCapture?.(event.pointerId);\n setRaw(valueFromPointer(event.clientX, event.clientY));\n };\n\n const onPointerMove = (event: React.PointerEvent) => {\n if (!draggingRef.current || disabled) return;\n setRaw(valueFromPointer(event.clientX, event.clientY));\n };\n\n const onPointerUp = (event: React.PointerEvent) => {\n draggingRef.current = false;\n event.currentTarget.releasePointerCapture?.(event.pointerId);\n };\n\n const rangeStyle: React.CSSProperties =\n orientation === \"vertical\" ? { height: `${percent}%` } : { width: `${percent}%` };\n // The thumb is absolutely positioned within the (relative) root and centered\n // on the value point; without `position:absolute` the `%` offset is ignored and\n // flow layout parks it at the end of the row.\n const thumbStyle: React.CSSProperties =\n orientation === \"vertical\"\n ? { position: \"absolute\", bottom: `${percent}%`, left: \"50%\", transform: \"translate(-50%, 50%)\" }\n : { position: \"absolute\", left: `${percent}%`, top: \"50%\", transform: \"translate(-50%, -50%)\" };\n\n return (\n <span\n data-slot=\"slider\"\n data-orientation={orientation}\n data-disabled={disabled || undefined}\n className={cn(SLIDER_ROOT, className)}\n {...props}\n // Pointer handling lives on the root, not the track: the thumb sits above\n // the track (absolute), so grabbing it must still start a drag.\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={onPointerUp}\n >\n <span\n ref={trackRef}\n data-slot=\"slider-track\"\n data-orientation={orientation}\n className={SLIDER_TRACK}\n >\n <span\n data-slot=\"slider-range\"\n data-orientation={orientation}\n className={SLIDER_RANGE}\n style={rangeStyle}\n />\n </span>\n <span\n data-slot=\"slider-thumb\"\n data-orientation={orientation}\n className={SLIDER_THUMB}\n style={thumbStyle}\n role=\"slider\"\n tabIndex={disabled ? -1 : 0}\n aria-valuenow={current}\n aria-valuemin={min}\n aria-valuemax={max}\n aria-orientation={orientation}\n aria-disabled={disabled || undefined}\n onKeyDown={onKeyDown}\n />\n </span>\n );\n}\n"],"mappings":"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","names":[]}
@@ -9,9 +9,13 @@ import {
9
9
  TOAST_TITLE,
10
10
  TOASTER_BASE,
11
11
  positionClasses,
12
- toastVariantClasses
12
+ TOAST_DURATION_MS,
13
+ TOAST_GAP,
14
+ TOAST_VISIBLE
13
15
  } from "../../generated/sonner.js";
14
- const DEFAULT_DURATION = 4e3;
16
+ import * as copy from "../../generated/copy.js";
17
+ import { iconShapes } from "../../icons/icon-shapes.js";
18
+ import { toneClasses } from "../../generated/tone.js";
15
19
  const SWIPE_THRESHOLD = 45;
16
20
  const SWIPE_VELOCITY = 0.11;
17
21
  const SWIPE_FLING_MS = 200;
@@ -27,8 +31,8 @@ const store = /* @__PURE__ */ (() => {
27
31
  id: ++id,
28
32
  message,
29
33
  description: opts.description,
30
- duration: opts.duration ?? DEFAULT_DURATION,
31
- variant: opts.variant ?? "neutral",
34
+ duration: opts.duration ?? TOAST_DURATION_MS,
35
+ tone: opts.tone ?? "neutral",
32
36
  state: "open"
33
37
  };
34
38
  toasts = [...toasts, next];
@@ -57,15 +61,13 @@ const store = /* @__PURE__ */ (() => {
57
61
  const toast = Object.assign(
58
62
  (message, opts) => store.add(message, opts),
59
63
  {
60
- positive: (message, opts) => store.add(message, { ...opts, variant: "positive" }),
61
- error: (message, opts) => store.add(message, { ...opts, variant: "error" }),
62
- info: (message, opts) => store.add(message, { ...opts, variant: "info" }),
63
- warn: (message, opts) => store.add(message, { ...opts, variant: "warn" }),
64
+ positive: (message, opts) => store.add(message, { ...opts, tone: "positive" }),
65
+ error: (message, opts) => store.add(message, { ...opts, tone: "error" }),
66
+ info: (message, opts) => store.add(message, { ...opts, tone: "info" }),
67
+ warn: (message, opts) => store.add(message, { ...opts, tone: "warn" }),
64
68
  dismiss: (id) => store.dismiss(id)
65
69
  }
66
70
  );
67
- const VISIBLE_TOASTS = 3;
68
- const GAP = 14;
69
71
  function ToastItem({
70
72
  toast: t,
71
73
  index,
@@ -179,10 +181,10 @@ function ToastItem({
179
181
  role: "status",
180
182
  "aria-live": "polite",
181
183
  "data-slot": "toast",
182
- "data-variant": t.variant,
184
+ "data-tone": t.tone,
183
185
  "data-state": t.state === "closing" ? "closed" : "open",
184
186
  "data-front": index === 0,
185
- "data-visible": index < VISIBLE_TOASTS,
187
+ "data-visible": index < TOAST_VISIBLE,
186
188
  onTransitionEnd,
187
189
  onPointerDown,
188
190
  onPointerMove,
@@ -196,8 +198,8 @@ function ToastItem({
196
198
  },
197
199
  className: cn(
198
200
  TOAST_BASE,
199
- "touch-pan-y select-none",
200
- toastVariantClasses[t.variant]
201
+ toneClasses[t.tone],
202
+ "touch-pan-y select-none"
201
203
  ),
202
204
  children: [
203
205
  /* @__PURE__ */ jsxs("div", { className: TOAST_CONTENT, children: [
@@ -208,7 +210,7 @@ function ToastItem({
208
210
  "button",
209
211
  {
210
212
  type: "button",
211
- "aria-label": "Close",
213
+ "aria-label": copy.CLOSE,
212
214
  "data-slot": "toast-close",
213
215
  onClick: () => store.dismiss(t.id),
214
216
  className: TOAST_CLOSE,
@@ -225,7 +227,7 @@ function ToastItem({
225
227
  strokeLinecap: "round",
226
228
  strokeLinejoin: "round",
227
229
  "aria-hidden": "true",
228
- children: /* @__PURE__ */ jsx("path", { d: "M18 6 6 18M6 6l12 12" })
230
+ children: iconShapes("x")
229
231
  }
230
232
  )
231
233
  }
@@ -271,7 +273,7 @@ function Toaster({
271
273
  const frontHeight = ordered[0] ? heights.get(ordered[0].id) ?? (known.length ? Math.max(...known) : 0) : 0;
272
274
  let sum = 0;
273
275
  const offsets = ordered.map((t, i) => {
274
- const o = sum + i * GAP;
276
+ const o = sum + i * TOAST_GAP;
275
277
  sum += heights.get(t.id) ?? 0;
276
278
  return o;
277
279
  });
@@ -285,7 +287,7 @@ function Toaster({
285
287
  "data-stack": "",
286
288
  style: {
287
289
  "--front-height": `${frontHeight}px`,
288
- "--gap": `${GAP}px`
290
+ "--gap": `${TOAST_GAP}px`
289
291
  },
290
292
  className: cn(
291
293
  TOASTER_BASE,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/atomic/sonner.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\nimport {\n TOAST_BASE,\n TOAST_CLOSE,\n TOAST_CONTENT,\n TOAST_TITLE,\n TOASTER_BASE,\n positionClasses,\n toastVariantClasses,\n type ToastPosition,\n type ToastVariant,\n} from \"../../generated/sonner\";\n\nexport type { ToastPosition, ToastVariant };\n\n/**\n * Lifecycle phase of a toast. It is added `\"open\"` (plays the enter keyframe);\n * {@link ToastFn.dismiss} flips it to `\"closing\"` (slides it out) and the live\n * node is dropped once the exit `transitionend` fires. Mirrors Rust's\n * `ToastState` enum and the `data-state` the shared `tokens.css` keys on.\n */\nexport type ToastState = \"open\" | \"closing\";\n\nexport interface ToastOptions {\n description?: React.ReactNode;\n /**\n * Auto-dismiss delay in ms (default 4000). Pass `Infinity` for a **persistent**\n * toast that never times out — it stays until the close button, a swipe, or\n * `toast.dismiss(id)` removes it. Hovering the stack also pauses the countdown.\n */\n duration?: number;\n variant?: ToastVariant;\n}\n\nexport interface Toast {\n id: number;\n message: React.ReactNode;\n description?: React.ReactNode;\n duration: number;\n variant: ToastVariant;\n state: ToastState;\n}\n\nconst DEFAULT_DURATION = 4000;\n\n// Swipe-to-dismiss tuning (pointer physics, TS-only — Rust stays render-only).\n// Values from Sonner: a horizontal drag past 45px, or a flick faster than\n// 0.11px/ms, flings the toast off; anything short snaps back.\nconst SWIPE_THRESHOLD = 45;\nconst SWIPE_VELOCITY = 0.11;\nconst SWIPE_FLING_MS = 200;\n\n/**\n * Module-level toast store: a plain observable holding the live toast array.\n * `toast(...)` mutates it and notifies subscribers; the {@link Toaster}\n * component is the sole subscriber. This is the JS-native global the Rust\n * mirror cannot have — Dioxus has no clean cross-component mutable singleton,\n * so it uses a `ToasterProvider` + `use_toaster()` hook instead.\n */\nconst store = (() => {\n let toasts: Toast[] = [];\n let id = 0;\n const listeners = new Set<(toasts: Toast[]) => void>();\n\n const emit = () => {\n for (const listener of listeners) listener(toasts);\n };\n\n const add = (message: React.ReactNode, opts: ToastOptions = {}): number => {\n const next: Toast = {\n id: ++id,\n message,\n description: opts.description,\n duration: opts.duration ?? DEFAULT_DURATION,\n variant: opts.variant ?? \"neutral\",\n state: \"open\",\n };\n toasts = [...toasts, next];\n emit();\n return next.id;\n };\n\n // Begins the exit animation: flip the toast to `closing` (`data-state=closed`)\n // and keep it mounted so the exit keyframe can play. The live node is dropped\n // by `remove`, wired to the exit `transitionend` — no timer matched to the CSS.\n // A toast dismissed before it has ever painted mounts closed and so never\n // transitions; `ToastItem` drops that one on mount instead.\n const dismiss = (toastId: number) => {\n toasts = toasts.map((t) =>\n t.id === toastId ? { ...t, state: \"closing\" as const } : t,\n );\n emit();\n };\n\n // Drops a toast outright. Wired to the exit `transitionend`; the guard that it\n // is actually `closing` (a restack transition fires too) lives at the call\n // site in {@link ToastItem}, alongside the mount-closed path.\n const remove = (toastId: number) => {\n toasts = toasts.filter((t) => t.id !== toastId);\n emit();\n };\n\n const subscribe = (listener: (toasts: Toast[]) => void): (() => void) => {\n listeners.add(listener);\n listener(toasts);\n return () => {\n listeners.delete(listener);\n };\n };\n\n return { add, dismiss, remove, subscribe };\n})();\n\nexport interface ToastFn {\n (message: React.ReactNode, opts?: ToastOptions): number;\n positive: (message: React.ReactNode, opts?: ToastOptions) => number;\n error: (message: React.ReactNode, opts?: ToastOptions) => number;\n info: (message: React.ReactNode, opts?: ToastOptions) => number;\n warn: (message: React.ReactNode, opts?: ToastOptions) => number;\n dismiss: (id: number) => void;\n}\n\n/**\n * Global toast handle. `toast(msg)` enqueues a neutral toast; the `.positive`,\n * `.error`, `.info` and `.warn` helpers pin the variant; `toast.dismiss(id)`\n * removes one early. Mirrors Rust's `use_toaster()` handle methods.\n */\nexport const toast: ToastFn = Object.assign(\n (message: React.ReactNode, opts?: ToastOptions) => store.add(message, opts),\n {\n positive: (message: React.ReactNode, opts?: ToastOptions) =>\n store.add(message, { ...opts, variant: \"positive\" }),\n error: (message: React.ReactNode, opts?: ToastOptions) =>\n store.add(message, { ...opts, variant: \"error\" }),\n info: (message: React.ReactNode, opts?: ToastOptions) =>\n store.add(message, { ...opts, variant: \"info\" }),\n warn: (message: React.ReactNode, opts?: ToastOptions) =>\n store.add(message, { ...opts, variant: \"warn\" }),\n dismiss: (id: number) => store.dismiss(id),\n },\n);\n\n// Sonner-style stacking: only the front VISIBLE_TOASTS show collapsed; GAP is\n// the px between them once expanded.\nconst VISIBLE_TOASTS = 3;\nconst GAP = 14;\n\ninterface ToastItemProps {\n toast: Toast;\n index: number; // 0 = front / newest\n total: number;\n offset: number; // px from the pinned edge to this toast's expanded slot\n paused: boolean; // the stack is hovered/focused — hold the auto-dismiss\n reportHeight: (id: number, height: number) => void;\n removeHeight: (id: number) => void;\n}\n\nfunction ToastItem({\n toast: t,\n index,\n total,\n offset,\n paused,\n reportHeight,\n removeHeight,\n}: ToastItemProps) {\n const ref = React.useRef<HTMLLIElement>(null);\n const [height, setHeight] = React.useState(0);\n // remaining auto-dismiss budget (banked across hover pauses), the last start\n // timestamp, and the swipe-fling fallback timer.\n const remainingRef = React.useRef(t.duration);\n const startedRef = React.useRef(0);\n const flingRef = React.useRef<ReturnType<typeof setTimeout> | undefined>(\n undefined,\n );\n const dragRef = React.useRef<{ x: number; time: number; dx: number } | null>(\n null,\n );\n\n // measure the *natural* height for the stack maths; re-measure on content\n // change. Back toasts are clamped to --front-height by the CSS, so unset the\n // height for the read (Sonner does the same) then hand it back to the CSS.\n React.useLayoutEffect(() => {\n const el = ref.current;\n if (!el) return;\n el.style.height = \"auto\";\n const h = el.getBoundingClientRect().height;\n el.style.height = \"\";\n if (h) {\n setHeight(h);\n reportHeight(t.id, h);\n }\n }, [t.id, t.message, t.description, reportHeight]);\n\n React.useEffect(() => () => removeHeight(t.id), [t.id, removeHeight]);\n\n // Dismissed before its first paint (added and dismissed in one batch), so it\n // mounts already `closing`: its computed style never changes, no transition\n // runs, and `onTransitionEnd` below would never fire — stranding it in the\n // store forever. Nothing was painted, so there is nothing to animate: drop it\n // once mounted. Mirrors the Dioxus port's mount effect.\n const mountedClosing = React.useRef(t.state === \"closing\");\n React.useEffect(() => {\n if (mountedClosing.current) store.remove(t.id);\n }, [t.id]);\n\n // Auto-dismiss, pausable on hover. While `paused` (or closing, or a persistent\n // `duration: Infinity`) no timer runs; the cleanup banks the elapsed time so a\n // resume continues from the remaining budget rather than restarting.\n React.useEffect(() => {\n if (t.duration === Infinity || t.state === \"closing\" || paused) return;\n startedRef.current = Date.now();\n const id = setTimeout(() => store.dismiss(t.id), remainingRef.current);\n return () => {\n clearTimeout(id);\n remainingRef.current = Math.max(\n 0,\n remainingRef.current - (Date.now() - startedRef.current),\n );\n };\n }, [paused, t.id, t.duration, t.state]);\n\n // cancel the swipe-fling fallback if the toast unmounts first\n React.useEffect(\n () => () => {\n if (flingRef.current) clearTimeout(flingRef.current);\n },\n [],\n );\n\n // exit rides the transition: a closing toast slides back off and is dropped on\n // the transform's `transitionend` (guarded so stack repositioning never fires\n // it). No host timer — keeps parity with the Dioxus port.\n const onTransitionEnd = (e: React.TransitionEvent<HTMLLIElement>) => {\n if (t.state === \"closing\" && e.propertyName === \"transform\") {\n store.remove(t.id);\n }\n };\n\n // ── swipe-to-dismiss (horizontal pointer drag) ──────────────────────────\n // Tracked through the `--swipe-x` var so it *composes* with the stack\n // transform (`var(--y) translateX(var(--swipe-x))`) instead of overriding it.\n const onPointerDown = (e: React.PointerEvent<HTMLLIElement>) => {\n const el = ref.current;\n if (!el || e.button > 0 || t.state === \"closing\") return;\n if ((e.target as HTMLElement).closest('[data-slot=\"toast-close\"]')) return;\n // auto-dismiss is already paused (a swipe means the pointer is over the stack)\n dragRef.current = { x: e.clientX, time: e.timeStamp, dx: 0 };\n el.setAttribute(\"data-swiping\", \"true\"); // CSS drops the transition for 1:1 tracking\n try {\n el.setPointerCapture?.(e.pointerId);\n } catch {\n // jsdom / unsupported — capture is a nice-to-have, the drag works without it\n }\n };\n\n const onPointerMove = (e: React.PointerEvent<HTMLLIElement>) => {\n const drag = dragRef.current;\n const el = ref.current;\n if (!drag || !el) return;\n const dx = e.clientX - drag.x;\n drag.dx = dx;\n const dist = el.offsetWidth || 256;\n el.style.setProperty(\"--swipe-x\", `${dx}px`);\n el.style.opacity = `${Math.max(0, 1 - Math.abs(dx) / dist)}`;\n };\n\n const onPointerEnd = (e: React.PointerEvent<HTMLLIElement>) => {\n const drag = dragRef.current;\n const el = ref.current;\n if (!drag || !el) return;\n dragRef.current = null;\n el.removeAttribute(\"data-swiping\"); // CSS restores the transition\n const dt = e.timeStamp - drag.time;\n const velocity = dt > 0 ? Math.abs(drag.dx) / dt : 0;\n if (\n drag.dx !== 0 &&\n (Math.abs(drag.dx) >= SWIPE_THRESHOLD || velocity > SWIPE_VELOCITY)\n ) {\n el.style.setProperty(\"--swipe-x\", `${drag.dx > 0 ? 150 : -150}%`);\n el.style.opacity = \"0\";\n const remove = () => store.remove(t.id);\n el.addEventListener(\"transitionend\", remove, { once: true });\n flingRef.current = setTimeout(remove, SWIPE_FLING_MS + 50); // fallback if transitionend is missed\n } else {\n // snap back: clear the swipe offset (the transition carries it home), then\n // hand styling back to the CSS. Auto-dismiss stays paused while hovered and\n // re-arms from the remaining budget once the pointer leaves.\n el.style.setProperty(\"--swipe-x\", \"0px\");\n el.style.opacity = \"1\";\n el.addEventListener(\n \"transitionend\",\n () => {\n el.style.removeProperty(\"--swipe-x\");\n el.style.opacity = \"\";\n },\n { once: true },\n );\n }\n };\n\n return (\n <li\n ref={ref}\n role=\"status\"\n aria-live=\"polite\"\n data-slot=\"toast\"\n data-variant={t.variant}\n data-state={t.state === \"closing\" ? \"closed\" : \"open\"}\n data-front={index === 0}\n data-visible={index < VISIBLE_TOASTS}\n onTransitionEnd={onTransitionEnd}\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={onPointerEnd}\n onPointerCancel={onPointerEnd}\n style={\n {\n \"--index\": index,\n \"--z-index\": total - index,\n \"--offset\": `${offset}px`,\n \"--initial-height\": `${height}px`,\n } as React.CSSProperties\n }\n className={cn(\n TOAST_BASE,\n \"touch-pan-y select-none\",\n toastVariantClasses[t.variant],\n )}\n >\n <div className={TOAST_CONTENT}>\n <div className={TOAST_TITLE}>{t.message}</div>\n {t.description ? (\n <div className=\"text-ink-soft text-sm\">{t.description}</div>\n ) : null}\n </div>\n <button\n type=\"button\"\n aria-label=\"Close\"\n data-slot=\"toast-close\"\n onClick={() => store.dismiss(t.id)}\n className={TOAST_CLOSE}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M18 6 6 18M6 6l12 12\" />\n </svg>\n </button>\n </li>\n );\n}\n\nexport interface ToasterProps extends React.ComponentProps<\"ol\"> {\n position?: ToastPosition;\n}\n\n/**\n * Renders the live toast stack from the module store. Fixed-positioned per\n * `position` (default `bottom-right`).\n *\n * Stacking mirrors Sonner: toasts pile up collapsed (the front three peeking,\n * each scaled + lifted by depth and clamped to the front toast's height) and\n * spread into a list on hover / keyboard focus — driven by the measured\n * `--front-height`/`--offset` vars and the `data-stack` CSS in `tokens.css`.\n * Each toast auto-dismisses after its `duration` (default 4000ms) via the same\n * animated `dismiss` as the close button (`data-state=\"closed\"` → slide out →\n * unmount on `transitionend`), and is swipe-to-dismiss (horizontal drag, TS-only\n * pointer physics). Single dark palette — no theme switching.\n */\nexport function Toaster({\n position = \"bottom-right\",\n className,\n ...props\n}: ToasterProps) {\n const [toasts, setToasts] = React.useState<Toast[]>([]);\n const [heights, setHeights] = React.useState<Map<number, number>>(new Map());\n const [paused, setPaused] = React.useState(false);\n\n React.useEffect(() => store.subscribe(setToasts), []);\n\n // Pause auto-dismiss while the stack is hovered or keyboard-focused (Sonner\n // does the same). pointerover/out + focusin/out bubble from the toasts, so they\n // fire even though the <ol> itself is pointer-events:none; the contains() guard\n // keeps it paused while moving *within* the stack.\n const onEnter = () => setPaused(true);\n const onLeave = (e: React.PointerEvent | React.FocusEvent) => {\n if (!e.currentTarget.contains(e.relatedTarget as Node | null)) {\n setPaused(false);\n }\n };\n\n const reportHeight = React.useCallback((id: number, h: number) => {\n setHeights((prev) => {\n if (prev.get(id) === h) return prev;\n const next = new Map(prev);\n next.set(id, h);\n return next;\n });\n }, []);\n const removeHeight = React.useCallback((id: number) => {\n setHeights((prev) => {\n if (!prev.has(id)) return prev;\n const next = new Map(prev);\n next.delete(id);\n return next;\n });\n }, []);\n\n const yPosition = position.startsWith(\"top\") ? \"top\" : \"bottom\";\n const ordered = [...toasts].reverse(); // newest first → front of the stack\n // front toast's height; until it's measured fall back to the tallest known one\n // so the back toasts don't clamp to 0 for a frame when a new toast arrives\n const known = [...heights.values()];\n const frontHeight = ordered[0]\n ? (heights.get(ordered[0].id) ?? (known.length ? Math.max(...known) : 0))\n : 0;\n\n // cumulative offset: heights of the toasts in front of this one + index * GAP\n let sum = 0;\n const offsets = ordered.map((t, i) => {\n const o = sum + i * GAP;\n sum += heights.get(t.id) ?? 0;\n return o;\n });\n\n return (\n <ol\n data-slot=\"toaster\"\n // LAYER_IGNORE_ATTR: a toast floats over every overlay without being\n // part of one, and a press on it is no click away from the Dialog below.\n data-dismissable-layer-ignore=\"\"\n data-position={position}\n data-y-position={yPosition}\n data-stack=\"\"\n style={\n {\n \"--front-height\": `${frontHeight}px`,\n \"--gap\": `${GAP}px`,\n } as React.CSSProperties\n }\n className={cn(\n TOASTER_BASE,\n positionClasses[position],\n className,\n )}\n {...props}\n onPointerOver={onEnter}\n onPointerOut={onLeave}\n onFocus={onEnter}\n onBlur={onLeave}\n >\n {ordered.map((t, i) => (\n <ToastItem\n key={t.id}\n toast={t}\n index={i}\n total={ordered.length}\n offset={offsets[i]!}\n paused={paused}\n reportHeight={reportHeight}\n removeHeight={removeHeight}\n />\n ))}\n </ol>\n );\n}\n"],"mappings":";AA6UM,SACE,KADF;AA3UN,YAAY,WAAW;AACvB,SAAS,UAAU;AACnB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAGK;AAgCP,MAAM,mBAAmB;AAKzB,MAAM,kBAAkB;AACxB,MAAM,iBAAiB;AACvB,MAAM,iBAAiB;AASvB,MAAM,QAAS,uBAAM;AACnB,MAAI,SAAkB,CAAC;AACvB,MAAI,KAAK;AACT,QAAM,YAAY,oBAAI,IAA+B;AAErD,QAAM,OAAO,MAAM;AACjB,eAAW,YAAY,UAAW,UAAS,MAAM;AAAA,EACnD;AAEA,QAAM,MAAM,CAAC,SAA0B,OAAqB,CAAC,MAAc;AACzE,UAAM,OAAc;AAAA,MAClB,IAAI,EAAE;AAAA,MACN;AAAA,MACA,aAAa,KAAK;AAAA,MAClB,UAAU,KAAK,YAAY;AAAA,MAC3B,SAAS,KAAK,WAAW;AAAA,MACzB,OAAO;AAAA,IACT;AACA,aAAS,CAAC,GAAG,QAAQ,IAAI;AACzB,SAAK;AACL,WAAO,KAAK;AAAA,EACd;AAOA,QAAM,UAAU,CAAC,YAAoB;AACnC,aAAS,OAAO;AAAA,MAAI,CAAC,MACnB,EAAE,OAAO,UAAU,EAAE,GAAG,GAAG,OAAO,UAAmB,IAAI;AAAA,IAC3D;AACA,SAAK;AAAA,EACP;AAKA,QAAM,SAAS,CAAC,YAAoB;AAClC,aAAS,OAAO,OAAO,CAAC,MAAM,EAAE,OAAO,OAAO;AAC9C,SAAK;AAAA,EACP;AAEA,QAAM,YAAY,CAAC,aAAsD;AACvE,cAAU,IAAI,QAAQ;AACtB,aAAS,MAAM;AACf,WAAO,MAAM;AACX,gBAAU,OAAO,QAAQ;AAAA,IAC3B;AAAA,EACF;AAEA,SAAO,EAAE,KAAK,SAAS,QAAQ,UAAU;AAC3C,GAAG;AAgBI,MAAM,QAAiB,OAAO;AAAA,EACnC,CAAC,SAA0B,SAAwB,MAAM,IAAI,SAAS,IAAI;AAAA,EAC1E;AAAA,IACE,UAAU,CAAC,SAA0B,SACnC,MAAM,IAAI,SAAS,EAAE,GAAG,MAAM,SAAS,WAAW,CAAC;AAAA,IACrD,OAAO,CAAC,SAA0B,SAChC,MAAM,IAAI,SAAS,EAAE,GAAG,MAAM,SAAS,QAAQ,CAAC;AAAA,IAClD,MAAM,CAAC,SAA0B,SAC/B,MAAM,IAAI,SAAS,EAAE,GAAG,MAAM,SAAS,OAAO,CAAC;AAAA,IACjD,MAAM,CAAC,SAA0B,SAC/B,MAAM,IAAI,SAAS,EAAE,GAAG,MAAM,SAAS,OAAO,CAAC;AAAA,IACjD,SAAS,CAAC,OAAe,MAAM,QAAQ,EAAE;AAAA,EAC3C;AACF;AAIA,MAAM,iBAAiB;AACvB,MAAM,MAAM;AAYZ,SAAS,UAAU;AAAA,EACjB,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAmB;AACjB,QAAM,MAAM,MAAM,OAAsB,IAAI;AAC5C,QAAM,CAAC,QAAQ,SAAS,IAAI,MAAM,SAAS,CAAC;AAG5C,QAAM,eAAe,MAAM,OAAO,EAAE,QAAQ;AAC5C,QAAM,aAAa,MAAM,OAAO,CAAC;AACjC,QAAM,WAAW,MAAM;AAAA,IACrB;AAAA,EACF;AACA,QAAM,UAAU,MAAM;AAAA,IACpB;AAAA,EACF;AAKA,QAAM,gBAAgB,MAAM;AAC1B,UAAM,KAAK,IAAI;AACf,QAAI,CAAC,GAAI;AACT,OAAG,MAAM,SAAS;AAClB,UAAM,IAAI,GAAG,sBAAsB,EAAE;AACrC,OAAG,MAAM,SAAS;AAClB,QAAI,GAAG;AACL,gBAAU,CAAC;AACX,mBAAa,EAAE,IAAI,CAAC;AAAA,IACtB;AAAA,EACF,GAAG,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,aAAa,YAAY,CAAC;AAEjD,QAAM,UAAU,MAAM,MAAM,aAAa,EAAE,EAAE,GAAG,CAAC,EAAE,IAAI,YAAY,CAAC;AAOpE,QAAM,iBAAiB,MAAM,OAAO,EAAE,UAAU,SAAS;AACzD,QAAM,UAAU,MAAM;AACpB,QAAI,eAAe,QAAS,OAAM,OAAO,EAAE,EAAE;AAAA,EAC/C,GAAG,CAAC,EAAE,EAAE,CAAC;AAKT,QAAM,UAAU,MAAM;AACpB,QAAI,EAAE,aAAa,YAAY,EAAE,UAAU,aAAa,OAAQ;AAChE,eAAW,UAAU,KAAK,IAAI;AAC9B,UAAM,KAAK,WAAW,MAAM,MAAM,QAAQ,EAAE,EAAE,GAAG,aAAa,OAAO;AACrE,WAAO,MAAM;AACX,mBAAa,EAAE;AACf,mBAAa,UAAU,KAAK;AAAA,QAC1B;AAAA,QACA,aAAa,WAAW,KAAK,IAAI,IAAI,WAAW;AAAA,MAClD;AAAA,IACF;AAAA,EACF,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,CAAC;AAGtC,QAAM;AAAA,IACJ,MAAM,MAAM;AACV,UAAI,SAAS,QAAS,cAAa,SAAS,OAAO;AAAA,IACrD;AAAA,IACA,CAAC;AAAA,EACH;AAKA,QAAM,kBAAkB,CAAC,MAA4C;AACnE,QAAI,EAAE,UAAU,aAAa,EAAE,iBAAiB,aAAa;AAC3D,YAAM,OAAO,EAAE,EAAE;AAAA,IACnB;AAAA,EACF;AAKA,QAAM,gBAAgB,CAAC,MAAyC;AAC9D,UAAM,KAAK,IAAI;AACf,QAAI,CAAC,MAAM,EAAE,SAAS,KAAK,EAAE,UAAU,UAAW;AAClD,QAAK,EAAE,OAAuB,QAAQ,2BAA2B,EAAG;AAEpE,YAAQ,UAAU,EAAE,GAAG,EAAE,SAAS,MAAM,EAAE,WAAW,IAAI,EAAE;AAC3D,OAAG,aAAa,gBAAgB,MAAM;AACtC,QAAI;AACF,SAAG,oBAAoB,EAAE,SAAS;AAAA,IACpC,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,QAAM,gBAAgB,CAAC,MAAyC;AAC9D,UAAM,OAAO,QAAQ;AACrB,UAAM,KAAK,IAAI;AACf,QAAI,CAAC,QAAQ,CAAC,GAAI;AAClB,UAAM,KAAK,EAAE,UAAU,KAAK;AAC5B,SAAK,KAAK;AACV,UAAM,OAAO,GAAG,eAAe;AAC/B,OAAG,MAAM,YAAY,aAAa,GAAG,EAAE,IAAI;AAC3C,OAAG,MAAM,UAAU,GAAG,KAAK,IAAI,GAAG,IAAI,KAAK,IAAI,EAAE,IAAI,IAAI,CAAC;AAAA,EAC5D;AAEA,QAAM,eAAe,CAAC,MAAyC;AAC7D,UAAM,OAAO,QAAQ;AACrB,UAAM,KAAK,IAAI;AACf,QAAI,CAAC,QAAQ,CAAC,GAAI;AAClB,YAAQ,UAAU;AAClB,OAAG,gBAAgB,cAAc;AACjC,UAAM,KAAK,EAAE,YAAY,KAAK;AAC9B,UAAM,WAAW,KAAK,IAAI,KAAK,IAAI,KAAK,EAAE,IAAI,KAAK;AACnD,QACE,KAAK,OAAO,MACX,KAAK,IAAI,KAAK,EAAE,KAAK,mBAAmB,WAAW,iBACpD;AACA,SAAG,MAAM,YAAY,aAAa,GAAG,KAAK,KAAK,IAAI,MAAM,IAAI,GAAG;AAChE,SAAG,MAAM,UAAU;AACnB,YAAM,SAAS,MAAM,MAAM,OAAO,EAAE,EAAE;AACtC,SAAG,iBAAiB,iBAAiB,QAAQ,EAAE,MAAM,KAAK,CAAC;AAC3D,eAAS,UAAU,WAAW,QAAQ,iBAAiB,EAAE;AAAA,IAC3D,OAAO;AAIL,SAAG,MAAM,YAAY,aAAa,KAAK;AACvC,SAAG,MAAM,UAAU;AACnB,SAAG;AAAA,QACD;AAAA,QACA,MAAM;AACJ,aAAG,MAAM,eAAe,WAAW;AACnC,aAAG,MAAM,UAAU;AAAA,QACrB;AAAA,QACA,EAAE,MAAM,KAAK;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,MAAK;AAAA,MACL,aAAU;AAAA,MACV,aAAU;AAAA,MACV,gBAAc,EAAE;AAAA,MAChB,cAAY,EAAE,UAAU,YAAY,WAAW;AAAA,MAC/C,cAAY,UAAU;AAAA,MACtB,gBAAc,QAAQ;AAAA,MACtB;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa;AAAA,MACb,iBAAiB;AAAA,MACjB,OACE;AAAA,QACE,WAAW;AAAA,QACX,aAAa,QAAQ;AAAA,QACrB,YAAY,GAAG,MAAM;AAAA,QACrB,oBAAoB,GAAG,MAAM;AAAA,MAC/B;AAAA,MAEF,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA,oBAAoB,EAAE,OAAO;AAAA,MAC/B;AAAA,MAEA;AAAA,6BAAC,SAAI,WAAW,eACd;AAAA,8BAAC,SAAI,WAAW,aAAc,YAAE,SAAQ;AAAA,UACvC,EAAE,cACD,oBAAC,SAAI,WAAU,yBAAyB,YAAE,aAAY,IACpD;AAAA,WACN;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,cAAW;AAAA,YACX,aAAU;AAAA,YACV,SAAS,MAAM,MAAM,QAAQ,EAAE,EAAE;AAAA,YACjC,WAAW;AAAA,YAEX;AAAA,cAAC;AAAA;AAAA,gBACC,OAAM;AAAA,gBACN,OAAM;AAAA,gBACN,QAAO;AAAA,gBACP,SAAQ;AAAA,gBACR,MAAK;AAAA,gBACL,QAAO;AAAA,gBACP,aAAY;AAAA,gBACZ,eAAc;AAAA,gBACd,gBAAe;AAAA,gBACf,eAAY;AAAA,gBAEZ,8BAAC,UAAK,GAAE,wBAAuB;AAAA;AAAA,YACjC;AAAA;AAAA,QACF;AAAA;AAAA;AAAA,EACF;AAEJ;AAmBO,SAAS,QAAQ;AAAA,EACtB,WAAW;AAAA,EACX;AAAA,EACA,GAAG;AACL,GAAiB;AACf,QAAM,CAAC,QAAQ,SAAS,IAAI,MAAM,SAAkB,CAAC,CAAC;AACtD,QAAM,CAAC,SAAS,UAAU,IAAI,MAAM,SAA8B,oBAAI,IAAI,CAAC;AAC3E,QAAM,CAAC,QAAQ,SAAS,IAAI,MAAM,SAAS,KAAK;AAEhD,QAAM,UAAU,MAAM,MAAM,UAAU,SAAS,GAAG,CAAC,CAAC;AAMpD,QAAM,UAAU,MAAM,UAAU,IAAI;AACpC,QAAM,UAAU,CAAC,MAA6C;AAC5D,QAAI,CAAC,EAAE,cAAc,SAAS,EAAE,aAA4B,GAAG;AAC7D,gBAAU,KAAK;AAAA,IACjB;AAAA,EACF;AAEA,QAAM,eAAe,MAAM,YAAY,CAAC,IAAY,MAAc;AAChE,eAAW,CAAC,SAAS;AACnB,UAAI,KAAK,IAAI,EAAE,MAAM,EAAG,QAAO;AAC/B,YAAM,OAAO,IAAI,IAAI,IAAI;AACzB,WAAK,IAAI,IAAI,CAAC;AACd,aAAO;AAAA,IACT,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AACL,QAAM,eAAe,MAAM,YAAY,CAAC,OAAe;AACrD,eAAW,CAAC,SAAS;AACnB,UAAI,CAAC,KAAK,IAAI,EAAE,EAAG,QAAO;AAC1B,YAAM,OAAO,IAAI,IAAI,IAAI;AACzB,WAAK,OAAO,EAAE;AACd,aAAO;AAAA,IACT,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,QAAM,YAAY,SAAS,WAAW,KAAK,IAAI,QAAQ;AACvD,QAAM,UAAU,CAAC,GAAG,MAAM,EAAE,QAAQ;AAGpC,QAAM,QAAQ,CAAC,GAAG,QAAQ,OAAO,CAAC;AAClC,QAAM,cAAc,QAAQ,CAAC,IACxB,QAAQ,IAAI,QAAQ,CAAC,EAAE,EAAE,MAAM,MAAM,SAAS,KAAK,IAAI,GAAG,KAAK,IAAI,KACpE;AAGJ,MAAI,MAAM;AACV,QAAM,UAAU,QAAQ,IAAI,CAAC,GAAG,MAAM;AACpC,UAAM,IAAI,MAAM,IAAI;AACpB,WAAO,QAAQ,IAAI,EAAE,EAAE,KAAK;AAC5B,WAAO;AAAA,EACT,CAAC;AAED,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MAGV,iCAA8B;AAAA,MAC9B,iBAAe;AAAA,MACf,mBAAiB;AAAA,MACjB,cAAW;AAAA,MACX,OACE;AAAA,QACE,kBAAkB,GAAG,WAAW;AAAA,QAChC,SAAS,GAAG,GAAG;AAAA,MACjB;AAAA,MAEF,WAAW;AAAA,QACT;AAAA,QACA,gBAAgB,QAAQ;AAAA,QACxB;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MACJ,eAAe;AAAA,MACf,cAAc;AAAA,MACd,SAAS;AAAA,MACT,QAAQ;AAAA,MAEP,kBAAQ,IAAI,CAAC,GAAG,MACf;AAAA,QAAC;AAAA;AAAA,UAEC,OAAO;AAAA,UACP,OAAO;AAAA,UACP,OAAO,QAAQ;AAAA,UACf,QAAQ,QAAQ,CAAC;AAAA,UACjB;AAAA,UACA;AAAA,UACA;AAAA;AAAA,QAPK,EAAE;AAAA,MAQT,CACD;AAAA;AAAA,EACH;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../src/components/atomic/sonner.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\nimport {\n TOAST_BASE,\n TOAST_CLOSE,\n TOAST_CONTENT,\n TOAST_TITLE,\n TOASTER_BASE,\n positionClasses,\n type ToastPosition,\n TOAST_DURATION_MS,\n TOAST_GAP,\n TOAST_VISIBLE,\n} from \"../../generated/sonner\";\nimport * as copy from \"../../generated/copy\";\nimport { iconShapes } from \"../../icons/icon-shapes\";\nimport { toneClasses, type Tone } from \"../../generated/tone\";\n\nexport type { ToastPosition };\n\n/**\n * Lifecycle phase of a toast. It is added `\"open\"` (plays the enter keyframe);\n * {@link ToastFn.dismiss} flips it to `\"closing\"` (slides it out) and the live\n * node is dropped once the exit `transitionend` fires. Mirrors Rust's\n * `ToastState` enum and the `data-state` the shared `tokens.css` keys on.\n */\nexport type ToastState = \"open\" | \"closing\";\n\nexport interface ToastOptions {\n description?: React.ReactNode;\n /**\n * Auto-dismiss delay in ms (default 4000). Pass `Infinity` for a **persistent**\n * toast that never times out — it stays until the close button, a swipe, or\n * `toast.dismiss(id)` removes it. Hovering the stack also pauses the countdown.\n */\n duration?: number;\n tone?: Tone;\n}\n\nexport interface Toast {\n id: number;\n message: React.ReactNode;\n description?: React.ReactNode;\n duration: number;\n tone: Tone;\n state: ToastState;\n}\n\n\n// Swipe-to-dismiss tuning (pointer physics, TS-only — Rust stays render-only).\n// Values from Sonner: a horizontal drag past 45px, or a flick faster than\n// 0.11px/ms, flings the toast off; anything short snaps back.\nconst SWIPE_THRESHOLD = 45;\nconst SWIPE_VELOCITY = 0.11;\nconst SWIPE_FLING_MS = 200;\n\n/**\n * Module-level toast store: a plain observable holding the live toast array.\n * `toast(...)` mutates it and notifies subscribers; the {@link Toaster}\n * component is the sole subscriber. This is the JS-native global the Rust\n * mirror cannot have — Dioxus has no clean cross-component mutable singleton,\n * so it uses a `ToasterProvider` + `use_toaster()` hook instead.\n */\nconst store = (() => {\n let toasts: Toast[] = [];\n let id = 0;\n const listeners = new Set<(toasts: Toast[]) => void>();\n\n const emit = () => {\n for (const listener of listeners) listener(toasts);\n };\n\n const add = (message: React.ReactNode, opts: ToastOptions = {}): number => {\n const next: Toast = {\n id: ++id,\n message,\n description: opts.description,\n duration: opts.duration ?? TOAST_DURATION_MS,\n tone: opts.tone ?? \"neutral\",\n state: \"open\",\n };\n toasts = [...toasts, next];\n emit();\n return next.id;\n };\n\n // Begins the exit animation: flip the toast to `closing` (`data-state=closed`)\n // and keep it mounted so the exit keyframe can play. The live node is dropped\n // by `remove`, wired to the exit `transitionend` — no timer matched to the CSS.\n // A toast dismissed before it has ever painted mounts closed and so never\n // transitions; `ToastItem` drops that one on mount instead.\n const dismiss = (toastId: number) => {\n toasts = toasts.map((t) =>\n t.id === toastId ? { ...t, state: \"closing\" as const } : t,\n );\n emit();\n };\n\n // Drops a toast outright. Wired to the exit `transitionend`; the guard that it\n // is actually `closing` (a restack transition fires too) lives at the call\n // site in {@link ToastItem}, alongside the mount-closed path.\n const remove = (toastId: number) => {\n toasts = toasts.filter((t) => t.id !== toastId);\n emit();\n };\n\n const subscribe = (listener: (toasts: Toast[]) => void): (() => void) => {\n listeners.add(listener);\n listener(toasts);\n return () => {\n listeners.delete(listener);\n };\n };\n\n return { add, dismiss, remove, subscribe };\n})();\n\nexport interface ToastFn {\n (message: React.ReactNode, opts?: ToastOptions): number;\n positive: (message: React.ReactNode, opts?: ToastOptions) => number;\n error: (message: React.ReactNode, opts?: ToastOptions) => number;\n info: (message: React.ReactNode, opts?: ToastOptions) => number;\n warn: (message: React.ReactNode, opts?: ToastOptions) => number;\n dismiss: (id: number) => void;\n}\n\n/**\n * Global toast handle. `toast(msg)` enqueues a neutral toast; the `.positive`,\n * `.error`, `.info` and `.warn` helpers pin the tone; `toast.dismiss(id)`\n * removes one early. Mirrors Rust's `use_toaster()` handle methods.\n */\nexport const toast: ToastFn = Object.assign(\n (message: React.ReactNode, opts?: ToastOptions) => store.add(message, opts),\n {\n positive: (message: React.ReactNode, opts?: ToastOptions) =>\n store.add(message, { ...opts, tone: \"positive\" }),\n error: (message: React.ReactNode, opts?: ToastOptions) =>\n store.add(message, { ...opts, tone: \"error\" }),\n info: (message: React.ReactNode, opts?: ToastOptions) =>\n store.add(message, { ...opts, tone: \"info\" }),\n warn: (message: React.ReactNode, opts?: ToastOptions) =>\n store.add(message, { ...opts, tone: \"warn\" }),\n dismiss: (id: number) => store.dismiss(id),\n },\n);\n\n\ninterface ToastItemProps {\n toast: Toast;\n index: number; // 0 = front / newest\n total: number;\n offset: number; // px from the pinned edge to this toast's expanded slot\n paused: boolean; // the stack is hovered/focused — hold the auto-dismiss\n reportHeight: (id: number, height: number) => void;\n removeHeight: (id: number) => void;\n}\n\nfunction ToastItem({\n toast: t,\n index,\n total,\n offset,\n paused,\n reportHeight,\n removeHeight,\n}: ToastItemProps) {\n const ref = React.useRef<HTMLLIElement>(null);\n const [height, setHeight] = React.useState(0);\n // remaining auto-dismiss budget (banked across hover pauses), the last start\n // timestamp, and the swipe-fling fallback timer.\n const remainingRef = React.useRef(t.duration);\n const startedRef = React.useRef(0);\n const flingRef = React.useRef<ReturnType<typeof setTimeout> | undefined>(\n undefined,\n );\n const dragRef = React.useRef<{ x: number; time: number; dx: number } | null>(\n null,\n );\n\n // measure the *natural* height for the stack maths; re-measure on content\n // change. Back toasts are clamped to --front-height by the CSS, so unset the\n // height for the read (Sonner does the same) then hand it back to the CSS.\n React.useLayoutEffect(() => {\n const el = ref.current;\n if (!el) return;\n el.style.height = \"auto\";\n const h = el.getBoundingClientRect().height;\n el.style.height = \"\";\n if (h) {\n setHeight(h);\n reportHeight(t.id, h);\n }\n }, [t.id, t.message, t.description, reportHeight]);\n\n React.useEffect(() => () => removeHeight(t.id), [t.id, removeHeight]);\n\n // Dismissed before its first paint (added and dismissed in one batch), so it\n // mounts already `closing`: its computed style never changes, no transition\n // runs, and `onTransitionEnd` below would never fire — stranding it in the\n // store forever. Nothing was painted, so there is nothing to animate: drop it\n // once mounted. Mirrors the Dioxus port's mount effect.\n const mountedClosing = React.useRef(t.state === \"closing\");\n React.useEffect(() => {\n if (mountedClosing.current) store.remove(t.id);\n }, [t.id]);\n\n // Auto-dismiss, pausable on hover. While `paused` (or closing, or a persistent\n // `duration: Infinity`) no timer runs; the cleanup banks the elapsed time so a\n // resume continues from the remaining budget rather than restarting.\n React.useEffect(() => {\n if (t.duration === Infinity || t.state === \"closing\" || paused) return;\n startedRef.current = Date.now();\n const id = setTimeout(() => store.dismiss(t.id), remainingRef.current);\n return () => {\n clearTimeout(id);\n remainingRef.current = Math.max(\n 0,\n remainingRef.current - (Date.now() - startedRef.current),\n );\n };\n }, [paused, t.id, t.duration, t.state]);\n\n // cancel the swipe-fling fallback if the toast unmounts first\n React.useEffect(\n () => () => {\n if (flingRef.current) clearTimeout(flingRef.current);\n },\n [],\n );\n\n // exit rides the transition: a closing toast slides back off and is dropped on\n // the transform's `transitionend` (guarded so stack repositioning never fires\n // it). No host timer — keeps parity with the Dioxus port.\n const onTransitionEnd = (e: React.TransitionEvent<HTMLLIElement>) => {\n if (t.state === \"closing\" && e.propertyName === \"transform\") {\n store.remove(t.id);\n }\n };\n\n // ── swipe-to-dismiss (horizontal pointer drag) ──────────────────────────\n // Tracked through the `--swipe-x` var so it *composes* with the stack\n // transform (`var(--y) translateX(var(--swipe-x))`) instead of overriding it.\n const onPointerDown = (e: React.PointerEvent<HTMLLIElement>) => {\n const el = ref.current;\n if (!el || e.button > 0 || t.state === \"closing\") return;\n if ((e.target as HTMLElement).closest('[data-slot=\"toast-close\"]')) return;\n // auto-dismiss is already paused (a swipe means the pointer is over the stack)\n dragRef.current = { x: e.clientX, time: e.timeStamp, dx: 0 };\n el.setAttribute(\"data-swiping\", \"true\"); // CSS drops the transition for 1:1 tracking\n try {\n el.setPointerCapture?.(e.pointerId);\n } catch {\n // jsdom / unsupported — capture is a nice-to-have, the drag works without it\n }\n };\n\n const onPointerMove = (e: React.PointerEvent<HTMLLIElement>) => {\n const drag = dragRef.current;\n const el = ref.current;\n if (!drag || !el) return;\n const dx = e.clientX - drag.x;\n drag.dx = dx;\n const dist = el.offsetWidth || 256;\n el.style.setProperty(\"--swipe-x\", `${dx}px`);\n el.style.opacity = `${Math.max(0, 1 - Math.abs(dx) / dist)}`;\n };\n\n const onPointerEnd = (e: React.PointerEvent<HTMLLIElement>) => {\n const drag = dragRef.current;\n const el = ref.current;\n if (!drag || !el) return;\n dragRef.current = null;\n el.removeAttribute(\"data-swiping\"); // CSS restores the transition\n const dt = e.timeStamp - drag.time;\n const velocity = dt > 0 ? Math.abs(drag.dx) / dt : 0;\n if (\n drag.dx !== 0 &&\n (Math.abs(drag.dx) >= SWIPE_THRESHOLD || velocity > SWIPE_VELOCITY)\n ) {\n el.style.setProperty(\"--swipe-x\", `${drag.dx > 0 ? 150 : -150}%`);\n el.style.opacity = \"0\";\n const remove = () => store.remove(t.id);\n el.addEventListener(\"transitionend\", remove, { once: true });\n flingRef.current = setTimeout(remove, SWIPE_FLING_MS + 50); // fallback if transitionend is missed\n } else {\n // snap back: clear the swipe offset (the transition carries it home), then\n // hand styling back to the CSS. Auto-dismiss stays paused while hovered and\n // re-arms from the remaining budget once the pointer leaves.\n el.style.setProperty(\"--swipe-x\", \"0px\");\n el.style.opacity = \"1\";\n el.addEventListener(\n \"transitionend\",\n () => {\n el.style.removeProperty(\"--swipe-x\");\n el.style.opacity = \"\";\n },\n { once: true },\n );\n }\n };\n\n return (\n <li\n ref={ref}\n role=\"status\"\n aria-live=\"polite\"\n data-slot=\"toast\"\n data-tone={t.tone}\n data-state={t.state === \"closing\" ? \"closed\" : \"open\"}\n data-front={index === 0}\n data-visible={index < TOAST_VISIBLE}\n onTransitionEnd={onTransitionEnd}\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={onPointerEnd}\n onPointerCancel={onPointerEnd}\n style={\n {\n \"--index\": index,\n \"--z-index\": total - index,\n \"--offset\": `${offset}px`,\n \"--initial-height\": `${height}px`,\n } as React.CSSProperties\n }\n className={cn(\n TOAST_BASE,\n toneClasses[t.tone],\n \"touch-pan-y select-none\",\n )}\n >\n <div className={TOAST_CONTENT}>\n <div className={TOAST_TITLE}>{t.message}</div>\n {t.description ? (\n <div className=\"text-ink-soft text-sm\">{t.description}</div>\n ) : null}\n </div>\n <button\n type=\"button\"\n aria-label={copy.CLOSE}\n data-slot=\"toast-close\"\n onClick={() => store.dismiss(t.id)}\n className={TOAST_CLOSE}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n {iconShapes(\"x\")}\n </svg>\n </button>\n </li>\n );\n}\n\nexport interface ToasterProps extends React.ComponentProps<\"ol\"> {\n position?: ToastPosition;\n}\n\n/**\n * Renders the live toast stack from the module store. Fixed-positioned per\n * `position` (default `bottom-right`).\n *\n * Stacking mirrors Sonner: toasts pile up collapsed (the front three peeking,\n * each scaled + lifted by depth and clamped to the front toast's height) and\n * spread into a list on hover / keyboard focus — driven by the measured\n * `--front-height`/`--offset` vars and the `data-stack` CSS in `tokens.css`.\n * Each toast auto-dismisses after its `duration` (default 4000ms) via the same\n * animated `dismiss` as the close button (`data-state=\"closed\"` → slide out →\n * unmount on `transitionend`), and is swipe-to-dismiss (horizontal drag, TS-only\n * pointer physics). Single dark palette — no theme switching.\n */\nexport function Toaster({\n position = \"bottom-right\",\n className,\n ...props\n}: ToasterProps) {\n const [toasts, setToasts] = React.useState<Toast[]>([]);\n const [heights, setHeights] = React.useState<Map<number, number>>(new Map());\n const [paused, setPaused] = React.useState(false);\n\n React.useEffect(() => store.subscribe(setToasts), []);\n\n // Pause auto-dismiss while the stack is hovered or keyboard-focused (Sonner\n // does the same). pointerover/out + focusin/out bubble from the toasts, so they\n // fire even though the <ol> itself is pointer-events:none; the contains() guard\n // keeps it paused while moving *within* the stack.\n const onEnter = () => setPaused(true);\n const onLeave = (e: React.PointerEvent | React.FocusEvent) => {\n if (!e.currentTarget.contains(e.relatedTarget as Node | null)) {\n setPaused(false);\n }\n };\n\n const reportHeight = React.useCallback((id: number, h: number) => {\n setHeights((prev) => {\n if (prev.get(id) === h) return prev;\n const next = new Map(prev);\n next.set(id, h);\n return next;\n });\n }, []);\n const removeHeight = React.useCallback((id: number) => {\n setHeights((prev) => {\n if (!prev.has(id)) return prev;\n const next = new Map(prev);\n next.delete(id);\n return next;\n });\n }, []);\n\n const yPosition = position.startsWith(\"top\") ? \"top\" : \"bottom\";\n const ordered = [...toasts].reverse(); // newest first → front of the stack\n // front toast's height; until it's measured fall back to the tallest known one\n // so the back toasts don't clamp to 0 for a frame when a new toast arrives\n const known = [...heights.values()];\n const frontHeight = ordered[0]\n ? (heights.get(ordered[0].id) ?? (known.length ? Math.max(...known) : 0))\n : 0;\n\n // cumulative offset: heights of the toasts in front of this one + index * TOAST_GAP\n let sum = 0;\n const offsets = ordered.map((t, i) => {\n const o = sum + i * TOAST_GAP;\n sum += heights.get(t.id) ?? 0;\n return o;\n });\n\n return (\n <ol\n data-slot=\"toaster\"\n // LAYER_IGNORE_ATTR: a toast floats over every overlay without being\n // part of one, and a press on it is no click away from the Dialog below.\n data-dismissable-layer-ignore=\"\"\n data-position={position}\n data-y-position={yPosition}\n data-stack=\"\"\n style={\n {\n \"--front-height\": `${frontHeight}px`,\n \"--gap\": `${TOAST_GAP}px`,\n } as React.CSSProperties\n }\n className={cn(\n TOASTER_BASE,\n positionClasses[position],\n className,\n )}\n {...props}\n onPointerOver={onEnter}\n onPointerOut={onLeave}\n onFocus={onEnter}\n onBlur={onLeave}\n >\n {ordered.map((t, i) => (\n <ToastItem\n key={t.id}\n toast={t}\n index={i}\n total={ordered.length}\n offset={offsets[i]!}\n paused={paused}\n reportHeight={reportHeight}\n removeHeight={removeHeight}\n />\n ))}\n </ol>\n );\n}\n"],"mappings":"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","names":[]}
@@ -1,19 +1,22 @@
1
1
  import { jsx } from "react/jsx-runtime";
2
2
  import * as React from "react";
3
3
  import { cn } from "../../lib/cn.js";
4
+ import * as copy from "../../generated/copy.js";
5
+ import { SPINNER } from "../../generated/spinner.js";
6
+ import { iconShapes } from "../../icons/icon-shapes.js";
4
7
  function Spinner({ className, ...props }) {
5
8
  return /* @__PURE__ */ jsx(
6
9
  "svg",
7
10
  {
8
11
  role: "status",
9
- "aria-label": "Loading",
10
- className: cn("size-4 animate-spin", className),
12
+ "aria-label": copy.LOADING,
13
+ className: cn(SPINNER, className),
11
14
  viewBox: "0 0 24 24",
12
15
  fill: "none",
13
16
  stroke: "currentColor",
14
17
  strokeWidth: 2,
15
18
  ...props,
16
- children: /* @__PURE__ */ jsx("path", { d: "M21 12a9 9 0 1 1-6.219-8.56" })
19
+ children: iconShapes("spinner")
17
20
  }
18
21
  );
19
22
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/atomic/spinner.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\n\nexport function Spinner({ className, ...props }: React.ComponentProps<\"svg\">) {\n return (\n <svg\n role=\"status\"\n aria-label=\"Loading\"\n className={cn(\"size-4 animate-spin\", className)}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n {...props}\n >\n <path d=\"M21 12a9 9 0 1 1-6.219-8.56\" />\n </svg>\n );\n}\n"],"mappings":"AAeM;AAfN,YAAY,WAAW;AACvB,SAAS,UAAU;AAEZ,SAAS,QAAQ,EAAE,WAAW,GAAG,MAAM,GAAgC;AAC5E,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,cAAW;AAAA,MACX,WAAW,GAAG,uBAAuB,SAAS;AAAA,MAC9C,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,QAAO;AAAA,MACP,aAAa;AAAA,MACZ,GAAG;AAAA,MAEJ,8BAAC,UAAK,GAAE,+BAA8B;AAAA;AAAA,EACxC;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../src/components/atomic/spinner.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\nimport * as copy from \"../../generated/copy\";\nimport { SPINNER } from \"../../generated/spinner\";\nimport { iconShapes } from \"../../icons/icon-shapes\";\n\nexport function Spinner({ className, ...props }: React.ComponentProps<\"svg\">) {\n return (\n <svg\n role=\"status\"\n aria-label={copy.LOADING}\n className={cn(SPINNER, className)}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n {...props}\n >\n {iconShapes(\"spinner\")}\n </svg>\n );\n}\n"],"mappings":"AAQI;AARJ,YAAY,WAAW;AACvB,SAAS,UAAU;AACnB,YAAY,UAAU;AACtB,SAAS,eAAe;AACxB,SAAS,kBAAkB;AAEpB,SAAS,QAAQ,EAAE,WAAW,GAAG,MAAM,GAAgC;AAC5E,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,cAAY,KAAK;AAAA,MACjB,WAAW,GAAG,SAAS,SAAS;AAAA,MAChC,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,QAAO;AAAA,MACP,aAAa;AAAA,MACZ,GAAG;AAAA,MAEH,qBAAW,SAAS;AAAA;AAAA,EACvB;AAEJ;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/atomic/tabs.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\nimport { useControllableState } from \"../../primitives/use-controllable-state\";\nimport { useRovingFocus } from \"../../primitives/use-roving-focus\";\nimport { TABS_ROOT, TABS_LIST, TABS_TRIGGER, TABS_CONTENT } from \"../../generated/tabs\";\n\ntype TabsOrientation = \"horizontal\" | \"vertical\";\n\ninterface TabsContextValue {\n value: string;\n setValue: (next: string) => void;\n orientation: TabsOrientation;\n}\n\nconst TabsContext = React.createContext<TabsContextValue | null>(null);\n\nfunction useTabs(): TabsContextValue {\n const ctx = React.useContext(TabsContext);\n if (!ctx) throw new Error(\"Tabs parts must be used within <Tabs>\");\n return ctx;\n}\n\nexport interface TabsProps\n extends Omit<React.ComponentProps<\"div\">, \"onChange\"> {\n value?: string;\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n orientation?: TabsOrientation;\n}\n\nexport function Tabs({\n className,\n value,\n defaultValue = \"\",\n onValueChange,\n orientation = \"horizontal\",\n children,\n ...props\n}: TabsProps) {\n const [active, setValue] = useControllableState<string>({\n ...(value !== undefined ? { value } : {}),\n defaultValue,\n ...(onValueChange ? { onChange: onValueChange } : {}),\n });\n return (\n <TabsContext.Provider value={{ value: active, setValue, orientation }}>\n <div\n data-slot=\"tabs\"\n data-orientation={orientation}\n className={cn(TABS_ROOT, className)}\n {...props}\n >\n {children}\n </div>\n </TabsContext.Provider>\n );\n}\n\nexport function TabsList({\n className,\n children,\n onKeyDown,\n ...props\n}: React.ComponentProps<\"div\">) {\n const { orientation } = useTabs();\n const items = React.Children.toArray(children);\n const { activeIndex, setActiveIndex, onKeyDown: rovingKeyDown } =\n useRovingFocus({\n count: items.length,\n orientation: orientation === \"vertical\" ? \"vertical\" : \"horizontal\",\n });\n return (\n <div\n role=\"tablist\"\n data-slot=\"tabs-list\"\n aria-orientation={orientation}\n className={cn(TABS_LIST, className)}\n onKeyDown={(e) => {\n onKeyDown?.(e);\n rovingKeyDown(e);\n }}\n {...props}\n >\n {items.map((child, index) =>\n React.isValidElement(child)\n ? React.cloneElement(child as React.ReactElement<TabsTriggerInternal>, {\n __index: index,\n __isFocusItem: index === activeIndex,\n __onFocusItem: () => setActiveIndex(index),\n })\n : child,\n )}\n </div>\n );\n}\n\ninterface TabsTriggerInternal {\n __index?: number;\n __isFocusItem?: boolean;\n __onFocusItem?: () => void;\n}\n\nexport interface TabsTriggerProps\n extends React.ComponentProps<\"button\">,\n TabsTriggerInternal {\n value: string;\n}\n\nexport function TabsTrigger({\n className,\n value,\n onClick,\n onFocus,\n __isFocusItem,\n __onFocusItem,\n ...props\n}: TabsTriggerProps) {\n const { value: active, setValue } = useTabs();\n const selected = active === value;\n return (\n <button\n type=\"button\"\n role=\"tab\"\n data-slot=\"tabs-trigger\"\n data-state={selected ? \"active\" : \"inactive\"}\n aria-selected={selected}\n tabIndex={__isFocusItem ? 0 : -1}\n className={cn(TABS_TRIGGER, className)}\n onClick={(e) => {\n onClick?.(e);\n __onFocusItem?.();\n setValue(value);\n }}\n onFocus={(e) => {\n onFocus?.(e);\n __onFocusItem?.();\n }}\n {...props}\n />\n );\n}\n\nexport interface TabsContentProps extends React.ComponentProps<\"div\"> {\n value: string;\n}\n\nexport function TabsContent({\n className,\n value,\n children,\n ...props\n}: TabsContentProps) {\n const { value: active } = useTabs();\n if (active !== value) return null;\n return (\n <div\n role=\"tabpanel\"\n data-slot=\"tabs-content\"\n data-state=\"active\"\n className={cn(TABS_CONTENT, className)}\n {...props}\n >\n {children}\n </div>\n );\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/components/atomic/tabs.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\nimport { useControllableState } from \"../../primitives/use-controllable-state\";\nimport { useRovingFocus } from \"../../primitives/use-roving-focus\";\nimport { TABS_ROOT, TABS_LIST, TABS_TRIGGER, TABS_CONTENT } from \"../../generated/tabs\";\nimport type { Orientation } from \"../../generated/orientation\";\n\n\ninterface TabsContextValue {\n value: string;\n setValue: (next: string) => void;\n orientation: Orientation;\n}\n\nconst TabsContext = React.createContext<TabsContextValue | null>(null);\n\nfunction useTabs(): TabsContextValue {\n const ctx = React.useContext(TabsContext);\n if (!ctx) throw new Error(\"Tabs parts must be used within <Tabs>\");\n return ctx;\n}\n\nexport interface TabsProps\n extends Omit<React.ComponentProps<\"div\">, \"onChange\"> {\n value?: string;\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n orientation?: Orientation;\n}\n\nexport function Tabs({\n className,\n value,\n defaultValue = \"\",\n onValueChange,\n orientation = \"horizontal\",\n children,\n ...props\n}: TabsProps) {\n const [active, setValue] = useControllableState<string>({\n ...(value !== undefined ? { value } : {}),\n defaultValue,\n ...(onValueChange ? { onChange: onValueChange } : {}),\n });\n return (\n <TabsContext.Provider value={{ value: active, setValue, orientation }}>\n <div\n data-slot=\"tabs\"\n data-orientation={orientation}\n className={cn(TABS_ROOT, className)}\n {...props}\n >\n {children}\n </div>\n </TabsContext.Provider>\n );\n}\n\nexport function TabsList({\n className,\n children,\n onKeyDown,\n ...props\n}: React.ComponentProps<\"div\">) {\n const { orientation } = useTabs();\n const items = React.Children.toArray(children);\n const { activeIndex, setActiveIndex, onKeyDown: rovingKeyDown } =\n useRovingFocus({\n count: items.length,\n orientation: orientation === \"vertical\" ? \"vertical\" : \"horizontal\",\n });\n return (\n <div\n role=\"tablist\"\n data-slot=\"tabs-list\"\n aria-orientation={orientation}\n className={cn(TABS_LIST, className)}\n onKeyDown={(e) => {\n onKeyDown?.(e);\n rovingKeyDown(e);\n }}\n {...props}\n >\n {items.map((child, index) =>\n React.isValidElement(child)\n ? React.cloneElement(child as React.ReactElement<TabsTriggerInternal>, {\n __index: index,\n __isFocusItem: index === activeIndex,\n __onFocusItem: () => setActiveIndex(index),\n })\n : child,\n )}\n </div>\n );\n}\n\ninterface TabsTriggerInternal {\n __index?: number;\n __isFocusItem?: boolean;\n __onFocusItem?: () => void;\n}\n\nexport interface TabsTriggerProps\n extends React.ComponentProps<\"button\">,\n TabsTriggerInternal {\n value: string;\n}\n\nexport function TabsTrigger({\n className,\n value,\n onClick,\n onFocus,\n __isFocusItem,\n __onFocusItem,\n ...props\n}: TabsTriggerProps) {\n const { value: active, setValue } = useTabs();\n const selected = active === value;\n return (\n <button\n type=\"button\"\n role=\"tab\"\n data-slot=\"tabs-trigger\"\n data-state={selected ? \"active\" : \"inactive\"}\n aria-selected={selected}\n tabIndex={__isFocusItem ? 0 : -1}\n className={cn(TABS_TRIGGER, className)}\n onClick={(e) => {\n onClick?.(e);\n __onFocusItem?.();\n setValue(value);\n }}\n onFocus={(e) => {\n onFocus?.(e);\n __onFocusItem?.();\n }}\n {...props}\n />\n );\n}\n\nexport interface TabsContentProps extends React.ComponentProps<\"div\"> {\n value: string;\n}\n\nexport function TabsContent({\n className,\n value,\n children,\n ...props\n}: TabsContentProps) {\n const { value: active } = useTabs();\n if (active !== value) return null;\n return (\n <div\n role=\"tabpanel\"\n data-slot=\"tabs-content\"\n data-state=\"active\"\n className={cn(TABS_CONTENT, className)}\n {...props}\n >\n {children}\n </div>\n );\n}\n"],"mappings":"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","names":[]}
@@ -52,7 +52,7 @@ function ToggleGroup({
52
52
  "data-variant": variant,
53
53
  "data-size": size,
54
54
  className: cn(
55
- "group/toggle-group flex w-fit items-center rounded-md data-[variant=outline]:shadow-xs",
55
+ "group/toggle-group flex w-fit items-center rounded-control data-[variant=outline]:shadow-xs",
56
56
  className
57
57
  ),
58
58
  ...props,
@@ -86,7 +86,7 @@ function ToggleGroupItem({
86
86
  toggleVariants({ variant: resolvedVariant, size: resolvedSize }),
87
87
  // `flex-auto`, not shadcn's `flex-1`: the group is `w-fit`, and basis-0 items
88
88
  // make Chrome split it into equal columns, so a longer label overflows its cell.
89
- "min-w-0 flex-auto shrink-0 rounded-none shadow-none first:rounded-l-md last:rounded-r-md focus:z-10 focus-visible:z-10 data-[variant=outline]:-ml-px data-[variant=outline]:first:ml-0 data-[state=on]:z-10",
89
+ "min-w-0 flex-auto shrink-0 rounded-none shadow-none first:rounded-l-control last:rounded-r-control focus:z-10 focus-visible:z-10 data-[variant=outline]:-ml-px data-[variant=outline]:first:ml-0 data-[state=on]:z-10",
90
90
  className
91
91
  ),
92
92
  onClick: (e) => {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/atomic/toggle-group.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\nimport { useControllableState } from \"../../primitives/use-controllable-state\";\nimport {\n toggleVariants,\n type ToggleVariant,\n type ToggleSize,\n} from \"./toggle\";\n\ntype ToggleGroupContextValue = {\n variant: ToggleVariant;\n size: ToggleSize;\n value: string[];\n toggle: (itemValue: string) => void;\n};\n\nconst ToggleGroupContext = React.createContext<ToggleGroupContextValue>({\n variant: \"bare\",\n size: \"md\",\n value: [],\n toggle: () => {},\n});\n\nexport interface ToggleGroupProps\n extends Omit<React.ComponentProps<\"div\">, \"onChange\"> {\n variant?: ToggleVariant;\n size?: ToggleSize;\n type?: \"single\" | \"multiple\";\n value?: string | string[];\n defaultValue?: string | string[];\n onValueChange?: (value: string | string[]) => void;\n}\n\nfunction toArray(v: string | string[] | undefined): string[] {\n if (v === undefined) return [];\n return Array.isArray(v) ? v : v === \"\" ? [] : [v];\n}\n\nexport function ToggleGroup({\n className,\n variant = \"bare\",\n size = \"md\",\n type = \"single\",\n value,\n defaultValue,\n onValueChange,\n children,\n ...props\n}: ToggleGroupProps) {\n const [selected, setSelected] = useControllableState<string[]>({\n ...(value !== undefined ? { value: toArray(value) } : {}),\n defaultValue: toArray(defaultValue),\n onChange: (next) =>\n onValueChange?.(type === \"single\" ? (next[0] ?? \"\") : next),\n });\n\n const toggle = React.useCallback(\n (itemValue: string) => {\n if (type === \"single\") {\n setSelected(selected.includes(itemValue) ? [] : [itemValue]);\n } else {\n setSelected(\n selected.includes(itemValue)\n ? selected.filter((v) => v !== itemValue)\n : [...selected, itemValue],\n );\n }\n },\n [type, selected, setSelected],\n );\n\n return (\n <div\n data-slot=\"toggle-group\"\n data-variant={variant}\n data-size={size}\n className={cn(\n \"group/toggle-group flex w-fit items-center rounded-md data-[variant=outline]:shadow-xs\",\n className,\n )}\n {...props}\n >\n <ToggleGroupContext.Provider value={{ variant, size, value: selected, toggle }}>\n {children}\n </ToggleGroupContext.Provider>\n </div>\n );\n}\n\nexport interface ToggleGroupItemProps\n extends Omit<React.ComponentProps<\"button\">, \"value\" | \"onChange\"> {\n value: string;\n variant?: ToggleVariant;\n size?: ToggleSize;\n}\n\nexport function ToggleGroupItem({\n className,\n children,\n value,\n variant,\n size,\n onClick,\n ...props\n}: ToggleGroupItemProps) {\n const context = React.useContext(ToggleGroupContext);\n const resolvedVariant = context.variant || variant || \"bare\";\n const resolvedSize = context.size || size || \"md\";\n const on = context.value.includes(value);\n\n return (\n <button\n type=\"button\"\n data-slot=\"toggle-group-item\"\n data-variant={resolvedVariant}\n data-size={resolvedSize}\n data-state={on ? \"on\" : \"off\"}\n aria-pressed={on}\n className={cn(\n toggleVariants({ variant: resolvedVariant, size: resolvedSize }),\n // `flex-auto`, not shadcn's `flex-1`: the group is `w-fit`, and basis-0 items\n // make Chrome split it into equal columns, so a longer label overflows its cell.\n \"min-w-0 flex-auto shrink-0 rounded-none shadow-none first:rounded-l-md last:rounded-r-md focus:z-10 focus-visible:z-10 data-[variant=outline]:-ml-px data-[variant=outline]:first:ml-0 data-[state=on]:z-10\",\n className,\n )}\n onClick={(e) => {\n onClick?.(e);\n context.toggle(value);\n }}\n {...props}\n >\n {children}\n </button>\n );\n}\n"],"mappings":";AAoFM;AAlFN,YAAY,WAAW;AACvB,SAAS,UAAU;AACnB,SAAS,4BAA4B;AACrC;AAAA,EACE;AAAA,OAGK;AASP,MAAM,qBAAqB,MAAM,cAAuC;AAAA,EACtE,SAAS;AAAA,EACT,MAAM;AAAA,EACN,OAAO,CAAC;AAAA,EACR,QAAQ,MAAM;AAAA,EAAC;AACjB,CAAC;AAYD,SAAS,QAAQ,GAA4C;AAC3D,MAAI,MAAM,OAAW,QAAO,CAAC;AAC7B,SAAO,MAAM,QAAQ,CAAC,IAAI,IAAI,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;AAClD;AAEO,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA,UAAU;AAAA,EACV,OAAO;AAAA,EACP,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAqB;AACnB,QAAM,CAAC,UAAU,WAAW,IAAI,qBAA+B;AAAA,IAC7D,GAAI,UAAU,SAAY,EAAE,OAAO,QAAQ,KAAK,EAAE,IAAI,CAAC;AAAA,IACvD,cAAc,QAAQ,YAAY;AAAA,IAClC,UAAU,CAAC,SACT,gBAAgB,SAAS,WAAY,KAAK,CAAC,KAAK,KAAM,IAAI;AAAA,EAC9D,CAAC;AAED,QAAM,SAAS,MAAM;AAAA,IACnB,CAAC,cAAsB;AACrB,UAAI,SAAS,UAAU;AACrB,oBAAY,SAAS,SAAS,SAAS,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;AAAA,MAC7D,OAAO;AACL;AAAA,UACE,SAAS,SAAS,SAAS,IACvB,SAAS,OAAO,CAAC,MAAM,MAAM,SAAS,IACtC,CAAC,GAAG,UAAU,SAAS;AAAA,QAC7B;AAAA,MACF;AAAA,IACF;AAAA,IACA,CAAC,MAAM,UAAU,WAAW;AAAA,EAC9B;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,gBAAc;AAAA,MACd,aAAW;AAAA,MACX,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAEJ,8BAAC,mBAAmB,UAAnB,EAA4B,OAAO,EAAE,SAAS,MAAM,OAAO,UAAU,OAAO,GAC1E,UACH;AAAA;AAAA,EACF;AAEJ;AASO,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAyB;AACvB,QAAM,UAAU,MAAM,WAAW,kBAAkB;AACnD,QAAM,kBAAkB,QAAQ,WAAW,WAAW;AACtD,QAAM,eAAe,QAAQ,QAAQ,QAAQ;AAC7C,QAAM,KAAK,QAAQ,MAAM,SAAS,KAAK;AAEvC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,aAAU;AAAA,MACV,gBAAc;AAAA,MACd,aAAW;AAAA,MACX,cAAY,KAAK,OAAO;AAAA,MACxB,gBAAc;AAAA,MACd,WAAW;AAAA,QACT,eAAe,EAAE,SAAS,iBAAiB,MAAM,aAAa,CAAC;AAAA;AAAA;AAAA,QAG/D;AAAA,QACA;AAAA,MACF;AAAA,MACA,SAAS,CAAC,MAAM;AACd,kBAAU,CAAC;AACX,gBAAQ,OAAO,KAAK;AAAA,MACtB;AAAA,MACC,GAAG;AAAA,MAEH;AAAA;AAAA,EACH;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../src/components/atomic/toggle-group.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\nimport { useControllableState } from \"../../primitives/use-controllable-state\";\nimport {\n toggleVariants,\n type ToggleVariant,\n type ToggleSize,\n} from \"./toggle\";\nimport type { ToggleGroupType } from \"../../generated/toggle-group\";\n\ntype ToggleGroupContextValue = {\n variant: ToggleVariant;\n size: ToggleSize;\n value: string[];\n toggle: (itemValue: string) => void;\n};\n\nconst ToggleGroupContext = React.createContext<ToggleGroupContextValue>({\n variant: \"bare\",\n size: \"md\",\n value: [],\n toggle: () => {},\n});\n\nexport interface ToggleGroupProps\n extends Omit<React.ComponentProps<\"div\">, \"onChange\"> {\n variant?: ToggleVariant;\n size?: ToggleSize;\n type?: ToggleGroupType;\n value?: string | string[];\n defaultValue?: string | string[];\n onValueChange?: (value: string | string[]) => void;\n}\n\nfunction toArray(v: string | string[] | undefined): string[] {\n if (v === undefined) return [];\n return Array.isArray(v) ? v : v === \"\" ? [] : [v];\n}\n\nexport function ToggleGroup({\n className,\n variant = \"bare\",\n size = \"md\",\n type = \"single\",\n value,\n defaultValue,\n onValueChange,\n children,\n ...props\n}: ToggleGroupProps) {\n const [selected, setSelected] = useControllableState<string[]>({\n ...(value !== undefined ? { value: toArray(value) } : {}),\n defaultValue: toArray(defaultValue),\n onChange: (next) =>\n onValueChange?.(type === \"single\" ? (next[0] ?? \"\") : next),\n });\n\n const toggle = React.useCallback(\n (itemValue: string) => {\n if (type === \"single\") {\n setSelected(selected.includes(itemValue) ? [] : [itemValue]);\n } else {\n setSelected(\n selected.includes(itemValue)\n ? selected.filter((v) => v !== itemValue)\n : [...selected, itemValue],\n );\n }\n },\n [type, selected, setSelected],\n );\n\n return (\n <div\n data-slot=\"toggle-group\"\n data-variant={variant}\n data-size={size}\n className={cn(\n \"group/toggle-group flex w-fit items-center rounded-control data-[variant=outline]:shadow-xs\",\n className,\n )}\n {...props}\n >\n <ToggleGroupContext.Provider value={{ variant, size, value: selected, toggle }}>\n {children}\n </ToggleGroupContext.Provider>\n </div>\n );\n}\n\nexport interface ToggleGroupItemProps\n extends Omit<React.ComponentProps<\"button\">, \"value\" | \"onChange\"> {\n value: string;\n variant?: ToggleVariant;\n size?: ToggleSize;\n}\n\nexport function ToggleGroupItem({\n className,\n children,\n value,\n variant,\n size,\n onClick,\n ...props\n}: ToggleGroupItemProps) {\n const context = React.useContext(ToggleGroupContext);\n const resolvedVariant = context.variant || variant || \"bare\";\n const resolvedSize = context.size || size || \"md\";\n const on = context.value.includes(value);\n\n return (\n <button\n type=\"button\"\n data-slot=\"toggle-group-item\"\n data-variant={resolvedVariant}\n data-size={resolvedSize}\n data-state={on ? \"on\" : \"off\"}\n aria-pressed={on}\n className={cn(\n toggleVariants({ variant: resolvedVariant, size: resolvedSize }),\n // `flex-auto`, not shadcn's `flex-1`: the group is `w-fit`, and basis-0 items\n // make Chrome split it into equal columns, so a longer label overflows its cell.\n \"min-w-0 flex-auto shrink-0 rounded-none shadow-none first:rounded-l-control last:rounded-r-control focus:z-10 focus-visible:z-10 data-[variant=outline]:-ml-px data-[variant=outline]:first:ml-0 data-[state=on]:z-10\",\n className,\n )}\n onClick={(e) => {\n onClick?.(e);\n context.toggle(value);\n }}\n {...props}\n >\n {children}\n </button>\n );\n}\n"],"mappings":";AAqFM;AAnFN,YAAY,WAAW;AACvB,SAAS,UAAU;AACnB,SAAS,4BAA4B;AACrC;AAAA,EACE;AAAA,OAGK;AAUP,MAAM,qBAAqB,MAAM,cAAuC;AAAA,EACtE,SAAS;AAAA,EACT,MAAM;AAAA,EACN,OAAO,CAAC;AAAA,EACR,QAAQ,MAAM;AAAA,EAAC;AACjB,CAAC;AAYD,SAAS,QAAQ,GAA4C;AAC3D,MAAI,MAAM,OAAW,QAAO,CAAC;AAC7B,SAAO,MAAM,QAAQ,CAAC,IAAI,IAAI,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;AAClD;AAEO,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA,UAAU;AAAA,EACV,OAAO;AAAA,EACP,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAqB;AACnB,QAAM,CAAC,UAAU,WAAW,IAAI,qBAA+B;AAAA,IAC7D,GAAI,UAAU,SAAY,EAAE,OAAO,QAAQ,KAAK,EAAE,IAAI,CAAC;AAAA,IACvD,cAAc,QAAQ,YAAY;AAAA,IAClC,UAAU,CAAC,SACT,gBAAgB,SAAS,WAAY,KAAK,CAAC,KAAK,KAAM,IAAI;AAAA,EAC9D,CAAC;AAED,QAAM,SAAS,MAAM;AAAA,IACnB,CAAC,cAAsB;AACrB,UAAI,SAAS,UAAU;AACrB,oBAAY,SAAS,SAAS,SAAS,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;AAAA,MAC7D,OAAO;AACL;AAAA,UACE,SAAS,SAAS,SAAS,IACvB,SAAS,OAAO,CAAC,MAAM,MAAM,SAAS,IACtC,CAAC,GAAG,UAAU,SAAS;AAAA,QAC7B;AAAA,MACF;AAAA,IACF;AAAA,IACA,CAAC,MAAM,UAAU,WAAW;AAAA,EAC9B;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,gBAAc;AAAA,MACd,aAAW;AAAA,MACX,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAEJ,8BAAC,mBAAmB,UAAnB,EAA4B,OAAO,EAAE,SAAS,MAAM,OAAO,UAAU,OAAO,GAC1E,UACH;AAAA;AAAA,EACF;AAEJ;AASO,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAyB;AACvB,QAAM,UAAU,MAAM,WAAW,kBAAkB;AACnD,QAAM,kBAAkB,QAAQ,WAAW,WAAW;AACtD,QAAM,eAAe,QAAQ,QAAQ,QAAQ;AAC7C,QAAM,KAAK,QAAQ,MAAM,SAAS,KAAK;AAEvC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,aAAU;AAAA,MACV,gBAAc;AAAA,MACd,aAAW;AAAA,MACX,cAAY,KAAK,OAAO;AAAA,MACxB,gBAAc;AAAA,MACd,WAAW;AAAA,QACT,eAAe,EAAE,SAAS,iBAAiB,MAAM,aAAa,CAAC;AAAA;AAAA;AAAA,QAG/D;AAAA,QACA;AAAA,MACF;AAAA,MACA,SAAS,CAAC,MAAM;AACd,kBAAU,CAAC;AACX,gBAAQ,OAAO,KAAK;AAAA,MACtB;AAAA,MACC,GAAG;AAAA,MAEH;AAAA;AAAA,EACH;AAEJ;","names":[]}
@@ -3,17 +3,14 @@ import { jsx } from "react/jsx-runtime";
3
3
  import * as React from "react";
4
4
  import { cn } from "../../lib/cn.js";
5
5
  import { useControllableState } from "../../primitives/use-controllable-state.js";
6
- import {
7
- TOGGLE_BASE,
8
- toggleSizeClasses,
9
- toggleVariantClasses
10
- } from "../../generated/toggle.js";
6
+ import { sizeClasses } from "../../generated/size.js";
7
+ import { TOGGLE_BASE, toggleVariantClasses } from "../../generated/toggle.js";
11
8
  function toggleVariants({
12
9
  variant = "bare",
13
10
  size = "md",
14
11
  className
15
12
  } = {}) {
16
- return cn(TOGGLE_BASE, toggleVariantClasses[variant], toggleSizeClasses[size], className);
13
+ return cn(TOGGLE_BASE, toggleVariantClasses[variant], sizeClasses[size], className);
17
14
  }
18
15
  function Toggle({
19
16
  className,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/atomic/toggle.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\nimport { useControllableState } from \"../../primitives/use-controllable-state\";\nimport {\n TOGGLE_BASE,\n toggleSizeClasses,\n toggleVariantClasses,\n type ToggleSize,\n type ToggleVariant,\n} from \"../../generated/toggle\";\n\nexport type { ToggleSize, ToggleVariant };\n\nexport interface ToggleVariantsOptions {\n variant?: ToggleVariant;\n size?: ToggleSize;\n className?: string;\n}\n\n/**\n * Returns the fused canonical toggle class string. Reused by `toggle-group` so\n * its items adopt the same styling, mirroring Rust's `toggle_classes`.\n */\nexport function toggleVariants({\n variant = \"bare\",\n size = \"md\",\n className,\n}: ToggleVariantsOptions = {}): string {\n return cn(TOGGLE_BASE, toggleVariantClasses[variant], toggleSizeClasses[size], className);\n}\n\nexport interface ToggleProps\n extends Omit<React.ComponentProps<\"button\">, \"onChange\"> {\n variant?: ToggleVariant;\n size?: ToggleSize;\n pressed?: boolean;\n defaultPressed?: boolean;\n onPressedChange?: (pressed: boolean) => void;\n}\n\nexport function Toggle({\n className,\n variant = \"bare\",\n size = \"md\",\n pressed,\n defaultPressed = false,\n onPressedChange,\n onClick,\n ...props\n}: ToggleProps) {\n const [on, setOn] = useControllableState<boolean>({\n ...(pressed !== undefined ? { value: pressed } : {}),\n defaultValue: defaultPressed,\n ...(onPressedChange ? { onChange: onPressedChange } : {}),\n });\n return (\n <button\n type=\"button\"\n data-slot=\"toggle\"\n data-state={on ? \"on\" : \"off\"}\n aria-pressed={on}\n className={cn(toggleVariants({ variant, size }), className)}\n onClick={(e) => {\n onClick?.(e);\n setOn(!on);\n }}\n {...props}\n />\n );\n}\n"],"mappings":";AA0DI;AAxDJ,YAAY,WAAW;AACvB,SAAS,UAAU;AACnB,SAAS,4BAA4B;AACrC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAGK;AAcA,SAAS,eAAe;AAAA,EAC7B,UAAU;AAAA,EACV,OAAO;AAAA,EACP;AACF,IAA2B,CAAC,GAAW;AACrC,SAAO,GAAG,aAAa,qBAAqB,OAAO,GAAG,kBAAkB,IAAI,GAAG,SAAS;AAC1F;AAWO,SAAS,OAAO;AAAA,EACrB;AAAA,EACA,UAAU;AAAA,EACV,OAAO;AAAA,EACP;AAAA,EACA,iBAAiB;AAAA,EACjB;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAgB;AACd,QAAM,CAAC,IAAI,KAAK,IAAI,qBAA8B;AAAA,IAChD,GAAI,YAAY,SAAY,EAAE,OAAO,QAAQ,IAAI,CAAC;AAAA,IAClD,cAAc;AAAA,IACd,GAAI,kBAAkB,EAAE,UAAU,gBAAgB,IAAI,CAAC;AAAA,EACzD,CAAC;AACD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,aAAU;AAAA,MACV,cAAY,KAAK,OAAO;AAAA,MACxB,gBAAc;AAAA,MACd,WAAW,GAAG,eAAe,EAAE,SAAS,KAAK,CAAC,GAAG,SAAS;AAAA,MAC1D,SAAS,CAAC,MAAM;AACd,kBAAU,CAAC;AACX,cAAM,CAAC,EAAE;AAAA,MACX;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../src/components/atomic/toggle.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\nimport { useControllableState } from \"../../primitives/use-controllable-state\";\nimport { sizeClasses, type Size } from \"../../generated/size\";\nimport { TOGGLE_BASE, toggleVariantClasses, type ToggleVariant } from \"../../generated/toggle\";\n\nexport type ToggleSize = Size;\nexport type { ToggleVariant };\n\nexport interface ToggleVariantsOptions {\n variant?: ToggleVariant;\n size?: ToggleSize;\n className?: string;\n}\n\n/**\n * Returns the fused canonical toggle class string. Reused by `toggle-group` so\n * its items adopt the same styling, mirroring Rust's `toggle_classes`.\n */\nexport function toggleVariants({\n variant = \"bare\",\n size = \"md\",\n className,\n}: ToggleVariantsOptions = {}): string {\n return cn(TOGGLE_BASE, toggleVariantClasses[variant], sizeClasses[size], className);\n}\n\nexport interface ToggleProps\n extends Omit<React.ComponentProps<\"button\">, \"onChange\"> {\n variant?: ToggleVariant;\n size?: ToggleSize;\n pressed?: boolean;\n defaultPressed?: boolean;\n onPressedChange?: (pressed: boolean) => void;\n}\n\nexport function Toggle({\n className,\n variant = \"bare\",\n size = \"md\",\n pressed,\n defaultPressed = false,\n onPressedChange,\n onClick,\n ...props\n}: ToggleProps) {\n const [on, setOn] = useControllableState<boolean>({\n ...(pressed !== undefined ? { value: pressed } : {}),\n defaultValue: defaultPressed,\n ...(onPressedChange ? { onChange: onPressedChange } : {}),\n });\n return (\n <button\n type=\"button\"\n data-slot=\"toggle\"\n data-state={on ? \"on\" : \"off\"}\n aria-pressed={on}\n className={cn(toggleVariants({ variant, size }), className)}\n onClick={(e) => {\n onClick?.(e);\n setOn(!on);\n }}\n {...props}\n />\n );\n}\n"],"mappings":";AAsDI;AApDJ,YAAY,WAAW;AACvB,SAAS,UAAU;AACnB,SAAS,4BAA4B;AACrC,SAAS,mBAA8B;AACvC,SAAS,aAAa,4BAAgD;AAe/D,SAAS,eAAe;AAAA,EAC7B,UAAU;AAAA,EACV,OAAO;AAAA,EACP;AACF,IAA2B,CAAC,GAAW;AACrC,SAAO,GAAG,aAAa,qBAAqB,OAAO,GAAG,YAAY,IAAI,GAAG,SAAS;AACpF;AAWO,SAAS,OAAO;AAAA,EACrB;AAAA,EACA,UAAU;AAAA,EACV,OAAO;AAAA,EACP;AAAA,EACA,iBAAiB;AAAA,EACjB;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAgB;AACd,QAAM,CAAC,IAAI,KAAK,IAAI,qBAA8B;AAAA,IAChD,GAAI,YAAY,SAAY,EAAE,OAAO,QAAQ,IAAI,CAAC;AAAA,IAClD,cAAc;AAAA,IACd,GAAI,kBAAkB,EAAE,UAAU,gBAAgB,IAAI,CAAC;AAAA,EACzD,CAAC;AACD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,aAAU;AAAA,MACV,cAAY,KAAK,OAAO;AAAA,MACxB,gBAAc;AAAA,MACd,WAAW,GAAG,eAAe,EAAE,SAAS,KAAK,CAAC,GAAG,SAAS;AAAA,MAC1D,SAAS,CAAC,MAAM;AACd,kBAAU,CAAC;AACX,cAAM,CAAC,EAAE;AAAA,MACX;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/atomic/tooltip.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\nimport { useControllableState } from \"../../primitives/use-controllable-state\";\nimport { useFloating } from \"../../primitives/use-floating\";\nimport { usePresence } from \"../../primitives/presence\";\nimport { mergeRefs } from \"../../primitives/merge-refs\";\nimport { Portal } from \"../../primitives/portal\";\nimport { Slot } from \"../../primitives/slot\";\nimport { TOOLTIP_CONTENT } from \"../../generated/tooltip\";\n\ninterface TooltipContextValue {\n open: boolean;\n setOpen: (next: boolean) => void;\n anchorRef: React.RefObject<HTMLElement | null>;\n}\n\nconst TooltipContext = React.createContext<TooltipContextValue | null>(null);\n\nfunction useTooltip(): TooltipContextValue {\n const ctx = React.useContext(TooltipContext);\n if (!ctx) throw new Error(\"Tooltip parts must be used within <Tooltip>\");\n return ctx;\n}\n\nexport interface TooltipProviderProps {\n children?: React.ReactNode;\n}\n\nexport function TooltipProvider({ children }: TooltipProviderProps) {\n return <>{children}</>;\n}\n\nexport interface TooltipProps {\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n children?: React.ReactNode;\n}\n\nexport function Tooltip({ open, defaultOpen = false, onOpenChange, children }: TooltipProps) {\n const [isOpen, setOpen] = useControllableState<boolean>({\n ...(open !== undefined ? { value: open } : {}),\n defaultValue: defaultOpen,\n ...(onOpenChange ? { onChange: onOpenChange } : {}),\n });\n const anchorRef = React.useRef<HTMLElement | null>(null);\n return (\n <TooltipProvider>\n <TooltipContext.Provider value={{ open: isOpen, setOpen, anchorRef }}>\n {children}\n </TooltipContext.Provider>\n </TooltipProvider>\n );\n}\n\nexport interface TooltipTriggerProps extends React.ComponentProps<\"button\"> {\n asChild?: boolean;\n}\n\nexport function TooltipTrigger({\n asChild = false,\n onPointerEnter,\n onPointerLeave,\n onFocus,\n onBlur,\n ...props\n}: TooltipTriggerProps) {\n const { setOpen, anchorRef } = useTooltip();\n const Comp = asChild ? Slot : \"button\";\n return (\n <Comp\n data-slot=\"tooltip-trigger\"\n ref={anchorRef as React.Ref<never>}\n onPointerEnter={(e: React.PointerEvent<HTMLButtonElement>) => {\n onPointerEnter?.(e);\n setOpen(true);\n }}\n onPointerLeave={(e: React.PointerEvent<HTMLButtonElement>) => {\n onPointerLeave?.(e);\n setOpen(false);\n }}\n onFocus={(e: React.FocusEvent<HTMLButtonElement>) => {\n onFocus?.(e);\n setOpen(true);\n }}\n onBlur={(e: React.FocusEvent<HTMLButtonElement>) => {\n onBlur?.(e);\n setOpen(false);\n }}\n {...(props as Record<string, unknown>)}\n />\n );\n}\n\nexport interface TooltipContentProps extends React.ComponentProps<\"div\"> {\n side?: \"top\" | \"right\" | \"bottom\" | \"left\";\n sideOffset?: number;\n}\n\nexport function TooltipContent({\n className,\n side: sideProp = \"top\",\n sideOffset = 0,\n children,\n ...props\n}: TooltipContentProps) {\n const { open, anchorRef } = useTooltip();\n const { isPresent, ref: presRef } = usePresence(open);\n const { floatingRef, style, side } = useFloating({\n anchorRef,\n open,\n side: sideProp,\n offset: sideOffset,\n });\n if (!isPresent) return null;\n return (\n <Portal>\n <div\n data-slot=\"tooltip-content\"\n role=\"tooltip\"\n data-state={open ? \"open\" : \"closed\"}\n data-side={side}\n ref={mergeRefs(floatingRef, presRef)}\n style={style}\n className={cn(TOOLTIP_CONTENT, className)}\n {...(props as Record<string, unknown>)}\n >\n {children}\n </div>\n </Portal>\n );\n}\n"],"mappings":";AA+BS;AA7BT,YAAY,WAAW;AACvB,SAAS,UAAU;AACnB,SAAS,4BAA4B;AACrC,SAAS,mBAAmB;AAC5B,SAAS,mBAAmB;AAC5B,SAAS,iBAAiB;AAC1B,SAAS,cAAc;AACvB,SAAS,YAAY;AACrB,SAAS,uBAAuB;AAQhC,MAAM,iBAAiB,MAAM,cAA0C,IAAI;AAE3E,SAAS,aAAkC;AACzC,QAAM,MAAM,MAAM,WAAW,cAAc;AAC3C,MAAI,CAAC,IAAK,OAAM,IAAI,MAAM,6CAA6C;AACvE,SAAO;AACT;AAMO,SAAS,gBAAgB,EAAE,SAAS,GAAyB;AAClE,SAAO,gCAAG,UAAS;AACrB;AASO,SAAS,QAAQ,EAAE,MAAM,cAAc,OAAO,cAAc,SAAS,GAAiB;AAC3F,QAAM,CAAC,QAAQ,OAAO,IAAI,qBAA8B;AAAA,IACtD,GAAI,SAAS,SAAY,EAAE,OAAO,KAAK,IAAI,CAAC;AAAA,IAC5C,cAAc;AAAA,IACd,GAAI,eAAe,EAAE,UAAU,aAAa,IAAI,CAAC;AAAA,EACnD,CAAC;AACD,QAAM,YAAY,MAAM,OAA2B,IAAI;AACvD,SACE,oBAAC,mBACC,8BAAC,eAAe,UAAf,EAAwB,OAAO,EAAE,MAAM,QAAQ,SAAS,UAAU,GAChE,UACH,GACF;AAEJ;AAMO,SAAS,eAAe;AAAA,EAC7B,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAwB;AACtB,QAAM,EAAE,SAAS,UAAU,IAAI,WAAW;AAC1C,QAAM,OAAO,UAAU,OAAO;AAC9B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,KAAK;AAAA,MACL,gBAAgB,CAAC,MAA6C;AAC5D,yBAAiB,CAAC;AAClB,gBAAQ,IAAI;AAAA,MACd;AAAA,MACA,gBAAgB,CAAC,MAA6C;AAC5D,yBAAiB,CAAC;AAClB,gBAAQ,KAAK;AAAA,MACf;AAAA,MACA,SAAS,CAAC,MAA2C;AACnD,kBAAU,CAAC;AACX,gBAAQ,IAAI;AAAA,MACd;AAAA,MACA,QAAQ,CAAC,MAA2C;AAClD,iBAAS,CAAC;AACV,gBAAQ,KAAK;AAAA,MACf;AAAA,MACC,GAAI;AAAA;AAAA,EACP;AAEJ;AAOO,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA,MAAM,WAAW;AAAA,EACjB,aAAa;AAAA,EACb;AAAA,EACA,GAAG;AACL,GAAwB;AACtB,QAAM,EAAE,MAAM,UAAU,IAAI,WAAW;AACvC,QAAM,EAAE,WAAW,KAAK,QAAQ,IAAI,YAAY,IAAI;AACpD,QAAM,EAAE,aAAa,OAAO,KAAK,IAAI,YAAY;AAAA,IAC/C;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN,QAAQ;AAAA,EACV,CAAC;AACD,MAAI,CAAC,UAAW,QAAO;AACvB,SACE,oBAAC,UACC;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,MAAK;AAAA,MACL,cAAY,OAAO,SAAS;AAAA,MAC5B,aAAW;AAAA,MACX,KAAK,UAAU,aAAa,OAAO;AAAA,MACnC;AAAA,MACA,WAAW,GAAG,iBAAiB,SAAS;AAAA,MACvC,GAAI;AAAA,MAEJ;AAAA;AAAA,EACH,GACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../src/components/atomic/tooltip.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\nimport { useControllableState } from \"../../primitives/use-controllable-state\";\nimport { useFloating } from \"../../primitives/use-floating\";\nimport { usePresence } from \"../../primitives/presence\";\nimport { mergeRefs } from \"../../primitives/merge-refs\";\nimport { Portal } from \"../../primitives/portal\";\nimport { Slot } from \"../../primitives/slot\";\nimport { TOOLTIP_CONTENT } from \"../../generated/tooltip\";\nimport type { Side } from \"../../generated/primitives\";\n\ninterface TooltipContextValue {\n open: boolean;\n setOpen: (next: boolean) => void;\n anchorRef: React.RefObject<HTMLElement | null>;\n}\n\nconst TooltipContext = React.createContext<TooltipContextValue | null>(null);\n\nfunction useTooltip(): TooltipContextValue {\n const ctx = React.useContext(TooltipContext);\n if (!ctx) throw new Error(\"Tooltip parts must be used within <Tooltip>\");\n return ctx;\n}\n\nexport interface TooltipProviderProps {\n children?: React.ReactNode;\n}\n\nexport function TooltipProvider({ children }: TooltipProviderProps) {\n return <>{children}</>;\n}\n\nexport interface TooltipProps {\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n children?: React.ReactNode;\n}\n\nexport function Tooltip({ open, defaultOpen = false, onOpenChange, children }: TooltipProps) {\n const [isOpen, setOpen] = useControllableState<boolean>({\n ...(open !== undefined ? { value: open } : {}),\n defaultValue: defaultOpen,\n ...(onOpenChange ? { onChange: onOpenChange } : {}),\n });\n const anchorRef = React.useRef<HTMLElement | null>(null);\n return (\n <TooltipProvider>\n <TooltipContext.Provider value={{ open: isOpen, setOpen, anchorRef }}>\n {children}\n </TooltipContext.Provider>\n </TooltipProvider>\n );\n}\n\nexport interface TooltipTriggerProps extends React.ComponentProps<\"button\"> {\n asChild?: boolean;\n}\n\nexport function TooltipTrigger({\n asChild = false,\n onPointerEnter,\n onPointerLeave,\n onFocus,\n onBlur,\n ...props\n}: TooltipTriggerProps) {\n const { setOpen, anchorRef } = useTooltip();\n const Comp = asChild ? Slot : \"button\";\n return (\n <Comp\n data-slot=\"tooltip-trigger\"\n ref={anchorRef as React.Ref<never>}\n onPointerEnter={(e: React.PointerEvent<HTMLButtonElement>) => {\n onPointerEnter?.(e);\n setOpen(true);\n }}\n onPointerLeave={(e: React.PointerEvent<HTMLButtonElement>) => {\n onPointerLeave?.(e);\n setOpen(false);\n }}\n onFocus={(e: React.FocusEvent<HTMLButtonElement>) => {\n onFocus?.(e);\n setOpen(true);\n }}\n onBlur={(e: React.FocusEvent<HTMLButtonElement>) => {\n onBlur?.(e);\n setOpen(false);\n }}\n {...(props as Record<string, unknown>)}\n />\n );\n}\n\nexport interface TooltipContentProps extends React.ComponentProps<\"div\"> {\n side?: Side;\n sideOffset?: number;\n}\n\nexport function TooltipContent({\n className,\n side: sideProp = \"top\",\n sideOffset = 0,\n children,\n ...props\n}: TooltipContentProps) {\n const { open, anchorRef } = useTooltip();\n const { isPresent, ref: presRef } = usePresence(open);\n const { floatingRef, style, side } = useFloating({\n anchorRef,\n open,\n side: sideProp,\n offset: sideOffset,\n });\n if (!isPresent) return null;\n return (\n <Portal>\n <div\n data-slot=\"tooltip-content\"\n role=\"tooltip\"\n data-state={open ? \"open\" : \"closed\"}\n data-side={side}\n ref={mergeRefs(floatingRef, presRef)}\n style={style}\n className={cn(TOOLTIP_CONTENT, className)}\n {...(props as Record<string, unknown>)}\n >\n {children}\n </div>\n </Portal>\n );\n}\n"],"mappings":";AAgCS;AA9BT,YAAY,WAAW;AACvB,SAAS,UAAU;AACnB,SAAS,4BAA4B;AACrC,SAAS,mBAAmB;AAC5B,SAAS,mBAAmB;AAC5B,SAAS,iBAAiB;AAC1B,SAAS,cAAc;AACvB,SAAS,YAAY;AACrB,SAAS,uBAAuB;AAShC,MAAM,iBAAiB,MAAM,cAA0C,IAAI;AAE3E,SAAS,aAAkC;AACzC,QAAM,MAAM,MAAM,WAAW,cAAc;AAC3C,MAAI,CAAC,IAAK,OAAM,IAAI,MAAM,6CAA6C;AACvE,SAAO;AACT;AAMO,SAAS,gBAAgB,EAAE,SAAS,GAAyB;AAClE,SAAO,gCAAG,UAAS;AACrB;AASO,SAAS,QAAQ,EAAE,MAAM,cAAc,OAAO,cAAc,SAAS,GAAiB;AAC3F,QAAM,CAAC,QAAQ,OAAO,IAAI,qBAA8B;AAAA,IACtD,GAAI,SAAS,SAAY,EAAE,OAAO,KAAK,IAAI,CAAC;AAAA,IAC5C,cAAc;AAAA,IACd,GAAI,eAAe,EAAE,UAAU,aAAa,IAAI,CAAC;AAAA,EACnD,CAAC;AACD,QAAM,YAAY,MAAM,OAA2B,IAAI;AACvD,SACE,oBAAC,mBACC,8BAAC,eAAe,UAAf,EAAwB,OAAO,EAAE,MAAM,QAAQ,SAAS,UAAU,GAChE,UACH,GACF;AAEJ;AAMO,SAAS,eAAe;AAAA,EAC7B,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAwB;AACtB,QAAM,EAAE,SAAS,UAAU,IAAI,WAAW;AAC1C,QAAM,OAAO,UAAU,OAAO;AAC9B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,KAAK;AAAA,MACL,gBAAgB,CAAC,MAA6C;AAC5D,yBAAiB,CAAC;AAClB,gBAAQ,IAAI;AAAA,MACd;AAAA,MACA,gBAAgB,CAAC,MAA6C;AAC5D,yBAAiB,CAAC;AAClB,gBAAQ,KAAK;AAAA,MACf;AAAA,MACA,SAAS,CAAC,MAA2C;AACnD,kBAAU,CAAC;AACX,gBAAQ,IAAI;AAAA,MACd;AAAA,MACA,QAAQ,CAAC,MAA2C;AAClD,iBAAS,CAAC;AACV,gBAAQ,KAAK;AAAA,MACf;AAAA,MACC,GAAI;AAAA;AAAA,EACP;AAEJ;AAOO,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA,MAAM,WAAW;AAAA,EACjB,aAAa;AAAA,EACb;AAAA,EACA,GAAG;AACL,GAAwB;AACtB,QAAM,EAAE,MAAM,UAAU,IAAI,WAAW;AACvC,QAAM,EAAE,WAAW,KAAK,QAAQ,IAAI,YAAY,IAAI;AACpD,QAAM,EAAE,aAAa,OAAO,KAAK,IAAI,YAAY;AAAA,IAC/C;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN,QAAQ;AAAA,EACV,CAAC;AACD,MAAI,CAAC,UAAW,QAAO;AACvB,SACE,oBAAC,UACC;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,MAAK;AAAA,MACL,cAAY,OAAO,SAAS;AAAA,MAC5B,aAAW;AAAA,MACX,KAAK,UAAU,aAAa,OAAO;AAAA,MACnC;AAAA,MACA,WAAW,GAAG,iBAAiB,SAAS;AAAA,MACvC,GAAI;AAAA,MAEJ;AAAA;AAAA,EACH,GACF;AAEJ;","names":[]}