@lidofinance/lido-app-ui 1.9.0 → 1.11.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 (284) hide show
  1. package/README.md +30 -1
  2. package/dist/README.md +30 -1
  3. package/dist/cjs/breadcrumbs/Breadcrumbs.cjs +92 -0
  4. package/dist/cjs/breadcrumbs/Breadcrumbs.cjs.map +1 -0
  5. package/dist/cjs/breadcrumbs/Breadcrumbs.module.css.cjs +6 -0
  6. package/dist/cjs/breadcrumbs/Breadcrumbs.module.css.cjs.map +1 -0
  7. package/dist/cjs/divider/Divider.cjs +26 -0
  8. package/dist/cjs/divider/Divider.cjs.map +1 -0
  9. package/dist/cjs/divider/Divider.module.css.cjs +6 -0
  10. package/dist/cjs/divider/Divider.module.css.cjs.map +1 -0
  11. package/dist/cjs/grid/Grid.cjs +47 -0
  12. package/dist/cjs/grid/Grid.cjs.map +1 -0
  13. package/dist/cjs/grid/Grid.module.css.cjs +6 -0
  14. package/dist/cjs/grid/Grid.module.css.cjs.map +1 -0
  15. package/dist/cjs/grid/GridItem.cjs +39 -0
  16. package/dist/cjs/grid/GridItem.cjs.map +1 -0
  17. package/dist/cjs/grid/GridItem.module.css.cjs +6 -0
  18. package/dist/cjs/grid/GridItem.module.css.cjs.map +1 -0
  19. package/dist/cjs/header/Header.cjs +31 -0
  20. package/dist/cjs/header/Header.cjs.map +1 -0
  21. package/dist/cjs/header/Header.module.css.cjs +6 -0
  22. package/dist/cjs/header/Header.module.css.cjs.map +1 -0
  23. package/dist/cjs/header/HeaderNav.cjs +69 -0
  24. package/dist/cjs/header/HeaderNav.cjs.map +1 -0
  25. package/dist/cjs/header/HeaderNav.module.css.cjs +6 -0
  26. package/dist/cjs/header/HeaderNav.module.css.cjs.map +1 -0
  27. package/dist/cjs/hidden/Hidden.cjs +25 -0
  28. package/dist/cjs/hidden/Hidden.cjs.map +1 -0
  29. package/dist/cjs/hidden/Hidden.module.css.cjs +6 -0
  30. package/dist/cjs/hidden/Hidden.module.css.cjs.map +1 -0
  31. package/dist/cjs/hooks/Portal.cjs +57 -0
  32. package/dist/cjs/hooks/Portal.cjs.map +1 -0
  33. package/dist/cjs/hooks/overlayStack.cjs +26 -0
  34. package/dist/cjs/hooks/overlayStack.cjs.map +1 -0
  35. package/dist/cjs/hooks/useBodyScrollLock.cjs +50 -0
  36. package/dist/cjs/hooks/useBodyScrollLock.cjs.map +1 -0
  37. package/dist/cjs/hooks/useEscape.cjs +25 -0
  38. package/dist/cjs/hooks/useEscape.cjs.map +1 -0
  39. package/dist/cjs/hooks/useFocusTrap.cjs +66 -0
  40. package/dist/cjs/hooks/useFocusTrap.cjs.map +1 -0
  41. package/dist/cjs/hooks/useIsomorphicLayoutEffect.cjs +10 -0
  42. package/dist/cjs/hooks/useIsomorphicLayoutEffect.cjs.map +1 -0
  43. package/dist/cjs/hooks/useOutsideClick.cjs +15 -13
  44. package/dist/cjs/hooks/useOutsideClick.cjs.map +1 -1
  45. package/dist/cjs/icon-button/IconButton.cjs +5 -2
  46. package/dist/cjs/icon-button/IconButton.cjs.map +1 -1
  47. package/dist/cjs/icon-button/IconButton.module.css.cjs +1 -1
  48. package/dist/cjs/index.cjs +26 -0
  49. package/dist/cjs/index.cjs.map +1 -1
  50. package/dist/cjs/index.css +3 -3
  51. package/dist/cjs/link-provider/Anchor.cjs +48 -0
  52. package/dist/cjs/link-provider/Anchor.cjs.map +1 -0
  53. package/dist/cjs/link-provider/LinkProvider.cjs +29 -0
  54. package/dist/cjs/link-provider/LinkProvider.cjs.map +1 -0
  55. package/dist/cjs/logo/Logo.cjs +84 -0
  56. package/dist/cjs/logo/Logo.cjs.map +1 -0
  57. package/dist/cjs/logo/Logo.module.css.cjs +6 -0
  58. package/dist/cjs/logo/Logo.module.css.cjs.map +1 -0
  59. package/dist/cjs/modal/Modal.cjs +36 -29
  60. package/dist/cjs/modal/Modal.cjs.map +1 -1
  61. package/dist/cjs/nav-link/NavLink.cjs +44 -0
  62. package/dist/cjs/nav-link/NavLink.cjs.map +1 -0
  63. package/dist/cjs/nav-link/NavLink.module.css.cjs +6 -0
  64. package/dist/cjs/nav-link/NavLink.module.css.cjs.map +1 -0
  65. package/dist/cjs/notification/Notification.cjs +20 -4
  66. package/dist/cjs/notification/Notification.cjs.map +1 -1
  67. package/dist/cjs/notification/Notification.module.css.cjs +1 -1
  68. package/dist/cjs/popover/Popover.cjs +136 -0
  69. package/dist/cjs/popover/Popover.cjs.map +1 -0
  70. package/dist/cjs/popover/Popover.module.css.cjs +6 -0
  71. package/dist/cjs/popover/Popover.module.css.cjs.map +1 -0
  72. package/dist/cjs/rich-input/RichInput.cjs +2 -1
  73. package/dist/cjs/rich-input/RichInput.cjs.map +1 -1
  74. package/dist/cjs/segmented-control/SegmentedControl.cjs +2 -1
  75. package/dist/cjs/segmented-control/SegmentedControl.cjs.map +1 -1
  76. package/dist/cjs/segmented-control/SegmentedControlCard.cjs +2 -1
  77. package/dist/cjs/segmented-control/SegmentedControlCard.cjs.map +1 -1
  78. package/dist/cjs/small-card/SmallCard.cjs +2 -1
  79. package/dist/cjs/small-card/SmallCard.cjs.map +1 -1
  80. package/dist/cjs/stack/Stack.cjs +41 -0
  81. package/dist/cjs/stack/Stack.cjs.map +1 -0
  82. package/dist/cjs/stack/Stack.module.css.cjs +6 -0
  83. package/dist/cjs/stack/Stack.module.css.cjs.map +1 -0
  84. package/dist/cjs/tabs/Tabs.cjs +2 -1
  85. package/dist/cjs/tabs/Tabs.cjs.map +1 -1
  86. package/dist/cjs/text-link/TextLink.cjs +2 -1
  87. package/dist/cjs/text-link/TextLink.cjs.map +1 -1
  88. package/dist/cjs/theme-switcher/ThemeSwitcher.cjs +39 -0
  89. package/dist/cjs/theme-switcher/ThemeSwitcher.cjs.map +1 -0
  90. package/dist/cjs/token-selector/TokenSelector.cjs +3 -3
  91. package/dist/cjs/token-selector/TokenSelector.cjs.map +1 -1
  92. package/dist/cjs/tooltip/Tooltip.cjs +2 -1
  93. package/dist/cjs/tooltip/Tooltip.cjs.map +1 -1
  94. package/dist/cjs/utils/ActionElement.cjs +41 -0
  95. package/dist/cjs/utils/ActionElement.cjs.map +1 -0
  96. package/dist/cjs/utils/responsive.cjs +67 -0
  97. package/dist/cjs/utils/responsive.cjs.map +1 -0
  98. package/dist/esm/breadcrumbs/Breadcrumbs.mjs +88 -0
  99. package/dist/esm/breadcrumbs/Breadcrumbs.mjs.map +1 -0
  100. package/dist/esm/breadcrumbs/Breadcrumbs.module.css.mjs +4 -0
  101. package/dist/esm/breadcrumbs/Breadcrumbs.module.css.mjs.map +1 -0
  102. package/dist/esm/divider/Divider.mjs +22 -0
  103. package/dist/esm/divider/Divider.mjs.map +1 -0
  104. package/dist/esm/divider/Divider.module.css.mjs +4 -0
  105. package/dist/esm/divider/Divider.module.css.mjs.map +1 -0
  106. package/dist/esm/grid/Grid.mjs +43 -0
  107. package/dist/esm/grid/Grid.mjs.map +1 -0
  108. package/dist/esm/grid/Grid.module.css.mjs +4 -0
  109. package/dist/esm/grid/Grid.module.css.mjs.map +1 -0
  110. package/dist/esm/grid/GridItem.mjs +35 -0
  111. package/dist/esm/grid/GridItem.mjs.map +1 -0
  112. package/dist/esm/grid/GridItem.module.css.mjs +4 -0
  113. package/dist/esm/grid/GridItem.module.css.mjs.map +1 -0
  114. package/dist/esm/header/Header.mjs +27 -0
  115. package/dist/esm/header/Header.mjs.map +1 -0
  116. package/dist/esm/header/Header.module.css.mjs +4 -0
  117. package/dist/esm/header/Header.module.css.mjs.map +1 -0
  118. package/dist/esm/header/HeaderNav.mjs +65 -0
  119. package/dist/esm/header/HeaderNav.mjs.map +1 -0
  120. package/dist/esm/header/HeaderNav.module.css.mjs +4 -0
  121. package/dist/esm/header/HeaderNav.module.css.mjs.map +1 -0
  122. package/dist/esm/hidden/Hidden.mjs +21 -0
  123. package/dist/esm/hidden/Hidden.mjs.map +1 -0
  124. package/dist/esm/hidden/Hidden.module.css.mjs +4 -0
  125. package/dist/esm/hidden/Hidden.module.css.mjs.map +1 -0
  126. package/dist/esm/hooks/Portal.mjs +53 -0
  127. package/dist/esm/hooks/Portal.mjs.map +1 -0
  128. package/dist/esm/hooks/overlayStack.mjs +22 -0
  129. package/dist/esm/hooks/overlayStack.mjs.map +1 -0
  130. package/dist/esm/hooks/useBodyScrollLock.mjs +46 -0
  131. package/dist/esm/hooks/useBodyScrollLock.mjs.map +1 -0
  132. package/dist/esm/hooks/useEscape.mjs +21 -0
  133. package/dist/esm/hooks/useEscape.mjs.map +1 -0
  134. package/dist/esm/hooks/useFocusTrap.mjs +62 -0
  135. package/dist/esm/hooks/useFocusTrap.mjs.map +1 -0
  136. package/dist/esm/hooks/useIsomorphicLayoutEffect.mjs +6 -0
  137. package/dist/esm/hooks/useIsomorphicLayoutEffect.mjs.map +1 -0
  138. package/dist/esm/hooks/useOutsideClick.mjs +16 -14
  139. package/dist/esm/hooks/useOutsideClick.mjs.map +1 -1
  140. package/dist/esm/icon-button/IconButton.mjs +5 -2
  141. package/dist/esm/icon-button/IconButton.mjs.map +1 -1
  142. package/dist/esm/icon-button/IconButton.module.css.mjs +1 -1
  143. package/dist/esm/index.css +3 -3
  144. package/dist/esm/index.mjs +13 -0
  145. package/dist/esm/index.mjs.map +1 -1
  146. package/dist/esm/link-provider/Anchor.mjs +44 -0
  147. package/dist/esm/link-provider/Anchor.mjs.map +1 -0
  148. package/dist/esm/link-provider/LinkProvider.mjs +24 -0
  149. package/dist/esm/link-provider/LinkProvider.mjs.map +1 -0
  150. package/dist/esm/logo/Logo.mjs +80 -0
  151. package/dist/esm/logo/Logo.mjs.map +1 -0
  152. package/dist/esm/logo/Logo.module.css.mjs +4 -0
  153. package/dist/esm/logo/Logo.module.css.mjs.map +1 -0
  154. package/dist/esm/modal/Modal.mjs +38 -31
  155. package/dist/esm/modal/Modal.mjs.map +1 -1
  156. package/dist/esm/nav-link/NavLink.mjs +40 -0
  157. package/dist/esm/nav-link/NavLink.mjs.map +1 -0
  158. package/dist/esm/nav-link/NavLink.module.css.mjs +4 -0
  159. package/dist/esm/nav-link/NavLink.module.css.mjs.map +1 -0
  160. package/dist/esm/notification/Notification.mjs +20 -4
  161. package/dist/esm/notification/Notification.mjs.map +1 -1
  162. package/dist/esm/notification/Notification.module.css.mjs +1 -1
  163. package/dist/esm/popover/Popover.mjs +132 -0
  164. package/dist/esm/popover/Popover.mjs.map +1 -0
  165. package/dist/esm/popover/Popover.module.css.mjs +4 -0
  166. package/dist/esm/popover/Popover.module.css.mjs.map +1 -0
  167. package/dist/esm/rich-input/RichInput.mjs +2 -1
  168. package/dist/esm/rich-input/RichInput.mjs.map +1 -1
  169. package/dist/esm/segmented-control/SegmentedControl.mjs +3 -2
  170. package/dist/esm/segmented-control/SegmentedControl.mjs.map +1 -1
  171. package/dist/esm/segmented-control/SegmentedControlCard.mjs +3 -2
  172. package/dist/esm/segmented-control/SegmentedControlCard.mjs.map +1 -1
  173. package/dist/esm/small-card/SmallCard.mjs +2 -1
  174. package/dist/esm/small-card/SmallCard.mjs.map +1 -1
  175. package/dist/esm/stack/Stack.mjs +37 -0
  176. package/dist/esm/stack/Stack.mjs.map +1 -0
  177. package/dist/esm/stack/Stack.module.css.mjs +4 -0
  178. package/dist/esm/stack/Stack.module.css.mjs.map +1 -0
  179. package/dist/esm/tabs/Tabs.mjs +3 -2
  180. package/dist/esm/tabs/Tabs.mjs.map +1 -1
  181. package/dist/esm/text-link/TextLink.mjs +2 -1
  182. package/dist/esm/text-link/TextLink.mjs.map +1 -1
  183. package/dist/esm/theme-switcher/ThemeSwitcher.mjs +35 -0
  184. package/dist/esm/theme-switcher/ThemeSwitcher.mjs.map +1 -0
  185. package/dist/esm/token-selector/TokenSelector.mjs +3 -3
  186. package/dist/esm/token-selector/TokenSelector.mjs.map +1 -1
  187. package/dist/esm/tooltip/Tooltip.mjs +3 -2
  188. package/dist/esm/tooltip/Tooltip.mjs.map +1 -1
  189. package/dist/esm/utils/ActionElement.mjs +37 -0
  190. package/dist/esm/utils/ActionElement.mjs.map +1 -0
  191. package/dist/esm/utils/responsive.mjs +58 -0
  192. package/dist/esm/utils/responsive.mjs.map +1 -0
  193. package/dist/index.css +3 -3
  194. package/dist/styles/breakpoints.css +6 -0
  195. package/dist/types/breadcrumbs/Breadcrumbs.d.ts +11 -0
  196. package/dist/types/breadcrumbs/Breadcrumbs.d.ts.map +1 -0
  197. package/dist/types/breadcrumbs/index.d.ts +3 -0
  198. package/dist/types/breadcrumbs/index.d.ts.map +1 -0
  199. package/dist/types/colors/colorTokens.d.ts.map +1 -1
  200. package/dist/types/divider/Divider.d.ts +10 -0
  201. package/dist/types/divider/Divider.d.ts.map +1 -0
  202. package/dist/types/divider/index.d.ts +3 -0
  203. package/dist/types/divider/index.d.ts.map +1 -0
  204. package/dist/types/grid/Grid.d.ts +31 -0
  205. package/dist/types/grid/Grid.d.ts.map +1 -0
  206. package/dist/types/grid/GridItem.d.ts +16 -0
  207. package/dist/types/grid/GridItem.d.ts.map +1 -0
  208. package/dist/types/grid/index.d.ts +5 -0
  209. package/dist/types/grid/index.d.ts.map +1 -0
  210. package/dist/types/header/Header.d.ts +9 -0
  211. package/dist/types/header/Header.d.ts.map +1 -0
  212. package/dist/types/header/HeaderNav.d.ts +4 -0
  213. package/dist/types/header/HeaderNav.d.ts.map +1 -0
  214. package/dist/types/header/index.d.ts +5 -0
  215. package/dist/types/header/index.d.ts.map +1 -0
  216. package/dist/types/hidden/Hidden.d.ts +11 -0
  217. package/dist/types/hidden/Hidden.d.ts.map +1 -0
  218. package/dist/types/hidden/index.d.ts +3 -0
  219. package/dist/types/hidden/index.d.ts.map +1 -0
  220. package/dist/types/hooks/Portal.d.ts +12 -0
  221. package/dist/types/hooks/Portal.d.ts.map +1 -0
  222. package/dist/types/hooks/index.d.ts +9 -0
  223. package/dist/types/hooks/index.d.ts.map +1 -0
  224. package/dist/types/hooks/overlayStack.d.ts +7 -0
  225. package/dist/types/hooks/overlayStack.d.ts.map +1 -0
  226. package/dist/types/hooks/useBodyScrollLock.d.ts +3 -0
  227. package/dist/types/hooks/useBodyScrollLock.d.ts.map +1 -0
  228. package/dist/types/hooks/useEscape.d.ts +3 -0
  229. package/dist/types/hooks/useEscape.d.ts.map +1 -0
  230. package/dist/types/hooks/useFocusTrap.d.ts +10 -0
  231. package/dist/types/hooks/useFocusTrap.d.ts.map +1 -0
  232. package/dist/types/hooks/useIsomorphicLayoutEffect.d.ts +3 -0
  233. package/dist/types/hooks/useIsomorphicLayoutEffect.d.ts.map +1 -0
  234. package/dist/types/hooks/useOutsideClick.d.ts +2 -2
  235. package/dist/types/hooks/useOutsideClick.d.ts.map +1 -1
  236. package/dist/types/icon-button/IconButton.d.ts +11 -3
  237. package/dist/types/icon-button/IconButton.d.ts.map +1 -1
  238. package/dist/types/index.d.ts +12 -0
  239. package/dist/types/index.d.ts.map +1 -1
  240. package/dist/types/link-provider/Anchor.d.ts +4 -0
  241. package/dist/types/link-provider/Anchor.d.ts.map +1 -0
  242. package/dist/types/link-provider/LinkProvider.d.ts +17 -0
  243. package/dist/types/link-provider/LinkProvider.d.ts.map +1 -0
  244. package/dist/types/link-provider/index.d.ts +3 -0
  245. package/dist/types/link-provider/index.d.ts.map +1 -0
  246. package/dist/types/logo/Logo.d.ts +13 -0
  247. package/dist/types/logo/Logo.d.ts.map +1 -0
  248. package/dist/types/logo/index.d.ts +3 -0
  249. package/dist/types/logo/index.d.ts.map +1 -0
  250. package/dist/types/modal/Modal.d.ts +23 -1
  251. package/dist/types/modal/Modal.d.ts.map +1 -1
  252. package/dist/types/nav-link/NavLink.d.ts +12 -0
  253. package/dist/types/nav-link/NavLink.d.ts.map +1 -0
  254. package/dist/types/nav-link/index.d.ts +3 -0
  255. package/dist/types/nav-link/index.d.ts.map +1 -0
  256. package/dist/types/notification/Notification.d.ts +15 -2
  257. package/dist/types/notification/Notification.d.ts.map +1 -1
  258. package/dist/types/popover/Popover.d.ts +21 -0
  259. package/dist/types/popover/Popover.d.ts.map +1 -0
  260. package/dist/types/popover/index.d.ts +3 -0
  261. package/dist/types/popover/index.d.ts.map +1 -0
  262. package/dist/types/rich-input/RichInput.d.ts +3 -1
  263. package/dist/types/rich-input/RichInput.d.ts.map +1 -1
  264. package/dist/types/segmented-control/SegmentedControl.d.ts.map +1 -1
  265. package/dist/types/segmented-control/SegmentedControlCard.d.ts.map +1 -1
  266. package/dist/types/small-card/SmallCard.d.ts.map +1 -1
  267. package/dist/types/stack/Stack.d.ts +25 -0
  268. package/dist/types/stack/Stack.d.ts.map +1 -0
  269. package/dist/types/stack/index.d.ts +3 -0
  270. package/dist/types/stack/index.d.ts.map +1 -0
  271. package/dist/types/tabs/Tabs.d.ts.map +1 -1
  272. package/dist/types/text-link/TextLink.d.ts.map +1 -1
  273. package/dist/types/theme-switcher/ThemeSwitcher.d.ts +5 -0
  274. package/dist/types/theme-switcher/ThemeSwitcher.d.ts.map +1 -0
  275. package/dist/types/theme-switcher/index.d.ts +3 -0
  276. package/dist/types/theme-switcher/index.d.ts.map +1 -0
  277. package/dist/types/tooltip/Tooltip.d.ts.map +1 -1
  278. package/dist/types/utils/ActionElement.d.ts +10 -0
  279. package/dist/types/utils/ActionElement.d.ts.map +1 -0
  280. package/dist/types/utils/index.d.ts +5 -0
  281. package/dist/types/utils/index.d.ts.map +1 -0
  282. package/dist/types/utils/responsive.d.ts +27 -0
  283. package/dist/types/utils/responsive.d.ts.map +1 -0
  284. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"Tooltip.cjs","sources":["../../../src/tooltip/Tooltip.tsx"],"sourcesContent":["import {\n useCallback,\n useEffect,\n useId,\n useLayoutEffect,\n useRef,\n useState,\n type ComponentPropsWithoutRef,\n type CSSProperties,\n type FocusEvent,\n type MouseEvent,\n type ReactNode,\n} from 'react'\nimport { createPortal } from 'react-dom'\n\nimport cn from 'classnames'\n\nimport styles from './Tooltip.module.css'\n\nexport type TooltipPosition =\n | 'top'\n | 'right'\n | 'bottom'\n | 'left'\n | 'top-left'\n | 'top-right'\n | 'bottom-left'\n | 'bottom-right'\n\nexport type TooltipDataTestId = {\n root?: string\n content?: string\n}\n\nexport type TooltipProps = Omit<ComponentPropsWithoutRef<'span'>, 'content'> & {\n content: ReactNode\n position?: TooltipPosition\n width?: number\n dataTestId?: TooltipDataTestId\n}\n\n// Minimal distance between the tooltip and the viewport edge.\nconst VIEWPORT_MARGIN = 16\n// Visual gap between the anchor and the content.\nconst MAIN_GAP = 8\nconst CORNER_GAP = 2\n// Extra buffer used only to decide whether a position still \"fits\" — bigger\n// than the visual gap so a flip triggers before the bubble visually crowds the edge.\nconst FIT_BUFFER = 15\n\ntype Adjustment = {\n position: TooltipPosition\n left: number\n top: number\n}\n\nconst clampValue = (value: number, min: number, max: number) =>\n Math.min(Math.max(value, min), Math.max(max, min))\n\nconst getMaxWidth = (width: number) =>\n `min(${width}px, calc(100vw - ${VIEWPORT_MARGIN * 2}px))`\n\n// Measures the anchor and the content, then picks a position that keeps the\n// bubble inside the viewport — flipping sides when there isn't room, sliding\n// along the cross axis otherwise — and resolves it to fixed-position coordinates.\nconst getAdjustment = (\n position: TooltipPosition,\n anchor: DOMRect,\n contentWidth: number,\n contentHeight: number,\n): Adjustment => {\n const viewportWidth = document.documentElement.clientWidth\n const viewportHeight = document.documentElement.clientHeight\n\n const spaceTop = anchor.top - VIEWPORT_MARGIN\n const spaceBottom = viewportHeight - anchor.bottom - VIEWPORT_MARGIN\n const spaceLeft = anchor.left - VIEWPORT_MARGIN\n const spaceRight = viewportWidth - anchor.right - VIEWPORT_MARGIN\n\n let [main, corner] = position.split('-') as [string, string | undefined]\n const fitGap = corner ? 0 : FIT_BUFFER\n\n // Side positions: flip to the other side, or fall back to a vertical\n // position when the content doesn't fit horizontally on either side.\n if (main === 'left' || main === 'right') {\n const needed = contentWidth + fitGap\n if (needed > spaceLeft && needed > spaceRight) {\n main = spaceBottom >= spaceTop ? 'bottom' : 'top'\n } else if (main === 'right' && needed > spaceRight) {\n main = 'left'\n } else if (main === 'left' && needed > spaceLeft) {\n main = 'right'\n }\n }\n\n // Vertical positions: flip when the content doesn't fit and there is more room on the other side.\n if (main === 'top' || main === 'bottom') {\n const space = main === 'top' ? spaceTop : spaceBottom\n const opposite = main === 'top' ? spaceBottom : spaceTop\n if (contentHeight + fitGap > space && opposite > space) {\n main = main === 'top' ? 'bottom' : 'top'\n }\n }\n\n // A corner's cut-off edge has to meet the anchor, and sliding breaks that\n // join — so mirror to the other side first and only slide as a last resort.\n if (corner) {\n const space = corner === 'left' ? spaceLeft : spaceRight\n const opposite = corner === 'left' ? spaceRight : spaceLeft\n if (contentWidth > space && opposite > space) {\n corner = corner === 'left' ? 'right' : 'left'\n }\n }\n\n const resolvedPosition = (\n corner ? `${main}-${corner}` : main\n ) as TooltipPosition\n\n let left: number\n let top: number\n\n if (main === 'left' || main === 'right') {\n const idealTop = anchor.top + anchor.height / 2 - contentHeight / 2\n top = clampValue(\n idealTop,\n VIEWPORT_MARGIN,\n viewportHeight - VIEWPORT_MARGIN - contentHeight,\n )\n left =\n main === 'right'\n ? anchor.right + MAIN_GAP\n : anchor.left - MAIN_GAP - contentWidth\n } else {\n const idealLeft = !corner\n ? anchor.left + anchor.width / 2 - contentWidth / 2\n : corner === 'left'\n ? anchor.left - contentWidth - CORNER_GAP\n : anchor.right + CORNER_GAP\n left = clampValue(\n idealLeft,\n VIEWPORT_MARGIN,\n viewportWidth - VIEWPORT_MARGIN - contentWidth,\n )\n const gap = corner ? CORNER_GAP : MAIN_GAP\n top =\n main === 'top' ? anchor.top - gap - contentHeight : anchor.bottom + gap\n }\n\n return { position: resolvedPosition, left, top }\n}\n\n// Rendered into document.body so a clipping ancestor (overflow: clip/hidden, or a\n// transform/filter/backdrop-filter that would otherwise capture position: fixed)\n// can't cut the bubble off — it sits outside that ancestor's DOM subtree entirely.\nexport const Tooltip = ({\n content,\n position = 'top',\n width = 320,\n className,\n children,\n onMouseEnter,\n onMouseLeave,\n onFocus,\n onBlur,\n dataTestId,\n ...rest\n}: TooltipProps) => {\n const anchorRef = useRef<HTMLSpanElement>(null)\n const contentRef = useRef<HTMLSpanElement>(null)\n const [open, setOpen] = useState(false)\n const tooltipId = useId()\n\n const updatePosition = useCallback(() => {\n const anchor = anchorRef.current\n const contentEl = contentRef.current\n if (!anchor || !contentEl) return\n const {\n left,\n top,\n position: resolved,\n } = getAdjustment(\n position,\n anchor.getBoundingClientRect(),\n contentEl.offsetWidth,\n contentEl.offsetHeight,\n )\n contentEl.style.left = `${left}px`\n contentEl.style.top = `${top}px`\n contentEl.dataset.position = resolved\n contentEl.dataset.placed = 'true'\n }, [position])\n\n useLayoutEffect(() => {\n if (!open) return\n updatePosition()\n window.addEventListener('scroll', updatePosition, true)\n window.addEventListener('resize', updatePosition)\n return () => {\n window.removeEventListener('scroll', updatePosition, true)\n window.removeEventListener('resize', updatePosition)\n }\n }, [open, updatePosition])\n\n // A hover-opened tooltip has no focus to catch the key, so Escape is heard document-wide.\n useEffect(() => {\n if (!open) return\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') setOpen(false)\n }\n document.addEventListener('keydown', handleKeyDown)\n return () => document.removeEventListener('keydown', handleKeyDown)\n }, [open])\n\n const handleMouseEnter = (event: MouseEvent<HTMLSpanElement>) => {\n onMouseEnter?.(event)\n setOpen(true)\n }\n\n const handleMouseLeave = (event: MouseEvent<HTMLSpanElement>) => {\n onMouseLeave?.(event)\n setOpen(false)\n }\n\n const handleFocus = (event: FocusEvent<HTMLSpanElement>) => {\n onFocus?.(event)\n setOpen(true)\n }\n\n const handleBlur = (event: FocusEvent<HTMLSpanElement>) => {\n onBlur?.(event)\n setOpen(false)\n }\n\n return (\n <span\n ref={anchorRef}\n className={cn(styles.wrapper, className)}\n aria-describedby={open ? tooltipId : undefined}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n onFocus={handleFocus}\n onBlur={handleBlur}\n data-testid={dataTestId?.root}\n {...rest}\n >\n {children}\n {open\n ? createPortal(\n <span\n ref={contentRef}\n id={tooltipId}\n role='tooltip'\n className={styles.content}\n style={\n { '--local-tooltip-width': getMaxWidth(width) } as CSSProperties\n }\n data-testid={dataTestId?.content}\n >\n {content}\n </span>,\n document.body,\n )\n : null}\n </span>\n )\n}\n\nTooltip.displayName = 'Tooltip'\n"],"names":["VIEWPORT_MARGIN","MAIN_GAP","CORNER_GAP","FIT_BUFFER","clampValue","value","min","max","Math","getMaxWidth","width","getAdjustment","position","anchor","contentWidth","contentHeight","viewportWidth","document","documentElement","clientWidth","viewportHeight","clientHeight","spaceTop","top","spaceBottom","bottom","spaceLeft","left","spaceRight","right","main","corner","split","fitGap","needed","space","opposite","resolvedPosition","idealTop","height","idealLeft","gap","Tooltip","_ref","content","className","children","onMouseEnter","onMouseLeave","onFocus","onBlur","dataTestId","rest","anchorRef","useRef","contentRef","open","setOpen","useState","tooltipId","useId","updatePosition","useCallback","current","contentEl","resolved","getBoundingClientRect","offsetWidth","offsetHeight","style","dataset","placed","useLayoutEffect","window","addEventListener","removeEventListener","useEffect","handleKeyDown","event","key","handleMouseEnter","handleMouseLeave","handleFocus","handleBlur","_jsxs","ref","cn","styles","wrapper","undefined","root","createPortal","_jsx","id","role","body","displayName"],"mappings":"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"}
1
+ {"version":3,"file":"Tooltip.cjs","sources":["../../../src/tooltip/Tooltip.tsx"],"sourcesContent":["import {\n useCallback,\n useEffect,\n useId,\n useRef,\n useState,\n type ComponentPropsWithoutRef,\n type CSSProperties,\n type FocusEvent,\n type MouseEvent,\n type ReactNode,\n} from 'react'\nimport { createPortal } from 'react-dom'\n\nimport cn from 'classnames'\n\nimport { useIsomorphicLayoutEffect } from '../hooks'\nimport styles from './Tooltip.module.css'\n\nexport type TooltipPosition =\n | 'top'\n | 'right'\n | 'bottom'\n | 'left'\n | 'top-left'\n | 'top-right'\n | 'bottom-left'\n | 'bottom-right'\n\nexport type TooltipDataTestId = {\n root?: string\n content?: string\n}\n\nexport type TooltipProps = Omit<ComponentPropsWithoutRef<'span'>, 'content'> & {\n content: ReactNode\n position?: TooltipPosition\n width?: number\n dataTestId?: TooltipDataTestId\n}\n\n// Minimal distance between the tooltip and the viewport edge.\nconst VIEWPORT_MARGIN = 16\n// Visual gap between the anchor and the content.\nconst MAIN_GAP = 8\nconst CORNER_GAP = 2\n// Extra buffer used only to decide whether a position still \"fits\" — bigger\n// than the visual gap so a flip triggers before the bubble visually crowds the edge.\nconst FIT_BUFFER = 15\n\ntype Adjustment = {\n position: TooltipPosition\n left: number\n top: number\n}\n\nconst clampValue = (value: number, min: number, max: number) =>\n Math.min(Math.max(value, min), Math.max(max, min))\n\nconst getMaxWidth = (width: number) =>\n `min(${width}px, calc(100vw - ${VIEWPORT_MARGIN * 2}px))`\n\n// Measures the anchor and the content, then picks a position that keeps the\n// bubble inside the viewport — flipping sides when there isn't room, sliding\n// along the cross axis otherwise — and resolves it to fixed-position coordinates.\nconst getAdjustment = (\n position: TooltipPosition,\n anchor: DOMRect,\n contentWidth: number,\n contentHeight: number,\n): Adjustment => {\n const viewportWidth = document.documentElement.clientWidth\n const viewportHeight = document.documentElement.clientHeight\n\n const spaceTop = anchor.top - VIEWPORT_MARGIN\n const spaceBottom = viewportHeight - anchor.bottom - VIEWPORT_MARGIN\n const spaceLeft = anchor.left - VIEWPORT_MARGIN\n const spaceRight = viewportWidth - anchor.right - VIEWPORT_MARGIN\n\n let [main, corner] = position.split('-') as [string, string | undefined]\n const fitGap = corner ? 0 : FIT_BUFFER\n\n // Side positions: flip to the other side, or fall back to a vertical\n // position when the content doesn't fit horizontally on either side.\n if (main === 'left' || main === 'right') {\n const needed = contentWidth + fitGap\n if (needed > spaceLeft && needed > spaceRight) {\n main = spaceBottom >= spaceTop ? 'bottom' : 'top'\n } else if (main === 'right' && needed > spaceRight) {\n main = 'left'\n } else if (main === 'left' && needed > spaceLeft) {\n main = 'right'\n }\n }\n\n // Vertical positions: flip when the content doesn't fit and there is more room on the other side.\n if (main === 'top' || main === 'bottom') {\n const space = main === 'top' ? spaceTop : spaceBottom\n const opposite = main === 'top' ? spaceBottom : spaceTop\n if (contentHeight + fitGap > space && opposite > space) {\n main = main === 'top' ? 'bottom' : 'top'\n }\n }\n\n // A corner's cut-off edge has to meet the anchor, and sliding breaks that\n // join — so mirror to the other side first and only slide as a last resort.\n if (corner) {\n const space = corner === 'left' ? spaceLeft : spaceRight\n const opposite = corner === 'left' ? spaceRight : spaceLeft\n if (contentWidth > space && opposite > space) {\n corner = corner === 'left' ? 'right' : 'left'\n }\n }\n\n const resolvedPosition = (\n corner ? `${main}-${corner}` : main\n ) as TooltipPosition\n\n let left: number\n let top: number\n\n if (main === 'left' || main === 'right') {\n const idealTop = anchor.top + anchor.height / 2 - contentHeight / 2\n top = clampValue(\n idealTop,\n VIEWPORT_MARGIN,\n viewportHeight - VIEWPORT_MARGIN - contentHeight,\n )\n left =\n main === 'right'\n ? anchor.right + MAIN_GAP\n : anchor.left - MAIN_GAP - contentWidth\n } else {\n const idealLeft = !corner\n ? anchor.left + anchor.width / 2 - contentWidth / 2\n : corner === 'left'\n ? anchor.left - contentWidth - CORNER_GAP\n : anchor.right + CORNER_GAP\n left = clampValue(\n idealLeft,\n VIEWPORT_MARGIN,\n viewportWidth - VIEWPORT_MARGIN - contentWidth,\n )\n const gap = corner ? CORNER_GAP : MAIN_GAP\n top =\n main === 'top' ? anchor.top - gap - contentHeight : anchor.bottom + gap\n }\n\n return { position: resolvedPosition, left, top }\n}\n\n// Rendered into document.body so a clipping ancestor (overflow: clip/hidden, or a\n// transform/filter/backdrop-filter that would otherwise capture position: fixed)\n// can't cut the bubble off — it sits outside that ancestor's DOM subtree entirely.\nexport const Tooltip = ({\n content,\n position = 'top',\n width = 320,\n className,\n children,\n onMouseEnter,\n onMouseLeave,\n onFocus,\n onBlur,\n dataTestId,\n ...rest\n}: TooltipProps) => {\n const anchorRef = useRef<HTMLSpanElement>(null)\n const contentRef = useRef<HTMLSpanElement>(null)\n const [open, setOpen] = useState(false)\n const tooltipId = useId()\n\n const updatePosition = useCallback(() => {\n const anchor = anchorRef.current\n const contentEl = contentRef.current\n if (!anchor || !contentEl) return\n const {\n left,\n top,\n position: resolved,\n } = getAdjustment(\n position,\n anchor.getBoundingClientRect(),\n contentEl.offsetWidth,\n contentEl.offsetHeight,\n )\n contentEl.style.left = `${left}px`\n contentEl.style.top = `${top}px`\n contentEl.dataset.position = resolved\n contentEl.dataset.placed = 'true'\n }, [position])\n\n useIsomorphicLayoutEffect(() => {\n if (!open) return\n updatePosition()\n window.addEventListener('scroll', updatePosition, true)\n window.addEventListener('resize', updatePosition)\n return () => {\n window.removeEventListener('scroll', updatePosition, true)\n window.removeEventListener('resize', updatePosition)\n }\n }, [open, updatePosition])\n\n // A hover-opened tooltip has no focus to catch the key, so Escape is heard document-wide.\n useEffect(() => {\n if (!open) return\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') setOpen(false)\n }\n document.addEventListener('keydown', handleKeyDown)\n return () => document.removeEventListener('keydown', handleKeyDown)\n }, [open])\n\n const handleMouseEnter = (event: MouseEvent<HTMLSpanElement>) => {\n onMouseEnter?.(event)\n setOpen(true)\n }\n\n const handleMouseLeave = (event: MouseEvent<HTMLSpanElement>) => {\n onMouseLeave?.(event)\n setOpen(false)\n }\n\n const handleFocus = (event: FocusEvent<HTMLSpanElement>) => {\n onFocus?.(event)\n setOpen(true)\n }\n\n const handleBlur = (event: FocusEvent<HTMLSpanElement>) => {\n onBlur?.(event)\n setOpen(false)\n }\n\n return (\n <span\n ref={anchorRef}\n className={cn(styles.wrapper, className)}\n aria-describedby={open ? tooltipId : undefined}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n onFocus={handleFocus}\n onBlur={handleBlur}\n data-testid={dataTestId?.root}\n {...rest}\n >\n {children}\n {open\n ? createPortal(\n <span\n ref={contentRef}\n id={tooltipId}\n role='tooltip'\n className={styles.content}\n style={\n { '--local-tooltip-width': getMaxWidth(width) } as CSSProperties\n }\n data-testid={dataTestId?.content}\n >\n {content}\n </span>,\n document.body,\n )\n : null}\n </span>\n )\n}\n\nTooltip.displayName = 'Tooltip'\n"],"names":["VIEWPORT_MARGIN","MAIN_GAP","CORNER_GAP","FIT_BUFFER","clampValue","value","min","max","Math","getMaxWidth","width","getAdjustment","position","anchor","contentWidth","contentHeight","viewportWidth","document","documentElement","clientWidth","viewportHeight","clientHeight","spaceTop","top","spaceBottom","bottom","spaceLeft","left","spaceRight","right","main","corner","split","fitGap","needed","space","opposite","resolvedPosition","idealTop","height","idealLeft","gap","Tooltip","_ref","content","className","children","onMouseEnter","onMouseLeave","onFocus","onBlur","dataTestId","rest","anchorRef","useRef","contentRef","open","setOpen","useState","tooltipId","useId","updatePosition","useCallback","current","contentEl","resolved","getBoundingClientRect","offsetWidth","offsetHeight","style","dataset","placed","useIsomorphicLayoutEffect","window","addEventListener","removeEventListener","useEffect","handleKeyDown","event","key","handleMouseEnter","handleMouseLeave","handleFocus","handleBlur","_jsxs","ref","cn","styles","wrapper","undefined","root","createPortal","_jsx","id","role","body","displayName"],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
4
+
5
+ const react = require('react');
6
+ const Anchor = require('../link-provider/Anchor.cjs');
7
+ const jsxRuntime = require('react/jsx-runtime');
8
+
9
+ /** Renders `<a>` when `href` is set, otherwise `<button type='button'>`. */
10
+ const ActionElement = /*#__PURE__*/react.forwardRef((props, ref) => {
11
+ if (props.href !== undefined) {
12
+ const {
13
+ href,
14
+ disabled,
15
+ onClick,
16
+ tabIndex,
17
+ ...rest
18
+ } = props;
19
+ return /*#__PURE__*/jsxRuntime.jsx(Anchor.Anchor, {
20
+ ref: ref,
21
+ ...rest,
22
+ href: disabled ? undefined : href,
23
+ "aria-disabled": disabled ? 'true' : rest['aria-disabled'],
24
+ tabIndex: disabled ? -1 : tabIndex,
25
+ onClick: disabled ? undefined : onClick
26
+ });
27
+ }
28
+ const {
29
+ type = 'button',
30
+ ...rest
31
+ } = props;
32
+ return /*#__PURE__*/jsxRuntime.jsx("button", {
33
+ ref: ref,
34
+ type: type,
35
+ ...rest
36
+ });
37
+ });
38
+ ActionElement.displayName = 'ActionElement';
39
+
40
+ exports.ActionElement = ActionElement;
41
+ //# sourceMappingURL=ActionElement.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ActionElement.cjs","sources":["../../../src/utils/ActionElement.tsx"],"sourcesContent":["import {\n forwardRef,\n type AnchorHTMLAttributes,\n type ButtonHTMLAttributes,\n type ForwardedRef,\n} from 'react'\n\nimport { Anchor } from '../link-provider/Anchor'\n\nexport type ActionElementProps =\n | (AnchorHTMLAttributes<HTMLAnchorElement> & {\n href: string\n disabled?: boolean\n })\n | (ButtonHTMLAttributes<HTMLButtonElement> & { href?: undefined })\n\n/** Renders `<a>` when `href` is set, otherwise `<button type='button'>`. */\nexport const ActionElement = forwardRef<\n HTMLAnchorElement | HTMLButtonElement,\n ActionElementProps\n>((props, ref) => {\n if (props.href !== undefined) {\n const { href, disabled, onClick, tabIndex, ...rest } = props\n return (\n <Anchor\n ref={ref as ForwardedRef<HTMLAnchorElement>}\n {...rest}\n href={disabled ? undefined : href}\n aria-disabled={disabled ? 'true' : rest['aria-disabled']}\n tabIndex={disabled ? -1 : tabIndex}\n onClick={disabled ? undefined : onClick}\n />\n )\n }\n\n const { type = 'button', ...rest } = props\n return (\n <button\n ref={ref as ForwardedRef<HTMLButtonElement>}\n type={type}\n {...rest}\n />\n )\n})\n\nActionElement.displayName = 'ActionElement'\n"],"names":["ActionElement","forwardRef","props","ref","href","undefined","disabled","onClick","tabIndex","rest","_jsx","Anchor","type","displayName"],"mappings":";;;;;;;;AAgBA;AACO,MAAMA,aAAa,gBAAGC,gBAAU,CAGrC,CAACC,KAAK,EAAEC,GAAG,KAAK;AAChB,EAAA,IAAID,KAAK,CAACE,IAAI,KAAKC,SAAS,EAAE;IAC5B,MAAM;MAAED,IAAI;MAAEE,QAAQ;MAAEC,OAAO;MAAEC,QAAQ;MAAE,GAAGC,IAAAA;AAAK,KAAC,GAAGP,KAAK,CAAA;IAC5D,oBACEQ,cAAA,CAACC,aAAM,EAAA;AACLR,MAAAA,GAAG,EAAEA,GAAuC;AAAA,MAAA,GACxCM,IAAI;AACRL,MAAAA,IAAI,EAAEE,QAAQ,GAAGD,SAAS,GAAGD,IAAK;AAClC,MAAA,eAAA,EAAeE,QAAQ,GAAG,MAAM,GAAGG,IAAI,CAAC,eAAe,CAAE;AACzDD,MAAAA,QAAQ,EAAEF,QAAQ,GAAG,CAAC,CAAC,GAAGE,QAAS;AACnCD,MAAAA,OAAO,EAAED,QAAQ,GAAGD,SAAS,GAAGE,OAAAA;AAAQ,KACzC,CAAC,CAAA;AAEN,GAAA;EAEA,MAAM;AAAEK,IAAAA,IAAI,GAAG,QAAQ;IAAE,GAAGH,IAAAA;AAAK,GAAC,GAAGP,KAAK,CAAA;AAC1C,EAAA,oBACEQ,cAAA,CAAA,QAAA,EAAA;AACEP,IAAAA,GAAG,EAAEA,GAAuC;AAC5CS,IAAAA,IAAI,EAAEA,IAAK;IAAA,GACPH,IAAAA;AAAI,GACT,CAAC,CAAA;AAEN,CAAC,EAAC;AAEFT,aAAa,CAACa,WAAW,GAAG,eAAe;;;;"}
@@ -0,0 +1,67 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
4
+
5
+ const breakpoints = ['lg', 'ml', 'md', 'sm', 'xs', 'xxs'];
6
+ const capitalize = value => value.charAt(0).toUpperCase() + value.slice(1);
7
+ const spaceToCss = space => `${space}px`;
8
+ const toKebab = value => value.replace(/[A-Z]/g, char => `-${char.toLowerCase()}`);
9
+
10
+ /**
11
+ * Turns a responsive prop into inline `--local-<prop>[-<bp>]` vars plus the
12
+ * `<prop><Bp>` module classes that gate them; the base var is read by the root class.
13
+ */
14
+ const getResponsiveProps = (prop, value, toCss, styles) => {
15
+ const style = {};
16
+ const className = [];
17
+ const values = typeof value === 'object' && value !== null ? value : {
18
+ base: value
19
+ };
20
+ const varName = `--local-${toKebab(prop)}`;
21
+ if (values.base !== undefined) style[varName] = toCss(values.base);
22
+ for (const bp of breakpoints) {
23
+ const item = values[bp];
24
+ if (item === undefined) continue;
25
+ style[`${varName}-${bp}`] = toCss(item);
26
+ const cls = styles[`${prop}${capitalize(bp)}`];
27
+ if (cls) className.push(cls);
28
+ }
29
+ return {
30
+ style: style,
31
+ className
32
+ };
33
+ };
34
+ const toObject = value => typeof value === 'object' && value !== null ? value : {
35
+ base: value
36
+ };
37
+
38
+ /** Merges per key; `b` wins over `a`. */
39
+ const mergeResponsive = (a, b) => {
40
+ if (a === undefined && b === undefined) return undefined;
41
+ return {
42
+ ...(a === undefined ? {} : toObject(a)),
43
+ ...(b === undefined ? {} : toObject(b))
44
+ };
45
+ };
46
+
47
+ /** Turns a responsive prop into inline `--local-<prop>[-<bp>]` vars, for roots that declare a per-breakpoint fallback chain. */
48
+ const responsiveVars = (prop, value, toCss) => {
49
+ if (value === undefined) return {};
50
+ const values = toObject(value);
51
+ const varName = `--local-${toKebab(prop)}`;
52
+ const style = {};
53
+ if (values.base !== undefined) style[varName] = toCss(values.base);
54
+ for (const bp of breakpoints) {
55
+ const item = values[bp];
56
+ if (item !== undefined) style[`${varName}-${bp}`] = toCss(item);
57
+ }
58
+ return style;
59
+ };
60
+
61
+ exports.breakpoints = breakpoints;
62
+ exports.capitalize = capitalize;
63
+ exports.getResponsiveProps = getResponsiveProps;
64
+ exports.mergeResponsive = mergeResponsive;
65
+ exports.responsiveVars = responsiveVars;
66
+ exports.spaceToCss = spaceToCss;
67
+ //# sourceMappingURL=responsive.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"responsive.cjs","sources":["../../../src/utils/responsive.ts"],"sourcesContent":["import type { CSSProperties } from 'react'\n\nexport const breakpoints = ['lg', 'ml', 'md', 'sm', 'xs', 'xxs'] as const\nexport type Breakpoint = (typeof breakpoints)[number]\n\ntype ResponsiveObject<T> = { base?: T } & Partial<Record<Breakpoint, T>>\n\n/** Desktop-first: `base` applies everywhere, breakpoint keys apply at that width and below. */\nexport type Responsive<T> = T | ResponsiveObject<T>\n\n/** Spacing scale in px. */\nexport const spaces = [0, 2, 4, 8, 12, 16, 20, 24, 32, 40, 52] as const\nexport type Space = (typeof spaces)[number]\n\nexport const capitalize = (value: string) =>\n value.charAt(0).toUpperCase() + value.slice(1)\n\nexport const spaceToCss = (space: Space) => `${space}px`\n\nconst toKebab = (value: string) =>\n value.replace(/[A-Z]/g, (char) => `-${char.toLowerCase()}`)\n\n/**\n * Turns a responsive prop into inline `--local-<prop>[-<bp>]` vars plus the\n * `<prop><Bp>` module classes that gate them; the base var is read by the root class.\n */\nexport const getResponsiveProps = <T>(\n prop: string,\n value: Responsive<T> | undefined,\n toCss: (value: T) => string,\n styles: Record<string, string>,\n) => {\n const style: Record<string, string> = {}\n const className: string[] = []\n\n const values = (\n typeof value === 'object' && value !== null ? value : { base: value }\n ) as ResponsiveObject<T>\n const varName = `--local-${toKebab(prop)}`\n\n if (values.base !== undefined) style[varName] = toCss(values.base)\n\n for (const bp of breakpoints) {\n const item = values[bp]\n if (item === undefined) continue\n style[`${varName}-${bp}`] = toCss(item)\n const cls = styles[`${prop}${capitalize(bp)}`]\n if (cls) className.push(cls)\n }\n\n return { style: style as CSSProperties, className }\n}\n\nconst toObject = <T>(value: Responsive<T>) =>\n (typeof value === 'object' && value !== null\n ? value\n : { base: value }) as ResponsiveObject<T>\n\n/** Merges per key; `b` wins over `a`. */\nexport const mergeResponsive = <T>(\n a?: Responsive<T>,\n b?: Responsive<T>,\n): Responsive<T> | undefined => {\n if (a === undefined && b === undefined) return undefined\n return {\n ...(a === undefined ? {} : toObject(a)),\n ...(b === undefined ? {} : toObject(b)),\n }\n}\n\n/** Turns a responsive prop into inline `--local-<prop>[-<bp>]` vars, for roots that declare a per-breakpoint fallback chain. */\nexport const responsiveVars = <T>(\n prop: string,\n value: Responsive<T> | undefined,\n toCss: (value: T) => string,\n): CSSProperties => {\n if (value === undefined) return {}\n\n const values = toObject(value)\n const varName = `--local-${toKebab(prop)}`\n const style: Record<string, string> = {}\n\n if (values.base !== undefined) style[varName] = toCss(values.base)\n\n for (const bp of breakpoints) {\n const item = values[bp]\n if (item !== undefined) style[`${varName}-${bp}`] = toCss(item)\n }\n\n return style as CSSProperties\n}\n"],"names":["breakpoints","capitalize","value","charAt","toUpperCase","slice","spaceToCss","space","toKebab","replace","char","toLowerCase","getResponsiveProps","prop","toCss","styles","style","className","values","base","varName","undefined","bp","item","cls","push","toObject","mergeResponsive","a","b","responsiveVars"],"mappings":"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"}
@@ -0,0 +1,88 @@
1
+ import { useRef, useLayoutEffect, useEffect } from 'react';
2
+ import cn from 'classnames';
3
+ import styles from './Breadcrumbs.module.css.mjs';
4
+ import { jsx, jsxs } from 'react/jsx-runtime';
5
+ import { ActionElement } from '../utils/ActionElement.mjs';
6
+ import { IconChevronRight } from '../icons/components/base/IconChevronRight.mjs';
7
+
8
+ const syncFade = list => {
9
+ list.toggleAttribute('data-fade-start', list.scrollLeft > 0);
10
+ list.toggleAttribute('data-fade-end', list.scrollLeft < list.scrollWidth - list.clientWidth - 1);
11
+ };
12
+ const syncTitle = e => {
13
+ const el = e.target.closest('[data-label]');
14
+ if (!el) return;
15
+ if (el.scrollWidth > el.clientWidth) el.setAttribute('title', el.textContent ?? '');else el.removeAttribute('title');
16
+ };
17
+ const Breadcrumbs = _ref => {
18
+ let {
19
+ items,
20
+ className,
21
+ ...rest
22
+ } = _ref;
23
+ const listRef = useRef(null);
24
+ useLayoutEffect(() => {
25
+ const list = listRef.current;
26
+ if (!list) return;
27
+ list.scrollLeft = list.scrollWidth;
28
+ syncFade(list);
29
+ }, [items]);
30
+ useEffect(() => {
31
+ const list = listRef.current;
32
+ if (!list || typeof ResizeObserver === 'undefined') return;
33
+ const observer = new ResizeObserver(() => syncFade(list));
34
+ observer.observe(list);
35
+ return () => observer.disconnect();
36
+ }, []);
37
+ return /*#__PURE__*/jsx("nav", {
38
+ "aria-label": "Breadcrumb",
39
+ className: cn(styles.nav, className),
40
+ ...rest,
41
+ children: /*#__PURE__*/jsx("ol", {
42
+ ref: listRef,
43
+ className: styles.list,
44
+ onScroll: e => syncFade(e.currentTarget),
45
+ onPointerOver: syncTitle,
46
+ children: items.map((_ref2, index) => {
47
+ let {
48
+ label,
49
+ ...itemProps
50
+ } = _ref2;
51
+ const labelAttrs = itemProps.title === undefined ? {
52
+ 'data-label': ''
53
+ } : {};
54
+ if (index === items.length - 1) {
55
+ return /*#__PURE__*/jsx("li", {
56
+ className: styles.item,
57
+ children: /*#__PURE__*/jsx("span", {
58
+ "aria-current": "page",
59
+ className: cn(styles.label, styles.current),
60
+ ...labelAttrs,
61
+ children: label
62
+ })
63
+ }, index);
64
+ }
65
+ const interactive = itemProps.href !== undefined || itemProps.onClick !== undefined;
66
+ return /*#__PURE__*/jsxs("li", {
67
+ className: styles.item,
68
+ children: [interactive ? /*#__PURE__*/jsx(ActionElement, {
69
+ ...itemProps,
70
+ ...labelAttrs,
71
+ className: cn(styles.label, styles.link, itemProps.className),
72
+ children: label
73
+ }) : /*#__PURE__*/jsx("span", {
74
+ className: styles.label,
75
+ ...labelAttrs,
76
+ children: label
77
+ }), /*#__PURE__*/jsx(IconChevronRight, {
78
+ className: styles.separator,
79
+ "aria-hidden": "true"
80
+ })]
81
+ }, index);
82
+ })
83
+ })
84
+ });
85
+ };
86
+
87
+ export { Breadcrumbs };
88
+ //# sourceMappingURL=Breadcrumbs.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Breadcrumbs.mjs","sources":["../../../src/breadcrumbs/Breadcrumbs.tsx"],"sourcesContent":["import { useEffect, useLayoutEffect, useRef } from 'react'\nimport type { HTMLAttributes, PointerEvent, ReactNode } from 'react'\n\nimport cn from 'classnames'\n\nimport { IconChevronRight } from '../icons'\nimport { ActionElement, type ActionElementProps } from '../utils'\nimport styles from './Breadcrumbs.module.css'\n\nexport type BreadcrumbItem = ActionElementProps & {\n label: ReactNode\n children?: never\n}\n\nexport type BreadcrumbsProps = HTMLAttributes<HTMLElement> & {\n items: BreadcrumbItem[]\n}\n\nconst syncFade = (list: HTMLElement) => {\n list.toggleAttribute('data-fade-start', list.scrollLeft > 0)\n list.toggleAttribute(\n 'data-fade-end',\n list.scrollLeft < list.scrollWidth - list.clientWidth - 1,\n )\n}\n\nconst syncTitle = (e: PointerEvent<HTMLElement>) => {\n const el = (e.target as Element).closest('[data-label]')\n if (!el) return\n if (el.scrollWidth > el.clientWidth)\n el.setAttribute('title', el.textContent ?? '')\n else el.removeAttribute('title')\n}\n\nexport const Breadcrumbs = ({\n items,\n className,\n ...rest\n}: BreadcrumbsProps) => {\n const listRef = useRef<HTMLOListElement>(null)\n\n useLayoutEffect(() => {\n const list = listRef.current\n if (!list) return\n list.scrollLeft = list.scrollWidth\n syncFade(list)\n }, [items])\n\n useEffect(() => {\n const list = listRef.current\n if (!list || typeof ResizeObserver === 'undefined') return\n const observer = new ResizeObserver(() => syncFade(list))\n observer.observe(list)\n return () => observer.disconnect()\n }, [])\n\n return (\n <nav\n aria-label='Breadcrumb'\n className={cn(styles.nav, className)}\n {...rest}\n >\n <ol\n ref={listRef}\n className={styles.list}\n onScroll={(e) => syncFade(e.currentTarget)}\n onPointerOver={syncTitle}\n >\n {items.map(({ label, ...itemProps }, index) => {\n const labelAttrs =\n itemProps.title === undefined ? { 'data-label': '' } : {}\n if (index === items.length - 1) {\n return (\n <li key={index} className={styles.item}>\n <span\n aria-current='page'\n className={cn(styles.label, styles.current)}\n {...labelAttrs}\n >\n {label}\n </span>\n </li>\n )\n }\n const interactive =\n itemProps.href !== undefined || itemProps.onClick !== undefined\n return (\n <li key={index} className={styles.item}>\n {interactive ? (\n <ActionElement\n {...itemProps}\n {...labelAttrs}\n className={cn(styles.label, styles.link, itemProps.className)}\n >\n {label}\n </ActionElement>\n ) : (\n <span className={styles.label} {...labelAttrs}>\n {label}\n </span>\n )}\n <IconChevronRight\n className={styles.separator}\n aria-hidden='true'\n />\n </li>\n )\n })}\n </ol>\n </nav>\n )\n}\n"],"names":["syncFade","list","toggleAttribute","scrollLeft","scrollWidth","clientWidth","syncTitle","e","el","target","closest","setAttribute","textContent","removeAttribute","Breadcrumbs","_ref","items","className","rest","listRef","useRef","useLayoutEffect","current","useEffect","ResizeObserver","observer","observe","disconnect","_jsx","cn","styles","nav","children","ref","onScroll","currentTarget","onPointerOver","map","_ref2","index","label","itemProps","labelAttrs","title","undefined","length","item","interactive","href","onClick","_jsxs","ActionElement","link","IconChevronRight","separator"],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ const styles = {"nav":"Breadcrumbs-module_nav__cDuA5","list":"Breadcrumbs-module_list__A6dlB","item":"Breadcrumbs-module_item__3t-Zj","label":"Breadcrumbs-module_label__gVU35","link":"Breadcrumbs-module_link__KJ87-","current":"Breadcrumbs-module_current__XK0a2","separator":"Breadcrumbs-module_separator__k-Tmd"};
2
+
3
+ export { styles as default };
4
+ //# sourceMappingURL=Breadcrumbs.module.css.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Breadcrumbs.module.css.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -0,0 +1,22 @@
1
+ import { forwardRef } from 'react';
2
+ import cn from 'classnames';
3
+ import styles from './Divider.module.css.mjs';
4
+ import { jsx } from 'react/jsx-runtime';
5
+
6
+ /** Visual-only 1px line in the default border color; stretches along the cross axis of a flex parent. Pass role='separator' for semantics. */
7
+ const Divider = /*#__PURE__*/forwardRef((_ref, ref) => {
8
+ let {
9
+ orientation = 'horizontal',
10
+ className,
11
+ ...rest
12
+ } = _ref;
13
+ return /*#__PURE__*/jsx("div", {
14
+ ref: ref,
15
+ className: cn(styles.root, styles[orientation], className),
16
+ ...rest
17
+ });
18
+ });
19
+ Divider.displayName = 'Divider';
20
+
21
+ export { Divider };
22
+ //# sourceMappingURL=Divider.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Divider.mjs","sources":["../../../src/divider/Divider.tsx"],"sourcesContent":["import { forwardRef, type HTMLAttributes } from 'react'\n\nimport cn from 'classnames'\n\nimport styles from './Divider.module.css'\n\nexport type DividerOrientation = 'horizontal' | 'vertical'\n\nexport type DividerProps = Omit<HTMLAttributes<HTMLDivElement>, 'children'> & {\n orientation?: DividerOrientation\n}\n\n/** Visual-only 1px line in the default border color; stretches along the cross axis of a flex parent. Pass role='separator' for semantics. */\nexport const Divider = forwardRef<HTMLDivElement, DividerProps>(\n ({ orientation = 'horizontal', className, ...rest }, ref) => (\n <div\n ref={ref}\n className={cn(styles.root, styles[orientation], className)}\n {...rest}\n />\n ),\n)\n\nDivider.displayName = 'Divider'\n"],"names":["Divider","forwardRef","_ref","ref","orientation","className","rest","_jsx","cn","styles","root","displayName"],"mappings":";;;;;AAYA;AACO,MAAMA,OAAO,gBAAGC,UAAU,CAC/B,CAAAC,IAAA,EAAqDC,GAAG,KAAA;EAAA,IAAvD;AAAEC,IAAAA,WAAW,GAAG,YAAY;IAAEC,SAAS;IAAE,GAAGC,IAAAA;AAAK,GAAC,GAAAJ,IAAA,CAAA;AAAA,EAAA,oBACjDK,GAAA,CAAA,KAAA,EAAA;AACEJ,IAAAA,GAAG,EAAEA,GAAI;AACTE,IAAAA,SAAS,EAAEG,EAAE,CAACC,MAAM,CAACC,IAAI,EAAED,MAAM,CAACL,WAAW,CAAC,EAAEC,SAAS,CAAE;IAAA,GACvDC,IAAAA;AAAI,GACT,CAAC,CAAA;AAAA,CAEN,EAAC;AAEDN,OAAO,CAACW,WAAW,GAAG,SAAS;;;;"}
@@ -0,0 +1,4 @@
1
+ const styles = {"root":"Divider-module_root__SVXVb","horizontal":"Divider-module_horizontal__1RnR-","vertical":"Divider-module_vertical__pIPZy"};
2
+
3
+ export { styles as default };
4
+ //# sourceMappingURL=Divider.module.css.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Divider.module.css.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -0,0 +1,43 @@
1
+ import { forwardRef } from 'react';
2
+ import cn from 'classnames';
3
+ import styles from './Grid.module.css.mjs';
4
+ import { jsx } from 'react/jsx-runtime';
5
+ import { responsiveVars, mergeResponsive, capitalize, spaceToCss } from '../utils/responsive.mjs';
6
+
7
+ const columnsToCss = columns => typeof columns === 'number' ? `repeat(${columns}, minmax(0, 1fr))` : columns;
8
+
9
+ /** CSS grid container with equal, templated or auto-fit columns and a spacing scale. */
10
+ const Grid = /*#__PURE__*/forwardRef((_ref, ref) => {
11
+ let {
12
+ as: Component = 'div',
13
+ columns,
14
+ minItemWidth,
15
+ gap,
16
+ rowGap,
17
+ columnGap,
18
+ align,
19
+ className,
20
+ style,
21
+ ...rest
22
+ } = _ref;
23
+ const minWidth = typeof minItemWidth === 'number' ? `${minItemWidth}px` : minItemWidth;
24
+ const template = minItemWidth !== undefined ? `repeat(auto-fit, minmax(min(${minWidth}, 100%), 1fr))` : columns;
25
+ const vars = {
26
+ ...responsiveVars('columns', template, columnsToCss),
27
+ ...responsiveVars('rowGap', mergeResponsive(gap, rowGap), spaceToCss),
28
+ ...responsiveVars('columnGap', mergeResponsive(gap, columnGap), spaceToCss)
29
+ };
30
+ return /*#__PURE__*/jsx(Component, {
31
+ ref: ref,
32
+ className: cn(styles.root, align && styles[`align${capitalize(align)}`], className),
33
+ style: {
34
+ ...vars,
35
+ ...style
36
+ },
37
+ ...rest
38
+ });
39
+ });
40
+ Grid.displayName = 'Grid';
41
+
42
+ export { Grid };
43
+ //# sourceMappingURL=Grid.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Grid.mjs","sources":["../../../src/grid/Grid.tsx"],"sourcesContent":["import { forwardRef, type ElementType, type HTMLAttributes } from 'react'\n\nimport cn from 'classnames'\n\nimport {\n capitalize,\n mergeResponsive,\n responsiveVars,\n spaceToCss,\n type Responsive,\n type Space,\n} from '../utils'\nimport styles from './Grid.module.css'\n\nexport type GridAlign = 'start' | 'center' | 'end' | 'stretch'\n\nexport type GridProps = HTMLAttributes<HTMLElement> & {\n as?: ElementType\n /** A number makes equal columns; a string is used as raw `grid-template-columns`. */\n columns?: Responsive<number | string>\n /** Auto-fit columns of at least this width (number = px). Takes precedence over `columns`. */\n minItemWidth?: number | string\n gap?: Responsive<Space>\n /** Overrides `gap` for rows, per breakpoint. */\n rowGap?: Responsive<Space>\n /** Overrides `gap` for columns, per breakpoint. */\n columnGap?: Responsive<Space>\n align?: GridAlign\n}\n\nconst columnsToCss = (columns: number | string) =>\n typeof columns === 'number' ? `repeat(${columns}, minmax(0, 1fr))` : columns\n\n/** CSS grid container with equal, templated or auto-fit columns and a spacing scale. */\nexport const Grid = forwardRef<HTMLElement, GridProps>(\n (\n {\n as: Component = 'div',\n columns,\n minItemWidth,\n gap,\n rowGap,\n columnGap,\n align,\n className,\n style,\n ...rest\n },\n ref,\n ) => {\n const minWidth =\n typeof minItemWidth === 'number' ? `${minItemWidth}px` : minItemWidth\n const template =\n minItemWidth !== undefined\n ? `repeat(auto-fit, minmax(min(${minWidth}, 100%), 1fr))`\n : columns\n\n const vars = {\n ...responsiveVars('columns', template, columnsToCss),\n ...responsiveVars('rowGap', mergeResponsive(gap, rowGap), spaceToCss),\n ...responsiveVars(\n 'columnGap',\n mergeResponsive(gap, columnGap),\n spaceToCss,\n ),\n }\n\n return (\n <Component\n ref={ref}\n className={cn(\n styles.root,\n align && styles[`align${capitalize(align)}`],\n className,\n )}\n style={{ ...vars, ...style }}\n {...rest}\n />\n )\n },\n)\n\nGrid.displayName = 'Grid'\n"],"names":["columnsToCss","columns","Grid","forwardRef","_ref","ref","as","Component","minItemWidth","gap","rowGap","columnGap","align","className","style","rest","minWidth","template","undefined","vars","responsiveVars","mergeResponsive","spaceToCss","_jsx","cn","styles","root","capitalize","displayName"],"mappings":";;;;;;AA8BA,MAAMA,YAAY,GAAIC,OAAwB,IAC5C,OAAOA,OAAO,KAAK,QAAQ,GAAG,CAAA,OAAA,EAAUA,OAAO,CAAA,iBAAA,CAAmB,GAAGA,OAAO,CAAA;;AAE9E;AACO,MAAMC,IAAI,gBAAGC,UAAU,CAC5B,CAAAC,IAAA,EAaEC,GAAG,KACA;EAAA,IAbH;IACEC,EAAE,EAAEC,SAAS,GAAG,KAAK;IACrBN,OAAO;IACPO,YAAY;IACZC,GAAG;IACHC,MAAM;IACNC,SAAS;IACTC,KAAK;IACLC,SAAS;IACTC,KAAK;IACL,GAAGC,IAAAA;AACL,GAAC,GAAAX,IAAA,CAAA;EAGD,MAAMY,QAAQ,GACZ,OAAOR,YAAY,KAAK,QAAQ,GAAG,CAAGA,EAAAA,YAAY,CAAI,EAAA,CAAA,GAAGA,YAAY,CAAA;EACvE,MAAMS,QAAQ,GACZT,YAAY,KAAKU,SAAS,GACtB,CAA+BF,4BAAAA,EAAAA,QAAQ,CAAgB,cAAA,CAAA,GACvDf,OAAO,CAAA;AAEb,EAAA,MAAMkB,IAAI,GAAG;AACX,IAAA,GAAGC,cAAc,CAAC,SAAS,EAAEH,QAAQ,EAAEjB,YAAY,CAAC;AACpD,IAAA,GAAGoB,cAAc,CAAC,QAAQ,EAAEC,eAAe,CAACZ,GAAG,EAAEC,MAAM,CAAC,EAAEY,UAAU,CAAC;IACrE,GAAGF,cAAc,CACf,WAAW,EACXC,eAAe,CAACZ,GAAG,EAAEE,SAAS,CAAC,EAC/BW,UACF,CAAA;GACD,CAAA;EAED,oBACEC,GAAA,CAAChB,SAAS,EAAA;AACRF,IAAAA,GAAG,EAAEA,GAAI;IACTQ,SAAS,EAAEW,EAAE,CACXC,MAAM,CAACC,IAAI,EACXd,KAAK,IAAIa,MAAM,CAAC,CAAQE,KAAAA,EAAAA,UAAU,CAACf,KAAK,CAAC,EAAE,CAAC,EAC5CC,SACF,CAAE;AACFC,IAAAA,KAAK,EAAE;AAAE,MAAA,GAAGK,IAAI;MAAE,GAAGL,KAAAA;KAAQ;IAAA,GACzBC,IAAAA;AAAI,GACT,CAAC,CAAA;AAEN,CACF,EAAC;AAEDb,IAAI,CAAC0B,WAAW,GAAG,MAAM;;;;"}
@@ -0,0 +1,4 @@
1
+ const styles = {"root":"Grid-module_root__WQ5eA","alignStart":"Grid-module_alignStart__tJzED","alignCenter":"Grid-module_alignCenter__Br-nr","alignEnd":"Grid-module_alignEnd__oWTV-","alignStretch":"Grid-module_alignStretch__v1rgi"};
2
+
3
+ export { styles as default };
4
+ //# sourceMappingURL=Grid.module.css.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Grid.module.css.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -0,0 +1,35 @@
1
+ import { forwardRef } from 'react';
2
+ import cn from 'classnames';
3
+ import styles from './GridItem.module.css.mjs';
4
+ import { jsx } from 'react/jsx-runtime';
5
+ import { responsiveVars } from '../utils/responsive.mjs';
6
+
7
+ const spanToCss = span => span === 'full' ? '1 / -1' : `span ${span} / span ${span}`;
8
+
9
+ /** Grid child that can span columns or sit in a named area. */
10
+ const GridItem = /*#__PURE__*/forwardRef((_ref, ref) => {
11
+ let {
12
+ as: Component = 'div',
13
+ span,
14
+ area,
15
+ className,
16
+ style,
17
+ ...rest
18
+ } = _ref;
19
+ return /*#__PURE__*/jsx(Component, {
20
+ ref: ref,
21
+ className: cn(styles.root, className),
22
+ style: {
23
+ ...responsiveVars('span', span, spanToCss),
24
+ ...(area !== undefined && {
25
+ gridArea: area
26
+ }),
27
+ ...style
28
+ },
29
+ ...rest
30
+ });
31
+ });
32
+ GridItem.displayName = 'GridItem';
33
+
34
+ export { GridItem };
35
+ //# sourceMappingURL=GridItem.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GridItem.mjs","sources":["../../../src/grid/GridItem.tsx"],"sourcesContent":["import { forwardRef, type ElementType, type HTMLAttributes } from 'react'\n\nimport cn from 'classnames'\n\nimport { responsiveVars, type Responsive } from '../utils'\nimport styles from './GridItem.module.css'\n\nexport type GridItemProps = HTMLAttributes<HTMLElement> & {\n as?: ElementType\n /** Number of columns to span; `'full'` spans every column. */\n span?: Responsive<number | 'full'>\n area?: string\n}\n\nconst spanToCss = (span: number | 'full') =>\n span === 'full' ? '1 / -1' : `span ${span} / span ${span}`\n\n/** Grid child that can span columns or sit in a named area. */\nexport const GridItem = forwardRef<HTMLElement, GridItemProps>(\n ({ as: Component = 'div', span, area, className, style, ...rest }, ref) => {\n return (\n <Component\n ref={ref}\n className={cn(styles.root, className)}\n style={{\n ...responsiveVars('span', span, spanToCss),\n ...(area !== undefined && { gridArea: area }),\n ...style,\n }}\n {...rest}\n />\n )\n },\n)\n\nGridItem.displayName = 'GridItem'\n"],"names":["spanToCss","span","GridItem","forwardRef","_ref","ref","as","Component","area","className","style","rest","_jsx","cn","styles","root","responsiveVars","undefined","gridArea","displayName"],"mappings":";;;;;;AAcA,MAAMA,SAAS,GAAIC,IAAqB,IACtCA,IAAI,KAAK,MAAM,GAAG,QAAQ,GAAG,CAAA,KAAA,EAAQA,IAAI,CAAA,QAAA,EAAWA,IAAI,CAAE,CAAA,CAAA;;AAE5D;AACO,MAAMC,QAAQ,gBAAGC,UAAU,CAChC,CAAAC,IAAA,EAAmEC,GAAG,KAAK;EAAA,IAA1E;IAAEC,EAAE,EAAEC,SAAS,GAAG,KAAK;IAAEN,IAAI;IAAEO,IAAI;IAAEC,SAAS;IAAEC,KAAK;IAAE,GAAGC,IAAAA;AAAK,GAAC,GAAAP,IAAA,CAAA;EAC/D,oBACEQ,GAAA,CAACL,SAAS,EAAA;AACRF,IAAAA,GAAG,EAAEA,GAAI;IACTI,SAAS,EAAEI,EAAE,CAACC,MAAM,CAACC,IAAI,EAAEN,SAAS,CAAE;AACtCC,IAAAA,KAAK,EAAE;AACL,MAAA,GAAGM,cAAc,CAAC,MAAM,EAAEf,IAAI,EAAED,SAAS,CAAC;MAC1C,IAAIQ,IAAI,KAAKS,SAAS,IAAI;AAAEC,QAAAA,QAAQ,EAAEV,IAAAA;AAAK,OAAC,CAAC;MAC7C,GAAGE,KAAAA;KACH;IAAA,GACEC,IAAAA;AAAI,GACT,CAAC,CAAA;AAEN,CACF,EAAC;AAEDT,QAAQ,CAACiB,WAAW,GAAG,UAAU;;;;"}
@@ -0,0 +1,4 @@
1
+ const styles = {"root":"GridItem-module_root__Jj7cu"};
2
+
3
+ export { styles as default };
4
+ //# sourceMappingURL=GridItem.module.css.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GridItem.module.css.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -0,0 +1,27 @@
1
+ import cn from 'classnames';
2
+ import styles from './Header.module.css.mjs';
3
+ import { jsxs, jsx } from 'react/jsx-runtime';
4
+
5
+ const Header = _ref => {
6
+ let {
7
+ children,
8
+ actions,
9
+ sticky,
10
+ className,
11
+ ...rest
12
+ } = _ref;
13
+ return /*#__PURE__*/jsxs("header", {
14
+ className: cn(styles.header, sticky && styles.sticky, className),
15
+ ...rest,
16
+ children: [/*#__PURE__*/jsx("div", {
17
+ className: styles.content,
18
+ children: children
19
+ }), actions != null ? /*#__PURE__*/jsx("div", {
20
+ className: styles.actions,
21
+ children: actions
22
+ }) : null]
23
+ });
24
+ };
25
+
26
+ export { Header };
27
+ //# sourceMappingURL=Header.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Header.mjs","sources":["../../../src/header/Header.tsx"],"sourcesContent":["import type { ComponentPropsWithoutRef, ReactNode } from 'react'\n\nimport cn from 'classnames'\n\nimport styles from './Header.module.css'\n\nexport type HeaderProps = ComponentPropsWithoutRef<'header'> & {\n /** Right control group. */\n actions?: ReactNode\n /** Sticks to the top of the viewport while scrolling. */\n sticky?: boolean\n}\n\nexport const Header = ({\n children,\n actions,\n sticky,\n className,\n ...rest\n}: HeaderProps) => (\n <header\n className={cn(styles.header, sticky && styles.sticky, className)}\n {...rest}\n >\n <div className={styles.content}>{children}</div>\n {actions != null ? <div className={styles.actions}>{actions}</div> : null}\n </header>\n)\n"],"names":["Header","_ref","children","actions","sticky","className","rest","_jsxs","cn","styles","header","_jsx","content"],"mappings":";;;;AAaO,MAAMA,MAAM,GAAGC,IAAA,IAAA;EAAA,IAAC;IACrBC,QAAQ;IACRC,OAAO;IACPC,MAAM;IACNC,SAAS;IACT,GAAGC,IAAAA;AACQ,GAAC,GAAAL,IAAA,CAAA;AAAA,EAAA,oBACZM,IAAA,CAAA,QAAA,EAAA;AACEF,IAAAA,SAAS,EAAEG,EAAE,CAACC,MAAM,CAACC,MAAM,EAAEN,MAAM,IAAIK,MAAM,CAACL,MAAM,EAAEC,SAAS,CAAE;AAAA,IAAA,GAC7DC,IAAI;AAAAJ,IAAAA,QAAA,gBAERS,GAAA,CAAA,KAAA,EAAA;MAAKN,SAAS,EAAEI,MAAM,CAACG,OAAQ;AAAAV,MAAAA,QAAA,EAAEA,QAAAA;AAAQ,KAAM,CAAC,EAC/CC,OAAO,IAAI,IAAI,gBAAGQ,GAAA,CAAA,KAAA,EAAA;MAAKN,SAAS,EAAEI,MAAM,CAACN,OAAQ;AAAAD,MAAAA,QAAA,EAAEC,OAAAA;KAAa,CAAC,GAAG,IAAI,CAAA;AAAA,GACnE,CAAC,CAAA;AAAA;;;;"}
@@ -0,0 +1,4 @@
1
+ const styles = {"header":"Header-module_header__BlKE6","sticky":"Header-module_sticky__ftIiS","content":"Header-module_content__P2dip","actions":"Header-module_actions__iRAGS"};
2
+
3
+ export { styles as default };
4
+ //# sourceMappingURL=Header.module.css.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Header.module.css.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -0,0 +1,65 @@
1
+ import { forwardRef, useRef, useCallback, useEffect } from 'react';
2
+ import cn from 'classnames';
3
+ import styles from './HeaderNav.module.css.mjs';
4
+ import { jsx } from 'react/jsx-runtime';
5
+
6
+ const syncFade = nav => {
7
+ nav.toggleAttribute('data-fade-start', nav.scrollLeft > 0);
8
+ nav.toggleAttribute('data-fade-end', nav.scrollLeft < nav.scrollWidth - nav.clientWidth - 1);
9
+ };
10
+ const scrollActiveIntoView = nav => {
11
+ const active = nav.querySelector("[aria-current='page']");
12
+ if (!active) return;
13
+ const navRect = nav.getBoundingClientRect();
14
+ const activeRect = active.getBoundingClientRect();
15
+ nav.scrollLeft += activeRect.left - navRect.left - (nav.clientWidth - activeRect.width) / 2;
16
+ };
17
+ const HeaderNav = /*#__PURE__*/forwardRef((_ref, ref) => {
18
+ let {
19
+ 'aria-label': ariaLabel = 'Main',
20
+ className,
21
+ onScroll,
22
+ ...rest
23
+ } = _ref;
24
+ const navRef = useRef(null);
25
+ const setRef = useCallback(node => {
26
+ navRef.current = node;
27
+ if (typeof ref === 'function') ref(node);else if (ref) ref.current = node;
28
+ }, [ref]);
29
+ useEffect(() => {
30
+ const nav = navRef.current;
31
+ if (!nav) return;
32
+ const sync = () => {
33
+ scrollActiveIntoView(nav);
34
+ syncFade(nav);
35
+ };
36
+ sync();
37
+ const mutations = typeof MutationObserver === 'undefined' ? null : new MutationObserver(sync);
38
+ mutations?.observe(nav, {
39
+ childList: true,
40
+ subtree: true,
41
+ attributes: true,
42
+ attributeFilter: ['aria-current']
43
+ });
44
+ const resizes = typeof ResizeObserver === 'undefined' ? null : new ResizeObserver(() => syncFade(nav));
45
+ resizes?.observe(nav);
46
+ return () => {
47
+ mutations?.disconnect();
48
+ resizes?.disconnect();
49
+ };
50
+ }, []);
51
+ return /*#__PURE__*/jsx("nav", {
52
+ ref: setRef,
53
+ "aria-label": ariaLabel,
54
+ className: cn(styles.nav, className),
55
+ onScroll: e => {
56
+ syncFade(e.currentTarget);
57
+ onScroll?.(e);
58
+ },
59
+ ...rest
60
+ });
61
+ });
62
+ HeaderNav.displayName = 'HeaderNav';
63
+
64
+ export { HeaderNav };
65
+ //# sourceMappingURL=HeaderNav.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HeaderNav.mjs","sources":["../../../src/header/HeaderNav.tsx"],"sourcesContent":["import { forwardRef, useCallback, useEffect, useRef } from 'react'\nimport type { ComponentPropsWithoutRef } from 'react'\n\nimport cn from 'classnames'\n\nimport styles from './HeaderNav.module.css'\n\nexport type HeaderNavProps = ComponentPropsWithoutRef<'nav'>\n\nconst syncFade = (nav: HTMLElement) => {\n nav.toggleAttribute('data-fade-start', nav.scrollLeft > 0)\n nav.toggleAttribute(\n 'data-fade-end',\n nav.scrollLeft < nav.scrollWidth - nav.clientWidth - 1,\n )\n}\n\nconst scrollActiveIntoView = (nav: HTMLElement) => {\n const active = nav.querySelector<HTMLElement>(\"[aria-current='page']\")\n if (!active) return\n const navRect = nav.getBoundingClientRect()\n const activeRect = active.getBoundingClientRect()\n nav.scrollLeft +=\n activeRect.left - navRect.left - (nav.clientWidth - activeRect.width) / 2\n}\n\nexport const HeaderNav = forwardRef<HTMLElement, HeaderNavProps>(\n ({ 'aria-label': ariaLabel = 'Main', className, onScroll, ...rest }, ref) => {\n const navRef = useRef<HTMLElement | null>(null)\n\n const setRef = useCallback(\n (node: HTMLElement | null) => {\n navRef.current = node\n if (typeof ref === 'function') ref(node)\n else if (ref) ref.current = node\n },\n [ref],\n )\n\n useEffect(() => {\n const nav = navRef.current\n if (!nav) return\n const sync = () => {\n scrollActiveIntoView(nav)\n syncFade(nav)\n }\n sync()\n const mutations =\n typeof MutationObserver === 'undefined'\n ? null\n : new MutationObserver(sync)\n mutations?.observe(nav, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['aria-current'],\n })\n const resizes =\n typeof ResizeObserver === 'undefined'\n ? null\n : new ResizeObserver(() => syncFade(nav))\n resizes?.observe(nav)\n return () => {\n mutations?.disconnect()\n resizes?.disconnect()\n }\n }, [])\n\n return (\n <nav\n ref={setRef}\n aria-label={ariaLabel}\n className={cn(styles.nav, className)}\n onScroll={(e) => {\n syncFade(e.currentTarget)\n onScroll?.(e)\n }}\n {...rest}\n />\n )\n },\n)\n\nHeaderNav.displayName = 'HeaderNav'\n"],"names":["syncFade","nav","toggleAttribute","scrollLeft","scrollWidth","clientWidth","scrollActiveIntoView","active","querySelector","navRect","getBoundingClientRect","activeRect","left","width","HeaderNav","forwardRef","_ref","ref","ariaLabel","className","onScroll","rest","navRef","useRef","setRef","useCallback","node","current","useEffect","sync","mutations","MutationObserver","observe","childList","subtree","attributes","attributeFilter","resizes","ResizeObserver","disconnect","_jsx","cn","styles","e","currentTarget","displayName"],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ const styles = {"nav":"HeaderNav-module_nav__YxWpA"};
2
+
3
+ export { styles as default };
4
+ //# sourceMappingURL=HeaderNav.module.css.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HeaderNav.module.css.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}