@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
package/README.md CHANGED
@@ -28,7 +28,36 @@ function Widget() {
28
28
  }
29
29
  ```
30
30
 
31
- Theme providers (`ThemeProvider`, `CookieThemeProvider`, `ThemeToggler`) are re-exported from `@lidofinance/lido-shared-ui`. The color tokens follow the `data-lido-theme` attribute they set, so switching to the dark theme restyles these components.
31
+ Theme providers (`ThemeProvider`, `CookieThemeProvider`, `ThemeToggler`) are re-exported from `@lidofinance/lido-shared-ui`. The color tokens follow the `data-lido-theme` attribute they set, so switching to the dark theme restyles these components. `ThemeSwitcher` is the app-ui-styled theme toggle, since the shared `ThemeToggler` relies on `--lido-ui-*` tokens that app-ui doesn't define.
32
+
33
+ ## Router links
34
+
35
+ Link components (`TextLink`, `SmallCard`) render a plain `<a>` by default. Wrap the app in `LinkProvider` to route in-app hrefs through your router's link component; `externalComponent` does the same for absolute URLs. Hash links, `download` links and links with a non-`_self` `target` always stay a plain `<a>`.
36
+
37
+ Next.js 12 — `next/link` needs an `<a>` child, so wrap it once at module level:
38
+
39
+ ```tsx
40
+ import { forwardRef } from 'react'
41
+ import type { AppProps } from 'next/app'
42
+ import NextLink from 'next/link'
43
+ import { LinkProvider, type LinkComponentProps } from '@lidofinance/lido-app-ui'
44
+
45
+ const AppLink = forwardRef<HTMLAnchorElement, LinkComponentProps>(
46
+ ({ href, ...rest }, ref) => (
47
+ <NextLink href={href}>
48
+ <a ref={ref} {...rest} />
49
+ </NextLink>
50
+ ),
51
+ )
52
+
53
+ export default function App({ Component, pageProps }: AppProps) {
54
+ return (
55
+ <LinkProvider component={AppLink}>
56
+ <Component {...pageProps} />
57
+ </LinkProvider>
58
+ )
59
+ }
60
+ ```
32
61
 
33
62
  ## Customization
34
63
 
package/dist/README.md CHANGED
@@ -28,7 +28,36 @@ function Widget() {
28
28
  }
29
29
  ```
30
30
 
31
- Theme providers (`ThemeProvider`, `CookieThemeProvider`, `ThemeToggler`) are re-exported from `@lidofinance/lido-shared-ui`. The color tokens follow the `data-lido-theme` attribute they set, so switching to the dark theme restyles these components.
31
+ Theme providers (`ThemeProvider`, `CookieThemeProvider`, `ThemeToggler`) are re-exported from `@lidofinance/lido-shared-ui`. The color tokens follow the `data-lido-theme` attribute they set, so switching to the dark theme restyles these components. `ThemeSwitcher` is the app-ui-styled theme toggle, since the shared `ThemeToggler` relies on `--lido-ui-*` tokens that app-ui doesn't define.
32
+
33
+ ## Router links
34
+
35
+ Link components (`TextLink`, `SmallCard`) render a plain `<a>` by default. Wrap the app in `LinkProvider` to route in-app hrefs through your router's link component; `externalComponent` does the same for absolute URLs. Hash links, `download` links and links with a non-`_self` `target` always stay a plain `<a>`.
36
+
37
+ Next.js 12 — `next/link` needs an `<a>` child, so wrap it once at module level:
38
+
39
+ ```tsx
40
+ import { forwardRef } from 'react'
41
+ import type { AppProps } from 'next/app'
42
+ import NextLink from 'next/link'
43
+ import { LinkProvider, type LinkComponentProps } from '@lidofinance/lido-app-ui'
44
+
45
+ const AppLink = forwardRef<HTMLAnchorElement, LinkComponentProps>(
46
+ ({ href, ...rest }, ref) => (
47
+ <NextLink href={href}>
48
+ <a ref={ref} {...rest} />
49
+ </NextLink>
50
+ ),
51
+ )
52
+
53
+ export default function App({ Component, pageProps }: AppProps) {
54
+ return (
55
+ <LinkProvider component={AppLink}>
56
+ <Component {...pageProps} />
57
+ </LinkProvider>
58
+ )
59
+ }
60
+ ```
32
61
 
33
62
  ## Customization
34
63
 
@@ -0,0 +1,92 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
4
+
5
+ const react = require('react');
6
+ const cn = require('classnames');
7
+ const Breadcrumbs_module = require('./Breadcrumbs.module.css.cjs');
8
+ const jsxRuntime = require('react/jsx-runtime');
9
+ const ActionElement = require('../utils/ActionElement.cjs');
10
+ const IconChevronRight = require('../icons/components/base/IconChevronRight.cjs');
11
+
12
+ const syncFade = list => {
13
+ list.toggleAttribute('data-fade-start', list.scrollLeft > 0);
14
+ list.toggleAttribute('data-fade-end', list.scrollLeft < list.scrollWidth - list.clientWidth - 1);
15
+ };
16
+ const syncTitle = e => {
17
+ const el = e.target.closest('[data-label]');
18
+ if (!el) return;
19
+ if (el.scrollWidth > el.clientWidth) el.setAttribute('title', el.textContent ?? '');else el.removeAttribute('title');
20
+ };
21
+ const Breadcrumbs = _ref => {
22
+ let {
23
+ items,
24
+ className,
25
+ ...rest
26
+ } = _ref;
27
+ const listRef = react.useRef(null);
28
+ react.useLayoutEffect(() => {
29
+ const list = listRef.current;
30
+ if (!list) return;
31
+ list.scrollLeft = list.scrollWidth;
32
+ syncFade(list);
33
+ }, [items]);
34
+ react.useEffect(() => {
35
+ const list = listRef.current;
36
+ if (!list || typeof ResizeObserver === 'undefined') return;
37
+ const observer = new ResizeObserver(() => syncFade(list));
38
+ observer.observe(list);
39
+ return () => observer.disconnect();
40
+ }, []);
41
+ return /*#__PURE__*/jsxRuntime.jsx("nav", {
42
+ "aria-label": "Breadcrumb",
43
+ className: cn(Breadcrumbs_module.nav, className),
44
+ ...rest,
45
+ children: /*#__PURE__*/jsxRuntime.jsx("ol", {
46
+ ref: listRef,
47
+ className: Breadcrumbs_module.list,
48
+ onScroll: e => syncFade(e.currentTarget),
49
+ onPointerOver: syncTitle,
50
+ children: items.map((_ref2, index) => {
51
+ let {
52
+ label,
53
+ ...itemProps
54
+ } = _ref2;
55
+ const labelAttrs = itemProps.title === undefined ? {
56
+ 'data-label': ''
57
+ } : {};
58
+ if (index === items.length - 1) {
59
+ return /*#__PURE__*/jsxRuntime.jsx("li", {
60
+ className: Breadcrumbs_module.item,
61
+ children: /*#__PURE__*/jsxRuntime.jsx("span", {
62
+ "aria-current": "page",
63
+ className: cn(Breadcrumbs_module.label, Breadcrumbs_module.current),
64
+ ...labelAttrs,
65
+ children: label
66
+ })
67
+ }, index);
68
+ }
69
+ const interactive = itemProps.href !== undefined || itemProps.onClick !== undefined;
70
+ return /*#__PURE__*/jsxRuntime.jsxs("li", {
71
+ className: Breadcrumbs_module.item,
72
+ children: [interactive ? /*#__PURE__*/jsxRuntime.jsx(ActionElement.ActionElement, {
73
+ ...itemProps,
74
+ ...labelAttrs,
75
+ className: cn(Breadcrumbs_module.label, Breadcrumbs_module.link, itemProps.className),
76
+ children: label
77
+ }) : /*#__PURE__*/jsxRuntime.jsx("span", {
78
+ className: Breadcrumbs_module.label,
79
+ ...labelAttrs,
80
+ children: label
81
+ }), /*#__PURE__*/jsxRuntime.jsx(IconChevronRight.IconChevronRight, {
82
+ className: Breadcrumbs_module.separator,
83
+ "aria-hidden": "true"
84
+ })]
85
+ }, index);
86
+ })
87
+ })
88
+ });
89
+ };
90
+
91
+ exports.Breadcrumbs = Breadcrumbs;
92
+ //# sourceMappingURL=Breadcrumbs.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Breadcrumbs.cjs","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,6 @@
1
+ 'use strict';
2
+
3
+ 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"};
4
+
5
+ module.exports = styles;
6
+ //# sourceMappingURL=Breadcrumbs.module.css.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Breadcrumbs.module.css.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
@@ -0,0 +1,26 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
4
+
5
+ const react = require('react');
6
+ const cn = require('classnames');
7
+ const Divider_module = require('./Divider.module.css.cjs');
8
+ const jsxRuntime = require('react/jsx-runtime');
9
+
10
+ /** Visual-only 1px line in the default border color; stretches along the cross axis of a flex parent. Pass role='separator' for semantics. */
11
+ const Divider = /*#__PURE__*/react.forwardRef((_ref, ref) => {
12
+ let {
13
+ orientation = 'horizontal',
14
+ className,
15
+ ...rest
16
+ } = _ref;
17
+ return /*#__PURE__*/jsxRuntime.jsx("div", {
18
+ ref: ref,
19
+ className: cn(Divider_module.root, Divider_module[orientation], className),
20
+ ...rest
21
+ });
22
+ });
23
+ Divider.displayName = 'Divider';
24
+
25
+ exports.Divider = Divider;
26
+ //# sourceMappingURL=Divider.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Divider.cjs","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,gBAAU,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,cAAA,CAAA,KAAA,EAAA;AACEJ,IAAAA,GAAG,EAAEA,GAAI;AACTE,IAAAA,SAAS,EAAEG,EAAE,CAACC,cAAM,CAACC,IAAI,EAAED,cAAM,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,6 @@
1
+ 'use strict';
2
+
3
+ const styles = {"root":"Divider-module_root__SVXVb","horizontal":"Divider-module_horizontal__1RnR-","vertical":"Divider-module_vertical__pIPZy"};
4
+
5
+ module.exports = styles;
6
+ //# sourceMappingURL=Divider.module.css.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Divider.module.css.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
@@ -0,0 +1,47 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
4
+
5
+ const react = require('react');
6
+ const cn = require('classnames');
7
+ const Grid_module = require('./Grid.module.css.cjs');
8
+ const jsxRuntime = require('react/jsx-runtime');
9
+ const responsive = require('../utils/responsive.cjs');
10
+
11
+ const columnsToCss = columns => typeof columns === 'number' ? `repeat(${columns}, minmax(0, 1fr))` : columns;
12
+
13
+ /** CSS grid container with equal, templated or auto-fit columns and a spacing scale. */
14
+ const Grid = /*#__PURE__*/react.forwardRef((_ref, ref) => {
15
+ let {
16
+ as: Component = 'div',
17
+ columns,
18
+ minItemWidth,
19
+ gap,
20
+ rowGap,
21
+ columnGap,
22
+ align,
23
+ className,
24
+ style,
25
+ ...rest
26
+ } = _ref;
27
+ const minWidth = typeof minItemWidth === 'number' ? `${minItemWidth}px` : minItemWidth;
28
+ const template = minItemWidth !== undefined ? `repeat(auto-fit, minmax(min(${minWidth}, 100%), 1fr))` : columns;
29
+ const vars = {
30
+ ...responsive.responsiveVars('columns', template, columnsToCss),
31
+ ...responsive.responsiveVars('rowGap', responsive.mergeResponsive(gap, rowGap), responsive.spaceToCss),
32
+ ...responsive.responsiveVars('columnGap', responsive.mergeResponsive(gap, columnGap), responsive.spaceToCss)
33
+ };
34
+ return /*#__PURE__*/jsxRuntime.jsx(Component, {
35
+ ref: ref,
36
+ className: cn(Grid_module.root, align && Grid_module[`align${responsive.capitalize(align)}`], className),
37
+ style: {
38
+ ...vars,
39
+ ...style
40
+ },
41
+ ...rest
42
+ });
43
+ });
44
+ Grid.displayName = 'Grid';
45
+
46
+ exports.Grid = Grid;
47
+ //# sourceMappingURL=Grid.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Grid.cjs","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,gBAAU,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,yBAAc,CAAC,SAAS,EAAEH,QAAQ,EAAEjB,YAAY,CAAC;AACpD,IAAA,GAAGoB,yBAAc,CAAC,QAAQ,EAAEC,0BAAe,CAACZ,GAAG,EAAEC,MAAM,CAAC,EAAEY,qBAAU,CAAC;IACrE,GAAGF,yBAAc,CACf,WAAW,EACXC,0BAAe,CAACZ,GAAG,EAAEE,SAAS,CAAC,EAC/BW,qBACF,CAAA;GACD,CAAA;EAED,oBACEC,cAAA,CAAChB,SAAS,EAAA;AACRF,IAAAA,GAAG,EAAEA,GAAI;IACTQ,SAAS,EAAEW,EAAE,CACXC,WAAM,CAACC,IAAI,EACXd,KAAK,IAAIa,WAAM,CAAC,CAAQE,KAAAA,EAAAA,qBAAU,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,6 @@
1
+ 'use strict';
2
+
3
+ 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"};
4
+
5
+ module.exports = styles;
6
+ //# sourceMappingURL=Grid.module.css.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Grid.module.css.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
@@ -0,0 +1,39 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
4
+
5
+ const react = require('react');
6
+ const cn = require('classnames');
7
+ const GridItem_module = require('./GridItem.module.css.cjs');
8
+ const jsxRuntime = require('react/jsx-runtime');
9
+ const responsive = require('../utils/responsive.cjs');
10
+
11
+ const spanToCss = span => span === 'full' ? '1 / -1' : `span ${span} / span ${span}`;
12
+
13
+ /** Grid child that can span columns or sit in a named area. */
14
+ const GridItem = /*#__PURE__*/react.forwardRef((_ref, ref) => {
15
+ let {
16
+ as: Component = 'div',
17
+ span,
18
+ area,
19
+ className,
20
+ style,
21
+ ...rest
22
+ } = _ref;
23
+ return /*#__PURE__*/jsxRuntime.jsx(Component, {
24
+ ref: ref,
25
+ className: cn(GridItem_module.root, className),
26
+ style: {
27
+ ...responsive.responsiveVars('span', span, spanToCss),
28
+ ...(area !== undefined && {
29
+ gridArea: area
30
+ }),
31
+ ...style
32
+ },
33
+ ...rest
34
+ });
35
+ });
36
+ GridItem.displayName = 'GridItem';
37
+
38
+ exports.GridItem = GridItem;
39
+ //# sourceMappingURL=GridItem.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GridItem.cjs","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,gBAAU,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,cAAA,CAACL,SAAS,EAAA;AACRF,IAAAA,GAAG,EAAEA,GAAI;IACTI,SAAS,EAAEI,EAAE,CAACC,eAAM,CAACC,IAAI,EAAEN,SAAS,CAAE;AACtCC,IAAAA,KAAK,EAAE;AACL,MAAA,GAAGM,yBAAc,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,6 @@
1
+ 'use strict';
2
+
3
+ const styles = {"root":"GridItem-module_root__Jj7cu"};
4
+
5
+ module.exports = styles;
6
+ //# sourceMappingURL=GridItem.module.css.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GridItem.module.css.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
@@ -0,0 +1,31 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
4
+
5
+ const cn = require('classnames');
6
+ const Header_module = require('./Header.module.css.cjs');
7
+ const jsxRuntime = require('react/jsx-runtime');
8
+
9
+ const Header = _ref => {
10
+ let {
11
+ children,
12
+ actions,
13
+ sticky,
14
+ className,
15
+ ...rest
16
+ } = _ref;
17
+ return /*#__PURE__*/jsxRuntime.jsxs("header", {
18
+ className: cn(Header_module.header, sticky && Header_module.sticky, className),
19
+ ...rest,
20
+ children: [/*#__PURE__*/jsxRuntime.jsx("div", {
21
+ className: Header_module.content,
22
+ children: children
23
+ }), actions != null ? /*#__PURE__*/jsxRuntime.jsx("div", {
24
+ className: Header_module.actions,
25
+ children: actions
26
+ }) : null]
27
+ });
28
+ };
29
+
30
+ exports.Header = Header;
31
+ //# sourceMappingURL=Header.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Header.cjs","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,eAAA,CAAA,QAAA,EAAA;AACEF,IAAAA,SAAS,EAAEG,EAAE,CAACC,aAAM,CAACC,MAAM,EAAEN,MAAM,IAAIK,aAAM,CAACL,MAAM,EAAEC,SAAS,CAAE;AAAA,IAAA,GAC7DC,IAAI;AAAAJ,IAAAA,QAAA,gBAERS,cAAA,CAAA,KAAA,EAAA;MAAKN,SAAS,EAAEI,aAAM,CAACG,OAAQ;AAAAV,MAAAA,QAAA,EAAEA,QAAAA;AAAQ,KAAM,CAAC,EAC/CC,OAAO,IAAI,IAAI,gBAAGQ,cAAA,CAAA,KAAA,EAAA;MAAKN,SAAS,EAAEI,aAAM,CAACN,OAAQ;AAAAD,MAAAA,QAAA,EAAEC,OAAAA;KAAa,CAAC,GAAG,IAAI,CAAA;AAAA,GACnE,CAAC,CAAA;AAAA;;;;"}
@@ -0,0 +1,6 @@
1
+ 'use strict';
2
+
3
+ const styles = {"header":"Header-module_header__BlKE6","sticky":"Header-module_sticky__ftIiS","content":"Header-module_content__P2dip","actions":"Header-module_actions__iRAGS"};
4
+
5
+ module.exports = styles;
6
+ //# sourceMappingURL=Header.module.css.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Header.module.css.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
@@ -0,0 +1,69 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
4
+
5
+ const react = require('react');
6
+ const cn = require('classnames');
7
+ const HeaderNav_module = require('./HeaderNav.module.css.cjs');
8
+ const jsxRuntime = require('react/jsx-runtime');
9
+
10
+ const syncFade = nav => {
11
+ nav.toggleAttribute('data-fade-start', nav.scrollLeft > 0);
12
+ nav.toggleAttribute('data-fade-end', nav.scrollLeft < nav.scrollWidth - nav.clientWidth - 1);
13
+ };
14
+ const scrollActiveIntoView = nav => {
15
+ const active = nav.querySelector("[aria-current='page']");
16
+ if (!active) return;
17
+ const navRect = nav.getBoundingClientRect();
18
+ const activeRect = active.getBoundingClientRect();
19
+ nav.scrollLeft += activeRect.left - navRect.left - (nav.clientWidth - activeRect.width) / 2;
20
+ };
21
+ const HeaderNav = /*#__PURE__*/react.forwardRef((_ref, ref) => {
22
+ let {
23
+ 'aria-label': ariaLabel = 'Main',
24
+ className,
25
+ onScroll,
26
+ ...rest
27
+ } = _ref;
28
+ const navRef = react.useRef(null);
29
+ const setRef = react.useCallback(node => {
30
+ navRef.current = node;
31
+ if (typeof ref === 'function') ref(node);else if (ref) ref.current = node;
32
+ }, [ref]);
33
+ react.useEffect(() => {
34
+ const nav = navRef.current;
35
+ if (!nav) return;
36
+ const sync = () => {
37
+ scrollActiveIntoView(nav);
38
+ syncFade(nav);
39
+ };
40
+ sync();
41
+ const mutations = typeof MutationObserver === 'undefined' ? null : new MutationObserver(sync);
42
+ mutations?.observe(nav, {
43
+ childList: true,
44
+ subtree: true,
45
+ attributes: true,
46
+ attributeFilter: ['aria-current']
47
+ });
48
+ const resizes = typeof ResizeObserver === 'undefined' ? null : new ResizeObserver(() => syncFade(nav));
49
+ resizes?.observe(nav);
50
+ return () => {
51
+ mutations?.disconnect();
52
+ resizes?.disconnect();
53
+ };
54
+ }, []);
55
+ return /*#__PURE__*/jsxRuntime.jsx("nav", {
56
+ ref: setRef,
57
+ "aria-label": ariaLabel,
58
+ className: cn(HeaderNav_module.nav, className),
59
+ onScroll: e => {
60
+ syncFade(e.currentTarget);
61
+ onScroll?.(e);
62
+ },
63
+ ...rest
64
+ });
65
+ });
66
+ HeaderNav.displayName = 'HeaderNav';
67
+
68
+ exports.HeaderNav = HeaderNav;
69
+ //# sourceMappingURL=HeaderNav.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HeaderNav.cjs","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,6 @@
1
+ 'use strict';
2
+
3
+ const styles = {"nav":"HeaderNav-module_nav__YxWpA"};
4
+
5
+ module.exports = styles;
6
+ //# sourceMappingURL=HeaderNav.module.css.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HeaderNav.module.css.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
@@ -0,0 +1,25 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
4
+
5
+ const cn = require('classnames');
6
+ const Hidden_module = require('./Hidden.module.css.cjs');
7
+ const jsxRuntime = require('react/jsx-runtime');
8
+ const responsive = require('../utils/responsive.cjs');
9
+
10
+ /** CSS-only responsive visibility, safe for SSR. Wrapper is `display: contents` while visible. */
11
+ const Hidden = _ref => {
12
+ let {
13
+ below,
14
+ above,
15
+ className,
16
+ ...rest
17
+ } = _ref;
18
+ return /*#__PURE__*/jsxRuntime.jsx("div", {
19
+ className: cn(Hidden_module.root, below && Hidden_module[`below${responsive.capitalize(below)}`], above && Hidden_module[`above${responsive.capitalize(above)}`], className),
20
+ ...rest
21
+ });
22
+ };
23
+
24
+ exports.Hidden = Hidden;
25
+ //# sourceMappingURL=Hidden.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Hidden.cjs","sources":["../../../src/hidden/Hidden.tsx"],"sourcesContent":["import type { HTMLAttributes } from 'react'\n\nimport cn from 'classnames'\n\nimport { capitalize, type Breakpoint } from '../utils'\nimport styles from './Hidden.module.css'\n\nexport type HiddenProps = HTMLAttributes<HTMLDivElement> & {\n /** Hides at this breakpoint's width and below. */\n below?: Breakpoint\n /** Hides at widths above this breakpoint. */\n above?: Breakpoint\n}\n\n/** CSS-only responsive visibility, safe for SSR. Wrapper is `display: contents` while visible. */\nexport const Hidden = ({ below, above, className, ...rest }: HiddenProps) => (\n <div\n className={cn(\n styles.root,\n below && styles[`below${capitalize(below)}`],\n above && styles[`above${capitalize(above)}`],\n className,\n )}\n {...rest}\n />\n)\n"],"names":["Hidden","_ref","below","above","className","rest","_jsx","cn","styles","root","capitalize"],"mappings":";;;;;;;;;AAcA;AACO,MAAMA,MAAM,GAAGC,IAAA,IAAA;EAAA,IAAC;IAAEC,KAAK;IAAEC,KAAK;IAAEC,SAAS;IAAE,GAAGC,IAAAA;AAAkB,GAAC,GAAAJ,IAAA,CAAA;AAAA,EAAA,oBACtEK,cAAA,CAAA,KAAA,EAAA;AACEF,IAAAA,SAAS,EAAEG,EAAE,CACXC,aAAM,CAACC,IAAI,EACXP,KAAK,IAAIM,aAAM,CAAC,CAAQE,KAAAA,EAAAA,qBAAU,CAACR,KAAK,CAAC,CAAE,CAAA,CAAC,EAC5CC,KAAK,IAAIK,aAAM,CAAC,CAAQE,KAAAA,EAAAA,qBAAU,CAACP,KAAK,CAAC,CAAA,CAAE,CAAC,EAC5CC,SACF,CAAE;IAAA,GACEC,IAAAA;AAAI,GACT,CAAC,CAAA;AAAA;;;;"}
@@ -0,0 +1,6 @@
1
+ 'use strict';
2
+
3
+ const styles = {"root":"Hidden-module_root__9hkfD","belowLg":"Hidden-module_belowLg__zbI6R","belowMl":"Hidden-module_belowMl__vJPhT","belowMd":"Hidden-module_belowMd__lVH9f","belowSm":"Hidden-module_belowSm__cnb9B","belowXs":"Hidden-module_belowXs__ipzM-","belowXxs":"Hidden-module_belowXxs__BkbGR","aboveLg":"Hidden-module_aboveLg__G7kJk","aboveMl":"Hidden-module_aboveMl__QadhV","aboveMd":"Hidden-module_aboveMd__1yfOJ","aboveSm":"Hidden-module_aboveSm__6-6D8","aboveXs":"Hidden-module_aboveXs__TxT4e","aboveXxs":"Hidden-module_aboveXxs__gRrwE"};
4
+
5
+ module.exports = styles;
6
+ //# sourceMappingURL=Hidden.module.css.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Hidden.module.css.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
@@ -0,0 +1,57 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
4
+
5
+ const react = require('react');
6
+ const reactDom = require('react-dom');
7
+ const jsxRuntime = require('react/jsx-runtime');
8
+
9
+ const THEME_ATTR = 'data-lido-theme';
10
+
11
+ /**
12
+ * Renders `null` until mounted so SSR and first client render match.
13
+ * Without `container`, mirrors the nearest `data-lido-theme` scope onto the portal root so tokens still resolve.
14
+ */
15
+ const Portal = _ref => {
16
+ let {
17
+ children,
18
+ container
19
+ } = _ref;
20
+ const markerRef = react.useRef(null);
21
+ const [target, setTarget] = react.useState(null);
22
+ react.useEffect(() => {
23
+ if (container) {
24
+ setTarget(container);
25
+ return;
26
+ }
27
+ const scope = markerRef.current?.closest(`[${THEME_ATTR}]`);
28
+ if (!scope || scope === document.documentElement) {
29
+ setTarget(document.body);
30
+ return;
31
+ }
32
+ const root = document.createElement('div');
33
+ root.style.display = 'contents';
34
+ const sync = () => root.setAttribute(THEME_ATTR, scope.getAttribute(THEME_ATTR) ?? '');
35
+ sync();
36
+ document.body.appendChild(root);
37
+ const observer = new MutationObserver(sync);
38
+ observer.observe(scope, {
39
+ attributes: true,
40
+ attributeFilter: [THEME_ATTR]
41
+ });
42
+ setTarget(root);
43
+ return () => {
44
+ observer.disconnect();
45
+ root.remove();
46
+ };
47
+ }, [container]);
48
+ return /*#__PURE__*/jsxRuntime.jsxs(jsxRuntime.Fragment, {
49
+ children: [/*#__PURE__*/jsxRuntime.jsx("span", {
50
+ ref: markerRef,
51
+ hidden: true
52
+ }), target ? /*#__PURE__*/reactDom.createPortal(children, target) : null]
53
+ });
54
+ };
55
+
56
+ exports.Portal = Portal;
57
+ //# sourceMappingURL=Portal.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Portal.cjs","sources":["../../../src/hooks/Portal.tsx"],"sourcesContent":["import { useEffect, useRef, useState, type ReactNode } from 'react'\nimport { createPortal } from 'react-dom'\n\nexport type PortalProps = {\n children?: ReactNode\n /** Defaults to `document.body`. */\n container?: Element | null\n}\n\nconst THEME_ATTR = 'data-lido-theme'\n\n/**\n * Renders `null` until mounted so SSR and first client render match.\n * Without `container`, mirrors the nearest `data-lido-theme` scope onto the portal root so tokens still resolve.\n */\nexport const Portal = ({ children, container }: PortalProps) => {\n const markerRef = useRef<HTMLSpanElement>(null)\n const [target, setTarget] = useState<Element | null>(null)\n\n useEffect(() => {\n if (container) {\n setTarget(container)\n return\n }\n const scope = markerRef.current?.closest(`[${THEME_ATTR}]`)\n if (!scope || scope === document.documentElement) {\n setTarget(document.body)\n return\n }\n\n const root = document.createElement('div')\n root.style.display = 'contents'\n const sync = () =>\n root.setAttribute(THEME_ATTR, scope.getAttribute(THEME_ATTR) ?? '')\n sync()\n document.body.appendChild(root)\n const observer = new MutationObserver(sync)\n observer.observe(scope, { attributes: true, attributeFilter: [THEME_ATTR] })\n setTarget(root)\n return () => {\n observer.disconnect()\n root.remove()\n }\n }, [container])\n\n return (\n <>\n <span ref={markerRef} hidden />\n {target ? createPortal(children, target) : null}\n </>\n )\n}\n"],"names":["THEME_ATTR","Portal","_ref","children","container","markerRef","useRef","target","setTarget","useState","useEffect","scope","current","closest","document","documentElement","body","root","createElement","style","display","sync","setAttribute","getAttribute","appendChild","observer","MutationObserver","observe","attributes","attributeFilter","disconnect","remove","_jsxs","_Fragment","_jsx","ref","hidden","createPortal"],"mappings":";;;;;;;;AASA,MAAMA,UAAU,GAAG,iBAAiB,CAAA;;AAEpC;AACA;AACA;AACA;AACaC,MAAAA,MAAM,GAAGC,IAAA,IAA0C;EAAA,IAAzC;IAAEC,QAAQ;AAAEC,IAAAA,SAAAA;AAAuB,GAAC,GAAAF,IAAA,CAAA;AACzD,EAAA,MAAMG,SAAS,GAAGC,YAAM,CAAkB,IAAI,CAAC,CAAA;EAC/C,MAAM,CAACC,MAAM,EAAEC,SAAS,CAAC,GAAGC,cAAQ,CAAiB,IAAI,CAAC,CAAA;AAE1DC,EAAAA,eAAS,CAAC,MAAM;AACd,IAAA,IAAIN,SAAS,EAAE;MACbI,SAAS,CAACJ,SAAS,CAAC,CAAA;AACpB,MAAA,OAAA;AACF,KAAA;IACA,MAAMO,KAAK,GAAGN,SAAS,CAACO,OAAO,EAAEC,OAAO,CAAC,CAAA,CAAA,EAAIb,UAAU,CAAA,CAAA,CAAG,CAAC,CAAA;IAC3D,IAAI,CAACW,KAAK,IAAIA,KAAK,KAAKG,QAAQ,CAACC,eAAe,EAAE;AAChDP,MAAAA,SAAS,CAACM,QAAQ,CAACE,IAAI,CAAC,CAAA;AACxB,MAAA,OAAA;AACF,KAAA;AAEA,IAAA,MAAMC,IAAI,GAAGH,QAAQ,CAACI,aAAa,CAAC,KAAK,CAAC,CAAA;AAC1CD,IAAAA,IAAI,CAACE,KAAK,CAACC,OAAO,GAAG,UAAU,CAAA;AAC/B,IAAA,MAAMC,IAAI,GAAGA,MACXJ,IAAI,CAACK,YAAY,CAACtB,UAAU,EAAEW,KAAK,CAACY,YAAY,CAACvB,UAAU,CAAC,IAAI,EAAE,CAAC,CAAA;AACrEqB,IAAAA,IAAI,EAAE,CAAA;AACNP,IAAAA,QAAQ,CAACE,IAAI,CAACQ,WAAW,CAACP,IAAI,CAAC,CAAA;AAC/B,IAAA,MAAMQ,QAAQ,GAAG,IAAIC,gBAAgB,CAACL,IAAI,CAAC,CAAA;AAC3CI,IAAAA,QAAQ,CAACE,OAAO,CAAChB,KAAK,EAAE;AAAEiB,MAAAA,UAAU,EAAE,IAAI;MAAEC,eAAe,EAAE,CAAC7B,UAAU,CAAA;AAAE,KAAC,CAAC,CAAA;IAC5EQ,SAAS,CAACS,IAAI,CAAC,CAAA;AACf,IAAA,OAAO,MAAM;MACXQ,QAAQ,CAACK,UAAU,EAAE,CAAA;MACrBb,IAAI,CAACc,MAAM,EAAE,CAAA;KACd,CAAA;AACH,GAAC,EAAE,CAAC3B,SAAS,CAAC,CAAC,CAAA;EAEf,oBACE4B,eAAA,CAAAC,mBAAA,EAAA;AAAA9B,IAAAA,QAAA,gBACE+B,cAAA,CAAA,MAAA,EAAA;AAAMC,MAAAA,GAAG,EAAE9B,SAAU;MAAC+B,MAAM,EAAA,IAAA;KAAE,CAAC,EAC9B7B,MAAM,gBAAG8B,qBAAY,CAAClC,QAAQ,EAAEI,MAAM,CAAC,GAAG,IAAI,CAAA;AAAA,GAC/C,CAAC,CAAA;AAEP;;;;"}