@12-apps/ui 6.29.1 → 6.30.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 (373) hide show
  1. package/NATIVE.md +1 -1
  2. package/components-catalog.md +7 -0
  3. package/dist/_internal/components/data-display/Avatar/Avatar.js +4 -4
  4. package/dist/_internal/components/data-display/Avatar/Avatar.view.js +2 -2
  5. package/dist/_internal/components/data-display/Badge/Badge.js +2 -2
  6. package/dist/_internal/components/data-display/CardKit/CardKebab.js +3 -3
  7. package/dist/_internal/components/data-display/CardKit/use-remove-confirm.js +4 -4
  8. package/dist/_internal/components/data-display/CardKit/use-row-confirm.js +4 -4
  9. package/dist/_internal/components/data-display/Carousel/Carousel.js +3 -3
  10. package/dist/_internal/components/data-display/Chart/Chart.js +4 -4
  11. package/dist/_internal/components/data-display/Chart/SpecChart.js +8 -8
  12. package/dist/_internal/components/data-display/Chart/chart-context.js +2 -2
  13. package/dist/_internal/components/data-display/Chart/chart-renderers.js +3 -3
  14. package/dist/_internal/components/data-display/Chart/chart-spec.js +2 -2
  15. package/dist/_internal/components/data-display/DataGrid/DataGrid.js +2 -2
  16. package/dist/_internal/components/data-display/DataViews/DataViewsGrid.js +40 -40
  17. package/dist/_internal/components/data-display/DataViews/DataViewsTableBase.js +52 -52
  18. package/dist/_internal/components/data-display/DataViews/DeleteViewDialog.js +6 -6
  19. package/dist/_internal/components/data-display/DataViews/ManageViewsDialog.js +8 -8
  20. package/dist/_internal/components/data-display/DataViews/SaveViewModal.js +6 -6
  21. package/dist/_internal/components/data-display/DataViews/base-card.js +2 -2
  22. package/dist/_internal/components/data-display/DataViews/base-list-card-geometry.js +5 -5
  23. package/dist/_internal/components/data-display/DataViews/base-list-card-slots.js +4 -4
  24. package/dist/_internal/components/data-display/DataViews/base-list-card.js +7 -7
  25. package/dist/_internal/components/data-display/DataViews/data-views-category-pill.js +4 -4
  26. package/dist/_internal/components/data-display/DataViews/data-views-columns.js +4 -4
  27. package/dist/_internal/components/data-display/DataViews/data-views-display-panel.js +7 -7
  28. package/dist/_internal/components/data-display/DataViews/data-views-display-tabs.js +3 -3
  29. package/dist/_internal/components/data-display/DataViews/data-views-empty.js +3 -3
  30. package/dist/_internal/components/data-display/DataViews/data-views-export.js +3 -3
  31. package/dist/_internal/components/data-display/DataViews/data-views-filter-panel.js +7 -7
  32. package/dist/_internal/components/data-display/DataViews/data-views-grid-bodies.js +10 -10
  33. package/dist/_internal/components/data-display/DataViews/data-views-grid-helpers.js +3 -3
  34. package/dist/_internal/components/data-display/DataViews/data-views-grid-parts.js +35 -35
  35. package/dist/_internal/components/data-display/DataViews/data-views-inline-bar.js +11 -11
  36. package/dist/_internal/components/data-display/DataViews/data-views-layout-context.js +2 -2
  37. package/dist/_internal/components/data-display/DataViews/data-views-more-fields.js +4 -4
  38. package/dist/_internal/components/data-display/DataViews/data-views-more-filters.js +7 -7
  39. package/dist/_internal/components/data-display/DataViews/data-views-range-pill.js +2 -2
  40. package/dist/_internal/components/data-display/DataViews/data-views-scope-tabs.js +3 -3
  41. package/dist/_internal/components/data-display/DataViews/data-views-select-all-strip.js +3 -3
  42. package/dist/_internal/components/data-display/DataViews/data-views-shell-toolbar.js +12 -12
  43. package/dist/_internal/components/data-display/DataViews/data-views-table-parts.js +11 -11
  44. package/dist/_internal/components/data-display/DataViews/data-views-toolbar.js +11 -11
  45. package/dist/_internal/components/data-display/DataViews/data-views-view-nav.js +3 -3
  46. package/dist/_internal/components/data-display/DataViews/list-card-rails.js +3 -3
  47. package/dist/_internal/components/data-display/DataViews/use-data-views-state.js +7 -7
  48. package/dist/_internal/components/data-display/DataViews/use-saved-views-controller.js +2 -2
  49. package/dist/_internal/components/data-display/FleetMap/FleetBody.js +10 -10
  50. package/dist/_internal/components/data-display/FleetMap/FleetCanvas.js +9 -9
  51. package/dist/_internal/components/data-display/FleetMap/FleetMap.fixtures.js +2 -2
  52. package/dist/_internal/components/data-display/FleetMap/FleetMap.js +12 -12
  53. package/dist/_internal/components/data-display/HoverCard/HoverCard.js +2 -2
  54. package/dist/_internal/components/data-display/Lightbox/Lightbox.js +6 -6
  55. package/dist/_internal/components/data-display/MapPreview/MapLayers.js +2 -2
  56. package/dist/_internal/components/data-display/MapPreview/MapMarkers.js +2 -2
  57. package/dist/_internal/components/data-display/MapPreview/MapPreview.js +8 -8
  58. package/dist/_internal/components/data-display/Progress/Progress.js +2 -2
  59. package/dist/_internal/components/data-display/Sheet/Sheet.hooks.js +2 -2
  60. package/dist/_internal/components/data-display/Sheet/Sheet.js +4 -4
  61. package/dist/_internal/components/data-display/Table/Table.js +2 -2
  62. package/dist/_internal/components/data-display/index.js +56 -56
  63. package/dist/_internal/components/feedback/ConfirmAction/ConfirmButton.js +3 -3
  64. package/dist/_internal/components/feedback/Dialog/Dialog.js +2 -2
  65. package/dist/_internal/components/feedback/Modal/Modal.js +2 -2
  66. package/dist/_internal/components/feedback/NotificationStatusNotice/NotificationStatusNotice.helpers.js +12 -0
  67. package/dist/_internal/components/feedback/NotificationStatusNotice/NotificationStatusNotice.js +24 -0
  68. package/dist/_internal/components/feedback/NotificationStatusNotice/NotificationStatusNotice.js.map +1 -0
  69. package/dist/_internal/components/feedback/NotificationStatusNotice/NotificationStatusNotice.metrics.js +12 -0
  70. package/dist/_internal/components/feedback/NotificationStatusNotice/NotificationStatusNotice.metrics.js.map +1 -0
  71. package/dist/_internal/components/feedback/NotificationStatusNotice/NotificationStatusNotice.types.js +1 -0
  72. package/dist/_internal/components/feedback/NotificationStatusNotice/NotificationStatusNotice.types.js.map +1 -0
  73. package/dist/_internal/components/feedback/index.js +35 -19
  74. package/dist/_internal/components/form/AddressAutocomplete/AddressAutocomplete.hooks.js +2 -2
  75. package/dist/_internal/components/form/AddressAutocomplete/AddressAutocomplete.js +6 -6
  76. package/dist/_internal/components/form/AddressAutocomplete/AddressAutocompleteField.js +3 -3
  77. package/dist/_internal/components/form/Button/Button.js +2 -2
  78. package/dist/_internal/components/form/Calendar/Calendar.hooks.js +2 -2
  79. package/dist/_internal/components/form/Calendar/Calendar.js +3 -3
  80. package/dist/_internal/components/form/CategorySelect/CategorySelect.js +2 -2
  81. package/dist/_internal/components/form/CodeEditor/CodeEditor.js +2 -2
  82. package/dist/_internal/components/form/DateRangePicker/DateRangePicker.js +4 -4
  83. package/dist/_internal/components/form/InputOTP/InputOTP.js +2 -2
  84. package/dist/_internal/components/form/Menubar/Menubar.js +2 -2
  85. package/dist/_internal/components/form/UploadButton/UploadButton.js +2 -2
  86. package/dist/_internal/components/form/index.js +46 -46
  87. package/dist/_internal/components/form/total-form/Fields/CategoryField.js +3 -3
  88. package/dist/_internal/components/form/total-form/Fields/index.js +7 -7
  89. package/dist/_internal/components/form/total-form/SubmitButton.js +3 -3
  90. package/dist/_internal/components/index.js +173 -161
  91. package/dist/_internal/components/layout/ScrollArea/ScrollArea.js +1 -1
  92. package/dist/_internal/components/layout/SettingsLayout/SettingsLayout.js +4 -4
  93. package/dist/_internal/components/layout/SettingsLayout/SettingsPanel.js +2 -2
  94. package/dist/_internal/components/layout/index.js +18 -18
  95. package/dist/_internal/components/navigation/AppHeader/AppHeader.details.js +10 -10
  96. package/dist/_internal/components/navigation/NavigationMenu/NavigationMegaSection.js +2 -2
  97. package/dist/_internal/components/navigation/NavigationMenu/NavigationMenu.js +4 -4
  98. package/dist/_internal/components/navigation/NavigationMenu/NavigationStandardBody.js +2 -2
  99. package/dist/_internal/components/navigation/index.js +22 -22
  100. package/dist/_internal/components/utility/InstallPrompt/InstallPrompt.js +3 -3
  101. package/dist/_internal/components/utility/InstallPrompt/usePwaInstall.js +2 -2
  102. package/dist/_internal/components/utility/index.js +17 -17
  103. package/dist/_internal/en-US.data-display.js +2 -2
  104. package/dist/_internal/en-US.feedback.js +3 -1
  105. package/dist/_internal/icons/Icon.js +2 -2
  106. package/dist/_internal/pt-BR.feedback.js +3 -1
  107. package/dist/_internal/social-login-button/social-login-button.js +4 -4
  108. package/dist/_internal/user-avatar/user-avatar.js +8 -8
  109. package/dist/charts.js +17 -17
  110. package/dist/{chunk-W5CW7JFZ.js → chunk-22ZJH7RY.js} +2 -2
  111. package/dist/{chunk-JRWPI4XF.js → chunk-23FCBIUN.js} +4 -4
  112. package/dist/{chunk-HQB5XNK5.js → chunk-2UBFDRL7.js} +2 -2
  113. package/dist/{chunk-HS2OJI6L.js → chunk-35UG2QDB.js} +7 -7
  114. package/dist/{chunk-4H4Y2SX3.js → chunk-3MALHTZQ.js} +2 -2
  115. package/dist/chunk-3MEIGSDK.js +88 -0
  116. package/dist/chunk-3MEIGSDK.js.map +1 -0
  117. package/dist/{chunk-PVIAHB7D.js → chunk-3XLDTVLC.js} +6 -6
  118. package/dist/{chunk-5UC2RNOY.js → chunk-4MXFPDKL.js} +4 -4
  119. package/dist/{chunk-OJCK5RNJ.js → chunk-4XVH6IWN.js} +2 -2
  120. package/dist/{chunk-ALAJBLBE.js → chunk-554SVTCN.js} +3 -3
  121. package/dist/chunk-55FFONIV.js +11 -0
  122. package/dist/chunk-55FFONIV.js.map +1 -0
  123. package/dist/{chunk-3BPDHWVF.js → chunk-57W2C7HY.js} +4 -4
  124. package/dist/{chunk-XGOWREVV.js → chunk-57ZSQB5V.js} +2 -2
  125. package/dist/{chunk-P3NRT6GV.js → chunk-62NA6IF3.js} +4 -4
  126. package/dist/{chunk-J2K65BQQ.js → chunk-6FUOUUYO.js} +3 -3
  127. package/dist/{chunk-MVJYIHPH.js → chunk-6IKX5IIX.js} +3 -3
  128. package/dist/{chunk-QGAYEBMU.js → chunk-6PKVHFCK.js} +8 -8
  129. package/dist/chunk-6YIKVXAV.js +1 -0
  130. package/dist/chunk-6YIKVXAV.js.map +1 -0
  131. package/dist/{chunk-G5ZVD5IJ.js → chunk-7AR2R7TV.js} +4 -4
  132. package/dist/{chunk-XBZ43VIV.js → chunk-7IKWIWWV.js} +7 -7
  133. package/dist/{chunk-YFY3YVV6.js → chunk-7OZBOS75.js} +3 -3
  134. package/dist/chunk-ASHXIAJO.js +88 -0
  135. package/dist/chunk-ASHXIAJO.js.map +1 -0
  136. package/dist/{chunk-NGVGTMHT.js → chunk-B474PL5O.js} +2 -2
  137. package/dist/{chunk-TX3ZHO5R.js → chunk-BEGWE5O4.js} +4 -4
  138. package/dist/{chunk-NGM5XKAS.js → chunk-BILJU2DX.js} +5 -5
  139. package/dist/{chunk-GJUIZ5FN.js → chunk-BKAB4KZK.js} +4 -4
  140. package/dist/{chunk-HKV4MQ2W.js → chunk-BLBOYCOV.js} +5 -5
  141. package/dist/{chunk-NY2Y2SHA.js → chunk-CASZGBCA.js} +4 -4
  142. package/dist/{chunk-UN5INW6K.js → chunk-CZJLWCEG.js} +2 -2
  143. package/dist/{chunk-WYDGPJ3Z.js → chunk-CZPU5TW3.js} +4 -4
  144. package/dist/{chunk-TC3EPGGJ.js → chunk-DAPK3ADA.js} +4 -4
  145. package/dist/{chunk-QZBUGUOY.js → chunk-DFLTUI7W.js} +4 -4
  146. package/dist/{chunk-PJTSGHTY.js → chunk-DQOLW4B5.js} +2 -2
  147. package/dist/{chunk-FR6AJSMT.js → chunk-DUWF5LUK.js} +4 -4
  148. package/dist/{chunk-SHDIZSN5.js → chunk-EXJBPKGW.js} +5 -5
  149. package/dist/{chunk-MHSTG7FF.js → chunk-EZMCWRXO.js} +2 -2
  150. package/dist/{chunk-BYMWW65P.js → chunk-FGUK3D54.js} +2 -2
  151. package/dist/{chunk-PCYGUOWJ.js → chunk-FLIMEQUA.js} +7 -7
  152. package/dist/{chunk-TEE6HNHS.js → chunk-FRW4SYZD.js} +4 -4
  153. package/dist/{chunk-R6SBP5M5.js → chunk-GOWBYHYW.js} +4 -4
  154. package/dist/{chunk-THOPGHTY.js → chunk-HGJHZ5PE.js} +7 -7
  155. package/dist/{chunk-K4N3V7YE.js → chunk-HR7YTBR7.js} +4 -4
  156. package/dist/{chunk-PZEC5CQA.js → chunk-HT4B2DJU.js} +4 -4
  157. package/dist/{chunk-EMAX7RPN.js → chunk-HZ6L7WXE.js} +7 -7
  158. package/dist/{chunk-BEWD734I.js → chunk-I3FXTIKA.js} +2 -2
  159. package/dist/{chunk-JE6RZ5L6.js → chunk-IABE56TG.js} +2 -2
  160. package/dist/{chunk-B443IIQG.js → chunk-IE7ISTLQ.js} +4 -4
  161. package/dist/{chunk-LKF5KQ2Q.js → chunk-IIUB4IOH.js} +4 -4
  162. package/dist/{chunk-2ZRZTGWP.js → chunk-ISW5K72V.js} +5 -5
  163. package/dist/{chunk-JOXBCXVL.js → chunk-J4W4TQPC.js} +9 -9
  164. package/dist/{chunk-K7DCYV5Q.js → chunk-JGV66VUK.js} +2 -2
  165. package/dist/{chunk-QPDDS6DQ.js → chunk-JJ3VR7WX.js} +2 -2
  166. package/dist/{chunk-DVE53B2L.js → chunk-JQL4GG5L.js} +7 -7
  167. package/dist/chunk-JQRKXMSH.js +1 -0
  168. package/dist/chunk-JQRKXMSH.js.map +1 -0
  169. package/dist/{chunk-EZNTM6PT.js → chunk-JYF3HT7M.js} +7 -7
  170. package/dist/{chunk-H53YNR23.js → chunk-K2EHH7TC.js} +5 -5
  171. package/dist/{chunk-FOKBP6HR.js → chunk-K2JH7QPR.js} +10 -10
  172. package/dist/chunk-K4JRHQMI.js +109 -0
  173. package/dist/chunk-K4JRHQMI.js.map +1 -0
  174. package/dist/{chunk-VRKS5K4N.js → chunk-K5V3KCFI.js} +4 -4
  175. package/dist/{chunk-LSJY4LWZ.js → chunk-KFZT3PHA.js} +3 -3
  176. package/dist/{chunk-DVUPIVI2.js → chunk-KT6HWAEN.js} +4 -4
  177. package/dist/{chunk-EYC6ERJJ.js → chunk-KUJLZFDW.js} +3 -3
  178. package/dist/chunk-L7BRU4UF.js +39 -0
  179. package/dist/chunk-L7BRU4UF.js.map +1 -0
  180. package/dist/{chunk-O42ZA3TW.js → chunk-MCBG6R5A.js} +2 -2
  181. package/dist/{chunk-MNSW33DU.js → chunk-MSS6IU5X.js} +3 -3
  182. package/dist/{chunk-VLHGBFR6.js → chunk-MZQTHSLN.js} +3 -3
  183. package/dist/{chunk-XELVDPKL.js → chunk-NFAKRI4S.js} +4 -4
  184. package/dist/{chunk-7TZ6OC5T.js → chunk-OH3YGJT5.js} +2 -2
  185. package/dist/{chunk-ZTZ6S5Q6.js → chunk-OXQP3N6X.js} +4 -4
  186. package/dist/{chunk-XSJWN3WH.js → chunk-PMS3H3OO.js} +10 -10
  187. package/dist/{chunk-IQ7WZ3RN.js → chunk-Q5NAZ7TW.js} +2 -2
  188. package/dist/{chunk-SOCKK67R.js → chunk-QRX5BYUQ.js} +7 -7
  189. package/dist/{chunk-OLZTGVBT.js → chunk-REMK55JI.js} +4 -4
  190. package/dist/{chunk-5GMHJ7Y5.js → chunk-S2GDYA6R.js} +5 -5
  191. package/dist/{chunk-T7WU7JGC.js → chunk-SUTNQG7E.js} +2 -2
  192. package/dist/{chunk-TTW4MAOJ.js → chunk-UCTJJYVC.js} +5 -5
  193. package/dist/{chunk-BLT5ZBVL.js → chunk-UEJQQVP2.js} +4 -4
  194. package/dist/{chunk-236QP424.js → chunk-URVNHKM2.js} +5 -5
  195. package/dist/{chunk-4OSGKO7E.js → chunk-UVD5NFRF.js} +2 -2
  196. package/dist/{chunk-TSFFZ3AH.js → chunk-VEGT5PAD.js} +17 -17
  197. package/dist/{chunk-UKPZVX3J.js → chunk-VJFH2AXT.js} +2 -2
  198. package/dist/{chunk-XXJRT6BP.js → chunk-VMXDTCYF.js} +6 -6
  199. package/dist/{chunk-HDNK7BAX.js → chunk-VNEEXUWA.js} +3 -3
  200. package/dist/{chunk-XOCLWQON.js → chunk-VNGYJXAU.js} +3 -3
  201. package/dist/{chunk-KW7H5O3K.js → chunk-WREIYOXN.js} +4 -4
  202. package/dist/{chunk-EPNUVSNK.js → chunk-XFUNJYFT.js} +7 -7
  203. package/dist/{chunk-QSKJLMNS.js → chunk-Y5UCOBQN.js} +2 -2
  204. package/dist/{chunk-D6HDJVQW.js → chunk-YANLN6HP.js} +5 -5
  205. package/dist/{chunk-JVVTSSS4.js → chunk-Z52HVR4J.js} +2 -2
  206. package/dist/{chunk-WC3W36AM.js → chunk-ZOUWHGV3.js} +4 -4
  207. package/dist/{chunk-M7E66OSC.js → chunk-ZPIMPOHV.js} +4 -4
  208. package/dist/{chunk-LCXXPIG3.js → chunk-ZWIDQEJ4.js} +4 -4
  209. package/dist/{chunk-MRMNVGNX.js → chunk-ZYKDPX3W.js} +2 -2
  210. package/dist/data-display/Avatar.js +4 -4
  211. package/dist/data-display/Badge.js +2 -2
  212. package/dist/data-display/CardKit.js +10 -10
  213. package/dist/data-display/Carousel.js +3 -3
  214. package/dist/data-display/Chart.js +17 -17
  215. package/dist/data-display/DataGrid.js +2 -2
  216. package/dist/data-display/DataViews.js +69 -69
  217. package/dist/data-display/FleetMap.js +12 -12
  218. package/dist/data-display/HoverCard.js +2 -2
  219. package/dist/data-display/Lightbox.js +6 -6
  220. package/dist/data-display/MapPreview.js +8 -8
  221. package/dist/data-display/Progress.js +2 -2
  222. package/dist/data-display/Sheet.js +4 -4
  223. package/dist/data-display/Table.js +2 -2
  224. package/dist/en-US.js +7 -5
  225. package/dist/feedback/ConfirmAction.js +6 -6
  226. package/dist/feedback/Dialog.js +2 -2
  227. package/dist/feedback/Modal.js +2 -2
  228. package/dist/feedback/NotificationStatusNotice.js +30 -0
  229. package/dist/feedback/NotificationStatusNotice.js.map +1 -0
  230. package/dist/form/AddressAutocomplete.js +6 -6
  231. package/dist/form/Button.js +2 -2
  232. package/dist/form/Calendar.js +3 -3
  233. package/dist/form/CategorySelect.js +2 -2
  234. package/dist/form/CodeEditor.js +2 -2
  235. package/dist/form/DateRangePicker.js +4 -4
  236. package/dist/form/InputOTP.js +2 -2
  237. package/dist/form/Menubar.js +2 -2
  238. package/dist/form/UploadButton.js +2 -2
  239. package/dist/form/total-form.js +10 -10
  240. package/dist/icons.js +2 -2
  241. package/dist/layout/ContentToolbar.js +3 -3
  242. package/dist/layout/ScrollArea.js +1 -1
  243. package/dist/layout/SettingsLayout.js +4 -4
  244. package/dist/locales.js +10 -10
  245. package/dist/navigation/AppHeader.js +12 -12
  246. package/dist/navigation/NavigationMenu.js +4 -4
  247. package/dist/pt-BR.js +7 -5
  248. package/dist/social-login-button.js +4 -4
  249. package/dist/types/components/feedback/NotificationStatusNotice/NotificationStatusNotice.d.ts +13 -0
  250. package/dist/types/components/feedback/NotificationStatusNotice/NotificationStatusNotice.d.ts.map +1 -0
  251. package/dist/types/components/feedback/NotificationStatusNotice/NotificationStatusNotice.helpers.d.ts +28 -0
  252. package/dist/types/components/feedback/NotificationStatusNotice/NotificationStatusNotice.helpers.d.ts.map +1 -0
  253. package/dist/types/components/feedback/NotificationStatusNotice/NotificationStatusNotice.metrics.d.ts +7 -0
  254. package/dist/types/components/feedback/NotificationStatusNotice/NotificationStatusNotice.metrics.d.ts.map +1 -0
  255. package/dist/types/components/feedback/NotificationStatusNotice/NotificationStatusNotice.types.d.ts +64 -0
  256. package/dist/types/components/feedback/NotificationStatusNotice/NotificationStatusNotice.types.d.ts.map +1 -0
  257. package/dist/types/components/feedback/NotificationStatusNotice/index.d.ts +4 -0
  258. package/dist/types/components/feedback/NotificationStatusNotice/index.d.ts.map +1 -0
  259. package/dist/types/components/feedback/index.d.ts +1 -0
  260. package/dist/types/components/feedback/index.d.ts.map +1 -1
  261. package/dist/types/copy/feedback.d.ts +43 -0
  262. package/dist/types/copy/feedback.d.ts.map +1 -1
  263. package/dist/types/en-US.feedback.d.ts +2 -1
  264. package/dist/types/en-US.feedback.d.ts.map +1 -1
  265. package/dist/types/pt-BR.feedback.d.ts +2 -1
  266. package/dist/types/pt-BR.feedback.d.ts.map +1 -1
  267. package/dist/user-avatar.js +8 -8
  268. package/dist/utility/InstallPrompt.js +4 -4
  269. package/package.json +5 -1
  270. package/src/components/feedback/NotificationStatusNotice/NotificationStatusNotice.helpers.ts +80 -0
  271. package/src/components/feedback/NotificationStatusNotice/NotificationStatusNotice.md +106 -0
  272. package/src/components/feedback/NotificationStatusNotice/NotificationStatusNotice.metrics.ts +8 -0
  273. package/src/components/feedback/NotificationStatusNotice/NotificationStatusNotice.tsx +134 -0
  274. package/src/components/feedback/NotificationStatusNotice/NotificationStatusNotice.types.ts +83 -0
  275. package/src/components/feedback/NotificationStatusNotice/index.ts +16 -0
  276. package/src/components/feedback/NotificationStatusNotice/tests.md +24 -0
  277. package/src/components/feedback/NotificationStatusNotice/track.md +34 -0
  278. package/src/components/feedback/index.ts +1 -0
  279. package/src/copy/feedback.ts +28 -0
  280. package/src/en-US.feedback.ts +69 -0
  281. package/src/pt-BR.feedback.ts +69 -0
  282. package/dist/chunk-E5ACI7EA.js +0 -22
  283. package/dist/chunk-E5ACI7EA.js.map +0 -1
  284. package/dist/chunk-IFLZNCAI.js +0 -22
  285. package/dist/chunk-IFLZNCAI.js.map +0 -1
  286. package/dist/chunk-SO2J7ULY.js +0 -1
  287. /package/dist/{chunk-SO2J7ULY.js.map → _internal/components/feedback/NotificationStatusNotice/NotificationStatusNotice.helpers.js.map} +0 -0
  288. /package/dist/{chunk-W5CW7JFZ.js.map → chunk-22ZJH7RY.js.map} +0 -0
  289. /package/dist/{chunk-JRWPI4XF.js.map → chunk-23FCBIUN.js.map} +0 -0
  290. /package/dist/{chunk-HQB5XNK5.js.map → chunk-2UBFDRL7.js.map} +0 -0
  291. /package/dist/{chunk-HS2OJI6L.js.map → chunk-35UG2QDB.js.map} +0 -0
  292. /package/dist/{chunk-4H4Y2SX3.js.map → chunk-3MALHTZQ.js.map} +0 -0
  293. /package/dist/{chunk-PVIAHB7D.js.map → chunk-3XLDTVLC.js.map} +0 -0
  294. /package/dist/{chunk-5UC2RNOY.js.map → chunk-4MXFPDKL.js.map} +0 -0
  295. /package/dist/{chunk-OJCK5RNJ.js.map → chunk-4XVH6IWN.js.map} +0 -0
  296. /package/dist/{chunk-ALAJBLBE.js.map → chunk-554SVTCN.js.map} +0 -0
  297. /package/dist/{chunk-3BPDHWVF.js.map → chunk-57W2C7HY.js.map} +0 -0
  298. /package/dist/{chunk-XGOWREVV.js.map → chunk-57ZSQB5V.js.map} +0 -0
  299. /package/dist/{chunk-P3NRT6GV.js.map → chunk-62NA6IF3.js.map} +0 -0
  300. /package/dist/{chunk-J2K65BQQ.js.map → chunk-6FUOUUYO.js.map} +0 -0
  301. /package/dist/{chunk-MVJYIHPH.js.map → chunk-6IKX5IIX.js.map} +0 -0
  302. /package/dist/{chunk-QGAYEBMU.js.map → chunk-6PKVHFCK.js.map} +0 -0
  303. /package/dist/{chunk-G5ZVD5IJ.js.map → chunk-7AR2R7TV.js.map} +0 -0
  304. /package/dist/{chunk-XBZ43VIV.js.map → chunk-7IKWIWWV.js.map} +0 -0
  305. /package/dist/{chunk-YFY3YVV6.js.map → chunk-7OZBOS75.js.map} +0 -0
  306. /package/dist/{chunk-NGVGTMHT.js.map → chunk-B474PL5O.js.map} +0 -0
  307. /package/dist/{chunk-TX3ZHO5R.js.map → chunk-BEGWE5O4.js.map} +0 -0
  308. /package/dist/{chunk-NGM5XKAS.js.map → chunk-BILJU2DX.js.map} +0 -0
  309. /package/dist/{chunk-GJUIZ5FN.js.map → chunk-BKAB4KZK.js.map} +0 -0
  310. /package/dist/{chunk-HKV4MQ2W.js.map → chunk-BLBOYCOV.js.map} +0 -0
  311. /package/dist/{chunk-NY2Y2SHA.js.map → chunk-CASZGBCA.js.map} +0 -0
  312. /package/dist/{chunk-UN5INW6K.js.map → chunk-CZJLWCEG.js.map} +0 -0
  313. /package/dist/{chunk-WYDGPJ3Z.js.map → chunk-CZPU5TW3.js.map} +0 -0
  314. /package/dist/{chunk-TC3EPGGJ.js.map → chunk-DAPK3ADA.js.map} +0 -0
  315. /package/dist/{chunk-QZBUGUOY.js.map → chunk-DFLTUI7W.js.map} +0 -0
  316. /package/dist/{chunk-PJTSGHTY.js.map → chunk-DQOLW4B5.js.map} +0 -0
  317. /package/dist/{chunk-FR6AJSMT.js.map → chunk-DUWF5LUK.js.map} +0 -0
  318. /package/dist/{chunk-SHDIZSN5.js.map → chunk-EXJBPKGW.js.map} +0 -0
  319. /package/dist/{chunk-MHSTG7FF.js.map → chunk-EZMCWRXO.js.map} +0 -0
  320. /package/dist/{chunk-BYMWW65P.js.map → chunk-FGUK3D54.js.map} +0 -0
  321. /package/dist/{chunk-PCYGUOWJ.js.map → chunk-FLIMEQUA.js.map} +0 -0
  322. /package/dist/{chunk-TEE6HNHS.js.map → chunk-FRW4SYZD.js.map} +0 -0
  323. /package/dist/{chunk-R6SBP5M5.js.map → chunk-GOWBYHYW.js.map} +0 -0
  324. /package/dist/{chunk-THOPGHTY.js.map → chunk-HGJHZ5PE.js.map} +0 -0
  325. /package/dist/{chunk-K4N3V7YE.js.map → chunk-HR7YTBR7.js.map} +0 -0
  326. /package/dist/{chunk-PZEC5CQA.js.map → chunk-HT4B2DJU.js.map} +0 -0
  327. /package/dist/{chunk-EMAX7RPN.js.map → chunk-HZ6L7WXE.js.map} +0 -0
  328. /package/dist/{chunk-BEWD734I.js.map → chunk-I3FXTIKA.js.map} +0 -0
  329. /package/dist/{chunk-JE6RZ5L6.js.map → chunk-IABE56TG.js.map} +0 -0
  330. /package/dist/{chunk-B443IIQG.js.map → chunk-IE7ISTLQ.js.map} +0 -0
  331. /package/dist/{chunk-LKF5KQ2Q.js.map → chunk-IIUB4IOH.js.map} +0 -0
  332. /package/dist/{chunk-2ZRZTGWP.js.map → chunk-ISW5K72V.js.map} +0 -0
  333. /package/dist/{chunk-JOXBCXVL.js.map → chunk-J4W4TQPC.js.map} +0 -0
  334. /package/dist/{chunk-K7DCYV5Q.js.map → chunk-JGV66VUK.js.map} +0 -0
  335. /package/dist/{chunk-QPDDS6DQ.js.map → chunk-JJ3VR7WX.js.map} +0 -0
  336. /package/dist/{chunk-DVE53B2L.js.map → chunk-JQL4GG5L.js.map} +0 -0
  337. /package/dist/{chunk-EZNTM6PT.js.map → chunk-JYF3HT7M.js.map} +0 -0
  338. /package/dist/{chunk-H53YNR23.js.map → chunk-K2EHH7TC.js.map} +0 -0
  339. /package/dist/{chunk-FOKBP6HR.js.map → chunk-K2JH7QPR.js.map} +0 -0
  340. /package/dist/{chunk-VRKS5K4N.js.map → chunk-K5V3KCFI.js.map} +0 -0
  341. /package/dist/{chunk-LSJY4LWZ.js.map → chunk-KFZT3PHA.js.map} +0 -0
  342. /package/dist/{chunk-DVUPIVI2.js.map → chunk-KT6HWAEN.js.map} +0 -0
  343. /package/dist/{chunk-EYC6ERJJ.js.map → chunk-KUJLZFDW.js.map} +0 -0
  344. /package/dist/{chunk-O42ZA3TW.js.map → chunk-MCBG6R5A.js.map} +0 -0
  345. /package/dist/{chunk-MNSW33DU.js.map → chunk-MSS6IU5X.js.map} +0 -0
  346. /package/dist/{chunk-VLHGBFR6.js.map → chunk-MZQTHSLN.js.map} +0 -0
  347. /package/dist/{chunk-XELVDPKL.js.map → chunk-NFAKRI4S.js.map} +0 -0
  348. /package/dist/{chunk-7TZ6OC5T.js.map → chunk-OH3YGJT5.js.map} +0 -0
  349. /package/dist/{chunk-ZTZ6S5Q6.js.map → chunk-OXQP3N6X.js.map} +0 -0
  350. /package/dist/{chunk-XSJWN3WH.js.map → chunk-PMS3H3OO.js.map} +0 -0
  351. /package/dist/{chunk-IQ7WZ3RN.js.map → chunk-Q5NAZ7TW.js.map} +0 -0
  352. /package/dist/{chunk-SOCKK67R.js.map → chunk-QRX5BYUQ.js.map} +0 -0
  353. /package/dist/{chunk-OLZTGVBT.js.map → chunk-REMK55JI.js.map} +0 -0
  354. /package/dist/{chunk-5GMHJ7Y5.js.map → chunk-S2GDYA6R.js.map} +0 -0
  355. /package/dist/{chunk-T7WU7JGC.js.map → chunk-SUTNQG7E.js.map} +0 -0
  356. /package/dist/{chunk-TTW4MAOJ.js.map → chunk-UCTJJYVC.js.map} +0 -0
  357. /package/dist/{chunk-BLT5ZBVL.js.map → chunk-UEJQQVP2.js.map} +0 -0
  358. /package/dist/{chunk-236QP424.js.map → chunk-URVNHKM2.js.map} +0 -0
  359. /package/dist/{chunk-4OSGKO7E.js.map → chunk-UVD5NFRF.js.map} +0 -0
  360. /package/dist/{chunk-TSFFZ3AH.js.map → chunk-VEGT5PAD.js.map} +0 -0
  361. /package/dist/{chunk-UKPZVX3J.js.map → chunk-VJFH2AXT.js.map} +0 -0
  362. /package/dist/{chunk-XXJRT6BP.js.map → chunk-VMXDTCYF.js.map} +0 -0
  363. /package/dist/{chunk-HDNK7BAX.js.map → chunk-VNEEXUWA.js.map} +0 -0
  364. /package/dist/{chunk-XOCLWQON.js.map → chunk-VNGYJXAU.js.map} +0 -0
  365. /package/dist/{chunk-KW7H5O3K.js.map → chunk-WREIYOXN.js.map} +0 -0
  366. /package/dist/{chunk-EPNUVSNK.js.map → chunk-XFUNJYFT.js.map} +0 -0
  367. /package/dist/{chunk-QSKJLMNS.js.map → chunk-Y5UCOBQN.js.map} +0 -0
  368. /package/dist/{chunk-D6HDJVQW.js.map → chunk-YANLN6HP.js.map} +0 -0
  369. /package/dist/{chunk-JVVTSSS4.js.map → chunk-Z52HVR4J.js.map} +0 -0
  370. /package/dist/{chunk-WC3W36AM.js.map → chunk-ZOUWHGV3.js.map} +0 -0
  371. /package/dist/{chunk-M7E66OSC.js.map → chunk-ZPIMPOHV.js.map} +0 -0
  372. /package/dist/{chunk-LCXXPIG3.js.map → chunk-ZWIDQEJ4.js.map} +0 -0
  373. /package/dist/{chunk-MRMNVGNX.js.map → chunk-ZYKDPX3W.js.map} +0 -0
@@ -1,4 +1,7 @@
1
1
  import "../chunk-5CUKSNWG.js";
2
+ import {
3
+ AppHeaderDetails
4
+ } from "../chunk-62NA6IF3.js";
2
5
  import {
3
6
  AppHeader,
4
7
  AppHeader_default
@@ -15,25 +18,22 @@ import {
15
18
  highlightOf,
16
19
  initialsOf
17
20
  } from "../chunk-IQU4HKND.js";
18
- import {
19
- AppHeaderDetails
20
- } from "../chunk-P3NRT6GV.js";
21
- import "../chunk-PCYGUOWJ.js";
22
- import "../chunk-OLZTGVBT.js";
23
- import "../chunk-CRN4KKNI.js";
21
+ import "../chunk-FLIMEQUA.js";
24
22
  import "../chunk-JBMBFYFA.js";
25
- import "../chunk-U437KFDI.js";
26
23
  import "../chunk-7MR2JCJW.js";
24
+ import "../chunk-U437KFDI.js";
25
+ import "../chunk-REMK55JI.js";
27
26
  import "../chunk-F52N6ACD.js";
28
- import "../chunk-D6HDJVQW.js";
29
- import "../chunk-GYXUCS37.js";
27
+ import "../chunk-CRN4KKNI.js";
28
+ import "../chunk-YANLN6HP.js";
30
29
  import "../chunk-5KEMPCW4.js";
31
30
  import "../chunk-VM3HRSAU.js";
32
- import "../chunk-GJUIZ5FN.js";
31
+ import "../chunk-GYXUCS37.js";
32
+ import "../chunk-73BEVJCS.js";
33
+ import "../chunk-BKAB4KZK.js";
34
+ import "../chunk-TAMIZE4Q.js";
33
35
  import "../chunk-TSEWUY4V.js";
34
36
  import "../chunk-5LQ7PKMW.js";
35
- import "../chunk-TAMIZE4Q.js";
36
- import "../chunk-73BEVJCS.js";
37
37
  import "../chunk-TYJR4GOF.js";
38
38
  import "../chunk-AKZWDZCZ.js";
39
39
  import "../chunk-HPK33ACY.js";
@@ -1,12 +1,12 @@
1
1
  import "../chunk-I53WONUS.js";
2
2
  import {
3
3
  NavigationMenu
4
- } from "../chunk-HDNK7BAX.js";
5
- import "../chunk-BLT5ZBVL.js";
6
- import "../chunk-G5ZVD5IJ.js";
7
- import "../chunk-Q444G5X7.js";
4
+ } from "../chunk-VNEEXUWA.js";
5
+ import "../chunk-UEJQQVP2.js";
6
+ import "../chunk-7AR2R7TV.js";
8
7
  import "../chunk-RXSGHPCR.js";
9
8
  import "../chunk-3L5OZCGA.js";
9
+ import "../chunk-Q444G5X7.js";
10
10
  import "../chunk-FYLCSCMR.js";
11
11
  import "../chunk-PZ5AY32C.js";
12
12
  export {
package/dist/pt-BR.js CHANGED
@@ -1,4 +1,8 @@
1
1
  import "./chunk-BWZKLKDT.js";
2
+ import {
3
+ PT_BR_BREADCRUMB_COPY,
4
+ PT_BR_COMMAND_PALETTE_COPY
5
+ } from "./chunk-62OGPVCL.js";
2
6
  import {
3
7
  PT_BR_ADDRESS_AUTOCOMPLETE_COPY,
4
8
  PT_BR_AUTOCOMPLETE_COPY,
@@ -11,8 +15,9 @@ import {
11
15
  } from "./chunk-YLSDFW5O.js";
12
16
  import {
13
17
  PT_BR_CHROME_COPY,
18
+ PT_BR_NOTIFICATION_UNBLOCK_COPY,
14
19
  PT_BR_TUTORIAL_COPY
15
- } from "./chunk-IFLZNCAI.js";
20
+ } from "./chunk-3MEIGSDK.js";
16
21
  import {
17
22
  PT_BR_CAROUSEL_COPY,
18
23
  PT_BR_DATA_STATE_COPY,
@@ -35,10 +40,6 @@ import {
35
40
  PT_BR_SAVED_VIEWS_LABELS,
36
41
  PT_BR_SECTION_ONBOARDING_COPY
37
42
  } from "./chunk-WUE5EK42.js";
38
- import {
39
- PT_BR_BREADCRUMB_COPY,
40
- PT_BR_COMMAND_PALETTE_COPY
41
- } from "./chunk-62OGPVCL.js";
42
43
  import "./chunk-PZ5AY32C.js";
43
44
  export {
44
45
  PT_BR_ADDRESS_AUTOCOMPLETE_COPY,
@@ -56,6 +57,7 @@ export {
56
57
  PT_BR_INSTALL_PROMPT_COPY,
57
58
  PT_BR_LIGHTBOX_COPY,
58
59
  PT_BR_MAP_PREVIEW_COPY,
60
+ PT_BR_NOTIFICATION_UNBLOCK_COPY,
59
61
  PT_BR_PASSWORD_STRENGTH_COPY,
60
62
  PT_BR_PHONE_INPUT_COPY,
61
63
  PT_BR_RICH_EDITOR_TOOLBAR_COPY,
@@ -4,7 +4,7 @@ import {
4
4
  GoogleIcon,
5
5
  SocialLoginButton,
6
6
  SocialLoginContainer
7
- } from "./chunk-T7WU7JGC.js";
7
+ } from "./chunk-SUTNQG7E.js";
8
8
  import "./chunk-INGPH3YQ.js";
9
9
  import "./chunk-6GP2DOOO.js";
10
10
  import "./chunk-SLMA4UQS.js";
@@ -20,11 +20,11 @@ import "./chunk-FKUYRQSP.js";
20
20
  import "./chunk-BEBLRL5D.js";
21
21
  import "./chunk-6Q6T3FW5.js";
22
22
  import "./chunk-BA4RHQ3B.js";
23
- import "./chunk-GJUIZ5FN.js";
23
+ import "./chunk-73BEVJCS.js";
24
+ import "./chunk-BKAB4KZK.js";
25
+ import "./chunk-TAMIZE4Q.js";
24
26
  import "./chunk-TSEWUY4V.js";
25
27
  import "./chunk-5LQ7PKMW.js";
26
- import "./chunk-TAMIZE4Q.js";
27
- import "./chunk-73BEVJCS.js";
28
28
  import "./chunk-YTYROOLY.js";
29
29
  import "./chunk-EPRA5QLB.js";
30
30
  import "./chunk-TYJR4GOF.js";
@@ -0,0 +1,13 @@
1
+ import React from 'react';
2
+ import type { NotificationStatusNoticeProps } from './NotificationStatusNotice.types';
3
+ /**
4
+ * Tells a reader whether this browser will notify them, and gives them the one
5
+ * thing they can do about it: a tap that asks (`disabled`), the steps that
6
+ * undo a refusal (`blocked`), or nothing when nothing can change (`enabled`,
7
+ * `unavailable`).
8
+ *
9
+ * Every word is the host's. The component decides only the shape and how loud
10
+ * each status is — see `NOTICE_VARIANT`.
11
+ */
12
+ export declare const NotificationStatusNotice: React.ForwardRefExoticComponent<NotificationStatusNoticeProps & React.RefAttributes<HTMLDivElement>>;
13
+ //# sourceMappingURL=NotificationStatusNotice.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NotificationStatusNotice.d.ts","sourceRoot":"","sources":["../../../../../src/components/feedback/NotificationStatusNotice/NotificationStatusNotice.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAU1B,OAAO,KAAK,EAGV,6BAA6B,EAC9B,MAAM,kCAAkC,CAAC;AAkF1C;;;;;;;;GAQG;AACH,eAAO,MAAM,wBAAwB,sGAwBnC,CAAC"}
@@ -0,0 +1,28 @@
1
+ import type { NotificationUnblockCopy } from '../../../copy';
2
+ import type { AlertVariant } from '../../data-display/Alert/Alert.types';
3
+ import type { NotificationBrowser, NotificationStatus } from './NotificationStatusNotice.types';
4
+ /**
5
+ * How loud each status is.
6
+ *
7
+ * `disabled` and `blocked` are warnings because the reader can do something
8
+ * about them and will miss something if they do not. `unavailable` is only
9
+ * information: there is nothing to act on, and painting it amber would ask the
10
+ * reader to fix what they cannot.
11
+ */
12
+ export declare const NOTICE_VARIANT: Record<NotificationStatus, AlertVariant>;
13
+ /**
14
+ * Which browser, on which platform, the reader is using — enough to pick the
15
+ * steps that lift a notification block there. Pure: pass
16
+ * `navigator.userAgent` and `navigator.maxTouchPoints`.
17
+ */
18
+ export declare const detectNotificationBrowser: (userAgent: string, maxTouchPoints?: number) => NotificationBrowser;
19
+ /**
20
+ * The steps that lift a notification block in `browser`, from a
21
+ * `NotificationUnblockCopy` pack (`PT_BR_NOTIFICATION_UNBLOCK_COPY`, …).
22
+ *
23
+ * Every iOS browser shares one list — the switch is in the device's Settings,
24
+ * whichever browser installed the app — and a family or platform the pack does
25
+ * not name falls back to its general `other` steps.
26
+ */
27
+ export declare const notificationUnblockSteps: (copy: NotificationUnblockCopy, browser: NotificationBrowser) => readonly string[];
28
+ //# sourceMappingURL=NotificationStatusNotice.helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NotificationStatusNotice.helpers.d.ts","sourceRoot":"","sources":["../../../../../src/components/feedback/NotificationStatusNotice/NotificationStatusNotice.helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAC;AAEzE,OAAO,KAAK,EACV,mBAAmB,EAGnB,kBAAkB,EACnB,MAAM,kCAAkC,CAAC;AAE1C;;;;;;;GAOG;AACH,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,kBAAkB,EAAE,YAAY,CAKnE,CAAC;AA2BF;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,GACpC,WAAW,MAAM,EACjB,uBAAkB,KACjB,mBAGD,CAAC;AAEH;;;;;;;GAOG;AACH,eAAO,MAAM,wBAAwB,GACnC,MAAM,uBAAuB,EAC7B,SAAS,mBAAmB,KAC3B,SAAS,MAAM,EAKjB,CAAC"}
@@ -0,0 +1,7 @@
1
+ /** Theme spacing units between the message and its action. */
2
+ export declare const NOTICE_ACTION_GAP_UNITS = 1;
3
+ /** Theme spacing units the numbered steps are indented by. */
4
+ export declare const NOTICE_STEPS_INDENT_UNITS = 2.5;
5
+ /** Theme spacing units between two steps. */
6
+ export declare const NOTICE_STEP_GAP_UNITS = 0.5;
7
+ //# sourceMappingURL=NotificationStatusNotice.metrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NotificationStatusNotice.metrics.d.ts","sourceRoot":"","sources":["../../../../../src/components/feedback/NotificationStatusNotice/NotificationStatusNotice.metrics.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,eAAO,MAAM,uBAAuB,IAAI,CAAC;AAEzC,8DAA8D;AAC9D,eAAO,MAAM,yBAAyB,MAAM,CAAC;AAE7C,6CAA6C;AAC7C,eAAO,MAAM,qBAAqB,MAAM,CAAC"}
@@ -0,0 +1,64 @@
1
+ import type { SxProps, Theme } from '@mui/material/styles/index.js';
2
+ /**
3
+ * Where a reader stands with this browser's notifications.
4
+ *
5
+ * - `enabled` — they will be notified here.
6
+ * - `disabled` — they are not, and this page CAN ask: one tap raises the
7
+ * browser's own permission prompt.
8
+ * - `blocked` — they are not, and this page can NOT ask: the browser refused
9
+ * once and only the reader can undo that, in the browser's own settings.
10
+ * - `unavailable` — they are not, and nothing will change it here: the browser
11
+ * has no web push, or the host cannot send it.
12
+ */
13
+ export type NotificationStatus = 'enabled' | 'disabled' | 'blocked' | 'unavailable';
14
+ interface NotificationStatusNoticeCommon {
15
+ /** The one sentence that states the reader's situation. */
16
+ title: string;
17
+ /** What that situation means for them — e.g. what they will miss. */
18
+ description?: string;
19
+ /** Test id of the root; parts derive from it (`-enable`, `-steps`, …). */
20
+ dataTestId?: string;
21
+ className?: string;
22
+ sx?: SxProps<Theme>;
23
+ }
24
+ export interface EnabledNoticeProps extends NotificationStatusNoticeCommon {
25
+ status: 'enabled';
26
+ }
27
+ export interface DisabledNoticeProps extends NotificationStatusNoticeCommon {
28
+ status: 'disabled';
29
+ /** The action's label, e.g. "Turn on notifications". */
30
+ enableLabel: string;
31
+ /**
32
+ * Ask for the permission. Call the browser's `requestPermission` from HERE:
33
+ * a browser only shows its prompt inside a user gesture.
34
+ */
35
+ onEnable: () => void;
36
+ /** The request is in flight — the action shows a spinner and cannot be pressed twice. */
37
+ pending?: boolean;
38
+ }
39
+ export interface BlockedNoticeProps extends NotificationStatusNoticeCommon {
40
+ status: 'blocked';
41
+ /** The disclosure's label, e.g. "Turn them back on". */
42
+ stepsToggleLabel: string;
43
+ /**
44
+ * How to lift the block in THIS reader's browser, one step per entry, in
45
+ * order. The host picks them — `detectNotificationBrowser` says which
46
+ * browser it is looking at — because the words are the host's.
47
+ */
48
+ steps: readonly string[];
49
+ /** Start with the steps showing. Defaults to collapsed. */
50
+ defaultStepsOpen?: boolean;
51
+ }
52
+ export interface UnavailableNoticeProps extends NotificationStatusNoticeCommon {
53
+ status: 'unavailable';
54
+ }
55
+ export type NotificationStatusNoticeProps = EnabledNoticeProps | DisabledNoticeProps | BlockedNoticeProps | UnavailableNoticeProps;
56
+ /** The browser families whose permission settings differ enough to need their own steps. */
57
+ export type NotificationBrowserFamily = 'chrome' | 'edge' | 'firefox' | 'safari' | 'samsung' | 'opera' | 'other';
58
+ export type NotificationPlatform = 'ios' | 'android' | 'desktop';
59
+ export interface NotificationBrowser {
60
+ family: NotificationBrowserFamily;
61
+ platform: NotificationPlatform;
62
+ }
63
+ export {};
64
+ //# sourceMappingURL=NotificationStatusNotice.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NotificationStatusNotice.types.d.ts","sourceRoot":"","sources":["../../../../../src/components/feedback/NotificationStatusNotice/NotificationStatusNotice.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,+BAA+B,CAAC;AAEpE;;;;;;;;;;GAUG;AACH,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,aAAa,CAAC;AAEpF,UAAU,8BAA8B;IACtC,2DAA2D;IAC3D,KAAK,EAAE,MAAM,CAAC;IACd,qEAAqE;IACrE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0EAA0E;IAC1E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,EAAE,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;CACrB;AAED,MAAM,WAAW,kBAAmB,SAAQ,8BAA8B;IACxE,MAAM,EAAE,SAAS,CAAC;CACnB;AAED,MAAM,WAAW,mBAAoB,SAAQ,8BAA8B;IACzE,MAAM,EAAE,UAAU,CAAC;IACnB,wDAAwD;IACxD,WAAW,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,yFAAyF;IACzF,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,kBAAmB,SAAQ,8BAA8B;IACxE,MAAM,EAAE,SAAS,CAAC;IAClB,wDAAwD;IACxD,gBAAgB,EAAE,MAAM,CAAC;IACzB;;;;OAIG;IACH,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,2DAA2D;IAC3D,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,sBAAuB,SAAQ,8BAA8B;IAC5E,MAAM,EAAE,aAAa,CAAC;CACvB;AAED,MAAM,MAAM,6BAA6B,GACrC,kBAAkB,GAClB,mBAAmB,GACnB,kBAAkB,GAClB,sBAAsB,CAAC;AAE3B,4FAA4F;AAC5F,MAAM,MAAM,yBAAyB,GACjC,QAAQ,GACR,MAAM,GACN,SAAS,GACT,QAAQ,GACR,SAAS,GACT,OAAO,GACP,OAAO,CAAC;AAEZ,MAAM,MAAM,oBAAoB,GAAG,KAAK,GAAG,SAAS,GAAG,SAAS,CAAC;AAEjE,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,yBAAyB,CAAC;IAClC,QAAQ,EAAE,oBAAoB,CAAC;CAChC"}
@@ -0,0 +1,4 @@
1
+ export { NotificationStatusNotice } from './NotificationStatusNotice';
2
+ export { detectNotificationBrowser, notificationUnblockSteps, } from './NotificationStatusNotice.helpers';
3
+ export type { BlockedNoticeProps, DisabledNoticeProps, EnabledNoticeProps, NotificationBrowser, NotificationBrowserFamily, NotificationPlatform, NotificationStatus, NotificationStatusNoticeProps, UnavailableNoticeProps, } from './NotificationStatusNotice.types';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/feedback/NotificationStatusNotice/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EACL,yBAAyB,EACzB,wBAAwB,GACzB,MAAM,oCAAoC,CAAC;AAC5C,YAAY,EACV,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,mBAAmB,EACnB,yBAAyB,EACzB,oBAAoB,EACpB,kBAAkB,EAClB,6BAA6B,EAC7B,sBAAsB,GACvB,MAAM,kCAAkC,CAAC"}
@@ -1,6 +1,7 @@
1
1
  export * from './ConfirmAction';
2
2
  export * from './Dialog';
3
3
  export * from './Modal';
4
+ export * from './NotificationStatusNotice';
4
5
  export * from './Sonner';
5
6
  export * from './StackedModal';
6
7
  export * from './Toast';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/feedback/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,SAAS,CAAC;AACxB,cAAc,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/feedback/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,4BAA4B,CAAC;AAC3C,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,SAAS,CAAC;AACxB,cAAc,mBAAmB,CAAC"}
@@ -35,4 +35,47 @@ export interface ChromeCopy {
35
35
  /** The share affordance in the install prompt. */
36
36
  share: string;
37
37
  }
38
+ /** One ordered list of steps a reader follows in their browser. */
39
+ type Steps = readonly string[];
40
+ /**
41
+ * How to lift a notification block, per browser — the steps
42
+ * `NotificationStatusNotice` shows in its `blocked` state.
43
+ *
44
+ * Keyed the way `detectNotificationBrowser` answers, and read through
45
+ * `notificationUnblockSteps`, which falls back to `other` for anything a pack
46
+ * does not name. Menu labels move between browser versions; these follow the
47
+ * current ones and say where to look rather than promising an exact word.
48
+ */
49
+ export interface NotificationUnblockCopy {
50
+ /**
51
+ * Every browser on iOS. Web push there belongs to a Home Screen app, so the
52
+ * switch lives in the device's Settings rather than in any browser.
53
+ */
54
+ ios: Steps;
55
+ chrome: {
56
+ desktop: Steps;
57
+ android: Steps;
58
+ };
59
+ edge: {
60
+ desktop: Steps;
61
+ android: Steps;
62
+ };
63
+ firefox: {
64
+ desktop: Steps;
65
+ android: Steps;
66
+ };
67
+ opera: {
68
+ desktop: Steps;
69
+ android: Steps;
70
+ };
71
+ safari: {
72
+ desktop: Steps;
73
+ };
74
+ samsung: {
75
+ android: Steps;
76
+ };
77
+ /** Anything unrecognised — general enough to be true everywhere. */
78
+ other: Steps;
79
+ }
80
+ export {};
38
81
  //# sourceMappingURL=feedback.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"feedback.d.ts","sourceRoot":"","sources":["../../../src/copy/feedback.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;;;;GAOG;AACH,6EAA6E;AAC7E,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,8EAA8E;AAC9E,MAAM,WAAW,UAAU;IACzB,oEAAoE;IACpE,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,8CAA8C;IAC9C,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,wEAAwE;IACxE,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,kDAAkD;IAClD,KAAK,EAAE,MAAM,CAAC;CACf"}
1
+ {"version":3,"file":"feedback.d.ts","sourceRoot":"","sources":["../../../src/copy/feedback.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;;;;GAOG;AACH,6EAA6E;AAC7E,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,8EAA8E;AAC9E,MAAM,WAAW,UAAU;IACzB,oEAAoE;IACpE,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,8CAA8C;IAC9C,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,wEAAwE;IACxE,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,kDAAkD;IAClD,KAAK,EAAE,MAAM,CAAC;CACf;AAED,mEAAmE;AACnE,KAAK,KAAK,GAAG,SAAS,MAAM,EAAE,CAAC;AAE/B;;;;;;;;GAQG;AACH,MAAM,WAAW,uBAAuB;IACtC;;;OAGG;IACH,GAAG,EAAE,KAAK,CAAC;IACX,MAAM,EAAE;QAAE,OAAO,EAAE,KAAK,CAAC;QAAC,OAAO,EAAE,KAAK,CAAA;KAAE,CAAC;IAC3C,IAAI,EAAE;QAAE,OAAO,EAAE,KAAK,CAAC;QAAC,OAAO,EAAE,KAAK,CAAA;KAAE,CAAC;IACzC,OAAO,EAAE;QAAE,OAAO,EAAE,KAAK,CAAC;QAAC,OAAO,EAAE,KAAK,CAAA;KAAE,CAAC;IAC5C,KAAK,EAAE;QAAE,OAAO,EAAE,KAAK,CAAC;QAAC,OAAO,EAAE,KAAK,CAAA;KAAE,CAAC;IAC1C,MAAM,EAAE;QAAE,OAAO,EAAE,KAAK,CAAA;KAAE,CAAC;IAC3B,OAAO,EAAE;QAAE,OAAO,EAAE,KAAK,CAAA;KAAE,CAAC;IAC5B,oEAAoE;IACpE,KAAK,EAAE,KAAK,CAAC;CACd"}
@@ -2,7 +2,8 @@
2
2
  * The en-US pack for the feedback family. Split the same way
3
3
  * `pt-BR.feedback.ts` is — see `en-US.ts` for why.
4
4
  */
5
- import type { ChromeCopy, TutorialCopy } from './copy';
5
+ import type { ChromeCopy, NotificationUnblockCopy, TutorialCopy } from './copy';
6
6
  export declare const EN_US_TUTORIAL_COPY: TutorialCopy;
7
7
  export declare const EN_US_CHROME_COPY: ChromeCopy;
8
+ export declare const EN_US_NOTIFICATION_UNBLOCK_COPY: NotificationUnblockCopy;
8
9
  //# sourceMappingURL=en-US.feedback.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"en-US.feedback.d.ts","sourceRoot":"","sources":["../../src/en-US.feedback.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EACV,UAAU,EACV,YAAY,EACb,MAAM,QAAQ,CAAC;AAEhB,eAAO,MAAM,mBAAmB,EAAE,YAKjC,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,UAQ/B,CAAC"}
1
+ {"version":3,"file":"en-US.feedback.d.ts","sourceRoot":"","sources":["../../src/en-US.feedback.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EACV,UAAU,EACV,uBAAuB,EACvB,YAAY,EACb,MAAM,QAAQ,CAAC;AAEhB,eAAO,MAAM,mBAAmB,EAAE,YAKjC,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,UAQ/B,CAAC;AAgBF,eAAO,MAAM,+BAA+B,EAAE,uBAoD7C,CAAC"}
@@ -2,7 +2,8 @@
2
2
  * The pt-BR pack for the feedback family. Split out of `pt-BR.ts`, which is a
3
3
  * barrel over this folder — see that file for why.
4
4
  */
5
- import type { ChromeCopy, TutorialCopy } from './copy';
5
+ import type { ChromeCopy, NotificationUnblockCopy, TutorialCopy } from './copy';
6
6
  export declare const PT_BR_TUTORIAL_COPY: TutorialCopy;
7
7
  export declare const PT_BR_CHROME_COPY: ChromeCopy;
8
+ export declare const PT_BR_NOTIFICATION_UNBLOCK_COPY: NotificationUnblockCopy;
8
9
  //# sourceMappingURL=pt-BR.feedback.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"pt-BR.feedback.d.ts","sourceRoot":"","sources":["../../src/pt-BR.feedback.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EACV,UAAU,EACV,YAAY,EACb,MAAM,QAAQ,CAAC;AAEhB,eAAO,MAAM,mBAAmB,EAAE,YAKjC,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,UAQ/B,CAAC"}
1
+ {"version":3,"file":"pt-BR.feedback.d.ts","sourceRoot":"","sources":["../../src/pt-BR.feedback.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EACV,UAAU,EACV,uBAAuB,EACvB,YAAY,EACb,MAAM,QAAQ,CAAC;AAEhB,eAAO,MAAM,mBAAmB,EAAE,YAKjC,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,UAQ/B,CAAC;AAgBF,eAAO,MAAM,+BAA+B,EAAE,uBAoD7C,CAAC"}
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  UserAvatar,
3
3
  UserMenu
4
- } from "./chunk-ALAJBLBE.js";
4
+ } from "./chunk-554SVTCN.js";
5
5
  import "./chunk-UDQSIRAP.js";
6
- import "./chunk-THOPGHTY.js";
7
- import "./chunk-3ZVUNSFF.js";
8
- import "./chunk-HS2OJI6L.js";
9
- import "./chunk-FAITHWIO.js";
6
+ import "./chunk-HGJHZ5PE.js";
7
+ import "./chunk-35UG2QDB.js";
10
8
  import "./chunk-XRMZMBE3.js";
9
+ import "./chunk-FAITHWIO.js";
10
+ import "./chunk-3ZVUNSFF.js";
11
11
  import "./chunk-VUHLNYAE.js";
12
12
  import "./chunk-2GSIEDGN.js";
13
13
  import "./chunk-AVI3XHRQ.js";
@@ -15,11 +15,11 @@ import "./chunk-FKUYRQSP.js";
15
15
  import "./chunk-BEBLRL5D.js";
16
16
  import "./chunk-6Q6T3FW5.js";
17
17
  import "./chunk-BA4RHQ3B.js";
18
- import "./chunk-GJUIZ5FN.js";
18
+ import "./chunk-73BEVJCS.js";
19
+ import "./chunk-BKAB4KZK.js";
20
+ import "./chunk-TAMIZE4Q.js";
19
21
  import "./chunk-TSEWUY4V.js";
20
22
  import "./chunk-5LQ7PKMW.js";
21
- import "./chunk-TAMIZE4Q.js";
22
- import "./chunk-73BEVJCS.js";
23
23
  import "./chunk-YTYROOLY.js";
24
24
  import "./chunk-EPRA5QLB.js";
25
25
  import "./chunk-TYJR4GOF.js";
@@ -1,12 +1,10 @@
1
1
  import "../chunk-3QQVEYOR.js";
2
2
  import {
3
3
  InstallPrompt
4
- } from "../chunk-JE6RZ5L6.js";
4
+ } from "../chunk-IABE56TG.js";
5
5
  import {
6
6
  usePwaInstall
7
- } from "../chunk-5GMHJ7Y5.js";
8
- import "../chunk-GY62N32G.js";
9
- import "../chunk-WXYLH3QZ.js";
7
+ } from "../chunk-S2GDYA6R.js";
10
8
  import {
11
9
  PWA_INSTALL_AVAILABLE_EVENT,
12
10
  PWA_INSTALL_STASH_KEY,
@@ -14,6 +12,8 @@ import {
14
12
  readPwaInstallStash,
15
13
  resetPwaInstallStash
16
14
  } from "../chunk-UUL44SUX.js";
15
+ import "../chunk-GY62N32G.js";
16
+ import "../chunk-WXYLH3QZ.js";
17
17
  import "../chunk-PZ5AY32C.js";
18
18
  export {
19
19
  InstallPrompt,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@12-apps/ui",
3
- "version": "6.29.1",
3
+ "version": "6.30.0",
4
4
  "license": "MIT",
5
5
  "packageManager": "pnpm@10.34.5",
6
6
  "type": "module",
@@ -312,6 +312,10 @@
312
312
  "types": "./dist/types/components/feedback/Modal/index.d.ts",
313
313
  "default": "./dist/feedback/Modal.js"
314
314
  },
315
+ "./feedback/NotificationStatusNotice": {
316
+ "types": "./dist/types/components/feedback/NotificationStatusNotice/index.d.ts",
317
+ "default": "./dist/feedback/NotificationStatusNotice.js"
318
+ },
315
319
  "./feedback/Sonner": {
316
320
  "types": "./dist/types/components/feedback/Sonner/index.d.ts",
317
321
  "default": "./dist/feedback/Sonner.js"
@@ -0,0 +1,80 @@
1
+ import type { NotificationUnblockCopy } from '../../../copy';
2
+ import type { AlertVariant } from '../../data-display/Alert/Alert.types';
3
+
4
+ import type {
5
+ NotificationBrowser,
6
+ NotificationBrowserFamily,
7
+ NotificationPlatform,
8
+ NotificationStatus,
9
+ } from './NotificationStatusNotice.types';
10
+
11
+ /**
12
+ * How loud each status is.
13
+ *
14
+ * `disabled` and `blocked` are warnings because the reader can do something
15
+ * about them and will miss something if they do not. `unavailable` is only
16
+ * information: there is nothing to act on, and painting it amber would ask the
17
+ * reader to fix what they cannot.
18
+ */
19
+ export const NOTICE_VARIANT: Record<NotificationStatus, AlertVariant> = {
20
+ enabled: 'success',
21
+ disabled: 'warning',
22
+ blocked: 'warning',
23
+ unavailable: 'info',
24
+ };
25
+
26
+ const platformOf = (userAgent: string, maxTouchPoints: number): NotificationPlatform => {
27
+ if (/iphone|ipad|ipod/i.test(userAgent)) return 'ios';
28
+ // iPadOS asks for the desktop site and reports itself as a Mac; the touch
29
+ // points are what give it away.
30
+ if (/macintosh/i.test(userAgent) && maxTouchPoints > 1) return 'ios';
31
+ if (/android/i.test(userAgent)) return 'android';
32
+ return 'desktop';
33
+ };
34
+
35
+ /**
36
+ * Ordered most-specific first: every Chromium browser also says `Chrome`, and
37
+ * every browser on iOS also says `Safari`.
38
+ */
39
+ const FAMILY_PATTERNS: ReadonlyArray<readonly [NotificationBrowserFamily, RegExp]> = [
40
+ ['samsung', /samsungbrowser/i],
41
+ ['edge', /edg(e|a|ios)?\//i],
42
+ ['opera', /opr\/|opera|opt\//i],
43
+ ['firefox', /firefox\/|fxios\//i],
44
+ ['chrome', /chrome\/|crios\//i],
45
+ ['safari', /safari\//i],
46
+ ];
47
+
48
+ const familyOf = (userAgent: string): NotificationBrowserFamily =>
49
+ FAMILY_PATTERNS.find(([, pattern]) => pattern.test(userAgent))?.[0] ?? 'other';
50
+
51
+ /**
52
+ * Which browser, on which platform, the reader is using — enough to pick the
53
+ * steps that lift a notification block there. Pure: pass
54
+ * `navigator.userAgent` and `navigator.maxTouchPoints`.
55
+ */
56
+ export const detectNotificationBrowser = (
57
+ userAgent: string,
58
+ maxTouchPoints = 0,
59
+ ): NotificationBrowser => ({
60
+ family: familyOf(userAgent),
61
+ platform: platformOf(userAgent, maxTouchPoints),
62
+ });
63
+
64
+ /**
65
+ * The steps that lift a notification block in `browser`, from a
66
+ * `NotificationUnblockCopy` pack (`PT_BR_NOTIFICATION_UNBLOCK_COPY`, …).
67
+ *
68
+ * Every iOS browser shares one list — the switch is in the device's Settings,
69
+ * whichever browser installed the app — and a family or platform the pack does
70
+ * not name falls back to its general `other` steps.
71
+ */
72
+ export const notificationUnblockSteps = (
73
+ copy: NotificationUnblockCopy,
74
+ browser: NotificationBrowser,
75
+ ): readonly string[] => {
76
+ if (browser.platform === 'ios') return copy.ios;
77
+ if (browser.family === 'other') return copy.other;
78
+ const byPlatform: Partial<Record<NotificationPlatform, readonly string[]>> = copy[browser.family];
79
+ return byPlatform[browser.platform] ?? copy.other;
80
+ };
@@ -0,0 +1,106 @@
1
+ # NotificationStatusNotice
2
+
3
+ Tells a reader whether **this browser** will notify them, and offers the one
4
+ thing they can do about it.
5
+
6
+ | `status` | what it means | what it offers |
7
+ |---|---|---|
8
+ | `enabled` | they will be notified here | nothing |
9
+ | `disabled` | they will not, and this page can ask | an action that calls `onEnable` |
10
+ | `blocked` | they will not, and the browser refused once | a "turn back on" disclosure over the steps for **their** browser |
11
+ | `unavailable` | they will not, and nothing here can change it | nothing |
12
+
13
+ Use it wherever a promise depends on web push — "we will call you when your
14
+ table is ready" — so a reader is never left believing a notification is coming
15
+ that cannot arrive.
16
+
17
+ ## Import
18
+
19
+ ```ts
20
+ import {
21
+ NotificationStatusNotice,
22
+ detectNotificationBrowser,
23
+ notificationUnblockSteps,
24
+ } from '@12-apps/ui/feedback/NotificationStatusNotice';
25
+ import { PT_BR_NOTIFICATION_UNBLOCK_COPY } from '@12-apps/ui/pt-BR';
26
+ ```
27
+
28
+ ## Usage
29
+
30
+ The component owns no words. Map your own permission state onto `status`, and
31
+ pass the sentences:
32
+
33
+ ```tsx
34
+ const browser = detectNotificationBrowser(navigator.userAgent, navigator.maxTouchPoints);
35
+
36
+ switch (pushState) {
37
+ case 'offer':
38
+ return (
39
+ <NotificationStatusNotice
40
+ status="disabled"
41
+ title="Suas notificações estão desligadas."
42
+ description="Sem elas, a gente não consegue te avisar no celular."
43
+ enableLabel="Ligar notificações"
44
+ onEnable={requestPermission} // raise the browser prompt HERE — it needs a gesture
45
+ pending={asking}
46
+ />
47
+ );
48
+ case 'blocked':
49
+ return (
50
+ <NotificationStatusNotice
51
+ status="blocked"
52
+ title="As notificações estão bloqueadas neste navegador."
53
+ stepsToggleLabel="Habilitar novamente"
54
+ steps={notificationUnblockSteps(PT_BR_NOTIFICATION_UNBLOCK_COPY, browser)}
55
+ />
56
+ );
57
+ // …
58
+ }
59
+ ```
60
+
61
+ ## Props
62
+
63
+ Common to every status:
64
+
65
+ | prop | type | |
66
+ |---|---|---|
67
+ | `status` | `'enabled' \| 'disabled' \| 'blocked' \| 'unavailable'` | required; picks the shape below |
68
+ | `title` | `string` | required; the reader's situation in one sentence |
69
+ | `description` | `string` | what that means for them |
70
+ | `dataTestId` | `string` | root test id (default `notification-status-notice`); parts append `-enable`, `-steps-toggle`, `-steps` |
71
+ | `className`, `sx` | | forwarded to the root `Alert` |
72
+
73
+ `disabled` adds `enableLabel`, `onEnable` and `pending` (spinner, and the action
74
+ cannot be pressed twice). `blocked` adds `stepsToggleLabel`, `steps` (ordered)
75
+ and `defaultStepsOpen`.
76
+
77
+ ## The unblock steps
78
+
79
+ A web page cannot re-ask after a refusal — `Notification.requestPermission()`
80
+ resolves `denied` at once — so the only way back is the browser's own settings,
81
+ and those differ per browser. `NotificationUnblockCopy` holds one ordered list
82
+ per family and platform, shipped in pt-BR and en-US:
83
+
84
+ - `detectNotificationBrowser(userAgent, maxTouchPoints)` answers
85
+ `{ family, platform }` — Chrome, Edge, Firefox, Safari, Samsung Internet,
86
+ Opera, or `other`; on `ios`, `android` or `desktop`. Most specific first:
87
+ every Chromium browser also says `Chrome`, every iOS browser also says
88
+ `Safari`, and an iPad asking for the desktop site says `Macintosh`.
89
+ - `notificationUnblockSteps(copy, browser)` picks the list. Every iOS browser
90
+ shares one list (web push there belongs to a Home Screen app, switched in the
91
+ device's Settings); a family/platform the pack does not name falls back to
92
+ `other`.
93
+
94
+ Menu labels move between browser versions. The packs follow the current ones
95
+ and say where to look; a host that needs different words passes its own
96
+ `NotificationUnblockCopy`.
97
+
98
+ ## Accessibility
99
+
100
+ - The root is a **polite** live region (`role="status"`): a change of status is
101
+ announced without interrupting what the screen reader was saying.
102
+ - The steps sit behind a real `button` with `aria-expanded` and `aria-controls`;
103
+ the list is an `<ol>`, so the order is announced. Enter and Space toggle it.
104
+ - `disabled` and `blocked` are `warning`s — the reader can act, and will miss
105
+ something if they do not. `unavailable` is only `info`: painting amber what
106
+ cannot be fixed asks the reader to fix it.
@@ -0,0 +1,8 @@
1
+ /** Theme spacing units between the message and its action. */
2
+ export const NOTICE_ACTION_GAP_UNITS = 1;
3
+
4
+ /** Theme spacing units the numbered steps are indented by. */
5
+ export const NOTICE_STEPS_INDENT_UNITS = 2.5;
6
+
7
+ /** Theme spacing units between two steps. */
8
+ export const NOTICE_STEP_GAP_UNITS = 0.5;