@lidofinance/lido-app-ui 1.13.0 → 1.14.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 (516) hide show
  1. package/README.md +85 -19
  2. package/dist/README.md +85 -19
  3. package/dist/cjs/accordion/Accordion.cjs +1 -0
  4. package/dist/cjs/accordion/Accordion.cjs.map +1 -1
  5. package/dist/cjs/badge/Badge.cjs +1 -0
  6. package/dist/cjs/badge/Badge.cjs.map +1 -1
  7. package/dist/cjs/banner/Banner.cjs +1 -0
  8. package/dist/cjs/banner/Banner.cjs.map +1 -1
  9. package/dist/cjs/breadcrumbs/Breadcrumbs.cjs +55 -26
  10. package/dist/cjs/breadcrumbs/Breadcrumbs.cjs.map +1 -1
  11. package/dist/cjs/breadcrumbs/Breadcrumbs.module.css.cjs +1 -1
  12. package/dist/cjs/button/Button.cjs +14 -23
  13. package/dist/cjs/button/Button.cjs.map +1 -1
  14. package/dist/cjs/button/ButtonContent.cjs +50 -0
  15. package/dist/cjs/button/ButtonContent.cjs.map +1 -0
  16. package/dist/cjs/button/LinkButton.cjs +46 -0
  17. package/dist/cjs/button/LinkButton.cjs.map +1 -0
  18. package/dist/cjs/card/Card.cjs +1 -0
  19. package/dist/cjs/card/Card.cjs.map +1 -1
  20. package/dist/cjs/checkbox/Checkbox.cjs +1 -0
  21. package/dist/cjs/checkbox/Checkbox.cjs.map +1 -1
  22. package/dist/cjs/counter/Counter.cjs +6 -2
  23. package/dist/cjs/counter/Counter.cjs.map +1 -1
  24. package/dist/cjs/counter/CounterSlot.cjs +19 -2
  25. package/dist/cjs/counter/CounterSlot.cjs.map +1 -1
  26. package/dist/cjs/counter/CounterSlot.module.css.cjs +1 -1
  27. package/dist/cjs/data-list/DataList.cjs +1 -0
  28. package/dist/cjs/data-list/DataList.cjs.map +1 -1
  29. package/dist/cjs/data-list/DataListRow.cjs +2 -0
  30. package/dist/cjs/data-list/DataListRow.cjs.map +1 -1
  31. package/dist/cjs/disclaimer/Disclaimer.cjs +10 -3
  32. package/dist/cjs/disclaimer/Disclaimer.cjs.map +1 -1
  33. package/dist/cjs/divider/Divider.cjs +5 -0
  34. package/dist/cjs/divider/Divider.cjs.map +1 -1
  35. package/dist/cjs/error-page/ErrorPage.cjs +14 -7
  36. package/dist/cjs/error-page/ErrorPage.cjs.map +1 -1
  37. package/dist/cjs/footer/Footer.cjs +10 -2
  38. package/dist/cjs/footer/Footer.cjs.map +1 -1
  39. package/dist/cjs/grid/Grid.cjs +7 -3
  40. package/dist/cjs/grid/Grid.cjs.map +1 -1
  41. package/dist/cjs/grid/Grid.module.css.cjs +1 -1
  42. package/dist/cjs/grid/GridItem.cjs +2 -0
  43. package/dist/cjs/grid/GridItem.cjs.map +1 -1
  44. package/dist/cjs/header/Header.cjs +10 -2
  45. package/dist/cjs/header/Header.cjs.map +1 -1
  46. package/dist/cjs/header/HeaderNav.cjs +33 -21
  47. package/dist/cjs/header/HeaderNav.cjs.map +1 -1
  48. package/dist/cjs/header/HeaderNav.module.css.cjs +1 -1
  49. package/dist/cjs/hidden/Hidden.cjs +10 -4
  50. package/dist/cjs/hidden/Hidden.cjs.map +1 -1
  51. package/dist/cjs/hooks/Portal.cjs +14 -11
  52. package/dist/cjs/hooks/Portal.cjs.map +1 -1
  53. package/dist/cjs/hooks/useBodyScrollLock.cjs +49 -13
  54. package/dist/cjs/hooks/useBodyScrollLock.cjs.map +1 -1
  55. package/dist/cjs/hooks/useEdgeFade.cjs +60 -0
  56. package/dist/cjs/hooks/useEdgeFade.cjs.map +1 -0
  57. package/dist/cjs/hooks/useEscape.cjs +8 -5
  58. package/dist/cjs/hooks/useEscape.cjs.map +1 -1
  59. package/dist/cjs/hooks/useFocusTrap.cjs +61 -24
  60. package/dist/cjs/hooks/useFocusTrap.cjs.map +1 -1
  61. package/dist/cjs/hooks/useHideOthers.cjs +51 -0
  62. package/dist/cjs/hooks/useHideOthers.cjs.map +1 -0
  63. package/dist/cjs/hooks/useOutsideClick.cjs +31 -4
  64. package/dist/cjs/hooks/useOutsideClick.cjs.map +1 -1
  65. package/dist/cjs/icon-button/IconButton.cjs +4 -0
  66. package/dist/cjs/icon-button/IconButton.cjs.map +1 -1
  67. package/dist/cjs/icons/TokenIcon.cjs +2 -0
  68. package/dist/cjs/icons/TokenIcon.cjs.map +1 -1
  69. package/dist/cjs/identicon/Identicon.cjs +2 -0
  70. package/dist/cjs/identicon/Identicon.cjs.map +1 -1
  71. package/dist/cjs/index.cjs +32 -4
  72. package/dist/cjs/index.cjs.map +1 -1
  73. package/dist/cjs/index.css +12 -4
  74. package/dist/cjs/input/Input.cjs +1 -0
  75. package/dist/cjs/input/Input.cjs.map +1 -1
  76. package/dist/cjs/link-provider/Anchor.cjs +23 -2
  77. package/dist/cjs/link-provider/Anchor.cjs.map +1 -1
  78. package/dist/cjs/link-provider/LinkProvider.cjs +1 -1
  79. package/dist/cjs/link-provider/LinkProvider.cjs.map +1 -1
  80. package/dist/cjs/logo/Logo.cjs +8 -0
  81. package/dist/cjs/logo/Logo.cjs.map +1 -1
  82. package/dist/cjs/message-box/MessageBox.cjs +1 -0
  83. package/dist/cjs/message-box/MessageBox.cjs.map +1 -1
  84. package/dist/cjs/modal/Modal.cjs +71 -9
  85. package/dist/cjs/modal/Modal.cjs.map +1 -1
  86. package/dist/cjs/nav-link/NavLink.cjs +6 -4
  87. package/dist/cjs/nav-link/NavLink.cjs.map +1 -1
  88. package/dist/cjs/notification/Notification.cjs +12 -6
  89. package/dist/cjs/notification/Notification.cjs.map +1 -1
  90. package/dist/cjs/page-layout/Layout.cjs +25 -0
  91. package/dist/cjs/page-layout/Layout.cjs.map +1 -0
  92. package/dist/cjs/page-layout/Layout.module.css.cjs +6 -0
  93. package/dist/cjs/page-layout/Layout.module.css.cjs.map +1 -0
  94. package/dist/cjs/page-layout/Main.cjs +29 -0
  95. package/dist/cjs/page-layout/Main.cjs.map +1 -0
  96. package/dist/cjs/page-layout/Main.module.css.cjs +6 -0
  97. package/dist/cjs/page-layout/Main.module.css.cjs.map +1 -0
  98. package/dist/cjs/page-layout/PageContent.cjs +22 -0
  99. package/dist/cjs/page-layout/PageContent.cjs.map +1 -0
  100. package/dist/cjs/page-layout/PageContent.module.css.cjs +6 -0
  101. package/dist/cjs/page-layout/PageContent.module.css.cjs.map +1 -0
  102. package/dist/cjs/pagination/Pagination.cjs +11 -6
  103. package/dist/cjs/pagination/Pagination.cjs.map +1 -1
  104. package/dist/cjs/popover/Popover.cjs +71 -15
  105. package/dist/cjs/popover/Popover.cjs.map +1 -1
  106. package/dist/cjs/radio-button/RadioButton.cjs +1 -0
  107. package/dist/cjs/radio-button/RadioButton.cjs.map +1 -1
  108. package/dist/cjs/rich-input/RichInput.cjs +18 -39
  109. package/dist/cjs/rich-input/RichInput.cjs.map +1 -1
  110. package/dist/cjs/rich-input/RichInput.module.css.cjs +1 -1
  111. package/dist/cjs/section-title/SectionTitle.cjs +1 -0
  112. package/dist/cjs/section-title/SectionTitle.cjs.map +1 -1
  113. package/dist/cjs/segmented-control/SegmentedControl.cjs +1 -0
  114. package/dist/cjs/segmented-control/SegmentedControl.cjs.map +1 -1
  115. package/dist/cjs/segmented-control/SegmentedControlCard.cjs +1 -0
  116. package/dist/cjs/segmented-control/SegmentedControlCard.cjs.map +1 -1
  117. package/dist/cjs/sidebar/Sidebar.cjs +11 -4
  118. package/dist/cjs/sidebar/Sidebar.cjs.map +1 -1
  119. package/dist/cjs/sidebar/SidebarToggle.cjs +1 -1
  120. package/dist/cjs/sidebar/SidebarToggle.cjs.map +1 -1
  121. package/dist/cjs/skeleton/Skeleton.cjs +18 -20
  122. package/dist/cjs/skeleton/Skeleton.cjs.map +1 -1
  123. package/dist/cjs/skip-link/SkipLink.cjs +52 -0
  124. package/dist/cjs/skip-link/SkipLink.cjs.map +1 -0
  125. package/dist/cjs/skip-link/SkipLink.module.css.cjs +6 -0
  126. package/dist/cjs/skip-link/SkipLink.module.css.cjs.map +1 -0
  127. package/dist/cjs/slider/Slider.cjs +1 -0
  128. package/dist/cjs/slider/Slider.cjs.map +1 -1
  129. package/dist/cjs/small-card/SmallCard.cjs +6 -2
  130. package/dist/cjs/small-card/SmallCard.cjs.map +1 -1
  131. package/dist/cjs/stack/Stack.cjs +27 -7
  132. package/dist/cjs/stack/Stack.cjs.map +1 -1
  133. package/dist/cjs/stack/Stack.module.css.cjs +1 -1
  134. package/dist/cjs/stat-item/StatItem.cjs +1 -0
  135. package/dist/cjs/stat-item/StatItem.cjs.map +1 -1
  136. package/dist/cjs/switch/Switch.cjs +1 -0
  137. package/dist/cjs/switch/Switch.cjs.map +1 -1
  138. package/dist/cjs/tabs/Tabs.cjs +1 -0
  139. package/dist/cjs/tabs/Tabs.cjs.map +1 -1
  140. package/dist/cjs/tag/Tag.cjs +73 -8
  141. package/dist/cjs/tag/Tag.cjs.map +1 -1
  142. package/dist/cjs/tag/Tag.module.css.cjs +1 -1
  143. package/dist/cjs/text-link/TextLink.cjs +10 -13
  144. package/dist/cjs/text-link/TextLink.cjs.map +1 -1
  145. package/dist/cjs/text-link/TextLink.module.css.cjs +1 -1
  146. package/dist/cjs/theme-switcher/ThemeSwitcher.cjs +13 -5
  147. package/dist/cjs/theme-switcher/ThemeSwitcher.cjs.map +1 -1
  148. package/dist/cjs/theme-switcher/ThemeSwitcher.module.css.cjs +6 -0
  149. package/dist/cjs/theme-switcher/ThemeSwitcher.module.css.cjs.map +1 -0
  150. package/dist/cjs/token-amount/TokenAmount.cjs +1 -0
  151. package/dist/cjs/token-amount/TokenAmount.cjs.map +1 -1
  152. package/dist/cjs/token-selector/TokenSelector.cjs +56 -64
  153. package/dist/cjs/token-selector/TokenSelector.cjs.map +1 -1
  154. package/dist/cjs/tooltip/Tooltip.cjs +42 -27
  155. package/dist/cjs/tooltip/Tooltip.cjs.map +1 -1
  156. package/dist/cjs/tx-status/TxStatus.cjs +2 -0
  157. package/dist/cjs/tx-status/TxStatus.cjs.map +1 -1
  158. package/dist/cjs/typography/Typography.cjs +2 -0
  159. package/dist/cjs/typography/Typography.cjs.map +1 -1
  160. package/dist/cjs/utils/ActionElement.cjs +2 -13
  161. package/dist/cjs/utils/ActionElement.cjs.map +1 -1
  162. package/dist/cjs/utils/breakpoints.cjs +26 -0
  163. package/dist/cjs/utils/breakpoints.cjs.map +1 -0
  164. package/dist/cjs/utils/responsive.cjs +19 -30
  165. package/dist/cjs/utils/responsive.cjs.map +1 -1
  166. package/dist/esm/accordion/Accordion.mjs +1 -0
  167. package/dist/esm/accordion/Accordion.mjs.map +1 -1
  168. package/dist/esm/badge/Badge.mjs +1 -0
  169. package/dist/esm/badge/Badge.mjs.map +1 -1
  170. package/dist/esm/banner/Banner.mjs +1 -0
  171. package/dist/esm/banner/Banner.mjs.map +1 -1
  172. package/dist/esm/breadcrumbs/Breadcrumbs.mjs +56 -27
  173. package/dist/esm/breadcrumbs/Breadcrumbs.mjs.map +1 -1
  174. package/dist/esm/breadcrumbs/Breadcrumbs.module.css.mjs +1 -1
  175. package/dist/esm/button/Button.mjs +15 -24
  176. package/dist/esm/button/Button.mjs.map +1 -1
  177. package/dist/esm/button/ButtonContent.mjs +45 -0
  178. package/dist/esm/button/ButtonContent.mjs.map +1 -0
  179. package/dist/esm/button/LinkButton.mjs +42 -0
  180. package/dist/esm/button/LinkButton.mjs.map +1 -0
  181. package/dist/esm/card/Card.mjs +1 -0
  182. package/dist/esm/card/Card.mjs.map +1 -1
  183. package/dist/esm/checkbox/Checkbox.mjs +1 -0
  184. package/dist/esm/checkbox/Checkbox.mjs.map +1 -1
  185. package/dist/esm/counter/Counter.mjs +6 -2
  186. package/dist/esm/counter/Counter.mjs.map +1 -1
  187. package/dist/esm/counter/CounterSlot.mjs +19 -3
  188. package/dist/esm/counter/CounterSlot.mjs.map +1 -1
  189. package/dist/esm/counter/CounterSlot.module.css.mjs +1 -1
  190. package/dist/esm/data-list/DataList.mjs +1 -0
  191. package/dist/esm/data-list/DataList.mjs.map +1 -1
  192. package/dist/esm/data-list/DataListRow.mjs +2 -0
  193. package/dist/esm/data-list/DataListRow.mjs.map +1 -1
  194. package/dist/esm/disclaimer/Disclaimer.mjs +10 -3
  195. package/dist/esm/disclaimer/Disclaimer.mjs.map +1 -1
  196. package/dist/esm/divider/Divider.mjs +5 -0
  197. package/dist/esm/divider/Divider.mjs.map +1 -1
  198. package/dist/esm/error-page/ErrorPage.mjs +14 -7
  199. package/dist/esm/error-page/ErrorPage.mjs.map +1 -1
  200. package/dist/esm/footer/Footer.mjs +10 -2
  201. package/dist/esm/footer/Footer.mjs.map +1 -1
  202. package/dist/esm/grid/Grid.mjs +8 -4
  203. package/dist/esm/grid/Grid.mjs.map +1 -1
  204. package/dist/esm/grid/Grid.module.css.mjs +1 -1
  205. package/dist/esm/grid/GridItem.mjs +2 -0
  206. package/dist/esm/grid/GridItem.mjs.map +1 -1
  207. package/dist/esm/header/Header.mjs +10 -2
  208. package/dist/esm/header/Header.mjs.map +1 -1
  209. package/dist/esm/header/HeaderNav.mjs +34 -22
  210. package/dist/esm/header/HeaderNav.mjs.map +1 -1
  211. package/dist/esm/header/HeaderNav.module.css.mjs +1 -1
  212. package/dist/esm/hidden/Hidden.mjs +10 -4
  213. package/dist/esm/hidden/Hidden.mjs.map +1 -1
  214. package/dist/esm/hooks/Portal.mjs +16 -13
  215. package/dist/esm/hooks/Portal.mjs.map +1 -1
  216. package/dist/esm/hooks/useBodyScrollLock.mjs +49 -13
  217. package/dist/esm/hooks/useBodyScrollLock.mjs.map +1 -1
  218. package/dist/esm/hooks/useEdgeFade.mjs +56 -0
  219. package/dist/esm/hooks/useEdgeFade.mjs.map +1 -0
  220. package/dist/esm/hooks/useEscape.mjs +8 -5
  221. package/dist/esm/hooks/useEscape.mjs.map +1 -1
  222. package/dist/esm/hooks/useFocusTrap.mjs +61 -24
  223. package/dist/esm/hooks/useFocusTrap.mjs.map +1 -1
  224. package/dist/esm/hooks/useHideOthers.mjs +47 -0
  225. package/dist/esm/hooks/useHideOthers.mjs.map +1 -0
  226. package/dist/esm/hooks/useOutsideClick.mjs +31 -4
  227. package/dist/esm/hooks/useOutsideClick.mjs.map +1 -1
  228. package/dist/esm/icon-button/IconButton.mjs +4 -0
  229. package/dist/esm/icon-button/IconButton.mjs.map +1 -1
  230. package/dist/esm/icons/TokenIcon.mjs +2 -0
  231. package/dist/esm/icons/TokenIcon.mjs.map +1 -1
  232. package/dist/esm/identicon/Identicon.mjs +2 -0
  233. package/dist/esm/identicon/Identicon.mjs.map +1 -1
  234. package/dist/esm/index.css +12 -4
  235. package/dist/esm/index.mjs +13 -1
  236. package/dist/esm/index.mjs.map +1 -1
  237. package/dist/esm/input/Input.mjs +1 -0
  238. package/dist/esm/input/Input.mjs.map +1 -1
  239. package/dist/esm/link-provider/Anchor.mjs +23 -2
  240. package/dist/esm/link-provider/Anchor.mjs.map +1 -1
  241. package/dist/esm/link-provider/LinkProvider.mjs +1 -1
  242. package/dist/esm/link-provider/LinkProvider.mjs.map +1 -1
  243. package/dist/esm/logo/Logo.mjs +9 -1
  244. package/dist/esm/logo/Logo.mjs.map +1 -1
  245. package/dist/esm/message-box/MessageBox.mjs +1 -0
  246. package/dist/esm/message-box/MessageBox.mjs.map +1 -1
  247. package/dist/esm/modal/Modal.mjs +72 -11
  248. package/dist/esm/modal/Modal.mjs.map +1 -1
  249. package/dist/esm/nav-link/NavLink.mjs +6 -4
  250. package/dist/esm/nav-link/NavLink.mjs.map +1 -1
  251. package/dist/esm/notification/Notification.mjs +13 -7
  252. package/dist/esm/notification/Notification.mjs.map +1 -1
  253. package/dist/esm/page-layout/Layout.mjs +21 -0
  254. package/dist/esm/page-layout/Layout.mjs.map +1 -0
  255. package/dist/esm/page-layout/Layout.module.css.mjs +4 -0
  256. package/dist/esm/page-layout/Layout.module.css.mjs.map +1 -0
  257. package/dist/esm/page-layout/Main.mjs +24 -0
  258. package/dist/esm/page-layout/Main.mjs.map +1 -0
  259. package/dist/esm/page-layout/Main.module.css.mjs +4 -0
  260. package/dist/esm/page-layout/Main.module.css.mjs.map +1 -0
  261. package/dist/esm/page-layout/PageContent.mjs +18 -0
  262. package/dist/esm/page-layout/PageContent.mjs.map +1 -0
  263. package/dist/esm/page-layout/PageContent.module.css.mjs +4 -0
  264. package/dist/esm/page-layout/PageContent.module.css.mjs.map +1 -0
  265. package/dist/esm/pagination/Pagination.mjs +12 -7
  266. package/dist/esm/pagination/Pagination.mjs.map +1 -1
  267. package/dist/esm/popover/Popover.mjs +72 -16
  268. package/dist/esm/popover/Popover.mjs.map +1 -1
  269. package/dist/esm/radio-button/RadioButton.mjs +1 -0
  270. package/dist/esm/radio-button/RadioButton.mjs.map +1 -1
  271. package/dist/esm/rich-input/RichInput.mjs +19 -40
  272. package/dist/esm/rich-input/RichInput.mjs.map +1 -1
  273. package/dist/esm/rich-input/RichInput.module.css.mjs +1 -1
  274. package/dist/esm/section-title/SectionTitle.mjs +1 -0
  275. package/dist/esm/section-title/SectionTitle.mjs.map +1 -1
  276. package/dist/esm/segmented-control/SegmentedControl.mjs +1 -0
  277. package/dist/esm/segmented-control/SegmentedControl.mjs.map +1 -1
  278. package/dist/esm/segmented-control/SegmentedControlCard.mjs +1 -0
  279. package/dist/esm/segmented-control/SegmentedControlCard.mjs.map +1 -1
  280. package/dist/esm/sidebar/Sidebar.mjs +11 -4
  281. package/dist/esm/sidebar/Sidebar.mjs.map +1 -1
  282. package/dist/esm/sidebar/SidebarToggle.mjs +1 -1
  283. package/dist/esm/sidebar/SidebarToggle.mjs.map +1 -1
  284. package/dist/esm/skeleton/Skeleton.mjs +18 -20
  285. package/dist/esm/skeleton/Skeleton.mjs.map +1 -1
  286. package/dist/esm/skip-link/SkipLink.mjs +48 -0
  287. package/dist/esm/skip-link/SkipLink.mjs.map +1 -0
  288. package/dist/esm/skip-link/SkipLink.module.css.mjs +4 -0
  289. package/dist/esm/skip-link/SkipLink.module.css.mjs.map +1 -0
  290. package/dist/esm/slider/Slider.mjs +1 -0
  291. package/dist/esm/slider/Slider.mjs.map +1 -1
  292. package/dist/esm/small-card/SmallCard.mjs +6 -2
  293. package/dist/esm/small-card/SmallCard.mjs.map +1 -1
  294. package/dist/esm/stack/Stack.mjs +28 -9
  295. package/dist/esm/stack/Stack.mjs.map +1 -1
  296. package/dist/esm/stack/Stack.module.css.mjs +1 -1
  297. package/dist/esm/stat-item/StatItem.mjs +1 -0
  298. package/dist/esm/stat-item/StatItem.mjs.map +1 -1
  299. package/dist/esm/switch/Switch.mjs +1 -0
  300. package/dist/esm/switch/Switch.mjs.map +1 -1
  301. package/dist/esm/tabs/Tabs.mjs +1 -0
  302. package/dist/esm/tabs/Tabs.mjs.map +1 -1
  303. package/dist/esm/tag/Tag.mjs +74 -9
  304. package/dist/esm/tag/Tag.mjs.map +1 -1
  305. package/dist/esm/tag/Tag.module.css.mjs +1 -1
  306. package/dist/esm/text-link/TextLink.mjs +10 -13
  307. package/dist/esm/text-link/TextLink.mjs.map +1 -1
  308. package/dist/esm/text-link/TextLink.module.css.mjs +1 -1
  309. package/dist/esm/theme-switcher/ThemeSwitcher.mjs +14 -6
  310. package/dist/esm/theme-switcher/ThemeSwitcher.mjs.map +1 -1
  311. package/dist/esm/theme-switcher/ThemeSwitcher.module.css.mjs +4 -0
  312. package/dist/esm/theme-switcher/ThemeSwitcher.module.css.mjs.map +1 -0
  313. package/dist/esm/token-amount/TokenAmount.mjs +1 -0
  314. package/dist/esm/token-amount/TokenAmount.mjs.map +1 -1
  315. package/dist/esm/token-selector/TokenSelector.mjs +58 -66
  316. package/dist/esm/token-selector/TokenSelector.mjs.map +1 -1
  317. package/dist/esm/tooltip/Tooltip.mjs +42 -27
  318. package/dist/esm/tooltip/Tooltip.mjs.map +1 -1
  319. package/dist/esm/tx-status/TxStatus.mjs +2 -0
  320. package/dist/esm/tx-status/TxStatus.mjs.map +1 -1
  321. package/dist/esm/typography/Typography.mjs +2 -0
  322. package/dist/esm/typography/Typography.mjs.map +1 -1
  323. package/dist/esm/utils/ActionElement.mjs +2 -13
  324. package/dist/esm/utils/ActionElement.mjs.map +1 -1
  325. package/dist/esm/utils/breakpoints.mjs +19 -0
  326. package/dist/esm/utils/breakpoints.mjs.map +1 -0
  327. package/dist/esm/utils/responsive.mjs +17 -27
  328. package/dist/esm/utils/responsive.mjs.map +1 -1
  329. package/dist/index.css +12 -4
  330. package/dist/styles/breakpoints.css +16 -12
  331. package/dist/styles/typography-mixins.css +8 -0
  332. package/dist/types/accordion/Accordion.d.ts +3 -0
  333. package/dist/types/accordion/Accordion.d.ts.map +1 -1
  334. package/dist/types/badge/Badge.d.ts +1 -0
  335. package/dist/types/badge/Badge.d.ts.map +1 -1
  336. package/dist/types/banner/Banner.d.ts +1 -0
  337. package/dist/types/banner/Banner.d.ts.map +1 -1
  338. package/dist/types/breadcrumbs/Breadcrumbs.d.ts +17 -1
  339. package/dist/types/breadcrumbs/Breadcrumbs.d.ts.map +1 -1
  340. package/dist/types/breadcrumbs/index.d.ts +1 -1
  341. package/dist/types/breadcrumbs/index.d.ts.map +1 -1
  342. package/dist/types/button/Button.d.ts +6 -26
  343. package/dist/types/button/Button.d.ts.map +1 -1
  344. package/dist/types/button/ButtonContent.d.ts +10 -0
  345. package/dist/types/button/ButtonContent.d.ts.map +1 -0
  346. package/dist/types/button/LinkButton.d.ts +10 -0
  347. package/dist/types/button/LinkButton.d.ts.map +1 -0
  348. package/dist/types/button/index.d.ts +2 -0
  349. package/dist/types/button/index.d.ts.map +1 -1
  350. package/dist/types/button/types.d.ts +26 -0
  351. package/dist/types/button/types.d.ts.map +1 -0
  352. package/dist/types/card/Card.d.ts +1 -0
  353. package/dist/types/card/Card.d.ts.map +1 -1
  354. package/dist/types/checkbox/Checkbox.d.ts +3 -0
  355. package/dist/types/checkbox/Checkbox.d.ts.map +1 -1
  356. package/dist/types/colors/colorTokens.d.ts.map +1 -1
  357. package/dist/types/counter/Counter.d.ts +6 -2
  358. package/dist/types/counter/Counter.d.ts.map +1 -1
  359. package/dist/types/counter/CounterSlot.d.ts +3 -0
  360. package/dist/types/counter/CounterSlot.d.ts.map +1 -1
  361. package/dist/types/data-list/DataList.d.ts +1 -0
  362. package/dist/types/data-list/DataList.d.ts.map +1 -1
  363. package/dist/types/data-list/DataListRow.d.ts +1 -0
  364. package/dist/types/data-list/DataListRow.d.ts.map +1 -1
  365. package/dist/types/disclaimer/Disclaimer.d.ts +9 -2
  366. package/dist/types/disclaimer/Disclaimer.d.ts.map +1 -1
  367. package/dist/types/divider/Divider.d.ts +5 -0
  368. package/dist/types/divider/Divider.d.ts.map +1 -1
  369. package/dist/types/divider/index.d.ts +1 -1
  370. package/dist/types/divider/index.d.ts.map +1 -1
  371. package/dist/types/error-page/ErrorPage.d.ts +17 -4
  372. package/dist/types/error-page/ErrorPage.d.ts.map +1 -1
  373. package/dist/types/footer/Footer.d.ts +17 -2
  374. package/dist/types/footer/Footer.d.ts.map +1 -1
  375. package/dist/types/footer/index.d.ts +1 -1
  376. package/dist/types/footer/index.d.ts.map +1 -1
  377. package/dist/types/grid/Grid.d.ts +21 -22
  378. package/dist/types/grid/Grid.d.ts.map +1 -1
  379. package/dist/types/grid/GridItem.d.ts +14 -10
  380. package/dist/types/grid/GridItem.d.ts.map +1 -1
  381. package/dist/types/grid/index.d.ts +2 -2
  382. package/dist/types/grid/index.d.ts.map +1 -1
  383. package/dist/types/header/Header.d.ts +15 -2
  384. package/dist/types/header/Header.d.ts.map +1 -1
  385. package/dist/types/header/HeaderNav.d.ts +10 -2
  386. package/dist/types/header/HeaderNav.d.ts.map +1 -1
  387. package/dist/types/header/index.d.ts +2 -2
  388. package/dist/types/header/index.d.ts.map +1 -1
  389. package/dist/types/hidden/Hidden.d.ts +20 -6
  390. package/dist/types/hidden/Hidden.d.ts.map +1 -1
  391. package/dist/types/hidden/index.d.ts +1 -1
  392. package/dist/types/hidden/index.d.ts.map +1 -1
  393. package/dist/types/hooks/Portal.d.ts +2 -5
  394. package/dist/types/hooks/Portal.d.ts.map +1 -1
  395. package/dist/types/hooks/index.d.ts +2 -0
  396. package/dist/types/hooks/index.d.ts.map +1 -1
  397. package/dist/types/hooks/useBodyScrollLock.d.ts +4 -2
  398. package/dist/types/hooks/useBodyScrollLock.d.ts.map +1 -1
  399. package/dist/types/hooks/useEdgeFade.d.ts +7 -0
  400. package/dist/types/hooks/useEdgeFade.d.ts.map +1 -0
  401. package/dist/types/hooks/useEscape.d.ts +4 -2
  402. package/dist/types/hooks/useEscape.d.ts.map +1 -1
  403. package/dist/types/hooks/useFocusTrap.d.ts +7 -3
  404. package/dist/types/hooks/useFocusTrap.d.ts.map +1 -1
  405. package/dist/types/hooks/useHideOthers.d.ts +3 -0
  406. package/dist/types/hooks/useHideOthers.d.ts.map +1 -0
  407. package/dist/types/hooks/useOutsideClick.d.ts +4 -2
  408. package/dist/types/hooks/useOutsideClick.d.ts.map +1 -1
  409. package/dist/types/icon-button/IconButton.d.ts +15 -2
  410. package/dist/types/icon-button/IconButton.d.ts.map +1 -1
  411. package/dist/types/icons/TokenIcon.d.ts +1 -0
  412. package/dist/types/icons/TokenIcon.d.ts.map +1 -1
  413. package/dist/types/identicon/Identicon.d.ts +5 -0
  414. package/dist/types/identicon/Identicon.d.ts.map +1 -1
  415. package/dist/types/index.d.ts +5 -0
  416. package/dist/types/index.d.ts.map +1 -1
  417. package/dist/types/input/Input.d.ts +1 -0
  418. package/dist/types/input/Input.d.ts.map +1 -1
  419. package/dist/types/link-provider/Anchor.d.ts +17 -1
  420. package/dist/types/link-provider/Anchor.d.ts.map +1 -1
  421. package/dist/types/link-provider/LinkProvider.d.ts +8 -2
  422. package/dist/types/link-provider/LinkProvider.d.ts.map +1 -1
  423. package/dist/types/link-provider/index.d.ts +1 -1
  424. package/dist/types/link-provider/index.d.ts.map +1 -1
  425. package/dist/types/logo/Logo.d.ts +20 -3
  426. package/dist/types/logo/Logo.d.ts.map +1 -1
  427. package/dist/types/logo/index.d.ts +1 -1
  428. package/dist/types/logo/index.d.ts.map +1 -1
  429. package/dist/types/message-box/MessageBox.d.ts +3 -0
  430. package/dist/types/message-box/MessageBox.d.ts.map +1 -1
  431. package/dist/types/modal/Modal.d.ts +21 -3
  432. package/dist/types/modal/Modal.d.ts.map +1 -1
  433. package/dist/types/modal/index.d.ts +2 -2
  434. package/dist/types/modal/index.d.ts.map +1 -1
  435. package/dist/types/nav-link/NavLink.d.ts +17 -0
  436. package/dist/types/nav-link/NavLink.d.ts.map +1 -1
  437. package/dist/types/nav-link/index.d.ts +1 -1
  438. package/dist/types/nav-link/index.d.ts.map +1 -1
  439. package/dist/types/notification/Notification.d.ts +7 -2
  440. package/dist/types/notification/Notification.d.ts.map +1 -1
  441. package/dist/types/page-layout/Layout.d.ts +5 -0
  442. package/dist/types/page-layout/Layout.d.ts.map +1 -0
  443. package/dist/types/page-layout/Main.d.ts +6 -0
  444. package/dist/types/page-layout/Main.d.ts.map +1 -0
  445. package/dist/types/page-layout/PageContent.d.ts +7 -0
  446. package/dist/types/page-layout/PageContent.d.ts.map +1 -0
  447. package/dist/types/page-layout/index.d.ts +7 -0
  448. package/dist/types/page-layout/index.d.ts.map +1 -0
  449. package/dist/types/pagination/Pagination.d.ts +3 -0
  450. package/dist/types/pagination/Pagination.d.ts.map +1 -1
  451. package/dist/types/popover/Popover.d.ts +32 -4
  452. package/dist/types/popover/Popover.d.ts.map +1 -1
  453. package/dist/types/popover/index.d.ts +1 -1
  454. package/dist/types/popover/index.d.ts.map +1 -1
  455. package/dist/types/radio-button/RadioButton.d.ts +3 -0
  456. package/dist/types/radio-button/RadioButton.d.ts.map +1 -1
  457. package/dist/types/rich-input/RichInput.d.ts +8 -1
  458. package/dist/types/rich-input/RichInput.d.ts.map +1 -1
  459. package/dist/types/section-title/SectionTitle.d.ts +1 -0
  460. package/dist/types/section-title/SectionTitle.d.ts.map +1 -1
  461. package/dist/types/segmented-control/SegmentedControl.d.ts +1 -0
  462. package/dist/types/segmented-control/SegmentedControl.d.ts.map +1 -1
  463. package/dist/types/segmented-control/SegmentedControlCard.d.ts +1 -0
  464. package/dist/types/segmented-control/SegmentedControlCard.d.ts.map +1 -1
  465. package/dist/types/sidebar/Sidebar.d.ts +2 -2
  466. package/dist/types/sidebar/Sidebar.d.ts.map +1 -1
  467. package/dist/types/sidebar/SidebarToggle.d.ts +1 -1
  468. package/dist/types/skeleton/Skeleton.d.ts +17 -3
  469. package/dist/types/skeleton/Skeleton.d.ts.map +1 -1
  470. package/dist/types/skip-link/SkipLink.d.ts +11 -0
  471. package/dist/types/skip-link/SkipLink.d.ts.map +1 -0
  472. package/dist/types/skip-link/index.d.ts +3 -0
  473. package/dist/types/skip-link/index.d.ts.map +1 -0
  474. package/dist/types/slider/Slider.d.ts +1 -0
  475. package/dist/types/slider/Slider.d.ts.map +1 -1
  476. package/dist/types/small-card/SmallCard.d.ts +21 -2
  477. package/dist/types/small-card/SmallCard.d.ts.map +1 -1
  478. package/dist/types/stack/Stack.d.ts +24 -15
  479. package/dist/types/stack/Stack.d.ts.map +1 -1
  480. package/dist/types/stack/index.d.ts +1 -1
  481. package/dist/types/stack/index.d.ts.map +1 -1
  482. package/dist/types/stat-item/StatItem.d.ts +6 -0
  483. package/dist/types/stat-item/StatItem.d.ts.map +1 -1
  484. package/dist/types/switch/Switch.d.ts +3 -0
  485. package/dist/types/switch/Switch.d.ts.map +1 -1
  486. package/dist/types/tabs/Tabs.d.ts +1 -0
  487. package/dist/types/tabs/Tabs.d.ts.map +1 -1
  488. package/dist/types/tag/Tag.d.ts +31 -3
  489. package/dist/types/tag/Tag.d.ts.map +1 -1
  490. package/dist/types/text-link/TextLink.d.ts +25 -2
  491. package/dist/types/text-link/TextLink.d.ts.map +1 -1
  492. package/dist/types/text-link/index.d.ts +1 -1
  493. package/dist/types/text-link/index.d.ts.map +1 -1
  494. package/dist/types/theme-switcher/ThemeSwitcher.d.ts +9 -3
  495. package/dist/types/theme-switcher/ThemeSwitcher.d.ts.map +1 -1
  496. package/dist/types/token-amount/TokenAmount.d.ts +1 -0
  497. package/dist/types/token-amount/TokenAmount.d.ts.map +1 -1
  498. package/dist/types/token-selector/TokenSelector.d.ts +5 -1
  499. package/dist/types/token-selector/TokenSelector.d.ts.map +1 -1
  500. package/dist/types/tooltip/Tooltip.d.ts +2 -0
  501. package/dist/types/tooltip/Tooltip.d.ts.map +1 -1
  502. package/dist/types/tx-status/TxStatus.d.ts +3 -0
  503. package/dist/types/tx-status/TxStatus.d.ts.map +1 -1
  504. package/dist/types/typography/Typography.d.ts +4 -0
  505. package/dist/types/typography/Typography.d.ts.map +1 -1
  506. package/dist/types/utils/ActionElement.d.ts +4 -4
  507. package/dist/types/utils/ActionElement.d.ts.map +1 -1
  508. package/dist/types/utils/breakpoints.d.ts +16 -0
  509. package/dist/types/utils/breakpoints.d.ts.map +1 -0
  510. package/dist/types/utils/index.d.ts +5 -2
  511. package/dist/types/utils/index.d.ts.map +1 -1
  512. package/dist/types/utils/polymorphic.d.ts +15 -0
  513. package/dist/types/utils/polymorphic.d.ts.map +1 -0
  514. package/dist/types/utils/responsive.d.ts +29 -14
  515. package/dist/types/utils/responsive.d.ts.map +1 -1
  516. package/package.json +6 -2
@@ -1 +1 @@
1
- {"version":3,"file":"useBodyScrollLock.cjs","sources":["../../../src/hooks/useBodyScrollLock.ts"],"sourcesContent":["import { useEffect } from 'react'\n\n// Ref-counted so stacked overlays only restore on the last unlock.\nlet lockCount = 0\nlet saved = { overflow: '', paddingRight: '' }\n\nconst lock = () => {\n if (lockCount === 0) {\n const { body, documentElement } = document\n saved = {\n overflow: body.style.overflow,\n paddingRight: body.style.paddingRight,\n }\n const scrollbarWidth = window.innerWidth - documentElement.clientWidth\n if (scrollbarWidth > 0) {\n const current = parseFloat(getComputedStyle(body).paddingRight) || 0\n body.style.paddingRight = `${current + scrollbarWidth}px`\n }\n body.style.overflow = 'hidden'\n }\n lockCount += 1\n}\n\nconst unlock = () => {\n lockCount -= 1\n if (lockCount === 0) {\n document.body.style.overflow = saved.overflow\n document.body.style.paddingRight = saved.paddingRight\n }\n}\n\n/** Locks body scroll while `active`, compensating the scrollbar width. */\nexport const useBodyScrollLock = (active: boolean) => {\n useEffect(() => {\n if (!active) return\n lock()\n return unlock\n }, [active])\n}\n"],"names":["lockCount","saved","overflow","paddingRight","lock","body","documentElement","document","style","scrollbarWidth","window","innerWidth","clientWidth","current","parseFloat","getComputedStyle","unlock","useBodyScrollLock","active","useEffect"],"mappings":";;;;;;AAEA;AACA,IAAIA,SAAS,GAAG,CAAC,CAAA;AACjB,IAAIC,KAAK,GAAG;AAAEC,EAAAA,QAAQ,EAAE,EAAE;AAAEC,EAAAA,YAAY,EAAE,EAAA;AAAG,CAAC,CAAA;AAE9C,MAAMC,IAAI,GAAGA,MAAM;EACjB,IAAIJ,SAAS,KAAK,CAAC,EAAE;IACnB,MAAM;MAAEK,IAAI;AAAEC,MAAAA,eAAAA;AAAgB,KAAC,GAAGC,QAAQ,CAAA;AAC1CN,IAAAA,KAAK,GAAG;AACNC,MAAAA,QAAQ,EAAEG,IAAI,CAACG,KAAK,CAACN,QAAQ;AAC7BC,MAAAA,YAAY,EAAEE,IAAI,CAACG,KAAK,CAACL,YAAAA;KAC1B,CAAA;IACD,MAAMM,cAAc,GAAGC,MAAM,CAACC,UAAU,GAAGL,eAAe,CAACM,WAAW,CAAA;IACtE,IAAIH,cAAc,GAAG,CAAC,EAAE;AACtB,MAAA,MAAMI,OAAO,GAAGC,UAAU,CAACC,gBAAgB,CAACV,IAAI,CAAC,CAACF,YAAY,CAAC,IAAI,CAAC,CAAA;MACpEE,IAAI,CAACG,KAAK,CAACL,YAAY,GAAG,CAAGU,EAAAA,OAAO,GAAGJ,cAAc,CAAI,EAAA,CAAA,CAAA;AAC3D,KAAA;AACAJ,IAAAA,IAAI,CAACG,KAAK,CAACN,QAAQ,GAAG,QAAQ,CAAA;AAChC,GAAA;AACAF,EAAAA,SAAS,IAAI,CAAC,CAAA;AAChB,CAAC,CAAA;AAED,MAAMgB,MAAM,GAAGA,MAAM;AACnBhB,EAAAA,SAAS,IAAI,CAAC,CAAA;EACd,IAAIA,SAAS,KAAK,CAAC,EAAE;IACnBO,QAAQ,CAACF,IAAI,CAACG,KAAK,CAACN,QAAQ,GAAGD,KAAK,CAACC,QAAQ,CAAA;IAC7CK,QAAQ,CAACF,IAAI,CAACG,KAAK,CAACL,YAAY,GAAGF,KAAK,CAACE,YAAY,CAAA;AACvD,GAAA;AACF,CAAC,CAAA;;AAED;AACac,MAAAA,iBAAiB,GAAIC,MAAe,IAAK;AACpDC,EAAAA,eAAS,CAAC,MAAM;IACd,IAAI,CAACD,MAAM,EAAE,OAAA;AACbd,IAAAA,IAAI,EAAE,CAAA;AACN,IAAA,OAAOY,MAAM,CAAA;AACf,GAAC,EAAE,CAACE,MAAM,CAAC,CAAC,CAAA;AACd;;;;"}
1
+ {"version":3,"file":"useBodyScrollLock.cjs","sources":["../../../src/hooks/useBodyScrollLock.ts"],"sourcesContent":["import { useEffect } from 'react'\n\nconst SCROLLBAR_VAR = '--lido-app-ui-scrollbar-width'\n\n// Ref-counted so stacked overlays only restore on the last unlock.\nlet lockCount = 0\nconst AXES = ['overflow-x', 'overflow-y'] as const\n\ntype SavedAxis = { name: string; value: string; priority: string }\n\nlet saved = {\n scroller: null as HTMLElement | null,\n axes: [] as SavedAxis[],\n paddingRight: '',\n}\n\nconst lock = () => {\n if (lockCount === 0) {\n const { body, documentElement: html } = document\n // Locking <html> when body is the scroller would detach body's overflow propagation and break sticky headers.\n const scroller = ['auto', 'scroll'].includes(\n getComputedStyle(html).overflowY,\n )\n ? html\n : body\n saved = {\n scroller,\n axes: AXES.map((name) => ({\n name,\n value: scroller.style.getPropertyValue(name),\n priority: scroller.style.getPropertyPriority(name),\n })),\n paddingRight: body.style.paddingRight,\n }\n const before = body.getBoundingClientRect().width\n // body's rect updates synchronously after the lock, html.clientWidth doesn't.\n scroller.style.overflow = 'hidden'\n const gained = body.getBoundingClientRect().width - before\n if (gained > 0) {\n const current = parseFloat(getComputedStyle(body).paddingRight) || 0\n body.style.paddingRight = `${current + gained}px`\n html.style.setProperty(SCROLLBAR_VAR, `${gained}px`)\n }\n }\n lockCount += 1\n}\n\nconst unlock = () => {\n lockCount -= 1\n if (lockCount === 0) {\n const { body, documentElement: html } = document\n const { scroller, axes } = saved\n if (scroller) {\n scroller.style.removeProperty('overflow')\n axes.forEach(({ name, value, priority }) => {\n if (value) scroller.style.setProperty(name, value, priority)\n else scroller.style.removeProperty(name)\n })\n }\n body.style.paddingRight = saved.paddingRight\n html.style.removeProperty(SCROLLBAR_VAR)\n }\n}\n\n/** Locks page scroll while `enabled`, compensating the scrollbar width and exposing it as `--lido-app-ui-scrollbar-width`. */\nexport const useBodyScrollLock = ({\n enabled = true,\n}: { enabled?: boolean } = {}) => {\n useEffect(() => {\n if (!enabled) return\n lock()\n return unlock\n }, [enabled])\n}\n"],"names":["SCROLLBAR_VAR","lockCount","AXES","saved","scroller","axes","paddingRight","lock","body","documentElement","html","document","includes","getComputedStyle","overflowY","map","name","value","style","getPropertyValue","priority","getPropertyPriority","before","getBoundingClientRect","width","overflow","gained","current","parseFloat","setProperty","unlock","removeProperty","forEach","_ref","useBodyScrollLock","enabled","arguments","length","undefined","useEffect"],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
4
+
5
+ const react = require('react');
6
+ const useIsomorphicLayoutEffect = require('./useIsomorphicLayoutEffect.cjs');
7
+
8
+ const syncFade = el => {
9
+ el.toggleAttribute('data-fade-start', el.scrollLeft > 0);
10
+ el.toggleAttribute('data-fade-end', el.scrollLeft < el.scrollWidth - el.clientWidth - 1);
11
+ };
12
+
13
+ /** Keeps `data-fade-*` in sync, maps vertical wheel to horizontal scroll, reveals keyboard-focused items. */
14
+ const useEdgeFade = ref => {
15
+ const sync = react.useCallback(() => {
16
+ if (ref.current) syncFade(ref.current);
17
+ }, [ref]);
18
+ useIsomorphicLayoutEffect.useIsomorphicLayoutEffect(() => {
19
+ const el = ref.current;
20
+ if (!el) return;
21
+ syncFade(el);
22
+ if (typeof ResizeObserver === 'undefined') return;
23
+ const observer = new ResizeObserver(() => syncFade(el));
24
+ observer.observe(el);
25
+ return () => observer.disconnect();
26
+ }, [ref]);
27
+ react.useEffect(() => {
28
+ const el = ref.current;
29
+ if (!el) return;
30
+ const onWheel = e => {
31
+ if (e.ctrlKey || e.metaKey) return;
32
+ if (Math.abs(e.deltaY) <= Math.abs(e.deltaX)) return;
33
+ if (el.scrollWidth <= el.clientWidth) return;
34
+ const before = el.scrollLeft;
35
+ el.scrollLeft += e.deltaMode === 1 ? e.deltaY * 16 : e.deltaY;
36
+ if (el.scrollLeft !== before) e.preventDefault();
37
+ };
38
+ el.addEventListener('wheel', onWheel, {
39
+ passive: false
40
+ });
41
+ return () => el.removeEventListener('wheel', onWheel);
42
+ }, [ref]);
43
+
44
+ // keyboard only: scrolling on mouse focus would retarget the click away from the link
45
+ const onFocus = react.useCallback(e => {
46
+ const target = e.target;
47
+ if (target === e.currentTarget || !target.matches(':focus-visible')) return;
48
+ target.scrollIntoView?.({
49
+ block: 'nearest',
50
+ inline: 'nearest'
51
+ });
52
+ }, []);
53
+ return {
54
+ sync,
55
+ onFocus
56
+ };
57
+ };
58
+
59
+ exports.useEdgeFade = useEdgeFade;
60
+ //# sourceMappingURL=useEdgeFade.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useEdgeFade.cjs","sources":["../../../src/hooks/useEdgeFade.ts"],"sourcesContent":["import { useCallback, useEffect } from 'react'\nimport type { FocusEvent, RefObject } from 'react'\n\nimport { useIsomorphicLayoutEffect } from './useIsomorphicLayoutEffect'\n\nconst syncFade = (el: HTMLElement) => {\n el.toggleAttribute('data-fade-start', el.scrollLeft > 0)\n el.toggleAttribute(\n 'data-fade-end',\n el.scrollLeft < el.scrollWidth - el.clientWidth - 1,\n )\n}\n\n/** Keeps `data-fade-*` in sync, maps vertical wheel to horizontal scroll, reveals keyboard-focused items. */\nexport const useEdgeFade = (ref: RefObject<HTMLElement>) => {\n const sync = useCallback(() => {\n if (ref.current) syncFade(ref.current)\n }, [ref])\n\n useIsomorphicLayoutEffect(() => {\n const el = ref.current\n if (!el) return\n syncFade(el)\n if (typeof ResizeObserver === 'undefined') return\n const observer = new ResizeObserver(() => syncFade(el))\n observer.observe(el)\n return () => observer.disconnect()\n }, [ref])\n\n useEffect(() => {\n const el = ref.current\n if (!el) return\n const onWheel = (e: WheelEvent) => {\n if (e.ctrlKey || e.metaKey) return\n if (Math.abs(e.deltaY) <= Math.abs(e.deltaX)) return\n if (el.scrollWidth <= el.clientWidth) return\n const before = el.scrollLeft\n el.scrollLeft += e.deltaMode === 1 ? e.deltaY * 16 : e.deltaY\n if (el.scrollLeft !== before) e.preventDefault()\n }\n el.addEventListener('wheel', onWheel, { passive: false })\n return () => el.removeEventListener('wheel', onWheel)\n }, [ref])\n\n // keyboard only: scrolling on mouse focus would retarget the click away from the link\n const onFocus = useCallback((e: FocusEvent<HTMLElement>) => {\n const target = e.target as HTMLElement\n if (target === e.currentTarget || !target.matches(':focus-visible')) return\n target.scrollIntoView?.({ block: 'nearest', inline: 'nearest' })\n }, [])\n\n return { sync, onFocus }\n}\n"],"names":["syncFade","el","toggleAttribute","scrollLeft","scrollWidth","clientWidth","useEdgeFade","ref","sync","useCallback","current","useIsomorphicLayoutEffect","ResizeObserver","observer","observe","disconnect","useEffect","onWheel","e","ctrlKey","metaKey","Math","abs","deltaY","deltaX","before","deltaMode","preventDefault","addEventListener","passive","removeEventListener","onFocus","target","currentTarget","matches","scrollIntoView","block","inline"],"mappings":"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"}
@@ -7,18 +7,21 @@ const overlayStack = require('./overlayStack.cjs');
7
7
 
8
8
  const listenEscapeLayer = overlayStack.createLayerStack('keydown');
9
9
 
10
- /** Calls `handler` on Escape while `active`; with nested overlays only the newest one handles it. */
11
- const useEscape = (active, handler) => {
10
+ /** Calls `handler` on Escape while `enabled`; with nested overlays only the newest one handles it. */
11
+ const useEscape = function (handler) {
12
+ let {
13
+ enabled = true
14
+ } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
12
15
  const handlerRef = react.useRef(handler);
13
16
  handlerRef.current = handler;
14
17
  react.useEffect(() => {
15
- if (!active) return;
18
+ if (!enabled) return;
16
19
  return listenEscapeLayer(event => {
17
- if (event.key !== 'Escape' || event.defaultPrevented) return;
20
+ if (event.key !== 'Escape' || event.defaultPrevented || event.isComposing || event.keyCode === 229) return;
18
21
  event.preventDefault();
19
22
  handlerRef.current(event);
20
23
  });
21
- }, [active]);
24
+ }, [enabled]);
22
25
  };
23
26
 
24
27
  exports.useEscape = useEscape;
@@ -1 +1 @@
1
- {"version":3,"file":"useEscape.cjs","sources":["../../../src/hooks/useEscape.ts"],"sourcesContent":["import { useEffect, useRef } from 'react'\n\nimport { createLayerStack } from './overlayStack'\n\nconst listenEscapeLayer = createLayerStack('keydown')\n\n/** Calls `handler` on Escape while `active`; with nested overlays only the newest one handles it. */\nexport const useEscape = (\n active: boolean,\n handler: (event: KeyboardEvent) => void,\n) => {\n const handlerRef = useRef(handler)\n handlerRef.current = handler\n\n useEffect(() => {\n if (!active) return\n\n return listenEscapeLayer((event) => {\n if (event.key !== 'Escape' || event.defaultPrevented) return\n event.preventDefault()\n handlerRef.current(event)\n })\n }, [active])\n}\n"],"names":["listenEscapeLayer","createLayerStack","useEscape","active","handler","handlerRef","useRef","current","useEffect","event","key","defaultPrevented","preventDefault"],"mappings":";;;;;;;AAIA,MAAMA,iBAAiB,GAAGC,6BAAgB,CAAC,SAAS,CAAC,CAAA;;AAErD;MACaC,SAAS,GAAGA,CACvBC,MAAe,EACfC,OAAuC,KACpC;AACH,EAAA,MAAMC,UAAU,GAAGC,YAAM,CAACF,OAAO,CAAC,CAAA;EAClCC,UAAU,CAACE,OAAO,GAAGH,OAAO,CAAA;AAE5BI,EAAAA,eAAS,CAAC,MAAM;IACd,IAAI,CAACL,MAAM,EAAE,OAAA;IAEb,OAAOH,iBAAiB,CAAES,KAAK,IAAK;MAClC,IAAIA,KAAK,CAACC,GAAG,KAAK,QAAQ,IAAID,KAAK,CAACE,gBAAgB,EAAE,OAAA;MACtDF,KAAK,CAACG,cAAc,EAAE,CAAA;AACtBP,MAAAA,UAAU,CAACE,OAAO,CAACE,KAAK,CAAC,CAAA;AAC3B,KAAC,CAAC,CAAA;AACJ,GAAC,EAAE,CAACN,MAAM,CAAC,CAAC,CAAA;AACd;;;;"}
1
+ {"version":3,"file":"useEscape.cjs","sources":["../../../src/hooks/useEscape.ts"],"sourcesContent":["import { useEffect, useRef } from 'react'\n\nimport { createLayerStack } from './overlayStack'\n\nconst listenEscapeLayer = createLayerStack('keydown')\n\n/** Calls `handler` on Escape while `enabled`; with nested overlays only the newest one handles it. */\nexport const useEscape = (\n handler: (event: KeyboardEvent) => void,\n { enabled = true }: { enabled?: boolean } = {},\n) => {\n const handlerRef = useRef(handler)\n handlerRef.current = handler\n\n useEffect(() => {\n if (!enabled) return\n\n return listenEscapeLayer((event) => {\n if (\n event.key !== 'Escape' ||\n event.defaultPrevented ||\n event.isComposing ||\n event.keyCode === 229\n )\n return\n event.preventDefault()\n handlerRef.current(event)\n })\n }, [enabled])\n}\n"],"names":["listenEscapeLayer","createLayerStack","useEscape","handler","enabled","arguments","length","undefined","handlerRef","useRef","current","useEffect","event","key","defaultPrevented","isComposing","keyCode","preventDefault"],"mappings":";;;;;;;AAIA,MAAMA,iBAAiB,GAAGC,6BAAgB,CAAC,SAAS,CAAC,CAAA;;AAErD;MACaC,SAAS,GAAG,UACvBC,OAAuC,EAEpC;EAAA,IADH;AAAEC,IAAAA,OAAO,GAAG,IAAA;AAA4B,GAAC,GAAAC,SAAA,CAAAC,MAAA,GAAAD,CAAAA,IAAAA,SAAA,CAAAE,CAAAA,CAAAA,KAAAA,SAAA,GAAAF,SAAA,CAAG,CAAA,CAAA,GAAA,EAAE,CAAA;AAE9C,EAAA,MAAMG,UAAU,GAAGC,YAAM,CAACN,OAAO,CAAC,CAAA;EAClCK,UAAU,CAACE,OAAO,GAAGP,OAAO,CAAA;AAE5BQ,EAAAA,eAAS,CAAC,MAAM;IACd,IAAI,CAACP,OAAO,EAAE,OAAA;IAEd,OAAOJ,iBAAiB,CAAEY,KAAK,IAAK;AAClC,MAAA,IACEA,KAAK,CAACC,GAAG,KAAK,QAAQ,IACtBD,KAAK,CAACE,gBAAgB,IACtBF,KAAK,CAACG,WAAW,IACjBH,KAAK,CAACI,OAAO,KAAK,GAAG,EAErB,OAAA;MACFJ,KAAK,CAACK,cAAc,EAAE,CAAA;AACtBT,MAAAA,UAAU,CAACE,OAAO,CAACE,KAAK,CAAC,CAAA;AAC3B,KAAC,CAAC,CAAA;AACJ,GAAC,EAAE,CAACR,OAAO,CAAC,CAAC,CAAA;AACf;;;;"}
@@ -6,28 +6,61 @@ const react = require('react');
6
6
  const overlayStack = require('./overlayStack.cjs');
7
7
 
8
8
  const listenTrapLayer = overlayStack.createLayerStack('keydown');
9
- const TABBABLE = 'a[href],button,input:not([type="hidden"]),select,textarea,[tabindex]:not([tabindex="-1"]),[contenteditable="true"]';
10
- const isRendered = el => {
11
- const style = getComputedStyle(el);
12
- return style.visibility !== 'hidden' && style.display !== 'none';
9
+ const TABBABLE = 'a[href],area[href],button,input:not([type="hidden"]),select,textarea,summary,iframe,audio[controls],video[controls],[tabindex],[contenteditable]:not([contenteditable="false"])';
10
+
11
+ // jsdom has no checkVisibility, and `display` isn't inherited, so walk up to the container.
12
+ const isRendered = (el, container) => {
13
+ if (getComputedStyle(el).visibility === 'hidden') return false;
14
+ for (let node = el; node && node !== container; node = node.parentElement) {
15
+ if (getComputedStyle(node).display === 'none') return false;
16
+ }
17
+ return true;
13
18
  };
14
- const getTabbable = container => Array.from(container.querySelectorAll(TABBABLE)).filter(el => !el.matches(':disabled') && el.getAttribute('aria-hidden') !== 'true' && isRendered(el));
15
- /** Keeps Tab / Shift+Tab inside `element` while `active`; with nested traps only the newest one handles Tab. */
16
- const useFocusTrap = function (element, active) {
17
- let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
19
+ const getTabbable = container => Array.from(container.querySelectorAll(TABBABLE)).filter(el => !el.matches(':disabled') && !el.getAttribute('tabindex')?.trim().startsWith('-') && el.getAttribute('aria-hidden') !== 'true' && !el.closest('[inert]') && isRendered(el, container));
20
+ const isGroupedRadio = el => el instanceof HTMLInputElement && el.type === 'radio' && el.name !== '';
21
+
22
+ // A named radio group is one tab stop; the browser may enter or leave it at any of its radios.
23
+ const sameStop = (a, b) => a === b || isGroupedRadio(a) && isGroupedRadio(b) && a.name === b.name && a.form === b.form;
24
+ const isChecked = el => isGroupedRadio(el) && el.checked;
25
+
26
+ // Browsers enter a radio group at its checked radio.
27
+ const entryPoint = (items, el) => items.find(o => sameStop(o, el) && o.checked) ?? el;
28
+
29
+ // One tab stop per radio group: unchecked radios are skipped when a sibling is checked.
30
+ const getStops = items => items.filter(el => !isGroupedRadio(el) || el.checked || !items.some(o => o !== el && sameStop(o, el) && isChecked(o)));
31
+ /** Keeps Tab / Shift+Tab inside `element` while `enabled`; with nested traps only the newest one handles Tab. */
32
+ const useFocusTrap = function (element) {
33
+ let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
34
+ const {
35
+ enabled = true
36
+ } = options;
18
37
  const optionsRef = react.useRef(options);
19
38
  optionsRef.current = options;
20
39
  react.useEffect(() => {
21
40
  const container = element;
22
- if (!active || !container) return;
23
- const previous = document.activeElement;
24
- const target = optionsRef.current.initialFocus?.current ?? getTabbable(container)[0] ?? container;
25
- if (target === container && !container.hasAttribute('tabindex')) {
26
- container.setAttribute('tabindex', '-1');
41
+ if (!enabled || !container) return;
42
+ const previous = optionsRef.current.returnFocus ?? document.activeElement;
43
+ const explicit = optionsRef.current.initialFocus?.current;
44
+ if (explicit) {
45
+ explicit.focus({
46
+ preventScroll: true
47
+ });
48
+ explicit.scrollIntoView?.({
49
+ block: 'nearest'
50
+ });
51
+ } else if (!container.contains(document.activeElement)) {
52
+ const items = getTabbable(container);
53
+ const target = items[0] ? entryPoint(items, items[0]) : container;
54
+ if (target === container && !container.hasAttribute('tabindex')) {
55
+ container.setAttribute('tabindex', '-1');
56
+ }
57
+ target.focus({
58
+ preventScroll: true
59
+ });
60
+ target.scrollIntoView?.({
61
+ block: 'nearest'
62
+ });
27
63
  }
28
- target.focus({
29
- preventScroll: true
30
- });
31
64
  const onKeyDown = event => {
32
65
  if (event.key !== 'Tab') return;
33
66
  const items = getTabbable(container);
@@ -36,18 +69,22 @@ const useFocusTrap = function (element, active) {
36
69
  container.focus();
37
70
  return;
38
71
  }
39
- const first = items[0];
40
- const last = items[items.length - 1];
72
+ const stops = getStops(items);
73
+ const first = stops[0];
74
+ const last = stops[stops.length - 1];
41
75
  const current = document.activeElement;
76
+ const currentIndex = items.indexOf(current);
77
+ const atEnd = sameStop(current, last) || currentIndex >= 0 && currentIndex >= items.indexOf(last);
78
+ const atStart = current === container || sameStop(current, first) || currentIndex >= 0 && currentIndex <= items.indexOf(first);
42
79
  if (!container.contains(current)) {
43
80
  event.preventDefault();
44
- (event.shiftKey ? last : first).focus();
45
- } else if (event.shiftKey && (current === first || current === container)) {
81
+ entryPoint(items, event.shiftKey ? last : first).focus();
82
+ } else if (event.shiftKey && atStart) {
46
83
  event.preventDefault();
47
- last.focus();
48
- } else if (!event.shiftKey && current === last) {
84
+ entryPoint(items, last).focus();
85
+ } else if (!event.shiftKey && atEnd) {
49
86
  event.preventDefault();
50
- first.focus();
87
+ entryPoint(items, first).focus();
51
88
  }
52
89
  };
53
90
  const stopListening = listenTrapLayer(onKeyDown);
@@ -59,7 +96,7 @@ const useFocusTrap = function (element, active) {
59
96
  });
60
97
  }
61
98
  };
62
- }, [element, active]);
99
+ }, [element, enabled]);
63
100
  };
64
101
 
65
102
  exports.useFocusTrap = useFocusTrap;
@@ -1 +1 @@
1
- {"version":3,"file":"useFocusTrap.cjs","sources":["../../../src/hooks/useFocusTrap.ts"],"sourcesContent":["import { useEffect, useRef, type RefObject } from 'react'\n\nimport { createLayerStack } from './overlayStack'\n\nconst listenTrapLayer = createLayerStack('keydown')\n\nconst TABBABLE =\n 'a[href],button,input:not([type=\"hidden\"]),select,textarea,[tabindex]:not([tabindex=\"-1\"]),[contenteditable=\"true\"]'\n\nconst isRendered = (el: HTMLElement) => {\n const style = getComputedStyle(el)\n return style.visibility !== 'hidden' && style.display !== 'none'\n}\n\nconst getTabbable = (container: HTMLElement) =>\n Array.from(container.querySelectorAll<HTMLElement>(TABBABLE)).filter(\n (el) =>\n !el.matches(':disabled') &&\n el.getAttribute('aria-hidden') !== 'true' &&\n isRendered(el),\n )\n\nexport type FocusTrapOptions = {\n /** Element to focus on activate; defaults to first tabbable, then the container. */\n initialFocus?: RefObject<HTMLElement | null>\n /** Return focus to the previously focused element on deactivate. Default true. */\n restoreFocus?: boolean\n}\n\n/** Keeps Tab / Shift+Tab inside `element` while `active`; with nested traps only the newest one handles Tab. */\nexport const useFocusTrap = (\n element: HTMLElement | null,\n active: boolean,\n options: FocusTrapOptions = {},\n) => {\n const optionsRef = useRef(options)\n optionsRef.current = options\n\n useEffect(() => {\n const container = element\n if (!active || !container) return\n\n const previous = document.activeElement as HTMLElement | null\n\n const target =\n optionsRef.current.initialFocus?.current ??\n getTabbable(container)[0] ??\n container\n if (target === container && !container.hasAttribute('tabindex')) {\n container.setAttribute('tabindex', '-1')\n }\n target.focus({ preventScroll: true })\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key !== 'Tab') return\n const items = getTabbable(container)\n if (items.length === 0) {\n event.preventDefault()\n container.focus()\n return\n }\n const first = items[0]\n const last = items[items.length - 1]\n const current = document.activeElement\n if (!container.contains(current)) {\n event.preventDefault()\n ;(event.shiftKey ? last : first).focus()\n } else if (\n event.shiftKey &&\n (current === first || current === container)\n ) {\n event.preventDefault()\n last.focus()\n } else if (!event.shiftKey && current === last) {\n event.preventDefault()\n first.focus()\n }\n }\n\n const stopListening = listenTrapLayer(onKeyDown)\n return () => {\n stopListening()\n if (\n (optionsRef.current.restoreFocus ?? true) &&\n previous &&\n document.contains(previous)\n ) {\n previous.focus({ preventScroll: true })\n }\n }\n }, [element, active])\n}\n"],"names":["listenTrapLayer","createLayerStack","TABBABLE","isRendered","el","style","getComputedStyle","visibility","display","getTabbable","container","Array","from","querySelectorAll","filter","matches","getAttribute","useFocusTrap","element","active","options","arguments","length","undefined","optionsRef","useRef","current","useEffect","previous","document","activeElement","target","initialFocus","hasAttribute","setAttribute","focus","preventScroll","onKeyDown","event","key","items","preventDefault","first","last","contains","shiftKey","stopListening","restoreFocus"],"mappings":"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"}
1
+ {"version":3,"file":"useFocusTrap.cjs","sources":["../../../src/hooks/useFocusTrap.ts"],"sourcesContent":["import { useEffect, useRef, type RefObject } from 'react'\n\nimport { createLayerStack } from './overlayStack'\n\nconst listenTrapLayer = createLayerStack('keydown')\n\nconst TABBABLE =\n 'a[href],area[href],button,input:not([type=\"hidden\"]),select,textarea,summary,iframe,audio[controls],video[controls],[tabindex],[contenteditable]:not([contenteditable=\"false\"])'\n\n// jsdom has no checkVisibility, and `display` isn't inherited, so walk up to the container.\nconst isRendered = (el: HTMLElement, container: HTMLElement) => {\n if (getComputedStyle(el).visibility === 'hidden') return false\n for (\n let node: HTMLElement | null = el;\n node && node !== container;\n node = node.parentElement\n ) {\n if (getComputedStyle(node).display === 'none') return false\n }\n return true\n}\n\nconst getTabbable = (container: HTMLElement) =>\n Array.from(container.querySelectorAll<HTMLElement>(TABBABLE)).filter(\n (el) =>\n !el.matches(':disabled') &&\n !el.getAttribute('tabindex')?.trim().startsWith('-') &&\n el.getAttribute('aria-hidden') !== 'true' &&\n !el.closest('[inert]') &&\n isRendered(el, container),\n )\n\nconst isGroupedRadio = (el: Element | null): el is HTMLInputElement =>\n el instanceof HTMLInputElement && el.type === 'radio' && el.name !== ''\n\n// A named radio group is one tab stop; the browser may enter or leave it at any of its radios.\nconst sameStop = (a: Element | null, b: HTMLElement) =>\n a === b ||\n (isGroupedRadio(a) &&\n isGroupedRadio(b) &&\n a.name === b.name &&\n a.form === b.form)\n\nconst isChecked = (el: Element) => isGroupedRadio(el) && el.checked\n\n// Browsers enter a radio group at its checked radio.\nconst entryPoint = (items: HTMLElement[], el: HTMLElement) =>\n items.find((o) => sameStop(o, el) && (o as HTMLInputElement).checked) ?? el\n\n// One tab stop per radio group: unchecked radios are skipped when a sibling is checked.\nconst getStops = (items: HTMLElement[]) =>\n items.filter(\n (el) =>\n !isGroupedRadio(el) ||\n el.checked ||\n !items.some((o) => o !== el && sameStop(o, el) && isChecked(o)),\n )\n\nexport type FocusTrapOptions = {\n /** Default true. */\n enabled?: boolean\n /** Element to focus on activate; defaults to focus already inside, then first tabbable, then the container. */\n initialFocus?: RefObject<HTMLElement | null>\n /** Element to restore focus to; defaults to the active element at activation. */\n returnFocus?: HTMLElement | null\n /** Return focus to the previously focused element on deactivate. Default true. */\n restoreFocus?: boolean\n}\n\n/** Keeps Tab / Shift+Tab inside `element` while `enabled`; with nested traps only the newest one handles Tab. */\nexport const useFocusTrap = (\n element: HTMLElement | null,\n options: FocusTrapOptions = {},\n) => {\n const { enabled = true } = options\n const optionsRef = useRef(options)\n optionsRef.current = options\n\n useEffect(() => {\n const container = element\n if (!enabled || !container) return\n\n const previous =\n optionsRef.current.returnFocus ??\n (document.activeElement as HTMLElement | null)\n\n const explicit = optionsRef.current.initialFocus?.current\n if (explicit) {\n explicit.focus({ preventScroll: true })\n explicit.scrollIntoView?.({ block: 'nearest' })\n } else if (!container.contains(document.activeElement)) {\n const items = getTabbable(container)\n const target = items[0] ? entryPoint(items, items[0]) : container\n if (target === container && !container.hasAttribute('tabindex')) {\n container.setAttribute('tabindex', '-1')\n }\n target.focus({ preventScroll: true })\n target.scrollIntoView?.({ block: 'nearest' })\n }\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key !== 'Tab') return\n const items = getTabbable(container)\n if (items.length === 0) {\n event.preventDefault()\n container.focus()\n return\n }\n const stops = getStops(items)\n const first = stops[0]\n const last = stops[stops.length - 1]\n const current = document.activeElement\n const currentIndex = items.indexOf(current as HTMLElement)\n const atEnd =\n sameStop(current, last) ||\n (currentIndex >= 0 && currentIndex >= items.indexOf(last))\n const atStart =\n current === container ||\n sameStop(current, first) ||\n (currentIndex >= 0 && currentIndex <= items.indexOf(first))\n if (!container.contains(current)) {\n event.preventDefault()\n entryPoint(items, event.shiftKey ? last : first).focus()\n } else if (event.shiftKey && atStart) {\n event.preventDefault()\n entryPoint(items, last).focus()\n } else if (!event.shiftKey && atEnd) {\n event.preventDefault()\n entryPoint(items, first).focus()\n }\n }\n\n const stopListening = listenTrapLayer(onKeyDown)\n return () => {\n stopListening()\n if (\n (optionsRef.current.restoreFocus ?? true) &&\n previous &&\n document.contains(previous)\n ) {\n previous.focus({ preventScroll: true })\n }\n }\n }, [element, enabled])\n}\n"],"names":["listenTrapLayer","createLayerStack","TABBABLE","isRendered","el","container","getComputedStyle","visibility","node","parentElement","display","getTabbable","Array","from","querySelectorAll","filter","matches","getAttribute","trim","startsWith","closest","isGroupedRadio","HTMLInputElement","type","name","sameStop","a","b","form","isChecked","checked","entryPoint","items","find","o","getStops","some","useFocusTrap","element","options","arguments","length","undefined","enabled","optionsRef","useRef","current","useEffect","previous","returnFocus","document","activeElement","explicit","initialFocus","focus","preventScroll","scrollIntoView","block","contains","target","hasAttribute","setAttribute","onKeyDown","event","key","preventDefault","stops","first","last","currentIndex","indexOf","atEnd","atStart","shiftKey","stopListening","restoreFocus"],"mappings":";;;;;;;AAIA,MAAMA,eAAe,GAAGC,6BAAgB,CAAC,SAAS,CAAC,CAAA;AAEnD,MAAMC,QAAQ,GACZ,iLAAiL,CAAA;;AAEnL;AACA,MAAMC,UAAU,GAAGA,CAACC,EAAe,EAAEC,SAAsB,KAAK;EAC9D,IAAIC,gBAAgB,CAACF,EAAE,CAAC,CAACG,UAAU,KAAK,QAAQ,EAAE,OAAO,KAAK,CAAA;AAC9D,EAAA,KACE,IAAIC,IAAwB,GAAGJ,EAAE,EACjCI,IAAI,IAAIA,IAAI,KAAKH,SAAS,EAC1BG,IAAI,GAAGA,IAAI,CAACC,aAAa,EACzB;IACA,IAAIH,gBAAgB,CAACE,IAAI,CAAC,CAACE,OAAO,KAAK,MAAM,EAAE,OAAO,KAAK,CAAA;AAC7D,GAAA;AACA,EAAA,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAED,MAAMC,WAAW,GAAIN,SAAsB,IACzCO,KAAK,CAACC,IAAI,CAACR,SAAS,CAACS,gBAAgB,CAAcZ,QAAQ,CAAC,CAAC,CAACa,MAAM,CACjEX,EAAE,IACD,CAACA,EAAE,CAACY,OAAO,CAAC,WAAW,CAAC,IACxB,CAACZ,EAAE,CAACa,YAAY,CAAC,UAAU,CAAC,EAAEC,IAAI,EAAE,CAACC,UAAU,CAAC,GAAG,CAAC,IACpDf,EAAE,CAACa,YAAY,CAAC,aAAa,CAAC,KAAK,MAAM,IACzC,CAACb,EAAE,CAACgB,OAAO,CAAC,SAAS,CAAC,IACtBjB,UAAU,CAACC,EAAE,EAAEC,SAAS,CAC5B,CAAC,CAAA;AAEH,MAAMgB,cAAc,GAAIjB,EAAkB,IACxCA,EAAE,YAAYkB,gBAAgB,IAAIlB,EAAE,CAACmB,IAAI,KAAK,OAAO,IAAInB,EAAE,CAACoB,IAAI,KAAK,EAAE,CAAA;;AAEzE;AACA,MAAMC,QAAQ,GAAGA,CAACC,CAAiB,EAAEC,CAAc,KACjDD,CAAC,KAAKC,CAAC,IACNN,cAAc,CAACK,CAAC,CAAC,IAChBL,cAAc,CAACM,CAAC,CAAC,IACjBD,CAAC,CAACF,IAAI,KAAKG,CAAC,CAACH,IAAI,IACjBE,CAAC,CAACE,IAAI,KAAKD,CAAC,CAACC,IAAK,CAAA;AAEtB,MAAMC,SAAS,GAAIzB,EAAW,IAAKiB,cAAc,CAACjB,EAAE,CAAC,IAAIA,EAAE,CAAC0B,OAAO,CAAA;;AAEnE;AACA,MAAMC,UAAU,GAAGA,CAACC,KAAoB,EAAE5B,EAAe,KACvD4B,KAAK,CAACC,IAAI,CAAEC,CAAC,IAAKT,QAAQ,CAACS,CAAC,EAAE9B,EAAE,CAAC,IAAK8B,CAAC,CAAsBJ,OAAO,CAAC,IAAI1B,EAAE,CAAA;;AAE7E;AACA,MAAM+B,QAAQ,GAAIH,KAAoB,IACpCA,KAAK,CAACjB,MAAM,CACTX,EAAE,IACD,CAACiB,cAAc,CAACjB,EAAE,CAAC,IACnBA,EAAE,CAAC0B,OAAO,IACV,CAACE,KAAK,CAACI,IAAI,CAAEF,CAAC,IAAKA,CAAC,KAAK9B,EAAE,IAAIqB,QAAQ,CAACS,CAAC,EAAE9B,EAAE,CAAC,IAAIyB,SAAS,CAACK,CAAC,CAAC,CAClE,CAAC,CAAA;AAaH;MACaG,YAAY,GAAG,UAC1BC,OAA2B,EAExB;AAAA,EAAA,IADHC,OAAyB,GAAAC,SAAA,CAAAC,MAAA,GAAA,CAAA,IAAAD,SAAA,CAAA,CAAA,CAAA,KAAAE,SAAA,GAAAF,SAAA,CAAA,CAAA,CAAA,GAAG,EAAE,CAAA;EAE9B,MAAM;AAAEG,IAAAA,OAAO,GAAG,IAAA;AAAK,GAAC,GAAGJ,OAAO,CAAA;AAClC,EAAA,MAAMK,UAAU,GAAGC,YAAM,CAACN,OAAO,CAAC,CAAA;EAClCK,UAAU,CAACE,OAAO,GAAGP,OAAO,CAAA;AAE5BQ,EAAAA,eAAS,CAAC,MAAM;IACd,MAAM1C,SAAS,GAAGiC,OAAO,CAAA;AACzB,IAAA,IAAI,CAACK,OAAO,IAAI,CAACtC,SAAS,EAAE,OAAA;IAE5B,MAAM2C,QAAQ,GACZJ,UAAU,CAACE,OAAO,CAACG,WAAW,IAC7BC,QAAQ,CAACC,aAAoC,CAAA;IAEhD,MAAMC,QAAQ,GAAGR,UAAU,CAACE,OAAO,CAACO,YAAY,EAAEP,OAAO,CAAA;AACzD,IAAA,IAAIM,QAAQ,EAAE;MACZA,QAAQ,CAACE,KAAK,CAAC;AAAEC,QAAAA,aAAa,EAAE,IAAA;AAAK,OAAC,CAAC,CAAA;MACvCH,QAAQ,CAACI,cAAc,GAAG;AAAEC,QAAAA,KAAK,EAAE,SAAA;AAAU,OAAC,CAAC,CAAA;KAChD,MAAM,IAAI,CAACpD,SAAS,CAACqD,QAAQ,CAACR,QAAQ,CAACC,aAAa,CAAC,EAAE;AACtD,MAAA,MAAMnB,KAAK,GAAGrB,WAAW,CAACN,SAAS,CAAC,CAAA;AACpC,MAAA,MAAMsD,MAAM,GAAG3B,KAAK,CAAC,CAAC,CAAC,GAAGD,UAAU,CAACC,KAAK,EAAEA,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG3B,SAAS,CAAA;MACjE,IAAIsD,MAAM,KAAKtD,SAAS,IAAI,CAACA,SAAS,CAACuD,YAAY,CAAC,UAAU,CAAC,EAAE;AAC/DvD,QAAAA,SAAS,CAACwD,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC,CAAA;AAC1C,OAAA;MACAF,MAAM,CAACL,KAAK,CAAC;AAAEC,QAAAA,aAAa,EAAE,IAAA;AAAK,OAAC,CAAC,CAAA;MACrCI,MAAM,CAACH,cAAc,GAAG;AAAEC,QAAAA,KAAK,EAAE,SAAA;AAAU,OAAC,CAAC,CAAA;AAC/C,KAAA;IAEA,MAAMK,SAAS,GAAIC,KAAoB,IAAK;AAC1C,MAAA,IAAIA,KAAK,CAACC,GAAG,KAAK,KAAK,EAAE,OAAA;AACzB,MAAA,MAAMhC,KAAK,GAAGrB,WAAW,CAACN,SAAS,CAAC,CAAA;AACpC,MAAA,IAAI2B,KAAK,CAACS,MAAM,KAAK,CAAC,EAAE;QACtBsB,KAAK,CAACE,cAAc,EAAE,CAAA;QACtB5D,SAAS,CAACiD,KAAK,EAAE,CAAA;AACjB,QAAA,OAAA;AACF,OAAA;AACA,MAAA,MAAMY,KAAK,GAAG/B,QAAQ,CAACH,KAAK,CAAC,CAAA;AAC7B,MAAA,MAAMmC,KAAK,GAAGD,KAAK,CAAC,CAAC,CAAC,CAAA;MACtB,MAAME,IAAI,GAAGF,KAAK,CAACA,KAAK,CAACzB,MAAM,GAAG,CAAC,CAAC,CAAA;AACpC,MAAA,MAAMK,OAAO,GAAGI,QAAQ,CAACC,aAAa,CAAA;AACtC,MAAA,MAAMkB,YAAY,GAAGrC,KAAK,CAACsC,OAAO,CAACxB,OAAsB,CAAC,CAAA;MAC1D,MAAMyB,KAAK,GACT9C,QAAQ,CAACqB,OAAO,EAAEsB,IAAI,CAAC,IACtBC,YAAY,IAAI,CAAC,IAAIA,YAAY,IAAIrC,KAAK,CAACsC,OAAO,CAACF,IAAI,CAAE,CAAA;MAC5D,MAAMI,OAAO,GACX1B,OAAO,KAAKzC,SAAS,IACrBoB,QAAQ,CAACqB,OAAO,EAAEqB,KAAK,CAAC,IACvBE,YAAY,IAAI,CAAC,IAAIA,YAAY,IAAIrC,KAAK,CAACsC,OAAO,CAACH,KAAK,CAAE,CAAA;AAC7D,MAAA,IAAI,CAAC9D,SAAS,CAACqD,QAAQ,CAACZ,OAAO,CAAC,EAAE;QAChCiB,KAAK,CAACE,cAAc,EAAE,CAAA;AACtBlC,QAAAA,UAAU,CAACC,KAAK,EAAE+B,KAAK,CAACU,QAAQ,GAAGL,IAAI,GAAGD,KAAK,CAAC,CAACb,KAAK,EAAE,CAAA;AAC1D,OAAC,MAAM,IAAIS,KAAK,CAACU,QAAQ,IAAID,OAAO,EAAE;QACpCT,KAAK,CAACE,cAAc,EAAE,CAAA;QACtBlC,UAAU,CAACC,KAAK,EAAEoC,IAAI,CAAC,CAACd,KAAK,EAAE,CAAA;OAChC,MAAM,IAAI,CAACS,KAAK,CAACU,QAAQ,IAAIF,KAAK,EAAE;QACnCR,KAAK,CAACE,cAAc,EAAE,CAAA;QACtBlC,UAAU,CAACC,KAAK,EAAEmC,KAAK,CAAC,CAACb,KAAK,EAAE,CAAA;AAClC,OAAA;KACD,CAAA;AAED,IAAA,MAAMoB,aAAa,GAAG1E,eAAe,CAAC8D,SAAS,CAAC,CAAA;AAChD,IAAA,OAAO,MAAM;AACXY,MAAAA,aAAa,EAAE,CAAA;AACf,MAAA,IACE,CAAC9B,UAAU,CAACE,OAAO,CAAC6B,YAAY,IAAI,IAAI,KACxC3B,QAAQ,IACRE,QAAQ,CAACQ,QAAQ,CAACV,QAAQ,CAAC,EAC3B;QACAA,QAAQ,CAACM,KAAK,CAAC;AAAEC,UAAAA,aAAa,EAAE,IAAA;AAAK,SAAC,CAAC,CAAA;AACzC,OAAA;KACD,CAAA;AACH,GAAC,EAAE,CAACjB,OAAO,EAAEK,OAAO,CAAC,CAAC,CAAA;AACxB;;;;"}
@@ -0,0 +1,51 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
4
+
5
+ const react = require('react');
6
+
7
+ const KEEP_ATTR = 'data-lido-overlay-keep';
8
+ // Stack in activation order; the top owner's root must stay live.
9
+ const owners = [];
10
+ // How many owners inerted each node, so a lower owner closing can't lift an upper one's inert.
11
+ const counts = new Map();
12
+ const sync = () => {
13
+ counts.forEach((_, node) => node.setAttribute('inert', ''));
14
+ owners[owners.length - 1]?.root?.removeAttribute('inert');
15
+ };
16
+
17
+ // Standalone inputs/iframes/buttons are tabbable (tabIndex >= 0) and must not count as empty hosts.
18
+ const isEmptyHost = node => node.childNodes.length === 0 && node.tabIndex < 0;
19
+
20
+ /** Sets `inert` on the other `document.body` children while `enabled`; roots mounted later (or empty at activation) and ones marked `data-lido-overlay-keep` stay live. */
21
+ const useHideOthers = function (element) {
22
+ let enabled = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
23
+ react.useEffect(() => {
24
+ if (!enabled || !element) return;
25
+ const root = element.closest('body > *');
26
+ const owner = {
27
+ root
28
+ };
29
+ // Inert nodes we didn't mark belong to the app, which restores them itself.
30
+ const others = Array.from(document.body.children).filter(node => node !== root && !isEmptyHost(node) && !node.hasAttribute(KEEP_ATTR) && !(node.hasAttribute('inert') && !counts.has(node)));
31
+ others.forEach(node => counts.set(node, (counts.get(node) ?? 0) + 1));
32
+ owners.push(owner);
33
+ sync();
34
+ return () => {
35
+ owners.splice(owners.indexOf(owner), 1);
36
+ others.forEach(node => {
37
+ const count = (counts.get(node) ?? 1) - 1;
38
+ if (count > 0) {
39
+ counts.set(node, count);
40
+ } else {
41
+ counts.delete(node);
42
+ node.removeAttribute('inert');
43
+ }
44
+ });
45
+ sync();
46
+ };
47
+ }, [element, enabled]);
48
+ };
49
+
50
+ exports.useHideOthers = useHideOthers;
51
+ //# sourceMappingURL=useHideOthers.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useHideOthers.cjs","sources":["../../../src/hooks/useHideOthers.ts"],"sourcesContent":["import { useEffect } from 'react'\n\nconst KEEP_ATTR = 'data-lido-overlay-keep'\n\ntype Owner = { root: Element | null }\n\n// Stack in activation order; the top owner's root must stay live.\nconst owners: Owner[] = []\n// How many owners inerted each node, so a lower owner closing can't lift an upper one's inert.\nconst counts = new Map<Element, number>()\n\nconst sync = () => {\n counts.forEach((_, node) => node.setAttribute('inert', ''))\n owners[owners.length - 1]?.root?.removeAttribute('inert')\n}\n\n// Standalone inputs/iframes/buttons are tabbable (tabIndex >= 0) and must not count as empty hosts.\nconst isEmptyHost = (node: Element) =>\n node.childNodes.length === 0 && (node as HTMLElement).tabIndex < 0\n\n/** Sets `inert` on the other `document.body` children while `enabled`; roots mounted later (or empty at activation) and ones marked `data-lido-overlay-keep` stay live. */\nexport const useHideOthers = (element: HTMLElement | null, enabled = true) => {\n useEffect(() => {\n if (!enabled || !element) return\n const root = element.closest('body > *')\n const owner: Owner = { root }\n // Inert nodes we didn't mark belong to the app, which restores them itself.\n const others = Array.from(document.body.children).filter(\n (node) =>\n node !== root &&\n !isEmptyHost(node) &&\n !node.hasAttribute(KEEP_ATTR) &&\n !(node.hasAttribute('inert') && !counts.has(node)),\n )\n others.forEach((node) => counts.set(node, (counts.get(node) ?? 0) + 1))\n owners.push(owner)\n sync()\n return () => {\n owners.splice(owners.indexOf(owner), 1)\n others.forEach((node) => {\n const count = (counts.get(node) ?? 1) - 1\n if (count > 0) {\n counts.set(node, count)\n } else {\n counts.delete(node)\n node.removeAttribute('inert')\n }\n })\n sync()\n }\n }, [element, enabled])\n}\n"],"names":["KEEP_ATTR","owners","counts","Map","sync","forEach","_","node","setAttribute","length","root","removeAttribute","isEmptyHost","childNodes","tabIndex","useHideOthers","element","enabled","arguments","undefined","useEffect","closest","owner","others","Array","from","document","body","children","filter","hasAttribute","has","set","get","push","splice","indexOf","count","delete"],"mappings":";;;;;;AAEA,MAAMA,SAAS,GAAG,wBAAwB,CAAA;AAI1C;AACA,MAAMC,MAAe,GAAG,EAAE,CAAA;AAC1B;AACA,MAAMC,MAAM,GAAG,IAAIC,GAAG,EAAmB,CAAA;AAEzC,MAAMC,IAAI,GAAGA,MAAM;AACjBF,EAAAA,MAAM,CAACG,OAAO,CAAC,CAACC,CAAC,EAAEC,IAAI,KAAKA,IAAI,CAACC,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAA;AAC3DP,EAAAA,MAAM,CAACA,MAAM,CAACQ,MAAM,GAAG,CAAC,CAAC,EAAEC,IAAI,EAAEC,eAAe,CAAC,OAAO,CAAC,CAAA;AAC3D,CAAC,CAAA;;AAED;AACA,MAAMC,WAAW,GAAIL,IAAa,IAChCA,IAAI,CAACM,UAAU,CAACJ,MAAM,KAAK,CAAC,IAAKF,IAAI,CAAiBO,QAAQ,GAAG,CAAC,CAAA;;AAEpE;MACaC,aAAa,GAAG,UAACC,OAA2B,EAAqB;AAAA,EAAA,IAAnBC,OAAO,GAAAC,SAAA,CAAAT,MAAA,GAAA,CAAA,IAAAS,SAAA,CAAA,CAAA,CAAA,KAAAC,SAAA,GAAAD,SAAA,CAAA,CAAA,CAAA,GAAG,IAAI,CAAA;AACvEE,EAAAA,eAAS,CAAC,MAAM;AACd,IAAA,IAAI,CAACH,OAAO,IAAI,CAACD,OAAO,EAAE,OAAA;AAC1B,IAAA,MAAMN,IAAI,GAAGM,OAAO,CAACK,OAAO,CAAC,UAAU,CAAC,CAAA;AACxC,IAAA,MAAMC,KAAY,GAAG;AAAEZ,MAAAA,IAAAA;KAAM,CAAA;AAC7B;IACA,MAAMa,MAAM,GAAGC,KAAK,CAACC,IAAI,CAACC,QAAQ,CAACC,IAAI,CAACC,QAAQ,CAAC,CAACC,MAAM,CACrDtB,IAAI,IACHA,IAAI,KAAKG,IAAI,IACb,CAACE,WAAW,CAACL,IAAI,CAAC,IAClB,CAACA,IAAI,CAACuB,YAAY,CAAC9B,SAAS,CAAC,IAC7B,EAAEO,IAAI,CAACuB,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC5B,MAAM,CAAC6B,GAAG,CAACxB,IAAI,CAAC,CACrD,CAAC,CAAA;IACDgB,MAAM,CAAClB,OAAO,CAAEE,IAAI,IAAKL,MAAM,CAAC8B,GAAG,CAACzB,IAAI,EAAE,CAACL,MAAM,CAAC+B,GAAG,CAAC1B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACvEN,IAAAA,MAAM,CAACiC,IAAI,CAACZ,KAAK,CAAC,CAAA;AAClBlB,IAAAA,IAAI,EAAE,CAAA;AACN,IAAA,OAAO,MAAM;MACXH,MAAM,CAACkC,MAAM,CAAClC,MAAM,CAACmC,OAAO,CAACd,KAAK,CAAC,EAAE,CAAC,CAAC,CAAA;AACvCC,MAAAA,MAAM,CAAClB,OAAO,CAAEE,IAAI,IAAK;AACvB,QAAA,MAAM8B,KAAK,GAAG,CAACnC,MAAM,CAAC+B,GAAG,CAAC1B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACzC,IAAI8B,KAAK,GAAG,CAAC,EAAE;AACbnC,UAAAA,MAAM,CAAC8B,GAAG,CAACzB,IAAI,EAAE8B,KAAK,CAAC,CAAA;AACzB,SAAC,MAAM;AACLnC,UAAAA,MAAM,CAACoC,MAAM,CAAC/B,IAAI,CAAC,CAAA;AACnBA,UAAAA,IAAI,CAACI,eAAe,CAAC,OAAO,CAAC,CAAA;AAC/B,SAAA;AACF,OAAC,CAAC,CAAA;AACFP,MAAAA,IAAI,EAAE,CAAA;KACP,CAAA;AACH,GAAC,EAAE,CAACY,OAAO,EAAEC,OAAO,CAAC,CAAC,CAAA;AACxB;;;;"}
@@ -9,16 +9,43 @@ const listenOutsideLayer = overlayStack.createLayerStack('pointerdown', {
9
9
  capture: true
10
10
  });
11
11
 
12
- /** Calls `onOutside` on pointerdown outside `element` while `enabled`; with nested overlays only the newest one handles outside clicks. */
13
- const useOutsideClick = (element, onOutside, enabled) => {
12
+ /** Calls `onOutside` on pointerdown outside `element` while `enabled`, or on a completed tap for touch so scrolling doesn't dismiss; with nested overlays only the newest one handles outside clicks. */
13
+ const useOutsideClick = function (element, onOutside) {
14
+ let {
15
+ enabled = true
16
+ } = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
14
17
  const handlerRef = react.useRef(onOutside);
15
18
  handlerRef.current = onOutside;
16
19
  react.useEffect(() => {
17
20
  if (!enabled || !element) return;
18
- return listenOutsideLayer(event => {
21
+ let cancelPending = null;
22
+ const clearPending = () => {
23
+ cancelPending?.();
24
+ cancelPending = null;
25
+ };
26
+ const stop = listenOutsideLayer(event => {
19
27
  if (event.target instanceof Node && element.contains(event.target)) return;
20
- handlerRef.current(event);
28
+ clearPending();
29
+ if (event.pointerType !== 'touch') {
30
+ handlerRef.current(event);
31
+ return;
32
+ }
33
+ // A scroll gesture ends in pointercancel; only a tap reaches pointerup.
34
+ const onUp = () => {
35
+ clearPending();
36
+ handlerRef.current(event);
37
+ };
38
+ document.addEventListener('pointerup', onUp, true);
39
+ document.addEventListener('pointercancel', clearPending, true);
40
+ cancelPending = () => {
41
+ document.removeEventListener('pointerup', onUp, true);
42
+ document.removeEventListener('pointercancel', clearPending, true);
43
+ };
21
44
  });
45
+ return () => {
46
+ clearPending();
47
+ stop();
48
+ };
22
49
  }, [element, enabled]);
23
50
  };
24
51
 
@@ -1 +1 @@
1
- {"version":3,"file":"useOutsideClick.cjs","sources":["../../../src/hooks/useOutsideClick.ts"],"sourcesContent":["import { useEffect, useRef } from 'react'\n\nimport { createLayerStack } from './overlayStack'\n\nconst listenOutsideLayer = createLayerStack('pointerdown', { capture: true })\n\n/** Calls `onOutside` on pointerdown outside `element` while `enabled`; with nested overlays only the newest one handles outside clicks. */\nexport const useOutsideClick = (\n element: HTMLElement | null,\n onOutside: (event: PointerEvent) => void,\n enabled: boolean,\n) => {\n const handlerRef = useRef(onOutside)\n handlerRef.current = onOutside\n\n useEffect(() => {\n if (!enabled || !element) return\n\n return listenOutsideLayer((event) => {\n if (event.target instanceof Node && element.contains(event.target)) return\n handlerRef.current(event)\n })\n }, [element, enabled])\n}\n"],"names":["listenOutsideLayer","createLayerStack","capture","useOutsideClick","element","onOutside","enabled","handlerRef","useRef","current","useEffect","event","target","Node","contains"],"mappings":";;;;;;;AAIA,MAAMA,kBAAkB,GAAGC,6BAAgB,CAAC,aAAa,EAAE;AAAEC,EAAAA,OAAO,EAAE,IAAA;AAAK,CAAC,CAAC,CAAA;;AAE7E;AACO,MAAMC,eAAe,GAAGA,CAC7BC,OAA2B,EAC3BC,SAAwC,EACxCC,OAAgB,KACb;AACH,EAAA,MAAMC,UAAU,GAAGC,YAAM,CAACH,SAAS,CAAC,CAAA;EACpCE,UAAU,CAACE,OAAO,GAAGJ,SAAS,CAAA;AAE9BK,EAAAA,eAAS,CAAC,MAAM;AACd,IAAA,IAAI,CAACJ,OAAO,IAAI,CAACF,OAAO,EAAE,OAAA;IAE1B,OAAOJ,kBAAkB,CAAEW,KAAK,IAAK;AACnC,MAAA,IAAIA,KAAK,CAACC,MAAM,YAAYC,IAAI,IAAIT,OAAO,CAACU,QAAQ,CAACH,KAAK,CAACC,MAAM,CAAC,EAAE,OAAA;AACpEL,MAAAA,UAAU,CAACE,OAAO,CAACE,KAAK,CAAC,CAAA;AAC3B,KAAC,CAAC,CAAA;AACJ,GAAC,EAAE,CAACP,OAAO,EAAEE,OAAO,CAAC,CAAC,CAAA;AACxB;;;;"}
1
+ {"version":3,"file":"useOutsideClick.cjs","sources":["../../../src/hooks/useOutsideClick.ts"],"sourcesContent":["import { useEffect, useRef } from 'react'\n\nimport { createLayerStack } from './overlayStack'\n\nconst listenOutsideLayer = createLayerStack('pointerdown', { capture: true })\n\n/** Calls `onOutside` on pointerdown outside `element` while `enabled`, or on a completed tap for touch so scrolling doesn't dismiss; with nested overlays only the newest one handles outside clicks. */\nexport const useOutsideClick = (\n element: HTMLElement | null,\n onOutside: (event: PointerEvent) => void,\n { enabled = true }: { enabled?: boolean } = {},\n) => {\n const handlerRef = useRef(onOutside)\n handlerRef.current = onOutside\n\n useEffect(() => {\n if (!enabled || !element) return\n\n let cancelPending: (() => void) | null = null\n const clearPending = () => {\n cancelPending?.()\n cancelPending = null\n }\n\n const stop = listenOutsideLayer((event) => {\n if (event.target instanceof Node && element.contains(event.target)) return\n clearPending()\n if (event.pointerType !== 'touch') {\n handlerRef.current(event)\n return\n }\n // A scroll gesture ends in pointercancel; only a tap reaches pointerup.\n const onUp = () => {\n clearPending()\n handlerRef.current(event)\n }\n document.addEventListener('pointerup', onUp, true)\n document.addEventListener('pointercancel', clearPending, true)\n cancelPending = () => {\n document.removeEventListener('pointerup', onUp, true)\n document.removeEventListener('pointercancel', clearPending, true)\n }\n })\n return () => {\n clearPending()\n stop()\n }\n }, [element, enabled])\n}\n"],"names":["listenOutsideLayer","createLayerStack","capture","useOutsideClick","element","onOutside","enabled","arguments","length","undefined","handlerRef","useRef","current","useEffect","cancelPending","clearPending","stop","event","target","Node","contains","pointerType","onUp","document","addEventListener","removeEventListener"],"mappings":";;;;;;;AAIA,MAAMA,kBAAkB,GAAGC,6BAAgB,CAAC,aAAa,EAAE;AAAEC,EAAAA,OAAO,EAAE,IAAA;AAAK,CAAC,CAAC,CAAA;;AAE7E;AACO,MAAMC,eAAe,GAAG,UAC7BC,OAA2B,EAC3BC,SAAwC,EAErC;EAAA,IADH;AAAEC,IAAAA,OAAO,GAAG,IAAA;AAA4B,GAAC,GAAAC,SAAA,CAAAC,MAAA,GAAAD,CAAAA,IAAAA,SAAA,CAAAE,CAAAA,CAAAA,KAAAA,SAAA,GAAAF,SAAA,CAAG,CAAA,CAAA,GAAA,EAAE,CAAA;AAE9C,EAAA,MAAMG,UAAU,GAAGC,YAAM,CAACN,SAAS,CAAC,CAAA;EACpCK,UAAU,CAACE,OAAO,GAAGP,SAAS,CAAA;AAE9BQ,EAAAA,eAAS,CAAC,MAAM;AACd,IAAA,IAAI,CAACP,OAAO,IAAI,CAACF,OAAO,EAAE,OAAA;IAE1B,IAAIU,aAAkC,GAAG,IAAI,CAAA;IAC7C,MAAMC,YAAY,GAAGA,MAAM;AACzBD,MAAAA,aAAa,IAAI,CAAA;AACjBA,MAAAA,aAAa,GAAG,IAAI,CAAA;KACrB,CAAA;AAED,IAAA,MAAME,IAAI,GAAGhB,kBAAkB,CAAEiB,KAAK,IAAK;AACzC,MAAA,IAAIA,KAAK,CAACC,MAAM,YAAYC,IAAI,IAAIf,OAAO,CAACgB,QAAQ,CAACH,KAAK,CAACC,MAAM,CAAC,EAAE,OAAA;AACpEH,MAAAA,YAAY,EAAE,CAAA;AACd,MAAA,IAAIE,KAAK,CAACI,WAAW,KAAK,OAAO,EAAE;AACjCX,QAAAA,UAAU,CAACE,OAAO,CAACK,KAAK,CAAC,CAAA;AACzB,QAAA,OAAA;AACF,OAAA;AACA;MACA,MAAMK,IAAI,GAAGA,MAAM;AACjBP,QAAAA,YAAY,EAAE,CAAA;AACdL,QAAAA,UAAU,CAACE,OAAO,CAACK,KAAK,CAAC,CAAA;OAC1B,CAAA;MACDM,QAAQ,CAACC,gBAAgB,CAAC,WAAW,EAAEF,IAAI,EAAE,IAAI,CAAC,CAAA;MAClDC,QAAQ,CAACC,gBAAgB,CAAC,eAAe,EAAET,YAAY,EAAE,IAAI,CAAC,CAAA;MAC9DD,aAAa,GAAGA,MAAM;QACpBS,QAAQ,CAACE,mBAAmB,CAAC,WAAW,EAAEH,IAAI,EAAE,IAAI,CAAC,CAAA;QACrDC,QAAQ,CAACE,mBAAmB,CAAC,eAAe,EAAEV,YAAY,EAAE,IAAI,CAAC,CAAA;OAClE,CAAA;AACH,KAAC,CAAC,CAAA;AACF,IAAA,OAAO,MAAM;AACXA,MAAAA,YAAY,EAAE,CAAA;AACdC,MAAAA,IAAI,EAAE,CAAA;KACP,CAAA;AACH,GAAC,EAAE,CAACZ,OAAO,EAAEE,OAAO,CAAC,CAAC,CAAA;AACxB;;;;"}
@@ -10,6 +10,7 @@ const IconButton_module = require('./IconButton.module.css.cjs');
10
10
  const jsxRuntime = require('react/jsx-runtime');
11
11
  const IconLoaderCircle = require('../icons/components/base/IconLoaderCircle.cjs');
12
12
 
13
+ /** 36px fully rounded icon-only button; `loading` swaps the icon for a spinner and disables it. */
13
14
  const IconButton = /*#__PURE__*/react.forwardRef((_ref, ref) => {
14
15
  let {
15
16
  className,
@@ -19,6 +20,8 @@ const IconButton = /*#__PURE__*/react.forwardRef((_ref, ref) => {
19
20
  disabled = false,
20
21
  icon,
21
22
  counter,
23
+ counterLabel,
24
+ 'aria-label': ariaLabel,
22
25
  dataTestId,
23
26
  ...rest
24
27
  } = _ref;
@@ -29,6 +32,7 @@ const IconButton = /*#__PURE__*/react.forwardRef((_ref, ref) => {
29
32
  "aria-busy": loading || undefined,
30
33
  className: cn(IconButton_module.button, IconButton_module[variant], variant === 'surface' && surface_module.surface, loading && !disabled && IconButton_module.loading, className),
31
34
  "data-testid": dataTestId?.root,
35
+ "aria-label": counterLabel ? `${ariaLabel}, ${counterLabel}` : ariaLabel,
32
36
  ...rest,
33
37
  children: [loading ? /*#__PURE__*/jsxRuntime.jsx(IconLoaderCircle.IconLoaderCircle, {
34
38
  className: IconButton_module.spinner,
@@ -1 +1 @@
1
- {"version":3,"file":"IconButton.cjs","sources":["../../../src/icon-button/IconButton.tsx"],"sourcesContent":["import { forwardRef, type ButtonHTMLAttributes, type ReactNode } from 'react'\n\nimport cn from 'classnames'\n\nimport { CounterSlot } from '../counter/CounterSlot'\nimport { IconLoaderCircle } from '../icons'\nimport surfaceStyles from '../utils/surface.module.css'\nimport styles from './IconButton.module.css'\n\nexport type IconButtonVariant = 'outline' | 'ghost' | 'surface'\n\nexport type IconButtonDataTestId = {\n root?: string\n icon?: string\n counter?: string\n}\n\nexport type IconButtonProps = Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n 'aria-label'\n> & {\n 'aria-label': string\n icon: ReactNode\n variant?: IconButtonVariant\n loading?: boolean\n /** Corner slot, aria-hidden: put the count into `aria-label`. */\n counter?: ReactNode\n dataTestId?: IconButtonDataTestId\n}\n\nexport const IconButton = forwardRef<HTMLButtonElement, IconButtonProps>(\n (\n {\n className,\n type = 'button',\n variant = 'outline',\n loading = false,\n disabled = false,\n icon,\n counter,\n dataTestId,\n ...rest\n },\n ref,\n ) => (\n <button\n ref={ref}\n type={type}\n disabled={disabled || loading}\n aria-busy={loading || undefined}\n className={cn(\n styles.button,\n styles[variant],\n variant === 'surface' && surfaceStyles.surface,\n loading && !disabled && styles.loading,\n className,\n )}\n data-testid={dataTestId?.root}\n {...rest}\n >\n {loading ? (\n <IconLoaderCircle className={styles.spinner} aria-hidden='true' />\n ) : (\n <span\n className={styles.icon}\n aria-hidden='true'\n data-testid={dataTestId?.icon}\n >\n {icon}\n </span>\n )}\n <CounterSlot dataTestId={dataTestId?.counter}>{counter}</CounterSlot>\n </button>\n ),\n)\n\nIconButton.displayName = 'IconButton'\n"],"names":["IconButton","forwardRef","_ref","ref","className","type","variant","loading","disabled","icon","counter","dataTestId","rest","_jsxs","undefined","cn","styles","button","surfaceStyles","surface","root","children","_jsx","IconLoaderCircle","spinner","CounterSlot","displayName"],"mappings":";;;;;;;;;;;;AA8BO,MAAMA,UAAU,gBAAGC,gBAAU,CAClC,CAAAC,IAAA,EAYEC,GAAG,KAAA;EAAA,IAXH;IACEC,SAAS;AACTC,IAAAA,IAAI,GAAG,QAAQ;AACfC,IAAAA,OAAO,GAAG,SAAS;AACnBC,IAAAA,OAAO,GAAG,KAAK;AACfC,IAAAA,QAAQ,GAAG,KAAK;IAChBC,IAAI;IACJC,OAAO;IACPC,UAAU;IACV,GAAGC,IAAAA;AACL,GAAC,GAAAV,IAAA,CAAA;AAAA,EAAA,oBAGDW,eAAA,CAAA,QAAA,EAAA;AACEV,IAAAA,GAAG,EAAEA,GAAI;AACTE,IAAAA,IAAI,EAAEA,IAAK;IACXG,QAAQ,EAAEA,QAAQ,IAAID,OAAQ;IAC9B,WAAWA,EAAAA,OAAO,IAAIO,SAAU;AAChCV,IAAAA,SAAS,EAAEW,EAAE,CACXC,iBAAM,CAACC,MAAM,EACbD,iBAAM,CAACV,OAAO,CAAC,EACfA,OAAO,KAAK,SAAS,IAAIY,cAAa,CAACC,OAAO,EAC9CZ,OAAO,IAAI,CAACC,QAAQ,IAAIQ,iBAAM,CAACT,OAAO,EACtCH,SACF,CAAE;IACF,aAAaO,EAAAA,UAAU,EAAES,IAAK;AAAA,IAAA,GAC1BR,IAAI;AAAAS,IAAAA,QAAA,EAEPd,CAAAA,OAAO,gBACNe,cAAA,CAACC,iCAAgB,EAAA;MAACnB,SAAS,EAAEY,iBAAM,CAACQ,OAAQ;MAAC,aAAY,EAAA,MAAA;KAAQ,CAAC,gBAElEF,cAAA,CAAA,MAAA,EAAA;MACElB,SAAS,EAAEY,iBAAM,CAACP,IAAK;AACvB,MAAA,aAAA,EAAY,MAAM;MAClB,aAAaE,EAAAA,UAAU,EAAEF,IAAK;AAAAY,MAAAA,QAAA,EAE7BZ,IAAAA;AAAI,KACD,CACP,eACDa,cAAA,CAACG,uBAAW,EAAA;MAACd,UAAU,EAAEA,UAAU,EAAED,OAAQ;AAAAW,MAAAA,QAAA,EAAEX,OAAAA;AAAO,KAAc,CAAC,CAAA;AAAA,GAC/D,CAAC,CAAA;AAAA,CAEb,EAAC;AAEDV,UAAU,CAAC0B,WAAW,GAAG,YAAY;;;;"}
1
+ {"version":3,"file":"IconButton.cjs","sources":["../../../src/icon-button/IconButton.tsx"],"sourcesContent":["import { forwardRef, type ButtonHTMLAttributes, type ReactNode } from 'react'\n\nimport cn from 'classnames'\n\nimport { CounterSlot } from '../counter/CounterSlot'\nimport { IconLoaderCircle } from '../icons'\nimport surfaceStyles from '../utils/surface.module.css'\nimport styles from './IconButton.module.css'\n\nexport type IconButtonVariant = 'outline' | 'ghost' | 'surface'\n\nexport type IconButtonDataTestId = {\n root?: string\n icon?: string\n counter?: string\n}\n\nexport type IconButtonProps = Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n 'aria-label'\n> & {\n 'aria-label': string\n icon: ReactNode\n variant?: IconButtonVariant\n loading?: boolean\n /**\n * Corner slot, aria-hidden. A number or string renders a default `Counter`\n * (`0` shows a \"0\" pill; use `counter={count || null}` to hide it), or pass a\n * `<Counter variant=...>` element. Announce the count with `counterLabel`.\n */\n counter?: ReactNode\n /** Spoken with the name, e.g. \"3 unread\". */\n counterLabel?: string\n dataTestId?: IconButtonDataTestId\n}\n\n/** 36px fully rounded icon-only button; `loading` swaps the icon for a spinner and disables it. */\nexport const IconButton = forwardRef<HTMLButtonElement, IconButtonProps>(\n (\n {\n className,\n type = 'button',\n variant = 'outline',\n loading = false,\n disabled = false,\n icon,\n counter,\n counterLabel,\n 'aria-label': ariaLabel,\n dataTestId,\n ...rest\n },\n ref,\n ) => (\n <button\n ref={ref}\n type={type}\n disabled={disabled || loading}\n aria-busy={loading || undefined}\n className={cn(\n styles.button,\n styles[variant],\n variant === 'surface' && surfaceStyles.surface,\n loading && !disabled && styles.loading,\n className,\n )}\n data-testid={dataTestId?.root}\n aria-label={counterLabel ? `${ariaLabel}, ${counterLabel}` : ariaLabel}\n {...rest}\n >\n {loading ? (\n <IconLoaderCircle className={styles.spinner} aria-hidden='true' />\n ) : (\n <span\n className={styles.icon}\n aria-hidden='true'\n data-testid={dataTestId?.icon}\n >\n {icon}\n </span>\n )}\n <CounterSlot dataTestId={dataTestId?.counter}>{counter}</CounterSlot>\n </button>\n ),\n)\n\nIconButton.displayName = 'IconButton'\n"],"names":["IconButton","forwardRef","_ref","ref","className","type","variant","loading","disabled","icon","counter","counterLabel","ariaLabel","dataTestId","rest","_jsxs","undefined","cn","styles","button","surfaceStyles","surface","root","children","_jsx","IconLoaderCircle","spinner","CounterSlot","displayName"],"mappings":";;;;;;;;;;;;AAoCA;AACO,MAAMA,UAAU,gBAAGC,gBAAU,CAClC,CAAAC,IAAA,EAcEC,GAAG,KAAA;EAAA,IAbH;IACEC,SAAS;AACTC,IAAAA,IAAI,GAAG,QAAQ;AACfC,IAAAA,OAAO,GAAG,SAAS;AACnBC,IAAAA,OAAO,GAAG,KAAK;AACfC,IAAAA,QAAQ,GAAG,KAAK;IAChBC,IAAI;IACJC,OAAO;IACPC,YAAY;AACZ,IAAA,YAAY,EAAEC,SAAS;IACvBC,UAAU;IACV,GAAGC,IAAAA;AACL,GAAC,GAAAZ,IAAA,CAAA;AAAA,EAAA,oBAGDa,eAAA,CAAA,QAAA,EAAA;AACEZ,IAAAA,GAAG,EAAEA,GAAI;AACTE,IAAAA,IAAI,EAAEA,IAAK;IACXG,QAAQ,EAAEA,QAAQ,IAAID,OAAQ;IAC9B,WAAWA,EAAAA,OAAO,IAAIS,SAAU;AAChCZ,IAAAA,SAAS,EAAEa,EAAE,CACXC,iBAAM,CAACC,MAAM,EACbD,iBAAM,CAACZ,OAAO,CAAC,EACfA,OAAO,KAAK,SAAS,IAAIc,cAAa,CAACC,OAAO,EAC9Cd,OAAO,IAAI,CAACC,QAAQ,IAAIU,iBAAM,CAACX,OAAO,EACtCH,SACF,CAAE;IACF,aAAaS,EAAAA,UAAU,EAAES,IAAK;IAC9B,YAAYX,EAAAA,YAAY,GAAG,CAAGC,EAAAA,SAAS,KAAKD,YAAY,CAAA,CAAE,GAAGC,SAAU;AAAA,IAAA,GACnEE,IAAI;AAAAS,IAAAA,QAAA,EAEPhB,CAAAA,OAAO,gBACNiB,cAAA,CAACC,iCAAgB,EAAA;MAACrB,SAAS,EAAEc,iBAAM,CAACQ,OAAQ;MAAC,aAAY,EAAA,MAAA;KAAQ,CAAC,gBAElEF,cAAA,CAAA,MAAA,EAAA;MACEpB,SAAS,EAAEc,iBAAM,CAACT,IAAK;AACvB,MAAA,aAAA,EAAY,MAAM;MAClB,aAAaI,EAAAA,UAAU,EAAEJ,IAAK;AAAAc,MAAAA,QAAA,EAE7Bd,IAAAA;AAAI,KACD,CACP,eACDe,cAAA,CAACG,uBAAW,EAAA;MAACd,UAAU,EAAEA,UAAU,EAAEH,OAAQ;AAAAa,MAAAA,QAAA,EAAEb,OAAAA;AAAO,KAAc,CAAC,CAAA;AAAA,GAC/D,CAAC,CAAA;AAAA,CAEb,EAAC;AAEDV,UAAU,CAAC4B,WAAW,GAAG,YAAY;;;;"}
@@ -24,6 +24,8 @@ const iconBySymbol = {
24
24
  // True when a symbol has a glyph in the kit — callers with arbitrary token symbols guard
25
25
  // on this before rendering an icon, so tokens without art render no icon rather than crash.
26
26
  const isTokenIcon = symbol => symbol in iconBySymbol;
27
+
28
+ /** Resolves a token symbol to its glyph; symbols without art render nothing, so guard with `isTokenIcon` first. */
27
29
  const TokenIcon = _ref => {
28
30
  let {
29
31
  token,
@@ -1 +1 @@
1
- {"version":3,"file":"TokenIcon.cjs","sources":["../../../src/icons/TokenIcon.tsx"],"sourcesContent":["import type { SVGProps } from 'react'\nimport { TokenEth } from './components/token/TokenEth'\nimport { TokenSteth } from './components/token/TokenSteth'\nimport { TokenUsdc } from './components/token/TokenUsdc'\nimport { TokenUsdt } from './components/token/TokenUsdt'\nimport { TokenUsdy } from './components/token/TokenUsdy'\nimport { TokenWEth } from './components/token/TokenWEth'\nimport { TokenWsteth } from './components/token/TokenWsteth'\n\nexport type TokenIconSymbol =\n | 'ETH'\n | 'WETH'\n | 'stETH'\n | 'wstETH'\n | 'USDC'\n | 'USDT'\n | 'USDY'\n\nexport type TokenIconProps = SVGProps<SVGSVGElement> & {\n token: TokenIconSymbol\n}\n\nconst iconBySymbol = {\n ETH: TokenEth,\n WETH: TokenWEth,\n stETH: TokenSteth,\n wstETH: TokenWsteth,\n USDC: TokenUsdc,\n USDT: TokenUsdt,\n USDY: TokenUsdy,\n} as const\n\n// True when a symbol has a glyph in the kit — callers with arbitrary token symbols guard\n// on this before rendering an icon, so tokens without art render no icon rather than crash.\nexport const isTokenIcon = (symbol: string): symbol is TokenIconSymbol =>\n symbol in iconBySymbol\n\nexport const TokenIcon = ({ token, ...props }: TokenIconProps) => {\n const Icon = iconBySymbol[token]\n if (!Icon) return null\n return <Icon {...props} />\n}\n"],"names":["iconBySymbol","ETH","TokenEth","WETH","TokenWEth","stETH","TokenSteth","wstETH","TokenWsteth","USDC","TokenUsdc","USDT","TokenUsdt","USDY","TokenUsdy","isTokenIcon","symbol","TokenIcon","_ref","token","props","Icon","_jsx"],"mappings":";;;;;;;;;;;;;AAsBA,MAAMA,YAAY,GAAG;AACnBC,EAAAA,GAAG,EAAEC,iBAAQ;AACbC,EAAAA,IAAI,EAAEC,mBAAS;AACfC,EAAAA,KAAK,EAAEC,qBAAU;AACjBC,EAAAA,MAAM,EAAEC,uBAAW;AACnBC,EAAAA,IAAI,EAAEC,mBAAS;AACfC,EAAAA,IAAI,EAAEC,mBAAS;AACfC,EAAAA,IAAI,EAAEC,mBAAAA;AACR,CAAU,CAAA;;AAEV;AACA;MACaC,WAAW,GAAIC,MAAc,IACxCA,MAAM,IAAIhB,aAAY;AAEXiB,MAAAA,SAAS,GAAGC,IAAA,IAAyC;EAAA,IAAxC;IAAEC,KAAK;IAAE,GAAGC,KAAAA;AAAsB,GAAC,GAAAF,IAAA,CAAA;AAC3D,EAAA,MAAMG,IAAI,GAAGrB,YAAY,CAACmB,KAAK,CAAC,CAAA;AAChC,EAAA,IAAI,CAACE,IAAI,EAAE,OAAO,IAAI,CAAA;EACtB,oBAAOC,cAAA,CAACD,IAAI,EAAA;IAAA,GAAKD,KAAAA;AAAK,GAAG,CAAC,CAAA;AAC5B;;;;;"}
1
+ {"version":3,"file":"TokenIcon.cjs","sources":["../../../src/icons/TokenIcon.tsx"],"sourcesContent":["import type { SVGProps } from 'react'\nimport { TokenEth } from './components/token/TokenEth'\nimport { TokenSteth } from './components/token/TokenSteth'\nimport { TokenUsdc } from './components/token/TokenUsdc'\nimport { TokenUsdt } from './components/token/TokenUsdt'\nimport { TokenUsdy } from './components/token/TokenUsdy'\nimport { TokenWEth } from './components/token/TokenWEth'\nimport { TokenWsteth } from './components/token/TokenWsteth'\n\nexport type TokenIconSymbol =\n | 'ETH'\n | 'WETH'\n | 'stETH'\n | 'wstETH'\n | 'USDC'\n | 'USDT'\n | 'USDY'\n\nexport type TokenIconProps = SVGProps<SVGSVGElement> & {\n token: TokenIconSymbol\n}\n\nconst iconBySymbol = {\n ETH: TokenEth,\n WETH: TokenWEth,\n stETH: TokenSteth,\n wstETH: TokenWsteth,\n USDC: TokenUsdc,\n USDT: TokenUsdt,\n USDY: TokenUsdy,\n} as const\n\n// True when a symbol has a glyph in the kit — callers with arbitrary token symbols guard\n// on this before rendering an icon, so tokens without art render no icon rather than crash.\nexport const isTokenIcon = (symbol: string): symbol is TokenIconSymbol =>\n symbol in iconBySymbol\n\n/** Resolves a token symbol to its glyph; symbols without art render nothing, so guard with `isTokenIcon` first. */\nexport const TokenIcon = ({ token, ...props }: TokenIconProps) => {\n const Icon = iconBySymbol[token]\n if (!Icon) return null\n return <Icon {...props} />\n}\n"],"names":["iconBySymbol","ETH","TokenEth","WETH","TokenWEth","stETH","TokenSteth","wstETH","TokenWsteth","USDC","TokenUsdc","USDT","TokenUsdt","USDY","TokenUsdy","isTokenIcon","symbol","TokenIcon","_ref","token","props","Icon","_jsx"],"mappings":";;;;;;;;;;;;;AAsBA,MAAMA,YAAY,GAAG;AACnBC,EAAAA,GAAG,EAAEC,iBAAQ;AACbC,EAAAA,IAAI,EAAEC,mBAAS;AACfC,EAAAA,KAAK,EAAEC,qBAAU;AACjBC,EAAAA,MAAM,EAAEC,uBAAW;AACnBC,EAAAA,IAAI,EAAEC,mBAAS;AACfC,EAAAA,IAAI,EAAEC,mBAAS;AACfC,EAAAA,IAAI,EAAEC,mBAAAA;AACR,CAAU,CAAA;;AAEV;AACA;MACaC,WAAW,GAAIC,MAAc,IACxCA,MAAM,IAAIhB,aAAY;;AAExB;AACaiB,MAAAA,SAAS,GAAGC,IAAA,IAAyC;EAAA,IAAxC;IAAEC,KAAK;IAAE,GAAGC,KAAAA;AAAsB,GAAC,GAAAF,IAAA,CAAA;AAC3D,EAAA,MAAMG,IAAI,GAAGrB,YAAY,CAACmB,KAAK,CAAC,CAAA;AAChC,EAAA,IAAI,CAACE,IAAI,EAAE,OAAO,IAAI,CAAA;EACtB,oBAAOC,cAAA,CAACD,IAAI,EAAA;IAAA,GAAKD,KAAAA;AAAK,GAAG,CAAC,CAAA;AAC5B;;;;;"}
@@ -40,6 +40,8 @@ const Jazzicon = typeof ReactJazzicon__namespace.default === 'function' ? ReactJ
40
40
  const {
41
41
  jsNumberForAddress
42
42
  } = ReactJazzicon__namespace;
43
+
44
+ /** Jazzicon avatar for a wallet address. */
43
45
  const Identicon = /*#__PURE__*/react.forwardRef((_ref, ref) => {
44
46
  let {
45
47
  address,
@@ -1 +1 @@
1
- {"version":3,"file":"Identicon.cjs","sources":["../../../src/identicon/Identicon.tsx"],"sourcesContent":["import cn from 'classnames'\nimport { type ComponentPropsWithoutRef, forwardRef } from 'react'\nimport * as ReactJazzicon from 'react-jazzicon'\n\nimport styles from './Identicon.module.css'\n\nexport type IdenticonDataTestId = {\n root?: string\n}\n\nexport type IdenticonProps = ComponentPropsWithoutRef<'span'> & {\n address?: string\n size?: number\n dataTestId?: IdenticonDataTestId\n}\n\n// react-jazzicon's own `dist/index.js` re-exports its default via an\n// Object.defineProperty getter chaining to a nested submodule, rather than a\n// plain assignment. esbuild's CJS interop (used by Vite — including when this\n// package is only pulled in transitively, e.g. by a consuming app that has no\n// direct dependency on react-jazzicon) sets a self-referential `.default`\n// before copying the module's own properties, so that nested getter gets\n// shadowed: `ReactJazzicon.default` can end up being the raw CJS exports\n// object instead of the component. When that happens, the real component is\n// one level deeper, at `.default.default`.\nconst Jazzicon =\n typeof ReactJazzicon.default === 'function'\n ? ReactJazzicon.default\n : (\n ReactJazzicon.default as unknown as {\n default: typeof ReactJazzicon.default\n }\n ).default\nconst { jsNumberForAddress } = ReactJazzicon\n\nexport const Identicon = forwardRef<HTMLSpanElement, IdenticonProps>(\n ({ address, size = 40, className, style, dataTestId, ...rest }, ref) => (\n <span\n ref={ref}\n className={cn(styles.root, !address && styles.empty, className)}\n style={{ width: size, height: size, ...style }}\n aria-hidden='true'\n data-testid={dataTestId?.root}\n {...rest}\n >\n {address ? (\n <Jazzicon diameter={size} seed={jsNumberForAddress(address)} />\n ) : null}\n </span>\n ),\n)\n\nIdenticon.displayName = 'Identicon'\n"],"names":["Jazzicon","ReactJazzicon","default","jsNumberForAddress","Identicon","forwardRef","_ref","ref","address","size","className","style","dataTestId","rest","_jsx","cn","styles","root","empty","width","height","children","diameter","seed","displayName"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMA,QAAQ,GACZ,OAAOC,wBAAa,CAACC,OAAO,KAAK,UAAU,GACvCD,wBAAa,CAACC,OAAO,GAEnBD,wBAAa,CAACC,OAAO,CAGrBA,OAAO,CAAA;AACf,MAAM;AAAEC,EAAAA,kBAAAA;AAAmB,CAAC,GAAGF,wBAAa,CAAA;AAErC,MAAMG,SAAS,gBAAGC,gBAAU,CACjC,CAAAC,IAAA,EAAgEC,GAAG,KAAA;EAAA,IAAlE;IAAEC,OAAO;AAAEC,IAAAA,IAAI,GAAG,EAAE;IAAEC,SAAS;IAAEC,KAAK;IAAEC,UAAU;IAAE,GAAGC,IAAAA;AAAK,GAAC,GAAAP,IAAA,CAAA;AAAA,EAAA,oBAC5DQ,cAAA,CAAA,MAAA,EAAA;AACEP,IAAAA,GAAG,EAAEA,GAAI;AACTG,IAAAA,SAAS,EAAEK,EAAE,CAACC,gBAAM,CAACC,IAAI,EAAE,CAACT,OAAO,IAAIQ,gBAAM,CAACE,KAAK,EAAER,SAAS,CAAE;AAChEC,IAAAA,KAAK,EAAE;AAAEQ,MAAAA,KAAK,EAAEV,IAAI;AAAEW,MAAAA,MAAM,EAAEX,IAAI;MAAE,GAAGE,KAAAA;KAAQ;AAC/C,IAAA,aAAA,EAAY,MAAM;IAClB,aAAaC,EAAAA,UAAU,EAAEK,IAAK;AAAA,IAAA,GAC1BJ,IAAI;AAAAQ,IAAAA,QAAA,EAEPb,OAAO,gBACNM,cAAA,CAACd,QAAQ,EAAA;AAACsB,MAAAA,QAAQ,EAAEb,IAAK;MAACc,IAAI,EAAEpB,kBAAkB,CAACK,OAAO,CAAA;AAAE,KAAE,CAAC,GAC7D,IAAA;AAAI,GACJ,CAAC,CAAA;AAAA,CAEX,EAAC;AAEDJ,SAAS,CAACoB,WAAW,GAAG,WAAW;;;;"}
1
+ {"version":3,"file":"Identicon.cjs","sources":["../../../src/identicon/Identicon.tsx"],"sourcesContent":["import cn from 'classnames'\nimport { type ComponentPropsWithoutRef, forwardRef } from 'react'\nimport * as ReactJazzicon from 'react-jazzicon'\n\nimport styles from './Identicon.module.css'\n\nexport type IdenticonDataTestId = {\n root?: string\n}\n\nexport type IdenticonProps = ComponentPropsWithoutRef<'span'> & {\n /** Full address including `0x`; it seeds the pattern, so a trimmed one collapses distinct accounts onto the same picture. */\n address?: string\n /** Diameter in px. */\n size?: number\n dataTestId?: IdenticonDataTestId\n}\n\n// react-jazzicon's own `dist/index.js` re-exports its default via an\n// Object.defineProperty getter chaining to a nested submodule, rather than a\n// plain assignment. esbuild's CJS interop (used by Vite — including when this\n// package is only pulled in transitively, e.g. by a consuming app that has no\n// direct dependency on react-jazzicon) sets a self-referential `.default`\n// before copying the module's own properties, so that nested getter gets\n// shadowed: `ReactJazzicon.default` can end up being the raw CJS exports\n// object instead of the component. When that happens, the real component is\n// one level deeper, at `.default.default`.\nconst Jazzicon =\n typeof ReactJazzicon.default === 'function'\n ? ReactJazzicon.default\n : (\n ReactJazzicon.default as unknown as {\n default: typeof ReactJazzicon.default\n }\n ).default\nconst { jsNumberForAddress } = ReactJazzicon\n\n/** Jazzicon avatar for a wallet address. */\nexport const Identicon = forwardRef<HTMLSpanElement, IdenticonProps>(\n ({ address, size = 40, className, style, dataTestId, ...rest }, ref) => (\n <span\n ref={ref}\n className={cn(styles.root, !address && styles.empty, className)}\n style={{ width: size, height: size, ...style }}\n aria-hidden='true'\n data-testid={dataTestId?.root}\n {...rest}\n >\n {address ? (\n <Jazzicon diameter={size} seed={jsNumberForAddress(address)} />\n ) : null}\n </span>\n ),\n)\n\nIdenticon.displayName = 'Identicon'\n"],"names":["Jazzicon","ReactJazzicon","default","jsNumberForAddress","Identicon","forwardRef","_ref","ref","address","size","className","style","dataTestId","rest","_jsx","cn","styles","root","empty","width","height","children","diameter","seed","displayName"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMA,QAAQ,GACZ,OAAOC,wBAAa,CAACC,OAAO,KAAK,UAAU,GACvCD,wBAAa,CAACC,OAAO,GAEnBD,wBAAa,CAACC,OAAO,CAGrBA,OAAO,CAAA;AACf,MAAM;AAAEC,EAAAA,kBAAAA;AAAmB,CAAC,GAAGF,wBAAa,CAAA;;AAE5C;AACO,MAAMG,SAAS,gBAAGC,gBAAU,CACjC,CAAAC,IAAA,EAAgEC,GAAG,KAAA;EAAA,IAAlE;IAAEC,OAAO;AAAEC,IAAAA,IAAI,GAAG,EAAE;IAAEC,SAAS;IAAEC,KAAK;IAAEC,UAAU;IAAE,GAAGC,IAAAA;AAAK,GAAC,GAAAP,IAAA,CAAA;AAAA,EAAA,oBAC5DQ,cAAA,CAAA,MAAA,EAAA;AACEP,IAAAA,GAAG,EAAEA,GAAI;AACTG,IAAAA,SAAS,EAAEK,EAAE,CAACC,gBAAM,CAACC,IAAI,EAAE,CAACT,OAAO,IAAIQ,gBAAM,CAACE,KAAK,EAAER,SAAS,CAAE;AAChEC,IAAAA,KAAK,EAAE;AAAEQ,MAAAA,KAAK,EAAEV,IAAI;AAAEW,MAAAA,MAAM,EAAEX,IAAI;MAAE,GAAGE,KAAAA;KAAQ;AAC/C,IAAA,aAAA,EAAY,MAAM;IAClB,aAAaC,EAAAA,UAAU,EAAEK,IAAK;AAAA,IAAA,GAC1BJ,IAAI;AAAAQ,IAAAA,QAAA,EAEPb,OAAO,gBACNM,cAAA,CAACd,QAAQ,EAAA;AAACsB,MAAAA,QAAQ,EAAEb,IAAK;MAACc,IAAI,EAAEpB,kBAAkB,CAACK,OAAO,CAAA;AAAE,KAAE,CAAC,GAC7D,IAAA;AAAI,GACJ,CAAC,CAAA;AAAA,CAEX,EAAC;AAEDJ,SAAS,CAACoB,WAAW,GAAG,WAAW;;;;"}