@utilitywarehouse/hearth-react-native 0.1.0 → 0.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 (658) hide show
  1. package/.storybook/preview.tsx +5 -0
  2. package/.storybook/prism-setup.ts +104 -0
  3. package/.turbo/turbo-build.log +1 -1
  4. package/.turbo/turbo-lint.log +1 -1
  5. package/CHANGELOG.md +42 -0
  6. package/build/components/Accordion/Accordion.d.ts +1 -1
  7. package/build/components/Accordion/Accordion.js +7 -7
  8. package/build/components/Accordion/Accordion.props.d.ts +2 -2
  9. package/build/components/Accordion/AccordionIcon.js +2 -2
  10. package/build/components/Accordion/AccordionItemRoot.js +2 -2
  11. package/build/components/Accordion/AccordionTrigger.js +4 -4
  12. package/build/components/Accordion/index.d.ts +1 -2
  13. package/build/components/Accordion/index.js +1 -2
  14. package/build/components/Alert/Alert.js +21 -21
  15. package/build/components/Alert/Alert.props.d.ts +3 -3
  16. package/build/components/Alert/AlertCloseButton.js +2 -2
  17. package/build/components/Alert/AlertIcon.js +5 -5
  18. package/build/components/Badge/Badge.context.d.ts +4 -0
  19. package/build/components/Badge/Badge.js +179 -33
  20. package/build/components/Badge/Badge.props.d.ts +3 -2
  21. package/build/components/Badge/BadgeIcon.js +29 -19
  22. package/build/components/Badge/BadgeText.js +30 -19
  23. package/build/components/BodyText/BodyText.js +2 -2
  24. package/build/components/BottomSheet/BottomSheet.d.ts +1 -1
  25. package/build/components/BottomSheet/BottomSheet.js +3 -3
  26. package/build/components/BottomSheet/BottomSheetHandle.js +1 -1
  27. package/build/components/BottomSheet/BottomSheetModal.js +1 -1
  28. package/build/components/BottomSheet/BottomSheetScrollView.js +3 -1
  29. package/build/components/BottomSheet/BottomSheetView.js +1 -1
  30. package/build/components/Button/Button.d.ts +2 -2
  31. package/build/components/Button/Button.props.d.ts +7 -7
  32. package/build/components/Button/ButtonGroupRoot.d.ts +3 -2
  33. package/build/components/Button/ButtonGroupRoot.js +9 -0
  34. package/build/components/Button/ButtonIcon.js +29 -29
  35. package/build/components/Button/ButtonRoot.js +79 -88
  36. package/build/components/Button/ButtonSpinner.js +28 -31
  37. package/build/components/Button/ButtonText.js +40 -26
  38. package/build/components/Card/Card.props.d.ts +3 -3
  39. package/build/components/Card/CardRoot.js +56 -56
  40. package/build/components/Checkbox/CheckboxIcon.js +3 -3
  41. package/build/components/Checkbox/CheckboxIndicator.js +3 -3
  42. package/build/components/Checkbox/CheckboxTileRoot.js +3 -3
  43. package/build/components/CurrencyInput/CurrencyInput.d.ts +6 -0
  44. package/build/components/CurrencyInput/CurrencyInput.js +47 -0
  45. package/build/components/CurrencyInput/CurrencyInput.props.d.ts +14 -0
  46. package/build/components/CurrencyInput/index.d.ts +1 -0
  47. package/build/components/CurrencyInput/index.js +1 -0
  48. package/build/components/DescriptionList/DescriptionList.context.d.ts +6 -0
  49. package/build/components/DescriptionList/DescriptionList.context.js +9 -0
  50. package/build/components/DescriptionList/DescriptionList.d.ts +6 -0
  51. package/build/components/DescriptionList/DescriptionList.js +25 -0
  52. package/build/components/DescriptionList/DescriptionList.props.d.ts +18 -0
  53. package/build/components/DescriptionList/DescriptionListItem.d.ts +6 -0
  54. package/build/components/DescriptionList/DescriptionListItem.js +49 -0
  55. package/build/components/DescriptionList/DescriptionListItem.props.d.ts +17 -0
  56. package/build/components/DescriptionList/DescriptionListItem.props.js +1 -0
  57. package/build/components/DescriptionList/index.d.ts +4 -0
  58. package/build/components/DescriptionList/index.js +2 -0
  59. package/build/components/DetailText/DetailText.js +2 -2
  60. package/build/components/Divider/Divider.js +47 -1
  61. package/build/components/Divider/Divider.props.d.ts +2 -2
  62. package/build/components/Flex/Flex.props.d.ts +3 -2
  63. package/build/components/Grid/Grid.props.d.ts +2 -2
  64. package/build/components/Heading/Heading.js +2 -2
  65. package/build/components/Heading/Heading.props.d.ts +3 -1
  66. package/build/components/Helper/HelperIcon.js +3 -3
  67. package/build/components/Helper/HelperText.js +4 -4
  68. package/build/components/IconButton/IconButtonIcon.js +29 -29
  69. package/build/components/IconButton/IconButtonRoot.js +94 -88
  70. package/build/components/IconButton/IconButtonSpinner.js +27 -30
  71. package/build/components/IconContainer/IconContainer.d.ts +5 -0
  72. package/build/components/IconContainer/IconContainer.js +161 -0
  73. package/build/components/IconContainer/IconContainer.props.d.ts +15 -0
  74. package/build/components/IconContainer/IconContainer.props.js +1 -0
  75. package/build/components/IconContainer/index.d.ts +2 -0
  76. package/build/components/IconContainer/index.js +1 -0
  77. package/build/components/Icons/CircleIcon.js +3 -3
  78. package/build/components/InlineLink/InlineLinkRoot.js +2 -2
  79. package/build/components/Input/Input.d.ts +9 -3
  80. package/build/components/Input/Input.js +11 -43
  81. package/build/components/Input/Input.props.d.ts +2 -17
  82. package/build/components/Input/InputField.d.ts +3 -1
  83. package/build/components/Input/InputField.js +9 -46
  84. package/build/components/Input/InputIcon.js +1 -1
  85. package/build/components/Input/InputRoot.js +9 -9
  86. package/build/components/Label/Label.js +1 -1
  87. package/build/components/Link/LinkRoot.js +2 -2
  88. package/build/components/List/List.d.ts +1 -1
  89. package/build/components/List/List.js +6 -4
  90. package/build/components/List/List.props.d.ts +9 -10
  91. package/build/components/List/ListItem/ListItemHelperText.js +1 -1
  92. package/build/components/List/ListItem/ListItemIcon.js +1 -1
  93. package/build/components/List/ListItem/ListItemRoot.js +15 -6
  94. package/build/components/List/ListItem/ListItemTrailingIcon.js +1 -1
  95. package/build/components/List/index.d.ts +0 -1
  96. package/build/components/List/index.js +0 -1
  97. package/build/components/Modal/Modal.d.ts +7 -0
  98. package/build/components/Modal/Modal.js +180 -0
  99. package/build/components/Modal/Modal.props.d.ts +24 -0
  100. package/build/components/Modal/Modal.props.js +1 -0
  101. package/build/components/Modal/Modal.web.d.ts +7 -0
  102. package/build/components/Modal/Modal.web.js +164 -0
  103. package/build/components/Modal/index.d.ts +2 -0
  104. package/build/components/Modal/index.js +1 -0
  105. package/build/components/Radio/RadioIndicator.js +2 -2
  106. package/build/components/Radio/RadioTileRoot.js +3 -3
  107. package/build/components/RadioCard/RadioCardIndicator.js +2 -2
  108. package/build/components/RadioCard/RadioCardRoot.js +3 -3
  109. package/build/components/SectionHeader/SectionHeader.d.ts +6 -0
  110. package/build/components/SectionHeader/SectionHeader.js +20 -0
  111. package/build/components/{List/ListHeading/ListHeading.props.d.ts → SectionHeader/SectionHeader.props.d.ts} +7 -9
  112. package/build/components/SectionHeader/SectionHeader.props.js +1 -0
  113. package/build/components/SectionHeader/SectionHeaderHeading.d.ts +6 -0
  114. package/build/components/SectionHeader/SectionHeaderHeading.js +7 -0
  115. package/build/components/SectionHeader/SectionHeaderHelperText.d.ts +6 -0
  116. package/build/components/{List/ListHeading/ListHeadingHelperText.js → SectionHeader/SectionHeaderHelperText.js} +5 -5
  117. package/build/components/{List/ListHeading/ListHeadingTextContent.d.ts → SectionHeader/SectionHeaderTextContent.d.ts} +2 -2
  118. package/build/components/{List/ListHeading/ListHeadingTextContent.js → SectionHeader/SectionHeaderTextContent.js} +4 -4
  119. package/build/components/SectionHeader/index.d.ts +4 -0
  120. package/build/components/SectionHeader/index.js +4 -0
  121. package/build/components/Select/Select.js +10 -10
  122. package/build/components/Select/SelectOption.js +6 -6
  123. package/build/components/Spinner/Spinner.web.js +3 -3
  124. package/build/components/Switch/Switch.js +10 -7
  125. package/build/components/Switch/Switch.web.js +10 -8
  126. package/build/components/Tabs/Tab.d.ts +18 -0
  127. package/build/components/Tabs/Tab.js +74 -0
  128. package/build/components/Tabs/Tab.props.d.ts +14 -0
  129. package/build/components/Tabs/Tab.props.js +1 -0
  130. package/build/components/Tabs/TabPanel.d.ts +3 -0
  131. package/build/components/Tabs/TabPanel.js +34 -0
  132. package/build/components/Tabs/TabPanel.props.d.ts +8 -0
  133. package/build/components/Tabs/TabPanel.props.js +1 -0
  134. package/build/components/Tabs/Tabs.context.d.ts +23 -0
  135. package/build/components/Tabs/Tabs.context.js +8 -0
  136. package/build/components/Tabs/Tabs.d.ts +6 -0
  137. package/build/components/Tabs/Tabs.js +114 -0
  138. package/build/components/Tabs/Tabs.props.d.ts +19 -0
  139. package/build/components/Tabs/Tabs.props.js +1 -0
  140. package/build/components/Tabs/TabsList.d.ts +6 -0
  141. package/build/components/Tabs/TabsList.js +112 -0
  142. package/build/components/Tabs/TabsList.props.d.ts +6 -0
  143. package/build/components/Tabs/TabsList.props.js +1 -0
  144. package/build/components/Tabs/index.d.ts +8 -0
  145. package/build/components/Tabs/index.js +4 -0
  146. package/build/components/Textarea/TextareaField.js +5 -5
  147. package/build/components/Textarea/TextareaRoot.js +9 -9
  148. package/build/components/ToggleButton/ToggleButtonIcon.js +3 -3
  149. package/build/components/ToggleButton/ToggleButtonRoot.js +9 -9
  150. package/build/components/ToggleButton/ToggleButtonText.js +2 -2
  151. package/build/components/ToggleButtonCard/ToggleButtonCardRoot.js +3 -3
  152. package/build/components/index.d.ts +9 -3
  153. package/build/components/index.js +9 -3
  154. package/build/core/themes.d.ts +1442 -258
  155. package/build/core/themes.js +59 -3
  156. package/build/tokens/color.d.ts +1010 -86
  157. package/build/tokens/color.js +505 -43
  158. package/build/tokens/components/dark/accordion.d.ts +0 -2
  159. package/build/tokens/components/dark/accordion.js +0 -2
  160. package/build/tokens/components/dark/alert.d.ts +0 -16
  161. package/build/tokens/components/dark/alert.js +0 -16
  162. package/build/tokens/components/dark/avatar.d.ts +19 -0
  163. package/build/tokens/components/dark/avatar.js +18 -0
  164. package/build/tokens/components/dark/badge.d.ts +7 -34
  165. package/build/tokens/components/dark/badge.js +7 -34
  166. package/build/tokens/components/dark/banner.d.ts +1 -10
  167. package/build/tokens/components/dark/banner.js +1 -10
  168. package/build/tokens/components/dark/bottom-navigation.d.ts +2 -7
  169. package/build/tokens/components/dark/bottom-navigation.js +2 -7
  170. package/build/tokens/components/dark/bottom-sheet.d.ts +1 -2
  171. package/build/tokens/components/dark/bottom-sheet.js +1 -2
  172. package/build/tokens/components/dark/breadcrumb.d.ts +0 -1
  173. package/build/tokens/components/dark/breadcrumb.js +0 -1
  174. package/build/tokens/components/dark/button.d.ts +1 -86
  175. package/build/tokens/components/dark/button.js +1 -86
  176. package/build/tokens/components/dark/card.d.ts +0 -28
  177. package/build/tokens/components/dark/card.js +0 -28
  178. package/build/tokens/components/dark/carousel-control.d.ts +0 -8
  179. package/build/tokens/components/dark/carousel-control.js +0 -8
  180. package/build/tokens/components/dark/checkbox.d.ts +2 -11
  181. package/build/tokens/components/dark/checkbox.js +2 -11
  182. package/build/tokens/components/dark/date-picker.d.ts +0 -12
  183. package/build/tokens/components/dark/date-picker.js +0 -12
  184. package/build/tokens/components/dark/description-list.d.ts +20 -0
  185. package/build/tokens/components/dark/description-list.js +19 -0
  186. package/build/tokens/components/dark/dialog.d.ts +0 -1
  187. package/build/tokens/components/dark/dialog.js +0 -1
  188. package/build/tokens/components/dark/divider.d.ts +4 -1
  189. package/build/tokens/components/dark/divider.js +4 -1
  190. package/build/tokens/components/dark/expandable-card.d.ts +11 -0
  191. package/build/tokens/components/dark/expandable-card.js +10 -0
  192. package/build/tokens/components/dark/icon-button.d.ts +5 -5
  193. package/build/tokens/components/dark/icon-button.js +5 -5
  194. package/build/tokens/components/dark/icon-container.d.ts +0 -17
  195. package/build/tokens/components/dark/icon-container.js +0 -17
  196. package/build/tokens/components/dark/index.d.ts +10 -4
  197. package/build/tokens/components/dark/index.js +10 -4
  198. package/build/tokens/components/dark/indicator-icon-button.d.ts +11 -0
  199. package/build/tokens/components/dark/indicator-icon-button.js +10 -0
  200. package/build/tokens/components/dark/inline-link.d.ts +1 -1
  201. package/build/tokens/components/dark/inline-link.js +1 -1
  202. package/build/tokens/components/dark/input.d.ts +1 -9
  203. package/build/tokens/components/dark/input.js +1 -9
  204. package/build/tokens/components/dark/link.d.ts +2 -2
  205. package/build/tokens/components/dark/link.js +2 -2
  206. package/build/tokens/components/dark/list.d.ts +20 -20
  207. package/build/tokens/components/dark/list.js +20 -20
  208. package/build/tokens/components/dark/menu.d.ts +0 -12
  209. package/build/tokens/components/dark/menu.js +0 -12
  210. package/build/tokens/components/dark/modal.d.ts +0 -1
  211. package/build/tokens/components/dark/modal.js +0 -1
  212. package/build/tokens/components/dark/navigation.d.ts +1 -6
  213. package/build/tokens/components/dark/navigation.js +1 -6
  214. package/build/tokens/components/dark/pagination.d.ts +12 -0
  215. package/build/tokens/components/dark/pagination.js +11 -0
  216. package/build/tokens/components/dark/parts.d.ts +14 -4
  217. package/build/tokens/components/dark/parts.js +14 -4
  218. package/build/tokens/components/dark/pill.d.ts +0 -10
  219. package/build/tokens/components/dark/pill.js +0 -10
  220. package/build/tokens/components/dark/progress-stepper.d.ts +0 -8
  221. package/build/tokens/components/dark/progress-stepper.js +0 -8
  222. package/build/tokens/components/dark/radio.d.ts +2 -9
  223. package/build/tokens/components/dark/radio.js +2 -9
  224. package/build/tokens/components/dark/{focus.d.ts → section-header.d.ts} +4 -2
  225. package/build/tokens/components/dark/{focus.js → section-header.js} +4 -2
  226. package/build/tokens/components/dark/segmented-control.d.ts +0 -8
  227. package/build/tokens/components/dark/segmented-control.js +0 -8
  228. package/build/tokens/components/dark/select.d.ts +0 -10
  229. package/build/tokens/components/dark/select.js +0 -10
  230. package/build/tokens/components/dark/spinner.d.ts +1 -1
  231. package/build/tokens/components/dark/spinner.js +1 -1
  232. package/build/tokens/components/dark/switch.d.ts +1 -11
  233. package/build/tokens/components/dark/switch.js +1 -11
  234. package/build/tokens/components/dark/table.d.ts +23 -0
  235. package/build/tokens/components/dark/table.js +22 -0
  236. package/build/tokens/components/dark/tabs.d.ts +26 -0
  237. package/build/tokens/components/dark/tabs.js +25 -0
  238. package/build/tokens/components/dark/toast.d.ts +10 -0
  239. package/build/tokens/components/dark/toast.js +9 -0
  240. package/build/tokens/components/dark/toggle-button.d.ts +0 -11
  241. package/build/tokens/components/dark/toggle-button.js +0 -11
  242. package/build/tokens/components/dark/tooltip.d.ts +12 -0
  243. package/build/tokens/components/dark/tooltip.js +11 -0
  244. package/build/tokens/components/dark/top-navigation.d.ts +0 -8
  245. package/build/tokens/components/dark/top-navigation.js +0 -8
  246. package/build/tokens/components/light/accordion.d.ts +0 -2
  247. package/build/tokens/components/light/accordion.js +0 -2
  248. package/build/tokens/components/light/alert.d.ts +0 -16
  249. package/build/tokens/components/light/alert.js +0 -16
  250. package/build/tokens/components/light/avatar.d.ts +19 -0
  251. package/build/tokens/components/light/avatar.js +18 -0
  252. package/build/tokens/components/light/badge.d.ts +7 -34
  253. package/build/tokens/components/light/badge.js +7 -34
  254. package/build/tokens/components/light/banner.d.ts +2 -11
  255. package/build/tokens/components/light/banner.js +2 -11
  256. package/build/tokens/components/light/bottom-navigation.d.ts +0 -5
  257. package/build/tokens/components/light/bottom-navigation.js +0 -5
  258. package/build/tokens/components/light/bottom-sheet.d.ts +1 -2
  259. package/build/tokens/components/light/bottom-sheet.js +1 -2
  260. package/build/tokens/components/light/breadcrumb.d.ts +0 -1
  261. package/build/tokens/components/light/breadcrumb.js +0 -1
  262. package/build/tokens/components/light/button.d.ts +1 -86
  263. package/build/tokens/components/light/button.js +1 -86
  264. package/build/tokens/components/light/card.d.ts +0 -28
  265. package/build/tokens/components/light/card.js +0 -28
  266. package/build/tokens/components/light/carousel-control.d.ts +0 -8
  267. package/build/tokens/components/light/carousel-control.js +0 -8
  268. package/build/tokens/components/light/checkbox.d.ts +3 -12
  269. package/build/tokens/components/light/checkbox.js +3 -12
  270. package/build/tokens/components/light/date-picker.d.ts +0 -12
  271. package/build/tokens/components/light/date-picker.js +0 -12
  272. package/build/tokens/components/light/description-list.d.ts +20 -0
  273. package/build/tokens/components/light/description-list.js +19 -0
  274. package/build/tokens/components/light/dialog.d.ts +0 -1
  275. package/build/tokens/components/light/dialog.js +0 -1
  276. package/build/tokens/components/light/divider.d.ts +4 -1
  277. package/build/tokens/components/light/divider.js +4 -1
  278. package/build/tokens/components/light/expandable-card.d.ts +11 -0
  279. package/build/tokens/components/light/expandable-card.js +10 -0
  280. package/build/tokens/components/light/icon-button.d.ts +5 -5
  281. package/build/tokens/components/light/icon-button.js +5 -5
  282. package/build/tokens/components/light/icon-container.d.ts +0 -17
  283. package/build/tokens/components/light/icon-container.js +0 -17
  284. package/build/tokens/components/light/index.d.ts +10 -4
  285. package/build/tokens/components/light/index.js +10 -4
  286. package/build/tokens/components/light/indicator-icon-button.d.ts +11 -0
  287. package/build/tokens/components/light/indicator-icon-button.js +10 -0
  288. package/build/tokens/components/light/input.d.ts +1 -9
  289. package/build/tokens/components/light/input.js +1 -9
  290. package/build/tokens/components/light/link.d.ts +2 -2
  291. package/build/tokens/components/light/link.js +2 -2
  292. package/build/tokens/components/light/list.d.ts +20 -20
  293. package/build/tokens/components/light/list.js +20 -20
  294. package/build/tokens/components/light/menu.d.ts +0 -12
  295. package/build/tokens/components/light/menu.js +0 -12
  296. package/build/tokens/components/light/modal.d.ts +0 -1
  297. package/build/tokens/components/light/modal.js +0 -1
  298. package/build/tokens/components/light/navigation.d.ts +1 -6
  299. package/build/tokens/components/light/navigation.js +1 -6
  300. package/build/tokens/components/light/pagination.d.ts +12 -0
  301. package/build/tokens/components/light/pagination.js +11 -0
  302. package/build/tokens/components/light/parts.d.ts +11 -1
  303. package/build/tokens/components/light/parts.js +11 -1
  304. package/build/tokens/components/light/pill.d.ts +0 -10
  305. package/build/tokens/components/light/pill.js +0 -10
  306. package/build/tokens/components/light/progress-stepper.d.ts +0 -8
  307. package/build/tokens/components/light/progress-stepper.js +0 -8
  308. package/build/tokens/components/light/radio.d.ts +3 -10
  309. package/build/tokens/components/light/radio.js +3 -10
  310. package/build/tokens/components/light/section-header.d.ts +10 -0
  311. package/build/tokens/components/light/section-header.js +9 -0
  312. package/build/tokens/components/light/segmented-control.d.ts +0 -8
  313. package/build/tokens/components/light/segmented-control.js +0 -8
  314. package/build/tokens/components/light/select.d.ts +0 -10
  315. package/build/tokens/components/light/select.js +0 -10
  316. package/build/tokens/components/light/switch.d.ts +1 -11
  317. package/build/tokens/components/light/switch.js +1 -11
  318. package/build/tokens/components/light/table.d.ts +23 -0
  319. package/build/tokens/components/light/table.js +22 -0
  320. package/build/tokens/components/light/tabs.d.ts +26 -0
  321. package/build/tokens/components/light/tabs.js +25 -0
  322. package/build/tokens/components/light/toast.d.ts +10 -0
  323. package/build/tokens/components/light/toast.js +9 -0
  324. package/build/tokens/components/light/toggle-button.d.ts +0 -11
  325. package/build/tokens/components/light/toggle-button.js +0 -11
  326. package/build/tokens/components/light/tooltip.d.ts +12 -0
  327. package/build/tokens/components/light/tooltip.js +11 -0
  328. package/build/tokens/components/light/top-navigation.d.ts +0 -8
  329. package/build/tokens/components/light/top-navigation.js +0 -8
  330. package/build/tokens/index.d.ts +1 -0
  331. package/build/tokens/index.js +1 -0
  332. package/build/tokens/layout.d.ts +48 -30
  333. package/build/tokens/layout.js +24 -15
  334. package/build/tokens/semantic-dark.d.ts +242 -13
  335. package/build/tokens/semantic-dark.js +242 -13
  336. package/build/tokens/semantic-light.d.ts +242 -13
  337. package/build/tokens/semantic-light.js +242 -13
  338. package/build/tokens/{components/light/focus.d.ts → semantic.d.ts} +3 -2
  339. package/build/tokens/{components/light/focus.js → semantic.js} +3 -2
  340. package/build/types/values.d.ts +12 -7
  341. package/build/utils/coloursAsArray.d.ts +8 -0
  342. package/build/utils/coloursAsArray.js +37 -2
  343. package/build/utils/formatThousands.d.ts +2 -0
  344. package/build/utils/formatThousands.js +16 -0
  345. package/build/utils/getFlattenedColorValue.d.ts +3 -1
  346. package/build/utils/hexWithOpacity.d.ts +2 -0
  347. package/build/utils/hexWithOpacity.js +15 -0
  348. package/build/utils/index.d.ts +3 -1
  349. package/build/utils/index.js +3 -1
  350. package/build/utils/styleUtils.js +33 -1
  351. package/docs/assets/modal-android.mp4 +0 -0
  352. package/docs/assets/modal-ios.mp4 +0 -0
  353. package/docs/assets/pigs.png +0 -0
  354. package/docs/components/AllComponents.web.tsx +135 -9
  355. package/docs/components/BadgeList.tsx +8 -8
  356. package/docs/components/NextPrevPage.tsx +11 -3
  357. package/docs/components/UsageWrap.tsx +2 -2
  358. package/docs/components/ViewFigmaButton.tsx +3 -3
  359. package/docs/heplers/addReactNativePrefix.ts +8 -0
  360. package/docs/heplers/index.ts +1 -0
  361. package/docs/introduction.mdx +2 -2
  362. package/docs/llm-docs/unistyles-llms-full.txt +1 -1
  363. package/docs/theme-tokens.mdx +91 -26
  364. package/package.json +21 -19
  365. package/src/components/Accordion/Accordion.docs.mdx +25 -39
  366. package/src/components/Accordion/Accordion.props.ts +2 -2
  367. package/src/components/Accordion/Accordion.stories.tsx +10 -10
  368. package/src/components/Accordion/Accordion.tsx +14 -14
  369. package/src/components/Accordion/AccordionIcon.tsx +2 -2
  370. package/src/components/Accordion/AccordionItemRoot.tsx +3 -3
  371. package/src/components/Accordion/AccordionTrigger.tsx +4 -4
  372. package/src/components/Accordion/index.ts +3 -4
  373. package/src/components/Alert/Alert.docs.mdx +25 -25
  374. package/src/components/Alert/Alert.props.ts +3 -3
  375. package/src/components/Alert/Alert.stories.tsx +11 -11
  376. package/src/components/Alert/Alert.tsx +22 -22
  377. package/src/components/Alert/AlertCloseButton.tsx +3 -3
  378. package/src/components/Alert/AlertIcon.tsx +7 -7
  379. package/src/components/Badge/Badge.context.ts +2 -0
  380. package/src/components/Badge/Badge.docs.mdx +16 -15
  381. package/src/components/Badge/Badge.props.ts +15 -2
  382. package/src/components/Badge/Badge.stories.tsx +101 -54
  383. package/src/components/Badge/Badge.tsx +189 -35
  384. package/src/components/Badge/BadgeIcon.tsx +29 -19
  385. package/src/components/Badge/BadgeText.tsx +30 -19
  386. package/src/components/BodyText/BodyText.tsx +4 -4
  387. package/src/components/BottomSheet/BottomSheet.docs.mdx +23 -5
  388. package/src/components/BottomSheet/BottomSheet.stories.tsx +9 -9
  389. package/src/components/BottomSheet/BottomSheet.tsx +5 -5
  390. package/src/components/BottomSheet/BottomSheetHandle.tsx +1 -1
  391. package/src/components/BottomSheet/BottomSheetModal.tsx +1 -1
  392. package/src/components/BottomSheet/BottomSheetScrollView.tsx +4 -2
  393. package/src/components/BottomSheet/BottomSheetView.tsx +1 -1
  394. package/src/components/Box/Box.stories.tsx +3 -3
  395. package/src/components/Button/Button.docs.mdx +35 -35
  396. package/src/components/Button/Button.props.tsx +7 -7
  397. package/src/components/Button/Button.stories.tsx +16 -16
  398. package/src/components/Button/ButtonGroupRoot.tsx +12 -2
  399. package/src/components/Button/ButtonIcon.tsx +29 -29
  400. package/src/components/Button/ButtonRoot.tsx +79 -89
  401. package/src/components/Button/ButtonSpinner.tsx +30 -33
  402. package/src/components/Button/ButtonText.tsx +40 -26
  403. package/src/components/Card/Card.docs.mdx +22 -22
  404. package/src/components/Card/Card.props.ts +11 -11
  405. package/src/components/Card/Card.stories.tsx +34 -34
  406. package/src/components/Card/CardRoot.tsx +56 -56
  407. package/src/components/Checkbox/CheckboxIcon.tsx +4 -4
  408. package/src/components/Checkbox/CheckboxIndicator.tsx +3 -3
  409. package/src/components/Checkbox/CheckboxTileRoot.tsx +3 -3
  410. package/src/components/CurrencyInput/CurrencyInput.docs.mdx +120 -0
  411. package/src/components/CurrencyInput/CurrencyInput.props.ts +19 -0
  412. package/src/components/CurrencyInput/CurrencyInput.stories.tsx +116 -0
  413. package/src/components/CurrencyInput/CurrencyInput.tsx +91 -0
  414. package/src/components/CurrencyInput/index.ts +1 -0
  415. package/src/components/DescriptionList/DescriptionList.context.ts +18 -0
  416. package/src/components/DescriptionList/DescriptionList.docs.mdx +98 -0
  417. package/src/components/DescriptionList/DescriptionList.props.ts +20 -0
  418. package/src/components/DescriptionList/DescriptionList.stories.tsx +154 -0
  419. package/src/components/DescriptionList/DescriptionList.tsx +64 -0
  420. package/src/components/DescriptionList/DescriptionListItem.props.ts +19 -0
  421. package/src/components/DescriptionList/DescriptionListItem.tsx +101 -0
  422. package/src/components/DescriptionList/index.ts +4 -0
  423. package/src/components/DetailText/DetailText.tsx +3 -3
  424. package/src/components/Divider/Divider.props.ts +2 -2
  425. package/src/components/Divider/Divider.stories.tsx +3 -3
  426. package/src/components/Divider/Divider.tsx +47 -1
  427. package/src/components/Flex/Flex.docs.mdx +4 -4
  428. package/src/components/Flex/Flex.props.ts +3 -2
  429. package/src/components/Flex/Flex.stories.tsx +1 -1
  430. package/src/components/Grid/Grid.docs.mdx +12 -12
  431. package/src/components/Grid/Grid.props.ts +2 -2
  432. package/src/components/Grid/Grid.stories.tsx +2 -2
  433. package/src/components/Heading/Heading.props.ts +3 -1
  434. package/src/components/Heading/Heading.tsx +2 -2
  435. package/src/components/Helper/HelperIcon.tsx +3 -3
  436. package/src/components/Helper/HelperText.tsx +4 -4
  437. package/src/components/Icon/Icon.stories.tsx +2 -2
  438. package/src/components/IconButton/IconButton.docs.mdx +21 -16
  439. package/src/components/IconButton/IconButton.figma.tsx +1 -1
  440. package/src/components/IconButton/IconButton.stories.tsx +14 -14
  441. package/src/components/IconButton/IconButtonIcon.tsx +29 -29
  442. package/src/components/IconButton/IconButtonRoot.tsx +94 -88
  443. package/src/components/IconButton/IconButtonSpinner.tsx +27 -30
  444. package/src/components/IconContainer/IconContainer.docs.mdx +90 -0
  445. package/src/components/IconContainer/IconContainer.props.ts +17 -0
  446. package/src/components/IconContainer/IconContainer.stories.tsx +130 -0
  447. package/src/components/IconContainer/IconContainer.tsx +180 -0
  448. package/src/components/IconContainer/index.tsx +2 -0
  449. package/src/components/Icons/CircleIcon.tsx +9 -11
  450. package/src/components/InlineLink/InlineLinkRoot.tsx +2 -2
  451. package/src/components/Input/Input.docs.mdx +19 -17
  452. package/src/components/Input/Input.props.ts +1 -20
  453. package/src/components/Input/Input.stories.tsx +5 -10
  454. package/src/components/Input/Input.tsx +16 -61
  455. package/src/components/Input/InputField.tsx +25 -59
  456. package/src/components/Input/InputIcon.tsx +1 -1
  457. package/src/components/Input/InputRoot.tsx +10 -10
  458. package/src/components/Label/Label.tsx +2 -2
  459. package/src/components/Link/LinkRoot.tsx +2 -2
  460. package/src/components/List/List.docs.mdx +35 -56
  461. package/src/components/List/List.props.ts +9 -10
  462. package/src/components/List/List.stories.tsx +8 -8
  463. package/src/components/List/List.tsx +25 -25
  464. package/src/components/List/ListItem/ListItemHelperText.tsx +1 -1
  465. package/src/components/List/ListItem/ListItemIcon.tsx +1 -1
  466. package/src/components/List/ListItem/ListItemRoot.tsx +15 -6
  467. package/src/components/List/ListItem/ListItemTrailingIcon.tsx +1 -1
  468. package/src/components/List/index.ts +0 -1
  469. package/src/components/Modal/Modal.docs.mdx +547 -0
  470. package/src/components/Modal/Modal.props.ts +26 -0
  471. package/src/components/Modal/Modal.stories.tsx +222 -0
  472. package/src/components/Modal/Modal.tsx +351 -0
  473. package/src/components/Modal/Modal.web.tsx +333 -0
  474. package/src/components/Modal/index.ts +2 -0
  475. package/src/components/Radio/RadioIndicator.tsx +2 -2
  476. package/src/components/Radio/RadioTileRoot.tsx +3 -3
  477. package/src/components/RadioCard/RadioCardIndicator.tsx +2 -2
  478. package/src/components/RadioCard/RadioCardRoot.tsx +3 -3
  479. package/src/components/{List/ListHeading/ListHeading.figma.tsx → SectionHeader/SectionHeader.figma.tsx} +3 -3
  480. package/src/components/{List/ListHeading/ListHeading.props.ts → SectionHeader/SectionHeader.props.ts} +7 -9
  481. package/src/components/SectionHeader/SectionHeader.stories.tsx +76 -0
  482. package/src/components/{List/ListHeading/ListHeading.tsx → SectionHeader/SectionHeader.tsx} +17 -19
  483. package/src/components/SectionHeader/SectionHeaderHeading.tsx +14 -0
  484. package/src/components/SectionHeader/SectionHeaderHelperText.tsx +21 -0
  485. package/src/components/{List/ListHeading/ListHeadingTextContent.tsx → SectionHeader/SectionHeaderTextContent.tsx} +4 -4
  486. package/src/components/SectionHeader/Sectionheader.docs.mdx +83 -0
  487. package/src/components/SectionHeader/index.ts +4 -0
  488. package/src/components/Select/Select.tsx +10 -10
  489. package/src/components/Select/SelectOption.tsx +7 -7
  490. package/src/components/Spinner/Spinner.tsx +3 -3
  491. package/src/components/Spinner/Spinner.web.tsx +12 -12
  492. package/src/components/Switch/Switch.tsx +10 -7
  493. package/src/components/Switch/Switch.web.tsx +10 -12
  494. package/src/components/Tabs/Tab.props.ts +16 -0
  495. package/src/components/Tabs/Tab.tsx +113 -0
  496. package/src/components/Tabs/TabPanel.props.ts +10 -0
  497. package/src/components/Tabs/TabPanel.tsx +46 -0
  498. package/src/components/Tabs/Tabs.context.ts +26 -0
  499. package/src/components/Tabs/Tabs.docs.mdx +214 -0
  500. package/src/components/Tabs/Tabs.props.ts +21 -0
  501. package/src/components/Tabs/Tabs.stories.tsx +270 -0
  502. package/src/components/Tabs/Tabs.tsx +139 -0
  503. package/src/components/Tabs/TabsList.props.ts +8 -0
  504. package/src/components/Tabs/TabsList.tsx +194 -0
  505. package/src/components/Tabs/index.ts +8 -0
  506. package/src/components/Textarea/TextareaField.tsx +5 -5
  507. package/src/components/Textarea/TextareaRoot.tsx +10 -10
  508. package/src/components/ToggleButton/ToggleButtonIcon.tsx +3 -3
  509. package/src/components/ToggleButton/ToggleButtonRoot.tsx +11 -11
  510. package/src/components/ToggleButton/ToggleButtonText.tsx +2 -2
  511. package/src/components/ToggleButtonCard/ToggleButtonCardRoot.tsx +3 -3
  512. package/src/components/index.ts +11 -5
  513. package/src/core/themes.ts +59 -3
  514. package/src/tokens/color.ts +505 -43
  515. package/src/tokens/components/dark/accordion.ts +0 -2
  516. package/src/tokens/components/dark/alert.ts +0 -16
  517. package/src/tokens/components/dark/avatar.ts +19 -0
  518. package/src/tokens/components/dark/badge.ts +7 -34
  519. package/src/tokens/components/dark/banner.ts +1 -10
  520. package/src/tokens/components/dark/bottom-navigation.ts +2 -7
  521. package/src/tokens/components/dark/bottom-sheet.ts +1 -2
  522. package/src/tokens/components/dark/breadcrumb.ts +0 -1
  523. package/src/tokens/components/dark/button.ts +1 -86
  524. package/src/tokens/components/dark/card.ts +0 -28
  525. package/src/tokens/components/dark/carousel-control.ts +0 -8
  526. package/src/tokens/components/dark/checkbox.ts +2 -11
  527. package/src/tokens/components/dark/date-picker.ts +0 -12
  528. package/src/tokens/components/dark/description-list.ts +20 -0
  529. package/src/tokens/components/dark/dialog.ts +0 -1
  530. package/src/tokens/components/dark/divider.ts +4 -1
  531. package/src/tokens/components/{light/footer.ts → dark/expandable-card.ts} +4 -5
  532. package/src/tokens/components/dark/icon-button.ts +5 -5
  533. package/src/tokens/components/dark/icon-container.ts +0 -17
  534. package/src/tokens/components/dark/index.ts +10 -4
  535. package/src/tokens/components/dark/{footer.ts → indicator-icon-button.ts} +4 -5
  536. package/src/tokens/components/dark/inline-link.ts +1 -1
  537. package/src/tokens/components/dark/input.ts +1 -9
  538. package/src/tokens/components/dark/link.ts +2 -2
  539. package/src/tokens/components/dark/list.ts +20 -20
  540. package/src/tokens/components/dark/menu.ts +0 -12
  541. package/src/tokens/components/dark/modal.ts +0 -1
  542. package/src/tokens/components/dark/navigation.ts +1 -6
  543. package/src/tokens/components/dark/pagination.ts +12 -0
  544. package/src/tokens/components/dark/parts.ts +14 -4
  545. package/src/tokens/components/dark/pill.ts +0 -10
  546. package/src/tokens/components/dark/progress-stepper.ts +0 -8
  547. package/src/tokens/components/dark/radio.ts +2 -9
  548. package/src/tokens/components/dark/{focus.ts → section-header.ts} +4 -2
  549. package/src/tokens/components/dark/segmented-control.ts +0 -8
  550. package/src/tokens/components/dark/select.ts +0 -10
  551. package/src/tokens/components/dark/spinner.ts +1 -1
  552. package/src/tokens/components/dark/switch.ts +1 -11
  553. package/src/tokens/components/dark/table.ts +23 -0
  554. package/src/tokens/components/dark/tabs.ts +26 -0
  555. package/src/tokens/components/dark/toast.ts +10 -0
  556. package/src/tokens/components/dark/toggle-button.ts +0 -11
  557. package/src/tokens/components/dark/tooltip.ts +12 -0
  558. package/src/tokens/components/dark/top-navigation.ts +0 -8
  559. package/src/tokens/components/light/accordion.ts +0 -2
  560. package/src/tokens/components/light/alert.ts +0 -16
  561. package/src/tokens/components/light/avatar.ts +19 -0
  562. package/src/tokens/components/light/badge.ts +7 -34
  563. package/src/tokens/components/light/banner.ts +2 -11
  564. package/src/tokens/components/light/bottom-navigation.ts +0 -5
  565. package/src/tokens/components/light/bottom-sheet.ts +1 -2
  566. package/src/tokens/components/light/breadcrumb.ts +0 -1
  567. package/src/tokens/components/light/button.ts +1 -86
  568. package/src/tokens/components/light/card.ts +0 -28
  569. package/src/tokens/components/light/carousel-control.ts +0 -8
  570. package/src/tokens/components/light/checkbox.ts +3 -12
  571. package/src/tokens/components/light/date-picker.ts +0 -12
  572. package/src/tokens/components/light/description-list.ts +20 -0
  573. package/src/tokens/components/light/dialog.ts +0 -1
  574. package/src/tokens/components/light/divider.ts +4 -1
  575. package/src/tokens/components/light/expandable-card.ts +11 -0
  576. package/src/tokens/components/light/icon-button.ts +5 -5
  577. package/src/tokens/components/light/icon-container.ts +0 -17
  578. package/src/tokens/components/light/index.ts +10 -4
  579. package/src/tokens/components/light/indicator-icon-button.ts +11 -0
  580. package/src/tokens/components/light/input.ts +1 -9
  581. package/src/tokens/components/light/link.ts +2 -2
  582. package/src/tokens/components/light/list.ts +20 -20
  583. package/src/tokens/components/light/menu.ts +0 -12
  584. package/src/tokens/components/light/modal.ts +0 -1
  585. package/src/tokens/components/light/navigation.ts +1 -6
  586. package/src/tokens/components/light/pagination.ts +12 -0
  587. package/src/tokens/components/light/parts.ts +11 -1
  588. package/src/tokens/components/light/pill.ts +0 -10
  589. package/src/tokens/components/light/progress-stepper.ts +0 -8
  590. package/src/tokens/components/light/radio.ts +3 -10
  591. package/src/tokens/components/light/{focus.ts → section-header.ts} +4 -2
  592. package/src/tokens/components/light/segmented-control.ts +0 -8
  593. package/src/tokens/components/light/select.ts +0 -10
  594. package/src/tokens/components/light/switch.ts +1 -11
  595. package/src/tokens/components/light/table.ts +23 -0
  596. package/src/tokens/components/light/tabs.ts +26 -0
  597. package/src/tokens/components/light/toast.ts +10 -0
  598. package/src/tokens/components/light/toggle-button.ts +0 -11
  599. package/src/tokens/components/light/tooltip.ts +12 -0
  600. package/src/tokens/components/light/top-navigation.ts +0 -8
  601. package/src/tokens/index.ts +1 -0
  602. package/src/tokens/layout.ts +24 -15
  603. package/src/tokens/semantic-dark.ts +242 -13
  604. package/src/tokens/semantic-light.ts +242 -13
  605. package/src/tokens/semantic.ts +9 -0
  606. package/src/types/values.ts +31 -7
  607. package/src/utils/coloursAsArray.ts +44 -2
  608. package/src/utils/formatThousands.ts +14 -0
  609. package/src/utils/getFlattenedColorValue.ts +1 -1
  610. package/src/utils/hexWithOpacity.ts +19 -0
  611. package/src/utils/index.ts +3 -1
  612. package/src/utils/styleUtils.ts +39 -1
  613. package/src/vite-env.d.ts +5 -0
  614. package/build/components/Accordion/AccordionHeading/AccordionHeading.d.ts +0 -6
  615. package/build/components/Accordion/AccordionHeading/AccordionHeading.js +0 -16
  616. package/build/components/Accordion/AccordionHeading/AccordionHeading.props.d.ts +0 -14
  617. package/build/components/Accordion/AccordionHeading/AccordionHeadingHelperText.d.ts +0 -6
  618. package/build/components/Accordion/AccordionHeading/AccordionHeadingHelperText.js +0 -13
  619. package/build/components/Accordion/AccordionHeading/AccordionHeadingTextContent.d.ts +0 -6
  620. package/build/components/Accordion/AccordionHeading/AccordionHeadingTextContent.js +0 -14
  621. package/build/components/Accordion/AccordionHeading/AccordionHeadingTitle.d.ts +0 -6
  622. package/build/components/Accordion/AccordionHeading/AccordionHeadingTitle.js +0 -7
  623. package/build/components/Accordion/AccordionHeading/index.d.ts +0 -4
  624. package/build/components/Accordion/AccordionHeading/index.js +0 -4
  625. package/build/components/List/ListHeading/ListHeading.d.ts +0 -6
  626. package/build/components/List/ListHeading/ListHeading.js +0 -20
  627. package/build/components/List/ListHeading/ListHeadingHelperText.d.ts +0 -6
  628. package/build/components/List/ListHeading/ListHeadingTitle.d.ts +0 -6
  629. package/build/components/List/ListHeading/ListHeadingTitle.js +0 -7
  630. package/build/components/List/ListHeading/index.d.ts +0 -4
  631. package/build/components/List/ListHeading/index.js +0 -4
  632. package/build/tokens/components/dark/footer.d.ts +0 -12
  633. package/build/tokens/components/dark/footer.js +0 -11
  634. package/build/tokens/components/dark/icon.d.ts +0 -15
  635. package/build/tokens/components/dark/icon.js +0 -14
  636. package/build/tokens/components/dark/text.d.ts +0 -11
  637. package/build/tokens/components/dark/text.js +0 -10
  638. package/build/tokens/components/light/footer.d.ts +0 -12
  639. package/build/tokens/components/light/footer.js +0 -11
  640. package/build/tokens/components/light/icon.d.ts +0 -15
  641. package/build/tokens/components/light/icon.js +0 -14
  642. package/build/tokens/components/light/text.d.ts +0 -11
  643. package/build/tokens/components/light/text.js +0 -10
  644. package/src/components/Accordion/AccordionHeading/AccordionHeading.props.ts +0 -19
  645. package/src/components/Accordion/AccordionHeading/AccordionHeading.tsx +0 -38
  646. package/src/components/Accordion/AccordionHeading/AccordionHeadingHelperText.tsx +0 -22
  647. package/src/components/Accordion/AccordionHeading/AccordionHeadingTextContent.tsx +0 -21
  648. package/src/components/Accordion/AccordionHeading/AccordionHeadingTitle.tsx +0 -14
  649. package/src/components/Accordion/AccordionHeading/index.ts +0 -4
  650. package/src/components/List/ListHeading/ListHeadingHelperText.tsx +0 -21
  651. package/src/components/List/ListHeading/ListHeadingTitle.tsx +0 -14
  652. package/src/components/List/ListHeading/index.ts +0 -4
  653. package/src/tokens/components/dark/icon.ts +0 -15
  654. package/src/tokens/components/dark/text.ts +0 -11
  655. package/src/tokens/components/light/icon.ts +0 -15
  656. package/src/tokens/components/light/text.ts +0 -11
  657. /package/build/components/{Accordion/AccordionHeading/AccordionHeading.props.js → CurrencyInput/CurrencyInput.props.js} +0 -0
  658. /package/build/components/{List/ListHeading/ListHeading.props.js → DescriptionList/DescriptionList.props.js} +0 -0
@@ -0,0 +1,547 @@
1
+ import { Canvas, Controls, Meta, Story } from '@storybook/addon-docs/blocks';
2
+ import { BodyText, BottomSheetModal, Box, Button, Center, Heading, Modal } from '../../';
3
+ import modalAndroidVideo from '../../../docs/assets/modal-android.mp4';
4
+ import modaliOSVideo from '../../../docs/assets/modal-ios.mp4';
5
+ import { BackToTopButton, UsageWrap, ViewFigmaButton } from '../../../docs/components';
6
+ import * as Stories from './Modal.stories';
7
+
8
+ <Meta title="Components / Modal" />
9
+
10
+ <ViewFigmaButton url="https://www.figma.com/design/6NKZXZhFSExXrcbBgc6zTR/Hearth-Components---Tokens?node-id=6300-2825&t=JmfcCbdIvO3jcjc3-4" />
11
+
12
+ <BackToTopButton />
13
+
14
+ # Modal
15
+
16
+ The `Modal` component provides a versatile dialog interface that slides up from the bottom of the screen. It's built on top of the `BottomSheetModal` component and includes pre-configured layouts for common modal patterns including headers, content areas, and action buttons.
17
+
18
+ The Modal component is ideal for displaying important information, collecting user input, or presenting choices that require user attention without navigating away from the current screen.
19
+
20
+ - [Playground](#playground)
21
+ - [Usage](#usage)
22
+ - [Props](#props)
23
+ - [Features](#features)
24
+ - [Accessibility](#accessibility)
25
+ - [Examples](#examples)
26
+ - [Basic Modal](#basic-modal)
27
+ - [Modal with Image](#modal-with-image)
28
+ - [Modal with Custom Content](#modal-with-custom-content)
29
+ - [Loading State](#loading-state)
30
+ - [Without Close Button](#without-close-button)
31
+ - [Single Action Modal](#single-action-modal)
32
+ - [Fullscreen Modal (Usage with navigation modal)](#fullscreen-modal-usage-with-navigation-modal)
33
+ - [Integration Notes](#integration-notes)
34
+ - [External Resources](#external-resources)
35
+
36
+ ## Playground
37
+
38
+ <Canvas of={Stories.Playground} />
39
+
40
+ <Controls of={Stories.Playground} />
41
+
42
+ ## Usage
43
+
44
+ ### Basic Usage
45
+
46
+ <UsageWrap>
47
+ <Center>
48
+ <Button onPress={() => {}}>Open Modal</Button>
49
+ </Center>
50
+ </UsageWrap>
51
+
52
+ ```tsx
53
+ import { useRef, useCallback } from 'react';
54
+ import { Modal, Button, BottomSheetModal } from '@utilitywarehouse/hearth-react-native';
55
+
56
+ const MyComponent = () => {
57
+ const modalRef = useRef<BottomSheetModal>(null);
58
+
59
+ const handleOpenModal = useCallback(() => {
60
+ modalRef.current?.present();
61
+ }, []);
62
+
63
+ const handleCloseModal = useCallback(() => {
64
+ modalRef.current?.dismiss();
65
+ }, []);
66
+
67
+ return (
68
+ <>
69
+ <Button onPress={handleOpenModal}>Open Modal</Button>
70
+
71
+ <Modal
72
+ ref={modalRef}
73
+ heading="Confirm Action"
74
+ description="Are you sure you want to proceed with this action?"
75
+ primaryButtonText="Confirm"
76
+ secondaryButtonText="Cancel"
77
+ onPressPrimaryButton={handleCloseModal}
78
+ onPressSecondaryButton={handleCloseModal}
79
+ />
80
+ </>
81
+ );
82
+ };
83
+ ```
84
+
85
+ ## Props
86
+
87
+ The Modal component extends the `BottomSheetModal` component and accepts all of its props, plus the following additional props:
88
+
89
+ | Property | Type | Description | Default |
90
+ | ----------------------------- | ---------------------------------------------- | ------------------------------------------------------------------------------------------------------------- | ------- |
91
+ | `heading` | `string` | The heading text displayed at the top of the modal | - |
92
+ | `description` | `string` | The description text displayed below the heading | - |
93
+ | `showCloseButton` | `boolean` | Whether to show the close button in the top-right corner | `true` |
94
+ | `primaryButtonText` | `string` | Text for the primary action button | - |
95
+ | `secondaryButtonText` | `string` | Text for the secondary action button | - |
96
+ | `onPressPrimaryButton` | `() => void` | Callback function called when the primary button is pressed | - |
97
+ | `onPressSecondaryButton` | `() => void` | Callback function called when the secondary button is pressed | - |
98
+ | `onPressCloseButton` | `() => void` | Callback function called when the close button is pressed | - |
99
+ | `closeOnPrimaryButtonPress` | `boolean` | Whether to automatically close the modal when the primary button is pressed | `true` |
100
+ | `closeOnSecondaryButtonPress` | `boolean` | Whether to automatically close the modal when the secondary button is pressed | `true` |
101
+ | `loading` | `boolean` | Whether to show a loading state with spinner | `false` |
102
+ | `image` | `ImageProps` | Image to display in the modal (shows as centered content with text below) | - |
103
+ | `children` | `ReactNode` | Custom content to display in the modal body | - |
104
+ | `primaryButtonProps` | `Omit<ButtonWithoutChildrenProps, 'children'>` | Additional props to pass to the primary button (colorScheme defaults to 'highlight', variant to 'solid') | - |
105
+ | `secondaryButtonProps` | `Omit<ButtonWithoutChildrenProps, 'children'>` | Additional props to pass to the secondary button (colorScheme defaults to 'functional', variant to 'outline') | - |
106
+ | `closeButtonProps` | `Omit<UnstyledIconButtonProps, 'children'>` | Additional props to pass to the close button | - |
107
+ | `fullscreen` | `boolean` | Whether the modal should take up the full screen height (useful for navigation modals) | `false` |
108
+
109
+ ## Features
110
+
111
+ ### Automatic Layout Management
112
+
113
+ - **Header Section**: Displays heading, description, and close button in a flexible layout
114
+ - **Content Area**: Supports custom children or image content with automatic centering
115
+ - **Footer Section**: Action buttons with consistent spacing and styling
116
+ - **Loading State**: Built-in spinner and loading text with proper layout
117
+
118
+ ### Responsive Behavior
119
+
120
+ - **Dynamic Sizing**: Automatically adjusts height based on content when `enableDynamicSizing` is enabled
121
+ - **Image Modals**: Automatically sets snapPoints to `['90%']` when an image is provided
122
+ - **Handle Management**: Automatically hides the drag handle during loading states
123
+
124
+ ### Accessibility & UX
125
+
126
+ - **Auto-close**: Configurable auto-close behavior for action buttons
127
+ - **Backdrop**: Inherits backdrop behavior from BottomSheetModal
128
+ - **Scrollable Content**: Uses BottomSheetScrollView for content that may overflow
129
+ - **Screen Reader Support**: Automatically announces modal state changes and manages focus
130
+ - **Focus Management**: Sets accessibility focus to modal content when opened
131
+ - **Keyboard Navigation**: Full keyboard support for interactive elements
132
+ - **ARIA Labels**: Proper labeling for all interactive components
133
+ - **Loading States**: Accessible loading indicators with appropriate announcements
134
+
135
+ ## Accessibility
136
+
137
+ The Modal component is built with comprehensive accessibility support to ensure a great experience for all users, including those using screen readers and other assistive technologies.
138
+
139
+ ### Screen Reader Support
140
+
141
+ - **Automatic Announcements**: When the modal opens, screen readers automatically announce "Modal opened"
142
+ - **Content Focus**: Focus is automatically set to the modal content area for immediate access
143
+ - **Loading State Announcements**: Loading states are properly announced with "Loading..." text
144
+ - **Button Labels**: All interactive elements have descriptive accessibility labels
145
+
146
+ ### Focus Management
147
+
148
+ The Modal component automatically manages focus to provide a seamless experience:
149
+
150
+ ```tsx
151
+ // Focus is automatically set when modal opens
152
+ const MyModal = () => {
153
+ const modalRef = useRef<BottomSheetModal>(null);
154
+
155
+ return (
156
+ <Modal
157
+ ref={modalRef}
158
+ heading="Accessible Modal" // Automatically becomes accessible heading
159
+ description="This description is accessible to screen readers"
160
+ primaryButtonText="Confirm" // Button is automatically labeled
161
+ secondaryButtonText="Cancel"
162
+ // Focus management is handled automatically
163
+ />
164
+ );
165
+ };
166
+ ```
167
+
168
+ ### Custom Accessibility Labels
169
+
170
+ You can enhance accessibility by providing custom labels for buttons and close actions:
171
+
172
+ ```tsx
173
+ <Modal
174
+ ref={modalRef}
175
+ heading="Delete Item"
176
+ description="This action cannot be undone"
177
+ primaryButtonText="Delete"
178
+ secondaryButtonText="Cancel"
179
+ // Custom accessibility labels
180
+ closeButtonProps={{
181
+ accessibilityLabel: 'Close delete confirmation dialog',
182
+ }}
183
+ primaryButtonProps={{
184
+ accessibilityLabel: 'Confirm deletion of item',
185
+ }}
186
+ secondaryButtonProps={{
187
+ accessibilityLabel: 'Cancel deletion and return to previous screen',
188
+ }}
189
+ />
190
+ ```
191
+
192
+ ### Loading State Accessibility
193
+
194
+ Loading states are fully accessible with proper announcements:
195
+
196
+ ```tsx
197
+ <Modal
198
+ ref={modalRef}
199
+ heading="Processing Payment"
200
+ description="Please wait while we process your payment"
201
+ loading={isProcessing}
202
+ // Loading spinner and "Loading..." text are automatically accessible
203
+ primaryButtonText="Process Payment"
204
+ onPressPrimaryButton={handlePayment}
205
+ />
206
+ ```
207
+
208
+ ### Best Practices
209
+
210
+ 1. **Descriptive Headings**: Use clear, descriptive headings that explain the modal's purpose
211
+ 2. **Actionable Button Text**: Use specific button text that describes the action (e.g., "Save Changes" vs "OK")
212
+ 3. **Meaningful Descriptions**: Provide context in the description to help users understand the consequences
213
+ 4. **Custom Labels**: Add custom accessibility labels for complex interactions
214
+ 5. **Loading Feedback**: Always provide accessible feedback during loading states
215
+
216
+ ### Testing Accessibility
217
+
218
+ To test accessibility in your Modal implementation:
219
+
220
+ ```tsx
221
+ import { AccessibilityInfo } from 'react-native';
222
+
223
+ const TestableModal = () => {
224
+ const modalRef = useRef<BottomSheetModal>(null);
225
+
226
+ const handleOpenModal = () => {
227
+ modalRef.current?.present();
228
+
229
+ // Test: Verify screen reader announcement
230
+ AccessibilityInfo.announceForAccessibility('Opening confirmation dialog');
231
+ };
232
+
233
+ return (
234
+ <Modal
235
+ ref={modalRef}
236
+ heading="Test Modal"
237
+ description="This modal demonstrates accessibility features"
238
+ primaryButtonText="Test Action"
239
+ // Verify these labels work with your screen reader
240
+ closeButtonProps={{
241
+ accessibilityLabel: 'Close test modal',
242
+ accessibilityHint: 'Dismisses the modal without saving changes',
243
+ }}
244
+ />
245
+ );
246
+ };
247
+ ```
248
+
249
+ ### Platform Considerations
250
+
251
+ The Modal component handles platform-specific accessibility differences:
252
+
253
+ - **iOS**: Uses VoiceOver optimizations for focus management
254
+ - **Android**: Implements TalkBack-specific accessibility patterns
255
+ - **Cross-platform**: Consistent behavior across both platforms
256
+
257
+ ## Examples
258
+
259
+ ### Basic Modal
260
+
261
+ <Canvas of={Stories.Playground} />
262
+
263
+ ### Modal with Image
264
+
265
+ Use the `image` prop to display an image-centric modal with centered content:
266
+
267
+ <Canvas of={Stories.WithImage} />
268
+
269
+ ```tsx
270
+ const ImageModal = () => {
271
+ const modalRef = useRef<BottomSheetModal>(null);
272
+
273
+ return (
274
+ <>
275
+ <Button onPress={() => modalRef.current?.present()}>Show Image Modal</Button>
276
+
277
+ <Modal
278
+ ref={modalRef}
279
+ heading="Welcome!"
280
+ description="Thanks for joining our community"
281
+ primaryButtonText="Get Started"
282
+ secondaryButtonText="Maybe Later"
283
+ image={{
284
+ source: require('./path/to/image.png'),
285
+ resizeMode: 'contain',
286
+ }}
287
+ onPressPrimaryButton={() => modalRef.current?.dismiss()}
288
+ onPressSecondaryButton={() => modalRef.current?.dismiss()}
289
+ />
290
+ </>
291
+ );
292
+ };
293
+ ```
294
+
295
+ ### Modal with Custom Content
296
+
297
+ Add custom content between the header and footer sections:
298
+
299
+ <Canvas of={Stories.WithCustomContent} />
300
+
301
+ ```tsx
302
+ const CustomContentModal = () => {
303
+ const modalRef = useRef<BottomSheetModal>(null);
304
+
305
+ return (
306
+ <>
307
+ <Button onPress={() => modalRef.current?.present()}>Show Custom Modal</Button>
308
+
309
+ <Modal
310
+ ref={modalRef}
311
+ heading="Settings"
312
+ description="Configure your preferences"
313
+ primaryButtonText="Save"
314
+ secondaryButtonText="Cancel"
315
+ onPressPrimaryButton={() => modalRef.current?.dismiss()}
316
+ onPressSecondaryButton={() => modalRef.current?.dismiss()}
317
+ >
318
+ <Box gap="200">
319
+ <BodyText>Enable notifications</BodyText>
320
+ <BodyText>Allow location access</BodyText>
321
+ <BodyText>Share usage data</BodyText>
322
+ </Box>
323
+ </Modal>
324
+ </>
325
+ );
326
+ };
327
+ ```
328
+
329
+ ### Loading State
330
+
331
+ Show a loading spinner while processing:
332
+
333
+ <Canvas of={Stories.Loading} />
334
+
335
+ ```tsx
336
+ const LoadingModal = () => {
337
+ const modalRef = useRef<BottomSheetModal>(null);
338
+ const [isLoading, setIsLoading] = useState(false);
339
+
340
+ const handleSubmit = async () => {
341
+ setIsLoading(true);
342
+ // Simulate API call
343
+ await new Promise(resolve => setTimeout(resolve, 2000));
344
+ setIsLoading(false);
345
+ modalRef.current?.dismiss();
346
+ };
347
+
348
+ return (
349
+ <>
350
+ <Button onPress={() => modalRef.current?.present()}>Show Loading Modal</Button>
351
+
352
+ <Modal
353
+ ref={modalRef}
354
+ heading="Processing"
355
+ description="Please wait while we process your request"
356
+ loading={isLoading}
357
+ primaryButtonText="Submit"
358
+ onPressPrimaryButton={handleSubmit}
359
+ closeOnPrimaryButtonPress={false}
360
+ />
361
+ </>
362
+ );
363
+ };
364
+ ```
365
+
366
+ ### Without Close Button
367
+
368
+ Remove the close button for critical actions:
369
+
370
+ ```tsx
371
+ const CriticalModal = () => {
372
+ const modalRef = useRef<BottomSheetModal>(null);
373
+
374
+ return (
375
+ <>
376
+ <Button onPress={() => modalRef.current?.present()}>Show Critical Modal</Button>
377
+
378
+ <Modal
379
+ ref={modalRef}
380
+ heading="Critical Action Required"
381
+ description="This action cannot be undone"
382
+ showCloseButton={false}
383
+ primaryButtonText="Continue"
384
+ secondaryButtonText="Cancel"
385
+ onPressPrimaryButton={() => modalRef.current?.dismiss()}
386
+ onPressSecondaryButton={() => modalRef.current?.dismiss()}
387
+ />
388
+ </>
389
+ );
390
+ };
391
+ ```
392
+
393
+ ### Single Action Modal
394
+
395
+ Create a modal with only one action button:
396
+
397
+ ```tsx
398
+ const AlertModal = () => {
399
+ const modalRef = useRef<BottomSheetModal>(null);
400
+
401
+ return (
402
+ <>
403
+ <Button onPress={() => modalRef.current?.present()}>Show Alert</Button>
404
+
405
+ <Modal
406
+ ref={modalRef}
407
+ heading="Success!"
408
+ description="Your action was completed successfully"
409
+ primaryButtonText="OK"
410
+ onPressPrimaryButton={() => modalRef.current?.dismiss()}
411
+ />
412
+ </>
413
+ );
414
+ };
415
+ ```
416
+
417
+ ### Fullscreen Modal (Usage with navigation modal)
418
+
419
+ When using the Modal component in a navigation context, you can set it to fullscreen mode, this will make it behave like a standard modal screen.
420
+ Here's an example of how to implement this with custom close animations for Android:
421
+
422
+ ```tsx
423
+ import { useNavigation } from 'react-navigation/native';
424
+ import { useCallback, useEffect, useRef } from 'react';
425
+ import { Platform, StyleSheet, View } from 'react-native';
426
+
427
+ import { BodyText, Heading, InlineLink, Modal } from '@utilitywarehouse/hearth-react-native';
428
+
429
+ export default function ModalScreen() {
430
+ const modalRef = useRef<Modal>(null);
431
+ const navigation = useNavigation();
432
+ const isClosingRef = useRef(false);
433
+
434
+ const handleClose = useCallback(() => {
435
+ if (Platform.OS === 'ios') {
436
+ navigation.goBack();
437
+ return;
438
+ }
439
+ if (isClosingRef.current) return;
440
+
441
+ isClosingRef.current = true;
442
+ // Trigger our custom animation first
443
+ modalRef.current?.triggerCloseAnimation?.();
444
+
445
+ // Delay the actual navigation to allow our animation to play
446
+ setTimeout(() => {
447
+ navigation.goBack();
448
+ }, 100); // Match Modal animation duration
449
+ }, [navigation]);
450
+
451
+ useEffect(() => {
452
+ if (Platform.OS === 'android') {
453
+ const unsubscribe = navigation.addListener('beforeRemove', e => {
454
+ if (!isClosingRef.current) {
455
+ // Prevent default behavior
456
+ e.preventDefault();
457
+ handleClose();
458
+ }
459
+ });
460
+
461
+ return unsubscribe;
462
+ }
463
+ }, [navigation, handleClose]);
464
+
465
+ return (
466
+ <Modal
467
+ ref={modalRef}
468
+ fullscreen
469
+ onPressCloseButton={handleClose}
470
+ primaryButtonText="Action"
471
+ onPressPrimaryButton={handleClose}
472
+ secondaryButtonText="Cancel"
473
+ onPressSecondaryButton={handleClose}
474
+ >
475
+ <View style={styles.container}>
476
+ <Heading size="xl">This is a modal</Heading>
477
+ <BodyText>
478
+ <InlineLink onPress={handleClose} style={styles.link}>
479
+ Go to home screen
480
+ </InlineLink>
481
+ </BodyText>
482
+ </View>
483
+ </Modal>
484
+ );
485
+ }
486
+
487
+ const styles = StyleSheet.create({
488
+ container: {
489
+ flex: 1,
490
+ alignItems: 'center',
491
+ justifyContent: 'center',
492
+ padding: 20,
493
+ },
494
+ link: {
495
+ marginTop: 15,
496
+ paddingVertical: 15,
497
+ },
498
+ });
499
+ ```
500
+
501
+ The above example demonstrates how to create a fullscreen modal that integrates with navigation.
502
+ It includes custom close animations for Android to enhance the user experience. See the videos below for platform-specific behavior:
503
+
504
+ | ios | android |
505
+ | ------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------- |
506
+ | <video src={modaliOSVideo} width={300} height="auto" controls loop autoPlay /> | <video src={modalAndroidVideo} width={300} height="auto" controls loop autoPlay /> |
507
+
508
+ ## Integration Notes
509
+
510
+ ### BottomSheetModalProvider
511
+
512
+ When using the Modal component, ensure your app is wrapped with `BottomSheetModalProvider`:
513
+
514
+ ```tsx
515
+ import { BottomSheetModalProvider } from '@utilitywarehouse/hearth-react-native';
516
+
517
+ const App = () => {
518
+ return <BottomSheetModalProvider>{/* Your app content */}</BottomSheetModalProvider>;
519
+ };
520
+ ```
521
+
522
+ ### Ref Usage
523
+
524
+ The Modal component forwards its ref to the underlying `BottomSheetModal`, giving you access to methods like:
525
+
526
+ - `present()` - Opens the modal
527
+ - `dismiss()` - Closes the modal
528
+ - `close()` - Alternative to dismiss
529
+ - `snapToIndex(index)` - Snap to a specific index
530
+ - `snapToPosition(position)` - Snap to a specific position
531
+
532
+ ```tsx
533
+ const modalRef = useRef<BottomSheetModal>(null);
534
+
535
+ // Open modal
536
+ modalRef.current?.present();
537
+
538
+ // Close modal
539
+ modalRef.current?.dismiss();
540
+
541
+ // Snap to specific position
542
+ modalRef.current?.snapToIndex(1);
543
+ ```
544
+
545
+ ## External Resources
546
+
547
+ This component is built on top of [@gorhom/bottom-sheet](https://gorhom.github.io/react-native-bottom-sheet/) (v5). For more information about the underlying BottomSheet functionality, please refer to the [BottomSheet documentation](./BottomSheet.docs.mdx) and the [official documentation](https://gorhom.dev/react-native-bottom-sheet/).
@@ -0,0 +1,26 @@
1
+ import { ImageProps, ViewProps } from 'react-native';
2
+ import { BottomSheetProps } from '../BottomSheet';
3
+ import { ButtonWithoutChildrenProps } from '../Button/Button.props';
4
+ import { UnstyledIconButtonProps } from '../UnstyledIconButton';
5
+
6
+ interface ModalProps extends Omit<BottomSheetProps, 'children'> {
7
+ loading?: boolean;
8
+ image?: ImageProps;
9
+ showCloseButton?: boolean;
10
+ heading?: string;
11
+ description?: string;
12
+ fullscreen?: boolean;
13
+ children?: ViewProps['children'];
14
+ onPressPrimaryButton?: () => void;
15
+ primaryButtonText?: string;
16
+ onPressSecondaryButton?: () => void;
17
+ closeOnPrimaryButtonPress?: boolean;
18
+ secondaryButtonText?: string;
19
+ onPressCloseButton?: () => void;
20
+ closeOnSecondaryButtonPress?: boolean;
21
+ primaryButtonProps?: Omit<ButtonWithoutChildrenProps, 'children'>;
22
+ secondaryButtonProps?: Omit<ButtonWithoutChildrenProps, 'children'>;
23
+ closeButtonProps?: Omit<UnstyledIconButtonProps, 'children'>;
24
+ }
25
+
26
+ export default ModalProps;