@simplybusiness/mobius 10.1.2 → 10.3.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 (342) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/dist/cjs/components/AddressLookup/AddressLookup.js +223 -162
  3. package/dist/cjs/components/AddressLookup/AddressLookup.js.map +4 -4
  4. package/dist/cjs/components/AddressLookup/index.js +223 -162
  5. package/dist/cjs/components/AddressLookup/index.js.map +4 -4
  6. package/dist/cjs/components/Alert/Alert.js +10 -7
  7. package/dist/cjs/components/Alert/Alert.js.map +2 -2
  8. package/dist/cjs/components/Alert/index.js +10 -7
  9. package/dist/cjs/components/Alert/index.js.map +2 -2
  10. package/dist/cjs/components/Box/Box.js +18 -3
  11. package/dist/cjs/components/Box/Box.js.map +3 -3
  12. package/dist/cjs/components/Box/index.js +18 -3
  13. package/dist/cjs/components/Box/index.js.map +3 -3
  14. package/dist/cjs/components/Breadcrumbs/BreadcrumbItem.js +18 -3
  15. package/dist/cjs/components/Breadcrumbs/BreadcrumbItem.js.map +3 -3
  16. package/dist/cjs/components/Breadcrumbs/Breadcrumbs.js.map +1 -1
  17. package/dist/cjs/components/Breadcrumbs/index.js +18 -3
  18. package/dist/cjs/components/Breadcrumbs/index.js.map +3 -3
  19. package/dist/cjs/components/Checkbox/Checkbox.js +190 -129
  20. package/dist/cjs/components/Checkbox/Checkbox.js.map +4 -4
  21. package/dist/cjs/components/Checkbox/CheckboxGroup.js +195 -134
  22. package/dist/cjs/components/Checkbox/CheckboxGroup.js.map +4 -4
  23. package/dist/cjs/components/Checkbox/index.js +203 -142
  24. package/dist/cjs/components/Checkbox/index.js.map +4 -4
  25. package/dist/cjs/components/Combobox/Combobox.js +218 -157
  26. package/dist/cjs/components/Combobox/Combobox.js.map +4 -4
  27. package/dist/cjs/components/Combobox/index.js +218 -157
  28. package/dist/cjs/components/Combobox/index.js.map +4 -4
  29. package/dist/cjs/components/DateField/DateField.js +191 -130
  30. package/dist/cjs/components/DateField/DateField.js.map +4 -4
  31. package/dist/cjs/components/DateField/index.js +191 -130
  32. package/dist/cjs/components/DateField/index.js.map +4 -4
  33. package/dist/cjs/components/ErrorMessage/ErrorMessage.js +182 -121
  34. package/dist/cjs/components/ErrorMessage/ErrorMessage.js.map +4 -4
  35. package/dist/cjs/components/ErrorMessage/index.js +182 -121
  36. package/dist/cjs/components/ErrorMessage/index.js.map +4 -4
  37. package/dist/cjs/components/ExpandableText/ExpandableText.js +182 -121
  38. package/dist/cjs/components/ExpandableText/ExpandableText.js.map +4 -4
  39. package/dist/cjs/components/ExpandableText/index.js +182 -121
  40. package/dist/cjs/components/ExpandableText/index.js.map +4 -4
  41. package/dist/cjs/components/Grid/Grid.js +2 -2
  42. package/dist/cjs/components/Grid/Grid.js.map +2 -2
  43. package/dist/cjs/components/Grid/Item.js +3 -3
  44. package/dist/cjs/components/Grid/Item.js.map +2 -2
  45. package/dist/cjs/components/Grid/index.js +5 -5
  46. package/dist/cjs/components/Grid/index.js.map +2 -2
  47. package/dist/cjs/components/List/List.js +15 -7
  48. package/dist/cjs/components/List/List.js.map +2 -2
  49. package/dist/cjs/components/List/index.js +15 -7
  50. package/dist/cjs/components/List/index.js.map +2 -2
  51. package/dist/cjs/components/Logo/Logo.js.map +2 -2
  52. package/dist/cjs/components/Logo/index.js.map +2 -2
  53. package/dist/cjs/components/MaskedField/MaskedField.js +185 -124
  54. package/dist/cjs/components/MaskedField/MaskedField.js.map +4 -4
  55. package/dist/cjs/components/MaskedField/index.js +185 -124
  56. package/dist/cjs/components/MaskedField/index.js.map +4 -4
  57. package/dist/cjs/components/Modal/Header.js +38 -21
  58. package/dist/cjs/components/Modal/Header.js.map +3 -3
  59. package/dist/cjs/components/Modal/Modal.js +13 -3
  60. package/dist/cjs/components/Modal/Modal.js.map +2 -2
  61. package/dist/cjs/components/Modal/ModalContext.js +4 -1
  62. package/dist/cjs/components/Modal/ModalContext.js.map +2 -2
  63. package/dist/cjs/components/Modal/index.js +63 -39
  64. package/dist/cjs/components/Modal/index.js.map +3 -3
  65. package/dist/cjs/components/Modal/types.js.map +1 -1
  66. package/dist/cjs/components/Modal/useModal.js +6 -3
  67. package/dist/cjs/components/Modal/useModal.js.map +2 -2
  68. package/dist/cjs/components/NumberField/NumberField.js +185 -124
  69. package/dist/cjs/components/NumberField/NumberField.js.map +4 -4
  70. package/dist/cjs/components/NumberField/index.js +185 -124
  71. package/dist/cjs/components/NumberField/index.js.map +4 -4
  72. package/dist/cjs/components/PasswordField/PasswordField.js +185 -124
  73. package/dist/cjs/components/PasswordField/PasswordField.js.map +4 -4
  74. package/dist/cjs/components/PasswordField/ShowHideButton.js +182 -121
  75. package/dist/cjs/components/PasswordField/ShowHideButton.js.map +4 -4
  76. package/dist/cjs/components/PasswordField/index.js +185 -124
  77. package/dist/cjs/components/PasswordField/index.js.map +4 -4
  78. package/dist/cjs/components/Radio/Radio.js +182 -121
  79. package/dist/cjs/components/Radio/Radio.js.map +4 -4
  80. package/dist/cjs/components/Radio/RadioGroup.js +182 -121
  81. package/dist/cjs/components/Radio/RadioGroup.js.map +4 -4
  82. package/dist/cjs/components/Radio/index.js +182 -121
  83. package/dist/cjs/components/Radio/index.js.map +4 -4
  84. package/dist/cjs/components/SVG/SVG.js.map +2 -2
  85. package/dist/cjs/components/SVG/index.js.map +2 -2
  86. package/dist/cjs/components/Segment/Segment.js +2 -2
  87. package/dist/cjs/components/Segment/Segment.js.map +2 -2
  88. package/dist/cjs/components/Segment/index.js +2 -2
  89. package/dist/cjs/components/Segment/index.js.map +2 -2
  90. package/dist/cjs/components/Select/Select.js +182 -121
  91. package/dist/cjs/components/Select/Select.js.map +4 -4
  92. package/dist/cjs/components/Select/index.js +182 -121
  93. package/dist/cjs/components/Select/index.js.map +4 -4
  94. package/dist/cjs/components/Table/HeaderCell.js +2 -2
  95. package/dist/cjs/components/Table/HeaderCell.js.map +2 -2
  96. package/dist/cjs/components/Table/index.js +2 -2
  97. package/dist/cjs/components/Table/index.js.map +2 -2
  98. package/dist/cjs/components/Text/Text.js +10 -7
  99. package/dist/cjs/components/Text/Text.js.map +2 -2
  100. package/dist/cjs/components/Text/index.js +10 -7
  101. package/dist/cjs/components/Text/index.js.map +2 -2
  102. package/dist/cjs/components/TextArea/TextArea.js +182 -121
  103. package/dist/cjs/components/TextArea/TextArea.js.map +4 -4
  104. package/dist/cjs/components/TextArea/index.js +182 -121
  105. package/dist/cjs/components/TextArea/index.js.map +4 -4
  106. package/dist/cjs/components/TextField/TextField.js +185 -124
  107. package/dist/cjs/components/TextField/TextField.js.map +4 -4
  108. package/dist/cjs/components/TextField/index.js +185 -124
  109. package/dist/cjs/components/TextField/index.js.map +4 -4
  110. package/dist/cjs/components/TextOrHTML/TextOrHTML.js +10 -7
  111. package/dist/cjs/components/TextOrHTML/TextOrHTML.js.map +2 -2
  112. package/dist/cjs/components/TextOrHTML/index.js +10 -7
  113. package/dist/cjs/components/TextOrHTML/index.js.map +2 -2
  114. package/dist/cjs/components/index.js +209 -148
  115. package/dist/cjs/components/index.js.map +4 -4
  116. package/dist/cjs/index.js +209 -148
  117. package/dist/cjs/index.js.map +4 -4
  118. package/dist/cjs/meta.json +876 -571
  119. package/dist/cjs/utils/filterUnsetValues.js +36 -0
  120. package/dist/cjs/utils/filterUnsetValues.js.map +7 -0
  121. package/dist/cjs/utils/index.js +13 -0
  122. package/dist/cjs/utils/index.js.map +3 -3
  123. package/dist/esm/{chunk-NYFCN7EA.js → chunk-6GGDGE7D.js} +4 -4
  124. package/dist/esm/{chunk-OUKMP3DO.js → chunk-7JT4DKQA.js} +2 -2
  125. package/dist/esm/chunk-CZWEMAKZ.js +16 -0
  126. package/dist/esm/chunk-CZWEMAKZ.js.map +7 -0
  127. package/dist/esm/{chunk-Q5YY6HPF.js → chunk-DZVBN6ZI.js} +5 -5
  128. package/dist/esm/{chunk-OC6ULO4M.js → chunk-EJLNC5X5.js} +2 -2
  129. package/dist/esm/{chunk-LVZ2T6AY.js → chunk-EZ4S7XVZ.js} +16 -8
  130. package/dist/esm/chunk-EZ4S7XVZ.js.map +7 -0
  131. package/dist/esm/chunk-FIAL4HTE.js +1 -0
  132. package/dist/esm/{chunk-YLL2DKVF.js → chunk-FQ6P6JB5.js} +3 -3
  133. package/dist/esm/chunk-FQ6P6JB5.js.map +7 -0
  134. package/dist/esm/{chunk-OZ2IUZIJ.js → chunk-HP2NRM7T.js} +2 -2
  135. package/dist/esm/{chunk-PB2OICEB.js → chunk-I6EUIFUJ.js} +15 -11
  136. package/dist/esm/chunk-I6EUIFUJ.js.map +7 -0
  137. package/dist/esm/{chunk-3IMYDZRT.js → chunk-JFDDW3IV.js} +1 -1
  138. package/dist/esm/chunk-JFDDW3IV.js.map +7 -0
  139. package/dist/esm/{chunk-4IB5ROL6.js → chunk-KXLTGNKF.js} +12 -5
  140. package/dist/esm/chunk-KXLTGNKF.js.map +7 -0
  141. package/dist/esm/{chunk-TL4OCKNP.js → chunk-LWRY3VIB.js} +2 -2
  142. package/dist/esm/chunk-MPB5F6QL.js +53 -0
  143. package/dist/esm/chunk-MPB5F6QL.js.map +7 -0
  144. package/dist/esm/{chunk-DNMS6KEY.js → chunk-PARKMZYZ.js} +4 -4
  145. package/dist/esm/{chunk-DNMS6KEY.js.map → chunk-PARKMZYZ.js.map} +2 -2
  146. package/dist/esm/chunk-Q5MIALGZ.js +15 -0
  147. package/dist/esm/{chunk-ZHX7Z5IU.js.map → chunk-Q5MIALGZ.js.map} +2 -2
  148. package/dist/esm/{chunk-N5WGQAHM.js → chunk-QWD72EVP.js} +4 -4
  149. package/dist/esm/{chunk-KLXMVFIR.js → chunk-TBKQA5ZF.js} +5 -2
  150. package/dist/esm/{chunk-KLXMVFIR.js.map → chunk-TBKQA5ZF.js.map} +2 -2
  151. package/dist/esm/{chunk-B243ELKZ.js → chunk-TJCUKTFX.js} +10 -4
  152. package/dist/esm/chunk-TJCUKTFX.js.map +7 -0
  153. package/dist/esm/{chunk-P5ZPHAQT.js → chunk-UCNWPF7R.js} +3 -3
  154. package/dist/esm/chunk-UCNWPF7R.js.map +7 -0
  155. package/dist/esm/{chunk-S37ULE57.js → chunk-VASDBM4Z.js} +1 -1
  156. package/dist/esm/{chunk-S37ULE57.js.map → chunk-VASDBM4Z.js.map} +2 -2
  157. package/dist/esm/{chunk-QRHDVVRK.js → chunk-VIDKIVA6.js} +2 -2
  158. package/dist/esm/{chunk-SDGIWQ3R.js → chunk-WP5OEMNG.js} +3 -3
  159. package/dist/esm/{chunk-SDGIWQ3R.js.map → chunk-WP5OEMNG.js.map} +2 -2
  160. package/dist/esm/{chunk-MLN5ELQR.js → chunk-WXRQIMMM.js} +1 -1
  161. package/dist/esm/chunk-WXRQIMMM.js.map +7 -0
  162. package/dist/esm/{chunk-O47IW7HD.js → chunk-YCE2KOB2.js} +5 -5
  163. package/dist/esm/{chunk-SNRPWCHL.js → chunk-ZS5MFZHD.js} +11 -8
  164. package/dist/esm/chunk-ZS5MFZHD.js.map +7 -0
  165. package/dist/esm/components/Accordion/Accordion.js +7 -6
  166. package/dist/esm/components/Accordion/AccordionLink.js +6 -5
  167. package/dist/esm/components/Accordion/AccordionList.js +8 -7
  168. package/dist/esm/components/Accordion/index.js +8 -7
  169. package/dist/esm/components/AddressLookup/AddressLookup.js +41 -40
  170. package/dist/esm/components/AddressLookup/__mocks__/LoqateAddressLookupService.js +2 -1
  171. package/dist/esm/components/AddressLookup/__mocks__/LoqateAddressLookupService.js.map +1 -1
  172. package/dist/esm/components/AddressLookup/index.js +41 -40
  173. package/dist/esm/components/Alert/Alert.js +4 -4
  174. package/dist/esm/components/Alert/index.js +4 -4
  175. package/dist/esm/components/Box/Box.js +3 -2
  176. package/dist/esm/components/Box/index.js +3 -2
  177. package/dist/esm/components/Breadcrumbs/BreadcrumbItem.js +4 -3
  178. package/dist/esm/components/Breadcrumbs/Breadcrumbs.js +1 -1
  179. package/dist/esm/components/Breadcrumbs/index.js +7 -6
  180. package/dist/esm/components/Checkbox/Checkbox.js +41 -40
  181. package/dist/esm/components/Checkbox/CheckboxGroup.js +41 -40
  182. package/dist/esm/components/Checkbox/index.js +41 -40
  183. package/dist/esm/components/Combobox/Combobox.js +41 -40
  184. package/dist/esm/components/Combobox/index.js +41 -40
  185. package/dist/esm/components/Container/Container.js +2 -1
  186. package/dist/esm/components/Container/index.js +2 -1
  187. package/dist/esm/components/DateField/DateField.js +41 -40
  188. package/dist/esm/components/DateField/index.js +41 -40
  189. package/dist/esm/components/Drawer/Drawer.js +4 -3
  190. package/dist/esm/components/Drawer/index.js +4 -3
  191. package/dist/esm/components/ErrorMessage/ErrorMessage.js +41 -40
  192. package/dist/esm/components/ErrorMessage/index.js +41 -40
  193. package/dist/esm/components/ExpandableText/ExpandableText.js +41 -40
  194. package/dist/esm/components/ExpandableText/index.js +41 -40
  195. package/dist/esm/components/Fieldset/Fieldset.js +2 -1
  196. package/dist/esm/components/Fieldset/index.js +2 -1
  197. package/dist/esm/components/Flex/Flex.js +2 -1
  198. package/dist/esm/components/Flex/index.js +2 -1
  199. package/dist/esm/components/Flex/propUtils.js +2 -1
  200. package/dist/esm/components/Grid/Grid.js +3 -2
  201. package/dist/esm/components/Grid/Item.js +5 -4
  202. package/dist/esm/components/Grid/index.js +7 -6
  203. package/dist/esm/components/List/List.js +1 -1
  204. package/dist/esm/components/List/index.js +1 -1
  205. package/dist/esm/components/Logo/Logo.js +1 -1
  206. package/dist/esm/components/Logo/index.js +1 -1
  207. package/dist/esm/components/MaskedField/MaskedField.js +41 -40
  208. package/dist/esm/components/MaskedField/MaskedField.js.map +1 -1
  209. package/dist/esm/components/MaskedField/index.js +41 -40
  210. package/dist/esm/components/Modal/Header.js +3 -3
  211. package/dist/esm/components/Modal/Modal.js +6 -5
  212. package/dist/esm/components/Modal/ModalContext.js +1 -1
  213. package/dist/esm/components/Modal/index.js +10 -9
  214. package/dist/esm/components/Modal/useModal.js +2 -2
  215. package/dist/esm/components/NumberField/NumberField.js +41 -40
  216. package/dist/esm/components/NumberField/index.js +41 -40
  217. package/dist/esm/components/PasswordField/PasswordField.js +41 -40
  218. package/dist/esm/components/PasswordField/ShowHideButton.js +41 -40
  219. package/dist/esm/components/PasswordField/index.js +41 -40
  220. package/dist/esm/components/Radio/Radio.js +41 -40
  221. package/dist/esm/components/Radio/RadioGroup.js +41 -40
  222. package/dist/esm/components/Radio/index.js +41 -40
  223. package/dist/esm/components/SVG/SVG.js +1 -1
  224. package/dist/esm/components/SVG/index.js +1 -1
  225. package/dist/esm/components/Segment/Segment.js +1 -1
  226. package/dist/esm/components/Segment/index.js +1 -1
  227. package/dist/esm/components/Select/Select.js +41 -40
  228. package/dist/esm/components/Select/index.js +41 -40
  229. package/dist/esm/components/Slider/Slider.js +4 -3
  230. package/dist/esm/components/Slider/index.js +4 -3
  231. package/dist/esm/components/Table/HeaderCell.js +1 -1
  232. package/dist/esm/components/Table/index.js +2 -2
  233. package/dist/esm/components/Text/Text.js +1 -1
  234. package/dist/esm/components/Text/index.js +1 -1
  235. package/dist/esm/components/TextArea/TextArea.js +41 -40
  236. package/dist/esm/components/TextArea/index.js +41 -40
  237. package/dist/esm/components/TextField/TextField.js +41 -40
  238. package/dist/esm/components/TextField/index.js +41 -40
  239. package/dist/esm/components/TextOrHTML/TextOrHTML.js +2 -2
  240. package/dist/esm/components/TextOrHTML/index.js +2 -2
  241. package/dist/esm/components/Title/Title.js +2 -1
  242. package/dist/esm/components/Title/index.js +2 -1
  243. package/dist/esm/components/Toast/index.js +3 -3
  244. package/dist/esm/components/Trust/Trust.js +2 -1
  245. package/dist/esm/components/Trust/index.js +2 -1
  246. package/dist/esm/components/index.js +54 -53
  247. package/dist/esm/hooks/index.js +6 -5
  248. package/dist/esm/hooks/useDialog/index.js +2 -1
  249. package/dist/esm/hooks/useDialog/useDialog.js +2 -1
  250. package/dist/esm/hooks/useDialogPolyfill/index.js +2 -1
  251. package/dist/esm/hooks/useDialogPolyfill/useDialogPolyfill.js +2 -1
  252. package/dist/esm/index.js +56 -55
  253. package/dist/esm/meta.json +5694 -5363
  254. package/dist/esm/utils/filterUnsetValues.js +8 -0
  255. package/dist/esm/utils/filterUnsetValues.js.map +7 -0
  256. package/dist/esm/utils/index.js +5 -1
  257. package/dist/tsconfig.build.tsbuildinfo +1 -1
  258. package/dist/types/components/Breadcrumbs/Breadcrumbs.d.ts +1 -1
  259. package/dist/types/components/Grid/Grid.d.ts +1 -1
  260. package/dist/types/components/Grid/Item.d.ts +1 -1
  261. package/dist/types/components/List/List.d.ts +1 -1
  262. package/dist/types/components/Logo/Logo.d.ts +8 -0
  263. package/dist/types/components/Modal/types.d.ts +2 -0
  264. package/dist/types/components/Modal/useModal.d.ts +2 -0
  265. package/dist/types/components/SVG/SVG.d.ts +4 -0
  266. package/dist/types/components/Segment/Segment.d.ts +4 -3
  267. package/dist/types/components/Table/HeaderCell.d.ts +2 -1
  268. package/dist/types/components/Text/Text.d.ts +1 -1
  269. package/dist/types/utils/filterUnsetValues.d.ts +6 -0
  270. package/dist/types/utils/index.d.ts +1 -0
  271. package/package.json +4 -4
  272. package/src/components/Accordion/Accordion.test.tsx +7 -0
  273. package/src/components/AddressLookup/AddressLookup.test.tsx +76 -0
  274. package/src/components/AddressLookup/AddressLookup.tsx +9 -0
  275. package/src/components/Box/Box.test.tsx +24 -0
  276. package/src/components/Box/Box.tsx +11 -3
  277. package/src/components/Breadcrumbs/Breadcrumbs.test.tsx +130 -0
  278. package/src/components/Breadcrumbs/Breadcrumbs.tsx +1 -1
  279. package/src/components/Button/Button.test.tsx +77 -0
  280. package/src/components/Container/Container.test.tsx +19 -0
  281. package/src/components/Divider/Divider.test.tsx +18 -0
  282. package/src/components/Drawer/Drawer.css +24 -3
  283. package/src/components/Flex/Flex.test.tsx +7 -0
  284. package/src/components/Grid/Grid.test.tsx +30 -0
  285. package/src/components/Grid/Grid.tsx +2 -2
  286. package/src/components/Grid/Item.tsx +3 -3
  287. package/src/components/Icon/Icon.test.tsx +33 -0
  288. package/src/components/Image/Image.test.tsx +7 -0
  289. package/src/components/Label/Label.test.tsx +7 -0
  290. package/src/components/Link/Link.test.tsx +44 -0
  291. package/src/components/List/List.test.tsx +11 -0
  292. package/src/components/List/List.tsx +6 -2
  293. package/src/components/Logo/Logo.test.tsx +36 -0
  294. package/src/components/Logo/Logo.tsx +8 -0
  295. package/src/components/Modal/Header.tsx +13 -2
  296. package/src/components/Modal/Modal.css +42 -3
  297. package/src/components/Modal/Modal.test.tsx +19 -1
  298. package/src/components/Modal/Modal.tsx +11 -2
  299. package/src/components/Modal/ModalContext.tsx +2 -0
  300. package/src/components/Modal/types.ts +2 -0
  301. package/src/components/Modal/useModal.ts +2 -2
  302. package/src/components/Option/Option.test.tsx +67 -0
  303. package/src/components/Progress/Progress.test.tsx +7 -0
  304. package/src/components/SVG/SVG.test.tsx +40 -0
  305. package/src/components/SVG/SVG.tsx +4 -0
  306. package/src/components/Segment/Segment.test.tsx +72 -0
  307. package/src/components/Segment/Segment.tsx +7 -4
  308. package/src/components/Stack/Stack.test.tsx +41 -1
  309. package/src/components/Table/HeaderCell.tsx +3 -2
  310. package/src/components/Table/Table.test.tsx +180 -0
  311. package/src/components/Text/Text.test.tsx +80 -0
  312. package/src/components/Text/Text.tsx +13 -8
  313. package/src/components/TextAreaInput/TextAreaInput.test.tsx +51 -0
  314. package/src/components/Trust/Trust.test.tsx +52 -1
  315. package/src/components/VisuallyHidden/VisuallyHidden.test.tsx +66 -0
  316. package/src/utils/filterUndefinedProps.test.ts +11 -0
  317. package/src/utils/filterUnsetValues.test.ts +16 -0
  318. package/src/utils/filterUnsetValues.ts +17 -0
  319. package/src/utils/index.ts +1 -0
  320. package/dist/esm/chunk-3IMYDZRT.js.map +0 -7
  321. package/dist/esm/chunk-4IB5ROL6.js.map +0 -7
  322. package/dist/esm/chunk-B243ELKZ.js.map +0 -7
  323. package/dist/esm/chunk-DSYPZETD.js +0 -1
  324. package/dist/esm/chunk-LVZ2T6AY.js.map +0 -7
  325. package/dist/esm/chunk-MLN5ELQR.js.map +0 -7
  326. package/dist/esm/chunk-P5ZPHAQT.js.map +0 -7
  327. package/dist/esm/chunk-PB2OICEB.js.map +0 -7
  328. package/dist/esm/chunk-SNRPWCHL.js.map +0 -7
  329. package/dist/esm/chunk-XNVA7FCA.js +0 -39
  330. package/dist/esm/chunk-XNVA7FCA.js.map +0 -7
  331. package/dist/esm/chunk-YLL2DKVF.js.map +0 -7
  332. package/dist/esm/chunk-ZHX7Z5IU.js +0 -15
  333. /package/dist/esm/{chunk-NYFCN7EA.js.map → chunk-6GGDGE7D.js.map} +0 -0
  334. /package/dist/esm/{chunk-OUKMP3DO.js.map → chunk-7JT4DKQA.js.map} +0 -0
  335. /package/dist/esm/{chunk-Q5YY6HPF.js.map → chunk-DZVBN6ZI.js.map} +0 -0
  336. /package/dist/esm/{chunk-OC6ULO4M.js.map → chunk-EJLNC5X5.js.map} +0 -0
  337. /package/dist/esm/{chunk-DSYPZETD.js.map → chunk-FIAL4HTE.js.map} +0 -0
  338. /package/dist/esm/{chunk-OZ2IUZIJ.js.map → chunk-HP2NRM7T.js.map} +0 -0
  339. /package/dist/esm/{chunk-TL4OCKNP.js.map → chunk-LWRY3VIB.js.map} +0 -0
  340. /package/dist/esm/{chunk-N5WGQAHM.js.map → chunk-QWD72EVP.js.map} +0 -0
  341. /package/dist/esm/{chunk-QRHDVVRK.js.map → chunk-VIDKIVA6.js.map} +0 -0
  342. /package/dist/esm/{chunk-O47IW7HD.js.map → chunk-YCE2KOB2.js.map} +0 -0
@@ -5,6 +5,7 @@
5
5
  --drawer-transition-duration: 0;
6
6
  /* Backdrop colour fallback */
7
7
  --backdrop-color: #18181d;
8
+ --backdrop-blur: 4px;
8
9
  }
9
10
 
10
11
  /* Enable transitions only if reduce motion flag is off */
@@ -39,9 +40,9 @@
39
40
  }
40
41
 
41
42
  &::backdrop {
42
- background-color: var(--backdrop-color);
43
- opacity: 0;
44
- transition: opacity var(--drawer-transition-duration) ease-in-out;
43
+ background-color: transparent;
44
+ transition: background-color var(--drawer-transition-duration) ease-in-out;
45
+ backdrop-filter: blur(var(--backdrop-blur));
45
46
  }
46
47
 
47
48
  /* Injected by "dialog-polyfill" */
@@ -54,6 +55,16 @@
54
55
  left: 0;
55
56
  background-color: var(--backdrop-color);
56
57
  opacity: 0.3;
58
+ backdrop-filter: blur(var(--backdrop-blur));
59
+
60
+ @supports (background-color: color-mix(in srgb, red 50%, blue)) {
61
+ background-color: color-mix(
62
+ in srgb,
63
+ var(--backdrop-color) 30%,
64
+ transparent
65
+ );
66
+ opacity: 1;
67
+ }
57
68
 
58
69
  & + ._dialog_overlay {
59
70
  position: fixed;
@@ -133,7 +144,17 @@
133
144
  &.--should-transition {
134
145
  &.--transition {
135
146
  &::backdrop {
147
+ background-color: var(--backdrop-color);
136
148
  opacity: 0.3;
149
+
150
+ @supports (background-color: color-mix(in srgb, red 50%, blue)) {
151
+ background-color: color-mix(
152
+ in srgb,
153
+ var(--backdrop-color) 30%,
154
+ transparent
155
+ );
156
+ opacity: 1;
157
+ }
137
158
  }
138
159
  }
139
160
 
@@ -1,3 +1,4 @@
1
+ import { createRef } from "react";
1
2
  import { render, screen } from "@testing-library/react";
2
3
  import { Flex } from ".";
3
4
 
@@ -73,4 +74,10 @@ describe("Test for Flex", () => {
73
74
  expect(screen.getByTestId("test")).toHaveClass(CLASS_NAME);
74
75
  });
75
76
  });
77
+
78
+ it("forwards ref", () => {
79
+ const ref = createRef<HTMLDivElement>();
80
+ render(<Flex ref={ref}>Text</Flex>);
81
+ expect(ref.current).toBeInstanceOf(HTMLDivElement);
82
+ });
76
83
  });
@@ -1,3 +1,4 @@
1
+ import { createRef } from "react";
1
2
  import { render, screen } from "@testing-library/react";
2
3
  import { Grid } from ".";
3
4
 
@@ -14,6 +15,35 @@ describe("Test for Grid", () => {
14
15
  expect(view).toBeTruthy();
15
16
  });
16
17
 
18
+ it("forwards ref to the grid container", () => {
19
+ const ref = createRef<HTMLDivElement>();
20
+ render(
21
+ <Grid ref={ref}>
22
+ <Grid.Item>Item</Grid.Item>
23
+ </Grid>,
24
+ );
25
+ expect(ref.current).toBeInstanceOf(HTMLDivElement);
26
+ });
27
+
28
+ it("forwards ref to the grid item", () => {
29
+ const ref = createRef<HTMLDivElement>();
30
+ render(
31
+ <Grid>
32
+ <Grid.Item ref={ref}>Item</Grid.Item>
33
+ </Grid>,
34
+ );
35
+ expect(ref.current).toBeInstanceOf(HTMLDivElement);
36
+ });
37
+
38
+ it("uses mobius class on Grid.Item", () => {
39
+ render(
40
+ <Grid>
41
+ <Grid.Item>Item</Grid.Item>
42
+ </Grid>,
43
+ );
44
+ expect(screen.getByText("Item")).toHaveClass("mobius");
45
+ });
46
+
17
47
  describe("given the span prop is an array", () => {
18
48
  it("should render default as fallback", () => {
19
49
  const span = [1, 2, 3];
@@ -40,7 +40,7 @@ export interface GridProps extends RefAttributes<GridElementType>, DOMProps {
40
40
  style?: React.CSSProperties;
41
41
  }
42
42
 
43
- const Grid = ({ ref: _ref, ...props }: GridProps) => {
43
+ const Grid = ({ ref, ...props }: GridProps) => {
44
44
  const {
45
45
  columns = 12,
46
46
  gap,
@@ -70,7 +70,7 @@ const Grid = ({ ref: _ref, ...props }: GridProps) => {
70
70
  ...style,
71
71
  });
72
72
 
73
- return <div style={styles} className={classes} {...rest} />;
73
+ return <div ref={ref} style={styles} className={classes} {...rest} />;
74
74
  };
75
75
 
76
76
  Grid.displayName = "Grid";
@@ -43,7 +43,7 @@ export const getBreakpointMap = (config: Partial<Record<SizeType, number>>) =>
43
43
 
44
44
  export const DEFAULT_SPAN = 12;
45
45
 
46
- const GridItem = ({ ref: _ref, ...props }: GridItemProps) => {
46
+ const GridItem = ({ ref, ...props }: GridItemProps) => {
47
47
  const {
48
48
  breakpoint: { size: breakpointSize },
49
49
  } = useBreakpoint();
@@ -69,7 +69,7 @@ const GridItem = ({ ref: _ref, ...props }: GridItemProps) => {
69
69
  xxl,
70
70
  });
71
71
  const [responsiveSpan, setResponsiveSpan] = useState<number | undefined>();
72
- const classes = classNames("mobius-grid__item", className);
72
+ const classes = classNames("mobius", "mobius-grid__item", className);
73
73
 
74
74
  useEffect(() => {
75
75
  setResponsiveSpan(breakpointMap[breakpointSize]);
@@ -81,7 +81,7 @@ const GridItem = ({ ref: _ref, ...props }: GridItemProps) => {
81
81
  justifySelf,
82
82
  };
83
83
 
84
- return <div style={{ ...styles }} className={classes} {...rest} />;
84
+ return <div ref={ref} style={{ ...styles }} className={classes} {...rest} />;
85
85
  };
86
86
 
87
87
  GridItem.displayName = "GridItem";
@@ -1,3 +1,4 @@
1
+ import { createRef } from "react";
1
2
  import { render, screen } from "@testing-library/react";
2
3
  import { chevronLeft } from "@simplybusiness/icons";
3
4
  import { Icon } from ".";
@@ -34,6 +35,32 @@ describe("Test for Icon", () => {
34
35
  render(<Icon icon={chevronLeft} data-testid="test" />);
35
36
  expect(screen.getByTestId("test")).toHaveClass(XS_SIZE_CLASS_NAME);
36
37
  });
38
+
39
+ it.each(["xs", "sm", "md", "lg"] as const)(
40
+ "applies --size-%s class",
41
+ size => {
42
+ render(<Icon icon={chevronLeft} size={size} data-testid="test" />);
43
+ expect(screen.getByTestId("test")).toHaveClass(`--size-${size}`);
44
+ },
45
+ );
46
+
47
+ it("applies mobius-icon-fw class when fixedWidth is true", () => {
48
+ render(<Icon icon={chevronLeft} fixedWidth data-testid="test" />);
49
+ expect(screen.getByTestId("test")).toHaveClass("mobius-icon-fw");
50
+ });
51
+
52
+ it("applies mobius-icon-spin class when spin is true", () => {
53
+ render(<Icon icon={chevronLeft} spin data-testid="test" />);
54
+ expect(screen.getByTestId("test")).toHaveClass("mobius-icon-spin");
55
+ });
56
+
57
+ it("applies mobius-icon-spin-reverse class when spinReverse is true", () => {
58
+ render(<Icon icon={chevronLeft} spinReverse data-testid="test" />);
59
+ expect(screen.getByTestId("test")).toHaveClass(
60
+ "mobius-icon-spin-reverse",
61
+ );
62
+ expect(screen.getByTestId("test")).toHaveClass("mobius-icon-spin");
63
+ });
37
64
  });
38
65
 
39
66
  describe("SVG title attribute", () => {
@@ -55,4 +82,10 @@ describe("Test for Icon", () => {
55
82
  expect(svgTitleTag).toBeInTheDocument();
56
83
  });
57
84
  });
85
+
86
+ it("forwards ref", () => {
87
+ const ref = createRef<SVGSVGElement>();
88
+ render(<Icon ref={ref} icon={chevronLeft} />);
89
+ expect(ref.current).toBeInstanceOf(SVGSVGElement);
90
+ });
58
91
  });
@@ -1,3 +1,4 @@
1
+ import { createRef } from "react";
1
2
  import { render, screen } from "@testing-library/react";
2
3
  import { Image } from ".";
3
4
 
@@ -41,4 +42,10 @@ describe("Test for Image", () => {
41
42
  expect(screen.getByTestId("test")).toHaveClass(CLASS_NAME);
42
43
  });
43
44
  });
45
+
46
+ it("forwards ref", () => {
47
+ const ref = createRef<HTMLImageElement>();
48
+ render(<Image ref={ref} alt="test" src="test.png" />);
49
+ expect(ref.current).toBeInstanceOf(HTMLImageElement);
50
+ });
44
51
  });
@@ -1,3 +1,4 @@
1
+ import { createRef } from "react";
1
2
  import { render, screen } from "@testing-library/react";
2
3
  import { Label } from ".";
3
4
 
@@ -47,4 +48,10 @@ describe("Test for Label", () => {
47
48
  expect(screen.getByTestId("test")).toHaveClass(CLASS_NAME);
48
49
  });
49
50
  });
51
+
52
+ it("forwards ref", () => {
53
+ const ref = createRef<HTMLLabelElement>();
54
+ render(<Label ref={ref}>Text</Label>);
55
+ expect(ref.current).toBeInstanceOf(HTMLLabelElement);
56
+ });
50
57
  });
@@ -1,3 +1,4 @@
1
+ import { createRef } from "react";
1
2
  import { render, screen } from "@testing-library/react";
2
3
  import userEvent from "@testing-library/user-event";
3
4
  import { Link } from ".";
@@ -43,6 +44,25 @@ describe("Test for Link", () => {
43
44
  });
44
45
  });
45
46
 
47
+ describe("when disabled", () => {
48
+ it("has aria-disabled attribute", () => {
49
+ render(
50
+ <Link href="#" isDisabled>
51
+ Click
52
+ </Link>,
53
+ );
54
+ expect(screen.getByRole("link")).toHaveAttribute("aria-disabled", "true");
55
+ });
56
+ });
57
+
58
+ describe("focus", () => {
59
+ it("is focusable via Tab", async () => {
60
+ render(<Link href="#">Click</Link>);
61
+ await userEvent.tab();
62
+ expect(screen.getByRole("link")).toHaveFocus();
63
+ });
64
+ });
65
+
46
66
  describe("uses correct class names", () => {
47
67
  it("uses Mobius class", () => {
48
68
  render(
@@ -81,6 +101,20 @@ describe("Test for Link", () => {
81
101
  await userEvent.tab();
82
102
  expect(screen.getByTestId("test")).toHaveClass("--is-disabled");
83
103
  });
104
+
105
+ it.each(["primary", "secondary"] as const)(
106
+ "applies mobius-link--%s class",
107
+ variant => {
108
+ render(
109
+ <Link href="#test" data-testid="test" variant={variant}>
110
+ Sample text
111
+ </Link>,
112
+ );
113
+ expect(screen.getByTestId("test")).toHaveClass(
114
+ `mobius-link--${variant}`,
115
+ );
116
+ },
117
+ );
84
118
  });
85
119
 
86
120
  describe("given the the link has disabled prop", () => {
@@ -94,4 +128,14 @@ describe("Test for Link", () => {
94
128
  expect(screen.getByTestId("test")).toBeEnabled();
95
129
  });
96
130
  });
131
+
132
+ it("forwards ref", () => {
133
+ const ref = createRef<HTMLAnchorElement>();
134
+ render(
135
+ <Link ref={ref} href="#">
136
+ Text
137
+ </Link>,
138
+ );
139
+ expect(ref.current).toBeInstanceOf(HTMLAnchorElement);
140
+ });
97
141
  });
@@ -1,3 +1,4 @@
1
+ import { createRef } from "react";
1
2
  import { render, screen } from "@testing-library/react";
2
3
  import type { ListStyleType } from ".";
3
4
  import { List, ListItem } from ".";
@@ -167,4 +168,14 @@ describe("List", () => {
167
168
  expect(screen.getByText("✅")).toHaveClass(LIST_ICON_CLASS_NAME);
168
169
  });
169
170
  });
171
+
172
+ it("forwards ref", () => {
173
+ const ref = createRef<HTMLOListElement & HTMLUListElement>();
174
+ render(
175
+ <List ref={ref}>
176
+ <ListItem>item</ListItem>
177
+ </List>,
178
+ );
179
+ expect(ref.current).toBeInstanceOf(HTMLUListElement);
180
+ });
170
181
  });
@@ -21,7 +21,7 @@ export interface ListProps extends DOMProps {
21
21
  liststyletype?: ListStyleType;
22
22
  icon?: ReactNode;
23
23
  className?: string;
24
- ref?: Ref<HTMLOListElement & HTMLUListElement>;
24
+ ref?: Ref<HTMLElement>;
25
25
  }
26
26
 
27
27
  const List = ({ ref, ...props }: ListProps) => {
@@ -48,7 +48,11 @@ const List = ({ ref, ...props }: ListProps) => {
48
48
  );
49
49
 
50
50
  return (
51
- <Component ref={ref} {...mappedProps} className={classes}>
51
+ <Component
52
+ ref={ref as React.Ref<HTMLOListElement & HTMLUListElement>}
53
+ {...mappedProps}
54
+ className={classes}
55
+ >
52
56
  {Children.map(children, child => {
53
57
  if (isValidElement(child)) {
54
58
  // List items accept a parentIcon prop which is not part of standard HTML
@@ -1,3 +1,4 @@
1
+ import { createRef } from "react";
1
2
  import { render } from "@testing-library/react";
2
3
  import { Logo } from ".";
3
4
 
@@ -25,4 +26,39 @@ describe("Logo", () => {
25
26
  expect(container.firstChild).toHaveClass(customClassName);
26
27
  });
27
28
  });
29
+
30
+ describe("semantic HTML and accessibility", () => {
31
+ it("renders an <svg> element", () => {
32
+ const { container } = render(<Logo />);
33
+ expect(container.firstChild?.nodeName).toBe("svg");
34
+ });
35
+
36
+ it("has a viewBox attribute for proper scaling", () => {
37
+ const { container } = render(<Logo />);
38
+ expect(container.firstChild).toHaveAttribute("viewBox", "0 0 144 37");
39
+ });
40
+
41
+ it("applies custom width and height", () => {
42
+ const { container } = render(<Logo width="200" height="50" />);
43
+ expect(container.firstChild).toHaveAttribute("width", "200");
44
+ expect(container.firstChild).toHaveAttribute("height", "50");
45
+ });
46
+
47
+ // Note: Logo does not set role="img", aria-label, or <title> by default.
48
+ // Screen readers may not announce this SVG meaningfully. Consider adding
49
+ // role="img" and aria-label="Simply Business" for better accessibility.
50
+ // The component's type interface (LogoProps) also does not accept role or
51
+ // aria-label, so consumers cannot pass these props without a type error.
52
+ it("does not set an accessible label by default", () => {
53
+ const { container } = render(<Logo />);
54
+ expect(container.firstChild).not.toHaveAttribute("role");
55
+ expect(container.firstChild).not.toHaveAttribute("aria-label");
56
+ });
57
+ });
58
+
59
+ it("forwards ref", () => {
60
+ const ref = createRef<SVGSVGElement>();
61
+ render(<Logo ref={ref} />);
62
+ expect(ref.current).toBeInstanceOf(SVGSVGElement);
63
+ });
28
64
  });
@@ -11,6 +11,14 @@ export interface LogoProps extends DOMProps, RefAttributes<LogoElementType> {
11
11
  width?: string;
12
12
  /** Custom height. When defined along with width, it will scale proportionally */
13
13
  height?: string;
14
+ /** ARIA role for the SVG element */
15
+ role?: React.AriaRole;
16
+ /** Accessible label for the logo */
17
+ "aria-label"?: string;
18
+ /** Whether the logo is hidden from screen readers */
19
+ "aria-hidden"?: boolean | "true" | "false";
20
+ /** ID of an element that labels the logo */
21
+ "aria-labelledby"?: string;
14
22
  }
15
23
 
16
24
  export const Logo = ({ ref, ...props }: LogoProps) => {
@@ -1,4 +1,5 @@
1
1
  import type { PropsWithChildren, RefAttributes } from "react";
2
+ import { useEffect, useId } from "react";
2
3
 
3
4
  import { cross } from "@simplybusiness/icons";
4
5
  import type { DOMProps } from "../../types/dom";
@@ -12,10 +13,20 @@ export interface HeaderProps
12
13
  extends DOMProps, RefAttributes<HeaderElementType>, PropsWithChildren {}
13
14
 
14
15
  const Header = ({ ref, children, ...otherProps }: HeaderProps) => {
15
- const { onClose, closeLabel } = useModal();
16
+ const { onClose, closeLabel, setTitleId } = useModal();
17
+ const titleId = useId();
18
+
19
+ useEffect(() => {
20
+ setTitleId(titleId);
21
+ }, [titleId, setTitleId]);
16
22
 
17
23
  return (
18
- <header ref={ref} {...otherProps} className="mobius-modal__header">
24
+ <header
25
+ ref={ref}
26
+ {...otherProps}
27
+ className="mobius-modal__header"
28
+ id={titleId}
29
+ >
19
30
  {children}
20
31
  <Button
21
32
  aria-label="Close"
@@ -1,4 +1,13 @@
1
1
  @layer atoms {
2
+ :root,
3
+ :host,
4
+ ::backdrop {
5
+ /* Backdrop fallbacks — ::backdrop doesn't inherit from :root */
6
+ --backdrop-color: #18181d;
7
+ --backdrop-blur: 4px;
8
+ --modal-transition-duration: 300ms;
9
+ }
10
+
2
11
  /* Disable transitions if reduce motion flag is on */
3
12
  @media (prefers-reduced-motion: reduce) {
4
13
  :root,
@@ -34,9 +43,9 @@
34
43
  }
35
44
 
36
45
  &::backdrop {
37
- background-color: var(--backdrop-color);
38
- opacity: 0;
39
- transition: opacity var(--modal-transition-duration) ease-in-out;
46
+ background-color: transparent;
47
+ transition: background-color var(--modal-transition-duration) ease-in-out;
48
+ backdrop-filter: blur(var(--backdrop-blur));
40
49
  }
41
50
 
42
51
  /* Injected by "dialog-polyfill" */
@@ -49,6 +58,16 @@
49
58
  left: 0;
50
59
  background-color: var(--backdrop-color);
51
60
  opacity: 0.3;
61
+ backdrop-filter: blur(var(--backdrop-blur));
62
+
63
+ @supports (background-color: color-mix(in srgb, red 50%, blue)) {
64
+ background-color: color-mix(
65
+ in srgb,
66
+ var(--backdrop-color) 30%,
67
+ transparent
68
+ );
69
+ opacity: 1;
70
+ }
52
71
 
53
72
  & + ._dialog_overlay {
54
73
  position: fixed;
@@ -83,7 +102,17 @@
83
102
  }
84
103
 
85
104
  &::backdrop {
105
+ background-color: var(--backdrop-color);
86
106
  opacity: 0.3;
107
+
108
+ @supports (background-color: color-mix(in srgb, red 50%, blue)) {
109
+ background-color: color-mix(
110
+ in srgb,
111
+ var(--backdrop-color) 30%,
112
+ transparent
113
+ );
114
+ opacity: 1;
115
+ }
87
116
  }
88
117
  }
89
118
 
@@ -98,7 +127,17 @@
98
127
  &.--should-transition {
99
128
  &.--transition {
100
129
  &::backdrop {
130
+ background-color: var(--backdrop-color);
101
131
  opacity: 0.3;
132
+
133
+ @supports (background-color: color-mix(in srgb, red 50%, blue)) {
134
+ background-color: color-mix(
135
+ in srgb,
136
+ var(--backdrop-color) 30%,
137
+ transparent
138
+ );
139
+ opacity: 1;
140
+ }
102
141
  }
103
142
  }
104
143
 
@@ -1,4 +1,4 @@
1
- import { useState } from "react";
1
+ import { createRef, useState } from "react";
2
2
  import { render, screen, waitFor } from "@testing-library/react";
3
3
  import userEvent from "@testing-library/user-event";
4
4
  import { Modal } from ".";
@@ -96,6 +96,17 @@ describe("Modal", () => {
96
96
  });
97
97
  });
98
98
 
99
+ it("has open attribute when isOpen is true", async () => {
100
+ render(
101
+ <Modal isOpen onClose={vi.fn()}>
102
+ <Modal.Header>Title</Modal.Header>
103
+ <Modal.Content>Content</Modal.Content>
104
+ </Modal>,
105
+ );
106
+ const dialog = await screen.findByRole("dialog");
107
+ expect(dialog).toHaveAttribute("open");
108
+ });
109
+
99
110
  describe("pressing close button", () => {
100
111
  it("should close the modal", async () => {
101
112
  const App = () => {
@@ -190,4 +201,11 @@ describe("Modal", () => {
190
201
  expect(onOpen).toHaveBeenCalled();
191
202
  });
192
203
  });
204
+
205
+ it("forwards ref", async () => {
206
+ const ref = createRef<HTMLDialogElement>();
207
+ render(<Modal ref={ref} isOpen />);
208
+ await screen.findByRole("dialog");
209
+ expect(ref.current).toBeInstanceOf(HTMLDialogElement);
210
+ });
193
211
  });
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
 
3
3
  import classNames from "classnames/dedupe";
4
- import { useEffect, useMemo, useRef, useState } from "react";
4
+ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
5
5
  import { useDialog } from "../../hooks";
6
6
  import { mergeRefs } from "../../utils";
7
7
  import { supportsDialog } from "../../utils/polyfill-tests";
@@ -56,12 +56,20 @@ const Modal = ({ ref, ...props }: ModalProps) => {
56
56
  className,
57
57
  );
58
58
 
59
+ const [titleId, setTitleId] = useState<string | undefined>(undefined);
60
+
61
+ const handleSetTitleId = useCallback((id: string) => {
62
+ setTitleId(id);
63
+ }, []);
64
+
59
65
  const contextValue = useMemo(
60
66
  () => ({
61
67
  onClose: close,
62
68
  closeLabel,
69
+ titleId,
70
+ setTitleId: handleSetTitleId,
63
71
  }),
64
- [close, closeLabel],
72
+ [close, closeLabel, titleId, handleSetTitleId],
65
73
  );
66
74
 
67
75
  return (
@@ -69,6 +77,7 @@ const Modal = ({ ref, ...props }: ModalProps) => {
69
77
  ref={mergeRefs([dialogRef, ref])}
70
78
  onCancel={close}
71
79
  className={modalClasses}
80
+ aria-labelledby={titleId}
72
81
  {...rest}
73
82
  >
74
83
  <ModalContext.Provider value={contextValue}>
@@ -4,4 +4,6 @@ import type { ModalContextProps } from "./types";
4
4
  export const ModalContext = createContext<ModalContextProps>({
5
5
  onClose: () => {},
6
6
  closeLabel: undefined,
7
+ titleId: undefined,
8
+ setTitleId: () => {},
7
9
  });
@@ -15,4 +15,6 @@ export interface ModalProps extends RefAttributes<ModalElementType> {
15
15
  export type ModalContextProps = {
16
16
  onClose: (event?: SyntheticEvent<HTMLElement, Event>) => void;
17
17
  closeLabel: string | undefined;
18
+ titleId: string | undefined;
19
+ setTitleId: (id: string) => void;
18
20
  };
@@ -2,7 +2,7 @@ import { useContext } from "react";
2
2
  import { ModalContext } from "./ModalContext";
3
3
 
4
4
  export const useModal = () => {
5
- const { onClose, closeLabel } = useContext(ModalContext);
5
+ const { onClose, closeLabel, titleId, setTitleId } = useContext(ModalContext);
6
6
 
7
- return { onClose, closeLabel };
7
+ return { onClose, closeLabel, titleId, setTitleId };
8
8
  };