@vitinnczk/onyx-ui 0.0.0-stage → 0.2.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 (323) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/LICENSE +21 -0
  3. package/README.md +330 -2
  4. package/dist/components/Accordion/Accordion.d.ts +42 -0
  5. package/dist/components/Accordion/Accordion.js +105 -0
  6. package/dist/components/Accordion/Accordion.js.map +1 -0
  7. package/dist/components/Accordion/Accordion.module.js +14 -0
  8. package/dist/components/Accordion/Accordion.module.js.map +1 -0
  9. package/dist/components/Accordion/index.d.ts +2 -0
  10. package/dist/components/Alert/Alert.d.ts +26 -0
  11. package/dist/components/Alert/Alert.js +58 -0
  12. package/dist/components/Alert/Alert.js.map +1 -0
  13. package/dist/components/Alert/Alert.module.js +19 -0
  14. package/dist/components/Alert/Alert.module.js.map +1 -0
  15. package/dist/components/Alert/index.d.ts +2 -0
  16. package/dist/components/Avatar/Avatar.d.ts +16 -0
  17. package/dist/components/Avatar/Avatar.js +33 -0
  18. package/dist/components/Avatar/Avatar.js.map +1 -0
  19. package/dist/components/Avatar/Avatar.module.js +15 -0
  20. package/dist/components/Avatar/Avatar.module.js.map +1 -0
  21. package/dist/components/Avatar/index.d.ts +2 -0
  22. package/dist/components/Badge/Badge.d.ts +15 -0
  23. package/dist/components/Badge/Badge.js +17 -0
  24. package/dist/components/Badge/Badge.js.map +1 -0
  25. package/dist/components/Badge/Badge.module.js +18 -0
  26. package/dist/components/Badge/Badge.module.js.map +1 -0
  27. package/dist/components/Badge/index.d.ts +2 -0
  28. package/dist/components/Breadcrumb/Breadcrumb.d.ts +26 -0
  29. package/dist/components/Breadcrumb/Breadcrumb.js +44 -0
  30. package/dist/components/Breadcrumb/Breadcrumb.js.map +1 -0
  31. package/dist/components/Breadcrumb/Breadcrumb.module.js +11 -0
  32. package/dist/components/Breadcrumb/Breadcrumb.module.js.map +1 -0
  33. package/dist/components/Breadcrumb/index.d.ts +2 -0
  34. package/dist/components/Button/Button.d.ts +29 -0
  35. package/dist/components/Button/Button.js +40 -0
  36. package/dist/components/Button/Button.js.map +1 -0
  37. package/dist/components/Button/Button.module.js +18 -0
  38. package/dist/components/Button/Button.module.js.map +1 -0
  39. package/dist/components/Button/index.d.ts +2 -0
  40. package/dist/components/Card/Card.d.ts +24 -0
  41. package/dist/components/Card/Card.js +34 -0
  42. package/dist/components/Card/Card.js.map +1 -0
  43. package/dist/components/Card/Card.module.js +17 -0
  44. package/dist/components/Card/Card.module.js.map +1 -0
  45. package/dist/components/Card/index.d.ts +2 -0
  46. package/dist/components/Checkbox/Checkbox.d.ts +21 -0
  47. package/dist/components/Checkbox/Checkbox.js +52 -0
  48. package/dist/components/Checkbox/Checkbox.js.map +1 -0
  49. package/dist/components/Checkbox/Checkbox.module.js +9 -0
  50. package/dist/components/Checkbox/Checkbox.module.js.map +1 -0
  51. package/dist/components/Checkbox/index.d.ts +2 -0
  52. package/dist/components/Divider/Divider.d.ts +18 -0
  53. package/dist/components/Divider/Divider.js +24 -0
  54. package/dist/components/Divider/Divider.js.map +1 -0
  55. package/dist/components/Divider/Divider.module.js +12 -0
  56. package/dist/components/Divider/Divider.module.js.map +1 -0
  57. package/dist/components/Divider/index.d.ts +2 -0
  58. package/dist/components/Drawer/Drawer.d.ts +18 -0
  59. package/dist/components/Drawer/Drawer.js +27 -0
  60. package/dist/components/Drawer/Drawer.js.map +1 -0
  61. package/dist/components/Drawer/Drawer.module.js +17 -0
  62. package/dist/components/Drawer/Drawer.module.js.map +1 -0
  63. package/dist/components/Drawer/index.d.ts +2 -0
  64. package/dist/components/DropdownMenu/DropdownMenu.d.ts +65 -0
  65. package/dist/components/DropdownMenu/DropdownMenu.js +159 -0
  66. package/dist/components/DropdownMenu/DropdownMenu.js.map +1 -0
  67. package/dist/components/DropdownMenu/DropdownMenu.module.js +16 -0
  68. package/dist/components/DropdownMenu/DropdownMenu.module.js.map +1 -0
  69. package/dist/components/DropdownMenu/index.d.ts +2 -0
  70. package/dist/components/EmptyState/EmptyState.d.ts +20 -0
  71. package/dist/components/EmptyState/EmptyState.js +36 -0
  72. package/dist/components/EmptyState/EmptyState.js.map +1 -0
  73. package/dist/components/EmptyState/EmptyState.module.js +12 -0
  74. package/dist/components/EmptyState/EmptyState.module.js.map +1 -0
  75. package/dist/components/EmptyState/index.d.ts +2 -0
  76. package/dist/components/FormField/FormField.d.ts +24 -0
  77. package/dist/components/FormField/FormField.js +49 -0
  78. package/dist/components/FormField/FormField.js.map +1 -0
  79. package/dist/components/FormField/FormField.module.js +10 -0
  80. package/dist/components/FormField/FormField.module.js.map +1 -0
  81. package/dist/components/FormField/formFieldContext.d.ts +24 -0
  82. package/dist/components/FormField/formFieldContext.js +18 -0
  83. package/dist/components/FormField/formFieldContext.js.map +1 -0
  84. package/dist/components/FormField/index.d.ts +2 -0
  85. package/dist/components/Heading/Heading.d.ts +14 -0
  86. package/dist/components/Heading/Heading.js +32 -0
  87. package/dist/components/Heading/Heading.js.map +1 -0
  88. package/dist/components/Heading/Heading.module.js +14 -0
  89. package/dist/components/Heading/Heading.module.js.map +1 -0
  90. package/dist/components/Heading/index.d.ts +2 -0
  91. package/dist/components/Icon/Icon.d.ts +16 -0
  92. package/dist/components/Icon/Icon.js +28 -0
  93. package/dist/components/Icon/Icon.js.map +1 -0
  94. package/dist/components/Icon/Icon.module.js +13 -0
  95. package/dist/components/Icon/Icon.module.js.map +1 -0
  96. package/dist/components/Icon/icons.d.ts +17 -0
  97. package/dist/components/Icon/icons.js +47 -0
  98. package/dist/components/Icon/icons.js.map +1 -0
  99. package/dist/components/Icon/index.d.ts +3 -0
  100. package/dist/components/IconButton/IconButton.d.ts +12 -0
  101. package/dist/components/IconButton/IconButton.js +25 -0
  102. package/dist/components/IconButton/IconButton.js.map +1 -0
  103. package/dist/components/IconButton/IconButton.module.js +11 -0
  104. package/dist/components/IconButton/IconButton.module.js.map +1 -0
  105. package/dist/components/IconButton/index.d.ts +2 -0
  106. package/dist/components/Input/Input.d.ts +18 -0
  107. package/dist/components/Input/Input.js +47 -0
  108. package/dist/components/Input/Input.js.map +1 -0
  109. package/dist/components/Input/Input.module.js +5 -0
  110. package/dist/components/Input/Input.module.js.map +1 -0
  111. package/dist/components/Input/index.d.ts +2 -0
  112. package/dist/components/Label/Label.d.ts +15 -0
  113. package/dist/components/Label/Label.js +22 -0
  114. package/dist/components/Label/Label.js.map +1 -0
  115. package/dist/components/Label/Label.module.js +10 -0
  116. package/dist/components/Label/Label.module.js.map +1 -0
  117. package/dist/components/Label/index.d.ts +2 -0
  118. package/dist/components/Link/Link.d.ts +23 -0
  119. package/dist/components/Link/Link.js +27 -0
  120. package/dist/components/Link/Link.js.map +1 -0
  121. package/dist/components/Link/Link.module.js +11 -0
  122. package/dist/components/Link/Link.module.js.map +1 -0
  123. package/dist/components/Link/index.d.ts +2 -0
  124. package/dist/components/Modal/DialogSurface.d.ts +39 -0
  125. package/dist/components/Modal/DialogSurface.js +69 -0
  126. package/dist/components/Modal/DialogSurface.js.map +1 -0
  127. package/dist/components/Modal/DialogSurface.module.js +16 -0
  128. package/dist/components/Modal/DialogSurface.module.js.map +1 -0
  129. package/dist/components/Modal/Modal.d.ts +34 -0
  130. package/dist/components/Modal/Modal.js +44 -0
  131. package/dist/components/Modal/Modal.js.map +1 -0
  132. package/dist/components/Modal/Modal.module.js +13 -0
  133. package/dist/components/Modal/Modal.module.js.map +1 -0
  134. package/dist/components/Modal/index.d.ts +3 -0
  135. package/dist/components/Pagination/Pagination.d.ts +46 -0
  136. package/dist/components/Pagination/Pagination.js +71 -0
  137. package/dist/components/Pagination/Pagination.js.map +1 -0
  138. package/dist/components/Pagination/Pagination.module.js +13 -0
  139. package/dist/components/Pagination/Pagination.module.js.map +1 -0
  140. package/dist/components/Pagination/index.d.ts +2 -0
  141. package/dist/components/Popover/Popover.d.ts +46 -0
  142. package/dist/components/Popover/Popover.js +89 -0
  143. package/dist/components/Popover/Popover.js.map +1 -0
  144. package/dist/components/Popover/Popover.module.js +12 -0
  145. package/dist/components/Popover/Popover.module.js.map +1 -0
  146. package/dist/components/Popover/index.d.ts +2 -0
  147. package/dist/components/Portal/Portal.d.ts +10 -0
  148. package/dist/components/Portal/Portal.js +13 -0
  149. package/dist/components/Portal/Portal.js.map +1 -0
  150. package/dist/components/Portal/index.d.ts +2 -0
  151. package/dist/components/Progress/Progress.d.ts +28 -0
  152. package/dist/components/Progress/Progress.js +42 -0
  153. package/dist/components/Progress/Progress.js.map +1 -0
  154. package/dist/components/Progress/Progress.module.js +18 -0
  155. package/dist/components/Progress/Progress.module.js.map +1 -0
  156. package/dist/components/Progress/index.d.ts +2 -0
  157. package/dist/components/RadioGroup/RadioGroup.d.ts +41 -0
  158. package/dist/components/RadioGroup/RadioGroup.js +112 -0
  159. package/dist/components/RadioGroup/RadioGroup.js.map +1 -0
  160. package/dist/components/RadioGroup/RadioGroup.module.js +16 -0
  161. package/dist/components/RadioGroup/RadioGroup.module.js.map +1 -0
  162. package/dist/components/RadioGroup/index.d.ts +2 -0
  163. package/dist/components/Select/Select.d.ts +19 -0
  164. package/dist/components/Select/Select.js +44 -0
  165. package/dist/components/Select/Select.js.map +1 -0
  166. package/dist/components/Select/Select.module.js +10 -0
  167. package/dist/components/Select/Select.module.js.map +1 -0
  168. package/dist/components/Select/index.d.ts +2 -0
  169. package/dist/components/Skeleton/Skeleton.d.ts +22 -0
  170. package/dist/components/Skeleton/Skeleton.js +33 -0
  171. package/dist/components/Skeleton/Skeleton.js.map +1 -0
  172. package/dist/components/Skeleton/Skeleton.module.js +12 -0
  173. package/dist/components/Skeleton/Skeleton.module.js.map +1 -0
  174. package/dist/components/Skeleton/index.d.ts +2 -0
  175. package/dist/components/Slider/Slider.d.ts +38 -0
  176. package/dist/components/Slider/Slider.js +55 -0
  177. package/dist/components/Slider/Slider.js.map +1 -0
  178. package/dist/components/Slider/Slider.module.js +11 -0
  179. package/dist/components/Slider/Slider.module.js.map +1 -0
  180. package/dist/components/Slider/index.d.ts +2 -0
  181. package/dist/components/Spinner/Spinner.d.ts +22 -0
  182. package/dist/components/Spinner/Spinner.js +34 -0
  183. package/dist/components/Spinner/Spinner.js.map +1 -0
  184. package/dist/components/Spinner/Spinner.module.js +17 -0
  185. package/dist/components/Spinner/Spinner.module.js.map +1 -0
  186. package/dist/components/Spinner/index.d.ts +2 -0
  187. package/dist/components/Switch/Switch.d.ts +17 -0
  188. package/dist/components/Switch/Switch.js +48 -0
  189. package/dist/components/Switch/Switch.js.map +1 -0
  190. package/dist/components/Switch/Switch.module.js +9 -0
  191. package/dist/components/Switch/Switch.module.js.map +1 -0
  192. package/dist/components/Switch/index.d.ts +2 -0
  193. package/dist/components/Table/Table.d.ts +84 -0
  194. package/dist/components/Table/Table.js +105 -0
  195. package/dist/components/Table/Table.js.map +1 -0
  196. package/dist/components/Table/Table.module.js +23 -0
  197. package/dist/components/Table/Table.module.js.map +1 -0
  198. package/dist/components/Table/index.d.ts +2 -0
  199. package/dist/components/Tabs/Tabs.d.ts +41 -0
  200. package/dist/components/Tabs/Tabs.js +86 -0
  201. package/dist/components/Tabs/Tabs.js.map +1 -0
  202. package/dist/components/Tabs/Tabs.module.js +14 -0
  203. package/dist/components/Tabs/Tabs.module.js.map +1 -0
  204. package/dist/components/Tabs/index.d.ts +2 -0
  205. package/dist/components/Text/Text.d.ts +22 -0
  206. package/dist/components/Text/Text.js +37 -0
  207. package/dist/components/Text/Text.js.map +1 -0
  208. package/dist/components/Text/Text.module.js +30 -0
  209. package/dist/components/Text/Text.module.js.map +1 -0
  210. package/dist/components/Text/index.d.ts +2 -0
  211. package/dist/components/Textarea/Textarea.d.ts +17 -0
  212. package/dist/components/Textarea/Textarea.js +36 -0
  213. package/dist/components/Textarea/Textarea.js.map +1 -0
  214. package/dist/components/Textarea/Textarea.module.js +11 -0
  215. package/dist/components/Textarea/Textarea.module.js.map +1 -0
  216. package/dist/components/Textarea/index.d.ts +2 -0
  217. package/dist/components/ThemeProvider/ThemeProvider.d.ts +39 -0
  218. package/dist/components/ThemeProvider/ThemeProvider.js +36 -0
  219. package/dist/components/ThemeProvider/ThemeProvider.js.map +1 -0
  220. package/dist/components/ThemeProvider/index.d.ts +2 -0
  221. package/dist/components/ThemeProvider/themeStore.d.ts +8 -0
  222. package/dist/components/ThemeProvider/themeStore.js +36 -0
  223. package/dist/components/ThemeProvider/themeStore.js.map +1 -0
  224. package/dist/components/Toast/Toast.d.ts +66 -0
  225. package/dist/components/Toast/Toast.js +166 -0
  226. package/dist/components/Toast/Toast.js.map +1 -0
  227. package/dist/components/Toast/Toast.module.js +27 -0
  228. package/dist/components/Toast/Toast.module.js.map +1 -0
  229. package/dist/components/Toast/index.d.ts +2 -0
  230. package/dist/components/Tooltip/Tooltip.d.ts +40 -0
  231. package/dist/components/Tooltip/Tooltip.js +63 -0
  232. package/dist/components/Tooltip/Tooltip.js.map +1 -0
  233. package/dist/components/Tooltip/Tooltip.module.js +8 -0
  234. package/dist/components/Tooltip/Tooltip.module.js.map +1 -0
  235. package/dist/components/Tooltip/index.d.ts +2 -0
  236. package/dist/components/VisuallyHidden/VisuallyHidden.d.ts +4 -0
  237. package/dist/components/VisuallyHidden/VisuallyHidden.js +16 -0
  238. package/dist/components/VisuallyHidden/VisuallyHidden.js.map +1 -0
  239. package/dist/components/VisuallyHidden/VisuallyHidden.module.js +5 -0
  240. package/dist/components/VisuallyHidden/VisuallyHidden.module.js.map +1 -0
  241. package/dist/components/VisuallyHidden/index.d.ts +2 -0
  242. package/dist/hooks/index.d.ts +10 -0
  243. package/dist/hooks/useClickOutside.d.ts +10 -0
  244. package/dist/hooks/useClickOutside.js +21 -0
  245. package/dist/hooks/useClickOutside.js.map +1 -0
  246. package/dist/hooks/useControllableState.d.ts +10 -0
  247. package/dist/hooks/useControllableState.js +16 -0
  248. package/dist/hooks/useControllableState.js.map +1 -0
  249. package/dist/hooks/useEscapeKey.d.ts +9 -0
  250. package/dist/hooks/useEscapeKey.js +21 -0
  251. package/dist/hooks/useEscapeKey.js.map +1 -0
  252. package/dist/hooks/useFocusTrap.d.ts +19 -0
  253. package/dist/hooks/useFocusTrap.js +42 -0
  254. package/dist/hooks/useFocusTrap.js.map +1 -0
  255. package/dist/hooks/useLatestRef.d.ts +1 -0
  256. package/dist/hooks/useLatestRef.js +12 -0
  257. package/dist/hooks/useLatestRef.js.map +1 -0
  258. package/dist/hooks/useScrollLock.d.ts +10 -0
  259. package/dist/hooks/useScrollLock.js +19 -0
  260. package/dist/hooks/useScrollLock.js.map +1 -0
  261. package/dist/hooks/useTimeout.d.ts +5 -0
  262. package/dist/hooks/useTimeout.js +16 -0
  263. package/dist/hooks/useTimeout.js.map +1 -0
  264. package/dist/index.d.ts +83 -0
  265. package/dist/index.js +59 -0
  266. package/dist/styles/choice.module.js +15 -0
  267. package/dist/styles/choice.module.js.map +1 -0
  268. package/dist/styles/field.module.js +11 -0
  269. package/dist/styles/field.module.js.map +1 -0
  270. package/dist/styles.css +2 -0
  271. package/dist/tokens/breakpoints.d.ts +12 -0
  272. package/dist/tokens/breakpoints.js +11 -0
  273. package/dist/tokens/breakpoints.js.map +1 -0
  274. package/dist/tokens/colors.d.ts +82 -0
  275. package/dist/tokens/colors.js +92 -0
  276. package/dist/tokens/colors.js.map +1 -0
  277. package/dist/tokens/focus.d.ts +4 -0
  278. package/dist/tokens/focus.js +8 -0
  279. package/dist/tokens/focus.js.map +1 -0
  280. package/dist/tokens/index.d.ts +22 -0
  281. package/dist/tokens/index.js +37 -0
  282. package/dist/tokens/index.js.map +1 -0
  283. package/dist/tokens/motion.d.ts +21 -0
  284. package/dist/tokens/motion.js +16 -0
  285. package/dist/tokens/motion.js.map +1 -0
  286. package/dist/tokens/radius.d.ts +9 -0
  287. package/dist/tokens/radius.js +13 -0
  288. package/dist/tokens/radius.js.map +1 -0
  289. package/dist/tokens/shadows.d.ts +12 -0
  290. package/dist/tokens/shadows.js +12 -0
  291. package/dist/tokens/shadows.js.map +1 -0
  292. package/dist/tokens/sizes.d.ts +22 -0
  293. package/dist/tokens/sizes.js +23 -0
  294. package/dist/tokens/sizes.js.map +1 -0
  295. package/dist/tokens/spacing.d.ts +19 -0
  296. package/dist/tokens/spacing.js +19 -0
  297. package/dist/tokens/spacing.js.map +1 -0
  298. package/dist/tokens/themes.d.ts +256 -0
  299. package/dist/tokens/themes.js +120 -0
  300. package/dist/tokens/themes.js.map +1 -0
  301. package/dist/tokens/typography.d.ts +37 -0
  302. package/dist/tokens/typography.js +35 -0
  303. package/dist/tokens/typography.js.map +1 -0
  304. package/dist/tokens/z-index.d.ts +8 -0
  305. package/dist/tokens/z-index.js +11 -0
  306. package/dist/tokens/z-index.js.map +1 -0
  307. package/dist/utils/cn.d.ts +8 -0
  308. package/dist/utils/cn.js +14 -0
  309. package/dist/utils/cn.js.map +1 -0
  310. package/dist/utils/floating.d.ts +20 -0
  311. package/dist/utils/floating.js +31 -0
  312. package/dist/utils/floating.js.map +1 -0
  313. package/dist/utils/getElementRef.d.ts +3 -0
  314. package/dist/utils/getElementRef.js +8 -0
  315. package/dist/utils/getElementRef.js.map +1 -0
  316. package/dist/utils/mergeRefs.d.ts +2 -0
  317. package/dist/utils/mergeRefs.js +9 -0
  318. package/dist/utils/mergeRefs.js.map +1 -0
  319. package/dist/utils/polymorphic.d.ts +13 -0
  320. package/dist/utils/refocusIfLost.d.ts +6 -0
  321. package/dist/utils/refocusIfLost.js +10 -0
  322. package/dist/utils/refocusIfLost.js.map +1 -0
  323. package/package.json +106 -4
@@ -0,0 +1,66 @@
1
+ import { ReactNode } from 'react';
2
+ export type ToastIntent = 'neutral' | 'info' | 'success' | 'warning' | 'danger';
3
+ export type ToastPlacement = 'top-start' | 'top-center' | 'top-end' | 'bottom-start' | 'bottom-center' | 'bottom-end';
4
+ export interface ToastOptions {
5
+ /** Reuse an id to replace a toast that is still open. Generated when omitted. */
6
+ id?: string;
7
+ title: ReactNode;
8
+ description?: ReactNode;
9
+ /** @default 'neutral' */
10
+ intent?: ToastIntent;
11
+ /**
12
+ * Milliseconds before it closes on its own. `null` keeps it open until dismissed. Defaults to
13
+ * the provider's `duration`.
14
+ */
15
+ duration?: number | null;
16
+ /** Button shown in the toast. Dismisses the toast after `onClick` runs. */
17
+ action?: {
18
+ label: string;
19
+ onClick: () => void;
20
+ };
21
+ /** Called when the toast closes, for any reason. */
22
+ onDismiss?: () => void;
23
+ }
24
+ export interface ToastContextValue {
25
+ /** Shows a toast, or queues it while `max` toasts are visible. Returns its id. */
26
+ toast: (options: ToastOptions) => string;
27
+ /** Closes the toast with this id, or every toast when called without one. */
28
+ dismiss: (id?: string) => void;
29
+ }
30
+ /** Shows and dismisses toasts. Must be called inside a `ToastProvider`. */
31
+ export declare function useToast(): ToastContextValue;
32
+ export interface ToastProviderProps {
33
+ children?: ReactNode;
34
+ /**
35
+ * Default time, in milliseconds, before a toast closes on its own.
36
+ * @default 5000
37
+ */
38
+ duration?: number;
39
+ /**
40
+ * Toasts visible at once. The rest wait in a queue and appear as others close.
41
+ * @default 3
42
+ */
43
+ max?: number;
44
+ /** @default 'bottom-end' */
45
+ placement?: ToastPlacement;
46
+ /**
47
+ * Accessible name of the notification region.
48
+ * @default 'Notifications'
49
+ */
50
+ label?: string;
51
+ /**
52
+ * Key that moves focus to the newest toast, so keyboard users can reach its buttons.
53
+ * @default 'F8'
54
+ */
55
+ hotkey?: string;
56
+ /**
57
+ * Accessible name of the dismiss button of each toast.
58
+ * @default 'Dismiss notification'
59
+ */
60
+ dismissLabel?: string;
61
+ }
62
+ /**
63
+ * Renders the toasts requested with `useToast`. Timers pause while the pointer is over the
64
+ * toasts or focus is inside them, and new toasts are announced by a live region.
65
+ */
66
+ export declare function ToastProvider({ children, duration, max, placement, label, hotkey, dismissLabel, }: ToastProviderProps): import('react').JSX.Element;
@@ -0,0 +1,166 @@
1
+ "use client";
2
+ import { cn as e } from "../../utils/cn.js";
3
+ import { CloseIcon as t, ErrorIcon as n, InfoIcon as r, SuccessIcon as i, WarningIcon as a } from "../Icon/icons.js";
4
+ import { Button as o } from "../Button/Button.js";
5
+ import { IconButton as s } from "../IconButton/IconButton.js";
6
+ import { Portal as c } from "../Portal/Portal.js";
7
+ import l from "./Toast.module.js";
8
+ import { createContext as u, useCallback as d, useContext as f, useEffect as p, useMemo as m, useRef as h, useState as g } from "react";
9
+ import { jsx as _, jsxs as v } from "react/jsx-runtime";
10
+ // src/components/Toast/Toast.tsx
11
+ var y = {
12
+ "top-start": l.topStart,
13
+ "top-center": l.topCenter,
14
+ "top-end": l.topEnd,
15
+ "bottom-start": l.bottomStart,
16
+ "bottom-center": l.bottomCenter,
17
+ "bottom-end": l.bottomEnd
18
+ }, b = u(null);
19
+ function x() {
20
+ let e = f(b);
21
+ if (!e) throw Error("useToast must be used inside a ToastProvider.");
22
+ return e;
23
+ }
24
+ function S({ children: t, duration: n = 5e3, max: r = 3, placement: i = "bottom-end", label: a = "Notifications", hotkey: o = "F8", dismissLabel: s = "Dismiss notification" }) {
25
+ let [u, f] = g([]), [x, S] = g(!1), [C, T] = g(!1), E = h(0), [D, O] = g(null), k = h(u), A = h(D), j = h(null), M = h(null);
26
+ p(() => {
27
+ k.current = u, A.current = D;
28
+ }), p(() => {
29
+ M.current?.focus(), M.current = null;
30
+ }, [u]);
31
+ let N = d((e) => {
32
+ let t = k.current.filter((t) => e === void 0 || t.id === e);
33
+ for (let e of t) e.onDismiss?.();
34
+ let n = [...A.current?.querySelectorAll("[data-toast]") ?? []], r = (e) => t.some((t) => t.id === e.dataset.toast);
35
+ if (n.some((e) => r(e) && e.contains(document.activeElement))) {
36
+ let e = n.filter((e) => !r(e)).at(-1), t = j.current?.isConnected ? j.current : null;
37
+ M.current = t ?? e ?? null, M.current !== e && T(!1);
38
+ }
39
+ f((t) => e === void 0 ? [] : t.filter((t) => t.id !== e));
40
+ }, []), P = d((e) => {
41
+ let t = e.id ?? `toast-${++E.current}`;
42
+ return f((n) => {
43
+ let r = n.findIndex((e) => e.id === t);
44
+ return r === -1 ? [...n, {
45
+ ...e,
46
+ id: t
47
+ }] : n.map((n, i) => i === r ? {
48
+ ...e,
49
+ id: t
50
+ } : n);
51
+ }), t;
52
+ }, []);
53
+ p(() => {
54
+ if (!D) return;
55
+ let e = (e) => {
56
+ if (e.key !== o) return;
57
+ let t = [...D.querySelectorAll("[data-toast]")].at(-1);
58
+ t && (e.preventDefault(), D.contains(document.activeElement) || (j.current = document.activeElement), t.focus());
59
+ }, t = (e) => {
60
+ let t = e.target.closest("[data-toast]");
61
+ e.key === "Escape" && t?.dataset.toast && (e.stopPropagation(), N(t.dataset.toast));
62
+ }, n = () => S(!0), r = () => S(!1), i = () => T(!0), a = (e) => {
63
+ D.contains(e.relatedTarget) || (T(!1), j.current = null);
64
+ };
65
+ return document.addEventListener("keydown", e), D.addEventListener("keydown", t), D.addEventListener("pointerenter", n), D.addEventListener("pointerleave", r), D.addEventListener("focusin", i), D.addEventListener("focusout", a), () => {
66
+ document.removeEventListener("keydown", e), D.removeEventListener("keydown", t), D.removeEventListener("pointerenter", n), D.removeEventListener("pointerleave", r), D.removeEventListener("focusin", i), D.removeEventListener("focusout", a);
67
+ };
68
+ }, [
69
+ D,
70
+ o,
71
+ N
72
+ ]);
73
+ let F = m(() => ({
74
+ toast: P,
75
+ dismiss: N
76
+ }), [P, N]), I = u.slice(0, r), L = x || C;
77
+ return /* @__PURE__ */ v(b.Provider, {
78
+ value: F,
79
+ children: [t, /* @__PURE__ */ _(c, { children: /* @__PURE__ */ _("section", {
80
+ "aria-label": a,
81
+ className: e(l.viewport, y[i]),
82
+ children: /* @__PURE__ */ _("ol", {
83
+ ref: O,
84
+ className: l.list,
85
+ "aria-live": "polite",
86
+ "aria-relevant": "additions text",
87
+ children: I.map((e) => /* @__PURE__ */ _(w, {
88
+ toast: e,
89
+ duration: e.duration === void 0 ? n : e.duration,
90
+ paused: L,
91
+ dismissLabel: s,
92
+ onDismiss: () => N(e.id)
93
+ }, e.id))
94
+ })
95
+ }) })]
96
+ });
97
+ }
98
+ var C = {
99
+ neutral: null,
100
+ info: /* @__PURE__ */ _(r, {}),
101
+ success: /* @__PURE__ */ _(i, {}),
102
+ warning: /* @__PURE__ */ _(a, {}),
103
+ danger: /* @__PURE__ */ _(n, {})
104
+ };
105
+ function w({ toast: n, duration: r, paused: i, dismissLabel: a, onDismiss: c }) {
106
+ let { title: u, description: d, intent: f = "neutral", action: m } = n, g = h(r), y = h(c);
107
+ return p(() => {
108
+ y.current = c;
109
+ }), p(() => {
110
+ g.current = r;
111
+ }, [r, n]), p(() => {
112
+ if (i || g.current === null) return;
113
+ let e = Date.now(), t = setTimeout(() => y.current(), g.current);
114
+ return () => {
115
+ clearTimeout(t), g.current !== null && (g.current -= Date.now() - e);
116
+ };
117
+ }, [
118
+ i,
119
+ r,
120
+ n
121
+ ]), /* @__PURE__ */ v("li", {
122
+ "data-toast": n.id,
123
+ role: f === "danger" ? "alert" : void 0,
124
+ tabIndex: -1,
125
+ className: e(l.toast, l[f]),
126
+ children: [
127
+ C[f] && /* @__PURE__ */ _("span", {
128
+ className: l.icon,
129
+ "aria-hidden": "true",
130
+ children: C[f]
131
+ }),
132
+ /* @__PURE__ */ v("div", {
133
+ className: l.content,
134
+ children: [
135
+ /* @__PURE__ */ _("p", {
136
+ className: l.title,
137
+ children: u
138
+ }),
139
+ d !== void 0 && /* @__PURE__ */ _("div", {
140
+ className: l.description,
141
+ children: d
142
+ }),
143
+ m && /* @__PURE__ */ _(o, {
144
+ size: "sm",
145
+ variant: "secondary",
146
+ className: l.action,
147
+ onClick: () => {
148
+ m.onClick(), c();
149
+ },
150
+ children: m.label
151
+ })
152
+ ]
153
+ }),
154
+ /* @__PURE__ */ _(s, {
155
+ label: a,
156
+ size: "sm",
157
+ className: l.dismiss,
158
+ onClick: c,
159
+ children: /* @__PURE__ */ _(t, {})
160
+ })
161
+ ]
162
+ });
163
+ }
164
+ export { S as ToastProvider, x as useToast };
165
+
166
+ //# sourceMappingURL=Toast.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Toast.js","names":["styles","Toast_module_default","placementClasses","ToastContext","createContext","useToast","context","useContext","ToastProvider","toasts","setToasts","useState","hovered","setHovered","focused","setFocused","counter","useRef","list","setList","toastsRef","listRef","returnFocus","pendingFocus","useEffect","dismiss","useCallback","closing","id","toast","items","isClosing","item","remaining","previous","current","options","index","position","onHotkey","event","hotkey","newest","onEscape","onPointerEnter","onPointerLeave","onFocusIn","onFocusOut","value","useMemo","visible","max","paused","children","Portal","label","cn","placement","ToastItem","duration","icons","InfoIcon","SuccessIcon","WarningIcon","ErrorIcon","onDismissRef","onDismiss","start","timer","intent","title","description","action","Button","IconButton","dismissLabel","CloseIcon"],"sources":["../../../src/components/Toast/Toast.tsx"],"sourcesContent":["import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from 'react';\nimport { cn } from '@/utils/cn';\nimport { Button } from '../Button';\nimport { CloseIcon, ErrorIcon, InfoIcon, SuccessIcon, WarningIcon } from '../Icon';\nimport { IconButton } from '../IconButton';\nimport { Portal } from '../Portal';\nimport styles from './Toast.module.css';\n\nexport type ToastIntent = 'neutral' | 'info' | 'success' | 'warning' | 'danger';\nexport type ToastPlacement =\n 'top-start' | 'top-center' | 'top-end' | 'bottom-start' | 'bottom-center' | 'bottom-end';\n\nexport interface ToastOptions {\n /** Reuse an id to replace a toast that is still open. Generated when omitted. */\n id?: string;\n title: ReactNode;\n description?: ReactNode;\n /** @default 'neutral' */\n intent?: ToastIntent;\n /**\n * Milliseconds before it closes on its own. `null` keeps it open until dismissed. Defaults to\n * the provider's `duration`.\n */\n duration?: number | null;\n /** Button shown in the toast. Dismisses the toast after `onClick` runs. */\n action?: { label: string; onClick: () => void };\n /** Called when the toast closes, for any reason. */\n onDismiss?: () => void;\n}\n\ninterface ToastData extends ToastOptions {\n id: string;\n}\n\nexport interface ToastContextValue {\n /** Shows a toast, or queues it while `max` toasts are visible. Returns its id. */\n toast: (options: ToastOptions) => string;\n /** Closes the toast with this id, or every toast when called without one. */\n dismiss: (id?: string) => void;\n}\n\nconst placementClasses: Record<ToastPlacement, string | undefined> = {\n 'top-start': styles.topStart,\n 'top-center': styles.topCenter,\n 'top-end': styles.topEnd,\n 'bottom-start': styles.bottomStart,\n 'bottom-center': styles.bottomCenter,\n 'bottom-end': styles.bottomEnd,\n};\n\nconst ToastContext = createContext<ToastContextValue | null>(null);\n\n/** Shows and dismisses toasts. Must be called inside a `ToastProvider`. */\nexport function useToast(): ToastContextValue {\n const context = useContext(ToastContext);\n if (!context) throw new Error('useToast must be used inside a ToastProvider.');\n return context;\n}\n\nexport interface ToastProviderProps {\n children?: ReactNode;\n /**\n * Default time, in milliseconds, before a toast closes on its own.\n * @default 5000\n */\n duration?: number;\n /**\n * Toasts visible at once. The rest wait in a queue and appear as others close.\n * @default 3\n */\n max?: number;\n /** @default 'bottom-end' */\n placement?: ToastPlacement;\n /**\n * Accessible name of the notification region.\n * @default 'Notifications'\n */\n label?: string;\n /**\n * Key that moves focus to the newest toast, so keyboard users can reach its buttons.\n * @default 'F8'\n */\n hotkey?: string;\n /**\n * Accessible name of the dismiss button of each toast.\n * @default 'Dismiss notification'\n */\n dismissLabel?: string;\n}\n\n/**\n * Renders the toasts requested with `useToast`. Timers pause while the pointer is over the\n * toasts or focus is inside them, and new toasts are announced by a live region.\n */\nexport function ToastProvider({\n children,\n duration = 5000,\n max = 3,\n placement = 'bottom-end',\n label = 'Notifications',\n hotkey = 'F8',\n dismissLabel = 'Dismiss notification',\n}: ToastProviderProps) {\n const [toasts, setToasts] = useState<ToastData[]>([]);\n const [hovered, setHovered] = useState(false);\n const [focused, setFocused] = useState(false);\n const counter = useRef(0);\n const [list, setList] = useState<HTMLOListElement | null>(null);\n const toastsRef = useRef(toasts);\n const listRef = useRef(list);\n const returnFocus = useRef<HTMLElement | null>(null);\n const pendingFocus = useRef<HTMLElement | null>(null);\n\n useEffect(() => {\n toastsRef.current = toasts;\n listRef.current = list;\n });\n\n useEffect(() => {\n pendingFocus.current?.focus();\n pendingFocus.current = null;\n }, [toasts]);\n\n const dismiss = useCallback((id?: string) => {\n const closing = toastsRef.current.filter((toast) => id === undefined || toast.id === id);\n for (const toast of closing) toast.onDismiss?.();\n\n // Removing the toast that holds focus would drop it on the page body.\n const items = [...(listRef.current?.querySelectorAll<HTMLElement>('[data-toast]') ?? [])];\n const isClosing = (item: HTMLElement) =>\n closing.some((toast) => toast.id === item.dataset.toast);\n if (items.some((item) => isClosing(item) && item.contains(document.activeElement))) {\n const remaining = items.filter((item) => !isClosing(item)).at(-1);\n const previous = returnFocus.current?.isConnected ? returnFocus.current : null;\n pendingFocus.current = previous ?? remaining ?? null;\n if (pendingFocus.current !== remaining) setFocused(false);\n }\n\n setToasts((current) => (id === undefined ? [] : current.filter((toast) => toast.id !== id)));\n }, []);\n\n const toast = useCallback((options: ToastOptions) => {\n const id = options.id ?? `toast-${++counter.current}`;\n setToasts((current) => {\n const index = current.findIndex((item) => item.id === id);\n if (index === -1) return [...current, { ...options, id }];\n return current.map((item, position) => (position === index ? { ...options, id } : item));\n });\n return id;\n }, []);\n\n useEffect(() => {\n if (!list) return;\n\n const onHotkey = (event: KeyboardEvent) => {\n if (event.key !== hotkey) return;\n const newest = [...list.querySelectorAll<HTMLElement>('[data-toast]')].at(-1);\n if (!newest) return;\n event.preventDefault();\n if (!list.contains(document.activeElement)) {\n returnFocus.current = document.activeElement as HTMLElement | null;\n }\n newest.focus();\n };\n const onEscape = (event: KeyboardEvent) => {\n const item = (event.target as Element).closest<HTMLElement>('[data-toast]');\n if (event.key !== 'Escape' || !item?.dataset.toast) return;\n event.stopPropagation();\n dismiss(item.dataset.toast);\n };\n const onPointerEnter = () => setHovered(true);\n const onPointerLeave = () => setHovered(false);\n const onFocusIn = () => setFocused(true);\n const onFocusOut = (event: FocusEvent) => {\n if (list.contains(event.relatedTarget as Node | null)) return;\n setFocused(false);\n returnFocus.current = null;\n };\n\n document.addEventListener('keydown', onHotkey);\n list.addEventListener('keydown', onEscape);\n list.addEventListener('pointerenter', onPointerEnter);\n list.addEventListener('pointerleave', onPointerLeave);\n list.addEventListener('focusin', onFocusIn);\n list.addEventListener('focusout', onFocusOut);\n return () => {\n document.removeEventListener('keydown', onHotkey);\n list.removeEventListener('keydown', onEscape);\n list.removeEventListener('pointerenter', onPointerEnter);\n list.removeEventListener('pointerleave', onPointerLeave);\n list.removeEventListener('focusin', onFocusIn);\n list.removeEventListener('focusout', onFocusOut);\n };\n }, [list, hotkey, dismiss]);\n\n const value = useMemo(() => ({ toast, dismiss }), [toast, dismiss]);\n const visible = toasts.slice(0, max);\n const paused = hovered || focused;\n\n return (\n <ToastContext.Provider value={value}>\n {children}\n <Portal>\n <section aria-label={label} className={cn(styles.viewport, placementClasses[placement])}>\n <ol\n ref={setList}\n className={styles.list}\n aria-live=\"polite\"\n aria-relevant=\"additions text\"\n >\n {visible.map((item) => (\n <ToastItem\n key={item.id}\n toast={item}\n duration={item.duration === undefined ? duration : item.duration}\n paused={paused}\n dismissLabel={dismissLabel}\n onDismiss={() => dismiss(item.id)}\n />\n ))}\n </ol>\n </section>\n </Portal>\n </ToastContext.Provider>\n );\n}\n\nconst icons: Record<ToastIntent, ReactNode> = {\n neutral: null,\n info: <InfoIcon />,\n success: <SuccessIcon />,\n warning: <WarningIcon />,\n danger: <ErrorIcon />,\n};\n\ninterface ToastItemProps {\n toast: ToastData;\n duration: number | null;\n paused: boolean;\n dismissLabel: string;\n onDismiss: () => void;\n}\n\nfunction ToastItem({ toast, duration, paused, dismissLabel, onDismiss }: ToastItemProps) {\n const { title, description, intent = 'neutral', action } = toast;\n const remaining = useRef(duration);\n const onDismissRef = useRef(onDismiss);\n\n useEffect(() => {\n onDismissRef.current = onDismiss;\n });\n\n useEffect(() => {\n remaining.current = duration;\n }, [duration, toast]);\n\n useEffect(() => {\n if (paused || remaining.current === null) return;\n\n const start = Date.now();\n const timer = setTimeout(() => onDismissRef.current(), remaining.current);\n return () => {\n clearTimeout(timer);\n if (remaining.current !== null) remaining.current -= Date.now() - start;\n };\n }, [paused, duration, toast]);\n\n return (\n <li\n data-toast={toast.id}\n role={intent === 'danger' ? 'alert' : undefined}\n tabIndex={-1}\n className={cn(styles.toast, styles[intent])}\n >\n {icons[intent] && (\n <span className={styles.icon} aria-hidden=\"true\">\n {icons[intent]}\n </span>\n )}\n <div className={styles.content}>\n <p className={styles.title}>{title}</p>\n {description !== undefined && <div className={styles.description}>{description}</div>}\n {action && (\n <Button\n size=\"sm\"\n variant=\"secondary\"\n className={styles.action}\n onClick={() => {\n action.onClick();\n onDismiss();\n }}\n >\n {action.label}\n </Button>\n )}\n </div>\n <IconButton label={dismissLabel} size=\"sm\" className={styles.dismiss} onClick={onDismiss}>\n <CloseIcon />\n </IconButton>\n </li>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ // src/components/Toast/Toast.module.css
2
+ var e = "onyx-viewport-5YhJF", t = "onyx-topStart-0XZdj", n = "onyx-topCenter-zZRNd", r = "onyx-topEnd-FVWcz", i = "onyx-bottomStart-6E4W-", a = "onyx-bottomCenter-F5vQK", o = "onyx-bottomEnd-L7DQ-", s = "onyx-list-f-3zk", c = "onyx-toast-FLdHz", l = "onyx-toast-in-s3-NH", u = "onyx-info-eq5bQ", d = "onyx-success-Oy694", f = "onyx-warning-84GC8", p = "onyx-danger-zx8Tv", m = "onyx-icon-VwvE1", h = "onyx-content-U6Xwq", g = "onyx-title--H6R2", _ = "onyx-description--QwfC", v = "onyx-action--b4jg", y = "onyx-dismiss-fj0MP", b = "onyx-toast-in-top-jN2e1", x = {
3
+ viewport: e,
4
+ topStart: t,
5
+ topCenter: n,
6
+ topEnd: r,
7
+ bottomStart: i,
8
+ bottomCenter: a,
9
+ bottomEnd: o,
10
+ list: s,
11
+ toast: c,
12
+ toastIn: l,
13
+ info: u,
14
+ success: d,
15
+ warning: f,
16
+ danger: p,
17
+ icon: m,
18
+ content: h,
19
+ title: g,
20
+ description: _,
21
+ action: v,
22
+ dismiss: y,
23
+ toastInTop: b
24
+ };
25
+ export { v as action, a as bottomCenter, o as bottomEnd, i as bottomStart, h as content, p as danger, x as default, _ as description, y as dismiss, m as icon, u as info, s as list, d as success, g as title, c as toast, l as toastIn, b as toastInTop, n as topCenter, r as topEnd, t as topStart, e as viewport, f as warning };
26
+
27
+ //# sourceMappingURL=Toast.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Toast.module.js","names":["viewport","topStart","topCenter","topEnd","bottomStart","bottomCenter","bottomEnd","list","toast","toastIn","info","success","warning","danger","icon","content","title","description","action","dismiss","toastInTop","Toast_module_default"],"sources":["../../../src/components/Toast/Toast.module.css"],"sourcesContent":[".viewport {\n position: fixed;\n z-index: var(--z-index-toast);\n display: flex;\n width: min(var(--size-overlay-sm), calc(100% - var(--space-4) * 2));\n max-height: 100dvh;\n padding: var(--space-4);\n pointer-events: none;\n box-sizing: content-box;\n}\n\n.topStart,\n.topCenter,\n.topEnd {\n top: 0;\n}\n\n.bottomStart,\n.bottomCenter,\n.bottomEnd {\n bottom: 0;\n}\n\n.topStart,\n.bottomStart {\n inset-inline-start: 0;\n}\n\n.topEnd,\n.bottomEnd {\n inset-inline-end: 0;\n}\n\n.topCenter,\n.bottomCenter {\n left: 50%;\n translate: -50%;\n}\n\n.list {\n display: flex;\n flex: 1;\n flex-direction: column;\n gap: var(--space-2);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n:is(.bottomStart, .bottomCenter, .bottomEnd) .list {\n justify-content: flex-end;\n}\n\n.toast {\n --toast-accent: var(--color-text-muted);\n\n display: flex;\n gap: var(--space-3);\n align-items: flex-start;\n padding: var(--space-3) var(--space-3) var(--space-3) var(--space-4);\n font-size: var(--font-size-sm);\n line-height: var(--line-height-normal);\n color: var(--color-text);\n pointer-events: auto;\n background-color: var(--color-surface-raised);\n border: var(--border-width-thin) solid var(--color-border);\n border-radius: var(--radius-lg);\n box-shadow: var(--shadow-lg);\n animation: toast-in var(--duration-normal) var(--easing-enter);\n}\n\n.toast:focus-visible {\n outline: var(--focus-ring-width) solid var(--color-focus);\n outline-offset: var(--focus-ring-offset);\n}\n\n.info {\n --toast-accent: var(--color-info-text);\n}\n\n.success {\n --toast-accent: var(--color-success-text);\n}\n\n.warning {\n --toast-accent: var(--color-warning-text);\n}\n\n.danger {\n --toast-accent: var(--color-danger-text);\n}\n\n.icon {\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n height: 1lh;\n color: var(--toast-accent);\n}\n\n.icon > svg {\n width: var(--size-icon-md);\n height: var(--size-icon-md);\n}\n\n.content {\n display: grid;\n flex: 1;\n gap: var(--space-1);\n min-width: 0;\n}\n\n.title {\n margin: 0;\n font-weight: var(--font-weight-semibold);\n}\n\n.description {\n color: var(--color-text-muted);\n}\n\n.action {\n justify-self: start;\n margin-top: var(--space-1);\n}\n\n.dismiss {\n margin-block: calc(var(--space-1) * -1);\n}\n\n@keyframes toast-in {\n from {\n opacity: 0;\n translate: 0 var(--space-2);\n }\n}\n\n:is(.topStart, .topCenter, .topEnd) .toast {\n animation-name: toast-in-top;\n}\n\n@keyframes toast-in-top {\n from {\n opacity: 0;\n translate: 0 calc(var(--space-2) * -1);\n }\n}\n"],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export { ToastProvider, useToast } from './Toast.js';
2
+ export type { ToastContextValue, ToastIntent, ToastOptions, ToastPlacement, ToastProviderProps, } from './Toast.js';
@@ -0,0 +1,40 @@
1
+ import { ReactElement, ReactNode } from 'react';
2
+ import { Placement } from '../../utils/floating.js';
3
+ export type TooltipPlacement = Placement;
4
+ export interface TooltipProps {
5
+ /** Text shown in the tooltip. Keep it short and never put interactive content in it. */
6
+ content: ReactNode;
7
+ /** The element that shows the tooltip. It must be focusable and accept a ref. */
8
+ children: ReactElement;
9
+ /** @default 'top' */
10
+ placement?: TooltipPlacement;
11
+ /**
12
+ * Milliseconds the pointer has to rest on the trigger before the tooltip opens. Keyboard focus
13
+ * opens it right away.
14
+ * @default 300
15
+ */
16
+ openDelay?: number;
17
+ /**
18
+ * Milliseconds before it closes after the pointer leaves, so it can be hovered.
19
+ * @default 100
20
+ */
21
+ closeDelay?: number;
22
+ /** Open state, for a controlled tooltip. */
23
+ open?: boolean;
24
+ /** @default false */
25
+ defaultOpen?: boolean;
26
+ onOpenChange?: (open: boolean) => void;
27
+ /**
28
+ * Gap between the trigger and the tooltip, in pixels.
29
+ * @default 8
30
+ */
31
+ offset?: number;
32
+ /** @default false */
33
+ disabled?: boolean;
34
+ className?: string;
35
+ }
36
+ /**
37
+ * Short description of an element, shown on hover and focus and linked with
38
+ * `aria-describedby`. Escape closes it; moving the pointer onto it keeps it open.
39
+ */
40
+ export declare function Tooltip({ content, children, placement, openDelay, closeDelay, open: openProp, defaultOpen, onOpenChange, offset, disabled, className, }: TooltipProps): import('react').JSX.Element;
@@ -0,0 +1,63 @@
1
+ "use client";
2
+ import { useControllableState as e } from "../../hooks/useControllableState.js";
3
+ import { cn as t } from "../../utils/cn.js";
4
+ import { mergeRefs as n } from "../../utils/mergeRefs.js";
5
+ import { useEscapeKey as r } from "../../hooks/useEscapeKey.js";
6
+ import { Portal as i } from "../Portal/Portal.js";
7
+ import { useTimeout as a } from "../../hooks/useTimeout.js";
8
+ import { useFloatingLayer as o } from "../../utils/floating.js";
9
+ import { getElementRef as s } from "../../utils/getElementRef.js";
10
+ import c from "./Tooltip.module.js";
11
+ import { cloneElement as l, isValidElement as u, useId as d, useMemo as f } from "react";
12
+ import { Fragment as p, jsx as m, jsxs as h } from "react/jsx-runtime";
13
+ // src/components/Tooltip/Tooltip.tsx
14
+ function g({ content: g, children: _, placement: v = "top", openDelay: y = 300, closeDelay: b = 100, open: x, defaultOpen: S = !1, onOpenChange: C, offset: w = 8, disabled: T = !1, className: E }) {
15
+ let D = d(), O = a(), [k, A] = e({
16
+ value: x,
17
+ defaultValue: S,
18
+ onChange: C
19
+ }), j = k && !T, { setReference: M, setFloating: N, floatingStyles: P, side: F } = o({
20
+ open: j,
21
+ placement: v,
22
+ gap: w
23
+ }), I = u(_) ? s(_) : void 0, L = f(() => n(M, I), [M, I]);
24
+ r(() => A(!1), { enabled: j });
25
+ let R = (e, t) => {
26
+ O.clear(), t <= 0 ? A(e) : O.set(() => A(e), t);
27
+ };
28
+ if (!u(_)) return _;
29
+ let z = _.props, B = l(_, {
30
+ ref: L,
31
+ "aria-describedby": t(z["aria-describedby"], !T && D) || void 0,
32
+ onPointerEnter: (e) => {
33
+ z.onPointerEnter?.(e), e.pointerType !== "touch" && R(!0, y);
34
+ },
35
+ onPointerLeave: (e) => {
36
+ z.onPointerLeave?.(e), R(!1, b);
37
+ },
38
+ onFocus: (e) => {
39
+ z.onFocus?.(e), R(!0, 0);
40
+ },
41
+ onBlur: (e) => {
42
+ z.onBlur?.(e), R(!1, 0);
43
+ }
44
+ });
45
+ return /* @__PURE__ */ h(p, { children: [B, j ? /* @__PURE__ */ m(i, { children: /* @__PURE__ */ m("div", {
46
+ ref: N,
47
+ id: D,
48
+ role: "tooltip",
49
+ "data-side": F,
50
+ className: t(c.tooltip, E),
51
+ style: P,
52
+ onPointerEnter: O.clear,
53
+ onPointerLeave: () => R(!1, b),
54
+ children: g
55
+ }) }) : !T && /* @__PURE__ */ m("span", {
56
+ id: D,
57
+ hidden: !0,
58
+ children: g
59
+ })] });
60
+ }
61
+ export { g as Tooltip };
62
+
63
+ //# sourceMappingURL=Tooltip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Tooltip.js","names":["_Fragment","styles","Tooltip_module_default","Tooltip","openProp","id","useId","timeout","useTimeout","openState","setOpen","useControllableState","defaultOpen","onOpenChange","open","disabled","useFloatingLayer","offset","childElementRef","isValidElement","children","getElementRef","attachTrigger","useMemo","mergeRefs","setReference","schedule","delay","next","childProps","trigger","cloneElement","cn","event","openDelay","closeDelay","Fragment","Portal","setFloating","side","className","floatingStyles","content"],"sources":["../../../src/components/Tooltip/Tooltip.tsx"],"sourcesContent":["import {\n cloneElement,\n isValidElement,\n useId,\n useMemo,\n type FocusEvent,\n type PointerEvent,\n type ReactElement,\n type ReactNode,\n} from 'react';\nimport { useControllableState } from '@/hooks/useControllableState';\nimport { useEscapeKey } from '@/hooks/useEscapeKey';\nimport { useTimeout } from '@/hooks/useTimeout';\nimport { cn } from '@/utils/cn';\nimport { useFloatingLayer, type Placement } from '@/utils/floating';\nimport { getElementRef } from '@/utils/getElementRef';\nimport { mergeRefs } from '@/utils/mergeRefs';\nimport { Portal } from '../Portal';\nimport styles from './Tooltip.module.css';\n\nexport type TooltipPlacement = Placement;\n\ninterface TriggerProps {\n 'aria-describedby'?: string;\n onPointerEnter?: (event: PointerEvent<HTMLElement>) => void;\n onPointerLeave?: (event: PointerEvent<HTMLElement>) => void;\n onFocus?: (event: FocusEvent<HTMLElement>) => void;\n onBlur?: (event: FocusEvent<HTMLElement>) => void;\n}\n\nexport interface TooltipProps {\n /** Text shown in the tooltip. Keep it short and never put interactive content in it. */\n content: ReactNode;\n /** The element that shows the tooltip. It must be focusable and accept a ref. */\n children: ReactElement;\n /** @default 'top' */\n placement?: TooltipPlacement;\n /**\n * Milliseconds the pointer has to rest on the trigger before the tooltip opens. Keyboard focus\n * opens it right away.\n * @default 300\n */\n openDelay?: number;\n /**\n * Milliseconds before it closes after the pointer leaves, so it can be hovered.\n * @default 100\n */\n closeDelay?: number;\n /** Open state, for a controlled tooltip. */\n open?: boolean;\n /** @default false */\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n /**\n * Gap between the trigger and the tooltip, in pixels.\n * @default 8\n */\n offset?: number;\n /** @default false */\n disabled?: boolean;\n className?: string;\n}\n\n/**\n * Short description of an element, shown on hover and focus and linked with\n * `aria-describedby`. Escape closes it; moving the pointer onto it keeps it open.\n */\nexport function Tooltip({\n content,\n children,\n placement = 'top',\n openDelay = 300,\n closeDelay = 100,\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n offset = 8,\n disabled = false,\n className,\n}: TooltipProps) {\n const id = useId();\n const timeout = useTimeout();\n const [openState, setOpen] = useControllableState({\n value: openProp,\n defaultValue: defaultOpen,\n onChange: onOpenChange,\n });\n const open = openState && !disabled;\n const { setReference, setFloating, floatingStyles, side } = useFloatingLayer({\n open,\n placement,\n gap: offset,\n });\n\n const childElementRef = isValidElement(children)\n ? getElementRef<HTMLElement>(children)\n : undefined;\n const attachTrigger = useMemo(\n () => mergeRefs(setReference, childElementRef),\n [setReference, childElementRef],\n );\n\n useEscapeKey(() => setOpen(false), { enabled: open });\n\n const schedule = (next: boolean, delay: number) => {\n timeout.clear();\n if (delay <= 0) setOpen(next);\n else timeout.set(() => setOpen(next), delay);\n };\n\n if (!isValidElement<TriggerProps>(children)) return children;\n\n const childProps = children.props;\n const trigger = cloneElement(children, {\n ref: attachTrigger,\n 'aria-describedby': cn(childProps['aria-describedby'], !disabled && id) || undefined,\n onPointerEnter: (event: PointerEvent<HTMLElement>) => {\n childProps.onPointerEnter?.(event);\n if (event.pointerType !== 'touch') schedule(true, openDelay);\n },\n onPointerLeave: (event: PointerEvent<HTMLElement>) => {\n childProps.onPointerLeave?.(event);\n schedule(false, closeDelay);\n },\n onFocus: (event: FocusEvent<HTMLElement>) => {\n childProps.onFocus?.(event);\n schedule(true, 0);\n },\n onBlur: (event: FocusEvent<HTMLElement>) => {\n childProps.onBlur?.(event);\n schedule(false, 0);\n },\n } as TriggerProps & { ref: unknown });\n\n return (\n <>\n {trigger}\n {open ? (\n <Portal>\n <div\n ref={setFloating}\n id={id}\n role=\"tooltip\"\n data-side={side}\n className={cn(styles.tooltip, className)}\n style={floatingStyles}\n onPointerEnter={timeout.clear}\n onPointerLeave={() => schedule(false, closeDelay)}\n >\n {content}\n </div>\n </Portal>\n ) : (\n !disabled && (\n <span id={id} hidden>\n {content}\n </span>\n )\n )}\n </>\n );\n}\n"],"mappings":";;;;;;;;;;;;;AAmEA,SAAgBG,EAAQ,EACtB,YACA,aACA,eAAY,OACZ,eAAY,KACZ,gBAAa,KACb,MAAMC,GACN,iBAAc,IACd,iBACA,YAAS,GACT,cAAW,IACX,gBACe;CACf,IAAMC,IAAKC,EAAM,GACXC,IAAUC,EAAW,GACrB,CAACC,GAAWC,KAAWC,EAAqB;EAChD,OAAOP;EACP,cAAcQ;EACd,UAAUC;CACZ,CAAC,GACKC,IAAOL,KAAa,CAACM,GACrB,EAAE,iBAAc,gBAAa,mBAAgB,YAASC,EAAiB;EAC3E;EACA;EACA,KAAKC;CACP,CAAC,GAEKC,IAAkBC,EAAeC,CAAQ,IAC3CC,EAA2BD,CAAQ,IACnC,KAAA,GACEE,IAAgBC,QACdC,EAAUC,GAAcP,CAAe,GAC7C,CAACO,GAAcP,CAAe,CAChC;CAEA,QAAmBR,EAAQ,EAAK,GAAG,EAAE,SAASI,EAAK,CAAC;CAEpD,IAAMY,KAAY,GAAe,MAAkB;EAEjD,AADAnB,EAAQ,MAAM,GACVoB,KAAS,IAAGjB,EAAQkB,CAAI,IACvBrB,EAAQ,UAAUG,EAAQkB,CAAI,GAAGD,CAAK;CAC7C;CAEA,IAAI,CAACR,EAA6BC,CAAQ,GAAG,OAAOA;CAEpD,IAAMS,IAAaT,EAAS,OACtBU,IAAUC,EAAaX,GAAU;EACrC,KAAKE;EACL,oBAAoBU,EAAGH,EAAW,qBAAqB,CAACd,KAAYV,CAAE,KAAK,KAAA;EAC3E,iBAAiB,MAAqC;GAEpD,AADAwB,EAAW,iBAAiBI,CAAK,GAC7BA,EAAM,gBAAgB,WAASP,EAAS,IAAMQ,CAAS;EAC7D;EACA,iBAAiB,MAAqC;GAEpD,AADAL,EAAW,iBAAiBI,CAAK,GACjCP,EAAS,IAAOS,CAAU;EAC5B;EACA,UAAU,MAAmC;GAE3C,AADAN,EAAW,UAAUI,CAAK,GAC1BP,EAAS,IAAM,CAAC;EAClB;EACA,SAAS,MAAmC;GAE1C,AADAG,EAAW,SAASI,CAAK,GACzBP,EAAS,IAAO,CAAC;EACnB;CACF,CAAoC;CAEpC,OACE,kBAAA1B,GAAA,EAAA,UAAA,CACG8B,GACAhB,IACC,kBAACuB,GAAD,EAAA,UACE,kBAAC,OAAD;EACE,KAAKC;EACD;EACJ,MAAK;EACL,aAAWC;EACX,WAAWP,EAAG/B,EAAO,SAASuC,CAAS;EACvC,OAAOC;EACP,gBAAgBlC,EAAQ;EACxB,sBAAsBmB,EAAS,IAAOS,CAAU;EAE/C,UAAAO;CACE,CAAA,EACC,CAAA,IAER,CAAC3B,KACC,kBAAC,QAAD;EAAU;EAAI,QAAA;EACX,UAAA2B;CACG,CAAA,CAGV,EAAA,CAAA;AAEN"}
@@ -0,0 +1,8 @@
1
+ // src/components/Tooltip/Tooltip.module.css
2
+ var e = "onyx-tooltip-UA7H9", t = "onyx-tooltip-in-mJXdG", n = {
3
+ tooltip: e,
4
+ tooltipIn: t
5
+ };
6
+ export { n as default, e as tooltip, t as tooltipIn };
7
+
8
+ //# sourceMappingURL=Tooltip.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Tooltip.module.js","names":["tooltip","tooltipIn","Tooltip_module_default"],"sources":["../../../src/components/Tooltip/Tooltip.module.css"],"sourcesContent":[".tooltip {\n z-index: var(--z-index-tooltip);\n max-width: var(--size-tooltip);\n padding: var(--space-1) var(--space-2);\n font-size: var(--font-size-xs);\n line-height: var(--line-height-normal);\n color: var(--color-text-inverse);\n overflow-wrap: break-word;\n background-color: var(--color-bg-inverse);\n border-radius: var(--radius-md);\n box-shadow: var(--shadow-md);\n animation: tooltip-in var(--duration-fast) var(--easing-enter);\n}\n\n@keyframes tooltip-in {\n from {\n opacity: 0;\n }\n}\n"],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export { Tooltip } from './Tooltip.js';
2
+ export type { TooltipPlacement, TooltipProps } from './Tooltip.js';
@@ -0,0 +1,4 @@
1
+ import { ElementType } from 'react';
2
+ import { PolymorphicComponent, PolymorphicPropsWithRef } from '../../utils/polymorphic.js';
3
+ export type VisuallyHiddenProps<As extends ElementType = 'span'> = PolymorphicPropsWithRef<As>;
4
+ export declare const VisuallyHidden: PolymorphicComponent<"span">;
@@ -0,0 +1,16 @@
1
+ "use client";
2
+ import { cn as e } from "../../utils/cn.js";
3
+ import t from "./VisuallyHidden.module.js";
4
+ import { forwardRef as n } from "react";
5
+ import { jsx as r } from "react/jsx-runtime";
6
+ // src/components/VisuallyHidden/VisuallyHidden.tsx
7
+ var i = n(function({ as: n = "span", className: i, ...a }, o) {
8
+ return /* @__PURE__ */ r(n, {
9
+ ref: o,
10
+ className: e(t.visuallyHidden, i),
11
+ ...a
12
+ });
13
+ });
14
+ export { i as VisuallyHidden };
15
+
16
+ //# sourceMappingURL=VisuallyHidden.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VisuallyHidden.js","names":["styles","VisuallyHidden_module_default","VisuallyHidden","forwardRef","Component","props","cn","className"],"sources":["../../../src/components/VisuallyHidden/VisuallyHidden.tsx"],"sourcesContent":["import { forwardRef, type ElementType } from 'react';\nimport { cn } from '@/utils/cn';\nimport type {\n PolymorphicComponent,\n PolymorphicProps,\n PolymorphicPropsWithRef,\n} from '@/utils/polymorphic';\nimport styles from './VisuallyHidden.module.css';\n\nexport type VisuallyHiddenProps<As extends ElementType = 'span'> = PolymorphicPropsWithRef<As>;\n\nexport const VisuallyHidden = forwardRef<HTMLSpanElement, PolymorphicProps<'span'>>(\n function VisuallyHidden({ as: Component = 'span', className, ...props }, ref) {\n return <Component ref={ref} className={cn(styles.visuallyHidden, className)} {...props} />;\n },\n) as PolymorphicComponent<'span'>;\n"],"mappings":";;;;;;AAWA,IAAaE,IAAiBC,EAC5B,SAAwB,EAAE,IAAIC,IAAY,QAAQ,cAAW,GAAGC,KAAS,GAAK;CAC5E,OAAO,kBAACD,GAAD;EAAgB;EAAK,WAAWE,EAAGN,EAAO,gBAAgBO,CAAS;EAAG,GAAIF;CAAQ,CAAA;AAC3F,CACF"}
@@ -0,0 +1,5 @@
1
+ // src/components/VisuallyHidden/VisuallyHidden.module.css
2
+ var e = "onyx-visuallyHidden-KiAzg", t = { visuallyHidden: e };
3
+ export { t as default, e as visuallyHidden };
4
+
5
+ //# sourceMappingURL=VisuallyHidden.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VisuallyHidden.module.js","names":["visuallyHidden","VisuallyHidden_module_default"],"sources":["../../../src/components/VisuallyHidden/VisuallyHidden.module.css"],"sourcesContent":[".visuallyHidden {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n border: 0;\n}\n"],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export { VisuallyHidden } from './VisuallyHidden.js';
2
+ export type { VisuallyHiddenProps } from './VisuallyHidden.js';
@@ -0,0 +1,10 @@
1
+ export { useClickOutside } from './useClickOutside.js';
2
+ export type { UseClickOutsideOptions } from './useClickOutside.js';
3
+ export { useControllableState } from './useControllableState.js';
4
+ export type { UseControllableStateProps } from './useControllableState.js';
5
+ export { useEscapeKey } from './useEscapeKey.js';
6
+ export type { UseEscapeKeyOptions } from './useEscapeKey.js';
7
+ export { useFocusTrap } from './useFocusTrap.js';
8
+ export type { UseFocusTrapOptions } from './useFocusTrap.js';
9
+ export { useScrollLock } from './useScrollLock.js';
10
+ export type { UseScrollLockOptions } from './useScrollLock.js';
@@ -0,0 +1,10 @@
1
+ import { RefObject } from 'react';
2
+ export interface UseClickOutsideOptions {
3
+ /** @default true */
4
+ enabled?: boolean;
5
+ }
6
+ /**
7
+ * Calls `onClickOutside` when a pointer is pressed outside every element in `refs`. Include the
8
+ * element that toggles the layer, or pressing it closes and reopens the layer.
9
+ */
10
+ export declare function useClickOutside(refs: RefObject<Element | null> | readonly RefObject<Element | null>[], onClickOutside: (event: PointerEvent) => void, { enabled }?: UseClickOutsideOptions): void;
@@ -0,0 +1,21 @@
1
+ import { useLatestRef as e } from "./useLatestRef.js";
2
+ import { useEffect as t } from "react";
3
+ // src/hooks/useClickOutside.ts
4
+ function n(n, r, { enabled: i = !0 } = {}) {
5
+ let a = e(n), o = e(r);
6
+ t(() => {
7
+ if (!i) return;
8
+ let e = (e) => {
9
+ let t = e.composedPath();
10
+ [a.current].flat().some(({ current: e }) => e !== null && t.includes(e)) || o.current(e);
11
+ };
12
+ return document.addEventListener("pointerdown", e, !0), () => document.removeEventListener("pointerdown", e, !0);
13
+ }, [
14
+ i,
15
+ a,
16
+ o
17
+ ]);
18
+ }
19
+ export { n as useClickOutside };
20
+
21
+ //# sourceMappingURL=useClickOutside.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useClickOutside.js","names":["useClickOutside","refsRef","useLatestRef","refs","onClickOutsideRef","onClickOutside","enabled","onPointerDown","path","event","current"],"sources":["../../src/hooks/useClickOutside.ts"],"sourcesContent":["import { useEffect, type RefObject } from 'react';\nimport { useLatestRef } from './useLatestRef';\n\nexport interface UseClickOutsideOptions {\n /** @default true */\n enabled?: boolean;\n}\n\n/**\n * Calls `onClickOutside` when a pointer is pressed outside every element in `refs`. Include the\n * element that toggles the layer, or pressing it closes and reopens the layer.\n */\nexport function useClickOutside(\n refs: RefObject<Element | null> | readonly RefObject<Element | null>[],\n onClickOutside: (event: PointerEvent) => void,\n { enabled = true }: UseClickOutsideOptions = {},\n): void {\n const refsRef = useLatestRef(refs);\n const onClickOutsideRef = useLatestRef(onClickOutside);\n\n useEffect(() => {\n if (!enabled) return;\n\n const onPointerDown = (event: PointerEvent) => {\n const path = event.composedPath();\n const inside = [refsRef.current]\n .flat()\n .some(({ current }) => current !== null && path.includes(current));\n\n if (!inside) onClickOutsideRef.current(event);\n };\n\n document.addEventListener('pointerdown', onPointerDown, true);\n return () => document.removeEventListener('pointerdown', onPointerDown, true);\n }, [enabled, refsRef, onClickOutsideRef]);\n}\n"],"mappings":";;;AAYA,SAAgBA,EACd,GACA,GACA,EAAE,aAAU,OAAiC,CAAC,GACxC;CACN,IAAMC,IAAUC,EAAaC,CAAI,GAC3BC,IAAoBF,EAAaG,CAAc;CAErD,QAAgB;EACd,IAAI,CAACC,GAAS;EAEd,IAAMC,KAAiB,MAAwB;GAC7C,IAAMC,IAAOC,EAAM,aAAa;GAKhC,AAJe,CAACR,EAAQ,OAAO,CAAC,CAC7B,KAAK,CAAC,CACN,MAAM,EAAE,iBAAcS,MAAY,QAAQF,EAAK,SAASE,CAAO,CAE7D,KAAQN,EAAkB,QAAQK,CAAK;EAC9C;EAGA,OADA,SAAS,iBAAiB,eAAeF,GAAe,EAAI,SAC/C,SAAS,oBAAoB,eAAeA,GAAe,EAAI;CAC9E,GAAG;EAACD;EAASL;EAASG;CAAiB,CAAC;AAC1C"}
@@ -0,0 +1,10 @@
1
+ import { Dispatch, SetStateAction } from 'react';
2
+ export interface UseControllableStateProps<T> {
3
+ /** Controlled value. While it is not `undefined`, the hook never changes it on its own. */
4
+ value?: T;
5
+ /** Initial value while uncontrolled. */
6
+ defaultValue: T;
7
+ /** Called with every new value, controlled or not. */
8
+ onChange?: (value: T) => void;
9
+ }
10
+ export declare function useControllableState<T>({ value, defaultValue, onChange, }: UseControllableStateProps<T>): [T, Dispatch<SetStateAction<T>>];
@@ -0,0 +1,16 @@
1
+ import { useCallback as e, useState as t } from "react";
2
+ // src/hooks/useControllableState.ts
3
+ function n({ value: n, defaultValue: r, onChange: i }) {
4
+ let [a, o] = t(r), s = n !== void 0, c = s ? n : a;
5
+ return [c, e((e) => {
6
+ let t = typeof e == "function" ? e(c) : e;
7
+ Object.is(t, c) || (s || o(t), i?.(t));
8
+ }, [
9
+ c,
10
+ s,
11
+ i
12
+ ])];
13
+ }
14
+ export { n as useControllableState };
15
+
16
+ //# sourceMappingURL=useControllableState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useControllableState.js","names":["useControllableState","uncontrolledValue","setUncontrolledValue","useState","defaultValue","isControlled","value","current","useCallback","resolved","next","onChange"],"sources":["../../src/hooks/useControllableState.ts"],"sourcesContent":["import { useCallback, useState, type Dispatch, type SetStateAction } from 'react';\n\nexport interface UseControllableStateProps<T> {\n /** Controlled value. While it is not `undefined`, the hook never changes it on its own. */\n value?: T;\n /** Initial value while uncontrolled. */\n defaultValue: T;\n /** Called with every new value, controlled or not. */\n onChange?: (value: T) => void;\n}\n\nexport function useControllableState<T>({\n value,\n defaultValue,\n onChange,\n}: UseControllableStateProps<T>): [T, Dispatch<SetStateAction<T>>] {\n const [uncontrolledValue, setUncontrolledValue] = useState(defaultValue);\n const isControlled = value !== undefined;\n const current = isControlled ? value : uncontrolledValue;\n\n const setValue = useCallback(\n (next: SetStateAction<T>) => {\n const resolved = typeof next === 'function' ? (next as (previous: T) => T)(current) : next;\n if (Object.is(resolved, current)) return;\n\n if (!isControlled) setUncontrolledValue(resolved);\n onChange?.(resolved);\n },\n [current, isControlled, onChange],\n );\n\n return [current, setValue];\n}\n"],"mappings":";;AAWA,SAAgBA,EAAwB,EACtC,UACA,iBACA,eACiE;CACjE,IAAM,CAACC,GAAmBC,KAAwBC,EAASC,CAAY,GACjEC,IAAeC,MAAU,KAAA,GACzBC,IAAUF,IAAeC,IAAQL;CAavC,OAAO,CAACM,GAXSC,GACd,MAA4B;EAC3B,IAAMC,IAAW,OAAOC,KAAS,aAAcA,EAA4BH,CAAO,IAAIG;EACtF,AAAI,OAAO,GAAGD,GAAUF,CAAO,MAE1BF,KAAcH,EAAqBO,CAAQ,GAChDE,IAAWF,CAAQ;CACrB,GACA;EAACF;EAASF;EAAcM;CAAQ,CAGjB,CAAQ;AAC3B"}
@@ -0,0 +1,9 @@
1
+ export interface UseEscapeKeyOptions {
2
+ /** @default true */
3
+ enabled?: boolean;
4
+ }
5
+ /**
6
+ * Calls `onEscape` when Escape is pressed. With several enabled at once, only the most recently
7
+ * enabled one responds, so nested overlays close one at a time.
8
+ */
9
+ export declare function useEscapeKey(onEscape: (event: KeyboardEvent) => void, { enabled }?: UseEscapeKeyOptions): void;
@@ -0,0 +1,21 @@
1
+ import { useLatestRef as e } from "./useLatestRef.js";
2
+ import { useEffect as t } from "react";
3
+ // src/hooks/useEscapeKey.ts
4
+ var n = [];
5
+ function r(r, { enabled: i = !0 } = {}) {
6
+ let a = e(r);
7
+ t(() => {
8
+ if (!i) return;
9
+ let e = {};
10
+ n.push(e);
11
+ let t = (t) => {
12
+ t.key !== "Escape" || t.isComposing || t.defaultPrevented || n.at(-1) === e && a.current(t);
13
+ };
14
+ return document.addEventListener("keydown", t), () => {
15
+ document.removeEventListener("keydown", t), n.splice(n.indexOf(e), 1);
16
+ };
17
+ }, [i, a]);
18
+ }
19
+ export { r as useEscapeKey };
20
+
21
+ //# sourceMappingURL=useEscapeKey.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useEscapeKey.js","names":["layers","useEscapeKey","onEscapeRef","useLatestRef","onEscape","enabled","layer","onKeyDown","event"],"sources":["../../src/hooks/useEscapeKey.ts"],"sourcesContent":["import { useEffect } from 'react';\nimport { useLatestRef } from './useLatestRef';\n\nexport interface UseEscapeKeyOptions {\n /** @default true */\n enabled?: boolean;\n}\n\nconst layers: object[] = [];\n\n/**\n * Calls `onEscape` when Escape is pressed. With several enabled at once, only the most recently\n * enabled one responds, so nested overlays close one at a time.\n */\nexport function useEscapeKey(\n onEscape: (event: KeyboardEvent) => void,\n { enabled = true }: UseEscapeKeyOptions = {},\n): void {\n const onEscapeRef = useLatestRef(onEscape);\n\n useEffect(() => {\n if (!enabled) return;\n\n const layer = {};\n layers.push(layer);\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key !== 'Escape' || event.isComposing || event.defaultPrevented) return;\n if (layers.at(-1) === layer) onEscapeRef.current(event);\n };\n\n document.addEventListener('keydown', onKeyDown);\n return () => {\n document.removeEventListener('keydown', onKeyDown);\n layers.splice(layers.indexOf(layer), 1);\n };\n }, [enabled, onEscapeRef]);\n}\n"],"mappings":";;;AAQA,IAAMA,IAAmB,CAAC;AAM1B,SAAgBC,EACd,GACA,EAAE,aAAU,OAA8B,CAAC,GACrC;CACN,IAAMC,IAAcC,EAAaC,CAAQ;CAEzC,QAAgB;EACd,IAAI,CAACC,GAAS;EAEd,IAAMC,IAAQ,CAAC;EACf,EAAO,KAAKA,CAAK;EAEjB,IAAMC,KAAa,MAAyB;GAC1C,AAAIC,EAAM,QAAQ,YAAYA,EAAM,eAAeA,EAAM,oBACrDR,EAAO,GAAG,EAAE,MAAMM,KAAOJ,EAAY,QAAQM,CAAK;EACxD;EAGA,OADA,SAAS,iBAAiB,WAAWD,CAAS,SACjC;GAEX,AADA,SAAS,oBAAoB,WAAWA,CAAS,GACjDP,EAAO,OAAOA,EAAO,QAAQM,CAAK,GAAG,CAAC;EACxC;CACF,GAAG,CAACD,GAASH,CAAW,CAAC;AAC3B"}