@exromany/lido-app-ui 0.0.1-pre.3 → 0.0.1-pre.4

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 (501) hide show
  1. package/README.md +104 -19
  2. package/dist/README.md +104 -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 +57 -27
  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 +18 -27
  13. package/dist/cjs/button/Button.cjs.map +1 -1
  14. package/dist/cjs/button/ButtonContent.cjs +48 -0
  15. package/dist/cjs/button/ButtonContent.cjs.map +1 -0
  16. package/dist/cjs/button/LinkButton.cjs +17 -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/Counter.module.css.cjs +1 -1
  25. package/dist/cjs/counter/CounterSlot.cjs +19 -2
  26. package/dist/cjs/counter/CounterSlot.cjs.map +1 -1
  27. package/dist/cjs/counter/CounterSlot.module.css.cjs +1 -1
  28. package/dist/cjs/data-list/DataList.cjs +1 -0
  29. package/dist/cjs/data-list/DataList.cjs.map +1 -1
  30. package/dist/cjs/data-list/DataListRow.cjs +2 -0
  31. package/dist/cjs/data-list/DataListRow.cjs.map +1 -1
  32. package/dist/cjs/disclaimer/Disclaimer.cjs +10 -4
  33. package/dist/cjs/disclaimer/Disclaimer.cjs.map +1 -1
  34. package/dist/cjs/divider/Divider.cjs +5 -0
  35. package/dist/cjs/divider/Divider.cjs.map +1 -1
  36. package/dist/cjs/error-page/ErrorPage.cjs +14 -7
  37. package/dist/cjs/error-page/ErrorPage.cjs.map +1 -1
  38. package/dist/cjs/footer/Footer.cjs +10 -2
  39. package/dist/cjs/footer/Footer.cjs.map +1 -1
  40. package/dist/cjs/grid/Grid.cjs +7 -3
  41. package/dist/cjs/grid/Grid.cjs.map +1 -1
  42. package/dist/cjs/grid/Grid.module.css.cjs +1 -1
  43. package/dist/cjs/grid/GridItem.cjs +2 -0
  44. package/dist/cjs/grid/GridItem.cjs.map +1 -1
  45. package/dist/cjs/header/Header.cjs +10 -2
  46. package/dist/cjs/header/Header.cjs.map +1 -1
  47. package/dist/cjs/header/HeaderNav.cjs +33 -21
  48. package/dist/cjs/header/HeaderNav.cjs.map +1 -1
  49. package/dist/cjs/header/HeaderNav.module.css.cjs +1 -1
  50. package/dist/cjs/hidden/Hidden.cjs +10 -4
  51. package/dist/cjs/hidden/Hidden.cjs.map +1 -1
  52. package/dist/cjs/hidden/Hidden.module.css.cjs +1 -1
  53. package/dist/cjs/hooks/Portal.cjs +14 -11
  54. package/dist/cjs/hooks/Portal.cjs.map +1 -1
  55. package/dist/cjs/hooks/useBodyScrollLock.cjs +49 -13
  56. package/dist/cjs/hooks/useBodyScrollLock.cjs.map +1 -1
  57. package/dist/cjs/hooks/useEdgeFade.cjs +60 -0
  58. package/dist/cjs/hooks/useEdgeFade.cjs.map +1 -0
  59. package/dist/cjs/hooks/useEscape.cjs +8 -5
  60. package/dist/cjs/hooks/useEscape.cjs.map +1 -1
  61. package/dist/cjs/hooks/useFocusTrap.cjs +61 -24
  62. package/dist/cjs/hooks/useFocusTrap.cjs.map +1 -1
  63. package/dist/cjs/hooks/useHideOthers.cjs +51 -0
  64. package/dist/cjs/hooks/useHideOthers.cjs.map +1 -0
  65. package/dist/cjs/hooks/useOutsideClick.cjs +31 -4
  66. package/dist/cjs/hooks/useOutsideClick.cjs.map +1 -1
  67. package/dist/cjs/icon-button/CloseButton.cjs.map +1 -1
  68. package/dist/cjs/icon-button/IconButton.cjs +9 -5
  69. package/dist/cjs/icon-button/IconButton.cjs.map +1 -1
  70. package/dist/cjs/icons/TokenIcon.cjs +2 -0
  71. package/dist/cjs/icons/TokenIcon.cjs.map +1 -1
  72. package/dist/cjs/identicon/Identicon.cjs +2 -0
  73. package/dist/cjs/identicon/Identicon.cjs.map +1 -1
  74. package/dist/cjs/index.cjs +27 -4
  75. package/dist/cjs/index.cjs.map +1 -1
  76. package/dist/cjs/index.css +20 -4
  77. package/dist/cjs/info-tooltip/InfoTooltip.cjs +4 -4
  78. package/dist/cjs/info-tooltip/InfoTooltip.cjs.map +1 -1
  79. package/dist/cjs/info-tooltip/InfoTooltip.module.css.cjs +1 -1
  80. package/dist/cjs/input/Input.cjs +1 -0
  81. package/dist/cjs/input/Input.cjs.map +1 -1
  82. package/dist/cjs/link-provider/Anchor.cjs +39 -5
  83. package/dist/cjs/link-provider/Anchor.cjs.map +1 -1
  84. package/dist/cjs/link-provider/LinkProvider.cjs +1 -1
  85. package/dist/cjs/link-provider/LinkProvider.cjs.map +1 -1
  86. package/dist/cjs/logo/Logo.cjs +8 -0
  87. package/dist/cjs/logo/Logo.cjs.map +1 -1
  88. package/dist/cjs/message-box/MessageBox.cjs +1 -0
  89. package/dist/cjs/message-box/MessageBox.cjs.map +1 -1
  90. package/dist/cjs/modal/Modal.cjs +71 -9
  91. package/dist/cjs/modal/Modal.cjs.map +1 -1
  92. package/dist/cjs/nav-link/NavLink.cjs +12 -6
  93. package/dist/cjs/nav-link/NavLink.cjs.map +1 -1
  94. package/dist/cjs/notification/Notification.cjs +12 -6
  95. package/dist/cjs/notification/Notification.cjs.map +1 -1
  96. package/dist/cjs/pagination/Pagination.cjs +11 -6
  97. package/dist/cjs/pagination/Pagination.cjs.map +1 -1
  98. package/dist/cjs/popover/Popover.cjs +71 -15
  99. package/dist/cjs/popover/Popover.cjs.map +1 -1
  100. package/dist/cjs/radio-button/RadioButton.cjs +1 -0
  101. package/dist/cjs/radio-button/RadioButton.cjs.map +1 -1
  102. package/dist/cjs/rich-input/RichInput.cjs +40 -41
  103. package/dist/cjs/rich-input/RichInput.cjs.map +1 -1
  104. package/dist/cjs/rich-input/RichInput.module.css.cjs +1 -1
  105. package/dist/cjs/section-title/SectionTitle.cjs +1 -0
  106. package/dist/cjs/section-title/SectionTitle.cjs.map +1 -1
  107. package/dist/cjs/segmented-control/SegmentedControl.cjs +1 -0
  108. package/dist/cjs/segmented-control/SegmentedControl.cjs.map +1 -1
  109. package/dist/cjs/segmented-control/SegmentedControlCard.cjs +1 -0
  110. package/dist/cjs/segmented-control/SegmentedControlCard.cjs.map +1 -1
  111. package/dist/cjs/sidebar/Sidebar.cjs +11 -4
  112. package/dist/cjs/sidebar/Sidebar.cjs.map +1 -1
  113. package/dist/cjs/sidebar/SidebarToggle.cjs +1 -1
  114. package/dist/cjs/sidebar/SidebarToggle.cjs.map +1 -1
  115. package/dist/cjs/skeleton/Skeleton.cjs +18 -20
  116. package/dist/cjs/skeleton/Skeleton.cjs.map +1 -1
  117. package/dist/cjs/slider/Slider.cjs +1 -0
  118. package/dist/cjs/slider/Slider.cjs.map +1 -1
  119. package/dist/cjs/small-card/SmallCard.cjs +6 -2
  120. package/dist/cjs/small-card/SmallCard.cjs.map +1 -1
  121. package/dist/cjs/stack/Stack.cjs +20 -11
  122. package/dist/cjs/stack/Stack.cjs.map +1 -1
  123. package/dist/cjs/stack/Stack.module.css.cjs +1 -1
  124. package/dist/cjs/stat-item/StatItem.cjs +1 -0
  125. package/dist/cjs/stat-item/StatItem.cjs.map +1 -1
  126. package/dist/cjs/switch/Switch.cjs +1 -0
  127. package/dist/cjs/switch/Switch.cjs.map +1 -1
  128. package/dist/cjs/tabs/Tabs.cjs +1 -0
  129. package/dist/cjs/tabs/Tabs.cjs.map +1 -1
  130. package/dist/cjs/tag/Tag.cjs +73 -8
  131. package/dist/cjs/tag/Tag.cjs.map +1 -1
  132. package/dist/cjs/tag/Tag.module.css.cjs +1 -1
  133. package/dist/cjs/text-link/TextLink.cjs +9 -14
  134. package/dist/cjs/text-link/TextLink.cjs.map +1 -1
  135. package/dist/cjs/text-link/TextLink.module.css.cjs +1 -1
  136. package/dist/cjs/theme-switcher/ThemeSwitcher.cjs +13 -5
  137. package/dist/cjs/theme-switcher/ThemeSwitcher.cjs.map +1 -1
  138. package/dist/cjs/theme-switcher/ThemeSwitcher.module.css.cjs +6 -0
  139. package/dist/cjs/theme-switcher/ThemeSwitcher.module.css.cjs.map +1 -0
  140. package/dist/cjs/token-amount/TokenAmount.cjs +1 -0
  141. package/dist/cjs/token-amount/TokenAmount.cjs.map +1 -1
  142. package/dist/cjs/token-selector/TokenSelector.cjs +56 -64
  143. package/dist/cjs/token-selector/TokenSelector.cjs.map +1 -1
  144. package/dist/cjs/tooltip/Tooltip.cjs +42 -27
  145. package/dist/cjs/tooltip/Tooltip.cjs.map +1 -1
  146. package/dist/cjs/tx-status/TxStatus.cjs +2 -0
  147. package/dist/cjs/tx-status/TxStatus.cjs.map +1 -1
  148. package/dist/cjs/typography/Typography.cjs +23 -8
  149. package/dist/cjs/typography/Typography.cjs.map +1 -1
  150. package/dist/cjs/typography/Typography.module.css.cjs +1 -1
  151. package/dist/cjs/utils/ActionElement.cjs +2 -13
  152. package/dist/cjs/utils/ActionElement.cjs.map +1 -1
  153. package/dist/cjs/utils/breakpoints.cjs +25 -0
  154. package/dist/cjs/utils/breakpoints.cjs.map +1 -0
  155. package/dist/cjs/utils/joinAriaLabel.cjs +8 -0
  156. package/dist/cjs/utils/joinAriaLabel.cjs.map +1 -0
  157. package/dist/cjs/utils/responsive.cjs +19 -30
  158. package/dist/cjs/utils/responsive.cjs.map +1 -1
  159. package/dist/esm/accordion/Accordion.mjs +1 -0
  160. package/dist/esm/accordion/Accordion.mjs.map +1 -1
  161. package/dist/esm/badge/Badge.mjs +1 -0
  162. package/dist/esm/badge/Badge.mjs.map +1 -1
  163. package/dist/esm/banner/Banner.mjs +1 -0
  164. package/dist/esm/banner/Banner.mjs.map +1 -1
  165. package/dist/esm/breadcrumbs/Breadcrumbs.mjs +58 -28
  166. package/dist/esm/breadcrumbs/Breadcrumbs.mjs.map +1 -1
  167. package/dist/esm/breadcrumbs/Breadcrumbs.module.css.mjs +1 -1
  168. package/dist/esm/button/Button.mjs +19 -28
  169. package/dist/esm/button/Button.mjs.map +1 -1
  170. package/dist/esm/button/ButtonContent.mjs +44 -0
  171. package/dist/esm/button/ButtonContent.mjs.map +1 -0
  172. package/dist/esm/button/LinkButton.mjs +13 -0
  173. package/dist/esm/button/LinkButton.mjs.map +1 -0
  174. package/dist/esm/card/Card.mjs +1 -0
  175. package/dist/esm/card/Card.mjs.map +1 -1
  176. package/dist/esm/checkbox/Checkbox.mjs +1 -0
  177. package/dist/esm/checkbox/Checkbox.mjs.map +1 -1
  178. package/dist/esm/counter/Counter.mjs +6 -2
  179. package/dist/esm/counter/Counter.mjs.map +1 -1
  180. package/dist/esm/counter/Counter.module.css.mjs +1 -1
  181. package/dist/esm/counter/CounterSlot.mjs +19 -3
  182. package/dist/esm/counter/CounterSlot.mjs.map +1 -1
  183. package/dist/esm/counter/CounterSlot.module.css.mjs +1 -1
  184. package/dist/esm/data-list/DataList.mjs +1 -0
  185. package/dist/esm/data-list/DataList.mjs.map +1 -1
  186. package/dist/esm/data-list/DataListRow.mjs +2 -0
  187. package/dist/esm/data-list/DataListRow.mjs.map +1 -1
  188. package/dist/esm/disclaimer/Disclaimer.mjs +10 -4
  189. package/dist/esm/disclaimer/Disclaimer.mjs.map +1 -1
  190. package/dist/esm/divider/Divider.mjs +5 -0
  191. package/dist/esm/divider/Divider.mjs.map +1 -1
  192. package/dist/esm/error-page/ErrorPage.mjs +14 -7
  193. package/dist/esm/error-page/ErrorPage.mjs.map +1 -1
  194. package/dist/esm/footer/Footer.mjs +10 -2
  195. package/dist/esm/footer/Footer.mjs.map +1 -1
  196. package/dist/esm/grid/Grid.mjs +8 -4
  197. package/dist/esm/grid/Grid.mjs.map +1 -1
  198. package/dist/esm/grid/Grid.module.css.mjs +1 -1
  199. package/dist/esm/grid/GridItem.mjs +2 -0
  200. package/dist/esm/grid/GridItem.mjs.map +1 -1
  201. package/dist/esm/header/Header.mjs +10 -2
  202. package/dist/esm/header/Header.mjs.map +1 -1
  203. package/dist/esm/header/HeaderNav.mjs +34 -22
  204. package/dist/esm/header/HeaderNav.mjs.map +1 -1
  205. package/dist/esm/header/HeaderNav.module.css.mjs +1 -1
  206. package/dist/esm/hidden/Hidden.mjs +10 -4
  207. package/dist/esm/hidden/Hidden.mjs.map +1 -1
  208. package/dist/esm/hidden/Hidden.module.css.mjs +1 -1
  209. package/dist/esm/hooks/Portal.mjs +16 -13
  210. package/dist/esm/hooks/Portal.mjs.map +1 -1
  211. package/dist/esm/hooks/useBodyScrollLock.mjs +49 -13
  212. package/dist/esm/hooks/useBodyScrollLock.mjs.map +1 -1
  213. package/dist/esm/hooks/useEdgeFade.mjs +56 -0
  214. package/dist/esm/hooks/useEdgeFade.mjs.map +1 -0
  215. package/dist/esm/hooks/useEscape.mjs +8 -5
  216. package/dist/esm/hooks/useEscape.mjs.map +1 -1
  217. package/dist/esm/hooks/useFocusTrap.mjs +61 -24
  218. package/dist/esm/hooks/useFocusTrap.mjs.map +1 -1
  219. package/dist/esm/hooks/useHideOthers.mjs +47 -0
  220. package/dist/esm/hooks/useHideOthers.mjs.map +1 -0
  221. package/dist/esm/hooks/useOutsideClick.mjs +31 -4
  222. package/dist/esm/hooks/useOutsideClick.mjs.map +1 -1
  223. package/dist/esm/icon-button/CloseButton.mjs.map +1 -1
  224. package/dist/esm/icon-button/IconButton.mjs +9 -5
  225. package/dist/esm/icon-button/IconButton.mjs.map +1 -1
  226. package/dist/esm/icons/TokenIcon.mjs +2 -0
  227. package/dist/esm/icons/TokenIcon.mjs.map +1 -1
  228. package/dist/esm/identicon/Identicon.mjs +2 -0
  229. package/dist/esm/identicon/Identicon.mjs.map +1 -1
  230. package/dist/esm/index.css +20 -4
  231. package/dist/esm/index.mjs +10 -2
  232. package/dist/esm/index.mjs.map +1 -1
  233. package/dist/esm/info-tooltip/InfoTooltip.mjs +4 -4
  234. package/dist/esm/info-tooltip/InfoTooltip.mjs.map +1 -1
  235. package/dist/esm/info-tooltip/InfoTooltip.module.css.mjs +1 -1
  236. package/dist/esm/input/Input.mjs +1 -0
  237. package/dist/esm/input/Input.mjs.map +1 -1
  238. package/dist/esm/link-provider/Anchor.mjs +39 -6
  239. package/dist/esm/link-provider/Anchor.mjs.map +1 -1
  240. package/dist/esm/link-provider/LinkProvider.mjs +1 -1
  241. package/dist/esm/link-provider/LinkProvider.mjs.map +1 -1
  242. package/dist/esm/logo/Logo.mjs +9 -1
  243. package/dist/esm/logo/Logo.mjs.map +1 -1
  244. package/dist/esm/message-box/MessageBox.mjs +1 -0
  245. package/dist/esm/message-box/MessageBox.mjs.map +1 -1
  246. package/dist/esm/modal/Modal.mjs +72 -11
  247. package/dist/esm/modal/Modal.mjs.map +1 -1
  248. package/dist/esm/nav-link/NavLink.mjs +13 -7
  249. package/dist/esm/nav-link/NavLink.mjs.map +1 -1
  250. package/dist/esm/notification/Notification.mjs +13 -7
  251. package/dist/esm/notification/Notification.mjs.map +1 -1
  252. package/dist/esm/pagination/Pagination.mjs +12 -7
  253. package/dist/esm/pagination/Pagination.mjs.map +1 -1
  254. package/dist/esm/popover/Popover.mjs +72 -16
  255. package/dist/esm/popover/Popover.mjs.map +1 -1
  256. package/dist/esm/radio-button/RadioButton.mjs +1 -0
  257. package/dist/esm/radio-button/RadioButton.mjs.map +1 -1
  258. package/dist/esm/rich-input/RichInput.mjs +41 -42
  259. package/dist/esm/rich-input/RichInput.mjs.map +1 -1
  260. package/dist/esm/rich-input/RichInput.module.css.mjs +1 -1
  261. package/dist/esm/section-title/SectionTitle.mjs +1 -0
  262. package/dist/esm/section-title/SectionTitle.mjs.map +1 -1
  263. package/dist/esm/segmented-control/SegmentedControl.mjs +1 -0
  264. package/dist/esm/segmented-control/SegmentedControl.mjs.map +1 -1
  265. package/dist/esm/segmented-control/SegmentedControlCard.mjs +1 -0
  266. package/dist/esm/segmented-control/SegmentedControlCard.mjs.map +1 -1
  267. package/dist/esm/sidebar/Sidebar.mjs +11 -4
  268. package/dist/esm/sidebar/Sidebar.mjs.map +1 -1
  269. package/dist/esm/sidebar/SidebarToggle.mjs +1 -1
  270. package/dist/esm/sidebar/SidebarToggle.mjs.map +1 -1
  271. package/dist/esm/skeleton/Skeleton.mjs +18 -20
  272. package/dist/esm/skeleton/Skeleton.mjs.map +1 -1
  273. package/dist/esm/slider/Slider.mjs +1 -0
  274. package/dist/esm/slider/Slider.mjs.map +1 -1
  275. package/dist/esm/small-card/SmallCard.mjs +6 -2
  276. package/dist/esm/small-card/SmallCard.mjs.map +1 -1
  277. package/dist/esm/stack/Stack.mjs +21 -13
  278. package/dist/esm/stack/Stack.mjs.map +1 -1
  279. package/dist/esm/stack/Stack.module.css.mjs +1 -1
  280. package/dist/esm/stat-item/StatItem.mjs +1 -0
  281. package/dist/esm/stat-item/StatItem.mjs.map +1 -1
  282. package/dist/esm/switch/Switch.mjs +1 -0
  283. package/dist/esm/switch/Switch.mjs.map +1 -1
  284. package/dist/esm/tabs/Tabs.mjs +1 -0
  285. package/dist/esm/tabs/Tabs.mjs.map +1 -1
  286. package/dist/esm/tag/Tag.mjs +74 -9
  287. package/dist/esm/tag/Tag.mjs.map +1 -1
  288. package/dist/esm/tag/Tag.module.css.mjs +1 -1
  289. package/dist/esm/text-link/TextLink.mjs +9 -14
  290. package/dist/esm/text-link/TextLink.mjs.map +1 -1
  291. package/dist/esm/text-link/TextLink.module.css.mjs +1 -1
  292. package/dist/esm/theme-switcher/ThemeSwitcher.mjs +14 -6
  293. package/dist/esm/theme-switcher/ThemeSwitcher.mjs.map +1 -1
  294. package/dist/esm/theme-switcher/ThemeSwitcher.module.css.mjs +4 -0
  295. package/dist/esm/theme-switcher/ThemeSwitcher.module.css.mjs.map +1 -0
  296. package/dist/esm/token-amount/TokenAmount.mjs +1 -0
  297. package/dist/esm/token-amount/TokenAmount.mjs.map +1 -1
  298. package/dist/esm/token-selector/TokenSelector.mjs +58 -66
  299. package/dist/esm/token-selector/TokenSelector.mjs.map +1 -1
  300. package/dist/esm/tooltip/Tooltip.mjs +42 -27
  301. package/dist/esm/tooltip/Tooltip.mjs.map +1 -1
  302. package/dist/esm/tx-status/TxStatus.mjs +2 -0
  303. package/dist/esm/tx-status/TxStatus.mjs.map +1 -1
  304. package/dist/esm/typography/Typography.mjs +21 -9
  305. package/dist/esm/typography/Typography.mjs.map +1 -1
  306. package/dist/esm/typography/Typography.module.css.mjs +1 -1
  307. package/dist/esm/utils/ActionElement.mjs +2 -13
  308. package/dist/esm/utils/ActionElement.mjs.map +1 -1
  309. package/dist/esm/utils/breakpoints.mjs +18 -0
  310. package/dist/esm/utils/breakpoints.mjs.map +1 -0
  311. package/dist/esm/utils/joinAriaLabel.mjs +4 -0
  312. package/dist/esm/utils/joinAriaLabel.mjs.map +1 -0
  313. package/dist/esm/utils/responsive.mjs +17 -27
  314. package/dist/esm/utils/responsive.mjs.map +1 -1
  315. package/dist/index.css +20 -4
  316. package/dist/styles/breakpoints.css +10 -12
  317. package/dist/styles/typography-mixins.css +22 -4
  318. package/dist/types/accordion/Accordion.d.ts +3 -0
  319. package/dist/types/accordion/Accordion.d.ts.map +1 -1
  320. package/dist/types/badge/Badge.d.ts +1 -0
  321. package/dist/types/badge/Badge.d.ts.map +1 -1
  322. package/dist/types/banner/Banner.d.ts +1 -0
  323. package/dist/types/banner/Banner.d.ts.map +1 -1
  324. package/dist/types/breadcrumbs/Breadcrumbs.d.ts +17 -1
  325. package/dist/types/breadcrumbs/Breadcrumbs.d.ts.map +1 -1
  326. package/dist/types/breadcrumbs/index.d.ts +1 -1
  327. package/dist/types/breadcrumbs/index.d.ts.map +1 -1
  328. package/dist/types/button/Button.d.ts +4 -30
  329. package/dist/types/button/Button.d.ts.map +1 -1
  330. package/dist/types/button/ButtonContent.d.ts +9 -0
  331. package/dist/types/button/ButtonContent.d.ts.map +1 -0
  332. package/dist/types/button/LinkButton.d.ts +11 -0
  333. package/dist/types/button/LinkButton.d.ts.map +1 -0
  334. package/dist/types/button/index.d.ts +3 -1
  335. package/dist/types/button/index.d.ts.map +1 -1
  336. package/dist/types/button/types.d.ts +30 -0
  337. package/dist/types/button/types.d.ts.map +1 -0
  338. package/dist/types/card/Card.d.ts +1 -0
  339. package/dist/types/card/Card.d.ts.map +1 -1
  340. package/dist/types/checkbox/Checkbox.d.ts +3 -0
  341. package/dist/types/checkbox/Checkbox.d.ts.map +1 -1
  342. package/dist/types/colors/colorTokens.d.ts.map +1 -1
  343. package/dist/types/counter/Counter.d.ts +6 -2
  344. package/dist/types/counter/Counter.d.ts.map +1 -1
  345. package/dist/types/counter/CounterSlot.d.ts +3 -0
  346. package/dist/types/counter/CounterSlot.d.ts.map +1 -1
  347. package/dist/types/data-list/DataList.d.ts +1 -0
  348. package/dist/types/data-list/DataList.d.ts.map +1 -1
  349. package/dist/types/data-list/DataListRow.d.ts +1 -0
  350. package/dist/types/data-list/DataListRow.d.ts.map +1 -1
  351. package/dist/types/disclaimer/Disclaimer.d.ts +9 -2
  352. package/dist/types/disclaimer/Disclaimer.d.ts.map +1 -1
  353. package/dist/types/divider/Divider.d.ts +5 -0
  354. package/dist/types/divider/Divider.d.ts.map +1 -1
  355. package/dist/types/divider/index.d.ts +1 -1
  356. package/dist/types/divider/index.d.ts.map +1 -1
  357. package/dist/types/error-page/ErrorPage.d.ts +17 -4
  358. package/dist/types/error-page/ErrorPage.d.ts.map +1 -1
  359. package/dist/types/footer/Footer.d.ts +17 -2
  360. package/dist/types/footer/Footer.d.ts.map +1 -1
  361. package/dist/types/footer/index.d.ts +1 -1
  362. package/dist/types/footer/index.d.ts.map +1 -1
  363. package/dist/types/grid/Grid.d.ts +21 -22
  364. package/dist/types/grid/Grid.d.ts.map +1 -1
  365. package/dist/types/grid/GridItem.d.ts +14 -10
  366. package/dist/types/grid/GridItem.d.ts.map +1 -1
  367. package/dist/types/grid/index.d.ts +2 -2
  368. package/dist/types/grid/index.d.ts.map +1 -1
  369. package/dist/types/header/Header.d.ts +15 -2
  370. package/dist/types/header/Header.d.ts.map +1 -1
  371. package/dist/types/header/HeaderNav.d.ts +10 -2
  372. package/dist/types/header/HeaderNav.d.ts.map +1 -1
  373. package/dist/types/header/index.d.ts +2 -2
  374. package/dist/types/header/index.d.ts.map +1 -1
  375. package/dist/types/hidden/Hidden.d.ts +19 -5
  376. package/dist/types/hidden/Hidden.d.ts.map +1 -1
  377. package/dist/types/hidden/index.d.ts +1 -1
  378. package/dist/types/hidden/index.d.ts.map +1 -1
  379. package/dist/types/hooks/Portal.d.ts +2 -5
  380. package/dist/types/hooks/Portal.d.ts.map +1 -1
  381. package/dist/types/hooks/index.d.ts +2 -0
  382. package/dist/types/hooks/index.d.ts.map +1 -1
  383. package/dist/types/hooks/useBodyScrollLock.d.ts +4 -2
  384. package/dist/types/hooks/useBodyScrollLock.d.ts.map +1 -1
  385. package/dist/types/hooks/useEdgeFade.d.ts +7 -0
  386. package/dist/types/hooks/useEdgeFade.d.ts.map +1 -0
  387. package/dist/types/hooks/useEscape.d.ts +4 -2
  388. package/dist/types/hooks/useEscape.d.ts.map +1 -1
  389. package/dist/types/hooks/useFocusTrap.d.ts +7 -3
  390. package/dist/types/hooks/useFocusTrap.d.ts.map +1 -1
  391. package/dist/types/hooks/useHideOthers.d.ts +3 -0
  392. package/dist/types/hooks/useHideOthers.d.ts.map +1 -0
  393. package/dist/types/hooks/useOutsideClick.d.ts +4 -2
  394. package/dist/types/hooks/useOutsideClick.d.ts.map +1 -1
  395. package/dist/types/icon-button/CloseButton.d.ts +3 -3
  396. package/dist/types/icon-button/CloseButton.d.ts.map +1 -1
  397. package/dist/types/icon-button/IconButton.d.ts +4 -25
  398. package/dist/types/icon-button/IconButton.d.ts.map +1 -1
  399. package/dist/types/icon-button/index.d.ts +1 -1
  400. package/dist/types/icon-button/index.d.ts.map +1 -1
  401. package/dist/types/icon-button/types.d.ts +26 -0
  402. package/dist/types/icon-button/types.d.ts.map +1 -0
  403. package/dist/types/icons/TokenIcon.d.ts +1 -0
  404. package/dist/types/icons/TokenIcon.d.ts.map +1 -1
  405. package/dist/types/identicon/Identicon.d.ts +5 -0
  406. package/dist/types/identicon/Identicon.d.ts.map +1 -1
  407. package/dist/types/index.d.ts +3 -0
  408. package/dist/types/index.d.ts.map +1 -1
  409. package/dist/types/info-tooltip/InfoTooltip.d.ts +4 -1
  410. package/dist/types/info-tooltip/InfoTooltip.d.ts.map +1 -1
  411. package/dist/types/input/Input.d.ts +1 -0
  412. package/dist/types/input/Input.d.ts.map +1 -1
  413. package/dist/types/link-provider/Anchor.d.ts +18 -1
  414. package/dist/types/link-provider/Anchor.d.ts.map +1 -1
  415. package/dist/types/link-provider/LinkProvider.d.ts +8 -2
  416. package/dist/types/link-provider/LinkProvider.d.ts.map +1 -1
  417. package/dist/types/link-provider/index.d.ts +1 -1
  418. package/dist/types/link-provider/index.d.ts.map +1 -1
  419. package/dist/types/logo/Logo.d.ts +19 -5
  420. package/dist/types/logo/Logo.d.ts.map +1 -1
  421. package/dist/types/logo/index.d.ts +1 -1
  422. package/dist/types/logo/index.d.ts.map +1 -1
  423. package/dist/types/message-box/MessageBox.d.ts +3 -0
  424. package/dist/types/message-box/MessageBox.d.ts.map +1 -1
  425. package/dist/types/modal/Modal.d.ts +21 -3
  426. package/dist/types/modal/Modal.d.ts.map +1 -1
  427. package/dist/types/modal/index.d.ts +2 -2
  428. package/dist/types/modal/index.d.ts.map +1 -1
  429. package/dist/types/nav-link/NavLink.d.ts +17 -0
  430. package/dist/types/nav-link/NavLink.d.ts.map +1 -1
  431. package/dist/types/nav-link/index.d.ts +1 -1
  432. package/dist/types/nav-link/index.d.ts.map +1 -1
  433. package/dist/types/notification/Notification.d.ts +7 -2
  434. package/dist/types/notification/Notification.d.ts.map +1 -1
  435. package/dist/types/pagination/Pagination.d.ts +3 -0
  436. package/dist/types/pagination/Pagination.d.ts.map +1 -1
  437. package/dist/types/popover/Popover.d.ts +32 -4
  438. package/dist/types/popover/Popover.d.ts.map +1 -1
  439. package/dist/types/popover/index.d.ts +1 -1
  440. package/dist/types/popover/index.d.ts.map +1 -1
  441. package/dist/types/radio-button/RadioButton.d.ts +3 -0
  442. package/dist/types/radio-button/RadioButton.d.ts.map +1 -1
  443. package/dist/types/rich-input/RichInput.d.ts +14 -2
  444. package/dist/types/rich-input/RichInput.d.ts.map +1 -1
  445. package/dist/types/section-title/SectionTitle.d.ts +1 -0
  446. package/dist/types/section-title/SectionTitle.d.ts.map +1 -1
  447. package/dist/types/segmented-control/SegmentedControl.d.ts +1 -0
  448. package/dist/types/segmented-control/SegmentedControl.d.ts.map +1 -1
  449. package/dist/types/segmented-control/SegmentedControlCard.d.ts +1 -0
  450. package/dist/types/segmented-control/SegmentedControlCard.d.ts.map +1 -1
  451. package/dist/types/sidebar/Sidebar.d.ts +2 -2
  452. package/dist/types/sidebar/Sidebar.d.ts.map +1 -1
  453. package/dist/types/sidebar/SidebarToggle.d.ts +4 -4
  454. package/dist/types/sidebar/SidebarToggle.d.ts.map +1 -1
  455. package/dist/types/skeleton/Skeleton.d.ts +17 -3
  456. package/dist/types/skeleton/Skeleton.d.ts.map +1 -1
  457. package/dist/types/slider/Slider.d.ts +1 -0
  458. package/dist/types/slider/Slider.d.ts.map +1 -1
  459. package/dist/types/small-card/SmallCard.d.ts +16 -3
  460. package/dist/types/small-card/SmallCard.d.ts.map +1 -1
  461. package/dist/types/stack/Stack.d.ts +21 -16
  462. package/dist/types/stack/Stack.d.ts.map +1 -1
  463. package/dist/types/stack/index.d.ts +1 -1
  464. package/dist/types/stack/index.d.ts.map +1 -1
  465. package/dist/types/stat-item/StatItem.d.ts +6 -0
  466. package/dist/types/stat-item/StatItem.d.ts.map +1 -1
  467. package/dist/types/switch/Switch.d.ts +3 -0
  468. package/dist/types/switch/Switch.d.ts.map +1 -1
  469. package/dist/types/tabs/Tabs.d.ts +1 -0
  470. package/dist/types/tabs/Tabs.d.ts.map +1 -1
  471. package/dist/types/tag/Tag.d.ts +34 -4
  472. package/dist/types/tag/Tag.d.ts.map +1 -1
  473. package/dist/types/text-link/TextLink.d.ts +21 -4
  474. package/dist/types/text-link/TextLink.d.ts.map +1 -1
  475. package/dist/types/text-link/index.d.ts +1 -1
  476. package/dist/types/text-link/index.d.ts.map +1 -1
  477. package/dist/types/theme-switcher/ThemeSwitcher.d.ts +10 -4
  478. package/dist/types/theme-switcher/ThemeSwitcher.d.ts.map +1 -1
  479. package/dist/types/token-amount/TokenAmount.d.ts +1 -0
  480. package/dist/types/token-amount/TokenAmount.d.ts.map +1 -1
  481. package/dist/types/token-selector/TokenSelector.d.ts +5 -1
  482. package/dist/types/token-selector/TokenSelector.d.ts.map +1 -1
  483. package/dist/types/tooltip/Tooltip.d.ts +2 -0
  484. package/dist/types/tooltip/Tooltip.d.ts.map +1 -1
  485. package/dist/types/tx-status/TxStatus.d.ts +3 -0
  486. package/dist/types/tx-status/TxStatus.d.ts.map +1 -1
  487. package/dist/types/typography/Typography.d.ts +18 -5
  488. package/dist/types/typography/Typography.d.ts.map +1 -1
  489. package/dist/types/utils/ActionElement.d.ts +14 -4
  490. package/dist/types/utils/ActionElement.d.ts.map +1 -1
  491. package/dist/types/utils/breakpoints.d.ts +15 -0
  492. package/dist/types/utils/breakpoints.d.ts.map +1 -0
  493. package/dist/types/utils/index.d.ts +7 -3
  494. package/dist/types/utils/index.d.ts.map +1 -1
  495. package/dist/types/utils/joinAriaLabel.d.ts +2 -0
  496. package/dist/types/utils/joinAriaLabel.d.ts.map +1 -0
  497. package/dist/types/utils/polymorphic.d.ts +15 -0
  498. package/dist/types/utils/polymorphic.d.ts.map +1 -0
  499. package/dist/types/utils/responsive.d.ts +25 -14
  500. package/dist/types/utils/responsive.d.ts.map +1 -1
  501. package/package.json +7 -3
package/README.md CHANGED
@@ -28,13 +28,21 @@ function Widget() {
28
28
  }
29
29
  ```
30
30
 
31
- Theme providers (`ThemeProvider`, `CookieThemeProvider`) are re-exported from `@lidofinance/lido-shared-ui`. The color tokens follow the `data-lido-theme` attribute they set, so switching to the dark theme restyles these components. `ThemeSwitcher` is the app-ui-styled theme toggle, since the shared `ThemeToggler` relies on `--lido-ui-*` tokens that app-ui doesn't define.
31
+ Theme providers (`ThemeProvider`, `CookieThemeProvider`) are re-exported from `@lidofinance/lido-shared-ui`. The color tokens follow the `data-lido-theme` attribute they set, so switching to the dark theme restyles these components. `ThemeSwitcher` is the app-ui-styled theme toggle, since the shared `ThemeToggler` relies on `--lido-ui-*` tokens that app-ui doesn't define. `ThemeSwitcher` needs `CookieThemeProvider`; the static `ThemeProvider` has no toggle, so the switcher renders but clicking does nothing. In SSR apps pass the request cookie as `initialThemeName` so the label is right on first paint (the icon already follows `data-lido-theme` in CSS).
32
32
 
33
33
  ## Router links
34
34
 
35
- Link components (`TextLink`, `SmallCard`) render a plain `<a>` by default. Wrap the app in `LinkProvider` to route in-app hrefs through your router's link component; `externalComponent` does the same for absolute URLs. Hash links, `download` links and links with a non-`_self` `target` always stay a plain `<a>`.
35
+ Every app-ui link (`TextLink`, `NavLink`, `Button` and `IconButton` with `href`, `SmallCard`, `Tag` with `href`, `Breadcrumbs` items with `href`, `Logo` with `href`) renders a plain `<a>` by default. Wrap the app in `LinkProvider` to route in-app hrefs through your router's link component; `externalComponent` does the same for absolute URLs. In-app hash links, `download` links and links with a non-`_self` `target` stay a plain `<a>`; absolute URLs always go to `externalComponent` when one is set. Absolute `http(s)` URLs open in a new tab (`target="_blank"`, `rel="noopener noreferrer"`) unless `target` is passed. Adapters must be `forwardRef` components: under React 18 `ref` is never passed as a prop.
36
36
 
37
- Next.js 12 — `next/link` needs an `<a>` child, so wrap it once at module level:
37
+ Next.js 13+ — `next/link` renders its own `<a>` and forwards its ref, so pass it directly:
38
+
39
+ ```tsx
40
+ import NextLink from 'next/link'
41
+ import { LinkProvider } from '@lidofinance/lido-app-ui'
42
+ ;<LinkProvider component={NextLink}>{children}</LinkProvider>
43
+ ```
44
+
45
+ Next.js 12 — `next/link` needs an `<a>` child, so wrap it once at module level. Router-only props set per link with `linkProps` are split out so they don't land on the `<a>`; this requires the `LinkRouterProps` augmentation shown below:
38
46
 
39
47
  ```tsx
40
48
  import { forwardRef } from 'react'
@@ -43,8 +51,8 @@ import NextLink from 'next/link'
43
51
  import { LinkProvider, type LinkComponentProps } from '@lidofinance/lido-app-ui'
44
52
 
45
53
  const AppLink = forwardRef<HTMLAnchorElement, LinkComponentProps>(
46
- ({ href, ...rest }, ref) => (
47
- <NextLink href={href}>
54
+ ({ href, prefetch, replace, scroll, ...rest }, ref) => (
55
+ <NextLink href={href} prefetch={prefetch} replace={replace} scroll={scroll}>
48
56
  <a ref={ref} {...rest} />
49
57
  </NextLink>
50
58
  ),
@@ -59,42 +67,119 @@ export default function App({ Component, pageProps }: AppProps) {
59
67
  }
60
68
  ```
61
69
 
70
+ react-router — it takes `to` instead of `href`:
71
+
72
+ ```tsx
73
+ import { forwardRef } from 'react'
74
+ import { Link } from 'react-router-dom'
75
+ import type { LinkComponentProps } from '@lidofinance/lido-app-ui'
76
+
77
+ const AppLink = forwardRef<HTMLAnchorElement, LinkComponentProps>(
78
+ ({ href, ...rest }, ref) => <Link ref={ref} to={href} {...rest} />,
79
+ )
80
+ ```
81
+
82
+ Router-only options such as `prefetch` are typed by augmenting `LinkRouterProps` once, then set per link with `linkProps`. They reach only the `LinkProvider` components, never a plain `<a>`:
83
+
84
+ ```tsx
85
+ declare module '@lidofinance/lido-app-ui' {
86
+ interface LinkRouterProps {
87
+ prefetch?: boolean
88
+ replace?: boolean
89
+ scroll?: boolean
90
+ }
91
+ }
92
+
93
+ ;<SmallCard href='/keys' title='Keys' linkProps={{ prefetch: false }} />
94
+ ```
95
+
96
+ ## Typography
97
+
98
+ `Typography` renders the type scale; it sets no color unless asked.
99
+
100
+ - `variant`: `h1`, `h2`, `h3`, `amount`, `bodyLarge`, `body` (default), `description`, `caption`. Also decides the tag; override with `as`.
101
+ - `weight`: `thin` | `regular` | `medium` | `semibold` | `bold`; overrides the variant's weight on any variant. `thin` is Manrope ExtraLight (200).
102
+ - `color`: `default`, `secondary`, `tertiary`, `neutral`, `active`, `success`, `warning`, `error`, `info`, `inverse`, `disabled`. Omit to inherit.
103
+ - Shortcuts: `H1`, `H2`, `H3`, `BodyLarge`, `Body`, `Description`, `Caption`.
104
+
105
+ app-ui sets no default text color, so set it once in the app:
106
+
107
+ ```css
108
+ body {
109
+ color: var(--lido-app-ui-color-text-default);
110
+ }
111
+ ```
112
+
113
+ PostCSS mixins: `font-amount`, `font-caption` (plus `font-h1`, `font-body`, ...). `font-rich-input` and `font-group-name` are deprecated.
114
+
115
+ Deprecated aliases: `GroupName` (use `Caption`), variants `richInput` (use `amount`) and `groupName` (use `caption`).
116
+
62
117
  ## Customization
63
118
 
64
- Override any token after importing the stylesheet:
119
+ Override any token after importing the stylesheet. Non-color tokens (radii, typography, z-index, spacing) are theme-independent and live on `:root`. Color tokens and `--lido-app-ui-shadow-default` (it reads color tokens) are redeclared on every theme scope, so override them on `:root, [data-lido-theme]` or per theme, not on `:root` alone:
65
120
 
66
121
  ```css
67
122
  :root {
68
- --lido-app-ui-color-border-active: #0085ff;
69
123
  --lido-app-ui-border-radius-card: 20px;
70
124
  }
125
+
126
+ :root,
127
+ [data-lido-theme='light'] {
128
+ --lido-app-ui-color-border-active: #0085ff;
129
+ }
130
+
131
+ [data-lido-theme='dark'] {
132
+ --lido-app-ui-color-border-active: #339dff;
133
+ }
71
134
  ```
72
135
 
73
136
  The typography mixins and breakpoint definitions are published too, for products running `postcss-mixins` / `postcss-custom-media`:
74
137
 
75
138
  ```js
76
- // postcss.config.js
77
- import path from 'path'
139
+ // postcss.config.mjs
140
+ import { createRequire } from 'node:module'
141
+ import path from 'node:path'
142
+
143
+ const require = createRequire(import.meta.url)
144
+ const stylesDir = path.dirname(
145
+ require.resolve('@lidofinance/lido-app-ui/styles/breakpoints.css'),
146
+ )
78
147
 
79
148
  export default {
80
149
  plugins: {
81
150
  '@csstools/postcss-global-data': {
82
- files: [
83
- require.resolve('@lidofinance/lido-app-ui/styles/breakpoints.css'),
84
- ],
85
- },
86
- 'postcss-mixins': {
87
- mixinsDir: path.dirname(
88
- require.resolve(
89
- '@lidofinance/lido-app-ui/styles/typography-mixins.css',
90
- ),
91
- ),
151
+ files: [path.join(stylesDir, 'breakpoints.css')],
92
152
  },
153
+ 'postcss-mixins': { mixinsDir: stylesDir },
93
154
  'postcss-custom-media': { preserve: false },
94
155
  },
95
156
  }
96
157
  ```
97
158
 
159
+ ## Layout
160
+
161
+ Breakpoints are desktop-first: `-down` is `(width <= N)`, `-up` is `(width > N)`. The queries use range syntax (Safari 16.4+, Chrome 104+, Firefox 63+).
162
+
163
+ | Name | N |
164
+ | ---- | ------ |
165
+ | `xl` | 1280px |
166
+ | `lg` | 1024px |
167
+ | `md` | 900px |
168
+ | `sm` | 600px |
169
+ | `xs` | 400px |
170
+
171
+ The Sidebar drawer and Logo `auto` switch at `lg`. In JS, `downQuery('md')` / `upQuery('md')` build the matching `matchMedia` strings.
172
+
173
+ In CSS use `@media (--lido-app-ui-breakpoint-md-down)`. Responsive props such as `Stack` `gap` take `{ base, mdDown, smDown, … }` (bare `md`/`sm` are aliases), where a key applies at that width and below:
174
+
175
+ ```tsx
176
+ <Stack gap={{ base: 24, smDown: 12 }}>{children}</Stack>
177
+ ```
178
+
179
+ Page shells align to the page gutter, which shrinks on narrow screens: `padding-inline: var(--lido-app-ui-page-gutter)`.
180
+
181
+ Popovers, tooltips and modals with `withOverlay` portal to `<body>` and stack by `--lido-app-ui-z-index-*`: header 250, popover and modal 1000, toast 1050, tooltip 1100. Keep your own app chrome below 1000. `Modal` `inertOthers` makes the rest of `<body>` inert; mark body-level toast or live-region roots with `data-lido-overlay-keep` to keep them live.
182
+
98
183
  ## More
99
184
 
100
185
  This package is part of the [`lidofinance/ui`](https://github.com/lidofinance/ui) monorepo — see the [repo README](https://github.com/lidofinance/ui#readme) for the full package overview, theming, CSS variable customization, and contribution guide.
package/dist/README.md CHANGED
@@ -28,13 +28,21 @@ function Widget() {
28
28
  }
29
29
  ```
30
30
 
31
- Theme providers (`ThemeProvider`, `CookieThemeProvider`) are re-exported from `@lidofinance/lido-shared-ui`. The color tokens follow the `data-lido-theme` attribute they set, so switching to the dark theme restyles these components. `ThemeSwitcher` is the app-ui-styled theme toggle, since the shared `ThemeToggler` relies on `--lido-ui-*` tokens that app-ui doesn't define.
31
+ Theme providers (`ThemeProvider`, `CookieThemeProvider`) are re-exported from `@lidofinance/lido-shared-ui`. The color tokens follow the `data-lido-theme` attribute they set, so switching to the dark theme restyles these components. `ThemeSwitcher` is the app-ui-styled theme toggle, since the shared `ThemeToggler` relies on `--lido-ui-*` tokens that app-ui doesn't define. `ThemeSwitcher` needs `CookieThemeProvider`; the static `ThemeProvider` has no toggle, so the switcher renders but clicking does nothing. In SSR apps pass the request cookie as `initialThemeName` so the label is right on first paint (the icon already follows `data-lido-theme` in CSS).
32
32
 
33
33
  ## Router links
34
34
 
35
- Link components (`TextLink`, `SmallCard`) render a plain `<a>` by default. Wrap the app in `LinkProvider` to route in-app hrefs through your router's link component; `externalComponent` does the same for absolute URLs. Hash links, `download` links and links with a non-`_self` `target` always stay a plain `<a>`.
35
+ Every app-ui link (`TextLink`, `NavLink`, `Button` and `IconButton` with `href`, `SmallCard`, `Tag` with `href`, `Breadcrumbs` items with `href`, `Logo` with `href`) renders a plain `<a>` by default. Wrap the app in `LinkProvider` to route in-app hrefs through your router's link component; `externalComponent` does the same for absolute URLs. In-app hash links, `download` links and links with a non-`_self` `target` stay a plain `<a>`; absolute URLs always go to `externalComponent` when one is set. Absolute `http(s)` URLs open in a new tab (`target="_blank"`, `rel="noopener noreferrer"`) unless `target` is passed. Adapters must be `forwardRef` components: under React 18 `ref` is never passed as a prop.
36
36
 
37
- Next.js 12 — `next/link` needs an `<a>` child, so wrap it once at module level:
37
+ Next.js 13+ — `next/link` renders its own `<a>` and forwards its ref, so pass it directly:
38
+
39
+ ```tsx
40
+ import NextLink from 'next/link'
41
+ import { LinkProvider } from '@lidofinance/lido-app-ui'
42
+ ;<LinkProvider component={NextLink}>{children}</LinkProvider>
43
+ ```
44
+
45
+ Next.js 12 — `next/link` needs an `<a>` child, so wrap it once at module level. Router-only props set per link with `linkProps` are split out so they don't land on the `<a>`; this requires the `LinkRouterProps` augmentation shown below:
38
46
 
39
47
  ```tsx
40
48
  import { forwardRef } from 'react'
@@ -43,8 +51,8 @@ import NextLink from 'next/link'
43
51
  import { LinkProvider, type LinkComponentProps } from '@lidofinance/lido-app-ui'
44
52
 
45
53
  const AppLink = forwardRef<HTMLAnchorElement, LinkComponentProps>(
46
- ({ href, ...rest }, ref) => (
47
- <NextLink href={href}>
54
+ ({ href, prefetch, replace, scroll, ...rest }, ref) => (
55
+ <NextLink href={href} prefetch={prefetch} replace={replace} scroll={scroll}>
48
56
  <a ref={ref} {...rest} />
49
57
  </NextLink>
50
58
  ),
@@ -59,42 +67,119 @@ export default function App({ Component, pageProps }: AppProps) {
59
67
  }
60
68
  ```
61
69
 
70
+ react-router — it takes `to` instead of `href`:
71
+
72
+ ```tsx
73
+ import { forwardRef } from 'react'
74
+ import { Link } from 'react-router-dom'
75
+ import type { LinkComponentProps } from '@lidofinance/lido-app-ui'
76
+
77
+ const AppLink = forwardRef<HTMLAnchorElement, LinkComponentProps>(
78
+ ({ href, ...rest }, ref) => <Link ref={ref} to={href} {...rest} />,
79
+ )
80
+ ```
81
+
82
+ Router-only options such as `prefetch` are typed by augmenting `LinkRouterProps` once, then set per link with `linkProps`. They reach only the `LinkProvider` components, never a plain `<a>`:
83
+
84
+ ```tsx
85
+ declare module '@lidofinance/lido-app-ui' {
86
+ interface LinkRouterProps {
87
+ prefetch?: boolean
88
+ replace?: boolean
89
+ scroll?: boolean
90
+ }
91
+ }
92
+
93
+ ;<SmallCard href='/keys' title='Keys' linkProps={{ prefetch: false }} />
94
+ ```
95
+
96
+ ## Typography
97
+
98
+ `Typography` renders the type scale; it sets no color unless asked.
99
+
100
+ - `variant`: `h1`, `h2`, `h3`, `amount`, `bodyLarge`, `body` (default), `description`, `caption`. Also decides the tag; override with `as`.
101
+ - `weight`: `thin` | `regular` | `medium` | `semibold` | `bold`; overrides the variant's weight on any variant. `thin` is Manrope ExtraLight (200).
102
+ - `color`: `default`, `secondary`, `tertiary`, `neutral`, `active`, `success`, `warning`, `error`, `info`, `inverse`, `disabled`. Omit to inherit.
103
+ - Shortcuts: `H1`, `H2`, `H3`, `BodyLarge`, `Body`, `Description`, `Caption`.
104
+
105
+ app-ui sets no default text color, so set it once in the app:
106
+
107
+ ```css
108
+ body {
109
+ color: var(--lido-app-ui-color-text-default);
110
+ }
111
+ ```
112
+
113
+ PostCSS mixins: `font-amount`, `font-caption` (plus `font-h1`, `font-body`, ...). `font-rich-input` and `font-group-name` are deprecated.
114
+
115
+ Deprecated aliases: `GroupName` (use `Caption`), variants `richInput` (use `amount`) and `groupName` (use `caption`).
116
+
62
117
  ## Customization
63
118
 
64
- Override any token after importing the stylesheet:
119
+ Override any token after importing the stylesheet. Non-color tokens (radii, typography, z-index, spacing) are theme-independent and live on `:root`. Color tokens and `--lido-app-ui-shadow-default` (it reads color tokens) are redeclared on every theme scope, so override them on `:root, [data-lido-theme]` or per theme, not on `:root` alone:
65
120
 
66
121
  ```css
67
122
  :root {
68
- --lido-app-ui-color-border-active: #0085ff;
69
123
  --lido-app-ui-border-radius-card: 20px;
70
124
  }
125
+
126
+ :root,
127
+ [data-lido-theme='light'] {
128
+ --lido-app-ui-color-border-active: #0085ff;
129
+ }
130
+
131
+ [data-lido-theme='dark'] {
132
+ --lido-app-ui-color-border-active: #339dff;
133
+ }
71
134
  ```
72
135
 
73
136
  The typography mixins and breakpoint definitions are published too, for products running `postcss-mixins` / `postcss-custom-media`:
74
137
 
75
138
  ```js
76
- // postcss.config.js
77
- import path from 'path'
139
+ // postcss.config.mjs
140
+ import { createRequire } from 'node:module'
141
+ import path from 'node:path'
142
+
143
+ const require = createRequire(import.meta.url)
144
+ const stylesDir = path.dirname(
145
+ require.resolve('@lidofinance/lido-app-ui/styles/breakpoints.css'),
146
+ )
78
147
 
79
148
  export default {
80
149
  plugins: {
81
150
  '@csstools/postcss-global-data': {
82
- files: [
83
- require.resolve('@lidofinance/lido-app-ui/styles/breakpoints.css'),
84
- ],
85
- },
86
- 'postcss-mixins': {
87
- mixinsDir: path.dirname(
88
- require.resolve(
89
- '@lidofinance/lido-app-ui/styles/typography-mixins.css',
90
- ),
91
- ),
151
+ files: [path.join(stylesDir, 'breakpoints.css')],
92
152
  },
153
+ 'postcss-mixins': { mixinsDir: stylesDir },
93
154
  'postcss-custom-media': { preserve: false },
94
155
  },
95
156
  }
96
157
  ```
97
158
 
159
+ ## Layout
160
+
161
+ Breakpoints are desktop-first: `-down` is `(width <= N)`, `-up` is `(width > N)`. The queries use range syntax (Safari 16.4+, Chrome 104+, Firefox 63+).
162
+
163
+ | Name | N |
164
+ | ---- | ------ |
165
+ | `xl` | 1280px |
166
+ | `lg` | 1024px |
167
+ | `md` | 900px |
168
+ | `sm` | 600px |
169
+ | `xs` | 400px |
170
+
171
+ The Sidebar drawer and Logo `auto` switch at `lg`. In JS, `downQuery('md')` / `upQuery('md')` build the matching `matchMedia` strings.
172
+
173
+ In CSS use `@media (--lido-app-ui-breakpoint-md-down)`. Responsive props such as `Stack` `gap` take `{ base, mdDown, smDown, … }` (bare `md`/`sm` are aliases), where a key applies at that width and below:
174
+
175
+ ```tsx
176
+ <Stack gap={{ base: 24, smDown: 12 }}>{children}</Stack>
177
+ ```
178
+
179
+ Page shells align to the page gutter, which shrinks on narrow screens: `padding-inline: var(--lido-app-ui-page-gutter)`.
180
+
181
+ Popovers, tooltips and modals with `withOverlay` portal to `<body>` and stack by `--lido-app-ui-z-index-*`: header 250, popover and modal 1000, toast 1050, tooltip 1100. Keep your own app chrome below 1000. `Modal` `inertOthers` makes the rest of `<body>` inert; mark body-level toast or live-region roots with `data-lido-overlay-keep` to keep them live.
182
+
98
183
  ## More
99
184
 
100
185
  This package is part of the [`lidofinance/ui`](https://github.com/lidofinance/ui) monorepo — see the [repo README](https://github.com/lidofinance/ui#readme) for the full package overview, theming, CSS variable customization, and contribution guide.
@@ -9,6 +9,7 @@ const jsxRuntime = require('react/jsx-runtime');
9
9
  const IconChevronUp = require('../icons/components/base/IconChevronUp.cjs');
10
10
  const IconChevronDown = require('../icons/components/base/IconChevronDown.cjs');
11
11
 
12
+ /** Collapsible section, uncontrolled by default; pass `expanded` + `onExpandedChange` to drive it from your own state. */
12
13
  const Accordion = _ref => {
13
14
  let {
14
15
  title,
@@ -1 +1 @@
1
- {"version":3,"file":"Accordion.cjs","sources":["../../../src/accordion/Accordion.tsx"],"sourcesContent":["import {\n useId,\n useState,\n type ComponentPropsWithoutRef,\n type ReactNode,\n} from 'react'\n\nimport { IconChevronDown, IconChevronUp } from '../icons'\nimport cn from 'classnames'\n\nimport styles from './Accordion.module.css'\n\nexport type AccordionDataTestId = {\n root?: string\n header?: string\n title?: string\n content?: string\n}\n\nexport type AccordionProps = Omit<ComponentPropsWithoutRef<'div'>, 'title'> & {\n title: ReactNode\n border?: boolean\n defaultExpanded?: boolean\n expanded?: boolean\n onExpandedChange?: (expanded: boolean) => void\n dataTestId?: AccordionDataTestId\n}\n\nexport const Accordion = ({\n title,\n border = true,\n defaultExpanded = false,\n expanded,\n onExpandedChange,\n children,\n className,\n dataTestId,\n ...rest\n}: AccordionProps) => {\n const [uncontrolledExpanded, setUncontrolledExpanded] =\n useState(defaultExpanded)\n const isExpanded = expanded ?? uncontrolledExpanded\n const contentId = useId()\n\n const handleToggle = () => {\n const next = !isExpanded\n if (expanded == null) setUncontrolledExpanded(next)\n onExpandedChange?.(next)\n }\n\n return (\n <div\n className={cn(styles.accordion, className, {\n [styles.borderless]: !border,\n })}\n data-testid={dataTestId?.root}\n {...rest}\n >\n <button\n type='button'\n className={styles.header}\n aria-expanded={isExpanded}\n aria-controls={contentId}\n onClick={handleToggle}\n data-testid={dataTestId?.header}\n >\n <span className={styles.title} data-testid={dataTestId?.title}>\n {title}\n </span>\n <span className={styles.chevron} aria-hidden='true'>\n {isExpanded ? <IconChevronUp /> : <IconChevronDown />}\n </span>\n </button>\n <div\n id={contentId}\n className={cn(styles.contentWrapper, {\n [styles.expanded]: isExpanded,\n })}\n >\n <div className={styles.content}>\n <div\n className={styles.contentInner}\n data-testid={dataTestId?.content}\n >\n {children}\n </div>\n </div>\n </div>\n </div>\n )\n}\n\nAccordion.displayName = 'Accordion'\n"],"names":["Accordion","_ref","title","border","defaultExpanded","expanded","onExpandedChange","children","className","dataTestId","rest","uncontrolledExpanded","setUncontrolledExpanded","useState","isExpanded","contentId","useId","handleToggle","next","_jsxs","cn","styles","accordion","borderless","root","type","header","onClick","_jsx","chevron","IconChevronUp","IconChevronDown","id","contentWrapper","content","contentInner","displayName"],"mappings":";;;;;;;;;;;AA4BaA,MAAAA,SAAS,GAAGC,IAAA,IAUH;EAAA,IAVI;IACxBC,KAAK;AACLC,IAAAA,MAAM,GAAG,IAAI;AACbC,IAAAA,eAAe,GAAG,KAAK;IACvBC,QAAQ;IACRC,gBAAgB;IAChBC,QAAQ;IACRC,SAAS;IACTC,UAAU;IACV,GAAGC,IAAAA;AACW,GAAC,GAAAT,IAAA,CAAA;EACf,MAAM,CAACU,oBAAoB,EAAEC,uBAAuB,CAAC,GACnDC,cAAQ,CAACT,eAAe,CAAC,CAAA;AAC3B,EAAA,MAAMU,UAAU,GAAGT,QAAQ,IAAIM,oBAAoB,CAAA;AACnD,EAAA,MAAMI,SAAS,GAAGC,WAAK,EAAE,CAAA;EAEzB,MAAMC,YAAY,GAAGA,MAAM;IACzB,MAAMC,IAAI,GAAG,CAACJ,UAAU,CAAA;AACxB,IAAA,IAAIT,QAAQ,IAAI,IAAI,EAAEO,uBAAuB,CAACM,IAAI,CAAC,CAAA;IACnDZ,gBAAgB,GAAGY,IAAI,CAAC,CAAA;GACzB,CAAA;AAED,EAAA,oBACEC,eAAA,CAAA,KAAA,EAAA;IACEX,SAAS,EAAEY,EAAE,CAACC,gBAAM,CAACC,SAAS,EAAEd,SAAS,EAAE;AACzC,MAAA,CAACa,gBAAM,CAACE,UAAU,GAAG,CAACpB,MAAAA;AACxB,KAAC,CAAE;IACH,aAAaM,EAAAA,UAAU,EAAEe,IAAK;AAAA,IAAA,GAC1Bd,IAAI;AAAAH,IAAAA,QAAA,gBAERY,eAAA,CAAA,QAAA,EAAA;AACEM,MAAAA,IAAI,EAAC,QAAQ;MACbjB,SAAS,EAAEa,gBAAM,CAACK,MAAO;AACzB,MAAA,eAAA,EAAeZ,UAAW;AAC1B,MAAA,eAAA,EAAeC,SAAU;AACzBY,MAAAA,OAAO,EAAEV,YAAa;MACtB,aAAaR,EAAAA,UAAU,EAAEiB,MAAO;AAAAnB,MAAAA,QAAA,gBAEhCqB,cAAA,CAAA,MAAA,EAAA;QAAMpB,SAAS,EAAEa,gBAAM,CAACnB,KAAM;QAAC,aAAaO,EAAAA,UAAU,EAAEP,KAAM;AAAAK,QAAAA,QAAA,EAC3DL,KAAAA;OACG,CAAC,eACP0B,cAAA,CAAA,MAAA,EAAA;QAAMpB,SAAS,EAAEa,gBAAM,CAACQ,OAAQ;AAAC,QAAA,aAAA,EAAY,MAAM;AAAAtB,QAAAA,QAAA,EAChDO,UAAU,gBAAGc,cAAA,CAACE,2BAAa,EAAE,EAAA,CAAC,gBAAGF,cAAA,CAACG,+BAAe,EAAE,EAAA,CAAA;AAAC,OACjD,CAAC,CAAA;KACD,CAAC,eACTH,cAAA,CAAA,KAAA,EAAA;AACEI,MAAAA,EAAE,EAAEjB,SAAU;AACdP,MAAAA,SAAS,EAAEY,EAAE,CAACC,gBAAM,CAACY,cAAc,EAAE;QACnC,CAACZ,gBAAM,CAAChB,QAAQ,GAAGS,UAAAA;AACrB,OAAC,CAAE;AAAAP,MAAAA,QAAA,eAEHqB,cAAA,CAAA,KAAA,EAAA;QAAKpB,SAAS,EAAEa,gBAAM,CAACa,OAAQ;AAAA3B,QAAAA,QAAA,eAC7BqB,cAAA,CAAA,KAAA,EAAA;UACEpB,SAAS,EAAEa,gBAAM,CAACc,YAAa;UAC/B,aAAa1B,EAAAA,UAAU,EAAEyB,OAAQ;AAAA3B,UAAAA,QAAA,EAEhCA,QAAAA;SACE,CAAA;OACF,CAAA;AAAC,KACH,CAAC,CAAA;AAAA,GACH,CAAC,CAAA;AAEV,EAAC;AAEDP,SAAS,CAACoC,WAAW,GAAG,WAAW;;;;"}
1
+ {"version":3,"file":"Accordion.cjs","sources":["../../../src/accordion/Accordion.tsx"],"sourcesContent":["import {\n useId,\n useState,\n type ComponentPropsWithoutRef,\n type ReactNode,\n} from 'react'\n\nimport { IconChevronDown, IconChevronUp } from '../icons'\nimport cn from 'classnames'\n\nimport styles from './Accordion.module.css'\n\nexport type AccordionDataTestId = {\n root?: string\n header?: string\n title?: string\n content?: string\n}\n\nexport type AccordionProps = Omit<ComponentPropsWithoutRef<'div'>, 'title'> & {\n title: ReactNode\n /** Bottom divider; turn it off on the last item of a list. */\n border?: boolean\n defaultExpanded?: boolean\n /** Controlled mode, pair with `onExpandedChange`. */\n expanded?: boolean\n onExpandedChange?: (expanded: boolean) => void\n dataTestId?: AccordionDataTestId\n}\n\n/** Collapsible section, uncontrolled by default; pass `expanded` + `onExpandedChange` to drive it from your own state. */\nexport const Accordion = ({\n title,\n border = true,\n defaultExpanded = false,\n expanded,\n onExpandedChange,\n children,\n className,\n dataTestId,\n ...rest\n}: AccordionProps) => {\n const [uncontrolledExpanded, setUncontrolledExpanded] =\n useState(defaultExpanded)\n const isExpanded = expanded ?? uncontrolledExpanded\n const contentId = useId()\n\n const handleToggle = () => {\n const next = !isExpanded\n if (expanded == null) setUncontrolledExpanded(next)\n onExpandedChange?.(next)\n }\n\n return (\n <div\n className={cn(styles.accordion, className, {\n [styles.borderless]: !border,\n })}\n data-testid={dataTestId?.root}\n {...rest}\n >\n <button\n type='button'\n className={styles.header}\n aria-expanded={isExpanded}\n aria-controls={contentId}\n onClick={handleToggle}\n data-testid={dataTestId?.header}\n >\n <span className={styles.title} data-testid={dataTestId?.title}>\n {title}\n </span>\n <span className={styles.chevron} aria-hidden='true'>\n {isExpanded ? <IconChevronUp /> : <IconChevronDown />}\n </span>\n </button>\n <div\n id={contentId}\n className={cn(styles.contentWrapper, {\n [styles.expanded]: isExpanded,\n })}\n >\n <div className={styles.content}>\n <div\n className={styles.contentInner}\n data-testid={dataTestId?.content}\n >\n {children}\n </div>\n </div>\n </div>\n </div>\n )\n}\n\nAccordion.displayName = 'Accordion'\n"],"names":["Accordion","_ref","title","border","defaultExpanded","expanded","onExpandedChange","children","className","dataTestId","rest","uncontrolledExpanded","setUncontrolledExpanded","useState","isExpanded","contentId","useId","handleToggle","next","_jsxs","cn","styles","accordion","borderless","root","type","header","onClick","_jsx","chevron","IconChevronUp","IconChevronDown","id","contentWrapper","content","contentInner","displayName"],"mappings":";;;;;;;;;;;AA8BA;AACaA,MAAAA,SAAS,GAAGC,IAAA,IAUH;EAAA,IAVI;IACxBC,KAAK;AACLC,IAAAA,MAAM,GAAG,IAAI;AACbC,IAAAA,eAAe,GAAG,KAAK;IACvBC,QAAQ;IACRC,gBAAgB;IAChBC,QAAQ;IACRC,SAAS;IACTC,UAAU;IACV,GAAGC,IAAAA;AACW,GAAC,GAAAT,IAAA,CAAA;EACf,MAAM,CAACU,oBAAoB,EAAEC,uBAAuB,CAAC,GACnDC,cAAQ,CAACT,eAAe,CAAC,CAAA;AAC3B,EAAA,MAAMU,UAAU,GAAGT,QAAQ,IAAIM,oBAAoB,CAAA;AACnD,EAAA,MAAMI,SAAS,GAAGC,WAAK,EAAE,CAAA;EAEzB,MAAMC,YAAY,GAAGA,MAAM;IACzB,MAAMC,IAAI,GAAG,CAACJ,UAAU,CAAA;AACxB,IAAA,IAAIT,QAAQ,IAAI,IAAI,EAAEO,uBAAuB,CAACM,IAAI,CAAC,CAAA;IACnDZ,gBAAgB,GAAGY,IAAI,CAAC,CAAA;GACzB,CAAA;AAED,EAAA,oBACEC,eAAA,CAAA,KAAA,EAAA;IACEX,SAAS,EAAEY,EAAE,CAACC,gBAAM,CAACC,SAAS,EAAEd,SAAS,EAAE;AACzC,MAAA,CAACa,gBAAM,CAACE,UAAU,GAAG,CAACpB,MAAAA;AACxB,KAAC,CAAE;IACH,aAAaM,EAAAA,UAAU,EAAEe,IAAK;AAAA,IAAA,GAC1Bd,IAAI;AAAAH,IAAAA,QAAA,gBAERY,eAAA,CAAA,QAAA,EAAA;AACEM,MAAAA,IAAI,EAAC,QAAQ;MACbjB,SAAS,EAAEa,gBAAM,CAACK,MAAO;AACzB,MAAA,eAAA,EAAeZ,UAAW;AAC1B,MAAA,eAAA,EAAeC,SAAU;AACzBY,MAAAA,OAAO,EAAEV,YAAa;MACtB,aAAaR,EAAAA,UAAU,EAAEiB,MAAO;AAAAnB,MAAAA,QAAA,gBAEhCqB,cAAA,CAAA,MAAA,EAAA;QAAMpB,SAAS,EAAEa,gBAAM,CAACnB,KAAM;QAAC,aAAaO,EAAAA,UAAU,EAAEP,KAAM;AAAAK,QAAAA,QAAA,EAC3DL,KAAAA;OACG,CAAC,eACP0B,cAAA,CAAA,MAAA,EAAA;QAAMpB,SAAS,EAAEa,gBAAM,CAACQ,OAAQ;AAAC,QAAA,aAAA,EAAY,MAAM;AAAAtB,QAAAA,QAAA,EAChDO,UAAU,gBAAGc,cAAA,CAACE,2BAAa,EAAE,EAAA,CAAC,gBAAGF,cAAA,CAACG,+BAAe,EAAE,EAAA,CAAA;AAAC,OACjD,CAAC,CAAA;KACD,CAAC,eACTH,cAAA,CAAA,KAAA,EAAA;AACEI,MAAAA,EAAE,EAAEjB,SAAU;AACdP,MAAAA,SAAS,EAAEY,EAAE,CAACC,gBAAM,CAACY,cAAc,EAAE;QACnC,CAACZ,gBAAM,CAAChB,QAAQ,GAAGS,UAAAA;AACrB,OAAC,CAAE;AAAAP,MAAAA,QAAA,eAEHqB,cAAA,CAAA,KAAA,EAAA;QAAKpB,SAAS,EAAEa,gBAAM,CAACa,OAAQ;AAAA3B,QAAAA,QAAA,eAC7BqB,cAAA,CAAA,KAAA,EAAA;UACEpB,SAAS,EAAEa,gBAAM,CAACc,YAAa;UAC/B,aAAa1B,EAAAA,UAAU,EAAEyB,OAAQ;AAAA3B,UAAAA,QAAA,EAEhCA,QAAAA;SACE,CAAA;OACF,CAAA;AAAC,KACH,CAAC,CAAA;AAAA,GACH,CAAC,CAAA;AAEV,EAAC;AAEDP,SAAS,CAACoC,WAAW,GAAG,WAAW;;;;"}
@@ -6,6 +6,7 @@ const cn = require('classnames');
6
6
  const Badge_module = require('./Badge.module.css.cjs');
7
7
  const jsxRuntime = require('react/jsx-runtime');
8
8
 
9
+ /** Bordered pill for a single trust/verification marker (audited, verified). */
9
10
  const Badge = _ref => {
10
11
  let {
11
12
  icon,
@@ -1 +1 @@
1
- {"version":3,"file":"Badge.cjs","sources":["../../../src/badge/Badge.tsx"],"sourcesContent":["import cn from 'classnames'\nimport type { HTMLAttributes, ReactNode } from 'react'\nimport styles from './Badge.module.css'\n\nexport type BadgeDataTestId = {\n root?: string\n icon?: string\n}\n\nexport type BadgeProps = HTMLAttributes<HTMLSpanElement> & {\n /** Optional glyph before the label. Omitted entirely when not passed. */\n icon?: ReactNode\n dataTestId?: BadgeDataTestId\n}\n\nexport const Badge = ({\n icon,\n className,\n children,\n dataTestId,\n ...rest\n}: BadgeProps) => (\n <span\n className={cn(styles.badge, className)}\n data-testid={dataTestId?.root}\n {...rest}\n >\n {icon && (\n <span\n className={styles.icon}\n aria-hidden='true'\n data-testid={dataTestId?.icon}\n >\n {icon}\n </span>\n )}\n {children}\n </span>\n)\n"],"names":["Badge","_ref","icon","className","children","dataTestId","rest","_jsxs","cn","styles","badge","root","_jsx"],"mappings":";;;;;;;;AAeO,MAAMA,KAAK,GAAGC,IAAA,IAAA;EAAA,IAAC;IACpBC,IAAI;IACJC,SAAS;IACTC,QAAQ;IACRC,UAAU;IACV,GAAGC,IAAAA;AACO,GAAC,GAAAL,IAAA,CAAA;AAAA,EAAA,oBACXM,eAAA,CAAA,MAAA,EAAA;IACEJ,SAAS,EAAEK,EAAE,CAACC,YAAM,CAACC,KAAK,EAAEP,SAAS,CAAE;IACvC,aAAaE,EAAAA,UAAU,EAAEM,IAAK;AAAA,IAAA,GAC1BL,IAAI;IAAAF,QAAA,EAAA,CAEPF,IAAI,iBACHU,cAAA,CAAA,MAAA,EAAA;MACET,SAAS,EAAEM,YAAM,CAACP,IAAK;AACvB,MAAA,aAAA,EAAY,MAAM;MAClB,aAAaG,EAAAA,UAAU,EAAEH,IAAK;AAAAE,MAAAA,QAAA,EAE7BF,IAAAA;KACG,CACP,EACAE,QAAQ,CAAA;AAAA,GACL,CAAC,CAAA;AAAA;;;;"}
1
+ {"version":3,"file":"Badge.cjs","sources":["../../../src/badge/Badge.tsx"],"sourcesContent":["import cn from 'classnames'\nimport type { HTMLAttributes, ReactNode } from 'react'\nimport styles from './Badge.module.css'\n\nexport type BadgeDataTestId = {\n root?: string\n icon?: string\n}\n\nexport type BadgeProps = HTMLAttributes<HTMLSpanElement> & {\n /** Optional glyph before the label. Omitted entirely when not passed. */\n icon?: ReactNode\n dataTestId?: BadgeDataTestId\n}\n\n/** Bordered pill for a single trust/verification marker (audited, verified). */\nexport const Badge = ({\n icon,\n className,\n children,\n dataTestId,\n ...rest\n}: BadgeProps) => (\n <span\n className={cn(styles.badge, className)}\n data-testid={dataTestId?.root}\n {...rest}\n >\n {icon && (\n <span\n className={styles.icon}\n aria-hidden='true'\n data-testid={dataTestId?.icon}\n >\n {icon}\n </span>\n )}\n {children}\n </span>\n)\n"],"names":["Badge","_ref","icon","className","children","dataTestId","rest","_jsxs","cn","styles","badge","root","_jsx"],"mappings":";;;;;;;;AAeA;AACO,MAAMA,KAAK,GAAGC,IAAA,IAAA;EAAA,IAAC;IACpBC,IAAI;IACJC,SAAS;IACTC,QAAQ;IACRC,UAAU;IACV,GAAGC,IAAAA;AACO,GAAC,GAAAL,IAAA,CAAA;AAAA,EAAA,oBACXM,eAAA,CAAA,MAAA,EAAA;IACEJ,SAAS,EAAEK,EAAE,CAACC,YAAM,CAACC,KAAK,EAAEP,SAAS,CAAE;IACvC,aAAaE,EAAAA,UAAU,EAAEM,IAAK;AAAA,IAAA,GAC1BL,IAAI;IAAAF,QAAA,EAAA,CAEPF,IAAI,iBACHU,cAAA,CAAA,MAAA,EAAA;MACET,SAAS,EAAEM,YAAM,CAACP,IAAK;AACvB,MAAA,aAAA,EAAY,MAAM;MAClB,aAAaG,EAAAA,UAAU,EAAEH,IAAK;AAAAE,MAAAA,QAAA,EAE7BF,IAAAA;KACG,CACP,EACAE,QAAQ,CAAA;AAAA,GACL,CAAC,CAAA;AAAA;;;;"}
@@ -6,6 +6,7 @@ const cn = require('classnames');
6
6
  const Banner_module = require('./Banner.module.css.cjs');
7
7
  const jsxRuntime = require('react/jsx-runtime');
8
8
 
9
+ /** Compact card row: icon, title and description, with an optional `action` slot on the right (usually a `Button`). */
9
10
  const Banner = _ref => {
10
11
  let {
11
12
  icon,
@@ -1 +1 @@
1
- {"version":3,"file":"Banner.cjs","sources":["../../../src/banner/Banner.tsx"],"sourcesContent":["import type { ComponentPropsWithoutRef, ReactNode } from 'react'\n\nimport cn from 'classnames'\n\nimport styles from './Banner.module.css'\n\nexport type BannerDataTestId = {\n root?: string\n icon?: string\n title?: string\n description?: string\n action?: string\n}\n\nexport type BannerProps = ComponentPropsWithoutRef<'div'> & {\n icon?: ReactNode\n title: ReactNode\n description?: ReactNode\n action?: ReactNode\n dataTestId?: BannerDataTestId\n}\n\nexport const Banner = ({\n icon,\n title,\n description,\n action,\n className,\n dataTestId,\n ...rest\n}: BannerProps) => (\n <div\n className={cn(styles.banner, className)}\n data-testid={dataTestId?.root}\n {...rest}\n >\n <div className={styles.content}>\n {icon ? (\n <span className={styles.icon} data-testid={dataTestId?.icon}>\n {icon}\n </span>\n ) : null}\n <div className={styles.text}>\n <p className={styles.title} data-testid={dataTestId?.title}>\n {title}\n </p>\n {description ? (\n <p\n className={styles.description}\n data-testid={dataTestId?.description}\n >\n {description}\n </p>\n ) : null}\n </div>\n </div>\n {action ? (\n <div className={styles.action} data-testid={dataTestId?.action}>\n {action}\n </div>\n ) : null}\n </div>\n)\n\nBanner.displayName = 'Banner'\n"],"names":["Banner","_ref","icon","title","description","action","className","dataTestId","rest","_jsxs","cn","styles","banner","root","children","content","_jsx","text","displayName"],"mappings":";;;;;;;;AAsBO,MAAMA,MAAM,GAAGC,IAAA,IAAA;EAAA,IAAC;IACrBC,IAAI;IACJC,KAAK;IACLC,WAAW;IACXC,MAAM;IACNC,SAAS;IACTC,UAAU;IACV,GAAGC,IAAAA;AACQ,GAAC,GAAAP,IAAA,CAAA;AAAA,EAAA,oBACZQ,eAAA,CAAA,KAAA,EAAA;IACEH,SAAS,EAAEI,EAAE,CAACC,aAAM,CAACC,MAAM,EAAEN,SAAS,CAAE;IACxC,aAAaC,EAAAA,UAAU,EAAEM,IAAK;AAAA,IAAA,GAC1BL,IAAI;AAAAM,IAAAA,QAAA,gBAERL,eAAA,CAAA,KAAA,EAAA;MAAKH,SAAS,EAAEK,aAAM,CAACI,OAAQ;MAAAD,QAAA,EAAA,CAC5BZ,IAAI,gBACHc,cAAA,CAAA,MAAA,EAAA;QAAMV,SAAS,EAAEK,aAAM,CAACT,IAAK;QAAC,aAAaK,EAAAA,UAAU,EAAEL,IAAK;AAAAY,QAAAA,QAAA,EACzDZ,IAAAA;AAAI,OACD,CAAC,GACL,IAAI,eACRO,eAAA,CAAA,KAAA,EAAA;QAAKH,SAAS,EAAEK,aAAM,CAACM,IAAK;AAAAH,QAAAA,QAAA,gBAC1BE,cAAA,CAAA,GAAA,EAAA;UAAGV,SAAS,EAAEK,aAAM,CAACR,KAAM;UAAC,aAAaI,EAAAA,UAAU,EAAEJ,KAAM;AAAAW,UAAAA,QAAA,EACxDX,KAAAA;AAAK,SACL,CAAC,EACHC,WAAW,gBACVY,cAAA,CAAA,GAAA,EAAA;UACEV,SAAS,EAAEK,aAAM,CAACP,WAAY;UAC9B,aAAaG,EAAAA,UAAU,EAAEH,WAAY;AAAAU,UAAAA,QAAA,EAEpCV,WAAAA;SACA,CAAC,GACF,IAAI,CAAA;AAAA,OACL,CAAC,CAAA;AAAA,KACH,CAAC,EACLC,MAAM,gBACLW,cAAA,CAAA,KAAA,EAAA;MAAKV,SAAS,EAAEK,aAAM,CAACN,MAAO;MAAC,aAAaE,EAAAA,UAAU,EAAEF,MAAO;AAAAS,MAAAA,QAAA,EAC5DT,MAAAA;KACE,CAAC,GACJ,IAAI,CAAA;AAAA,GACL,CAAC,CAAA;AAAA,EACP;AAEDL,MAAM,CAACkB,WAAW,GAAG,QAAQ;;;;"}
1
+ {"version":3,"file":"Banner.cjs","sources":["../../../src/banner/Banner.tsx"],"sourcesContent":["import type { ComponentPropsWithoutRef, ReactNode } from 'react'\n\nimport cn from 'classnames'\n\nimport styles from './Banner.module.css'\n\nexport type BannerDataTestId = {\n root?: string\n icon?: string\n title?: string\n description?: string\n action?: string\n}\n\nexport type BannerProps = ComponentPropsWithoutRef<'div'> & {\n icon?: ReactNode\n title: ReactNode\n description?: ReactNode\n action?: ReactNode\n dataTestId?: BannerDataTestId\n}\n\n/** Compact card row: icon, title and description, with an optional `action` slot on the right (usually a `Button`). */\nexport const Banner = ({\n icon,\n title,\n description,\n action,\n className,\n dataTestId,\n ...rest\n}: BannerProps) => (\n <div\n className={cn(styles.banner, className)}\n data-testid={dataTestId?.root}\n {...rest}\n >\n <div className={styles.content}>\n {icon ? (\n <span className={styles.icon} data-testid={dataTestId?.icon}>\n {icon}\n </span>\n ) : null}\n <div className={styles.text}>\n <p className={styles.title} data-testid={dataTestId?.title}>\n {title}\n </p>\n {description ? (\n <p\n className={styles.description}\n data-testid={dataTestId?.description}\n >\n {description}\n </p>\n ) : null}\n </div>\n </div>\n {action ? (\n <div className={styles.action} data-testid={dataTestId?.action}>\n {action}\n </div>\n ) : null}\n </div>\n)\n\nBanner.displayName = 'Banner'\n"],"names":["Banner","_ref","icon","title","description","action","className","dataTestId","rest","_jsxs","cn","styles","banner","root","children","content","_jsx","text","displayName"],"mappings":";;;;;;;;AAsBA;AACO,MAAMA,MAAM,GAAGC,IAAA,IAAA;EAAA,IAAC;IACrBC,IAAI;IACJC,KAAK;IACLC,WAAW;IACXC,MAAM;IACNC,SAAS;IACTC,UAAU;IACV,GAAGC,IAAAA;AACQ,GAAC,GAAAP,IAAA,CAAA;AAAA,EAAA,oBACZQ,eAAA,CAAA,KAAA,EAAA;IACEH,SAAS,EAAEI,EAAE,CAACC,aAAM,CAACC,MAAM,EAAEN,SAAS,CAAE;IACxC,aAAaC,EAAAA,UAAU,EAAEM,IAAK;AAAA,IAAA,GAC1BL,IAAI;AAAAM,IAAAA,QAAA,gBAERL,eAAA,CAAA,KAAA,EAAA;MAAKH,SAAS,EAAEK,aAAM,CAACI,OAAQ;MAAAD,QAAA,EAAA,CAC5BZ,IAAI,gBACHc,cAAA,CAAA,MAAA,EAAA;QAAMV,SAAS,EAAEK,aAAM,CAACT,IAAK;QAAC,aAAaK,EAAAA,UAAU,EAAEL,IAAK;AAAAY,QAAAA,QAAA,EACzDZ,IAAAA;AAAI,OACD,CAAC,GACL,IAAI,eACRO,eAAA,CAAA,KAAA,EAAA;QAAKH,SAAS,EAAEK,aAAM,CAACM,IAAK;AAAAH,QAAAA,QAAA,gBAC1BE,cAAA,CAAA,GAAA,EAAA;UAAGV,SAAS,EAAEK,aAAM,CAACR,KAAM;UAAC,aAAaI,EAAAA,UAAU,EAAEJ,KAAM;AAAAW,UAAAA,QAAA,EACxDX,KAAAA;AAAK,SACL,CAAC,EACHC,WAAW,gBACVY,cAAA,CAAA,GAAA,EAAA;UACEV,SAAS,EAAEK,aAAM,CAACP,WAAY;UAC9B,aAAaG,EAAAA,UAAU,EAAEH,WAAY;AAAAU,UAAAA,QAAA,EAEpCV,WAAAA;SACA,CAAC,GACF,IAAI,CAAA;AAAA,OACL,CAAC,CAAA;AAAA,KACH,CAAC,EACLC,MAAM,gBACLW,cAAA,CAAA,KAAA,EAAA;MAAKV,SAAS,EAAEK,aAAM,CAACN,MAAO;MAAC,aAAaE,EAAAA,UAAU,EAAEF,MAAO;AAAAS,MAAAA,QAAA,EAC5DT,MAAAA;KACE,CAAC,GACJ,IAAI,CAAA;AAAA,GACL,CAAC,CAAA;AAAA,EACP;AAEDL,MAAM,CAACkB,WAAW,GAAG,QAAQ;;;;"}
@@ -6,31 +6,49 @@ const react = require('react');
6
6
  const cn = require('classnames');
7
7
  const Breadcrumbs_module = require('./Breadcrumbs.module.css.cjs');
8
8
  const jsxRuntime = require('react/jsx-runtime');
9
+ const useEdgeFade = require('../hooks/useEdgeFade.cjs');
10
+ const useIsomorphicLayoutEffect = require('../hooks/useIsomorphicLayoutEffect.cjs');
9
11
  const ActionElement = require('../utils/ActionElement.cjs');
10
12
  const IconChevronRight = require('../icons/components/base/IconChevronRight.cjs');
11
13
 
12
- const syncFade = list => {
13
- list.toggleAttribute('data-fade-start', list.scrollLeft > 0);
14
- list.toggleAttribute('data-fade-end', list.scrollLeft < list.scrollWidth - list.clientWidth - 1);
14
+ const ANCHOR_ONLY = ['href', 'onClick', 'disabled', 'external', 'linkProps', 'type', 'target', 'rel', 'download'];
15
+ const spanAttrs = props => {
16
+ const attrs = {
17
+ ...props
18
+ };
19
+ for (const key of ANCHOR_ONLY) delete attrs[key];
20
+ return attrs;
15
21
  };
16
22
  const syncTitle = e => {
17
23
  const el = e.target.closest('[data-label]');
18
24
  if (!el) return;
19
25
  if (el.scrollWidth > el.clientWidth) el.setAttribute('title', el.textContent ?? '');else el.removeAttribute('title');
20
26
  };
21
- const Breadcrumbs = _ref => {
27
+ const BreadcrumbsTrail = /*#__PURE__*/react.forwardRef((_ref, ref) => {
22
28
  let {
23
29
  items,
24
30
  className,
31
+ dataTestId,
25
32
  ...rest
26
33
  } = _ref;
27
34
  const listRef = react.useRef(null);
28
- react.useLayoutEffect(() => {
35
+ const {
36
+ sync,
37
+ onFocus
38
+ } = useEdgeFade.useEdgeFade(listRef);
39
+ const trailRef = react.useRef();
40
+ useIsomorphicLayoutEffect.useIsomorphicLayoutEffect(() => {
29
41
  const list = listRef.current;
30
42
  if (!list) return;
31
- list.scrollLeft = list.scrollWidth;
32
- syncFade(list);
33
- }, [items]);
43
+ const trail = Array.from(list.children, li => li.textContent).join('\u0000');
44
+ if (trail !== trailRef.current) {
45
+ trailRef.current = trail;
46
+ list.scrollLeft = list.scrollWidth;
47
+ }
48
+ sync();
49
+ });
50
+
51
+ // A list mounted hidden (display: none) can't scroll on mount, so scroll once it gets a width.
34
52
  react.useEffect(() => {
35
53
  const list = listRef.current;
36
54
  if (!list || typeof ResizeObserver === 'undefined') return;
@@ -38,53 +56,55 @@ const Breadcrumbs = _ref => {
38
56
  const observer = new ResizeObserver(() => {
39
57
  const wasHidden = hidden;
40
58
  hidden = list.clientWidth === 0;
41
- if (wasHidden && !hidden) list.scrollLeft = list.scrollWidth;
42
- syncFade(list);
59
+ if (!wasHidden || hidden) return;
60
+ list.scrollLeft = list.scrollWidth;
61
+ sync();
43
62
  });
44
63
  observer.observe(list);
45
64
  return () => observer.disconnect();
46
- }, []);
65
+ }, [sync]);
47
66
  return /*#__PURE__*/jsxRuntime.jsx("nav", {
67
+ ref: ref,
48
68
  "aria-label": "Breadcrumb",
49
69
  className: cn(Breadcrumbs_module.nav, className),
70
+ "data-testid": dataTestId?.root,
50
71
  ...rest,
51
72
  children: /*#__PURE__*/jsxRuntime.jsx("ol", {
52
73
  ref: listRef,
53
74
  className: Breadcrumbs_module.list,
54
- onScroll: e => syncFade(e.currentTarget),
75
+ "data-testid": dataTestId?.list,
76
+ onScroll: sync,
77
+ onFocus: onFocus,
55
78
  onPointerOver: syncTitle,
56
79
  children: items.map((_ref2, index) => {
57
80
  let {
58
81
  label,
82
+ dataTestId: itemTestId,
59
83
  ...itemProps
60
84
  } = _ref2;
85
+ const current = index === items.length - 1;
61
86
  const labelAttrs = itemProps.title === undefined ? {
62
87
  'data-label': ''
63
88
  } : {};
64
- if (index === items.length - 1) {
65
- return /*#__PURE__*/jsxRuntime.jsx("li", {
66
- className: Breadcrumbs_module.item,
67
- children: /*#__PURE__*/jsxRuntime.jsx("span", {
68
- "aria-current": "page",
69
- className: cn(Breadcrumbs_module.label, Breadcrumbs_module.current),
70
- ...labelAttrs,
71
- children: label
72
- })
73
- }, index);
74
- }
75
- const interactive = itemProps.href !== undefined || itemProps.onClick !== undefined;
89
+ const interactive = !current && (itemProps.href !== undefined || itemProps.onClick !== undefined) && !itemProps.disabled;
76
90
  return /*#__PURE__*/jsxRuntime.jsxs("li", {
77
91
  className: Breadcrumbs_module.item,
78
92
  children: [interactive ? /*#__PURE__*/jsxRuntime.jsx(ActionElement.ActionElement, {
93
+ "data-testid": itemTestId?.root,
79
94
  ...itemProps,
80
95
  ...labelAttrs,
81
96
  className: cn(Breadcrumbs_module.label, Breadcrumbs_module.link, itemProps.className),
82
97
  children: label
83
98
  }) : /*#__PURE__*/jsxRuntime.jsx("span", {
84
- className: Breadcrumbs_module.label,
99
+ "data-testid": itemTestId?.root,
100
+ ...spanAttrs(itemProps),
85
101
  ...labelAttrs,
102
+ ...(current && {
103
+ 'aria-current': 'page'
104
+ }),
105
+ className: cn(Breadcrumbs_module.label, current && Breadcrumbs_module.current, itemProps.className),
86
106
  children: label
87
- }), /*#__PURE__*/jsxRuntime.jsx(IconChevronRight.IconChevronRight, {
107
+ }), !current && /*#__PURE__*/jsxRuntime.jsx(IconChevronRight.IconChevronRight, {
88
108
  className: Breadcrumbs_module.separator,
89
109
  "aria-hidden": "true"
90
110
  })]
@@ -92,7 +112,17 @@ const Breadcrumbs = _ref => {
92
112
  })
93
113
  })
94
114
  });
95
- };
115
+ });
116
+ BreadcrumbsTrail.displayName = 'BreadcrumbsTrail';
117
+
118
+ /** Trail of ancestors ending in the current page (`aria-current="page"`); scrolls horizontally with an edge fade when it overflows. */
119
+ const Breadcrumbs = /*#__PURE__*/react.forwardRef((props, ref) =>
120
+ // Separate component so its mount effects attach once the list exists.
121
+ props.items.length === 0 ? null : /*#__PURE__*/jsxRuntime.jsx(BreadcrumbsTrail, {
122
+ ref: ref,
123
+ ...props
124
+ }));
125
+ Breadcrumbs.displayName = 'Breadcrumbs';
96
126
 
97
127
  exports.Breadcrumbs = Breadcrumbs;
98
128
  //# sourceMappingURL=Breadcrumbs.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Breadcrumbs.cjs","sources":["../../../src/breadcrumbs/Breadcrumbs.tsx"],"sourcesContent":["import { useEffect, useLayoutEffect, useRef } from 'react'\nimport type { HTMLAttributes, PointerEvent, ReactNode } from 'react'\n\nimport cn from 'classnames'\n\nimport { IconChevronRight } from '../icons'\nimport { ActionElement, type ActionElementProps } from '../utils'\nimport styles from './Breadcrumbs.module.css'\n\nexport type BreadcrumbItem = ActionElementProps & {\n label: ReactNode\n children?: never\n}\n\nexport type BreadcrumbsProps = HTMLAttributes<HTMLElement> & {\n items: BreadcrumbItem[]\n}\n\nconst syncFade = (list: HTMLElement) => {\n list.toggleAttribute('data-fade-start', list.scrollLeft > 0)\n list.toggleAttribute(\n 'data-fade-end',\n list.scrollLeft < list.scrollWidth - list.clientWidth - 1,\n )\n}\n\nconst syncTitle = (e: PointerEvent<HTMLElement>) => {\n const el = (e.target as Element).closest('[data-label]')\n if (!el) return\n if (el.scrollWidth > el.clientWidth)\n el.setAttribute('title', el.textContent ?? '')\n else el.removeAttribute('title')\n}\n\nexport const Breadcrumbs = ({\n items,\n className,\n ...rest\n}: BreadcrumbsProps) => {\n const listRef = useRef<HTMLOListElement>(null)\n\n useLayoutEffect(() => {\n const list = listRef.current\n if (!list) return\n list.scrollLeft = list.scrollWidth\n syncFade(list)\n }, [items])\n\n useEffect(() => {\n const list = listRef.current\n if (!list || typeof ResizeObserver === 'undefined') return\n let hidden = list.clientWidth === 0\n const observer = new ResizeObserver(() => {\n const wasHidden = hidden\n hidden = list.clientWidth === 0\n if (wasHidden && !hidden) list.scrollLeft = list.scrollWidth\n syncFade(list)\n })\n observer.observe(list)\n return () => observer.disconnect()\n }, [])\n\n return (\n <nav\n aria-label='Breadcrumb'\n className={cn(styles.nav, className)}\n {...rest}\n >\n <ol\n ref={listRef}\n className={styles.list}\n onScroll={(e) => syncFade(e.currentTarget)}\n onPointerOver={syncTitle}\n >\n {items.map(({ label, ...itemProps }, index) => {\n const labelAttrs =\n itemProps.title === undefined ? { 'data-label': '' } : {}\n if (index === items.length - 1) {\n return (\n <li key={index} className={styles.item}>\n <span\n aria-current='page'\n className={cn(styles.label, styles.current)}\n {...labelAttrs}\n >\n {label}\n </span>\n </li>\n )\n }\n const interactive =\n itemProps.href !== undefined || itemProps.onClick !== undefined\n return (\n <li key={index} className={styles.item}>\n {interactive ? (\n <ActionElement\n {...itemProps}\n {...labelAttrs}\n className={cn(styles.label, styles.link, itemProps.className)}\n >\n {label}\n </ActionElement>\n ) : (\n <span className={styles.label} {...labelAttrs}>\n {label}\n </span>\n )}\n <IconChevronRight\n className={styles.separator}\n aria-hidden='true'\n />\n </li>\n )\n })}\n </ol>\n </nav>\n )\n}\n"],"names":["syncFade","list","toggleAttribute","scrollLeft","scrollWidth","clientWidth","syncTitle","e","el","target","closest","setAttribute","textContent","removeAttribute","Breadcrumbs","_ref","items","className","rest","listRef","useRef","useLayoutEffect","current","useEffect","ResizeObserver","hidden","observer","wasHidden","observe","disconnect","_jsx","cn","styles","nav","children","ref","onScroll","currentTarget","onPointerOver","map","_ref2","index","label","itemProps","labelAttrs","title","undefined","length","item","interactive","href","onClick","_jsxs","ActionElement","link","IconChevronRight","separator"],"mappings":"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"}
1
+ {"version":3,"file":"Breadcrumbs.cjs","sources":["../../../src/breadcrumbs/Breadcrumbs.tsx"],"sourcesContent":["import { forwardRef, useEffect, useRef } from 'react'\nimport type { HTMLAttributes, PointerEvent, ReactNode } from 'react'\n\nimport cn from 'classnames'\n\nimport { useEdgeFade, useIsomorphicLayoutEffect } from '../hooks'\nimport { IconChevronRight } from '../icons'\nimport { ActionElement, type ActionElementProps } from '../utils'\nimport styles from './Breadcrumbs.module.css'\n\nexport type BreadcrumbItemDataTestId = { root?: string }\n\nexport type BreadcrumbItem = ActionElementProps & {\n label: ReactNode\n children?: never\n /** Test id of the item's label element, for link, plain and current items alike. */\n dataTestId?: BreadcrumbItemDataTestId\n}\n\nexport type BreadcrumbsDataTestId = { root?: string; list?: string }\n\nexport type BreadcrumbsProps = HTMLAttributes<HTMLElement> & {\n /** `href` renders a link, only `onClick` a button, anything else (and `disabled`) plain text; the last item is the current page; an empty array renders nothing. */\n items: BreadcrumbItem[]\n dataTestId?: BreadcrumbsDataTestId\n}\n\nconst ANCHOR_ONLY = [\n 'href',\n 'onClick',\n 'disabled',\n 'external',\n 'linkProps',\n 'type',\n 'target',\n 'rel',\n 'download',\n] as const\n\nconst spanAttrs = (props: Omit<BreadcrumbItem, 'label'>) => {\n const attrs: Record<string, unknown> = { ...props }\n for (const key of ANCHOR_ONLY) delete attrs[key]\n return attrs as HTMLAttributes<HTMLSpanElement>\n}\n\nconst syncTitle = (e: PointerEvent<HTMLElement>) => {\n const el = (e.target as Element).closest('[data-label]')\n if (!el) return\n if (el.scrollWidth > el.clientWidth)\n el.setAttribute('title', el.textContent ?? '')\n else el.removeAttribute('title')\n}\n\nconst BreadcrumbsTrail = forwardRef<HTMLElement, BreadcrumbsProps>(\n ({ items, className, dataTestId, ...rest }, ref) => {\n const listRef = useRef<HTMLOListElement>(null)\n\n const { sync, onFocus } = useEdgeFade(listRef)\n const trailRef = useRef<string>()\n\n useIsomorphicLayoutEffect(() => {\n const list = listRef.current\n if (!list) return\n const trail = Array.from(list.children, (li) => li.textContent).join(\n '\\u0000',\n )\n if (trail !== trailRef.current) {\n trailRef.current = trail\n list.scrollLeft = list.scrollWidth\n }\n sync()\n })\n\n // A list mounted hidden (display: none) can't scroll on mount, so scroll once it gets a width.\n useEffect(() => {\n const list = listRef.current\n if (!list || typeof ResizeObserver === 'undefined') return\n let hidden = list.clientWidth === 0\n const observer = new ResizeObserver(() => {\n const wasHidden = hidden\n hidden = list.clientWidth === 0\n if (!wasHidden || hidden) return\n list.scrollLeft = list.scrollWidth\n sync()\n })\n observer.observe(list)\n return () => observer.disconnect()\n }, [sync])\n\n return (\n <nav\n ref={ref}\n aria-label='Breadcrumb'\n className={cn(styles.nav, className)}\n data-testid={dataTestId?.root}\n {...rest}\n >\n <ol\n ref={listRef}\n className={styles.list}\n data-testid={dataTestId?.list}\n onScroll={sync}\n onFocus={onFocus}\n onPointerOver={syncTitle}\n >\n {items.map(\n ({ label, dataTestId: itemTestId, ...itemProps }, index) => {\n const current = index === items.length - 1\n const labelAttrs =\n itemProps.title === undefined ? { 'data-label': '' } : {}\n const interactive =\n !current &&\n (itemProps.href !== undefined ||\n itemProps.onClick !== undefined) &&\n !itemProps.disabled\n return (\n <li key={index} className={styles.item}>\n {interactive ? (\n <ActionElement\n data-testid={itemTestId?.root}\n {...itemProps}\n {...labelAttrs}\n className={cn(\n styles.label,\n styles.link,\n itemProps.className,\n )}\n >\n {label}\n </ActionElement>\n ) : (\n <span\n data-testid={itemTestId?.root}\n {...spanAttrs(itemProps)}\n {...labelAttrs}\n {...(current && { 'aria-current': 'page' as const })}\n className={cn(\n styles.label,\n current && styles.current,\n itemProps.className,\n )}\n >\n {label}\n </span>\n )}\n {!current && (\n <IconChevronRight\n className={styles.separator}\n aria-hidden='true'\n />\n )}\n </li>\n )\n },\n )}\n </ol>\n </nav>\n )\n },\n)\n\nBreadcrumbsTrail.displayName = 'BreadcrumbsTrail'\n\n/** Trail of ancestors ending in the current page (`aria-current=\"page\"`); scrolls horizontally with an edge fade when it overflows. */\nexport const Breadcrumbs = forwardRef<HTMLElement, BreadcrumbsProps>(\n (props, ref) =>\n // Separate component so its mount effects attach once the list exists.\n props.items.length === 0 ? null : <BreadcrumbsTrail ref={ref} {...props} />,\n)\n\nBreadcrumbs.displayName = 'Breadcrumbs'\n"],"names":["ANCHOR_ONLY","spanAttrs","props","attrs","key","syncTitle","e","el","target","closest","scrollWidth","clientWidth","setAttribute","textContent","removeAttribute","BreadcrumbsTrail","forwardRef","_ref","ref","items","className","dataTestId","rest","listRef","useRef","sync","onFocus","useEdgeFade","trailRef","useIsomorphicLayoutEffect","list","current","trail","Array","from","children","li","join","scrollLeft","useEffect","ResizeObserver","hidden","observer","wasHidden","observe","disconnect","_jsx","cn","styles","nav","root","onScroll","onPointerOver","map","_ref2","index","label","itemTestId","itemProps","length","labelAttrs","title","undefined","interactive","href","onClick","disabled","_jsxs","item","ActionElement","link","IconChevronRight","separator","displayName","Breadcrumbs"],"mappings":";;;;;;;;;;;;;AA2BA,MAAMA,WAAW,GAAG,CAClB,MAAM,EACN,SAAS,EACT,UAAU,EACV,UAAU,EACV,WAAW,EACX,MAAM,EACN,QAAQ,EACR,KAAK,EACL,UAAU,CACF,CAAA;AAEV,MAAMC,SAAS,GAAIC,KAAoC,IAAK;AAC1D,EAAA,MAAMC,KAA8B,GAAG;IAAE,GAAGD,KAAAA;GAAO,CAAA;EACnD,KAAK,MAAME,GAAG,IAAIJ,WAAW,EAAE,OAAOG,KAAK,CAACC,GAAG,CAAC,CAAA;AAChD,EAAA,OAAOD,KAAK,CAAA;AACd,CAAC,CAAA;AAED,MAAME,SAAS,GAAIC,CAA4B,IAAK;EAClD,MAAMC,EAAE,GAAID,CAAC,CAACE,MAAM,CAAaC,OAAO,CAAC,cAAc,CAAC,CAAA;EACxD,IAAI,CAACF,EAAE,EAAE,OAAA;EACT,IAAIA,EAAE,CAACG,WAAW,GAAGH,EAAE,CAACI,WAAW,EACjCJ,EAAE,CAACK,YAAY,CAAC,OAAO,EAAEL,EAAE,CAACM,WAAW,IAAI,EAAE,CAAC,CAC3CN,KAAAA,EAAE,CAACO,eAAe,CAAC,OAAO,CAAC,CAAA;AAClC,CAAC,CAAA;AAED,MAAMC,gBAAgB,gBAAGC,gBAAU,CACjC,CAAAC,IAAA,EAA4CC,GAAG,KAAK;EAAA,IAAnD;IAAEC,KAAK;IAAEC,SAAS;IAAEC,UAAU;IAAE,GAAGC,IAAAA;AAAK,GAAC,GAAAL,IAAA,CAAA;AACxC,EAAA,MAAMM,OAAO,GAAGC,YAAM,CAAmB,IAAI,CAAC,CAAA;EAE9C,MAAM;IAAEC,IAAI;AAAEC,IAAAA,OAAAA;AAAQ,GAAC,GAAGC,uBAAW,CAACJ,OAAO,CAAC,CAAA;AAC9C,EAAA,MAAMK,QAAQ,GAAGJ,YAAM,EAAU,CAAA;AAEjCK,EAAAA,mDAAyB,CAAC,MAAM;AAC9B,IAAA,MAAMC,IAAI,GAAGP,OAAO,CAACQ,OAAO,CAAA;IAC5B,IAAI,CAACD,IAAI,EAAE,OAAA;IACX,MAAME,KAAK,GAAGC,KAAK,CAACC,IAAI,CAACJ,IAAI,CAACK,QAAQ,EAAGC,EAAE,IAAKA,EAAE,CAACvB,WAAW,CAAC,CAACwB,IAAI,CAClE,QACF,CAAC,CAAA;AACD,IAAA,IAAIL,KAAK,KAAKJ,QAAQ,CAACG,OAAO,EAAE;MAC9BH,QAAQ,CAACG,OAAO,GAAGC,KAAK,CAAA;AACxBF,MAAAA,IAAI,CAACQ,UAAU,GAAGR,IAAI,CAACpB,WAAW,CAAA;AACpC,KAAA;AACAe,IAAAA,IAAI,EAAE,CAAA;AACR,GAAC,CAAC,CAAA;;AAEF;AACAc,EAAAA,eAAS,CAAC,MAAM;AACd,IAAA,MAAMT,IAAI,GAAGP,OAAO,CAACQ,OAAO,CAAA;AAC5B,IAAA,IAAI,CAACD,IAAI,IAAI,OAAOU,cAAc,KAAK,WAAW,EAAE,OAAA;AACpD,IAAA,IAAIC,MAAM,GAAGX,IAAI,CAACnB,WAAW,KAAK,CAAC,CAAA;AACnC,IAAA,MAAM+B,QAAQ,GAAG,IAAIF,cAAc,CAAC,MAAM;MACxC,MAAMG,SAAS,GAAGF,MAAM,CAAA;AACxBA,MAAAA,MAAM,GAAGX,IAAI,CAACnB,WAAW,KAAK,CAAC,CAAA;AAC/B,MAAA,IAAI,CAACgC,SAAS,IAAIF,MAAM,EAAE,OAAA;AAC1BX,MAAAA,IAAI,CAACQ,UAAU,GAAGR,IAAI,CAACpB,WAAW,CAAA;AAClCe,MAAAA,IAAI,EAAE,CAAA;AACR,KAAC,CAAC,CAAA;AACFiB,IAAAA,QAAQ,CAACE,OAAO,CAACd,IAAI,CAAC,CAAA;AACtB,IAAA,OAAO,MAAMY,QAAQ,CAACG,UAAU,EAAE,CAAA;AACpC,GAAC,EAAE,CAACpB,IAAI,CAAC,CAAC,CAAA;AAEV,EAAA,oBACEqB,cAAA,CAAA,KAAA,EAAA;AACE5B,IAAAA,GAAG,EAAEA,GAAI;AACT,IAAA,YAAA,EAAW,YAAY;IACvBE,SAAS,EAAE2B,EAAE,CAACC,kBAAM,CAACC,GAAG,EAAE7B,SAAS,CAAE;IACrC,aAAaC,EAAAA,UAAU,EAAE6B,IAAK;AAAA,IAAA,GAC1B5B,IAAI;AAAAa,IAAAA,QAAA,eAERW,cAAA,CAAA,IAAA,EAAA;AACE5B,MAAAA,GAAG,EAAEK,OAAQ;MACbH,SAAS,EAAE4B,kBAAM,CAAClB,IAAK;MACvB,aAAaT,EAAAA,UAAU,EAAES,IAAK;AAC9BqB,MAAAA,QAAQ,EAAE1B,IAAK;AACfC,MAAAA,OAAO,EAAEA,OAAQ;AACjB0B,MAAAA,aAAa,EAAE/C,SAAU;MAAA8B,QAAA,EAExBhB,KAAK,CAACkC,GAAG,CACR,CAAAC,KAAA,EAAkDC,KAAK,KAAK;QAAA,IAA3D;UAAEC,KAAK;AAAEnC,UAAAA,UAAU,EAAEoC,UAAU;UAAE,GAAGC,SAAAA;AAAU,SAAC,GAAAJ,KAAA,CAAA;QAC9C,MAAMvB,OAAO,GAAGwB,KAAK,KAAKpC,KAAK,CAACwC,MAAM,GAAG,CAAC,CAAA;AAC1C,QAAA,MAAMC,UAAU,GACdF,SAAS,CAACG,KAAK,KAAKC,SAAS,GAAG;AAAE,UAAA,YAAY,EAAE,EAAA;SAAI,GAAG,EAAE,CAAA;QAC3D,MAAMC,WAAW,GACf,CAAChC,OAAO,KACP2B,SAAS,CAACM,IAAI,KAAKF,SAAS,IAC3BJ,SAAS,CAACO,OAAO,KAAKH,SAAS,CAAC,IAClC,CAACJ,SAAS,CAACQ,QAAQ,CAAA;AACrB,QAAA,oBACEC,eAAA,CAAA,IAAA,EAAA;UAAgB/C,SAAS,EAAE4B,kBAAM,CAACoB,IAAK;AAAAjC,UAAAA,QAAA,EACpC4B,CAAAA,WAAW,gBACVjB,cAAA,CAACuB,2BAAa,EAAA;YACZ,aAAaZ,EAAAA,UAAU,EAAEP,IAAK;AAAA,YAAA,GAC1BQ,SAAS;AAAA,YAAA,GACTE,UAAU;AACdxC,YAAAA,SAAS,EAAE2B,EAAE,CACXC,kBAAM,CAACQ,KAAK,EACZR,kBAAM,CAACsB,IAAI,EACXZ,SAAS,CAACtC,SACZ,CAAE;AAAAe,YAAAA,QAAA,EAEDqB,KAAAA;WACY,CAAC,gBAEhBV,cAAA,CAAA,MAAA,EAAA;YACE,aAAaW,EAAAA,UAAU,EAAEP,IAAK;YAAA,GAC1BjD,SAAS,CAACyD,SAAS,CAAC;AAAA,YAAA,GACpBE,UAAU;AAAA,YAAA,IACT7B,OAAO,IAAI;AAAE,cAAA,cAAc,EAAE,MAAA;aAAiB,CAAA;AACnDX,YAAAA,SAAS,EAAE2B,EAAE,CACXC,kBAAM,CAACQ,KAAK,EACZzB,OAAO,IAAIiB,kBAAM,CAACjB,OAAO,EACzB2B,SAAS,CAACtC,SACZ,CAAE;AAAAe,YAAAA,QAAA,EAEDqB,KAAAA;AAAK,WACF,CACP,EACA,CAACzB,OAAO,iBACPe,cAAA,CAACyB,iCAAgB,EAAA;YACfnD,SAAS,EAAE4B,kBAAM,CAACwB,SAAU;YAC5B,aAAY,EAAA,MAAA;AAAM,WACnB,CACF,CAAA;AAAA,SAAA,EAlCMjB,KAmCL,CAAC,CAAA;OAGX,CAAA;KACE,CAAA;AAAC,GACF,CAAC,CAAA;AAEV,CACF,CAAC,CAAA;AAEDxC,gBAAgB,CAAC0D,WAAW,GAAG,kBAAkB,CAAA;;AAEjD;AACO,MAAMC,WAAW,gBAAG1D,gBAAU,CACnC,CAACd,KAAK,EAAEgB,GAAG;AACT;AACAhB,KAAK,CAACiB,KAAK,CAACwC,MAAM,KAAK,CAAC,GAAG,IAAI,gBAAGb,cAAA,CAAC/B,gBAAgB,EAAA;AAACG,EAAAA,GAAG,EAAEA,GAAI;EAAA,GAAKhB,KAAAA;AAAK,CAAG,CAC9E,EAAC;AAEDwE,WAAW,CAACD,WAAW,GAAG,aAAa;;;;"}
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- const styles = {"nav":"Breadcrumbs-module_nav__cDuA5","list":"Breadcrumbs-module_list__A6dlB","item":"Breadcrumbs-module_item__3t-Zj","label":"Breadcrumbs-module_label__gVU35","link":"Breadcrumbs-module_link__KJ87-","current":"Breadcrumbs-module_current__XK0a2","separator":"Breadcrumbs-module_separator__k-Tmd"};
3
+ const styles = {"nav":"Breadcrumbs-module_nav__cDuA5","list":"Breadcrumbs-module_list__A6dlB ScrollFade-module_scrollFade__bK-Oi","item":"Breadcrumbs-module_item__3t-Zj","label":"Breadcrumbs-module_label__gVU35","link":"Breadcrumbs-module_link__KJ87-","current":"Breadcrumbs-module_current__XK0a2","separator":"Breadcrumbs-module_separator__k-Tmd"};
4
4
 
5
5
  module.exports = styles;
6
6
  //# sourceMappingURL=Breadcrumbs.module.css.cjs.map