@simplybusiness/mobius 10.2.0 → 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 (337) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/dist/cjs/components/AddressLookup/AddressLookup.js +219 -162
  3. package/dist/cjs/components/AddressLookup/AddressLookup.js.map +4 -4
  4. package/dist/cjs/components/AddressLookup/index.js +219 -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 +186 -129
  20. package/dist/cjs/components/Checkbox/Checkbox.js.map +4 -4
  21. package/dist/cjs/components/Checkbox/CheckboxGroup.js +191 -134
  22. package/dist/cjs/components/Checkbox/CheckboxGroup.js.map +4 -4
  23. package/dist/cjs/components/Checkbox/index.js +199 -142
  24. package/dist/cjs/components/Checkbox/index.js.map +4 -4
  25. package/dist/cjs/components/Combobox/Combobox.js +214 -157
  26. package/dist/cjs/components/Combobox/Combobox.js.map +4 -4
  27. package/dist/cjs/components/Combobox/index.js +214 -157
  28. package/dist/cjs/components/Combobox/index.js.map +4 -4
  29. package/dist/cjs/components/DateField/DateField.js +187 -130
  30. package/dist/cjs/components/DateField/DateField.js.map +4 -4
  31. package/dist/cjs/components/DateField/index.js +187 -130
  32. package/dist/cjs/components/DateField/index.js.map +4 -4
  33. package/dist/cjs/components/ErrorMessage/ErrorMessage.js +178 -121
  34. package/dist/cjs/components/ErrorMessage/ErrorMessage.js.map +4 -4
  35. package/dist/cjs/components/ErrorMessage/index.js +178 -121
  36. package/dist/cjs/components/ErrorMessage/index.js.map +4 -4
  37. package/dist/cjs/components/ExpandableText/ExpandableText.js +178 -121
  38. package/dist/cjs/components/ExpandableText/ExpandableText.js.map +4 -4
  39. package/dist/cjs/components/ExpandableText/index.js +178 -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 +181 -124
  54. package/dist/cjs/components/MaskedField/MaskedField.js.map +4 -4
  55. package/dist/cjs/components/MaskedField/index.js +181 -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 +181 -124
  69. package/dist/cjs/components/NumberField/NumberField.js.map +4 -4
  70. package/dist/cjs/components/NumberField/index.js +181 -124
  71. package/dist/cjs/components/NumberField/index.js.map +4 -4
  72. package/dist/cjs/components/PasswordField/PasswordField.js +181 -124
  73. package/dist/cjs/components/PasswordField/PasswordField.js.map +4 -4
  74. package/dist/cjs/components/PasswordField/ShowHideButton.js +178 -121
  75. package/dist/cjs/components/PasswordField/ShowHideButton.js.map +4 -4
  76. package/dist/cjs/components/PasswordField/index.js +181 -124
  77. package/dist/cjs/components/PasswordField/index.js.map +4 -4
  78. package/dist/cjs/components/Radio/Radio.js +178 -121
  79. package/dist/cjs/components/Radio/Radio.js.map +4 -4
  80. package/dist/cjs/components/Radio/RadioGroup.js +178 -121
  81. package/dist/cjs/components/Radio/RadioGroup.js.map +4 -4
  82. package/dist/cjs/components/Radio/index.js +178 -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 +178 -121
  91. package/dist/cjs/components/Select/Select.js.map +4 -4
  92. package/dist/cjs/components/Select/index.js +178 -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 +178 -121
  103. package/dist/cjs/components/TextArea/TextArea.js.map +4 -4
  104. package/dist/cjs/components/TextArea/index.js +178 -121
  105. package/dist/cjs/components/TextArea/index.js.map +4 -4
  106. package/dist/cjs/components/TextField/TextField.js +181 -124
  107. package/dist/cjs/components/TextField/TextField.js.map +4 -4
  108. package/dist/cjs/components/TextField/index.js +181 -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 +205 -148
  115. package/dist/cjs/components/index.js.map +4 -4
  116. package/dist/cjs/index.js +205 -148
  117. package/dist/cjs/index.js.map +4 -4
  118. package/dist/cjs/meta.json +844 -539
  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-RR4UQSOZ.js → chunk-I6EUIFUJ.js} +11 -11
  136. package/dist/esm/{chunk-3IMYDZRT.js → chunk-JFDDW3IV.js} +1 -1
  137. package/dist/esm/chunk-JFDDW3IV.js.map +7 -0
  138. package/dist/esm/{chunk-4IB5ROL6.js → chunk-KXLTGNKF.js} +12 -5
  139. package/dist/esm/chunk-KXLTGNKF.js.map +7 -0
  140. package/dist/esm/{chunk-TL4OCKNP.js → chunk-LWRY3VIB.js} +2 -2
  141. package/dist/esm/chunk-MPB5F6QL.js +53 -0
  142. package/dist/esm/chunk-MPB5F6QL.js.map +7 -0
  143. package/dist/esm/{chunk-DNMS6KEY.js → chunk-PARKMZYZ.js} +4 -4
  144. package/dist/esm/{chunk-DNMS6KEY.js.map → chunk-PARKMZYZ.js.map} +2 -2
  145. package/dist/esm/chunk-Q5MIALGZ.js +15 -0
  146. package/dist/esm/{chunk-ZHX7Z5IU.js.map → chunk-Q5MIALGZ.js.map} +2 -2
  147. package/dist/esm/{chunk-N5WGQAHM.js → chunk-QWD72EVP.js} +4 -4
  148. package/dist/esm/{chunk-KLXMVFIR.js → chunk-TBKQA5ZF.js} +5 -2
  149. package/dist/esm/{chunk-KLXMVFIR.js.map → chunk-TBKQA5ZF.js.map} +2 -2
  150. package/dist/esm/{chunk-B243ELKZ.js → chunk-TJCUKTFX.js} +10 -4
  151. package/dist/esm/chunk-TJCUKTFX.js.map +7 -0
  152. package/dist/esm/{chunk-P5ZPHAQT.js → chunk-UCNWPF7R.js} +3 -3
  153. package/dist/esm/chunk-UCNWPF7R.js.map +7 -0
  154. package/dist/esm/{chunk-S37ULE57.js → chunk-VASDBM4Z.js} +1 -1
  155. package/dist/esm/{chunk-S37ULE57.js.map → chunk-VASDBM4Z.js.map} +2 -2
  156. package/dist/esm/{chunk-QRHDVVRK.js → chunk-VIDKIVA6.js} +2 -2
  157. package/dist/esm/{chunk-SDGIWQ3R.js → chunk-WP5OEMNG.js} +3 -3
  158. package/dist/esm/{chunk-SDGIWQ3R.js.map → chunk-WP5OEMNG.js.map} +2 -2
  159. package/dist/esm/{chunk-MLN5ELQR.js → chunk-WXRQIMMM.js} +1 -1
  160. package/dist/esm/chunk-WXRQIMMM.js.map +7 -0
  161. package/dist/esm/{chunk-O47IW7HD.js → chunk-YCE2KOB2.js} +5 -5
  162. package/dist/esm/{chunk-SNRPWCHL.js → chunk-ZS5MFZHD.js} +11 -8
  163. package/dist/esm/chunk-ZS5MFZHD.js.map +7 -0
  164. package/dist/esm/components/Accordion/Accordion.js +7 -6
  165. package/dist/esm/components/Accordion/AccordionLink.js +6 -5
  166. package/dist/esm/components/Accordion/AccordionList.js +8 -7
  167. package/dist/esm/components/Accordion/index.js +8 -7
  168. package/dist/esm/components/AddressLookup/AddressLookup.js +41 -40
  169. package/dist/esm/components/AddressLookup/__mocks__/LoqateAddressLookupService.js +2 -1
  170. package/dist/esm/components/AddressLookup/__mocks__/LoqateAddressLookupService.js.map +1 -1
  171. package/dist/esm/components/AddressLookup/index.js +41 -40
  172. package/dist/esm/components/Alert/Alert.js +4 -4
  173. package/dist/esm/components/Alert/index.js +4 -4
  174. package/dist/esm/components/Box/Box.js +3 -2
  175. package/dist/esm/components/Box/index.js +3 -2
  176. package/dist/esm/components/Breadcrumbs/BreadcrumbItem.js +4 -3
  177. package/dist/esm/components/Breadcrumbs/Breadcrumbs.js +1 -1
  178. package/dist/esm/components/Breadcrumbs/index.js +7 -6
  179. package/dist/esm/components/Checkbox/Checkbox.js +41 -40
  180. package/dist/esm/components/Checkbox/CheckboxGroup.js +41 -40
  181. package/dist/esm/components/Checkbox/index.js +41 -40
  182. package/dist/esm/components/Combobox/Combobox.js +41 -40
  183. package/dist/esm/components/Combobox/index.js +41 -40
  184. package/dist/esm/components/Container/Container.js +2 -1
  185. package/dist/esm/components/Container/index.js +2 -1
  186. package/dist/esm/components/DateField/DateField.js +41 -40
  187. package/dist/esm/components/DateField/index.js +41 -40
  188. package/dist/esm/components/Drawer/Drawer.js +4 -3
  189. package/dist/esm/components/Drawer/index.js +4 -3
  190. package/dist/esm/components/ErrorMessage/ErrorMessage.js +41 -40
  191. package/dist/esm/components/ErrorMessage/index.js +41 -40
  192. package/dist/esm/components/ExpandableText/ExpandableText.js +41 -40
  193. package/dist/esm/components/ExpandableText/index.js +41 -40
  194. package/dist/esm/components/Fieldset/Fieldset.js +2 -1
  195. package/dist/esm/components/Fieldset/index.js +2 -1
  196. package/dist/esm/components/Flex/Flex.js +2 -1
  197. package/dist/esm/components/Flex/index.js +2 -1
  198. package/dist/esm/components/Flex/propUtils.js +2 -1
  199. package/dist/esm/components/Grid/Grid.js +3 -2
  200. package/dist/esm/components/Grid/Item.js +5 -4
  201. package/dist/esm/components/Grid/index.js +7 -6
  202. package/dist/esm/components/List/List.js +1 -1
  203. package/dist/esm/components/List/index.js +1 -1
  204. package/dist/esm/components/Logo/Logo.js +1 -1
  205. package/dist/esm/components/Logo/index.js +1 -1
  206. package/dist/esm/components/MaskedField/MaskedField.js +41 -40
  207. package/dist/esm/components/MaskedField/MaskedField.js.map +1 -1
  208. package/dist/esm/components/MaskedField/index.js +41 -40
  209. package/dist/esm/components/Modal/Header.js +3 -3
  210. package/dist/esm/components/Modal/Modal.js +6 -5
  211. package/dist/esm/components/Modal/ModalContext.js +1 -1
  212. package/dist/esm/components/Modal/index.js +10 -9
  213. package/dist/esm/components/Modal/useModal.js +2 -2
  214. package/dist/esm/components/NumberField/NumberField.js +41 -40
  215. package/dist/esm/components/NumberField/index.js +41 -40
  216. package/dist/esm/components/PasswordField/PasswordField.js +41 -40
  217. package/dist/esm/components/PasswordField/ShowHideButton.js +41 -40
  218. package/dist/esm/components/PasswordField/index.js +41 -40
  219. package/dist/esm/components/Radio/Radio.js +41 -40
  220. package/dist/esm/components/Radio/RadioGroup.js +41 -40
  221. package/dist/esm/components/Radio/index.js +41 -40
  222. package/dist/esm/components/SVG/SVG.js +1 -1
  223. package/dist/esm/components/SVG/index.js +1 -1
  224. package/dist/esm/components/Segment/Segment.js +1 -1
  225. package/dist/esm/components/Segment/index.js +1 -1
  226. package/dist/esm/components/Select/Select.js +41 -40
  227. package/dist/esm/components/Select/index.js +41 -40
  228. package/dist/esm/components/Slider/Slider.js +4 -3
  229. package/dist/esm/components/Slider/index.js +4 -3
  230. package/dist/esm/components/Table/HeaderCell.js +1 -1
  231. package/dist/esm/components/Table/index.js +2 -2
  232. package/dist/esm/components/Text/Text.js +1 -1
  233. package/dist/esm/components/Text/index.js +1 -1
  234. package/dist/esm/components/TextArea/TextArea.js +41 -40
  235. package/dist/esm/components/TextArea/index.js +41 -40
  236. package/dist/esm/components/TextField/TextField.js +41 -40
  237. package/dist/esm/components/TextField/index.js +41 -40
  238. package/dist/esm/components/TextOrHTML/TextOrHTML.js +2 -2
  239. package/dist/esm/components/TextOrHTML/index.js +2 -2
  240. package/dist/esm/components/Title/Title.js +2 -1
  241. package/dist/esm/components/Title/index.js +2 -1
  242. package/dist/esm/components/Toast/index.js +3 -3
  243. package/dist/esm/components/Trust/Trust.js +2 -1
  244. package/dist/esm/components/Trust/index.js +2 -1
  245. package/dist/esm/components/index.js +54 -53
  246. package/dist/esm/hooks/index.js +6 -5
  247. package/dist/esm/hooks/useDialog/index.js +2 -1
  248. package/dist/esm/hooks/useDialog/useDialog.js +2 -1
  249. package/dist/esm/hooks/useDialogPolyfill/index.js +2 -1
  250. package/dist/esm/hooks/useDialogPolyfill/useDialogPolyfill.js +2 -1
  251. package/dist/esm/index.js +56 -55
  252. package/dist/esm/meta.json +5690 -5359
  253. package/dist/esm/utils/filterUnsetValues.js +8 -0
  254. package/dist/esm/utils/filterUnsetValues.js.map +7 -0
  255. package/dist/esm/utils/index.js +5 -1
  256. package/dist/tsconfig.build.tsbuildinfo +1 -1
  257. package/dist/types/components/Breadcrumbs/Breadcrumbs.d.ts +1 -1
  258. package/dist/types/components/Grid/Grid.d.ts +1 -1
  259. package/dist/types/components/Grid/Item.d.ts +1 -1
  260. package/dist/types/components/List/List.d.ts +1 -1
  261. package/dist/types/components/Logo/Logo.d.ts +8 -0
  262. package/dist/types/components/Modal/types.d.ts +2 -0
  263. package/dist/types/components/Modal/useModal.d.ts +2 -0
  264. package/dist/types/components/SVG/SVG.d.ts +4 -0
  265. package/dist/types/components/Segment/Segment.d.ts +4 -3
  266. package/dist/types/components/Table/HeaderCell.d.ts +2 -1
  267. package/dist/types/components/Text/Text.d.ts +1 -1
  268. package/dist/types/utils/filterUnsetValues.d.ts +6 -0
  269. package/dist/types/utils/index.d.ts +1 -0
  270. package/package.json +4 -4
  271. package/src/components/Accordion/Accordion.test.tsx +7 -0
  272. package/src/components/Box/Box.test.tsx +24 -0
  273. package/src/components/Box/Box.tsx +11 -3
  274. package/src/components/Breadcrumbs/Breadcrumbs.test.tsx +130 -0
  275. package/src/components/Breadcrumbs/Breadcrumbs.tsx +1 -1
  276. package/src/components/Button/Button.test.tsx +77 -0
  277. package/src/components/Container/Container.test.tsx +19 -0
  278. package/src/components/Divider/Divider.test.tsx +18 -0
  279. package/src/components/Flex/Flex.test.tsx +7 -0
  280. package/src/components/Grid/Grid.test.tsx +30 -0
  281. package/src/components/Grid/Grid.tsx +2 -2
  282. package/src/components/Grid/Item.tsx +3 -3
  283. package/src/components/Icon/Icon.test.tsx +33 -0
  284. package/src/components/Image/Image.test.tsx +7 -0
  285. package/src/components/Label/Label.test.tsx +7 -0
  286. package/src/components/Link/Link.test.tsx +44 -0
  287. package/src/components/List/List.test.tsx +11 -0
  288. package/src/components/List/List.tsx +6 -2
  289. package/src/components/Logo/Logo.test.tsx +36 -0
  290. package/src/components/Logo/Logo.tsx +8 -0
  291. package/src/components/Modal/Header.tsx +13 -2
  292. package/src/components/Modal/Modal.test.tsx +19 -1
  293. package/src/components/Modal/Modal.tsx +11 -2
  294. package/src/components/Modal/ModalContext.tsx +2 -0
  295. package/src/components/Modal/types.ts +2 -0
  296. package/src/components/Modal/useModal.ts +2 -2
  297. package/src/components/Option/Option.test.tsx +67 -0
  298. package/src/components/Progress/Progress.test.tsx +7 -0
  299. package/src/components/SVG/SVG.test.tsx +40 -0
  300. package/src/components/SVG/SVG.tsx +4 -0
  301. package/src/components/Segment/Segment.test.tsx +72 -0
  302. package/src/components/Segment/Segment.tsx +7 -4
  303. package/src/components/Stack/Stack.test.tsx +41 -1
  304. package/src/components/Table/HeaderCell.tsx +3 -2
  305. package/src/components/Table/Table.test.tsx +180 -0
  306. package/src/components/Text/Text.test.tsx +80 -0
  307. package/src/components/Text/Text.tsx +13 -8
  308. package/src/components/TextAreaInput/TextAreaInput.test.tsx +51 -0
  309. package/src/components/Trust/Trust.test.tsx +52 -1
  310. package/src/components/VisuallyHidden/VisuallyHidden.test.tsx +66 -0
  311. package/src/utils/filterUndefinedProps.test.ts +11 -0
  312. package/src/utils/filterUnsetValues.test.ts +16 -0
  313. package/src/utils/filterUnsetValues.ts +17 -0
  314. package/src/utils/index.ts +1 -0
  315. package/dist/esm/chunk-3IMYDZRT.js.map +0 -7
  316. package/dist/esm/chunk-4IB5ROL6.js.map +0 -7
  317. package/dist/esm/chunk-B243ELKZ.js.map +0 -7
  318. package/dist/esm/chunk-DSYPZETD.js +0 -1
  319. package/dist/esm/chunk-LVZ2T6AY.js.map +0 -7
  320. package/dist/esm/chunk-MLN5ELQR.js.map +0 -7
  321. package/dist/esm/chunk-P5ZPHAQT.js.map +0 -7
  322. package/dist/esm/chunk-SNRPWCHL.js.map +0 -7
  323. package/dist/esm/chunk-XNVA7FCA.js +0 -39
  324. package/dist/esm/chunk-XNVA7FCA.js.map +0 -7
  325. package/dist/esm/chunk-YLL2DKVF.js.map +0 -7
  326. package/dist/esm/chunk-ZHX7Z5IU.js +0 -15
  327. /package/dist/esm/{chunk-NYFCN7EA.js.map → chunk-6GGDGE7D.js.map} +0 -0
  328. /package/dist/esm/{chunk-OUKMP3DO.js.map → chunk-7JT4DKQA.js.map} +0 -0
  329. /package/dist/esm/{chunk-Q5YY6HPF.js.map → chunk-DZVBN6ZI.js.map} +0 -0
  330. /package/dist/esm/{chunk-OC6ULO4M.js.map → chunk-EJLNC5X5.js.map} +0 -0
  331. /package/dist/esm/{chunk-DSYPZETD.js.map → chunk-FIAL4HTE.js.map} +0 -0
  332. /package/dist/esm/{chunk-OZ2IUZIJ.js.map → chunk-HP2NRM7T.js.map} +0 -0
  333. /package/dist/esm/{chunk-RR4UQSOZ.js.map → chunk-I6EUIFUJ.js.map} +0 -0
  334. /package/dist/esm/{chunk-TL4OCKNP.js.map → chunk-LWRY3VIB.js.map} +0 -0
  335. /package/dist/esm/{chunk-N5WGQAHM.js.map → chunk-QWD72EVP.js.map} +0 -0
  336. /package/dist/esm/{chunk-QRHDVVRK.js.map → chunk-VIDKIVA6.js.map} +0 -0
  337. /package/dist/esm/{chunk-O47IW7HD.js.map → chunk-YCE2KOB2.js.map} +0 -0
@@ -1,6 +1,6 @@
1
1
  import type { RefAttributes, ReactNode } from "react";
2
2
  import "./Breadcrumbs.css";
3
- export type BreadcrumbsElementType = HTMLUListElement;
3
+ export type BreadcrumbsElementType = HTMLElement;
4
4
  export interface BreadcrumbsProps extends RefAttributes<BreadcrumbsElementType> {
5
5
  /** Custom class name for setting specific CSS */
6
6
  className?: string;
@@ -25,7 +25,7 @@ export interface GridProps extends RefAttributes<GridElementType>, DOMProps {
25
25
  style?: React.CSSProperties;
26
26
  }
27
27
  declare const Grid: {
28
- ({ ref: _ref, ...props }: GridProps): import("react/jsx-runtime").JSX.Element;
28
+ ({ ref, ...props }: GridProps): import("react/jsx-runtime").JSX.Element;
29
29
  displayName: string;
30
30
  };
31
31
  export { Grid };
@@ -25,7 +25,7 @@ export interface GridItemProps extends RefAttributes<GridItemElementType>, DOMPr
25
25
  export declare const getBreakpointMap: (config: Partial<Record<SizeType, number>>) => Record<string, number | undefined>;
26
26
  export declare const DEFAULT_SPAN = 12;
27
27
  declare const GridItem: {
28
- ({ ref: _ref, ...props }: GridItemProps): import("react/jsx-runtime").JSX.Element;
28
+ ({ ref, ...props }: GridItemProps): import("react/jsx-runtime").JSX.Element;
29
29
  displayName: string;
30
30
  };
31
31
  export { GridItem };
@@ -10,7 +10,7 @@ export interface ListProps extends DOMProps {
10
10
  liststyletype?: ListStyleType;
11
11
  icon?: ReactNode;
12
12
  className?: string;
13
- ref?: Ref<HTMLOListElement & HTMLUListElement>;
13
+ ref?: Ref<HTMLElement>;
14
14
  }
15
15
  declare const List: {
16
16
  ({ ref, ...props }: ListProps): import("react/jsx-runtime").JSX.Element;
@@ -8,6 +8,14 @@ export interface LogoProps extends DOMProps, RefAttributes<LogoElementType> {
8
8
  width?: string;
9
9
  /** Custom height. When defined along with width, it will scale proportionally */
10
10
  height?: string;
11
+ /** ARIA role for the SVG element */
12
+ role?: React.AriaRole;
13
+ /** Accessible label for the logo */
14
+ "aria-label"?: string;
15
+ /** Whether the logo is hidden from screen readers */
16
+ "aria-hidden"?: boolean | "true" | "false";
17
+ /** ID of an element that labels the logo */
18
+ "aria-labelledby"?: string;
11
19
  }
12
20
  export declare const Logo: {
13
21
  ({ ref, ...props }: LogoProps): import("react/jsx-runtime").JSX.Element;
@@ -13,4 +13,6 @@ export interface ModalProps extends RefAttributes<ModalElementType> {
13
13
  export type ModalContextProps = {
14
14
  onClose: (event?: SyntheticEvent<HTMLElement, Event>) => void;
15
15
  closeLabel: string | undefined;
16
+ titleId: string | undefined;
17
+ setTitleId: (id: string) => void;
16
18
  };
@@ -1,4 +1,6 @@
1
1
  export declare const useModal: () => {
2
2
  onClose: (event?: import("react").SyntheticEvent<HTMLElement, Event>) => void;
3
3
  closeLabel: string | undefined;
4
+ titleId: string | undefined;
5
+ setTitleId: (id: string) => void;
4
6
  };
@@ -4,6 +4,10 @@ export interface SVGProps extends DOMProps, RefAttributes<SVGSVGElement> {
4
4
  children: React.ReactElement<React.SVGProps<SVGSVGElement>>;
5
5
  className?: string;
6
6
  style?: React.CSSProperties;
7
+ role?: React.AriaRole;
8
+ "aria-label"?: string;
9
+ "aria-hidden"?: boolean | "true" | "false";
10
+ "aria-labelledby"?: string;
7
11
  }
8
12
  declare const SVG: {
9
13
  ({ ref, ...props }: SVGProps): import("react/jsx-runtime").JSX.Element;
@@ -1,7 +1,8 @@
1
- import type { ReactNode } from "react";
1
+ import type { ReactNode, RefAttributes } from "react";
2
2
  import type { DOMProps } from "../../types/dom";
3
3
  import "./Segment.css";
4
- export interface SegmentProps extends DOMProps {
4
+ export type SegmentElementType = HTMLDivElement;
5
+ export interface SegmentProps extends DOMProps, RefAttributes<SegmentElementType> {
5
6
  className?: string;
6
7
  heading?: string;
7
8
  /** Background colour for Segment */
@@ -11,7 +12,7 @@ export interface SegmentProps extends DOMProps {
11
12
  children?: ReactNode;
12
13
  }
13
14
  declare const Segment: {
14
- (props: SegmentProps): import("react/jsx-runtime").JSX.Element;
15
+ ({ ref, ...props }: SegmentProps): import("react/jsx-runtime").JSX.Element;
15
16
  displayName: string;
16
17
  };
17
18
  export { Segment };
@@ -4,10 +4,11 @@ export interface HeaderCellProps extends RefAttributes<HTMLTableCellElement> {
4
4
  className?: string;
5
5
  colSpan?: number;
6
6
  rowSpan?: number;
7
+ scope?: "col" | "row" | "colgroup" | "rowgroup";
7
8
  }
8
9
  export type HeaderCellRef = Ref<HTMLTableCellElement>;
9
10
  declare const HeaderCell: {
10
- ({ ref, ...props }: HeaderCellProps): import("react/jsx-runtime").JSX.Element;
11
+ ({ ref, scope, ...props }: HeaderCellProps): import("react/jsx-runtime").JSX.Element;
11
12
  displayName: string;
12
13
  };
13
14
  export { HeaderCell };
@@ -17,7 +17,7 @@ export interface TextProps extends DOMProps, RefAttributes<TextElementType> {
17
17
  style?: React.CSSProperties;
18
18
  }
19
19
  declare const Text: {
20
- ({ ref, elementType: Component, ...props }: TextProps): import("react/jsx-runtime").JSX.Element;
20
+ ({ ref, elementType, ...props }: TextProps): import("react/jsx-runtime").JSX.Element;
21
21
  displayName: string;
22
22
  };
23
23
  export { Text };
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Drops `undefined`, `null`, and empty string entries.
3
+ * Use when merging style objects so “unset” values from `style` do not override
4
+ * computed values from component props.
5
+ */
6
+ export declare const filterUnsetValues: (props: Record<string, unknown>) => Record<string, unknown>;
@@ -2,6 +2,7 @@ export * from "./changeCSS";
2
2
  export * from "./delay";
3
3
  export * from "./excludeControls";
4
4
  export * from "./filterUndefinedProps";
5
+ export * from "./filterUnsetValues";
5
6
  export * from "./getSpacingValue";
6
7
  export * from "./mergeRefs";
7
8
  export * from "./polyfill-tests";
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@simplybusiness/mobius",
3
3
  "license": "UNLICENSED",
4
- "version": "10.2.0",
4
+ "version": "10.3.0",
5
5
  "description": "Core library of Mobius react components",
6
6
  "repository": {
7
7
  "type": "git",
@@ -68,8 +68,8 @@
68
68
  "@eslint/js": "^9.39.3",
69
69
  "@react-types/progress": "^3.5.18",
70
70
  "@simplybusiness/build-scripts": "^3.0.0",
71
- "@simplybusiness/eslint-config": "^2.0.4",
72
- "@simplybusiness/eslint-plugin": "^1.3.0",
71
+ "@simplybusiness/eslint-config": "^2.0.5",
72
+ "@simplybusiness/eslint-plugin": "^1.3.1",
73
73
  "@testing-library/dom": "^10.4.1",
74
74
  "@testing-library/jest-dom": "6.9.1",
75
75
  "@testing-library/react": "^16.3.2",
@@ -98,7 +98,7 @@
98
98
  "dependencies": {
99
99
  "@floating-ui/react": "^0.27.19",
100
100
  "@loadable/component": "^5.16.7",
101
- "@simplybusiness/icons": "^5.0.3",
101
+ "@simplybusiness/icons": "^5.0.4",
102
102
  "@simplybusiness/mobius-hooks": "^0.1.1",
103
103
  "classnames": "^2.5.1",
104
104
  "dialog-polyfill": "^0.5.6",
@@ -1,3 +1,4 @@
1
+ import { createRef } from "react";
1
2
  import { fireEvent, render, screen } from "@testing-library/react";
2
3
  import userEvent from "@testing-library/user-event";
3
4
  import type { AccordionLinkElementType } from "./AccordionLink";
@@ -408,4 +409,10 @@ describe("Accordion", () => {
408
409
  expect(screen.queryByText(customShow)).not.toBeInTheDocument();
409
410
  });
410
411
  });
412
+
413
+ it("forwards ref", () => {
414
+ const ref = createRef<HTMLDivElement>();
415
+ render(<Accordion ref={ref}>Text</Accordion>);
416
+ expect(ref.current).toBeInstanceOf(HTMLDivElement);
417
+ });
411
418
  });
@@ -1,4 +1,6 @@
1
+ import { createRef } from "react";
1
2
  import { render } from "@testing-library/react";
3
+ import type { CSSProperties } from "react";
2
4
  import { Box } from ".";
3
5
 
4
6
  const CLASS_NAME = "mobius-box";
@@ -216,5 +218,27 @@ describe("Box", () => {
216
218
 
217
219
  expect(elementStyles.padding).toEqual("100px");
218
220
  });
221
+
222
+ it("does not remove prop padding when style padding is undefined", () => {
223
+ const { container } = render(
224
+ <Box padding={50} style={{ padding: undefined } as CSSProperties} />,
225
+ );
226
+
227
+ expect(container.firstChild).toHaveStyle({ padding: "50px" });
228
+ });
229
+
230
+ it("does not remove prop padding when style padding is an empty string", () => {
231
+ const { container } = render(
232
+ <Box padding={50} style={{ padding: "" }} />,
233
+ );
234
+
235
+ expect(container.firstChild).toHaveStyle({ padding: "50px" });
236
+ });
237
+ });
238
+
239
+ it("forwards ref", () => {
240
+ const ref = createRef<HTMLDivElement>();
241
+ render(<Box ref={ref}>Text</Box>);
242
+ expect(ref.current).toBeInstanceOf(HTMLDivElement);
219
243
  });
220
244
  });
@@ -1,6 +1,10 @@
1
1
  import classNames from "classnames/dedupe";
2
2
  import type { BoxProps } from "./types";
3
- import { getSpacingValue, filterUndefinedProps } from "../../utils";
3
+ import {
4
+ filterUndefinedProps,
5
+ filterUnsetValues,
6
+ getSpacingValue,
7
+ } from "../../utils";
4
8
  import "./Box.css";
5
9
 
6
10
  const Box = ({ ref, ...props }: BoxProps) => {
@@ -31,7 +35,7 @@ const Box = ({ ref, ...props }: BoxProps) => {
31
35
 
32
36
  const classes = classNames("mobius", "mobius-box", otherProps.className);
33
37
 
34
- const styleProps = filterUndefinedProps({
38
+ const fromProps = filterUndefinedProps({
35
39
  padding: getSpacingValue(padding),
36
40
  paddingInline: getSpacingValue(paddingInline || paddingX),
37
41
  paddingBlock: getSpacingValue(paddingBlock || paddingY),
@@ -45,7 +49,11 @@ const Box = ({ ref, ...props }: BoxProps) => {
45
49
  maxHeight,
46
50
  width,
47
51
  height,
48
- ...style,
52
+ });
53
+
54
+ const styleProps = filterUndefinedProps({
55
+ ...fromProps,
56
+ ...(style ? filterUnsetValues(style as Record<string, unknown>) : {}),
49
57
  });
50
58
 
51
59
  return (
@@ -1,3 +1,4 @@
1
+ import { createRef } from "react";
1
2
  import { render, screen } from "@testing-library/react";
2
3
  import { Breadcrumbs, BreadcrumbItem } from ".";
3
4
  import { Link } from "../Link";
@@ -93,4 +94,133 @@ describe("Breadcrumbs", () => {
93
94
  );
94
95
  });
95
96
  });
97
+
98
+ describe("semantic HTML and ARIA", () => {
99
+ it("renders a <nav> element with aria-label", () => {
100
+ render(
101
+ <Breadcrumbs data-testid="nav">
102
+ <BreadcrumbItem>Home</BreadcrumbItem>
103
+ <BreadcrumbItem>Current</BreadcrumbItem>
104
+ </Breadcrumbs>,
105
+ );
106
+ const nav = screen.getByTestId("nav");
107
+ expect(nav.nodeName).toBe("NAV");
108
+ expect(nav).toHaveAttribute("aria-label", "Breadcrumbs");
109
+ });
110
+
111
+ it("supports custom aria-label on the nav element", () => {
112
+ render(
113
+ <Breadcrumbs data-testid="nav" aria-label="Page navigation">
114
+ <BreadcrumbItem>Home</BreadcrumbItem>
115
+ <BreadcrumbItem>Current</BreadcrumbItem>
116
+ </Breadcrumbs>,
117
+ );
118
+ expect(screen.getByTestId("nav")).toHaveAttribute(
119
+ "aria-label",
120
+ "Page navigation",
121
+ );
122
+ });
123
+
124
+ it("contains a <ul> list inside the nav", () => {
125
+ render(
126
+ <Breadcrumbs data-testid="nav">
127
+ <BreadcrumbItem>Home</BreadcrumbItem>
128
+ <BreadcrumbItem>Current</BreadcrumbItem>
129
+ </Breadcrumbs>,
130
+ );
131
+ expect(screen.getByRole("list")).toBeInTheDocument();
132
+ });
133
+
134
+ it("renders each BreadcrumbItem as a <li>", () => {
135
+ render(
136
+ <Breadcrumbs>
137
+ <BreadcrumbItem>Home</BreadcrumbItem>
138
+ <BreadcrumbItem>About</BreadcrumbItem>
139
+ <BreadcrumbItem>Current</BreadcrumbItem>
140
+ </Breadcrumbs>,
141
+ );
142
+ expect(screen.getAllByRole("listitem")).toHaveLength(3);
143
+ });
144
+
145
+ it("sets aria-current on the last (current) item", () => {
146
+ render(
147
+ <Breadcrumbs>
148
+ <BreadcrumbItem>
149
+ <Link href="/home">Home</Link>
150
+ </BreadcrumbItem>
151
+ <BreadcrumbItem>Current page</BreadcrumbItem>
152
+ </Breadcrumbs>,
153
+ );
154
+ // The last item gets isCurrent=true automatically, which sets aria-current="page"
155
+ const currentItem = screen.getByText("Current page");
156
+ expect(currentItem).toHaveAttribute("aria-current", "page");
157
+ });
158
+
159
+ it("does not set aria-current on non-current items", () => {
160
+ render(
161
+ <Breadcrumbs>
162
+ <BreadcrumbItem>
163
+ <Link href="/home" data-testid="home-link">
164
+ Home
165
+ </Link>
166
+ </BreadcrumbItem>
167
+ <BreadcrumbItem>Current page</BreadcrumbItem>
168
+ </Breadcrumbs>,
169
+ );
170
+ expect(screen.getByTestId("home-link")).not.toHaveAttribute(
171
+ "aria-current",
172
+ );
173
+ });
174
+
175
+ it("sets aria-disabled on a disabled item", () => {
176
+ render(
177
+ <Breadcrumbs>
178
+ <BreadcrumbItem isDisabled>Disabled item</BreadcrumbItem>
179
+ <BreadcrumbItem>Current</BreadcrumbItem>
180
+ </Breadcrumbs>,
181
+ );
182
+ expect(screen.getByText("Disabled item")).toHaveAttribute(
183
+ "aria-disabled",
184
+ "true",
185
+ );
186
+ });
187
+
188
+ it("sets aria-disabled on the current (last) item", () => {
189
+ render(
190
+ <Breadcrumbs>
191
+ <BreadcrumbItem>
192
+ <Link href="/home">Home</Link>
193
+ </BreadcrumbItem>
194
+ <BreadcrumbItem>Current page</BreadcrumbItem>
195
+ </Breadcrumbs>,
196
+ );
197
+ // isCurrent=true causes aria-disabled to be true (current page is not navigable)
198
+ expect(screen.getByText("Current page")).toHaveAttribute(
199
+ "aria-disabled",
200
+ "true",
201
+ );
202
+ });
203
+
204
+ it("hides the separator from assistive technology", () => {
205
+ render(
206
+ <Breadcrumbs>
207
+ <BreadcrumbItem>
208
+ <Link href="/home">Home</Link>
209
+ </BreadcrumbItem>
210
+ <BreadcrumbItem>Current</BreadcrumbItem>
211
+ </Breadcrumbs>,
212
+ );
213
+ expect(screen.getByText(">")).toHaveAttribute("aria-hidden", "true");
214
+ });
215
+ });
216
+
217
+ it("forwards ref", () => {
218
+ const ref = createRef<HTMLUListElement>();
219
+ render(
220
+ <Breadcrumbs ref={ref}>
221
+ <BreadcrumbItem>Home</BreadcrumbItem>
222
+ </Breadcrumbs>,
223
+ );
224
+ expect(ref.current).toBeInstanceOf(HTMLElement);
225
+ });
96
226
  });
@@ -5,7 +5,7 @@ import { Children, cloneElement } from "react";
5
5
  import classNames from "classnames/dedupe";
6
6
  import "./Breadcrumbs.css";
7
7
 
8
- export type BreadcrumbsElementType = HTMLUListElement;
8
+ export type BreadcrumbsElementType = HTMLElement;
9
9
 
10
10
  export interface BreadcrumbsProps extends RefAttributes<BreadcrumbsElementType> {
11
11
  /** Custom class name for setting specific CSS */
@@ -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 { chevronDown } from "@simplybusiness/icons";
@@ -74,6 +75,61 @@ describe("Button", () => {
74
75
  });
75
76
  });
76
77
 
78
+ describe("keyboard interactions", () => {
79
+ it("activates on Enter key", async () => {
80
+ const onPress = vi.fn();
81
+ render(<Button onPress={onPress}>Click</Button>);
82
+ await userEvent.tab();
83
+ await userEvent.keyboard("[Enter]");
84
+ expect(onPress).toHaveBeenCalled();
85
+ });
86
+
87
+ it("activates on Space key", async () => {
88
+ const onPress = vi.fn();
89
+ render(<Button onPress={onPress}>Click</Button>);
90
+ await userEvent.tab();
91
+ await userEvent.keyboard("[Space]");
92
+ expect(onPress).toHaveBeenCalled();
93
+ });
94
+ });
95
+
96
+ describe("when disabled", () => {
97
+ it("does not fire onPress", async () => {
98
+ const onPress = vi.fn();
99
+ render(
100
+ <Button onPress={onPress} isDisabled>
101
+ Click
102
+ </Button>,
103
+ );
104
+ await userEvent.click(screen.getByRole("button"));
105
+ expect(onPress).not.toHaveBeenCalled();
106
+ });
107
+
108
+ it("does not fire onClick", async () => {
109
+ const onClick = vi.fn();
110
+ render(
111
+ <Button onClick={onClick} isDisabled>
112
+ Click
113
+ </Button>,
114
+ );
115
+ await userEvent.click(screen.getByRole("button"));
116
+ expect(onClick).not.toHaveBeenCalled();
117
+ });
118
+
119
+ it("has aria-disabled attribute", () => {
120
+ render(<Button isDisabled>Click</Button>);
121
+ expect(screen.getByRole("button")).toHaveAttribute(
122
+ "aria-disabled",
123
+ "true",
124
+ );
125
+ });
126
+
127
+ it("is not focusable", () => {
128
+ render(<Button isDisabled>Click</Button>);
129
+ expect(screen.getByRole("button")).toHaveAttribute("tabIndex", "-1");
130
+ });
131
+ });
132
+
77
133
  describe("uses correct class names", () => {
78
134
  it("uses Mobius class", () => {
79
135
  render(<Button />);
@@ -106,5 +162,26 @@ describe("Button", () => {
106
162
 
107
163
  expect(button).toHaveClass("--variant-link");
108
164
  });
165
+
166
+ it.each(["sm", "md", "lg"] as const)("applies --size-%s class", size => {
167
+ render(<Button size={size} />);
168
+ expect(screen.getByRole("button")).toHaveClass(`--size-${size}`);
169
+ });
170
+
171
+ it("applies --is-loading class when isLoading is true", () => {
172
+ render(<Button isLoading>Loading</Button>);
173
+ expect(screen.getByRole("button")).toHaveClass("--is-loading");
174
+ });
175
+
176
+ it("applies --is-success class when isSuccess is true", () => {
177
+ render(<Button isSuccess>Done</Button>);
178
+ expect(screen.getByRole("button")).toHaveClass("--is-success");
179
+ });
180
+ });
181
+
182
+ it("forwards ref", () => {
183
+ const ref = createRef<HTMLButtonElement>();
184
+ render(<Button ref={ref}>Text</Button>);
185
+ expect(ref.current).toBeInstanceOf(HTMLButtonElement);
109
186
  });
110
187
  });
@@ -1,3 +1,4 @@
1
+ import { createRef } from "react";
1
2
  import { render, screen } from "@testing-library/react";
2
3
  import { Container } from ".";
3
4
 
@@ -51,5 +52,23 @@ describe("Container", () => {
51
52
  expect(screen.getByTestId("test")).toHaveClass("my-class");
52
53
  expect(screen.getByTestId("test")).toHaveClass(CLASS_NAME);
53
54
  });
55
+
56
+ it.each(["xxs", "xs", "sm", "md", "lg", "xl", "xxl"] as const)(
57
+ "applies --is-%s class",
58
+ size => {
59
+ render(
60
+ <Container size={size} data-testid="test">
61
+ Sample text
62
+ </Container>,
63
+ );
64
+ expect(screen.getByTestId("test")).toHaveClass(`--is-${size}`);
65
+ },
66
+ );
67
+ });
68
+
69
+ it("forwards ref", () => {
70
+ const ref = createRef<HTMLDivElement>();
71
+ render(<Container ref={ref}>Text</Container>);
72
+ expect(ref.current).toBeInstanceOf(HTMLDivElement);
54
73
  });
55
74
  });
@@ -30,4 +30,22 @@ describe("Divider", () => {
30
30
  expect(screen.getByRole("separator")).toHaveClass(CLASS_NAME);
31
31
  });
32
32
  });
33
+
34
+ describe("ARIA attributes", () => {
35
+ it("has aria-orientation='horizontal' by default", () => {
36
+ render(<Divider />);
37
+ expect(screen.getByRole("separator")).toHaveAttribute(
38
+ "aria-orientation",
39
+ "horizontal",
40
+ );
41
+ });
42
+
43
+ it("supports aria-orientation='vertical'", () => {
44
+ render(<Divider aria-orientation="vertical" />);
45
+ expect(screen.getByRole("separator")).toHaveAttribute(
46
+ "aria-orientation",
47
+ "vertical",
48
+ );
49
+ });
50
+ });
33
51
  });
@@ -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";