@lidofinance/lido-app-ui 1.9.0 → 1.10.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 (278) 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/segmented-control/SegmentedControl.cjs +2 -1
  73. package/dist/cjs/segmented-control/SegmentedControl.cjs.map +1 -1
  74. package/dist/cjs/segmented-control/SegmentedControlCard.cjs +2 -1
  75. package/dist/cjs/segmented-control/SegmentedControlCard.cjs.map +1 -1
  76. package/dist/cjs/small-card/SmallCard.cjs +2 -1
  77. package/dist/cjs/small-card/SmallCard.cjs.map +1 -1
  78. package/dist/cjs/stack/Stack.cjs +41 -0
  79. package/dist/cjs/stack/Stack.cjs.map +1 -0
  80. package/dist/cjs/stack/Stack.module.css.cjs +6 -0
  81. package/dist/cjs/stack/Stack.module.css.cjs.map +1 -0
  82. package/dist/cjs/tabs/Tabs.cjs +2 -1
  83. package/dist/cjs/tabs/Tabs.cjs.map +1 -1
  84. package/dist/cjs/text-link/TextLink.cjs +2 -1
  85. package/dist/cjs/text-link/TextLink.cjs.map +1 -1
  86. package/dist/cjs/theme-switcher/ThemeSwitcher.cjs +39 -0
  87. package/dist/cjs/theme-switcher/ThemeSwitcher.cjs.map +1 -0
  88. package/dist/cjs/token-selector/TokenSelector.cjs +3 -3
  89. package/dist/cjs/token-selector/TokenSelector.cjs.map +1 -1
  90. package/dist/cjs/tooltip/Tooltip.cjs +2 -1
  91. package/dist/cjs/tooltip/Tooltip.cjs.map +1 -1
  92. package/dist/cjs/utils/ActionElement.cjs +41 -0
  93. package/dist/cjs/utils/ActionElement.cjs.map +1 -0
  94. package/dist/cjs/utils/responsive.cjs +67 -0
  95. package/dist/cjs/utils/responsive.cjs.map +1 -0
  96. package/dist/esm/breadcrumbs/Breadcrumbs.mjs +88 -0
  97. package/dist/esm/breadcrumbs/Breadcrumbs.mjs.map +1 -0
  98. package/dist/esm/breadcrumbs/Breadcrumbs.module.css.mjs +4 -0
  99. package/dist/esm/breadcrumbs/Breadcrumbs.module.css.mjs.map +1 -0
  100. package/dist/esm/divider/Divider.mjs +22 -0
  101. package/dist/esm/divider/Divider.mjs.map +1 -0
  102. package/dist/esm/divider/Divider.module.css.mjs +4 -0
  103. package/dist/esm/divider/Divider.module.css.mjs.map +1 -0
  104. package/dist/esm/grid/Grid.mjs +43 -0
  105. package/dist/esm/grid/Grid.mjs.map +1 -0
  106. package/dist/esm/grid/Grid.module.css.mjs +4 -0
  107. package/dist/esm/grid/Grid.module.css.mjs.map +1 -0
  108. package/dist/esm/grid/GridItem.mjs +35 -0
  109. package/dist/esm/grid/GridItem.mjs.map +1 -0
  110. package/dist/esm/grid/GridItem.module.css.mjs +4 -0
  111. package/dist/esm/grid/GridItem.module.css.mjs.map +1 -0
  112. package/dist/esm/header/Header.mjs +27 -0
  113. package/dist/esm/header/Header.mjs.map +1 -0
  114. package/dist/esm/header/Header.module.css.mjs +4 -0
  115. package/dist/esm/header/Header.module.css.mjs.map +1 -0
  116. package/dist/esm/header/HeaderNav.mjs +65 -0
  117. package/dist/esm/header/HeaderNav.mjs.map +1 -0
  118. package/dist/esm/header/HeaderNav.module.css.mjs +4 -0
  119. package/dist/esm/header/HeaderNav.module.css.mjs.map +1 -0
  120. package/dist/esm/hidden/Hidden.mjs +21 -0
  121. package/dist/esm/hidden/Hidden.mjs.map +1 -0
  122. package/dist/esm/hidden/Hidden.module.css.mjs +4 -0
  123. package/dist/esm/hidden/Hidden.module.css.mjs.map +1 -0
  124. package/dist/esm/hooks/Portal.mjs +53 -0
  125. package/dist/esm/hooks/Portal.mjs.map +1 -0
  126. package/dist/esm/hooks/overlayStack.mjs +22 -0
  127. package/dist/esm/hooks/overlayStack.mjs.map +1 -0
  128. package/dist/esm/hooks/useBodyScrollLock.mjs +46 -0
  129. package/dist/esm/hooks/useBodyScrollLock.mjs.map +1 -0
  130. package/dist/esm/hooks/useEscape.mjs +21 -0
  131. package/dist/esm/hooks/useEscape.mjs.map +1 -0
  132. package/dist/esm/hooks/useFocusTrap.mjs +62 -0
  133. package/dist/esm/hooks/useFocusTrap.mjs.map +1 -0
  134. package/dist/esm/hooks/useIsomorphicLayoutEffect.mjs +6 -0
  135. package/dist/esm/hooks/useIsomorphicLayoutEffect.mjs.map +1 -0
  136. package/dist/esm/hooks/useOutsideClick.mjs +16 -14
  137. package/dist/esm/hooks/useOutsideClick.mjs.map +1 -1
  138. package/dist/esm/icon-button/IconButton.mjs +5 -2
  139. package/dist/esm/icon-button/IconButton.mjs.map +1 -1
  140. package/dist/esm/icon-button/IconButton.module.css.mjs +1 -1
  141. package/dist/esm/index.css +3 -3
  142. package/dist/esm/index.mjs +13 -0
  143. package/dist/esm/index.mjs.map +1 -1
  144. package/dist/esm/link-provider/Anchor.mjs +44 -0
  145. package/dist/esm/link-provider/Anchor.mjs.map +1 -0
  146. package/dist/esm/link-provider/LinkProvider.mjs +24 -0
  147. package/dist/esm/link-provider/LinkProvider.mjs.map +1 -0
  148. package/dist/esm/logo/Logo.mjs +80 -0
  149. package/dist/esm/logo/Logo.mjs.map +1 -0
  150. package/dist/esm/logo/Logo.module.css.mjs +4 -0
  151. package/dist/esm/logo/Logo.module.css.mjs.map +1 -0
  152. package/dist/esm/modal/Modal.mjs +38 -31
  153. package/dist/esm/modal/Modal.mjs.map +1 -1
  154. package/dist/esm/nav-link/NavLink.mjs +40 -0
  155. package/dist/esm/nav-link/NavLink.mjs.map +1 -0
  156. package/dist/esm/nav-link/NavLink.module.css.mjs +4 -0
  157. package/dist/esm/nav-link/NavLink.module.css.mjs.map +1 -0
  158. package/dist/esm/notification/Notification.mjs +20 -4
  159. package/dist/esm/notification/Notification.mjs.map +1 -1
  160. package/dist/esm/notification/Notification.module.css.mjs +1 -1
  161. package/dist/esm/popover/Popover.mjs +132 -0
  162. package/dist/esm/popover/Popover.mjs.map +1 -0
  163. package/dist/esm/popover/Popover.module.css.mjs +4 -0
  164. package/dist/esm/popover/Popover.module.css.mjs.map +1 -0
  165. package/dist/esm/segmented-control/SegmentedControl.mjs +3 -2
  166. package/dist/esm/segmented-control/SegmentedControl.mjs.map +1 -1
  167. package/dist/esm/segmented-control/SegmentedControlCard.mjs +3 -2
  168. package/dist/esm/segmented-control/SegmentedControlCard.mjs.map +1 -1
  169. package/dist/esm/small-card/SmallCard.mjs +2 -1
  170. package/dist/esm/small-card/SmallCard.mjs.map +1 -1
  171. package/dist/esm/stack/Stack.mjs +37 -0
  172. package/dist/esm/stack/Stack.mjs.map +1 -0
  173. package/dist/esm/stack/Stack.module.css.mjs +4 -0
  174. package/dist/esm/stack/Stack.module.css.mjs.map +1 -0
  175. package/dist/esm/tabs/Tabs.mjs +3 -2
  176. package/dist/esm/tabs/Tabs.mjs.map +1 -1
  177. package/dist/esm/text-link/TextLink.mjs +2 -1
  178. package/dist/esm/text-link/TextLink.mjs.map +1 -1
  179. package/dist/esm/theme-switcher/ThemeSwitcher.mjs +35 -0
  180. package/dist/esm/theme-switcher/ThemeSwitcher.mjs.map +1 -0
  181. package/dist/esm/token-selector/TokenSelector.mjs +3 -3
  182. package/dist/esm/token-selector/TokenSelector.mjs.map +1 -1
  183. package/dist/esm/tooltip/Tooltip.mjs +3 -2
  184. package/dist/esm/tooltip/Tooltip.mjs.map +1 -1
  185. package/dist/esm/utils/ActionElement.mjs +37 -0
  186. package/dist/esm/utils/ActionElement.mjs.map +1 -0
  187. package/dist/esm/utils/responsive.mjs +58 -0
  188. package/dist/esm/utils/responsive.mjs.map +1 -0
  189. package/dist/index.css +3 -3
  190. package/dist/styles/breakpoints.css +6 -0
  191. package/dist/types/breadcrumbs/Breadcrumbs.d.ts +11 -0
  192. package/dist/types/breadcrumbs/Breadcrumbs.d.ts.map +1 -0
  193. package/dist/types/breadcrumbs/index.d.ts +3 -0
  194. package/dist/types/breadcrumbs/index.d.ts.map +1 -0
  195. package/dist/types/colors/colorTokens.d.ts.map +1 -1
  196. package/dist/types/divider/Divider.d.ts +10 -0
  197. package/dist/types/divider/Divider.d.ts.map +1 -0
  198. package/dist/types/divider/index.d.ts +3 -0
  199. package/dist/types/divider/index.d.ts.map +1 -0
  200. package/dist/types/grid/Grid.d.ts +31 -0
  201. package/dist/types/grid/Grid.d.ts.map +1 -0
  202. package/dist/types/grid/GridItem.d.ts +16 -0
  203. package/dist/types/grid/GridItem.d.ts.map +1 -0
  204. package/dist/types/grid/index.d.ts +5 -0
  205. package/dist/types/grid/index.d.ts.map +1 -0
  206. package/dist/types/header/Header.d.ts +9 -0
  207. package/dist/types/header/Header.d.ts.map +1 -0
  208. package/dist/types/header/HeaderNav.d.ts +4 -0
  209. package/dist/types/header/HeaderNav.d.ts.map +1 -0
  210. package/dist/types/header/index.d.ts +5 -0
  211. package/dist/types/header/index.d.ts.map +1 -0
  212. package/dist/types/hidden/Hidden.d.ts +11 -0
  213. package/dist/types/hidden/Hidden.d.ts.map +1 -0
  214. package/dist/types/hidden/index.d.ts +3 -0
  215. package/dist/types/hidden/index.d.ts.map +1 -0
  216. package/dist/types/hooks/Portal.d.ts +12 -0
  217. package/dist/types/hooks/Portal.d.ts.map +1 -0
  218. package/dist/types/hooks/index.d.ts +9 -0
  219. package/dist/types/hooks/index.d.ts.map +1 -0
  220. package/dist/types/hooks/overlayStack.d.ts +7 -0
  221. package/dist/types/hooks/overlayStack.d.ts.map +1 -0
  222. package/dist/types/hooks/useBodyScrollLock.d.ts +3 -0
  223. package/dist/types/hooks/useBodyScrollLock.d.ts.map +1 -0
  224. package/dist/types/hooks/useEscape.d.ts +3 -0
  225. package/dist/types/hooks/useEscape.d.ts.map +1 -0
  226. package/dist/types/hooks/useFocusTrap.d.ts +10 -0
  227. package/dist/types/hooks/useFocusTrap.d.ts.map +1 -0
  228. package/dist/types/hooks/useIsomorphicLayoutEffect.d.ts +3 -0
  229. package/dist/types/hooks/useIsomorphicLayoutEffect.d.ts.map +1 -0
  230. package/dist/types/hooks/useOutsideClick.d.ts +2 -2
  231. package/dist/types/hooks/useOutsideClick.d.ts.map +1 -1
  232. package/dist/types/icon-button/IconButton.d.ts +11 -3
  233. package/dist/types/icon-button/IconButton.d.ts.map +1 -1
  234. package/dist/types/index.d.ts +12 -0
  235. package/dist/types/index.d.ts.map +1 -1
  236. package/dist/types/link-provider/Anchor.d.ts +4 -0
  237. package/dist/types/link-provider/Anchor.d.ts.map +1 -0
  238. package/dist/types/link-provider/LinkProvider.d.ts +17 -0
  239. package/dist/types/link-provider/LinkProvider.d.ts.map +1 -0
  240. package/dist/types/link-provider/index.d.ts +3 -0
  241. package/dist/types/link-provider/index.d.ts.map +1 -0
  242. package/dist/types/logo/Logo.d.ts +13 -0
  243. package/dist/types/logo/Logo.d.ts.map +1 -0
  244. package/dist/types/logo/index.d.ts +3 -0
  245. package/dist/types/logo/index.d.ts.map +1 -0
  246. package/dist/types/modal/Modal.d.ts +23 -1
  247. package/dist/types/modal/Modal.d.ts.map +1 -1
  248. package/dist/types/nav-link/NavLink.d.ts +12 -0
  249. package/dist/types/nav-link/NavLink.d.ts.map +1 -0
  250. package/dist/types/nav-link/index.d.ts +3 -0
  251. package/dist/types/nav-link/index.d.ts.map +1 -0
  252. package/dist/types/notification/Notification.d.ts +15 -2
  253. package/dist/types/notification/Notification.d.ts.map +1 -1
  254. package/dist/types/popover/Popover.d.ts +21 -0
  255. package/dist/types/popover/Popover.d.ts.map +1 -0
  256. package/dist/types/popover/index.d.ts +3 -0
  257. package/dist/types/popover/index.d.ts.map +1 -0
  258. package/dist/types/segmented-control/SegmentedControl.d.ts.map +1 -1
  259. package/dist/types/segmented-control/SegmentedControlCard.d.ts.map +1 -1
  260. package/dist/types/small-card/SmallCard.d.ts.map +1 -1
  261. package/dist/types/stack/Stack.d.ts +25 -0
  262. package/dist/types/stack/Stack.d.ts.map +1 -0
  263. package/dist/types/stack/index.d.ts +3 -0
  264. package/dist/types/stack/index.d.ts.map +1 -0
  265. package/dist/types/tabs/Tabs.d.ts.map +1 -1
  266. package/dist/types/text-link/TextLink.d.ts.map +1 -1
  267. package/dist/types/theme-switcher/ThemeSwitcher.d.ts +5 -0
  268. package/dist/types/theme-switcher/ThemeSwitcher.d.ts.map +1 -0
  269. package/dist/types/theme-switcher/index.d.ts +3 -0
  270. package/dist/types/theme-switcher/index.d.ts.map +1 -0
  271. package/dist/types/tooltip/Tooltip.d.ts.map +1 -1
  272. package/dist/types/utils/ActionElement.d.ts +10 -0
  273. package/dist/types/utils/ActionElement.d.ts.map +1 -0
  274. package/dist/types/utils/index.d.ts +5 -0
  275. package/dist/types/utils/index.d.ts.map +1 -0
  276. package/dist/types/utils/responsive.d.ts +27 -0
  277. package/dist/types/utils/responsive.d.ts.map +1 -0
  278. package/package.json +2 -2
@@ -0,0 +1,80 @@
1
+ import { forwardRef } from 'react';
2
+ import cn from 'classnames';
3
+ import styles from './Logo.module.css.mjs';
4
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
5
+ import { ActionElement } from '../utils/ActionElement.mjs';
6
+
7
+ const DROPLET = /*#__PURE__*/jsxs("svg", {
8
+ className: styles.droplet,
9
+ viewBox: "38 26 23 32",
10
+ fill: "currentColor",
11
+ "aria-hidden": "true",
12
+ children: [/*#__PURE__*/jsx("path", {
13
+ fillRule: "evenodd",
14
+ clipRule: "evenodd",
15
+ d: "M49.485 26L57.6 38.398l-8.116 4.613-8.117-4.613L49.485 26zM43.85 37.81l5.634-8.602 5.633 8.601-5.633 3.201-5.634-3.2z"
16
+ }), /*#__PURE__*/jsx("path", {
17
+ d: "M49.478 45.736l-9.416-5.35-.255.39c-2.896 4.428-2.25 10.226 1.554 13.945 4.48 4.372 11.747 4.372 16.233 0 3.812-3.719 4.458-9.517 1.554-13.945l-.254-.39-9.416 5.35z"
18
+ })]
19
+ });
20
+ const WORDMARK = /*#__PURE__*/jsx("span", {
21
+ className: styles.wordmark,
22
+ children: /*#__PURE__*/jsx("svg", {
23
+ className: styles.wordmarkSvg,
24
+ viewBox: "61 26 101 32",
25
+ fill: "currentColor",
26
+ "aria-hidden": "true",
27
+ children: /*#__PURE__*/jsx("path", {
28
+ d: "M90.17 50.449H79.462V33.551h3.267v13.917h7.441v2.981zm16.422 0h-3.267V33.551h3.267V50.45zm13.242 0V33.551h5.597c.85 0 1.54.029 2.062.093 1.351.156 2.519.624 3.492 1.398.988.773 1.735 1.767 2.244 2.98.515 1.207.769 2.534.769 3.982 0 1.448-.254 2.775-.769 3.988-.516 1.207-1.264 2.193-2.244 2.967-.98.773-2.141 1.242-3.492 1.398-.53.064-1.219.092-2.062.092h-5.597zm5.597-3.002c.85 0 1.474-.043 1.873-.12a3.218 3.218 0 001.801-1.001 5.002 5.002 0 001.082-1.923 7.97 7.97 0 00.363-2.406 7.96 7.96 0 00-.371-2.442c-.239-.76-.602-1.398-1.096-1.916a3.123 3.123 0 00-1.779-.972c-.399-.078-1.023-.12-1.873-.12h-2.279V47.44h2.279v.007zm28.191 3.357c-1.707 0-3.188-.362-4.458-1.093a7.432 7.432 0 01-2.919-3.102c-.675-1.327-1.009-2.867-1.009-4.613 0-1.745.334-3.285 1.009-4.613.683-1.327 1.656-2.356 2.919-3.087 1.263-.738 2.751-1.1 4.458-1.1 1.706 0 3.187.37 4.457 1.1a7.27 7.27 0 012.904 3.087c.683 1.328 1.024 2.868 1.024 4.613 0 1.746-.341 3.286-1.024 4.613-.675 1.328-1.641 2.364-2.904 3.102-1.263.73-2.751 1.093-4.457 1.093zm.094-3.002c1.06 0 1.946-.242 2.664-.717.719-.476 1.264-1.15 1.619-2.016.363-.865.538-1.887.538-3.065 0-1.817-.422-3.237-1.271-4.259-.849-1.021-2.098-1.54-3.746-1.54-1.06 0-1.946.242-2.664.717-.719.476-1.264 1.15-1.619 2.016-.363.865-.538 1.887-.538 3.066 0 1.816.421 3.236 1.271 4.258.849 1.022 2.098 1.54 3.746 1.54z"
29
+ })
30
+ })
31
+ });
32
+ const Logo = /*#__PURE__*/forwardRef((_ref, ref) => {
33
+ let {
34
+ variant = 'full',
35
+ product,
36
+ href,
37
+ onClick,
38
+ className,
39
+ ...rest
40
+ } = _ref;
41
+ const label = product ? `Lido ${product}` : 'Lido';
42
+ const content = /*#__PURE__*/jsxs(Fragment, {
43
+ children: [/*#__PURE__*/jsxs("span", {
44
+ className: styles.mark,
45
+ children: [DROPLET, variant === 'compact' ? null : WORDMARK]
46
+ }), product ? /*#__PURE__*/jsxs(Fragment, {
47
+ children: [/*#__PURE__*/jsx("span", {
48
+ className: styles.divider,
49
+ "aria-hidden": "true"
50
+ }), /*#__PURE__*/jsx("span", {
51
+ className: styles.product,
52
+ children: product
53
+ })]
54
+ }) : null]
55
+ });
56
+ const classes = cn(styles.root, styles[variant], className);
57
+ if (href || onClick) {
58
+ return /*#__PURE__*/jsx(ActionElement, {
59
+ ref: ref,
60
+ className: cn(classes, styles.interactive),
61
+ "aria-label": label,
62
+ href,
63
+ onClick,
64
+ ...rest,
65
+ children: content
66
+ });
67
+ }
68
+ return /*#__PURE__*/jsx("span", {
69
+ ref: ref,
70
+ role: "img",
71
+ "aria-label": label,
72
+ className: classes,
73
+ ...rest,
74
+ children: content
75
+ });
76
+ });
77
+ Logo.displayName = 'Logo';
78
+
79
+ export { Logo };
80
+ //# sourceMappingURL=Logo.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Logo.mjs","sources":["../../../src/logo/Logo.tsx"],"sourcesContent":["import { forwardRef, type HTMLAttributes, type Ref } from 'react'\n\nimport cn from 'classnames'\n\nimport { ActionElement, type ActionElementProps } from '../utils'\nimport styles from './Logo.module.css'\n\nexport type LogoVariant = 'full' | 'compact' | 'auto'\n\nexport type LogoProps = Omit<HTMLAttributes<HTMLElement>, 'children'> & {\n variant?: LogoVariant\n product?: string\n href?: string\n}\n\nconst DROPLET = (\n <svg\n className={styles.droplet}\n viewBox='38 26 23 32'\n fill='currentColor'\n aria-hidden='true'\n >\n <path\n fillRule='evenodd'\n clipRule='evenodd'\n d='M49.485 26L57.6 38.398l-8.116 4.613-8.117-4.613L49.485 26zM43.85 37.81l5.634-8.602 5.633 8.601-5.633 3.201-5.634-3.2z'\n />\n <path d='M49.478 45.736l-9.416-5.35-.255.39c-2.896 4.428-2.25 10.226 1.554 13.945 4.48 4.372 11.747 4.372 16.233 0 3.812-3.719 4.458-9.517 1.554-13.945l-.254-.39-9.416 5.35z' />\n </svg>\n)\n\nconst WORDMARK = (\n <span className={styles.wordmark}>\n <svg\n className={styles.wordmarkSvg}\n viewBox='61 26 101 32'\n fill='currentColor'\n aria-hidden='true'\n >\n <path d='M90.17 50.449H79.462V33.551h3.267v13.917h7.441v2.981zm16.422 0h-3.267V33.551h3.267V50.45zm13.242 0V33.551h5.597c.85 0 1.54.029 2.062.093 1.351.156 2.519.624 3.492 1.398.988.773 1.735 1.767 2.244 2.98.515 1.207.769 2.534.769 3.982 0 1.448-.254 2.775-.769 3.988-.516 1.207-1.264 2.193-2.244 2.967-.98.773-2.141 1.242-3.492 1.398-.53.064-1.219.092-2.062.092h-5.597zm5.597-3.002c.85 0 1.474-.043 1.873-.12a3.218 3.218 0 001.801-1.001 5.002 5.002 0 001.082-1.923 7.97 7.97 0 00.363-2.406 7.96 7.96 0 00-.371-2.442c-.239-.76-.602-1.398-1.096-1.916a3.123 3.123 0 00-1.779-.972c-.399-.078-1.023-.12-1.873-.12h-2.279V47.44h2.279v.007zm28.191 3.357c-1.707 0-3.188-.362-4.458-1.093a7.432 7.432 0 01-2.919-3.102c-.675-1.327-1.009-2.867-1.009-4.613 0-1.745.334-3.285 1.009-4.613.683-1.327 1.656-2.356 2.919-3.087 1.263-.738 2.751-1.1 4.458-1.1 1.706 0 3.187.37 4.457 1.1a7.27 7.27 0 012.904 3.087c.683 1.328 1.024 2.868 1.024 4.613 0 1.746-.341 3.286-1.024 4.613-.675 1.328-1.641 2.364-2.904 3.102-1.263.73-2.751 1.093-4.457 1.093zm.094-3.002c1.06 0 1.946-.242 2.664-.717.719-.476 1.264-1.15 1.619-2.016.363-.865.538-1.887.538-3.065 0-1.817-.422-3.237-1.271-4.259-.849-1.021-2.098-1.54-3.746-1.54-1.06 0-1.946.242-2.664.717-.719.476-1.264 1.15-1.619 2.016-.363.865-.538 1.887-.538 3.066 0 1.816.421 3.236 1.271 4.258.849 1.022 2.098 1.54 3.746 1.54z' />\n </svg>\n </span>\n)\n\nexport const Logo = forwardRef<HTMLElement, LogoProps>(\n ({ variant = 'full', product, href, onClick, className, ...rest }, ref) => {\n const label = product ? `Lido ${product}` : 'Lido'\n const content = (\n <>\n <span className={styles.mark}>\n {DROPLET}\n {variant === 'compact' ? null : WORDMARK}\n </span>\n {product ? (\n <>\n <span className={styles.divider} aria-hidden='true' />\n <span className={styles.product}>{product}</span>\n </>\n ) : null}\n </>\n )\n const classes = cn(styles.root, styles[variant], className)\n\n if (href || onClick) {\n return (\n <ActionElement\n ref={ref as Ref<HTMLAnchorElement | HTMLButtonElement>}\n className={cn(classes, styles.interactive)}\n aria-label={label}\n {...({ href, onClick, ...rest } as ActionElementProps)}\n >\n {content}\n </ActionElement>\n )\n }\n\n return (\n <span\n ref={ref as Ref<HTMLSpanElement>}\n role='img'\n aria-label={label}\n className={classes}\n {...rest}\n >\n {content}\n </span>\n )\n },\n)\n\nLogo.displayName = 'Logo'\n"],"names":["DROPLET","_jsxs","className","styles","droplet","viewBox","fill","children","_jsx","fillRule","clipRule","d","WORDMARK","wordmark","wordmarkSvg","Logo","forwardRef","_ref","ref","variant","product","href","onClick","rest","label","content","_Fragment","mark","divider","classes","cn","root","ActionElement","interactive","role","displayName"],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ const styles = {"root":"Logo-module_root__rytd6","interactive":"Logo-module_interactive__yDP-7","mark":"Logo-module_mark__MDd7j","droplet":"Logo-module_droplet__b6fio","wordmark":"Logo-module_wordmark__f-FR3","wordmarkSvg":"Logo-module_wordmarkSvg__0kNdt","auto":"Logo-module_auto__K5hux","divider":"Logo-module_divider__1GloM","product":"Logo-module_product__ppv8R"};
2
+
3
+ export { styles as default };
4
+ //# sourceMappingURL=Logo.module.css.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Logo.module.css.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -1,59 +1,55 @@
1
- import { useId, useRef, useEffect } from 'react';
1
+ import { forwardRef, useId, useState, useRef, useImperativeHandle } from 'react';
2
2
  import cn from 'classnames';
3
3
  import styles from './Modal.module.css.mjs';
4
- import { jsxs, jsx } from 'react/jsx-runtime';
4
+ import { jsx, jsxs } from 'react/jsx-runtime';
5
+ import { Portal } from '../hooks/Portal.mjs';
6
+ import { useBodyScrollLock } from '../hooks/useBodyScrollLock.mjs';
7
+ import { useFocusTrap } from '../hooks/useFocusTrap.mjs';
8
+ import { useEscape } from '../hooks/useEscape.mjs';
5
9
  import { IconButton } from '../icon-button/IconButton.mjs';
6
10
  import { IconCross } from '../icons/components/base/IconCross.mjs';
7
11
 
8
- let scrollLockCount = 0;
9
- let restoreOverflow = '';
10
- const lockBodyScroll = () => {
11
- if (scrollLockCount === 0) {
12
- restoreOverflow = document.body.style.overflow;
13
- document.body.style.overflow = 'hidden';
14
- }
15
- scrollLockCount += 1;
16
- };
17
- const unlockBodyScroll = () => {
18
- scrollLockCount = Math.max(0, scrollLockCount - 1);
19
- if (scrollLockCount === 0) {
20
- document.body.style.overflow = restoreOverflow;
21
- }
22
- };
23
- const Modal = _ref => {
12
+ const ModalDialog = /*#__PURE__*/forwardRef((_ref, ref) => {
24
13
  let {
25
14
  title,
26
15
  subtitle,
27
16
  onClose,
28
17
  withOverlay = false,
29
18
  bodyFill = false,
19
+ lockScroll = true,
20
+ closeOnEscape = true,
21
+ closeOnOverlayClick = true,
30
22
  children,
31
23
  className,
32
24
  dataTestId,
33
25
  ...rest
34
26
  } = _ref;
35
27
  const titleId = useId();
28
+ const [cardEl, setCardEl] = useState(null);
36
29
  const backdropMouseDown = useRef(false);
37
- useEffect(() => {
38
- if (!withOverlay) return;
39
- lockBodyScroll();
40
- return unlockBodyScroll;
41
- }, [withOverlay]);
30
+ useImperativeHandle(ref, () => cardEl, [cardEl]);
31
+ useBodyScrollLock(withOverlay && lockScroll);
32
+ useFocusTrap(cardEl, withOverlay);
33
+ // Stays registered with closeOnEscape={false} so Escape doesn't fall through to an underlying overlay.
34
+ useEscape(withOverlay, () => {
35
+ if (closeOnEscape) onClose?.();
36
+ });
42
37
  const handleOverlayMouseDown = event => {
43
38
  backdropMouseDown.current = event.target === event.currentTarget;
44
39
  };
45
40
  const handleOverlayClick = event => {
46
- if (event.target !== event.currentTarget) return;
47
- if (!backdropMouseDown.current) return;
48
- onClose?.();
41
+ if (closeOnOverlayClick && backdropMouseDown.current && event.target === event.currentTarget) {
42
+ onClose?.();
43
+ }
49
44
  };
50
45
  const card = /*#__PURE__*/jsxs("div", {
51
- className: cn(styles.card, bodyFill && styles.cardBodyFill, className),
52
46
  role: "dialog",
53
47
  "aria-modal": withOverlay || undefined,
54
48
  "aria-labelledby": title ? titleId : undefined,
55
49
  "data-testid": dataTestId?.root,
56
50
  ...rest,
51
+ ref: setCardEl,
52
+ className: cn(styles.card, bodyFill && styles.cardBodyFill, className),
57
53
  children: [/*#__PURE__*/jsxs("div", {
58
54
  className: styles.headerGroup,
59
55
  children: [/*#__PURE__*/jsxs("div", {
@@ -86,9 +82,7 @@ const Modal = _ref => {
86
82
  if (!withOverlay) return card;
87
83
  return (
88
84
  /*#__PURE__*/
89
- // The backdrop is a pointer-only affordance — making it focusable would put
90
- // a stop in the tab order before the dialog. Keyboard users close via the
91
- // close button.
85
+ // Pointer-only: a focusable backdrop would add a tab stop before the dialog; keyboard closes via Escape.
92
86
  // eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions
93
87
  jsx("div", {
94
88
  className: styles.overlay,
@@ -98,7 +92,20 @@ const Modal = _ref => {
98
92
  children: card
99
93
  })
100
94
  );
101
- };
95
+ });
96
+ ModalDialog.displayName = 'ModalDialog';
97
+
98
+ // Hooks live in ModalDialog so they run once the portal has mounted its content.
99
+ const Modal = /*#__PURE__*/forwardRef((props, ref) => {
100
+ const dialog = /*#__PURE__*/jsx(ModalDialog, {
101
+ ref: ref,
102
+ ...props
103
+ });
104
+ return props.withOverlay ? /*#__PURE__*/jsx(Portal, {
105
+ children: dialog
106
+ }) : dialog;
107
+ });
108
+ Modal.displayName = 'Modal';
102
109
 
103
110
  export { Modal };
104
111
  //# sourceMappingURL=Modal.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Modal.mjs","sources":["../../../src/modal/Modal.tsx"],"sourcesContent":["import {\n useEffect,\n useId,\n useRef,\n type ComponentPropsWithoutRef,\n type MouseEvent,\n type ReactNode,\n} from 'react'\n\nimport { IconButton } from '../icon-button'\nimport { IconCross } from '../icons'\nimport cn from 'classnames'\n\nimport styles from './Modal.module.css'\n\n// Ref-counted so stacked overlays (e.g. connect modal + an action modal) lock on\n// the first and only restore on the last, regardless of close order.\nlet scrollLockCount = 0\nlet restoreOverflow = ''\n\nconst lockBodyScroll = () => {\n if (scrollLockCount === 0) {\n restoreOverflow = document.body.style.overflow\n document.body.style.overflow = 'hidden'\n }\n scrollLockCount += 1\n}\n\nconst unlockBodyScroll = () => {\n scrollLockCount = Math.max(0, scrollLockCount - 1)\n if (scrollLockCount === 0) {\n document.body.style.overflow = restoreOverflow\n }\n}\n\nexport type ModalDataTestId = {\n root?: string\n title?: string\n subtitle?: string\n closeButton?: string\n body?: string\n overlay?: string\n}\n\nexport type ModalProps = Omit<\n ComponentPropsWithoutRef<'div'>,\n 'title' | 'children'\n> & {\n title?: ReactNode\n subtitle?: ReactNode\n onClose?: () => void\n withOverlay?: boolean\n bodyFill?: boolean\n children: ReactNode\n dataTestId?: ModalDataTestId\n}\n\nexport const Modal = ({\n title,\n subtitle,\n onClose,\n withOverlay = false,\n bodyFill = false,\n children,\n className,\n dataTestId,\n ...rest\n}: ModalProps) => {\n const titleId = useId()\n const backdropMouseDown = useRef(false)\n\n useEffect(() => {\n if (!withOverlay) return\n lockBodyScroll()\n return unlockBodyScroll\n }, [withOverlay])\n\n const handleOverlayMouseDown = (event: MouseEvent<HTMLDivElement>) => {\n backdropMouseDown.current = event.target === event.currentTarget\n }\n\n const handleOverlayClick = (event: MouseEvent<HTMLDivElement>) => {\n if (event.target !== event.currentTarget) return\n if (!backdropMouseDown.current) return\n onClose?.()\n }\n\n const card = (\n <div\n className={cn(styles.card, bodyFill && styles.cardBodyFill, className)}\n role='dialog'\n aria-modal={withOverlay || undefined}\n aria-labelledby={title ? titleId : undefined}\n data-testid={dataTestId?.root}\n {...rest}\n >\n <div className={styles.headerGroup}>\n <div className={styles.header}>\n <span\n id={titleId}\n className={cn(styles.title, !title && styles.titleHidden)}\n data-testid={dataTestId?.title}\n >\n {title}\n </span>\n {onClose ? (\n <IconButton\n variant='outline'\n aria-label='Close'\n icon={<IconCross />}\n onClick={onClose}\n dataTestId={{ root: dataTestId?.closeButton }}\n />\n ) : null}\n </div>\n {subtitle != null ? (\n <p className={styles.subtitle} data-testid={dataTestId?.subtitle}>\n {subtitle}\n </p>\n ) : null}\n </div>\n <div className={styles.body} data-testid={dataTestId?.body}>\n {children}\n </div>\n </div>\n )\n\n if (!withOverlay) return card\n\n return (\n // The backdrop is a pointer-only affordance — making it focusable would put\n // a stop in the tab order before the dialog. Keyboard users close via the\n // close button.\n // eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions\n <div\n className={styles.overlay}\n onMouseDown={handleOverlayMouseDown}\n onClick={handleOverlayClick}\n data-testid={dataTestId?.overlay}\n >\n {card}\n </div>\n )\n}\n"],"names":["scrollLockCount","restoreOverflow","lockBodyScroll","document","body","style","overflow","unlockBodyScroll","Math","max","Modal","_ref","title","subtitle","onClose","withOverlay","bodyFill","children","className","dataTestId","rest","titleId","useId","backdropMouseDown","useRef","useEffect","handleOverlayMouseDown","event","current","target","currentTarget","handleOverlayClick","card","_jsxs","cn","styles","cardBodyFill","role","undefined","root","headerGroup","header","_jsx","id","titleHidden","IconButton","variant","icon","IconCross","onClick","closeButton","overlay","onMouseDown"],"mappings":"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"}
1
+ {"version":3,"file":"Modal.mjs","sources":["../../../src/modal/Modal.tsx"],"sourcesContent":["import {\n forwardRef,\n useId,\n useImperativeHandle,\n useRef,\n useState,\n type ComponentPropsWithoutRef,\n type MouseEvent,\n type ReactNode,\n} from 'react'\n\nimport { Portal, useBodyScrollLock, useEscape, useFocusTrap } from '../hooks'\nimport { IconButton } from '../icon-button'\nimport { IconCross } from '../icons'\nimport cn from 'classnames'\n\nimport styles from './Modal.module.css'\n\nexport type ModalDataTestId = {\n root?: string\n title?: string\n subtitle?: string\n closeButton?: string\n body?: string\n overlay?: string\n}\n\nexport type ModalProps = Omit<\n ComponentPropsWithoutRef<'div'>,\n 'title' | 'children'\n> & {\n title?: ReactNode\n subtitle?: ReactNode\n onClose?: () => void\n /** Wraps the card in a portaled scrim; enables Escape, focus trap and scroll lock. */\n withOverlay?: boolean\n bodyFill?: boolean\n /** Opt out of body scroll lock (overlay only). Default true. */\n lockScroll?: boolean\n /** Opt out of Escape-to-close (overlay only). Default true. */\n closeOnEscape?: boolean\n /** Opt out of closing on scrim click (overlay only). Default true. */\n closeOnOverlayClick?: boolean\n children: ReactNode\n dataTestId?: ModalDataTestId\n}\n\nconst ModalDialog = forwardRef<HTMLDivElement, ModalProps>(\n (\n {\n title,\n subtitle,\n onClose,\n withOverlay = false,\n bodyFill = false,\n lockScroll = true,\n closeOnEscape = true,\n closeOnOverlayClick = true,\n children,\n className,\n dataTestId,\n ...rest\n },\n ref,\n ) => {\n const titleId = useId()\n const [cardEl, setCardEl] = useState<HTMLDivElement | null>(null)\n const backdropMouseDown = useRef(false)\n\n useImperativeHandle(ref, () => cardEl as HTMLDivElement, [cardEl])\n useBodyScrollLock(withOverlay && lockScroll)\n useFocusTrap(cardEl, withOverlay)\n // Stays registered with closeOnEscape={false} so Escape doesn't fall through to an underlying overlay.\n useEscape(withOverlay, () => {\n if (closeOnEscape) onClose?.()\n })\n\n const handleOverlayMouseDown = (event: MouseEvent<HTMLDivElement>) => {\n backdropMouseDown.current = event.target === event.currentTarget\n }\n\n const handleOverlayClick = (event: MouseEvent<HTMLDivElement>) => {\n if (\n closeOnOverlayClick &&\n backdropMouseDown.current &&\n event.target === event.currentTarget\n ) {\n onClose?.()\n }\n }\n\n const card = (\n <div\n role='dialog'\n aria-modal={withOverlay || undefined}\n aria-labelledby={title ? titleId : undefined}\n data-testid={dataTestId?.root}\n {...rest}\n ref={setCardEl}\n className={cn(styles.card, bodyFill && styles.cardBodyFill, className)}\n >\n <div className={styles.headerGroup}>\n <div className={styles.header}>\n <span\n id={titleId}\n className={cn(styles.title, !title && styles.titleHidden)}\n data-testid={dataTestId?.title}\n >\n {title}\n </span>\n {onClose ? (\n <IconButton\n variant='outline'\n aria-label='Close'\n icon={<IconCross />}\n onClick={onClose}\n dataTestId={{ root: dataTestId?.closeButton }}\n />\n ) : null}\n </div>\n {subtitle != null ? (\n <p className={styles.subtitle} data-testid={dataTestId?.subtitle}>\n {subtitle}\n </p>\n ) : null}\n </div>\n <div className={styles.body} data-testid={dataTestId?.body}>\n {children}\n </div>\n </div>\n )\n\n if (!withOverlay) return card\n\n return (\n // Pointer-only: a focusable backdrop would add a tab stop before the dialog; keyboard closes via Escape.\n // eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions\n <div\n className={styles.overlay}\n onMouseDown={handleOverlayMouseDown}\n onClick={handleOverlayClick}\n data-testid={dataTestId?.overlay}\n >\n {card}\n </div>\n )\n },\n)\n\nModalDialog.displayName = 'ModalDialog'\n\n// Hooks live in ModalDialog so they run once the portal has mounted its content.\nexport const Modal = forwardRef<HTMLDivElement, ModalProps>((props, ref) => {\n const dialog = <ModalDialog ref={ref} {...props} />\n return props.withOverlay ? <Portal>{dialog}</Portal> : dialog\n})\n\nModal.displayName = 'Modal'\n"],"names":["ModalDialog","forwardRef","_ref","ref","title","subtitle","onClose","withOverlay","bodyFill","lockScroll","closeOnEscape","closeOnOverlayClick","children","className","dataTestId","rest","titleId","useId","cardEl","setCardEl","useState","backdropMouseDown","useRef","useImperativeHandle","useBodyScrollLock","useFocusTrap","useEscape","handleOverlayMouseDown","event","current","target","currentTarget","handleOverlayClick","card","_jsxs","role","undefined","root","cn","styles","cardBodyFill","headerGroup","header","_jsx","id","titleHidden","IconButton","variant","icon","IconCross","onClick","closeButton","body","overlay","onMouseDown","displayName","Modal","props","dialog","Portal"],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import { forwardRef } from 'react';
2
+ import cn from 'classnames';
3
+ import { Anchor } from '../link-provider/Anchor.mjs';
4
+ import styles from './NavLink.module.css.mjs';
5
+ import { jsxs, jsx } from 'react/jsx-runtime';
6
+ import { IconLink } from '../icons/components/base/IconLink.mjs';
7
+
8
+ const NavLink = /*#__PURE__*/forwardRef((_ref, ref) => {
9
+ let {
10
+ active = false,
11
+ icon,
12
+ external = false,
13
+ className,
14
+ children,
15
+ target,
16
+ rel,
17
+ ...rest
18
+ } = _ref;
19
+ return /*#__PURE__*/jsxs(Anchor, {
20
+ ref: ref,
21
+ className: cn(styles.link, active && styles.active, className),
22
+ "aria-current": active ? 'page' : undefined,
23
+ target: target ?? (external ? '_blank' : undefined),
24
+ rel: rel ?? (external ? 'noopener noreferrer' : undefined),
25
+ ...rest,
26
+ children: [icon != null ? /*#__PURE__*/jsx("span", {
27
+ className: styles.icon,
28
+ "aria-hidden": "true",
29
+ children: icon
30
+ }) : null, children, external ? /*#__PURE__*/jsx("span", {
31
+ className: styles.icon,
32
+ "aria-hidden": "true",
33
+ children: /*#__PURE__*/jsx(IconLink, {})
34
+ }) : null]
35
+ });
36
+ });
37
+ NavLink.displayName = 'NavLink';
38
+
39
+ export { NavLink };
40
+ //# sourceMappingURL=NavLink.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NavLink.mjs","sources":["../../../src/nav-link/NavLink.tsx"],"sourcesContent":["import { forwardRef, type AnchorHTMLAttributes, type ReactNode } from 'react'\n\nimport cn from 'classnames'\n\nimport { IconLink } from '../icons'\nimport { Anchor } from '../link-provider/Anchor'\nimport styles from './NavLink.module.css'\n\nexport type NavLinkProps = AnchorHTMLAttributes<HTMLAnchorElement> & {\n active?: boolean\n icon?: ReactNode\n external?: boolean\n}\n\nexport const NavLink = forwardRef<HTMLAnchorElement, NavLinkProps>(\n (\n {\n active = false,\n icon,\n external = false,\n className,\n children,\n target,\n rel,\n ...rest\n },\n ref,\n ) => (\n <Anchor\n ref={ref}\n className={cn(styles.link, active && styles.active, className)}\n aria-current={active ? 'page' : undefined}\n target={target ?? (external ? '_blank' : undefined)}\n rel={rel ?? (external ? 'noopener noreferrer' : undefined)}\n {...rest}\n >\n {icon != null ? (\n <span className={styles.icon} aria-hidden='true'>\n {icon}\n </span>\n ) : null}\n {children}\n {external ? (\n <span className={styles.icon} aria-hidden='true'>\n <IconLink />\n </span>\n ) : null}\n </Anchor>\n ),\n)\n\nNavLink.displayName = 'NavLink'\n"],"names":["NavLink","forwardRef","_ref","ref","active","icon","external","className","children","target","rel","rest","_jsxs","Anchor","cn","styles","link","undefined","_jsx","IconLink","displayName"],"mappings":";;;;;;;AAcO,MAAMA,OAAO,gBAAGC,UAAU,CAC/B,CAAAC,IAAA,EAWEC,GAAG,KAAA;EAAA,IAVH;AACEC,IAAAA,MAAM,GAAG,KAAK;IACdC,IAAI;AACJC,IAAAA,QAAQ,GAAG,KAAK;IAChBC,SAAS;IACTC,QAAQ;IACRC,MAAM;IACNC,GAAG;IACH,GAAGC,IAAAA;AACL,GAAC,GAAAT,IAAA,CAAA;EAAA,oBAGDU,IAAA,CAACC,MAAM,EAAA;AACLV,IAAAA,GAAG,EAAEA,GAAI;AACTI,IAAAA,SAAS,EAAEO,EAAE,CAACC,MAAM,CAACC,IAAI,EAAEZ,MAAM,IAAIW,MAAM,CAACX,MAAM,EAAEG,SAAS,CAAE;AAC/D,IAAA,cAAA,EAAcH,MAAM,GAAG,MAAM,GAAGa,SAAU;IAC1CR,MAAM,EAAEA,MAAM,KAAKH,QAAQ,GAAG,QAAQ,GAAGW,SAAS,CAAE;IACpDP,GAAG,EAAEA,GAAG,KAAKJ,QAAQ,GAAG,qBAAqB,GAAGW,SAAS,CAAE;AAAA,IAAA,GACvDN,IAAI;AAAAH,IAAAA,QAAA,EAEPH,CAAAA,IAAI,IAAI,IAAI,gBACXa,GAAA,CAAA,MAAA,EAAA;MAAMX,SAAS,EAAEQ,MAAM,CAACV,IAAK;AAAC,MAAA,aAAA,EAAY,MAAM;AAAAG,MAAAA,QAAA,EAC7CH,IAAAA;KACG,CAAC,GACL,IAAI,EACPG,QAAQ,EACRF,QAAQ,gBACPY,GAAA,CAAA,MAAA,EAAA;MAAMX,SAAS,EAAEQ,MAAM,CAACV,IAAK;AAAC,MAAA,aAAA,EAAY,MAAM;AAAAG,MAAAA,QAAA,eAC9CU,GAAA,CAACC,QAAQ,EAAE,EAAA,CAAA;KACP,CAAC,GACL,IAAI,CAAA;AAAA,GACF,CAAC,CAAA;AAAA,CAEb,EAAC;AAEDnB,OAAO,CAACoB,WAAW,GAAG,SAAS;;;;"}
@@ -0,0 +1,4 @@
1
+ const styles = {"link":"NavLink-module_link__vuICw","active":"NavLink-module_active__drmha","icon":"NavLink-module_icon__gjet5"};
2
+
3
+ export { styles as default };
4
+ //# sourceMappingURL=NavLink.module.css.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NavLink.module.css.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -1,23 +1,29 @@
1
+ import { forwardRef } from 'react';
1
2
  import { ThemeProvider, ThemeName } from '@lidofinance/lido-shared-ui';
2
3
  import cn from 'classnames';
3
4
  import styles from './Notification.module.css.mjs';
4
5
  import { jsx, jsxs } from 'react/jsx-runtime';
6
+ import { IconButton } from '../icon-button/IconButton.mjs';
7
+ import { IconCross } from '../icons/components/base/IconCross.mjs';
5
8
 
6
- const Notification = _ref => {
9
+ const Notification = /*#__PURE__*/forwardRef((_ref, ref) => {
7
10
  let {
8
11
  title,
9
12
  children,
10
13
  subheader,
11
14
  actions,
15
+ onClose,
12
16
  className,
17
+ role = 'alert',
13
18
  dataTestId,
14
19
  ...rest
15
20
  } = _ref;
16
21
  return /*#__PURE__*/jsx(ThemeProvider, {
17
22
  themeName: ThemeName.dark,
18
23
  children: /*#__PURE__*/jsxs("div", {
24
+ ref: ref,
25
+ role: role,
19
26
  className: cn(styles.notification, className),
20
- role: "alert",
21
27
  "data-testid": dataTestId?.root,
22
28
  ...rest,
23
29
  children: [/*#__PURE__*/jsxs("div", {
@@ -27,7 +33,7 @@ const Notification = _ref => {
27
33
  "data-testid": dataTestId?.subheader,
28
34
  children: subheader
29
35
  }) : null, /*#__PURE__*/jsx("p", {
30
- className: styles.title,
36
+ className: cn(styles.title, onClose && styles.closable),
31
37
  "data-testid": dataTestId?.title,
32
38
  children: title
33
39
  }), children != null ? /*#__PURE__*/jsx("div", {
@@ -39,10 +45,20 @@ const Notification = _ref => {
39
45
  className: styles.actions,
40
46
  "data-testid": dataTestId?.actions,
41
47
  children: actions
48
+ }) : null, onClose ? /*#__PURE__*/jsx(IconButton, {
49
+ variant: "ghost",
50
+ "aria-label": "Dismiss",
51
+ icon: /*#__PURE__*/jsx(IconCross, {}),
52
+ className: styles.close,
53
+ onClick: onClose,
54
+ dataTestId: {
55
+ root: dataTestId?.closeButton
56
+ }
42
57
  }) : null]
43
58
  })
44
59
  });
45
- };
60
+ });
61
+ Notification.displayName = 'Notification';
46
62
 
47
63
  export { Notification };
48
64
  //# sourceMappingURL=Notification.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Notification.mjs","sources":["../../../src/notification/Notification.tsx"],"sourcesContent":["import { ThemeName, ThemeProvider } from '@lidofinance/lido-shared-ui'\n\nimport cn from 'classnames'\nimport type { ComponentPropsWithoutRef, ReactNode } from 'react'\n\nimport styles from './Notification.module.css'\n\nexport type NotificationDataTestId = {\n root?: string\n title?: string\n body?: string\n actions?: string\n subheader?: string\n}\n\nexport type NotificationProps = Omit<\n ComponentPropsWithoutRef<'div'>,\n 'title'\n> & {\n title: ReactNode\n children?: ReactNode\n subheader?: ReactNode\n actions?: ReactNode\n dataTestId?: NotificationDataTestId\n}\n\nexport const Notification = ({\n title,\n children,\n subheader,\n actions,\n className,\n dataTestId,\n ...rest\n}: NotificationProps) => (\n <ThemeProvider themeName={ThemeName.dark}>\n <div\n className={cn(styles.notification, className)}\n role='alert'\n data-testid={dataTestId?.root}\n {...rest}\n >\n <div className={styles.content}>\n {subheader != null ? (\n <div className={styles.subheader} data-testid={dataTestId?.subheader}>\n {subheader}\n </div>\n ) : null}\n <p className={styles.title} data-testid={dataTestId?.title}>\n {title}\n </p>\n {children != null ? (\n <div className={styles.body} data-testid={dataTestId?.body}>\n {children}\n </div>\n ) : null}\n </div>\n {actions != null ? (\n <div className={styles.actions} data-testid={dataTestId?.actions}>\n {actions}\n </div>\n ) : null}\n </div>\n </ThemeProvider>\n)\n"],"names":["Notification","_ref","title","children","subheader","actions","className","dataTestId","rest","_jsx","ThemeProvider","themeName","ThemeName","dark","_jsxs","cn","styles","notification","role","root","content","body"],"mappings":";;;;;AA0BO,MAAMA,YAAY,GAAGC,IAAA,IAAA;EAAA,IAAC;IAC3BC,KAAK;IACLC,QAAQ;IACRC,SAAS;IACTC,OAAO;IACPC,SAAS;IACTC,UAAU;IACV,GAAGC,IAAAA;AACc,GAAC,GAAAP,IAAA,CAAA;EAAA,oBAClBQ,GAAA,CAACC,aAAa,EAAA;IAACC,SAAS,EAAEC,SAAS,CAACC,IAAK;AAAAV,IAAAA,QAAA,eACvCW,IAAA,CAAA,KAAA,EAAA;MACER,SAAS,EAAES,EAAE,CAACC,MAAM,CAACC,YAAY,EAAEX,SAAS,CAAE;AAC9CY,MAAAA,IAAI,EAAC,OAAO;MACZ,aAAaX,EAAAA,UAAU,EAAEY,IAAK;AAAA,MAAA,GAC1BX,IAAI;AAAAL,MAAAA,QAAA,gBAERW,IAAA,CAAA,KAAA,EAAA;QAAKR,SAAS,EAAEU,MAAM,CAACI,OAAQ;AAAAjB,QAAAA,QAAA,EAC5BC,CAAAA,SAAS,IAAI,IAAI,gBAChBK,GAAA,CAAA,KAAA,EAAA;UAAKH,SAAS,EAAEU,MAAM,CAACZ,SAAU;UAAC,aAAaG,EAAAA,UAAU,EAAEH,SAAU;AAAAD,UAAAA,QAAA,EAClEC,SAAAA;AAAS,SACP,CAAC,GACJ,IAAI,eACRK,GAAA,CAAA,GAAA,EAAA;UAAGH,SAAS,EAAEU,MAAM,CAACd,KAAM;UAAC,aAAaK,EAAAA,UAAU,EAAEL,KAAM;AAAAC,UAAAA,QAAA,EACxDD,KAAAA;AAAK,SACL,CAAC,EACHC,QAAQ,IAAI,IAAI,gBACfM,GAAA,CAAA,KAAA,EAAA;UAAKH,SAAS,EAAEU,MAAM,CAACK,IAAK;UAAC,aAAad,EAAAA,UAAU,EAAEc,IAAK;AAAAlB,UAAAA,QAAA,EACxDA,QAAAA;SACE,CAAC,GACJ,IAAI,CAAA;AAAA,OACL,CAAC,EACLE,OAAO,IAAI,IAAI,gBACdI,GAAA,CAAA,KAAA,EAAA;QAAKH,SAAS,EAAEU,MAAM,CAACX,OAAQ;QAAC,aAAaE,EAAAA,UAAU,EAAEF,OAAQ;AAAAF,QAAAA,QAAA,EAC9DE,OAAAA;OACE,CAAC,GACJ,IAAI,CAAA;KACL,CAAA;AAAC,GACO,CAAC,CAAA;AAAA;;;;"}
1
+ {"version":3,"file":"Notification.mjs","sources":["../../../src/notification/Notification.tsx"],"sourcesContent":["import {\n forwardRef,\n type ComponentPropsWithoutRef,\n type MouseEventHandler,\n type ReactNode,\n} from 'react'\n\nimport { ThemeName, ThemeProvider } from '@lidofinance/lido-shared-ui'\nimport cn from 'classnames'\n\nimport { IconButton } from '../icon-button'\nimport { IconCross } from '../icons'\nimport styles from './Notification.module.css'\n\nexport type NotificationDataTestId = {\n root?: string\n title?: string\n body?: string\n actions?: string\n subheader?: string\n closeButton?: string\n}\n\nexport type NotificationProps = Omit<\n ComponentPropsWithoutRef<'div'>,\n 'title'\n> & {\n title: ReactNode\n children?: ReactNode\n /** Slot above the title, usually a `Tag`. */\n subheader?: ReactNode\n actions?: ReactNode\n /** Renders a dismiss button when set. */\n onClose?: MouseEventHandler<HTMLButtonElement>\n dataTestId?: NotificationDataTestId\n}\n\nexport const Notification = forwardRef<HTMLDivElement, NotificationProps>(\n (\n {\n title,\n children,\n subheader,\n actions,\n onClose,\n className,\n role = 'alert',\n dataTestId,\n ...rest\n },\n ref,\n ) => (\n <ThemeProvider themeName={ThemeName.dark}>\n <div\n ref={ref}\n role={role}\n className={cn(styles.notification, className)}\n data-testid={dataTestId?.root}\n {...rest}\n >\n <div className={styles.content}>\n {subheader != null ? (\n <div\n className={styles.subheader}\n data-testid={dataTestId?.subheader}\n >\n {subheader}\n </div>\n ) : null}\n <p\n className={cn(styles.title, onClose && styles.closable)}\n data-testid={dataTestId?.title}\n >\n {title}\n </p>\n {children != null ? (\n <div className={styles.body} data-testid={dataTestId?.body}>\n {children}\n </div>\n ) : null}\n </div>\n {actions != null ? (\n <div className={styles.actions} data-testid={dataTestId?.actions}>\n {actions}\n </div>\n ) : null}\n {onClose ? (\n <IconButton\n variant='ghost'\n aria-label='Dismiss'\n icon={<IconCross />}\n className={styles.close}\n onClick={onClose}\n dataTestId={{ root: dataTestId?.closeButton }}\n />\n ) : null}\n </div>\n </ThemeProvider>\n ),\n)\n\nNotification.displayName = 'Notification'\n"],"names":["Notification","forwardRef","_ref","ref","title","children","subheader","actions","onClose","className","role","dataTestId","rest","_jsx","ThemeProvider","themeName","ThemeName","dark","_jsxs","cn","styles","notification","root","content","closable","body","IconButton","variant","icon","IconCross","close","onClick","closeButton","displayName"],"mappings":";;;;;;;;AAqCO,MAAMA,YAAY,gBAAGC,UAAU,CACpC,CAAAC,IAAA,EAYEC,GAAG,KAAA;EAAA,IAXH;IACEC,KAAK;IACLC,QAAQ;IACRC,SAAS;IACTC,OAAO;IACPC,OAAO;IACPC,SAAS;AACTC,IAAAA,IAAI,GAAG,OAAO;IACdC,UAAU;IACV,GAAGC,IAAAA;AACL,GAAC,GAAAV,IAAA,CAAA;EAAA,oBAGDW,GAAA,CAACC,aAAa,EAAA;IAACC,SAAS,EAAEC,SAAS,CAACC,IAAK;AAAAZ,IAAAA,QAAA,eACvCa,IAAA,CAAA,KAAA,EAAA;AACEf,MAAAA,GAAG,EAAEA,GAAI;AACTO,MAAAA,IAAI,EAAEA,IAAK;MACXD,SAAS,EAAEU,EAAE,CAACC,MAAM,CAACC,YAAY,EAAEZ,SAAS,CAAE;MAC9C,aAAaE,EAAAA,UAAU,EAAEW,IAAK;AAAA,MAAA,GAC1BV,IAAI;AAAAP,MAAAA,QAAA,gBAERa,IAAA,CAAA,KAAA,EAAA;QAAKT,SAAS,EAAEW,MAAM,CAACG,OAAQ;AAAAlB,QAAAA,QAAA,EAC5BC,CAAAA,SAAS,IAAI,IAAI,gBAChBO,GAAA,CAAA,KAAA,EAAA;UACEJ,SAAS,EAAEW,MAAM,CAACd,SAAU;UAC5B,aAAaK,EAAAA,UAAU,EAAEL,SAAU;AAAAD,UAAAA,QAAA,EAElCC,SAAAA;AAAS,SACP,CAAC,GACJ,IAAI,eACRO,GAAA,CAAA,GAAA,EAAA;AACEJ,UAAAA,SAAS,EAAEU,EAAE,CAACC,MAAM,CAAChB,KAAK,EAAEI,OAAO,IAAIY,MAAM,CAACI,QAAQ,CAAE;UACxD,aAAab,EAAAA,UAAU,EAAEP,KAAM;AAAAC,UAAAA,QAAA,EAE9BD,KAAAA;AAAK,SACL,CAAC,EACHC,QAAQ,IAAI,IAAI,gBACfQ,GAAA,CAAA,KAAA,EAAA;UAAKJ,SAAS,EAAEW,MAAM,CAACK,IAAK;UAAC,aAAad,EAAAA,UAAU,EAAEc,IAAK;AAAApB,UAAAA,QAAA,EACxDA,QAAAA;SACE,CAAC,GACJ,IAAI,CAAA;AAAA,OACL,CAAC,EACLE,OAAO,IAAI,IAAI,gBACdM,GAAA,CAAA,KAAA,EAAA;QAAKJ,SAAS,EAAEW,MAAM,CAACb,OAAQ;QAAC,aAAaI,EAAAA,UAAU,EAAEJ,OAAQ;AAAAF,QAAAA,QAAA,EAC9DE,OAAAA;OACE,CAAC,GACJ,IAAI,EACPC,OAAO,gBACNK,GAAA,CAACa,UAAU,EAAA;AACTC,QAAAA,OAAO,EAAC,OAAO;AACf,QAAA,YAAA,EAAW,SAAS;AACpBC,QAAAA,IAAI,eAAEf,GAAA,CAACgB,SAAS,IAAE,CAAE;QACpBpB,SAAS,EAAEW,MAAM,CAACU,KAAM;AACxBC,QAAAA,OAAO,EAAEvB,OAAQ;AACjBG,QAAAA,UAAU,EAAE;UAAEW,IAAI,EAAEX,UAAU,EAAEqB,WAAAA;AAAY,SAAA;OAC7C,CAAC,GACA,IAAI,CAAA;KACL,CAAA;AAAC,GACO,CAAC,CAAA;AAAA,CAEpB,EAAC;AAEDhC,YAAY,CAACiC,WAAW,GAAG,cAAc;;;;"}
@@ -1,4 +1,4 @@
1
- const styles = {"notification":"Notification-module_notification__78CFU","content":"Notification-module_content__HOyyc","title":"Notification-module_title__pC9Yh","body":"Notification-module_body__9icKP","subheader":"Notification-module_subheader__4Mrnv","actions":"Notification-module_actions__DCafA","button":"Notification-module_button__x9Snk"};
1
+ const styles = {"notification":"Notification-module_notification__78CFU","content":"Notification-module_content__HOyyc","subheader":"Notification-module_subheader__4Mrnv","title":"Notification-module_title__pC9Yh","closable":"Notification-module_closable__75wDN","close":"Notification-module_close__v8fH-","body":"Notification-module_body__9icKP","actions":"Notification-module_actions__DCafA"};
2
2
 
3
3
  export { styles as default };
4
4
  //# sourceMappingURL=Notification.module.css.mjs.map
@@ -0,0 +1,132 @@
1
+ import { useState, useEffect } from 'react';
2
+ import cn from 'classnames';
3
+ import styles from './Popover.module.css.mjs';
4
+ import { jsx } from 'react/jsx-runtime';
5
+ import { Portal } from '../hooks/Portal.mjs';
6
+ import { useIsomorphicLayoutEffect } from '../hooks/useIsomorphicLayoutEffect.mjs';
7
+ import { useFocusTrap } from '../hooks/useFocusTrap.mjs';
8
+ import { useEscape } from '../hooks/useEscape.mjs';
9
+ import { useOutsideClick } from '../hooks/useOutsideClick.mjs';
10
+
11
+ const POSITION_KEYS = ['top', 'bottom', 'left', 'right', 'width'];
12
+ const samePosition = (a, b) => a != null && a.placement === b.placement && POSITION_KEYS.every(key => a.coordinates[key] === b.coordinates[key]);
13
+ const VIEWPORT_MARGIN = 8;
14
+ const clamp = (value, max) => Math.max(VIEWPORT_MARGIN, Math.min(value, max));
15
+ const computePosition = (anchor, alignEl, panel, placement, align, offset, width) => {
16
+ const anchorRect = anchor.getBoundingClientRect();
17
+ const alignRect = alignEl === anchor ? anchorRect : alignEl.getBoundingClientRect();
18
+ const viewportWidth = document.documentElement.clientWidth;
19
+ const viewportHeight = document.documentElement.clientHeight;
20
+ const fixedWidth = typeof width === 'number' ? width : width === 'anchor' ? anchorRect.width : width === 'align' ? alignRect.width : undefined;
21
+ const panelWidth = fixedWidth ?? panel?.getBoundingClientRect().width ?? 0;
22
+ const maxEdge = viewportWidth - VIEWPORT_MARGIN - panelWidth;
23
+ const panelHeight = panel?.getBoundingClientRect().height ?? 0;
24
+ const roomBelow = viewportHeight - anchorRect.bottom - offset - VIEWPORT_MARGIN;
25
+ const roomAbove = anchorRect.top - offset - VIEWPORT_MARGIN;
26
+ const [room, opposite] = placement === 'top' ? [roomAbove, roomBelow] : [roomBelow, roomAbove];
27
+ const resolved = panelHeight > room && opposite > room ? placement === 'top' ? 'bottom' : 'top' : placement;
28
+ const coordinates = {};
29
+ if (fixedWidth != null) coordinates.width = fixedWidth;
30
+ if (resolved === 'top') {
31
+ coordinates.bottom = viewportHeight - anchorRect.top + offset;
32
+ } else {
33
+ coordinates.top = anchorRect.bottom + offset;
34
+ }
35
+ if (align === 'end') {
36
+ coordinates.right = clamp(viewportWidth - alignRect.right, maxEdge);
37
+ } else if (align === 'center') {
38
+ coordinates.left = clamp(alignRect.left + alignRect.width / 2 - panelWidth / 2, maxEdge);
39
+ } else {
40
+ coordinates.left = clamp(alignRect.left, maxEdge);
41
+ }
42
+ return {
43
+ placement: resolved,
44
+ coordinates
45
+ };
46
+ };
47
+ const PopoverPanel = _ref => {
48
+ let {
49
+ onClose,
50
+ anchorRef,
51
+ alignRef,
52
+ placement = 'bottom',
53
+ align = 'start',
54
+ offset = 8,
55
+ width,
56
+ modal = true,
57
+ className,
58
+ style,
59
+ children,
60
+ ...rest
61
+ } = _ref;
62
+ const [panel, setPanel] = useState(null);
63
+ const [position, setPosition] = useState(null);
64
+ useIsomorphicLayoutEffect(() => {
65
+ const update = () => {
66
+ const anchor = anchorRef.current;
67
+ if (!anchor) return;
68
+ const next = computePosition(anchor, alignRef?.current ?? anchor, panel, placement, align, offset, width);
69
+ // Keeps the previous object so unchanged scroll/resize frames skip a re-render.
70
+ setPosition(prev => samePosition(prev, next) ? prev : next);
71
+ };
72
+ update();
73
+ let frame = 0;
74
+ const schedule = () => {
75
+ cancelAnimationFrame(frame);
76
+ frame = requestAnimationFrame(update);
77
+ };
78
+ window.addEventListener('resize', schedule);
79
+ window.addEventListener('scroll', schedule, true);
80
+ const observer = typeof ResizeObserver === 'undefined' ? null : new ResizeObserver(schedule);
81
+ if (anchorRef.current) observer?.observe(anchorRef.current);
82
+ return () => {
83
+ observer?.disconnect();
84
+ cancelAnimationFrame(frame);
85
+ window.removeEventListener('resize', schedule);
86
+ window.removeEventListener('scroll', schedule, true);
87
+ };
88
+ }, [anchorRef, alignRef, panel, placement, align, offset, width]);
89
+ useFocusTrap(panel, modal && position != null, {
90
+ restoreFocus: false
91
+ });
92
+ useEscape(true, onClose);
93
+ useOutsideClick(panel, event => {
94
+ // Anchor clicks are left to the anchor's own toggle handler.
95
+ if (event.target instanceof Node && anchorRef.current?.contains(event.target)) return;
96
+ onClose();
97
+ }, true);
98
+
99
+ // Passive cleanup runs after the panel left the DOM; focus is on body unless the user moved it elsewhere.
100
+ useEffect(() => () => {
101
+ const active = document.activeElement;
102
+ if (!active || active === document.body) anchorRef.current?.focus();
103
+ }, [anchorRef]);
104
+ return /*#__PURE__*/jsx("div", {
105
+ ref: setPanel,
106
+ role: "dialog",
107
+ "aria-modal": modal || undefined,
108
+ "data-placement": position?.placement,
109
+ className: cn(styles.panel, className),
110
+ style: {
111
+ ...position?.coordinates,
112
+ ...style,
113
+ visibility: position ? undefined : 'hidden'
114
+ },
115
+ ...rest,
116
+ children: children
117
+ });
118
+ };
119
+ const Popover = _ref2 => {
120
+ let {
121
+ open,
122
+ ...props
123
+ } = _ref2;
124
+ return open ? /*#__PURE__*/jsx(Portal, {
125
+ children: /*#__PURE__*/jsx(PopoverPanel, {
126
+ ...props
127
+ })
128
+ }) : null;
129
+ };
130
+
131
+ export { Popover };
132
+ //# sourceMappingURL=Popover.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Popover.mjs","sources":["../../../src/popover/Popover.tsx"],"sourcesContent":["import { useEffect, useState, type HTMLAttributes, type RefObject } from 'react'\n\nimport cn from 'classnames'\n\nimport {\n Portal,\n useEscape,\n useFocusTrap,\n useIsomorphicLayoutEffect,\n useOutsideClick,\n} from '../hooks'\nimport styles from './Popover.module.css'\n\nexport type PopoverPlacement = 'top' | 'bottom'\nexport type PopoverAlign = 'start' | 'center' | 'end'\nexport type PopoverOffset = 0 | 2 | 4 | 8 | 12 | 16 | 20 | 24 | 32 | 40 | 52\n\nexport type PopoverProps = HTMLAttributes<HTMLDivElement> & {\n open: boolean\n onClose: () => void\n anchorRef: RefObject<HTMLElement | null>\n /** Element whose edge the panel aligns to; defaults to the anchor. */\n alignRef?: RefObject<HTMLElement | null>\n placement?: PopoverPlacement\n align?: PopoverAlign\n /** Gap in px between the anchor and the panel. */\n offset?: PopoverOffset\n /** Px, or match the width of the anchor / align element. */\n width?: number | 'anchor' | 'align'\n /** When false, focus stays where it is and isn't trapped, e.g. for menus opened by hover. */\n modal?: boolean\n}\n\nconst POSITION_KEYS = ['top', 'bottom', 'left', 'right', 'width'] as const\ntype Coordinates = Partial<Record<(typeof POSITION_KEYS)[number], number>>\ntype Position = { placement: PopoverPlacement; coordinates: Coordinates }\n\nconst samePosition = (a: Position | null, b: Position) =>\n a != null &&\n a.placement === b.placement &&\n POSITION_KEYS.every((key) => a.coordinates[key] === b.coordinates[key])\n\nconst VIEWPORT_MARGIN = 8\n\nconst clamp = (value: number, max: number) =>\n Math.max(VIEWPORT_MARGIN, Math.min(value, max))\n\nconst computePosition = (\n anchor: HTMLElement,\n alignEl: HTMLElement,\n panel: HTMLElement | null,\n placement: PopoverPlacement,\n align: PopoverAlign,\n offset: number,\n width: PopoverProps['width'],\n): Position => {\n const anchorRect = anchor.getBoundingClientRect()\n const alignRect =\n alignEl === anchor ? anchorRect : alignEl.getBoundingClientRect()\n const viewportWidth = document.documentElement.clientWidth\n const viewportHeight = document.documentElement.clientHeight\n\n const fixedWidth =\n typeof width === 'number'\n ? width\n : width === 'anchor'\n ? anchorRect.width\n : width === 'align'\n ? alignRect.width\n : undefined\n const panelWidth = fixedWidth ?? panel?.getBoundingClientRect().width ?? 0\n const maxEdge = viewportWidth - VIEWPORT_MARGIN - panelWidth\n\n const panelHeight = panel?.getBoundingClientRect().height ?? 0\n const roomBelow =\n viewportHeight - anchorRect.bottom - offset - VIEWPORT_MARGIN\n const roomAbove = anchorRect.top - offset - VIEWPORT_MARGIN\n const [room, opposite] =\n placement === 'top' ? [roomAbove, roomBelow] : [roomBelow, roomAbove]\n const resolved: PopoverPlacement =\n panelHeight > room && opposite > room\n ? placement === 'top'\n ? 'bottom'\n : 'top'\n : placement\n\n const coordinates: Coordinates = {}\n if (fixedWidth != null) coordinates.width = fixedWidth\n if (resolved === 'top') {\n coordinates.bottom = viewportHeight - anchorRect.top + offset\n } else {\n coordinates.top = anchorRect.bottom + offset\n }\n if (align === 'end') {\n coordinates.right = clamp(viewportWidth - alignRect.right, maxEdge)\n } else if (align === 'center') {\n coordinates.left = clamp(\n alignRect.left + alignRect.width / 2 - panelWidth / 2,\n maxEdge,\n )\n } else {\n coordinates.left = clamp(alignRect.left, maxEdge)\n }\n return { placement: resolved, coordinates }\n}\n\nconst PopoverPanel = ({\n onClose,\n anchorRef,\n alignRef,\n placement = 'bottom',\n align = 'start',\n offset = 8,\n width,\n modal = true,\n className,\n style,\n children,\n ...rest\n}: Omit<PopoverProps, 'open'>) => {\n const [panel, setPanel] = useState<HTMLDivElement | null>(null)\n const [position, setPosition] = useState<Position | null>(null)\n\n useIsomorphicLayoutEffect(() => {\n const update = () => {\n const anchor = anchorRef.current\n if (!anchor) return\n const next = computePosition(\n anchor,\n alignRef?.current ?? anchor,\n panel,\n placement,\n align,\n offset,\n width,\n )\n // Keeps the previous object so unchanged scroll/resize frames skip a re-render.\n setPosition((prev) => (samePosition(prev, next) ? prev : next))\n }\n update()\n let frame = 0\n const schedule = () => {\n cancelAnimationFrame(frame)\n frame = requestAnimationFrame(update)\n }\n window.addEventListener('resize', schedule)\n window.addEventListener('scroll', schedule, true)\n const observer =\n typeof ResizeObserver === 'undefined'\n ? null\n : new ResizeObserver(schedule)\n if (anchorRef.current) observer?.observe(anchorRef.current)\n return () => {\n observer?.disconnect()\n cancelAnimationFrame(frame)\n window.removeEventListener('resize', schedule)\n window.removeEventListener('scroll', schedule, true)\n }\n }, [anchorRef, alignRef, panel, placement, align, offset, width])\n\n useFocusTrap(panel, modal && position != null, { restoreFocus: false })\n useEscape(true, onClose)\n useOutsideClick(\n panel,\n (event) => {\n // Anchor clicks are left to the anchor's own toggle handler.\n if (\n event.target instanceof Node &&\n anchorRef.current?.contains(event.target)\n )\n return\n onClose()\n },\n true,\n )\n\n // Passive cleanup runs after the panel left the DOM; focus is on body unless the user moved it elsewhere.\n useEffect(\n () => () => {\n const active = document.activeElement\n if (!active || active === document.body) anchorRef.current?.focus()\n },\n [anchorRef],\n )\n\n return (\n <div\n ref={setPanel}\n role='dialog'\n aria-modal={modal || undefined}\n data-placement={position?.placement}\n className={cn(styles.panel, className)}\n style={{\n ...position?.coordinates,\n ...style,\n visibility: position ? undefined : 'hidden',\n }}\n {...rest}\n >\n {children}\n </div>\n )\n}\n\nexport const Popover = ({ open, ...props }: PopoverProps) =>\n open ? (\n <Portal>\n <PopoverPanel {...props} />\n </Portal>\n ) : null\n"],"names":["POSITION_KEYS","samePosition","a","b","placement","every","key","coordinates","VIEWPORT_MARGIN","clamp","value","max","Math","min","computePosition","anchor","alignEl","panel","align","offset","width","anchorRect","getBoundingClientRect","alignRect","viewportWidth","document","documentElement","clientWidth","viewportHeight","clientHeight","fixedWidth","undefined","panelWidth","maxEdge","panelHeight","height","roomBelow","bottom","roomAbove","top","room","opposite","resolved","right","left","PopoverPanel","_ref","onClose","anchorRef","alignRef","modal","className","style","children","rest","setPanel","useState","position","setPosition","useIsomorphicLayoutEffect","update","current","next","prev","frame","schedule","cancelAnimationFrame","requestAnimationFrame","window","addEventListener","observer","ResizeObserver","observe","disconnect","removeEventListener","useFocusTrap","restoreFocus","useEscape","useOutsideClick","event","target","Node","contains","useEffect","active","activeElement","body","focus","_jsx","ref","role","cn","styles","visibility","Popover","_ref2","open","props","Portal"],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ const styles = {"panel":"Popover-module_panel__N-Et6"};
2
+
3
+ export { styles as default };
4
+ //# sourceMappingURL=Popover.module.css.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Popover.module.css.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}