@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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Layout.module.css.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
@@ -0,0 +1,29 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
4
+
5
+ const react = require('react');
6
+ const cn = require('classnames');
7
+ const Main_module = require('./Main.module.css.cjs');
8
+ const jsxRuntime = require('react/jsx-runtime');
9
+
10
+ const MAIN_CONTENT_ID = 'main-content';
11
+ /** Page landmark that SkipLink targets; grows to push Footer down. */
12
+ const Main = /*#__PURE__*/react.forwardRef((_ref, ref) => {
13
+ let {
14
+ id = MAIN_CONTENT_ID,
15
+ className,
16
+ ...rest
17
+ } = _ref;
18
+ return /*#__PURE__*/jsxRuntime.jsx("main", {
19
+ ref: ref,
20
+ id: id,
21
+ className: cn(Main_module.root, className),
22
+ ...rest
23
+ });
24
+ });
25
+ Main.displayName = 'Main';
26
+
27
+ exports.MAIN_CONTENT_ID = MAIN_CONTENT_ID;
28
+ exports.Main = Main;
29
+ //# sourceMappingURL=Main.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Main.cjs","sources":["../../../src/page-layout/Main.tsx"],"sourcesContent":["import { forwardRef, type ComponentPropsWithoutRef } from 'react'\n\nimport cn from 'classnames'\n\nimport styles from './Main.module.css'\n\nexport const MAIN_CONTENT_ID = 'main-content'\n\nexport type MainProps = ComponentPropsWithoutRef<'main'>\n\n/** Page landmark that SkipLink targets; grows to push Footer down. */\nexport const Main = forwardRef<HTMLElement, MainProps>(\n ({ id = MAIN_CONTENT_ID, className, ...rest }, ref) => (\n <main ref={ref} id={id} className={cn(styles.root, className)} {...rest} />\n ),\n)\n\nMain.displayName = 'Main'\n"],"names":["MAIN_CONTENT_ID","Main","forwardRef","_ref","ref","id","className","rest","_jsx","cn","styles","root","displayName"],"mappings":";;;;;;;;;AAMO,MAAMA,eAAe,GAAG,eAAc;AAI7C;AACO,MAAMC,IAAI,gBAAGC,gBAAU,CAC5B,CAAAC,IAAA,EAA+CC,GAAG,KAAA;EAAA,IAAjD;AAAEC,IAAAA,EAAE,GAAGL,eAAe;IAAEM,SAAS;IAAE,GAAGC,IAAAA;AAAK,GAAC,GAAAJ,IAAA,CAAA;AAAA,EAAA,oBAC3CK,cAAA,CAAA,MAAA,EAAA;AAAMJ,IAAAA,GAAG,EAAEA,GAAI;AAACC,IAAAA,EAAE,EAAEA,EAAG;IAACC,SAAS,EAAEG,EAAE,CAACC,WAAM,CAACC,IAAI,EAAEL,SAAS,CAAE;IAAA,GAAKC,IAAAA;AAAI,GAAG,CAAC,CAAA;AAAA,CAE/E,EAAC;AAEDN,IAAI,CAACW,WAAW,GAAG,MAAM;;;;;"}
@@ -0,0 +1,6 @@
1
+ 'use strict';
2
+
3
+ const styles = {"root":"Main-module_root__7ClUL"};
4
+
5
+ module.exports = styles;
6
+ //# sourceMappingURL=Main.module.css.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Main.module.css.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
@@ -0,0 +1,22 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
4
+
5
+ const cn = require('classnames');
6
+ const PageContent_module = require('./PageContent.module.css.cjs');
7
+ const jsxRuntime = require('react/jsx-runtime');
8
+
9
+ const PageContent = _ref => {
10
+ let {
11
+ variant = 'default',
12
+ className,
13
+ ...rest
14
+ } = _ref;
15
+ return /*#__PURE__*/jsxRuntime.jsx("div", {
16
+ className: cn(PageContent_module.root, PageContent_module[variant], className),
17
+ ...rest
18
+ });
19
+ };
20
+
21
+ exports.PageContent = PageContent;
22
+ //# sourceMappingURL=PageContent.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PageContent.cjs","sources":["../../../src/page-layout/PageContent.tsx"],"sourcesContent":["import type { HTMLAttributes } from 'react'\n\nimport cn from 'classnames'\n\nimport styles from './PageContent.module.css'\n\nexport type PageContentVariant = 'default' | 'narrow'\n\nexport type PageContentProps = HTMLAttributes<HTMLDivElement> & {\n variant?: PageContentVariant\n}\n\nexport const PageContent = ({\n variant = 'default',\n className,\n ...rest\n}: PageContentProps) => (\n <div className={cn(styles.root, styles[variant], className)} {...rest} />\n)\n"],"names":["PageContent","_ref","variant","className","rest","_jsx","cn","styles","root"],"mappings":";;;;;;;;AAYO,MAAMA,WAAW,GAAGC,IAAA,IAAA;EAAA,IAAC;AAC1BC,IAAAA,OAAO,GAAG,SAAS;IACnBC,SAAS;IACT,GAAGC,IAAAA;AACa,GAAC,GAAAH,IAAA,CAAA;AAAA,EAAA,oBACjBI,cAAA,CAAA,KAAA,EAAA;AAAKF,IAAAA,SAAS,EAAEG,EAAE,CAACC,kBAAM,CAACC,IAAI,EAAED,kBAAM,CAACL,OAAO,CAAC,EAAEC,SAAS,CAAE;IAAA,GAAKC,IAAAA;AAAI,GAAG,CAAC,CAAA;AAAA;;;;"}
@@ -0,0 +1,6 @@
1
+ 'use strict';
2
+
3
+ const styles = {"root":"PageContent-module_root__PqqwR","narrow":"PageContent-module_narrow__0veNv"};
4
+
5
+ module.exports = styles;
6
+ //# sourceMappingURL=PageContent.module.css.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PageContent.module.css.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
@@ -18,10 +18,13 @@ const DEFAULT_LABELS = {
18
18
  records: 'Records',
19
19
  of: 'of',
20
20
  page: 'Page number',
21
+ pageSize: 'Records per page',
21
22
  previous: 'Previous page',
22
23
  next: 'Next page'
23
24
  };
24
25
  const clamp = (value, min, max) => Math.min(Math.max(value, min), max);
26
+
27
+ /** Page-size selector on the left, page input with previous/next controls on the right; Enter or blur jumps to the typed page and out-of-range values are clamped. */
25
28
  const Pagination = _ref => {
26
29
  let {
27
30
  page,
@@ -42,23 +45,24 @@ const Pagination = _ref => {
42
45
  const lastPage = Math.max(pageCount, 1);
43
46
  // `null` while the input is not being edited — it then mirrors `page`.
44
47
  const [draft, setDraft] = react.useState(null);
48
+ const cancelledRef = react.useRef(false);
45
49
  const goTo = next => {
46
50
  const target = clamp(next, 1, lastPage);
47
51
  if (target !== page) onPageChange(target);
48
52
  };
49
53
  const commitDraft = () => {
50
- if (draft !== null && draft !== '') goTo(Number(draft));
54
+ if (!cancelledRef.current && draft !== null && draft !== '') {
55
+ goTo(Number(draft));
56
+ }
57
+ cancelledRef.current = false;
51
58
  setDraft(null);
52
59
  };
53
60
  const handleInputChange = event => {
54
61
  setDraft(event.target.value.replace(/\D/g, ''));
55
62
  };
56
63
  const handleInputKeyDown = event => {
57
- if (event.key === 'Enter') {
58
- commitDraft();
59
- event.currentTarget.blur();
60
- } else if (event.key === 'Escape') {
61
- setDraft(null);
64
+ if (event.key === 'Escape') cancelledRef.current = true;
65
+ if (event.key === 'Enter' || event.key === 'Escape') {
62
66
  event.currentTarget.blur();
63
67
  }
64
68
  };
@@ -91,6 +95,7 @@ const Pagination = _ref => {
91
95
  size: "small",
92
96
  options: sizeOptions,
93
97
  value: String(pageSize),
98
+ listLabel: text.pageSize,
94
99
  onChange: value => onPageSizeChange?.(Number(value)),
95
100
  dataTestId: {
96
101
  trigger: dataTestId?.pageSize
@@ -1 +1 @@
1
- {"version":3,"file":"Pagination.cjs","sources":["../../../src/pagination/Pagination.tsx"],"sourcesContent":["import {\n useState,\n type ChangeEvent,\n type ComponentPropsWithoutRef,\n type CSSProperties,\n type FocusEvent,\n type KeyboardEvent,\n type ReactNode,\n} from 'react'\n\nimport cn from 'classnames'\n\nimport { IconButton } from '../icon-button'\nimport { IconChevronLeft, IconChevronRight } from '../icons'\nimport { Input } from '../input'\nimport { TokenSelector } from '../token-selector'\nimport styles from './Pagination.module.css'\n\nexport type PaginationLabels = {\n show?: ReactNode\n records?: ReactNode\n of?: ReactNode\n page?: string\n previous?: string\n next?: string\n}\n\nexport type PaginationDataTestId = {\n root?: string\n pageSize?: string\n pageInput?: string\n previous?: string\n next?: string\n}\n\nexport type PaginationProps = Omit<\n ComponentPropsWithoutRef<'div'>,\n 'onChange'\n> & {\n /** Current page, 1-based. The component is controlled. */\n page: number\n pageCount: number\n onPageChange: (page: number) => void\n /** Current page size. The \"Show N Records\" block renders only when set. */\n pageSize?: number\n pageSizeOptions?: number[]\n onPageSizeChange?: (pageSize: number) => void\n labels?: PaginationLabels\n dataTestId?: PaginationDataTestId\n}\n\nconst DEFAULT_PAGE_SIZE_OPTIONS = [10, 25, 50, 100]\n\nconst DEFAULT_LABELS: Required<PaginationLabels> = {\n show: 'Show',\n records: 'Records',\n of: 'of',\n page: 'Page number',\n previous: 'Previous page',\n next: 'Next page',\n}\n\nconst clamp = (value: number, min: number, max: number) =>\n Math.min(Math.max(value, min), max)\n\nexport const Pagination = ({\n page,\n pageCount,\n onPageChange,\n pageSize,\n pageSizeOptions = DEFAULT_PAGE_SIZE_OPTIONS,\n onPageSizeChange,\n labels,\n className,\n dataTestId,\n ...rest\n}: PaginationProps) => {\n const text = { ...DEFAULT_LABELS, ...labels }\n const lastPage = Math.max(pageCount, 1)\n // `null` while the input is not being edited — it then mirrors `page`.\n const [draft, setDraft] = useState<string | null>(null)\n\n const goTo = (next: number) => {\n const target = clamp(next, 1, lastPage)\n if (target !== page) onPageChange(target)\n }\n\n const commitDraft = () => {\n if (draft !== null && draft !== '') goTo(Number(draft))\n setDraft(null)\n }\n\n const handleInputChange = (event: ChangeEvent<HTMLInputElement>) => {\n setDraft(event.target.value.replace(/\\D/g, ''))\n }\n\n const handleInputKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Enter') {\n commitDraft()\n event.currentTarget.blur()\n } else if (event.key === 'Escape') {\n setDraft(null)\n event.currentTarget.blur()\n }\n }\n\n const handleInputFocus = (event: FocusEvent<HTMLInputElement>) => {\n setDraft(String(page))\n event.currentTarget.select()\n }\n\n const sizeOptions = (\n pageSize != null && !pageSizeOptions.includes(pageSize)\n ? [...pageSizeOptions, pageSize].sort((a, b) => a - b)\n : pageSizeOptions\n ).map((size) => ({\n value: String(size),\n label: <span className={styles.pageSizeLabel}>{size}</span>,\n }))\n\n const fieldStyle = {\n '--local-digits': String(lastPage).length,\n } as CSSProperties\n\n return (\n <div\n className={cn(styles.pagination, className)}\n data-testid={dataTestId?.root}\n {...rest}\n >\n {pageSize != null ? (\n <div className={styles.group}>\n <span className={styles.text}>{text.show}</span>\n <span className={styles.pageSize}>\n <TokenSelector\n size='small'\n options={sizeOptions}\n value={String(pageSize)}\n onChange={(value) => onPageSizeChange?.(Number(value))}\n dataTestId={{ trigger: dataTestId?.pageSize }}\n />\n </span>\n <span className={styles.text}>{text.records}</span>\n </div>\n ) : null}\n <div className={styles.group}>\n <IconButton\n variant='ghost'\n icon={<IconChevronLeft />}\n aria-label={text.previous}\n disabled={page <= 1}\n onClick={() => goTo(page - 1)}\n dataTestId={{ root: dataTestId?.previous }}\n />\n <span className={styles.pageField} style={fieldStyle}>\n <Input\n size='small'\n type='text'\n inputMode='numeric'\n aria-label={text.page}\n value={draft ?? String(page)}\n onChange={handleInputChange}\n onFocus={handleInputFocus}\n onBlur={commitDraft}\n onKeyDown={handleInputKeyDown}\n dataTestId={{ input: dataTestId?.pageInput }}\n />\n </span>\n <span className={styles.text}>\n {text.of} {lastPage}\n </span>\n <IconButton\n variant='ghost'\n icon={<IconChevronRight />}\n aria-label={text.next}\n disabled={page >= lastPage}\n onClick={() => goTo(page + 1)}\n dataTestId={{ root: dataTestId?.next }}\n />\n </div>\n </div>\n )\n}\n"],"names":["DEFAULT_PAGE_SIZE_OPTIONS","DEFAULT_LABELS","show","records","of","page","previous","next","clamp","value","min","max","Math","Pagination","_ref","pageCount","onPageChange","pageSize","pageSizeOptions","onPageSizeChange","labels","className","dataTestId","rest","text","lastPage","draft","setDraft","useState","goTo","target","commitDraft","Number","handleInputChange","event","replace","handleInputKeyDown","key","currentTarget","blur","handleInputFocus","String","select","sizeOptions","includes","sort","a","b","map","size","label","_jsx","styles","pageSizeLabel","children","fieldStyle","length","_jsxs","cn","pagination","root","group","TokenSelector","options","onChange","trigger","IconButton","variant","icon","IconChevronLeft","disabled","onClick","pageField","style","Input","type","inputMode","onFocus","onBlur","onKeyDown","input","pageInput","IconChevronRight"],"mappings":"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"}
1
+ {"version":3,"file":"Pagination.cjs","sources":["../../../src/pagination/Pagination.tsx"],"sourcesContent":["import {\n useRef,\n useState,\n type ChangeEvent,\n type ComponentPropsWithoutRef,\n type CSSProperties,\n type FocusEvent,\n type KeyboardEvent,\n type ReactNode,\n} from 'react'\n\nimport cn from 'classnames'\n\nimport { IconButton } from '../icon-button'\nimport { IconChevronLeft, IconChevronRight } from '../icons'\nimport { Input } from '../input'\nimport { TokenSelector } from '../token-selector'\nimport styles from './Pagination.module.css'\n\nexport type PaginationLabels = {\n show?: ReactNode\n records?: ReactNode\n of?: ReactNode\n page?: string\n pageSize?: string\n previous?: string\n next?: string\n}\n\nexport type PaginationDataTestId = {\n root?: string\n pageSize?: string\n pageInput?: string\n previous?: string\n next?: string\n}\n\nexport type PaginationProps = Omit<\n ComponentPropsWithoutRef<'div'>,\n 'onChange'\n> & {\n /** Current page, 1-based. The component is controlled. */\n page: number\n pageCount: number\n onPageChange: (page: number) => void\n /** Current page size. The \"Show N Records\" block renders only when set. */\n pageSize?: number\n pageSizeOptions?: number[]\n onPageSizeChange?: (pageSize: number) => void\n /** Visible texts and `aria-label`s, for i18n. */\n labels?: PaginationLabels\n dataTestId?: PaginationDataTestId\n}\n\nconst DEFAULT_PAGE_SIZE_OPTIONS = [10, 25, 50, 100]\n\nconst DEFAULT_LABELS: Required<PaginationLabels> = {\n show: 'Show',\n records: 'Records',\n of: 'of',\n page: 'Page number',\n pageSize: 'Records per page',\n previous: 'Previous page',\n next: 'Next page',\n}\n\nconst clamp = (value: number, min: number, max: number) =>\n Math.min(Math.max(value, min), max)\n\n/** Page-size selector on the left, page input with previous/next controls on the right; Enter or blur jumps to the typed page and out-of-range values are clamped. */\nexport const Pagination = ({\n page,\n pageCount,\n onPageChange,\n pageSize,\n pageSizeOptions = DEFAULT_PAGE_SIZE_OPTIONS,\n onPageSizeChange,\n labels,\n className,\n dataTestId,\n ...rest\n}: PaginationProps) => {\n const text = { ...DEFAULT_LABELS, ...labels }\n const lastPage = Math.max(pageCount, 1)\n // `null` while the input is not being edited — it then mirrors `page`.\n const [draft, setDraft] = useState<string | null>(null)\n const cancelledRef = useRef(false)\n\n const goTo = (next: number) => {\n const target = clamp(next, 1, lastPage)\n if (target !== page) onPageChange(target)\n }\n\n const commitDraft = () => {\n if (!cancelledRef.current && draft !== null && draft !== '') {\n goTo(Number(draft))\n }\n cancelledRef.current = false\n setDraft(null)\n }\n\n const handleInputChange = (event: ChangeEvent<HTMLInputElement>) => {\n setDraft(event.target.value.replace(/\\D/g, ''))\n }\n\n const handleInputKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Escape') cancelledRef.current = true\n if (event.key === 'Enter' || event.key === 'Escape') {\n event.currentTarget.blur()\n }\n }\n\n const handleInputFocus = (event: FocusEvent<HTMLInputElement>) => {\n setDraft(String(page))\n event.currentTarget.select()\n }\n\n const sizeOptions = (\n pageSize != null && !pageSizeOptions.includes(pageSize)\n ? [...pageSizeOptions, pageSize].sort((a, b) => a - b)\n : pageSizeOptions\n ).map((size) => ({\n value: String(size),\n label: <span className={styles.pageSizeLabel}>{size}</span>,\n }))\n\n const fieldStyle = {\n '--local-digits': String(lastPage).length,\n } as CSSProperties\n\n return (\n <div\n className={cn(styles.pagination, className)}\n data-testid={dataTestId?.root}\n {...rest}\n >\n {pageSize != null ? (\n <div className={styles.group}>\n <span className={styles.text}>{text.show}</span>\n <span className={styles.pageSize}>\n <TokenSelector\n size='small'\n options={sizeOptions}\n value={String(pageSize)}\n listLabel={text.pageSize}\n onChange={(value) => onPageSizeChange?.(Number(value))}\n dataTestId={{ trigger: dataTestId?.pageSize }}\n />\n </span>\n <span className={styles.text}>{text.records}</span>\n </div>\n ) : null}\n <div className={styles.group}>\n <IconButton\n variant='ghost'\n icon={<IconChevronLeft />}\n aria-label={text.previous}\n disabled={page <= 1}\n onClick={() => goTo(page - 1)}\n dataTestId={{ root: dataTestId?.previous }}\n />\n <span className={styles.pageField} style={fieldStyle}>\n <Input\n size='small'\n type='text'\n inputMode='numeric'\n aria-label={text.page}\n value={draft ?? String(page)}\n onChange={handleInputChange}\n onFocus={handleInputFocus}\n onBlur={commitDraft}\n onKeyDown={handleInputKeyDown}\n dataTestId={{ input: dataTestId?.pageInput }}\n />\n </span>\n <span className={styles.text}>\n {text.of} {lastPage}\n </span>\n <IconButton\n variant='ghost'\n icon={<IconChevronRight />}\n aria-label={text.next}\n disabled={page >= lastPage}\n onClick={() => goTo(page + 1)}\n dataTestId={{ root: dataTestId?.next }}\n />\n </div>\n </div>\n )\n}\n"],"names":["DEFAULT_PAGE_SIZE_OPTIONS","DEFAULT_LABELS","show","records","of","page","pageSize","previous","next","clamp","value","min","max","Math","Pagination","_ref","pageCount","onPageChange","pageSizeOptions","onPageSizeChange","labels","className","dataTestId","rest","text","lastPage","draft","setDraft","useState","cancelledRef","useRef","goTo","target","commitDraft","current","Number","handleInputChange","event","replace","handleInputKeyDown","key","currentTarget","blur","handleInputFocus","String","select","sizeOptions","includes","sort","a","b","map","size","label","_jsx","styles","pageSizeLabel","children","fieldStyle","length","_jsxs","cn","pagination","root","group","TokenSelector","options","listLabel","onChange","trigger","IconButton","variant","icon","IconChevronLeft","disabled","onClick","pageField","style","Input","type","inputMode","onFocus","onBlur","onKeyDown","input","pageInput","IconChevronRight"],"mappings":"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"}
@@ -12,7 +12,7 @@ const useFocusTrap = require('../hooks/useFocusTrap.cjs');
12
12
  const useEscape = require('../hooks/useEscape.cjs');
13
13
  const useOutsideClick = require('../hooks/useOutsideClick.cjs');
14
14
 
15
- const POSITION_KEYS = ['top', 'bottom', 'left', 'right', 'width'];
15
+ const POSITION_KEYS = ['top', 'bottom', 'left', 'right', 'width', 'maxHeight', 'maxWidth'];
16
16
  const samePosition = (a, b) => a != null && a.placement === b.placement && POSITION_KEYS.every(key => a.coordinates[key] === b.coordinates[key]);
17
17
  const VIEWPORT_MARGIN = 8;
18
18
  const clamp = (value, max) => Math.max(VIEWPORT_MARGIN, Math.min(value, max));
@@ -24,13 +24,17 @@ const computePosition = (anchor, alignEl, panel, placement, align, offset, width
24
24
  const fixedWidth = typeof width === 'number' ? width : width === 'anchor' ? anchorRect.width : width === 'align' ? alignRect.width : undefined;
25
25
  const panelWidth = fixedWidth ?? panel?.getBoundingClientRect().width ?? 0;
26
26
  const maxEdge = viewportWidth - VIEWPORT_MARGIN - panelWidth;
27
- const panelHeight = panel?.getBoundingClientRect().height ?? 0;
27
+
28
+ // Natural height, not the capped rect, so a capped panel can still flip to the bigger side.
29
+ const panelHeight = panel ? Math.max(panel.getBoundingClientRect().height, panel.scrollHeight + panel.offsetHeight - panel.clientHeight) : 0;
28
30
  const roomBelow = viewportHeight - anchorRect.bottom - offset - VIEWPORT_MARGIN;
29
31
  const roomAbove = anchorRect.top - offset - VIEWPORT_MARGIN;
30
32
  const [room, opposite] = placement === 'top' ? [roomAbove, roomBelow] : [roomBelow, roomAbove];
31
33
  const resolved = panelHeight > room && opposite > room ? placement === 'top' ? 'bottom' : 'top' : placement;
32
34
  const coordinates = {};
33
35
  if (fixedWidth != null) coordinates.width = fixedWidth;
36
+ coordinates.maxWidth = viewportWidth - 2 * VIEWPORT_MARGIN;
37
+ coordinates.maxHeight = Math.max(resolved === 'top' ? roomAbove : roomBelow, 0);
34
38
  if (resolved === 'top') {
35
39
  coordinates.bottom = viewportHeight - anchorRect.top + offset;
36
40
  } else {
@@ -48,22 +52,25 @@ const computePosition = (anchor, alignEl, panel, placement, align, offset, width
48
52
  coordinates
49
53
  };
50
54
  };
51
- const PopoverPanel = _ref => {
55
+ const PopoverPanel = /*#__PURE__*/react.forwardRef((_ref, ref) => {
52
56
  let {
53
57
  onClose,
54
58
  anchorRef,
55
59
  alignRef,
56
- placement = 'bottom',
57
- align = 'start',
58
- offset = 8,
60
+ placement,
61
+ align,
62
+ offset,
59
63
  width,
60
- modal = true,
64
+ modal,
61
65
  className,
62
66
  style,
63
67
  children,
68
+ onFocus,
69
+ dataTestId,
64
70
  ...rest
65
71
  } = _ref;
66
72
  const [panel, setPanel] = react.useState(null);
73
+ react.useImperativeHandle(ref, () => panel, [panel]);
67
74
  const [position, setPosition] = react.useState(null);
68
75
  useIsomorphicLayoutEffect.useIsomorphicLayoutEffect(() => {
69
76
  const update = () => {
@@ -82,7 +89,8 @@ const PopoverPanel = _ref => {
82
89
  window.addEventListener('resize', schedule);
83
90
  window.addEventListener('scroll', schedule, true);
84
91
  const observer = typeof ResizeObserver === 'undefined' ? null : new ResizeObserver(schedule);
85
- if (anchorRef.current) observer?.observe(anchorRef.current);
92
+ const observed = [anchorRef.current, alignRef?.current, panel];
93
+ observed.forEach(el => el && observer?.observe(el));
86
94
  return () => {
87
95
  observer?.disconnect();
88
96
  cancelAnimationFrame(frame);
@@ -90,26 +98,34 @@ const PopoverPanel = _ref => {
90
98
  window.removeEventListener('scroll', schedule, true);
91
99
  };
92
100
  }, [anchorRef, alignRef, panel, placement, align, offset, width]);
93
- useFocusTrap.useFocusTrap(panel, modal && position != null, {
101
+ useFocusTrap.useFocusTrap(panel, {
102
+ enabled: modal && position != null,
94
103
  restoreFocus: false
95
104
  });
96
- useEscape.useEscape(true, onClose);
105
+ useEscape.useEscape(onClose);
97
106
  useOutsideClick.useOutsideClick(panel, event => {
98
107
  // Anchor clicks are left to the anchor's own toggle handler.
99
108
  if (event.target instanceof Node && anchorRef.current?.contains(event.target)) return;
100
109
  onClose();
101
- }, true);
110
+ });
102
111
 
103
112
  // Passive cleanup runs after the panel left the DOM; focus is on body unless the user moved it elsewhere.
113
+ // Only when focus was inside the panel, so a non-modal hover close doesn't pull focus to the anchor.
114
+ const hadFocus = react.useRef(false);
104
115
  react.useEffect(() => () => {
105
116
  const active = document.activeElement;
106
- if (!active || active === document.body) anchorRef.current?.focus();
117
+ if (hadFocus.current && (!active || active === document.body)) anchorRef.current?.focus();
107
118
  }, [anchorRef]);
119
+ const handleFocus = event => {
120
+ hadFocus.current = true;
121
+ onFocus?.(event);
122
+ };
108
123
  return /*#__PURE__*/jsxRuntime.jsx("div", {
109
124
  ref: setPanel,
110
125
  role: "dialog",
111
126
  "aria-modal": modal || undefined,
112
127
  "data-placement": position?.placement,
128
+ "data-testid": dataTestId?.root,
113
129
  className: cn(Popover_module.panel, className),
114
130
  style: {
115
131
  ...position?.coordinates,
@@ -117,20 +133,60 @@ const PopoverPanel = _ref => {
117
133
  visibility: position ? undefined : 'hidden'
118
134
  },
119
135
  ...rest,
136
+ onFocus: handleFocus,
120
137
  children: children
121
138
  });
139
+ });
140
+ PopoverPanel.displayName = 'PopoverPanel';
141
+
142
+ // Attributes the consumer already set on the anchor stay theirs; only missing ones are managed here.
143
+ const useAnchorAria = (anchorRef, open, panelId) => {
144
+ react.useEffect(() => {
145
+ const anchor = anchorRef.current;
146
+ if (!anchor) return;
147
+ const managed = {
148
+ 'aria-haspopup': 'dialog',
149
+ 'aria-expanded': String(open)
150
+ };
151
+ if (open) managed['aria-controls'] = panelId;
152
+ const owned = Object.keys(managed).filter(name => !anchor.hasAttribute(name));
153
+ owned.forEach(name => anchor.setAttribute(name, managed[name]));
154
+ return () => owned.forEach(name => anchor.removeAttribute(name));
155
+ }, [anchorRef, open, panelId]);
122
156
  };
123
- const Popover = _ref2 => {
157
+
158
+ /** Floating panel in a portal, positioned against `anchorRef`; modal by default (focus moves in and is trapped), name it with `aria-label` or `aria-labelledby`. */
159
+ const Popover = /*#__PURE__*/react.forwardRef((_ref2, ref) => {
124
160
  let {
125
161
  open,
162
+ placement = 'bottom',
163
+ align = 'start',
164
+ offset = 8,
165
+ modal = true,
126
166
  ...props
127
167
  } = _ref2;
168
+ const generatedId = react.useId();
169
+ const id = props.id ?? generatedId;
170
+ useAnchorAria(props.anchorRef, open, id);
171
+ const named = Boolean(props['aria-label'] || props['aria-labelledby']);
172
+ react.useEffect(() => {
173
+ if (process.env.NODE_ENV !== 'production' && open && !named) {
174
+ console.warn('Popover: role="dialog" needs aria-label or aria-labelledby.');
175
+ }
176
+ }, [open, named]);
128
177
  return open ? /*#__PURE__*/jsxRuntime.jsx(Portal.Portal, {
129
178
  children: /*#__PURE__*/jsxRuntime.jsx(PopoverPanel, {
130
- ...props
179
+ ref: ref,
180
+ ...props,
181
+ placement: placement,
182
+ align: align,
183
+ offset: offset,
184
+ modal: modal,
185
+ id: id
131
186
  })
132
187
  }) : null;
133
- };
188
+ });
189
+ Popover.displayName = 'Popover';
134
190
 
135
191
  exports.Popover = Popover;
136
192
  //# sourceMappingURL=Popover.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Popover.cjs","sources":["../../../src/popover/Popover.tsx"],"sourcesContent":["import { useEffect, useState, type HTMLAttributes, type RefObject } from 'react'\n\nimport cn from 'classnames'\n\nimport {\n Portal,\n useEscape,\n useFocusTrap,\n useIsomorphicLayoutEffect,\n useOutsideClick,\n} from '../hooks'\nimport styles from './Popover.module.css'\n\nexport type PopoverPlacement = 'top' | 'bottom'\nexport type PopoverAlign = 'start' | 'center' | 'end'\nexport type PopoverOffset = 0 | 2 | 4 | 8 | 12 | 16 | 20 | 24 | 32 | 40 | 52\n\nexport type PopoverProps = HTMLAttributes<HTMLDivElement> & {\n open: boolean\n onClose: () => void\n anchorRef: RefObject<HTMLElement | null>\n /** Element whose edge the panel aligns to; defaults to the anchor. */\n alignRef?: RefObject<HTMLElement | null>\n placement?: PopoverPlacement\n align?: PopoverAlign\n /** Gap in px between the anchor and the panel. */\n offset?: PopoverOffset\n /** Px, or match the width of the anchor / align element. */\n width?: number | 'anchor' | 'align'\n /** When false, focus stays where it is and isn't trapped, e.g. for menus opened by hover. */\n modal?: boolean\n}\n\nconst POSITION_KEYS = ['top', 'bottom', 'left', 'right', 'width'] as const\ntype Coordinates = Partial<Record<(typeof POSITION_KEYS)[number], number>>\ntype Position = { placement: PopoverPlacement; coordinates: Coordinates }\n\nconst samePosition = (a: Position | null, b: Position) =>\n a != null &&\n a.placement === b.placement &&\n POSITION_KEYS.every((key) => a.coordinates[key] === b.coordinates[key])\n\nconst VIEWPORT_MARGIN = 8\n\nconst clamp = (value: number, max: number) =>\n Math.max(VIEWPORT_MARGIN, Math.min(value, max))\n\nconst computePosition = (\n anchor: HTMLElement,\n alignEl: HTMLElement,\n panel: HTMLElement | null,\n placement: PopoverPlacement,\n align: PopoverAlign,\n offset: number,\n width: PopoverProps['width'],\n): Position => {\n const anchorRect = anchor.getBoundingClientRect()\n const alignRect =\n alignEl === anchor ? anchorRect : alignEl.getBoundingClientRect()\n const viewportWidth = document.documentElement.clientWidth\n const viewportHeight = document.documentElement.clientHeight\n\n const fixedWidth =\n typeof width === 'number'\n ? width\n : width === 'anchor'\n ? anchorRect.width\n : width === 'align'\n ? alignRect.width\n : undefined\n const panelWidth = fixedWidth ?? panel?.getBoundingClientRect().width ?? 0\n const maxEdge = viewportWidth - VIEWPORT_MARGIN - panelWidth\n\n const panelHeight = panel?.getBoundingClientRect().height ?? 0\n const roomBelow =\n viewportHeight - anchorRect.bottom - offset - VIEWPORT_MARGIN\n const roomAbove = anchorRect.top - offset - VIEWPORT_MARGIN\n const [room, opposite] =\n placement === 'top' ? [roomAbove, roomBelow] : [roomBelow, roomAbove]\n const resolved: PopoverPlacement =\n panelHeight > room && opposite > room\n ? placement === 'top'\n ? 'bottom'\n : 'top'\n : placement\n\n const coordinates: Coordinates = {}\n if (fixedWidth != null) coordinates.width = fixedWidth\n if (resolved === 'top') {\n coordinates.bottom = viewportHeight - anchorRect.top + offset\n } else {\n coordinates.top = anchorRect.bottom + offset\n }\n if (align === 'end') {\n coordinates.right = clamp(viewportWidth - alignRect.right, maxEdge)\n } else if (align === 'center') {\n coordinates.left = clamp(\n alignRect.left + alignRect.width / 2 - panelWidth / 2,\n maxEdge,\n )\n } else {\n coordinates.left = clamp(alignRect.left, maxEdge)\n }\n return { placement: resolved, coordinates }\n}\n\nconst PopoverPanel = ({\n onClose,\n anchorRef,\n alignRef,\n placement = 'bottom',\n align = 'start',\n offset = 8,\n width,\n modal = true,\n className,\n style,\n children,\n ...rest\n}: Omit<PopoverProps, 'open'>) => {\n const [panel, setPanel] = useState<HTMLDivElement | null>(null)\n const [position, setPosition] = useState<Position | null>(null)\n\n useIsomorphicLayoutEffect(() => {\n const update = () => {\n const anchor = anchorRef.current\n if (!anchor) return\n const next = computePosition(\n anchor,\n alignRef?.current ?? anchor,\n panel,\n placement,\n align,\n offset,\n width,\n )\n // Keeps the previous object so unchanged scroll/resize frames skip a re-render.\n setPosition((prev) => (samePosition(prev, next) ? prev : next))\n }\n update()\n let frame = 0\n const schedule = () => {\n cancelAnimationFrame(frame)\n frame = requestAnimationFrame(update)\n }\n window.addEventListener('resize', schedule)\n window.addEventListener('scroll', schedule, true)\n const observer =\n typeof ResizeObserver === 'undefined'\n ? null\n : new ResizeObserver(schedule)\n if (anchorRef.current) observer?.observe(anchorRef.current)\n return () => {\n observer?.disconnect()\n cancelAnimationFrame(frame)\n window.removeEventListener('resize', schedule)\n window.removeEventListener('scroll', schedule, true)\n }\n }, [anchorRef, alignRef, panel, placement, align, offset, width])\n\n useFocusTrap(panel, modal && position != null, { restoreFocus: false })\n useEscape(true, onClose)\n useOutsideClick(\n panel,\n (event) => {\n // Anchor clicks are left to the anchor's own toggle handler.\n if (\n event.target instanceof Node &&\n anchorRef.current?.contains(event.target)\n )\n return\n onClose()\n },\n true,\n )\n\n // Passive cleanup runs after the panel left the DOM; focus is on body unless the user moved it elsewhere.\n useEffect(\n () => () => {\n const active = document.activeElement\n if (!active || active === document.body) anchorRef.current?.focus()\n },\n [anchorRef],\n )\n\n return (\n <div\n ref={setPanel}\n role='dialog'\n aria-modal={modal || undefined}\n data-placement={position?.placement}\n className={cn(styles.panel, className)}\n style={{\n ...position?.coordinates,\n ...style,\n visibility: position ? undefined : 'hidden',\n }}\n {...rest}\n >\n {children}\n </div>\n )\n}\n\nexport const Popover = ({ open, ...props }: PopoverProps) =>\n open ? (\n <Portal>\n <PopoverPanel {...props} />\n </Portal>\n ) : null\n"],"names":["POSITION_KEYS","samePosition","a","b","placement","every","key","coordinates","VIEWPORT_MARGIN","clamp","value","max","Math","min","computePosition","anchor","alignEl","panel","align","offset","width","anchorRect","getBoundingClientRect","alignRect","viewportWidth","document","documentElement","clientWidth","viewportHeight","clientHeight","fixedWidth","undefined","panelWidth","maxEdge","panelHeight","height","roomBelow","bottom","roomAbove","top","room","opposite","resolved","right","left","PopoverPanel","_ref","onClose","anchorRef","alignRef","modal","className","style","children","rest","setPanel","useState","position","setPosition","useIsomorphicLayoutEffect","update","current","next","prev","frame","schedule","cancelAnimationFrame","requestAnimationFrame","window","addEventListener","observer","ResizeObserver","observe","disconnect","removeEventListener","useFocusTrap","restoreFocus","useEscape","useOutsideClick","event","target","Node","contains","useEffect","active","activeElement","body","focus","_jsx","ref","role","cn","styles","visibility","Popover","_ref2","open","props","Portal"],"mappings":"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"}
1
+ {"version":3,"file":"Popover.cjs","sources":["../../../src/popover/Popover.tsx"],"sourcesContent":["import {\n forwardRef,\n useEffect,\n useId,\n useImperativeHandle,\n useRef,\n useState,\n type FocusEvent,\n type HTMLAttributes,\n type RefObject,\n} from 'react'\n\nimport cn from 'classnames'\n\nimport {\n Portal,\n useEscape,\n useFocusTrap,\n useIsomorphicLayoutEffect,\n useOutsideClick,\n} from '../hooks'\nimport styles from './Popover.module.css'\n\nexport type PopoverPlacement = 'top' | 'bottom'\nexport type PopoverAlign = 'start' | 'center' | 'end'\nexport type PopoverOffset = number\nexport type PopoverDataTestId = { root?: string }\n\nexport type PopoverProps = HTMLAttributes<HTMLDivElement> & {\n open: boolean\n /** Called on Escape and outside clicks; clicks on the anchor are ignored so it can toggle. */\n onClose: () => void\n /** Element the panel is positioned against; gets `aria-haspopup`, `aria-expanded` and `aria-controls` unless it sets them. */\n anchorRef: RefObject<HTMLElement | null>\n /** Element whose edge the panel aligns to; defaults to the anchor. */\n alignRef?: RefObject<HTMLElement | null>\n /** Preferred side; flips when the panel does not fit. */\n placement?: PopoverPlacement\n /** Edge of the anchor (or `alignRef`) the panel lines up with. */\n align?: PopoverAlign\n /** Gap in px between the anchor and the panel. */\n offset?: number\n /** Px, or match the width of the anchor / align element. */\n width?: number | 'anchor' | 'align'\n /** false: focus isn't moved into or trapped in the panel. Only for content that never needs focus, e.g. hover previews that also have a click/keyboard path, or listboxes anchored to an input. Not for menus. */\n modal?: boolean\n dataTestId?: PopoverDataTestId\n}\n\nconst POSITION_KEYS = [\n 'top',\n 'bottom',\n 'left',\n 'right',\n 'width',\n 'maxHeight',\n 'maxWidth',\n] as const\ntype Coordinates = Partial<Record<(typeof POSITION_KEYS)[number], number>>\ntype Position = { placement: PopoverPlacement; coordinates: Coordinates }\n\nconst samePosition = (a: Position | null, b: Position) =>\n a != null &&\n a.placement === b.placement &&\n POSITION_KEYS.every((key) => a.coordinates[key] === b.coordinates[key])\n\nconst VIEWPORT_MARGIN = 8\n\nconst clamp = (value: number, max: number) =>\n Math.max(VIEWPORT_MARGIN, Math.min(value, max))\n\nconst computePosition = (\n anchor: HTMLElement,\n alignEl: HTMLElement,\n panel: HTMLElement | null,\n placement: PopoverPlacement,\n align: PopoverAlign,\n offset: number,\n width: PopoverProps['width'],\n): Position => {\n const anchorRect = anchor.getBoundingClientRect()\n const alignRect =\n alignEl === anchor ? anchorRect : alignEl.getBoundingClientRect()\n const viewportWidth = document.documentElement.clientWidth\n const viewportHeight = document.documentElement.clientHeight\n\n const fixedWidth =\n typeof width === 'number'\n ? width\n : width === 'anchor'\n ? anchorRect.width\n : width === 'align'\n ? alignRect.width\n : undefined\n const panelWidth = fixedWidth ?? panel?.getBoundingClientRect().width ?? 0\n const maxEdge = viewportWidth - VIEWPORT_MARGIN - panelWidth\n\n // Natural height, not the capped rect, so a capped panel can still flip to the bigger side.\n const panelHeight = panel\n ? Math.max(\n panel.getBoundingClientRect().height,\n panel.scrollHeight + panel.offsetHeight - panel.clientHeight,\n )\n : 0\n const roomBelow =\n viewportHeight - anchorRect.bottom - offset - VIEWPORT_MARGIN\n const roomAbove = anchorRect.top - offset - VIEWPORT_MARGIN\n const [room, opposite] =\n placement === 'top' ? [roomAbove, roomBelow] : [roomBelow, roomAbove]\n const resolved: PopoverPlacement =\n panelHeight > room && opposite > room\n ? placement === 'top'\n ? 'bottom'\n : 'top'\n : placement\n\n const coordinates: Coordinates = {}\n if (fixedWidth != null) coordinates.width = fixedWidth\n coordinates.maxWidth = viewportWidth - 2 * VIEWPORT_MARGIN\n coordinates.maxHeight = Math.max(\n resolved === 'top' ? roomAbove : roomBelow,\n 0,\n )\n if (resolved === 'top') {\n coordinates.bottom = viewportHeight - anchorRect.top + offset\n } else {\n coordinates.top = anchorRect.bottom + offset\n }\n if (align === 'end') {\n coordinates.right = clamp(viewportWidth - alignRect.right, maxEdge)\n } else if (align === 'center') {\n coordinates.left = clamp(\n alignRect.left + alignRect.width / 2 - panelWidth / 2,\n maxEdge,\n )\n } else {\n coordinates.left = clamp(alignRect.left, maxEdge)\n }\n return { placement: resolved, coordinates }\n}\n\nconst PopoverPanel = forwardRef<\n HTMLDivElement,\n Omit<PopoverProps, 'open'> &\n Required<Pick<PopoverProps, 'placement' | 'align' | 'offset' | 'modal'>>\n>(\n (\n {\n onClose,\n anchorRef,\n alignRef,\n placement,\n align,\n offset,\n width,\n modal,\n className,\n style,\n children,\n onFocus,\n dataTestId,\n ...rest\n },\n ref,\n ) => {\n const [panel, setPanel] = useState<HTMLDivElement | null>(null)\n useImperativeHandle(ref, () => panel as HTMLDivElement, [panel])\n const [position, setPosition] = useState<Position | null>(null)\n\n useIsomorphicLayoutEffect(() => {\n const update = () => {\n const anchor = anchorRef.current\n if (!anchor) return\n const next = computePosition(\n anchor,\n alignRef?.current ?? anchor,\n panel,\n placement,\n align,\n offset,\n width,\n )\n // Keeps the previous object so unchanged scroll/resize frames skip a re-render.\n setPosition((prev) => (samePosition(prev, next) ? prev : next))\n }\n update()\n let frame = 0\n const schedule = () => {\n cancelAnimationFrame(frame)\n frame = requestAnimationFrame(update)\n }\n window.addEventListener('resize', schedule)\n window.addEventListener('scroll', schedule, true)\n const observer =\n typeof ResizeObserver === 'undefined'\n ? null\n : new ResizeObserver(schedule)\n const observed = [anchorRef.current, alignRef?.current, panel]\n observed.forEach((el) => el && observer?.observe(el))\n return () => {\n observer?.disconnect()\n cancelAnimationFrame(frame)\n window.removeEventListener('resize', schedule)\n window.removeEventListener('scroll', schedule, true)\n }\n }, [anchorRef, alignRef, panel, placement, align, offset, width])\n\n useFocusTrap(panel, {\n enabled: modal && position != null,\n restoreFocus: false,\n })\n useEscape(onClose)\n useOutsideClick(panel, (event) => {\n // Anchor clicks are left to the anchor's own toggle handler.\n if (\n event.target instanceof Node &&\n anchorRef.current?.contains(event.target)\n )\n return\n onClose()\n })\n\n // Passive cleanup runs after the panel left the DOM; focus is on body unless the user moved it elsewhere.\n // Only when focus was inside the panel, so a non-modal hover close doesn't pull focus to the anchor.\n const hadFocus = useRef(false)\n useEffect(\n () => () => {\n const active = document.activeElement\n if (hadFocus.current && (!active || active === document.body))\n anchorRef.current?.focus()\n },\n [anchorRef],\n )\n\n const handleFocus = (event: FocusEvent<HTMLDivElement>) => {\n hadFocus.current = true\n onFocus?.(event)\n }\n\n return (\n <div\n ref={setPanel}\n role='dialog'\n aria-modal={modal || undefined}\n data-placement={position?.placement}\n data-testid={dataTestId?.root}\n className={cn(styles.panel, className)}\n style={{\n ...position?.coordinates,\n ...style,\n visibility: position ? undefined : 'hidden',\n }}\n {...rest}\n onFocus={handleFocus}\n >\n {children}\n </div>\n )\n },\n)\n\nPopoverPanel.displayName = 'PopoverPanel'\n\n// Attributes the consumer already set on the anchor stay theirs; only missing ones are managed here.\nconst useAnchorAria = (\n anchorRef: RefObject<HTMLElement | null>,\n open: boolean,\n panelId: string,\n) => {\n useEffect(() => {\n const anchor = anchorRef.current\n if (!anchor) return\n const managed: Record<string, string> = {\n 'aria-haspopup': 'dialog',\n 'aria-expanded': String(open),\n }\n if (open) managed['aria-controls'] = panelId\n const owned = Object.keys(managed).filter(\n (name) => !anchor.hasAttribute(name),\n )\n owned.forEach((name) => anchor.setAttribute(name, managed[name]))\n return () => owned.forEach((name) => anchor.removeAttribute(name))\n }, [anchorRef, open, panelId])\n}\n\n/** Floating panel in a portal, positioned against `anchorRef`; modal by default (focus moves in and is trapped), name it with `aria-label` or `aria-labelledby`. */\nexport const Popover = forwardRef<HTMLDivElement, PopoverProps>(\n (\n {\n open,\n placement = 'bottom',\n align = 'start',\n offset = 8,\n modal = true,\n ...props\n },\n ref,\n ) => {\n const generatedId = useId()\n const id = props.id ?? generatedId\n useAnchorAria(props.anchorRef, open, id)\n\n const named = Boolean(props['aria-label'] || props['aria-labelledby'])\n useEffect(() => {\n if (process.env.NODE_ENV !== 'production' && open && !named) {\n console.warn(\n 'Popover: role=\"dialog\" needs aria-label or aria-labelledby.',\n )\n }\n }, [open, named])\n\n return open ? (\n <Portal>\n <PopoverPanel\n ref={ref}\n {...props}\n placement={placement}\n align={align}\n offset={offset}\n modal={modal}\n id={id}\n />\n </Portal>\n ) : null\n },\n)\n\nPopover.displayName = 'Popover'\n"],"names":["POSITION_KEYS","samePosition","a","b","placement","every","key","coordinates","VIEWPORT_MARGIN","clamp","value","max","Math","min","computePosition","anchor","alignEl","panel","align","offset","width","anchorRect","getBoundingClientRect","alignRect","viewportWidth","document","documentElement","clientWidth","viewportHeight","clientHeight","fixedWidth","undefined","panelWidth","maxEdge","panelHeight","height","scrollHeight","offsetHeight","roomBelow","bottom","roomAbove","top","room","opposite","resolved","maxWidth","maxHeight","right","left","PopoverPanel","forwardRef","_ref","ref","onClose","anchorRef","alignRef","modal","className","style","children","onFocus","dataTestId","rest","setPanel","useState","useImperativeHandle","position","setPosition","useIsomorphicLayoutEffect","update","current","next","prev","frame","schedule","cancelAnimationFrame","requestAnimationFrame","window","addEventListener","observer","ResizeObserver","observed","forEach","el","observe","disconnect","removeEventListener","useFocusTrap","enabled","restoreFocus","useEscape","useOutsideClick","event","target","Node","contains","hadFocus","useRef","useEffect","active","activeElement","body","focus","handleFocus","_jsx","role","root","cn","styles","visibility","displayName","useAnchorAria","open","panelId","managed","String","owned","Object","keys","filter","name","hasAttribute","setAttribute","removeAttribute","Popover","_ref2","props","generatedId","useId","id","named","Boolean","process","env","NODE_ENV","console","warn","Portal"],"mappings":"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"}
@@ -7,6 +7,7 @@ const cn = require('classnames');
7
7
  const RadioButton_module = require('./RadioButton.module.css.cjs');
8
8
  const jsxRuntime = require('react/jsx-runtime');
9
9
 
10
+ /** 24px radio wrapped in a `<label>` so the text is clickable; forwards every native input prop, group radios with a shared `name`. */
10
11
  const RadioButton = /*#__PURE__*/react.forwardRef((_ref, ref) => {
11
12
  let {
12
13
  label,
@@ -1 +1 @@
1
- {"version":3,"file":"RadioButton.cjs","sources":["../../../src/radio-button/RadioButton.tsx"],"sourcesContent":["import { forwardRef, type InputHTMLAttributes, type ReactNode } from 'react'\n\nimport cn from 'classnames'\n\nimport styles from './RadioButton.module.css'\n\nexport type RadioButtonDataTestId = {\n root?: string\n input?: string\n label?: string\n}\n\nexport type RadioButtonProps = Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'type'\n> & {\n label?: ReactNode\n dataTestId?: RadioButtonDataTestId\n}\n\nexport const RadioButton = forwardRef<HTMLInputElement, RadioButtonProps>(\n ({ label, className, disabled, dataTestId, ...rest }, ref) => (\n <label\n className={cn(styles.container, className, {\n [styles.containerDisabled]: disabled,\n })}\n data-testid={dataTestId?.root}\n >\n <span className={styles.control}>\n <input\n ref={ref}\n type='radio'\n className={styles.input}\n disabled={disabled}\n data-testid={dataTestId?.input}\n {...rest}\n />\n <span className={styles.dot} />\n </span>\n {label ? (\n <span\n className={cn(styles.label, { [styles.labelDisabled]: disabled })}\n data-testid={dataTestId?.label}\n >\n {label}\n </span>\n ) : null}\n </label>\n ),\n)\n\nRadioButton.displayName = 'RadioButton'\n"],"names":["RadioButton","forwardRef","_ref","ref","label","className","disabled","dataTestId","rest","_jsxs","cn","styles","container","containerDisabled","root","children","control","_jsx","type","input","dot","labelDisabled","displayName"],"mappings":";;;;;;;;;AAoBO,MAAMA,WAAW,gBAAGC,gBAAU,CACnC,CAAAC,IAAA,EAAsDC,GAAG,KAAA;EAAA,IAAxD;IAAEC,KAAK;IAAEC,SAAS;IAAEC,QAAQ;IAAEC,UAAU;IAAE,GAAGC,IAAAA;AAAK,GAAC,GAAAN,IAAA,CAAA;AAAA,EAAA,oBAClDO,eAAA,CAAA,OAAA,EAAA;IACEJ,SAAS,EAAEK,EAAE,CAACC,kBAAM,CAACC,SAAS,EAAEP,SAAS,EAAE;MACzC,CAACM,kBAAM,CAACE,iBAAiB,GAAGP,QAAAA;AAC9B,KAAC,CAAE;IACH,aAAaC,EAAAA,UAAU,EAAEO,IAAK;AAAAC,IAAAA,QAAA,gBAE9BN,eAAA,CAAA,MAAA,EAAA;MAAMJ,SAAS,EAAEM,kBAAM,CAACK,OAAQ;AAAAD,MAAAA,QAAA,gBAC9BE,cAAA,CAAA,OAAA,EAAA;AACEd,QAAAA,GAAG,EAAEA,GAAI;AACTe,QAAAA,IAAI,EAAC,OAAO;QACZb,SAAS,EAAEM,kBAAM,CAACQ,KAAM;AACxBb,QAAAA,QAAQ,EAAEA,QAAS;QACnB,aAAaC,EAAAA,UAAU,EAAEY,KAAM;QAAA,GAC3BX,IAAAA;OACL,CAAC,eACFS,cAAA,CAAA,MAAA,EAAA;QAAMZ,SAAS,EAAEM,kBAAM,CAACS,GAAAA;AAAI,OAAE,CAAC,CAAA;AAAA,KAC3B,CAAC,EACNhB,KAAK,gBACJa,cAAA,CAAA,MAAA,EAAA;AACEZ,MAAAA,SAAS,EAAEK,EAAE,CAACC,kBAAM,CAACP,KAAK,EAAE;QAAE,CAACO,kBAAM,CAACU,aAAa,GAAGf,QAAAA;AAAS,OAAC,CAAE;MAClE,aAAaC,EAAAA,UAAU,EAAEH,KAAM;AAAAW,MAAAA,QAAA,EAE9BX,KAAAA;KACG,CAAC,GACL,IAAI,CAAA;AAAA,GACH,CAAC,CAAA;AAAA,CAEZ,EAAC;AAEDJ,WAAW,CAACsB,WAAW,GAAG,aAAa;;;;"}
1
+ {"version":3,"file":"RadioButton.cjs","sources":["../../../src/radio-button/RadioButton.tsx"],"sourcesContent":["import { forwardRef, type InputHTMLAttributes, type ReactNode } from 'react'\n\nimport cn from 'classnames'\n\nimport styles from './RadioButton.module.css'\n\nexport type RadioButtonDataTestId = {\n root?: string\n input?: string\n label?: string\n}\n\nexport type RadioButtonProps = Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'type'\n> & {\n /** Text next to the circle; omit for a bare radio. */\n label?: ReactNode\n dataTestId?: RadioButtonDataTestId\n}\n\n/** 24px radio wrapped in a `<label>` so the text is clickable; forwards every native input prop, group radios with a shared `name`. */\nexport const RadioButton = forwardRef<HTMLInputElement, RadioButtonProps>(\n ({ label, className, disabled, dataTestId, ...rest }, ref) => (\n <label\n className={cn(styles.container, className, {\n [styles.containerDisabled]: disabled,\n })}\n data-testid={dataTestId?.root}\n >\n <span className={styles.control}>\n <input\n ref={ref}\n type='radio'\n className={styles.input}\n disabled={disabled}\n data-testid={dataTestId?.input}\n {...rest}\n />\n <span className={styles.dot} />\n </span>\n {label ? (\n <span\n className={cn(styles.label, { [styles.labelDisabled]: disabled })}\n data-testid={dataTestId?.label}\n >\n {label}\n </span>\n ) : null}\n </label>\n ),\n)\n\nRadioButton.displayName = 'RadioButton'\n"],"names":["RadioButton","forwardRef","_ref","ref","label","className","disabled","dataTestId","rest","_jsxs","cn","styles","container","containerDisabled","root","children","control","_jsx","type","input","dot","labelDisabled","displayName"],"mappings":";;;;;;;;;AAqBA;AACO,MAAMA,WAAW,gBAAGC,gBAAU,CACnC,CAAAC,IAAA,EAAsDC,GAAG,KAAA;EAAA,IAAxD;IAAEC,KAAK;IAAEC,SAAS;IAAEC,QAAQ;IAAEC,UAAU;IAAE,GAAGC,IAAAA;AAAK,GAAC,GAAAN,IAAA,CAAA;AAAA,EAAA,oBAClDO,eAAA,CAAA,OAAA,EAAA;IACEJ,SAAS,EAAEK,EAAE,CAACC,kBAAM,CAACC,SAAS,EAAEP,SAAS,EAAE;MACzC,CAACM,kBAAM,CAACE,iBAAiB,GAAGP,QAAAA;AAC9B,KAAC,CAAE;IACH,aAAaC,EAAAA,UAAU,EAAEO,IAAK;AAAAC,IAAAA,QAAA,gBAE9BN,eAAA,CAAA,MAAA,EAAA;MAAMJ,SAAS,EAAEM,kBAAM,CAACK,OAAQ;AAAAD,MAAAA,QAAA,gBAC9BE,cAAA,CAAA,OAAA,EAAA;AACEd,QAAAA,GAAG,EAAEA,GAAI;AACTe,QAAAA,IAAI,EAAC,OAAO;QACZb,SAAS,EAAEM,kBAAM,CAACQ,KAAM;AACxBb,QAAAA,QAAQ,EAAEA,QAAS;QACnB,aAAaC,EAAAA,UAAU,EAAEY,KAAM;QAAA,GAC3BX,IAAAA;OACL,CAAC,eACFS,cAAA,CAAA,MAAA,EAAA;QAAMZ,SAAS,EAAEM,kBAAM,CAACS,GAAAA;AAAI,OAAE,CAAC,CAAA;AAAA,KAC3B,CAAC,EACNhB,KAAK,gBACJa,cAAA,CAAA,MAAA,EAAA;AACEZ,MAAAA,SAAS,EAAEK,EAAE,CAACC,kBAAM,CAACP,KAAK,EAAE;QAAE,CAACO,kBAAM,CAACU,aAAa,GAAGf,QAAAA;AAAS,OAAC,CAAE;MAClE,aAAaC,EAAAA,UAAU,EAAEH,KAAM;AAAAW,MAAAA,QAAA,EAE9BX,KAAAA;KACG,CAAC,GACL,IAAI,CAAA;AAAA,GACH,CAAC,CAAA;AAAA,CAEZ,EAAC;AAEDJ,WAAW,CAACsB,WAAW,GAAG,aAAa;;;;"}
@@ -6,32 +6,9 @@ const react = require('react');
6
6
  const cn = require('classnames');
7
7
  const RichInput_module = require('./RichInput.module.css.cjs');
8
8
  const jsxRuntime = require('react/jsx-runtime');
9
+ const Tag = require('../tag/Tag.cjs');
9
10
  const InfoTooltip = require('../info-tooltip/InfoTooltip.cjs');
10
11
  const Tooltip = require('../tooltip/Tooltip.cjs');
11
- const Tag = require('../tag/Tag.cjs');
12
-
13
- const MaxTag = _ref => {
14
- let {
15
- onClick,
16
- className,
17
- disabled,
18
- ...rest
19
- } = _ref;
20
- return /*#__PURE__*/jsxRuntime.jsx(Tag.Tag, {
21
- role: "button",
22
- tabIndex: disabled ? -1 : 0,
23
- "aria-disabled": disabled || undefined,
24
- className: cn(RichInput_module.maxTag, disabled && RichInput_module.maxTagDisabled, className),
25
- onClick: disabled ? undefined : onClick,
26
- onKeyDown: event => {
27
- if (disabled) return;
28
- if (event.key !== 'Enter' && event.key !== ' ') return;
29
- event.preventDefault();
30
- onClick?.(event);
31
- },
32
- ...rest
33
- });
34
- };
35
12
 
36
13
  // Keep only digits and a single decimal point; comma is treated as the
37
14
  // decimal separator and normalized to a dot (en-US canonical form).
@@ -43,7 +20,10 @@ const sanitizeDecimal = raw => {
43
20
  const tail = normalized.slice(firstDot + 1).replace(/\./g, '');
44
21
  return head + tail;
45
22
  };
46
- const RichInput = _ref2 => {
23
+ const noop = () => undefined;
24
+
25
+ /** Amount field for supply and borrow forms: token picker, fiat equivalent, balance and a Max shortcut in one card; input is filtered to decimals as you type. `disabled` dims the card and hides Max. */
26
+ const RichInput = _ref => {
47
27
  let {
48
28
  label,
49
29
  labelTooltip,
@@ -63,7 +43,7 @@ const RichInput = _ref2 => {
63
43
  disabled,
64
44
  dataTestId,
65
45
  ...inputProps
66
- } = _ref2;
46
+ } = _ref;
67
47
  const inputRef = react.useRef(null);
68
48
  const fallbackId = react.useId();
69
49
  const inputId = id ?? fallbackId;
@@ -72,6 +52,15 @@ const RichInput = _ref2 => {
72
52
  const errorId = `${inputId}-error`;
73
53
  const showMax = showMaxButton && !disabled;
74
54
  const hasBottomRow = secondaryValue != null || balance != null || showMax;
55
+ const maxTag = /*#__PURE__*/jsxRuntime.jsx(Tag.Tag, {
56
+ as: "button",
57
+ dataTestId: {
58
+ root: dataTestId?.maxButton
59
+ },
60
+ onClick: onMaxClick ?? noop,
61
+ disabled: maxDisabled,
62
+ children: "Max"
63
+ });
75
64
  const handleChange = event => {
76
65
  const {
77
66
  value: rawValue,
@@ -143,22 +132,12 @@ const RichInput = _ref2 => {
143
132
  className: RichInput_module.balance,
144
133
  "data-testid": dataTestId?.balance,
145
134
  children: balance
146
- }) : null, showMax ? maxTooltip != null ? /*#__PURE__*/jsxRuntime.jsx(Tooltip.Tooltip, {
135
+ }) : null, showMax && maxTooltip != null ? /*#__PURE__*/jsxRuntime.jsx(Tooltip.Tooltip, {
147
136
  content: maxTooltip,
148
137
  position: maxTooltipPosition,
149
138
  width: 240,
150
- children: /*#__PURE__*/jsxRuntime.jsx(MaxTag, {
151
- "data-testid": dataTestId?.maxButton,
152
- onClick: onMaxClick,
153
- disabled: maxDisabled,
154
- children: "Max"
155
- })
156
- }) : /*#__PURE__*/jsxRuntime.jsx(MaxTag, {
157
- "data-testid": dataTestId?.maxButton,
158
- onClick: onMaxClick,
159
- disabled: maxDisabled,
160
- children: "Max"
161
- }) : null]
139
+ children: maxTag
140
+ }) : showMax ? maxTag : null]
162
141
  })]
163
142
  }) : null]
164
143
  }), showErrorMessage ? /*#__PURE__*/jsxRuntime.jsx("div", {