@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,23 @@
1
+ import { ElementType } from 'react';
2
+ import { PolymorphicComponent, PolymorphicPropsWithRef } from '../../utils/polymorphic.js';
3
+ export type LinkVariant = 'default' | 'muted' | 'inherit';
4
+ export interface LinkOwnProps {
5
+ /**
6
+ * `inherit` takes the color of the surrounding text and relies on the underline.
7
+ * @default 'default'
8
+ */
9
+ variant?: LinkVariant;
10
+ /**
11
+ * Opens the link in a new tab, adds a safe `rel` and tells every user about it.
12
+ * @default false
13
+ */
14
+ external?: boolean;
15
+ /**
16
+ * Text announced after the link text when `external`.
17
+ * @default '(opens in a new tab)'
18
+ */
19
+ externalLabel?: string;
20
+ }
21
+ export type LinkProps<As extends ElementType = 'a'> = PolymorphicPropsWithRef<As, LinkOwnProps>;
22
+ /** Text link. Use `as` to render a router link while keeping the styles. */
23
+ export declare const Link: PolymorphicComponent<"a", LinkOwnProps>;
@@ -0,0 +1,27 @@
1
+ "use client";
2
+ import { cn as e } from "../../utils/cn.js";
3
+ import { ExternalLinkIcon as t } from "../Icon/icons.js";
4
+ import { VisuallyHidden as n } from "../VisuallyHidden/VisuallyHidden.js";
5
+ import r from "./Link.module.js";
6
+ import { forwardRef as i } from "react";
7
+ import { Fragment as a, jsx as o, jsxs as s } from "react/jsx-runtime";
8
+ // src/components/Link/Link.tsx
9
+ var c = i(function({ as: i = "a", variant: c = "default", external: l = !1, externalLabel: u = "(opens in a new tab)", className: d, children: f, ...p }, m) {
10
+ return /* @__PURE__ */ s(i, {
11
+ ref: m,
12
+ className: e(r.link, r[c], d),
13
+ ...l && {
14
+ target: "_blank",
15
+ rel: "noopener noreferrer"
16
+ },
17
+ ...p,
18
+ children: [f, l && /* @__PURE__ */ s(a, { children: [
19
+ " ",
20
+ /* @__PURE__ */ o(t, { className: r.externalIcon }),
21
+ /* @__PURE__ */ o(n, { children: u })
22
+ ] })]
23
+ });
24
+ });
25
+ export { c as Link };
26
+
27
+ //# sourceMappingURL=Link.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Link.js","names":["styles","_Fragment","Link_module_default","Link","forwardRef","Component","props","cn","variant","className","external","children","Fragment","ExternalLinkIcon","VisuallyHidden","externalLabel"],"sources":["../../../src/components/Link/Link.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 { ExternalLinkIcon } from '../Icon';\nimport { VisuallyHidden } from '../VisuallyHidden';\nimport styles from './Link.module.css';\n\nexport type LinkVariant = 'default' | 'muted' | 'inherit';\n\nexport interface LinkOwnProps {\n /**\n * `inherit` takes the color of the surrounding text and relies on the underline.\n * @default 'default'\n */\n variant?: LinkVariant;\n /**\n * Opens the link in a new tab, adds a safe `rel` and tells every user about it.\n * @default false\n */\n external?: boolean;\n /**\n * Text announced after the link text when `external`.\n * @default '(opens in a new tab)'\n */\n externalLabel?: string;\n}\n\nexport type LinkProps<As extends ElementType = 'a'> = PolymorphicPropsWithRef<As, LinkOwnProps>;\n\n/** Text link. Use `as` to render a router link while keeping the styles. */\nexport const Link = forwardRef<HTMLAnchorElement, PolymorphicProps<'a', LinkOwnProps>>(\n function Link(\n {\n as: Component = 'a',\n variant = 'default',\n external = false,\n externalLabel = '(opens in a new tab)',\n className,\n children,\n ...props\n },\n ref,\n ) {\n return (\n <Component\n ref={ref}\n className={cn(styles.link, styles[variant], className)}\n {...(external && { target: '_blank', rel: 'noopener noreferrer' })}\n {...props}\n >\n {children}\n {external && (\n <>\n {' '}\n <ExternalLinkIcon className={styles.externalIcon} />\n <VisuallyHidden>{externalLabel}</VisuallyHidden>\n </>\n )}\n </Component>\n );\n },\n) as PolymorphicComponent<'a', LinkOwnProps>;\n"],"mappings":";;;;;;;;AAkCA,IAAaG,IAAOC,EAClB,SACE,EACE,IAAIC,IAAY,KAChB,aAAU,WACV,cAAW,IACX,mBAAgB,wBAChB,cACA,aACA,GAAGC,KAEL,GACA;CACA,OACE,kBAACD,GAAD;EACO;EACL,WAAWE,EAAGP,EAAO,MAAMA,EAAOQ,IAAUC,CAAS;EACrD,GAAKC,KAAY;GAAE,QAAQ;GAAU,KAAK;EAAsB;EAChE,GAAIJ;EAJN,UAAA,CAMGK,GACAD,KACC,kBAAAT,GAAA,EAAA,UAAA;GACG;GACD,kBAACY,GAAD,EAAkB,WAAWb,EAAO,aAAe,CAAA;GACnD,kBAACc,GAAD,EAAA,UAAiBC,EAA8B,CAAA;EAC/C,EAAA,CAAA,CAEK;;AAEf,CACF"}
@@ -0,0 +1,11 @@
1
+ // src/components/Link/Link.module.css
2
+ var e = "onyx-link-Ly-e3 onyx-focusRing-qmcYD", t = "onyx-muted-fS2v1", n = "onyx-inherit-5mXEJ", r = "onyx-externalIcon-5jtwn", i = {
3
+ link: e,
4
+ default: "onyx-default-RuJIr",
5
+ muted: t,
6
+ inherit: n,
7
+ externalIcon: r
8
+ };
9
+ export { i as default, r as externalIcon, n as inherit, e as link, t as muted };
10
+
11
+ //# sourceMappingURL=Link.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Link.module.js","names":["link","muted","inherit","externalIcon","Link_module_default","\"default\""],"sources":["../../../src/components/Link/Link.module.css"],"sourcesContent":[".link {\n composes: focusRing from '../../styles/focus-ring.module.css';\n text-decoration-line: underline;\n text-decoration-thickness: var(--border-width-thin);\n text-underline-offset: 0.2em;\n cursor: pointer;\n border-radius: var(--radius-sm);\n transition-timing-function: var(--easing-standard);\n transition-duration: var(--duration-fast);\n transition-property: color, text-decoration-color, text-decoration-thickness;\n}\n\n.link:hover {\n text-decoration-thickness: var(--border-width-thick);\n}\n\n.default {\n color: var(--color-primary-text);\n}\n\n.default:active {\n color: var(--color-text);\n}\n\n.muted {\n color: var(--color-text-muted);\n}\n\n.muted:hover {\n color: var(--color-text);\n}\n\n.inherit {\n color: inherit;\n}\n\n.externalIcon {\n font-size: 0.875em;\n}\n"],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export { Link } from './Link.js';
2
+ export type { LinkOwnProps, LinkProps, LinkVariant } from './Link.js';
@@ -0,0 +1,39 @@
1
+ import { ReactNode, RefObject } from 'react';
2
+ export interface DialogOptions {
3
+ /** Heading of the dialog, which also names it. */
4
+ title: ReactNode;
5
+ /** Text below the title that describes the dialog, linked with `aria-describedby`. */
6
+ description?: ReactNode;
7
+ /** Content of the dialog. */
8
+ children?: ReactNode;
9
+ /** Actions shown at the bottom, usually buttons. */
10
+ footer?: ReactNode;
11
+ /**
12
+ * Use `alertdialog` for urgent confirmations that need an answer.
13
+ * @default 'dialog'
14
+ */
15
+ role?: 'dialog' | 'alertdialog';
16
+ /** @default true */
17
+ closeOnOverlayClick?: boolean;
18
+ /** @default true */
19
+ closeOnEscape?: boolean;
20
+ /** Element focused on open. Defaults to the first focusable element. */
21
+ initialFocus?: RefObject<HTMLElement | null>;
22
+ /** @default false */
23
+ hideCloseButton?: boolean;
24
+ /**
25
+ * Accessible name of the close button.
26
+ * @default 'Close'
27
+ */
28
+ closeLabel?: string;
29
+ /** Class of the dialog panel. */
30
+ className?: string;
31
+ }
32
+ interface DialogSurfaceProps extends DialogOptions {
33
+ open: boolean;
34
+ onClose: () => void;
35
+ panelClassName?: string;
36
+ rootClassName?: string;
37
+ }
38
+ export declare const DialogSurface: import('react').ForwardRefExoticComponent<DialogSurfaceProps & import('react').RefAttributes<HTMLDivElement>>;
39
+ export {};
@@ -0,0 +1,69 @@
1
+ "use client";
2
+ import { cn as e } from "../../utils/cn.js";
3
+ import { CloseIcon as t } from "../Icon/icons.js";
4
+ import { IconButton as n } from "../IconButton/IconButton.js";
5
+ import { mergeRefs as r } from "../../utils/mergeRefs.js";
6
+ import { useClickOutside as i } from "../../hooks/useClickOutside.js";
7
+ import { useEscapeKey as a } from "../../hooks/useEscapeKey.js";
8
+ import { useFocusTrap as o } from "../../hooks/useFocusTrap.js";
9
+ import { useScrollLock as s } from "../../hooks/useScrollLock.js";
10
+ import { Portal as c } from "../Portal/Portal.js";
11
+ import l from "./DialogSurface.module.js";
12
+ import { forwardRef as u, useId as d, useMemo as f, useRef as p } from "react";
13
+ import { jsx as m, jsxs as h } from "react/jsx-runtime";
14
+ // src/components/Modal/DialogSurface.tsx
15
+ var g = u(function({ open: u, onClose: g, title: _, description: v, children: y, footer: b, role: x = "dialog", closeOnOverlayClick: S = !0, closeOnEscape: C = !0, initialFocus: w, hideCloseButton: T = !1, closeLabel: E = "Close", className: D, panelClassName: O, rootClassName: k }, A) {
16
+ let j = d(), M = `${j}-title`, N = `${j}-description`, P = p(null), F = p(null), I = f(() => r(P, A), [A]), L = v != null;
17
+ return o(P, {
18
+ enabled: u,
19
+ initialFocus: w
20
+ }), s({ enabled: u }), a(g, { enabled: u && C }), i(P, (e) => {
21
+ e.target === F.current && g();
22
+ }, { enabled: u && S }), u ? /* @__PURE__ */ m(c, { children: /* @__PURE__ */ h("div", {
23
+ className: e(l.root, k),
24
+ children: [/* @__PURE__ */ m("div", {
25
+ ref: F,
26
+ className: l.backdrop,
27
+ "aria-hidden": "true"
28
+ }), /* @__PURE__ */ h("div", {
29
+ ref: I,
30
+ role: x,
31
+ "aria-modal": "true",
32
+ "aria-labelledby": M,
33
+ "aria-describedby": L ? N : void 0,
34
+ tabIndex: -1,
35
+ className: e(l.panel, O, D),
36
+ children: [
37
+ /* @__PURE__ */ h("header", {
38
+ className: l.header,
39
+ children: [/* @__PURE__ */ m("h2", {
40
+ id: M,
41
+ className: l.title,
42
+ children: _
43
+ }), !T && /* @__PURE__ */ m(n, {
44
+ label: E,
45
+ size: "sm",
46
+ className: l.close,
47
+ onClick: g,
48
+ children: /* @__PURE__ */ m(t, {})
49
+ })]
50
+ }),
51
+ /* @__PURE__ */ h("div", {
52
+ className: l.body,
53
+ children: [L && /* @__PURE__ */ m("p", {
54
+ id: N,
55
+ className: l.description,
56
+ children: v
57
+ }), y]
58
+ }),
59
+ b !== void 0 && /* @__PURE__ */ m("footer", {
60
+ className: l.footer,
61
+ children: b
62
+ })
63
+ ]
64
+ })]
65
+ }) }) : null;
66
+ });
67
+ export { g as DialogSurface };
68
+
69
+ //# sourceMappingURL=DialogSurface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DialogSurface.js","names":["styles","DialogSurface_module_default","DialogSurface","forwardRef","id","useId","titleId","descriptionId","panel","useRef","backdrop","attachPanel","useMemo","mergeRefs","ref","hasDescription","description","useFocusTrap","open","useScrollLock","useEscapeKey","onClose","closeOnEscape","useClickOutside","event","closeOnOverlayClick","Portal","cn","rootClassName","panelClassName","className","title","hideCloseButton","IconButton","closeLabel","CloseIcon","children","footer"],"sources":["../../../src/components/Modal/DialogSurface.tsx"],"sourcesContent":["import { forwardRef, useId, useMemo, useRef, type ReactNode, type RefObject } from 'react';\nimport { useClickOutside } from '@/hooks/useClickOutside';\nimport { useEscapeKey } from '@/hooks/useEscapeKey';\nimport { useFocusTrap } from '@/hooks/useFocusTrap';\nimport { useScrollLock } from '@/hooks/useScrollLock';\nimport { cn } from '@/utils/cn';\nimport { mergeRefs } from '@/utils/mergeRefs';\nimport { CloseIcon } from '../Icon';\nimport { IconButton } from '../IconButton';\nimport { Portal } from '../Portal';\nimport styles from './DialogSurface.module.css';\n\nexport interface DialogOptions {\n /** Heading of the dialog, which also names it. */\n title: ReactNode;\n /** Text below the title that describes the dialog, linked with `aria-describedby`. */\n description?: ReactNode;\n /** Content of the dialog. */\n children?: ReactNode;\n /** Actions shown at the bottom, usually buttons. */\n footer?: ReactNode;\n /**\n * Use `alertdialog` for urgent confirmations that need an answer.\n * @default 'dialog'\n */\n role?: 'dialog' | 'alertdialog';\n /** @default true */\n closeOnOverlayClick?: boolean;\n /** @default true */\n closeOnEscape?: boolean;\n /** Element focused on open. Defaults to the first focusable element. */\n initialFocus?: RefObject<HTMLElement | null>;\n /** @default false */\n hideCloseButton?: boolean;\n /**\n * Accessible name of the close button.\n * @default 'Close'\n */\n closeLabel?: string;\n /** Class of the dialog panel. */\n className?: string;\n}\n\ninterface DialogSurfaceProps extends DialogOptions {\n open: boolean;\n onClose: () => void;\n panelClassName?: string;\n rootClassName?: string;\n}\n\nexport const DialogSurface = forwardRef<HTMLDivElement, DialogSurfaceProps>(function DialogSurface(\n {\n open,\n onClose,\n title,\n description,\n children,\n footer,\n role = 'dialog',\n closeOnOverlayClick = true,\n closeOnEscape = true,\n initialFocus,\n hideCloseButton = false,\n closeLabel = 'Close',\n className,\n panelClassName,\n rootClassName,\n },\n ref,\n) {\n const id = useId();\n const titleId = `${id}-title`;\n const descriptionId = `${id}-description`;\n const panel = useRef<HTMLDivElement>(null);\n const backdrop = useRef<HTMLDivElement>(null);\n const attachPanel = useMemo(() => mergeRefs(panel, ref), [ref]);\n const hasDescription = description !== undefined && description !== null;\n\n useFocusTrap(panel, { enabled: open, initialFocus });\n useScrollLock({ enabled: open });\n useEscapeKey(onClose, { enabled: open && closeOnEscape });\n useClickOutside(\n panel,\n (event) => {\n if (event.target === backdrop.current) onClose();\n },\n { enabled: open && closeOnOverlayClick },\n );\n\n if (!open) return null;\n\n return (\n <Portal>\n <div className={cn(styles.root, rootClassName)}>\n <div ref={backdrop} className={styles.backdrop} aria-hidden=\"true\" />\n <div\n ref={attachPanel}\n role={role}\n aria-modal=\"true\"\n aria-labelledby={titleId}\n aria-describedby={hasDescription ? descriptionId : undefined}\n tabIndex={-1}\n className={cn(styles.panel, panelClassName, className)}\n >\n <header className={styles.header}>\n <h2 id={titleId} className={styles.title}>\n {title}\n </h2>\n {!hideCloseButton && (\n <IconButton label={closeLabel} size=\"sm\" className={styles.close} onClick={onClose}>\n <CloseIcon />\n </IconButton>\n )}\n </header>\n <div className={styles.body}>\n {hasDescription && (\n <p id={descriptionId} className={styles.description}>\n {description}\n </p>\n )}\n {children}\n </div>\n {footer !== undefined && <footer className={styles.footer}>{footer}</footer>}\n </div>\n </div>\n </Portal>\n );\n});\n"],"mappings":";;;;;;;;;;;;;;AAkDA,IAAaE,IAAgBC,EAA+C,SAC1E,EACE,SACA,YACA,UACA,gBACA,aACA,WACA,UAAO,UACP,yBAAsB,IACtB,mBAAgB,IAChB,iBACA,qBAAkB,IAClB,gBAAa,SACb,cACA,mBACA,oBAEF,GACA;CACA,IAAMC,IAAKC,EAAM,GACXC,IAAU,GAAGF,EAAG,SAChBG,IAAgB,GAAGH,EAAG,eACtBI,IAAQC,EAAuB,IAAI,GACnCC,IAAWD,EAAuB,IAAI,GACtCE,IAAcC,QAAcC,EAAUL,GAAOM,CAAG,GAAG,CAACA,CAAG,CAAC,GACxDC,IAAiBC,KAA6C;CAepE,OAbAC,EAAaT,GAAO;EAAE,SAASU;EAAM;CAAa,CAAC,GACnDC,EAAc,EAAE,SAASD,EAAK,CAAC,GAC/BE,EAAaC,GAAS,EAAE,SAASH,KAAQI,EAAc,CAAC,GACxDC,EACEf,IACC,MAAU;EACT,AAAIgB,EAAM,WAAWd,EAAS,WAASW,EAAQ;CACjD,GACA,EAAE,SAASH,KAAQO,EAAoB,CACzC,GAEKP,IAGH,kBAACQ,GAAD,EAAA,UACE,kBAAC,OAAD;EAAK,WAAWC,EAAG3B,EAAO,MAAM4B,CAAa;EAA7C,UAAA,CACE,kBAAC,OAAD;GAAK,KAAKlB;GAAU,WAAWV,EAAO;GAAU,eAAY;EAAQ,CAAA,GACpE,kBAAC,OAAD;GACE,KAAKW;GACC;GACN,cAAW;GACX,mBAAiBL;GACjB,oBAAkBS,IAAiBR,IAAgB,KAAA;GACnD,UAAU;GACV,WAAWoB,EAAG3B,EAAO,OAAO6B,GAAgBC,CAAS;GAPvD,UAAA;IASE,kBAAC,UAAD;KAAQ,WAAW9B,EAAO;KAA1B,UAAA,CACE,kBAAC,MAAD;MAAI,IAAIM;MAAS,WAAWN,EAAO;MAChC,UAAA+B;KACC,CAAA,GACH,CAACC,KACA,kBAACC,GAAD;MAAY,OAAOC;MAAY,MAAK;MAAK,WAAWlC,EAAO;MAAO,SAASqB;MACzE,UAAA,kBAACc,GAAD,CAAY,CAAA;KACF,CAAA,CAER;;IACR,kBAAC,OAAD;KAAK,WAAWnC,EAAO;KAAvB,UAAA,CACGe,KACC,kBAAC,KAAD;MAAG,IAAIR;MAAe,WAAWP,EAAO;MACrC,UAAAgB;KACA,CAAA,GAEJoB,CACE;;IACJC,MAAW,KAAA,KAAa,kBAAC,UAAD;KAAQ,WAAWrC,EAAO;KAAS,UAAAqC;IAAe,CAAA;GACxE;EACF,CAAA,CAAA;CACC,CAAA,EAAA,CAAA,IApCQ;AAsCpB,CAAC"}
@@ -0,0 +1,16 @@
1
+ // src/components/Modal/DialogSurface.module.css
2
+ var e = "onyx-root-t1dl-", t = "onyx-backdrop-VCObC", n = "onyx-fade-in-vHYBw", r = "onyx-panel-kvRPN", i = "onyx-header-lv6WX", a = "onyx-title-lB-A8", o = "onyx-close-5HTP4", s = "onyx-body-Sllai", c = "onyx-description--yJR3", l = "onyx-footer-duSFf", u = {
3
+ root: e,
4
+ backdrop: t,
5
+ fadeIn: n,
6
+ panel: r,
7
+ header: i,
8
+ title: a,
9
+ close: o,
10
+ body: s,
11
+ description: c,
12
+ footer: l
13
+ };
14
+ export { t as backdrop, s as body, o as close, u as default, c as description, n as fadeIn, l as footer, i as header, r as panel, e as root, a as title };
15
+
16
+ //# sourceMappingURL=DialogSurface.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DialogSurface.module.js","names":["root","backdrop","fadeIn","panel","header","title","close","body","description","footer","DialogSurface_module_default"],"sources":["../../../src/components/Modal/DialogSurface.module.css"],"sourcesContent":[".root {\n position: fixed;\n inset: 0;\n z-index: var(--z-index-modal);\n display: flex;\n}\n\n.backdrop {\n position: absolute;\n inset: 0;\n background-color: var(--color-backdrop);\n animation: fade-in var(--duration-normal) var(--easing-enter);\n}\n\n.panel {\n position: relative;\n display: flex;\n flex-direction: column;\n max-height: 100%;\n color: var(--color-text);\n background-color: var(--color-surface-raised);\n box-shadow: var(--shadow-xl);\n outline: none;\n}\n\n.panel:focus-visible {\n outline: var(--focus-ring-width) solid var(--color-focus);\n outline-offset: calc(var(--focus-ring-width) * -1);\n}\n\n.header {\n display: flex;\n flex-shrink: 0;\n gap: var(--space-3);\n align-items: flex-start;\n justify-content: space-between;\n padding: var(--space-5) var(--space-5) var(--space-3) var(--space-6);\n}\n\n.title {\n margin: 0;\n padding-top: var(--space-1);\n font-size: var(--font-size-lg);\n font-weight: var(--font-weight-semibold);\n line-height: var(--line-height-snug);\n}\n\n.close {\n flex-shrink: 0;\n}\n\n.body {\n display: grid;\n flex: 1;\n gap: var(--space-4);\n align-content: start;\n min-height: 0;\n padding: 0 var(--space-6) var(--space-6);\n overflow-y: auto;\n font-size: var(--font-size-sm);\n line-height: var(--line-height-normal);\n}\n\n.description {\n margin: 0;\n color: var(--color-text-muted);\n}\n\n.footer {\n display: flex;\n flex-shrink: 0;\n flex-wrap: wrap;\n gap: var(--space-3);\n justify-content: flex-end;\n padding: var(--space-4) var(--space-6);\n border-top: var(--border-width-thin) solid var(--color-border);\n}\n\n@keyframes fade-in {\n from {\n opacity: 0;\n }\n}\n"],"mappings":""}
@@ -0,0 +1,34 @@
1
+ import { MouseEvent, ReactElement } from 'react';
2
+ import { DialogOptions } from './DialogSurface.js';
3
+ export type ModalSize = 'sm' | 'md' | 'lg' | 'full';
4
+ export interface DialogStateProps {
5
+ /** Open state, for a controlled dialog. */
6
+ open?: boolean;
7
+ /** @default false */
8
+ defaultOpen?: boolean;
9
+ /** Called when the dialog asks to open or close. */
10
+ onOpenChange?: (open: boolean) => void;
11
+ /**
12
+ * Element that opens the dialog when clicked, usually a `Button`. Focus returns to it when the
13
+ * dialog closes. Leave it out to control `open` yourself.
14
+ */
15
+ trigger?: ReactElement<{
16
+ onClick?: (event: MouseEvent<HTMLElement>) => void;
17
+ }>;
18
+ }
19
+ export interface ModalProps extends DialogOptions, DialogStateProps {
20
+ /** @default 'md' */
21
+ size?: ModalSize;
22
+ }
23
+ export declare function useDialogState({ open, defaultOpen, onOpenChange, trigger, }: DialogStateProps): {
24
+ isOpen: boolean;
25
+ close: () => void;
26
+ triggerElement: ReactElement<{
27
+ onClick?: (event: MouseEvent<HTMLElement>) => void;
28
+ }, string | import('react').JSXElementConstructor<any>> | null;
29
+ };
30
+ /**
31
+ * Dialog centered over the page. Focus moves into it and stays there, the page behind stops
32
+ * scrolling, and focus returns to the element that opened it on close.
33
+ */
34
+ export declare const Modal: import('react').ForwardRefExoticComponent<ModalProps & import('react').RefAttributes<HTMLDivElement>>;
@@ -0,0 +1,44 @@
1
+ "use client";
2
+ import { useControllableState as e } from "../../hooks/useControllableState.js";
3
+ import { cn as t } from "../../utils/cn.js";
4
+ import { DialogSurface as n } from "./DialogSurface.js";
5
+ import r from "./Modal.module.js";
6
+ import { cloneElement as i, forwardRef as a, isValidElement as o } from "react";
7
+ import { Fragment as s, jsx as c, jsxs as l } from "react/jsx-runtime";
8
+ // src/components/Modal/Modal.tsx
9
+ function u({ open: t, defaultOpen: n = !1, onOpenChange: r, trigger: a }) {
10
+ let [s, c] = e({
11
+ value: t,
12
+ defaultValue: n,
13
+ onChange: r
14
+ });
15
+ return {
16
+ isOpen: s,
17
+ close: () => c(!1),
18
+ triggerElement: o(a) ? i(a, {
19
+ "aria-haspopup": "dialog",
20
+ onClick: (e) => {
21
+ a.props.onClick?.(e), e.defaultPrevented || c(!0);
22
+ }
23
+ }) : null
24
+ };
25
+ }
26
+ var d = a(function({ open: e, defaultOpen: i, onOpenChange: a, trigger: o, size: d = "md", ...f }, p) {
27
+ let { isOpen: m, close: h, triggerElement: g } = u({
28
+ open: e,
29
+ defaultOpen: i,
30
+ onOpenChange: a,
31
+ trigger: o
32
+ });
33
+ return /* @__PURE__ */ l(s, { children: [g, /* @__PURE__ */ c(n, {
34
+ ref: p,
35
+ open: m,
36
+ onClose: h,
37
+ rootClassName: r.root,
38
+ panelClassName: t(r.panel, r[d]),
39
+ ...f
40
+ })] });
41
+ });
42
+ export { d as Modal, u as useDialogState };
43
+
44
+ //# sourceMappingURL=Modal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Modal.js","names":["_Fragment","styles","Modal_module_default","useDialogState","isOpen","setOpen","useControllableState","open","defaultOpen","onOpenChange","isValidElement","trigger","cloneElement","event","Modal","forwardRef","props","Fragment","triggerElement","DialogSurface","close","cn","size"],"sources":["../../../src/components/Modal/Modal.tsx"],"sourcesContent":["import {\n cloneElement,\n forwardRef,\n isValidElement,\n type MouseEvent,\n type ReactElement,\n} from 'react';\nimport { useControllableState } from '@/hooks/useControllableState';\nimport { cn } from '@/utils/cn';\nimport { DialogSurface, type DialogOptions } from './DialogSurface';\nimport styles from './Modal.module.css';\n\nexport type ModalSize = 'sm' | 'md' | 'lg' | 'full';\n\nexport interface DialogStateProps {\n /** Open state, for a controlled dialog. */\n open?: boolean;\n /** @default false */\n defaultOpen?: boolean;\n /** Called when the dialog asks to open or close. */\n onOpenChange?: (open: boolean) => void;\n /**\n * Element that opens the dialog when clicked, usually a `Button`. Focus returns to it when the\n * dialog closes. Leave it out to control `open` yourself.\n */\n trigger?: ReactElement<{ onClick?: (event: MouseEvent<HTMLElement>) => void }>;\n}\n\nexport interface ModalProps extends DialogOptions, DialogStateProps {\n /** @default 'md' */\n size?: ModalSize;\n}\n\nexport function useDialogState({\n open,\n defaultOpen = false,\n onOpenChange,\n trigger,\n}: DialogStateProps) {\n const [isOpen, setOpen] = useControllableState({\n value: open,\n defaultValue: defaultOpen,\n onChange: onOpenChange,\n });\n\n const triggerElement = isValidElement(trigger)\n ? cloneElement(trigger, {\n 'aria-haspopup': 'dialog',\n onClick: (event: MouseEvent<HTMLElement>) => {\n trigger.props.onClick?.(event);\n if (!event.defaultPrevented) setOpen(true);\n },\n } as object)\n : null;\n\n return { isOpen, close: () => setOpen(false), triggerElement };\n}\n\n/**\n * Dialog centered over the page. Focus moves into it and stays there, the page behind stops\n * scrolling, and focus returns to the element that opened it on close.\n */\nexport const Modal = forwardRef<HTMLDivElement, ModalProps>(function Modal(\n { open, defaultOpen, onOpenChange, trigger, size = 'md', ...props },\n ref,\n) {\n const { isOpen, close, triggerElement } = useDialogState({\n open,\n defaultOpen,\n onOpenChange,\n trigger,\n });\n\n return (\n <>\n {triggerElement}\n <DialogSurface\n ref={ref}\n open={isOpen}\n onClose={close}\n rootClassName={styles.root}\n panelClassName={cn(styles.panel, styles[size])}\n {...props}\n />\n </>\n );\n});\n"],"mappings":";;;;;;;;AAiCA,SAAgBG,EAAe,EAC7B,SACA,iBAAc,IACd,iBACA,cACmB;CACnB,IAAM,CAACC,GAAQC,KAAWC,EAAqB;EAC7C,OAAOC;EACP,cAAcC;EACd,UAAUC;CACZ,CAAC;CAYD,OAAO;EAAE;EAAQ,aAAaJ,EAAQ,EAAK;EAAG,gBAVvBK,EAAeC,CAAO,IACzCC,EAAaD,GAAS;GACpB,iBAAiB;GACjB,UAAU,MAAmC;IAE3C,AADAA,EAAQ,MAAM,UAAUE,CAAK,GACxBA,EAAM,oBAAkBR,EAAQ,EAAI;GAC3C;EACF,CAAW,IACX;CAEyD;AAC/D;AAMA,IAAaS,IAAQC,EAAuC,SAC1D,EAAE,SAAM,gBAAa,iBAAc,YAAS,UAAO,MAAM,GAAGC,KAC5D,GACA;CACA,IAAM,EAAE,WAAQ,UAAO,sBAAmBb,EAAe;EACvD;EACA;EACA;EACA;CACF,CAAC;CAED,OACE,kBAAAH,GAAA,EAAA,UAAA,CACGkB,GACD,kBAACC,GAAD;EACO;EACL,MAAMf;EACN,SAASgB;EACT,eAAenB,EAAO;EACtB,gBAAgBoB,EAAGpB,EAAO,OAAOA,EAAOqB,EAAK;EAC7C,GAAIN;CACL,CAAA,CACD,EAAA,CAAA;AAEN,CAAC"}
@@ -0,0 +1,13 @@
1
+ // src/components/Modal/Modal.module.css
2
+ var e = "onyx-root-ytPLl", t = "onyx-panel-lp9I7", n = "onyx-modal-in-dIaud", r = "onyx-sm-K5k3W", i = "onyx-md-gvyR7", a = "onyx-lg-BgB1a", o = "onyx-full-z-yai", s = {
3
+ root: e,
4
+ panel: t,
5
+ modalIn: n,
6
+ sm: r,
7
+ md: i,
8
+ lg: a,
9
+ full: o
10
+ };
11
+ export { s as default, o as full, a as lg, i as md, n as modalIn, t as panel, e as root, r as sm };
12
+
13
+ //# sourceMappingURL=Modal.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Modal.module.js","names":["root","panel","modalIn","sm","md","lg","full","Modal_module_default"],"sources":["../../../src/components/Modal/Modal.module.css"],"sourcesContent":[".root {\n align-items: center;\n justify-content: center;\n padding: var(--space-4);\n}\n\n.panel {\n width: 100%;\n border-radius: var(--radius-xl);\n animation: modal-in var(--duration-normal) var(--easing-enter);\n}\n\n.sm {\n max-width: var(--size-overlay-sm);\n}\n\n.md {\n max-width: var(--size-overlay-md);\n}\n\n.lg {\n max-width: var(--size-overlay-lg);\n}\n\n.full {\n max-width: none;\n height: 100%;\n}\n\n@keyframes modal-in {\n from {\n opacity: 0;\n scale: 0.96;\n }\n}\n\n@media (width < 640px) {\n .root {\n align-items: flex-end;\n padding: 0;\n }\n\n .panel {\n max-width: none;\n border-end-start-radius: 0;\n border-end-end-radius: 0;\n }\n\n .full {\n border-radius: 0;\n }\n}\n"],"mappings":""}
@@ -0,0 +1,3 @@
1
+ export { Modal } from './Modal.js';
2
+ export type { DialogStateProps, ModalProps, ModalSize } from './Modal.js';
3
+ export type { DialogOptions } from './DialogSurface.js';
@@ -0,0 +1,46 @@
1
+ import { HTMLAttributes } from 'react';
2
+ export type PaginationItem = number | 'ellipsis';
3
+ /**
4
+ * Pages to show: the first and last `boundaryCount` pages, `siblingCount` pages around the
5
+ * current one and `'ellipsis'` for the gaps. The number of items stays the same while the
6
+ * current page changes, so the buttons do not jump around.
7
+ */
8
+ export declare function getPaginationItems(page: number, count: number, siblingCount?: number, boundaryCount?: number): PaginationItem[];
9
+ export interface PaginationProps extends Omit<HTMLAttributes<HTMLElement>, 'onChange'> {
10
+ /** Number of pages. */
11
+ totalPages: number;
12
+ /** Current page, starting at 1, for a controlled pagination. */
13
+ page?: number;
14
+ /** @default 1 */
15
+ defaultPage?: number;
16
+ /** Called with the page the user chose. */
17
+ onPageChange?: (page: number) => void;
18
+ /**
19
+ * Pages shown on each side of the current page.
20
+ * @default 1
21
+ */
22
+ siblingCount?: number;
23
+ /**
24
+ * Pages always shown at the start and the end.
25
+ * @default 1
26
+ */
27
+ boundaryCount?: number;
28
+ /** @default 'md' */
29
+ size?: 'sm' | 'md';
30
+ /**
31
+ * Accessible name of the navigation landmark.
32
+ * @default 'Pagination'
33
+ */
34
+ 'aria-label'?: string;
35
+ /** @default 'Previous page' */
36
+ previousLabel?: string;
37
+ /** @default 'Next page' */
38
+ nextLabel?: string;
39
+ /**
40
+ * Accessible name of each page button.
41
+ * @default (page) => `Page ${page}`
42
+ */
43
+ getPageLabel?: (page: number) => string;
44
+ }
45
+ /** Moves between the pages of a long list. */
46
+ export declare const Pagination: import('react').ForwardRefExoticComponent<PaginationProps & import('react').RefAttributes<HTMLElement>>;
@@ -0,0 +1,71 @@
1
+ "use client";
2
+ import { useControllableState as e } from "../../hooks/useControllableState.js";
3
+ import { cn as t } from "../../utils/cn.js";
4
+ import { ChevronLeftIcon as n, ChevronRightIcon as r } from "../Icon/icons.js";
5
+ import i from "./Pagination.module.js";
6
+ import { forwardRef as a } from "react";
7
+ import { jsx as o, jsxs as s } from "react/jsx-runtime";
8
+ // src/components/Pagination/Pagination.tsx
9
+ function c(e, t, n = 1, r = 1) {
10
+ let i = (e, t) => Array.from({ length: Math.max(t - e + 1, 0) }, (t, n) => e + n), a = i(1, Math.min(r, t)), o = i(Math.max(t - r + 1, r + 1), t), s = Math.max(Math.min(e - n, t - r - n * 2 - 1), r + 2), c = Math.min(Math.max(e + n, r + n * 2 + 2), (o[0] ?? t + 1) - 2);
11
+ return [
12
+ ...a,
13
+ ...s > r + 2 ? ["ellipsis"] : r + 1 < t - r ? [r + 1] : [],
14
+ ...i(s, c),
15
+ ...c < t - r - 1 ? ["ellipsis"] : t - r > r ? [t - r] : [],
16
+ ...o
17
+ ];
18
+ }
19
+ var l = a(function({ totalPages: a, page: l, defaultPage: u = 1, onPageChange: d, siblingCount: f = 1, boundaryCount: p = 1, size: m = "md", "aria-label": h = "Pagination", previousLabel: g = "Previous page", nextLabel: _ = "Next page", getPageLabel: v = (e) => `Page ${e}`, className: y, ...b }, x) {
20
+ let [S, C] = e({
21
+ value: l,
22
+ defaultValue: u,
23
+ onChange: d
24
+ }), w = Math.max(a, 1), T = Math.min(Math.max(S, 1), w);
25
+ return /* @__PURE__ */ o("nav", {
26
+ ref: x,
27
+ "aria-label": h,
28
+ className: t(i.pagination, i[m], y),
29
+ ...b,
30
+ children: /* @__PURE__ */ s("ul", {
31
+ className: i.list,
32
+ children: [
33
+ /* @__PURE__ */ o("li", { children: /* @__PURE__ */ o("button", {
34
+ type: "button",
35
+ "aria-label": g,
36
+ className: t(i.button, i.step),
37
+ "aria-disabled": T <= 1 || void 0,
38
+ onClick: () => {
39
+ T > 1 && C(T - 1);
40
+ },
41
+ children: /* @__PURE__ */ o(n, { className: i.icon })
42
+ }) }),
43
+ c(T, w, f, p).map((e, t) => e === "ellipsis" ? /* @__PURE__ */ o("li", {
44
+ className: i.ellipsis,
45
+ "aria-hidden": "true",
46
+ children: "…"
47
+ }, `ellipsis-${t}`) : /* @__PURE__ */ o("li", { children: /* @__PURE__ */ o("button", {
48
+ type: "button",
49
+ "aria-label": v(e),
50
+ "aria-current": e === T ? "page" : void 0,
51
+ className: i.button,
52
+ onClick: () => C(e),
53
+ children: e
54
+ }) }, e)),
55
+ /* @__PURE__ */ o("li", { children: /* @__PURE__ */ o("button", {
56
+ type: "button",
57
+ "aria-label": _,
58
+ className: t(i.button, i.step),
59
+ "aria-disabled": T >= w || void 0,
60
+ onClick: () => {
61
+ T < w && C(T + 1);
62
+ },
63
+ children: /* @__PURE__ */ o(r, { className: i.icon })
64
+ }) })
65
+ ]
66
+ })
67
+ });
68
+ });
69
+ export { l as Pagination, c as getPaginationItems };
70
+
71
+ //# sourceMappingURL=Pagination.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Pagination.js","names":["styles","Pagination_module_default","getPaginationItems","range","end","start","index","startPages","boundaryCount","count","endPages","siblingsStart","page","siblingCount","siblingsEnd","Pagination","forwardRef","ariaLabel","value","props","current","setCurrent","useControllableState","defaultPage","onPageChange","total","totalPages","active","cn","size","className","previousLabel","ChevronLeftIcon","item","getPageLabel","nextLabel","ChevronRightIcon"],"sources":["../../../src/components/Pagination/Pagination.tsx"],"sourcesContent":["import { forwardRef, type HTMLAttributes } from 'react';\nimport { useControllableState } from '@/hooks/useControllableState';\nimport { cn } from '@/utils/cn';\nimport { ChevronLeftIcon, ChevronRightIcon } from '../Icon';\nimport styles from './Pagination.module.css';\n\nexport type PaginationItem = number | 'ellipsis';\n\n/**\n * Pages to show: the first and last `boundaryCount` pages, `siblingCount` pages around the\n * current one and `'ellipsis'` for the gaps. The number of items stays the same while the\n * current page changes, so the buttons do not jump around.\n */\nexport function getPaginationItems(\n page: number,\n count: number,\n siblingCount = 1,\n boundaryCount = 1,\n): PaginationItem[] {\n const range = (start: number, end: number) =>\n Array.from({ length: Math.max(end - start + 1, 0) }, (_, index) => start + index);\n\n const startPages = range(1, Math.min(boundaryCount, count));\n const endPages = range(Math.max(count - boundaryCount + 1, boundaryCount + 1), count);\n const siblingsStart = Math.max(\n Math.min(page - siblingCount, count - boundaryCount - siblingCount * 2 - 1),\n boundaryCount + 2,\n );\n const siblingsEnd = Math.min(\n Math.max(page + siblingCount, boundaryCount + siblingCount * 2 + 2),\n (endPages[0] ?? count + 1) - 2,\n );\n\n return [\n ...startPages,\n ...(siblingsStart > boundaryCount + 2\n ? (['ellipsis'] as const)\n : boundaryCount + 1 < count - boundaryCount\n ? [boundaryCount + 1]\n : []),\n ...range(siblingsStart, siblingsEnd),\n ...(siblingsEnd < count - boundaryCount - 1\n ? (['ellipsis'] as const)\n : count - boundaryCount > boundaryCount\n ? [count - boundaryCount]\n : []),\n ...endPages,\n ];\n}\n\nexport interface PaginationProps extends Omit<HTMLAttributes<HTMLElement>, 'onChange'> {\n /** Number of pages. */\n totalPages: number;\n /** Current page, starting at 1, for a controlled pagination. */\n page?: number;\n /** @default 1 */\n defaultPage?: number;\n /** Called with the page the user chose. */\n onPageChange?: (page: number) => void;\n /**\n * Pages shown on each side of the current page.\n * @default 1\n */\n siblingCount?: number;\n /**\n * Pages always shown at the start and the end.\n * @default 1\n */\n boundaryCount?: number;\n /** @default 'md' */\n size?: 'sm' | 'md';\n /**\n * Accessible name of the navigation landmark.\n * @default 'Pagination'\n */\n 'aria-label'?: string;\n /** @default 'Previous page' */\n previousLabel?: string;\n /** @default 'Next page' */\n nextLabel?: string;\n /**\n * Accessible name of each page button.\n * @default (page) => `Page ${page}`\n */\n getPageLabel?: (page: number) => string;\n}\n\n/** Moves between the pages of a long list. */\nexport const Pagination = forwardRef<HTMLElement, PaginationProps>(function Pagination(\n {\n totalPages,\n page,\n defaultPage = 1,\n onPageChange,\n siblingCount = 1,\n boundaryCount = 1,\n size = 'md',\n 'aria-label': ariaLabel = 'Pagination',\n previousLabel = 'Previous page',\n nextLabel = 'Next page',\n getPageLabel = (value) => `Page ${value}`,\n className,\n ...props\n },\n ref,\n) {\n const [current, setCurrent] = useControllableState({\n value: page,\n defaultValue: defaultPage,\n onChange: onPageChange,\n });\n const total = Math.max(totalPages, 1);\n const active = Math.min(Math.max(current, 1), total);\n\n return (\n <nav\n ref={ref}\n aria-label={ariaLabel}\n className={cn(styles.pagination, styles[size], className)}\n {...props}\n >\n <ul className={styles.list}>\n <li>\n <button\n type=\"button\"\n aria-label={previousLabel}\n className={cn(styles.button, styles.step)}\n aria-disabled={active <= 1 || undefined}\n onClick={() => {\n if (active > 1) setCurrent(active - 1);\n }}\n >\n <ChevronLeftIcon className={styles.icon} />\n </button>\n </li>\n {getPaginationItems(active, total, siblingCount, boundaryCount).map((item, index) =>\n item === 'ellipsis' ? (\n <li key={`ellipsis-${index}`} className={styles.ellipsis} aria-hidden=\"true\">\n …\n </li>\n ) : (\n <li key={item}>\n <button\n type=\"button\"\n aria-label={getPageLabel(item)}\n aria-current={item === active ? 'page' : undefined}\n className={styles.button}\n onClick={() => setCurrent(item)}\n >\n {item}\n </button>\n </li>\n ),\n )}\n <li>\n <button\n type=\"button\"\n aria-label={nextLabel}\n className={cn(styles.button, styles.step)}\n aria-disabled={active >= total || undefined}\n onClick={() => {\n if (active < total) setCurrent(active + 1);\n }}\n >\n <ChevronRightIcon className={styles.icon} />\n </button>\n </li>\n </ul>\n </nav>\n );\n});\n"],"mappings":";;;;;;;;AAaA,SAAgBE,EACd,GACA,GACA,IAAe,GACf,IAAgB,GACE;CAClB,IAAMC,KAAS,GAAe,MAC5B,MAAM,KAAK,EAAE,QAAQ,KAAK,IAAIC,IAAMC,IAAQ,GAAG,CAAC,EAAE,IAAI,GAAG,MAAUA,IAAQC,CAAK,GAE5EC,IAAaJ,EAAM,GAAG,KAAK,IAAIK,GAAeC,CAAK,CAAC,GACpDC,IAAWP,EAAM,KAAK,IAAIM,IAAQD,IAAgB,GAAGA,IAAgB,CAAC,GAAGC,CAAK,GAC9EE,IAAgB,KAAK,IACzB,KAAK,IAAIC,IAAOC,GAAcJ,IAAQD,IAAgBK,IAAe,IAAI,CAAC,GAC1EL,IAAgB,CAClB,GACMM,IAAc,KAAK,IACvB,KAAK,IAAIF,IAAOC,GAAcL,IAAgBK,IAAe,IAAI,CAAC,IACjEH,EAAS,MAAMD,IAAQ,KAAK,CAC/B;CAEA,OAAO;EACL,GAAGF;EACH,GAAII,IAAgBH,IAAgB,IAC/B,CAAC,UAAU,IACZA,IAAgB,IAAIC,IAAQD,IAC1B,CAACA,IAAgB,CAAC,IAClB,CAAC;EACP,GAAGL,EAAMQ,GAAeG,CAAW;EACnC,GAAIA,IAAcL,IAAQD,IAAgB,IACrC,CAAC,UAAU,IACZC,IAAQD,IAAgBA,IACtB,CAACC,IAAQD,CAAa,IACtB,CAAC;EACP,GAAGE;CACL;AACF;AAwCA,IAAaK,IAAaC,EAAyC,SACjE,EACE,eACA,SACA,iBAAc,GACd,iBACA,kBAAe,GACf,mBAAgB,GAChB,UAAO,MACP,cAAcC,IAAY,cAC1B,mBAAgB,iBAChB,eAAY,aACZ,mBAAgB,MAAU,QAAQC,KAClC,cACA,GAAGC,KAEL,GACA;CACA,IAAM,CAACC,GAASC,KAAcC,EAAqB;EACjD,OAAOV;EACP,cAAcW;EACd,UAAUC;CACZ,CAAC,GACKC,IAAQ,KAAK,IAAIC,GAAY,CAAC,GAC9BC,IAAS,KAAK,IAAI,KAAK,IAAIP,GAAS,CAAC,GAAGK,CAAK;CAEnD,OACE,kBAAC,OAAD;EACO;EACL,cAAYR;EACZ,WAAWW,EAAG5B,EAAO,YAAYA,EAAO6B,IAAOC,CAAS;EACxD,GAAIX;EAEJ,UAAA,kBAAC,MAAD;GAAI,WAAWnB,EAAO;GAAtB,UAAA;IACE,kBAAC,MAAD,EAAA,UACE,kBAAC,UAAD;KACE,MAAK;KACL,cAAY+B;KACZ,WAAWH,EAAG5B,EAAO,QAAQA,EAAO,IAAI;KACxC,iBAAe2B,KAAU,KAAK,KAAA;KAC9B,eAAe;MACb,AAAIA,IAAS,KAAGN,EAAWM,IAAS,CAAC;KACvC;KAEA,UAAA,kBAACK,GAAD,EAAiB,WAAWhC,EAAO,KAAO,CAAA;IACpC,CAAA,EACN,CAAA;IACHE,EAAmByB,GAAQF,GAAOZ,GAAcL,CAAa,CAAC,CAAC,KAAK,GAAM,MACzEyB,MAAS,aACP,kBAAC,MAAD;KAA8B,WAAWjC,EAAO;KAAU,eAAY;KAAO,UAAA;IAEzE,GAFK,YAAYM,GAEjB,IAEJ,kBAAC,MAAD,EAAA,UACE,kBAAC,UAAD;KACE,MAAK;KACL,cAAY4B,EAAaD,CAAI;KAC7B,gBAAcA,MAASN,IAAS,SAAS,KAAA;KACzC,WAAW3B,EAAO;KAClB,eAAeqB,EAAWY,CAAI;KAE7B,UAAAA;IACK,CAAA,EACN,GAVKA,CAUL,CAER;IACA,kBAAC,MAAD,EAAA,UACE,kBAAC,UAAD;KACE,MAAK;KACL,cAAYE;KACZ,WAAWP,EAAG5B,EAAO,QAAQA,EAAO,IAAI;KACxC,iBAAe2B,KAAUF,KAAS,KAAA;KAClC,eAAe;MACb,AAAIE,IAASF,KAAOJ,EAAWM,IAAS,CAAC;KAC3C;KAEA,UAAA,kBAACS,GAAD,EAAkB,WAAWpC,EAAO,KAAO,CAAA;IACrC,CAAA,EACN,CAAA;GACF;;CACD,CAAA;AAET,CAAC"}
@@ -0,0 +1,13 @@
1
+ // src/components/Pagination/Pagination.module.css
2
+ var e = "onyx-pagination-icb-v", t = "onyx-sm-I5fYv", n = "onyx-list-9X-O7", r = "onyx-button---Saq onyx-focusRing-qmcYD", i = "onyx-step-B5YFK", a = "onyx-icon-2iCyv", o = "onyx-ellipsis-V294k", s = {
3
+ pagination: e,
4
+ sm: t,
5
+ list: n,
6
+ button: r,
7
+ step: i,
8
+ icon: a,
9
+ ellipsis: o
10
+ };
11
+ export { r as button, s as default, o as ellipsis, a as icon, n as list, e as pagination, t as sm, i as step };
12
+
13
+ //# sourceMappingURL=Pagination.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Pagination.module.js","names":["pagination","sm","list","button","step","icon","ellipsis","Pagination_module_default"],"sources":["../../../src/components/Pagination/Pagination.module.css"],"sourcesContent":[".pagination {\n --pagination-size: var(--size-control-md);\n}\n\n.sm {\n --pagination-size: var(--size-control-sm);\n}\n\n.list {\n display: flex;\n flex-wrap: wrap;\n gap: var(--space-1);\n align-items: center;\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.button {\n composes: focusRing from '../../styles/focus-ring.module.css';\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: var(--pagination-size);\n height: var(--pagination-size);\n padding-inline: var(--space-2);\n font: inherit;\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-medium);\n font-variant-numeric: tabular-nums;\n color: var(--color-text);\n cursor: pointer;\n background: transparent;\n border: var(--border-width-thin) solid transparent;\n border-radius: var(--radius-md);\n transition-timing-function: var(--easing-standard);\n transition-duration: var(--duration-fast);\n transition-property: background-color, border-color, color;\n}\n\n.button:hover:not([aria-disabled='true'], [aria-current='page']) {\n background-color: var(--color-state-hover);\n}\n\n.button:active:not([aria-disabled='true'], [aria-current='page']) {\n background-color: var(--color-state-active);\n}\n\n.button[aria-current='page'] {\n color: var(--color-on-primary);\n cursor: default;\n background-color: var(--color-primary);\n}\n\n.button[aria-disabled='true'] {\n color: var(--color-text-disabled);\n cursor: not-allowed;\n}\n\n.step {\n border-color: var(--color-border);\n}\n\n.icon {\n font-size: var(--size-icon-sm);\n}\n\n:dir(rtl) .icon {\n scale: -1 1;\n}\n\n.ellipsis {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: var(--pagination-size);\n color: var(--color-text-muted);\n}\n\n@media (pointer: coarse) {\n .pagination {\n --pagination-size: var(--size-touch-target);\n }\n}\n"],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export { getPaginationItems, Pagination } from './Pagination.js';
2
+ export type { PaginationItem, PaginationProps } from './Pagination.js';
@@ -0,0 +1,46 @@
1
+ import { MouseEvent, ReactElement, ReactNode, RefObject } from 'react';
2
+ import { Placement } from '../../utils/floating.js';
3
+ export type PopoverPlacement = Placement;
4
+ export interface PopoverProps {
5
+ /** Element that toggles the popover, usually a `Button`. It must accept a ref. */
6
+ trigger: ReactElement<{
7
+ onClick?: (event: MouseEvent<HTMLElement>) => void;
8
+ }>;
9
+ /** Content of the popover. It can be interactive. */
10
+ children: ReactNode;
11
+ /** Heading that names the popover. Without it, pass `aria-label`. */
12
+ title?: ReactNode;
13
+ /** Accessible name when there is no `title`. */
14
+ 'aria-label'?: string;
15
+ /** @default 'bottom-start' */
16
+ placement?: PopoverPlacement;
17
+ /** Open state, for a controlled popover. */
18
+ open?: boolean;
19
+ /** @default false */
20
+ defaultOpen?: boolean;
21
+ onOpenChange?: (open: boolean) => void;
22
+ /** Element focused on open. Defaults to the first focusable element, then the popover. */
23
+ initialFocus?: RefObject<HTMLElement | null>;
24
+ /**
25
+ * Shows a close button in the corner.
26
+ * @default false
27
+ */
28
+ showClose?: boolean;
29
+ /**
30
+ * Accessible name of the close button.
31
+ * @default 'Close'
32
+ */
33
+ closeLabel?: string;
34
+ /**
35
+ * Gap between the trigger and the popover, in pixels.
36
+ * @default 8
37
+ */
38
+ offset?: number;
39
+ /** Class of the popover panel. */
40
+ className?: string;
41
+ }
42
+ /**
43
+ * Non-modal dialog anchored to a trigger. Focus moves into it on open; Escape, a click outside
44
+ * or tabbing out closes it, and Escape returns focus to the trigger.
45
+ */
46
+ export declare const Popover: import('react').ForwardRefExoticComponent<PopoverProps & import('react').RefAttributes<HTMLDivElement>>;