@eifi1/ui-kit 0.34.0 → 0.36.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 (446) hide show
  1. package/README.md +115 -41
  2. package/dist/admin/role-select.d.ts +3 -2
  3. package/dist/admin/role-select.js +2 -0
  4. package/dist/admin/role-select.js.map +1 -1
  5. package/dist/billing/billing-banner.d.ts +5 -2
  6. package/dist/billing/billing-banner.js.map +1 -1
  7. package/dist/billing/plan-limit-notice.d.ts +5 -2
  8. package/dist/billing/plan-limit-notice.js.map +1 -1
  9. package/dist/chart.js.map +1 -1
  10. package/dist/components/amount-input.d.ts +2 -5
  11. package/dist/components/amount-input.js +2 -2
  12. package/dist/components/amount-input.js.map +1 -1
  13. package/dist/components/autocomplete.d.ts +2 -2
  14. package/dist/components/autocomplete.js +2 -1
  15. package/dist/components/autocomplete.js.map +1 -1
  16. package/dist/components/button-look.d.ts +1 -1
  17. package/dist/components/button-look.js +9 -4
  18. package/dist/components/button-look.js.map +1 -1
  19. package/dist/components/calculator.d.ts +1 -4
  20. package/dist/components/calculator.js +1 -3
  21. package/dist/components/calculator.js.map +1 -1
  22. package/dist/components/chart-zoom.d.ts +0 -37
  23. package/dist/components/chart-zoom.js +1 -28
  24. package/dist/components/chart-zoom.js.map +1 -1
  25. package/dist/components/checkbox-group.d.ts +5 -2
  26. package/dist/components/checkbox-group.js +15 -4
  27. package/dist/components/checkbox-group.js.map +1 -1
  28. package/dist/components/chip-input.d.ts +0 -4
  29. package/dist/components/chip-input.js +1 -5
  30. package/dist/components/chip-input.js.map +1 -1
  31. package/dist/components/column-mapper.d.ts +5 -3
  32. package/dist/components/column-mapper.js +2 -0
  33. package/dist/components/column-mapper.js.map +1 -1
  34. package/dist/components/combobox.d.ts +3 -3
  35. package/dist/components/combobox.js +2 -1
  36. package/dist/components/combobox.js.map +1 -1
  37. package/dist/components/copy-button.d.ts +5 -1
  38. package/dist/components/copy-button.js.map +1 -1
  39. package/dist/components/country-select.d.ts +3 -3
  40. package/dist/components/country-select.js +3 -0
  41. package/dist/components/country-select.js.map +1 -1
  42. package/dist/components/currency-option-list.d.ts +3 -8
  43. package/dist/components/currency-option-list.js +1 -29
  44. package/dist/components/currency-option-list.js.map +1 -1
  45. package/dist/components/currency-select.d.ts +3 -2
  46. package/dist/components/currency-select.js +10 -1
  47. package/dist/components/currency-select.js.map +1 -1
  48. package/dist/components/danger-confirm.d.ts +3 -3
  49. package/dist/components/danger-confirm.js.map +1 -1
  50. package/dist/components/data-table-filter-popover.d.ts +1 -1
  51. package/dist/components/data-table-filter-popover.js +1 -1
  52. package/dist/components/data-table-filter-popover.js.map +1 -1
  53. package/dist/components/data-table-labels.d.ts +1 -42
  54. package/dist/components/data-table-labels.js +2 -31
  55. package/dist/components/data-table-labels.js.map +1 -1
  56. package/dist/components/data-table-shared.d.ts +17 -1
  57. package/dist/components/data-table-shared.js +22 -0
  58. package/dist/components/data-table-shared.js.map +1 -1
  59. package/dist/components/data-table.d.ts +12 -2
  60. package/dist/components/data-table.js +18 -14
  61. package/dist/components/data-table.js.map +1 -1
  62. package/dist/components/date-field.d.ts +2 -1
  63. package/dist/components/date-field.js.map +1 -1
  64. package/dist/components/date-picker.js +3 -0
  65. package/dist/components/date-picker.js.map +1 -1
  66. package/dist/components/date-range-picker.js +3 -0
  67. package/dist/components/date-range-picker.js.map +1 -1
  68. package/dist/components/dialog-frame.d.ts +3 -1
  69. package/dist/components/dialog-frame.js.map +1 -1
  70. package/dist/components/dropdown.d.ts +18 -15
  71. package/dist/components/dropdown.js +11 -3
  72. package/dist/components/dropdown.js.map +1 -1
  73. package/dist/components/entity-combobox.d.ts +3 -3
  74. package/dist/components/entity-combobox.js +2 -1
  75. package/dist/components/entity-combobox.js.map +1 -1
  76. package/dist/components/field-base.d.ts +0 -5
  77. package/dist/components/field-base.js +0 -5
  78. package/dist/components/field-base.js.map +1 -1
  79. package/dist/components/field-parts.d.ts +69 -22
  80. package/dist/components/field-parts.js +33 -19
  81. package/dist/components/field-parts.js.map +1 -1
  82. package/dist/components/field-strip.d.ts +9 -23
  83. package/dist/components/field-strip.js +26 -23
  84. package/dist/components/field-strip.js.map +1 -1
  85. package/dist/components/field-sync.d.ts +0 -4
  86. package/dist/components/field-sync.js +0 -4
  87. package/dist/components/field-sync.js.map +1 -1
  88. package/dist/components/field.d.ts +7 -6
  89. package/dist/components/field.js +24 -15
  90. package/dist/components/field.js.map +1 -1
  91. package/dist/components/full-bleed-dialog.js +2 -2
  92. package/dist/components/full-bleed-dialog.js.map +1 -1
  93. package/dist/components/help-popover.d.ts +9 -7
  94. package/dist/components/help-popover.js.map +1 -1
  95. package/dist/components/hover-menu.d.ts +6 -13
  96. package/dist/components/hover-menu.js +3 -3
  97. package/dist/components/hover-menu.js.map +1 -1
  98. package/dist/components/icon-picker.d.ts +3 -2
  99. package/dist/components/icon-picker.js +3 -0
  100. package/dist/components/icon-picker.js.map +1 -1
  101. package/dist/components/inline-entity-combobox.d.ts +3 -3
  102. package/dist/components/inline-entity-combobox.js +2 -1
  103. package/dist/components/inline-entity-combobox.js.map +1 -1
  104. package/dist/components/input.d.ts +2 -2
  105. package/dist/components/input.js +2 -1
  106. package/dist/components/input.js.map +1 -1
  107. package/dist/components/modal.d.ts +9 -1
  108. package/dist/components/modal.js +7 -4
  109. package/dist/components/modal.js.map +1 -1
  110. package/dist/components/month-picker.d.ts +2 -1
  111. package/dist/components/month-picker.js +8 -1
  112. package/dist/components/month-picker.js.map +1 -1
  113. package/dist/components/multi-entity-combobox.d.ts +2 -2
  114. package/dist/components/multi-entity-combobox.js +2 -1
  115. package/dist/components/multi-entity-combobox.js.map +1 -1
  116. package/dist/components/multi-select.d.ts +7 -18
  117. package/dist/components/multi-select.js +8 -10
  118. package/dist/components/multi-select.js.map +1 -1
  119. package/dist/components/number-input.d.ts +2 -5
  120. package/dist/components/number-input.js +2 -4
  121. package/dist/components/number-input.js.map +1 -1
  122. package/dist/components/numeric-field.d.ts +5 -2
  123. package/dist/components/numeric-field.js +4 -1
  124. package/dist/components/numeric-field.js.map +1 -1
  125. package/dist/components/one-time-code-input.d.ts +2 -1
  126. package/dist/components/one-time-code-input.js +2 -1
  127. package/dist/components/one-time-code-input.js.map +1 -1
  128. package/dist/components/phone-input.d.ts +1 -1
  129. package/dist/components/phone-input.js +4 -0
  130. package/dist/components/phone-input.js.map +1 -1
  131. package/dist/components/popover.js +3 -3
  132. package/dist/components/popover.js.map +1 -1
  133. package/dist/components/select.d.ts +4 -3
  134. package/dist/components/select.js +2 -1
  135. package/dist/components/select.js.map +1 -1
  136. package/dist/components/series-chart.js.map +1 -1
  137. package/dist/components/server-wake.d.ts +0 -6
  138. package/dist/components/server-wake.js.map +1 -1
  139. package/dist/components/settings-fields.d.ts +4 -2
  140. package/dist/components/settings-fields.js.map +1 -1
  141. package/dist/components/slider.d.ts +3 -2
  142. package/dist/components/slider.js +7 -1
  143. package/dist/components/slider.js.map +1 -1
  144. package/dist/components/stat-tile.d.ts +8 -2
  145. package/dist/components/stat-tile.js +2 -11
  146. package/dist/components/stat-tile.js.map +1 -1
  147. package/dist/components/swatch-picker.d.ts +3 -2
  148. package/dist/components/swatch-picker.js +3 -0
  149. package/dist/components/swatch-picker.js.map +1 -1
  150. package/dist/components/swipeable-row.d.ts +2 -17
  151. package/dist/components/swipeable-row.js +11 -16
  152. package/dist/components/swipeable-row.js.map +1 -1
  153. package/dist/components/text-link.js +3 -1
  154. package/dist/components/text-link.js.map +1 -1
  155. package/dist/components/textarea.d.ts +2 -1
  156. package/dist/components/textarea.js +9 -3
  157. package/dist/components/textarea.js.map +1 -1
  158. package/dist/components/toggle-group.d.ts +2 -2
  159. package/dist/components/toggle-group.js +7 -3
  160. package/dist/components/toggle-group.js.map +1 -1
  161. package/dist/components/tooltip.d.ts +9 -1
  162. package/dist/components/tooltip.js +20 -5
  163. package/dist/components/tooltip.js.map +1 -1
  164. package/dist/components/translation-review.d.ts +10 -2
  165. package/dist/components/translation-review.js +11 -3
  166. package/dist/components/translation-review.js.map +1 -1
  167. package/dist/components/use-table-state.d.ts +31 -3
  168. package/dist/components/use-table-state.js +53 -8
  169. package/dist/components/use-table-state.js.map +1 -1
  170. package/dist/components/user-avatar.d.ts +2 -2
  171. package/dist/components/user-avatar.js.map +1 -1
  172. package/dist/components/wizard-stepper.d.ts +1 -4
  173. package/dist/components/wizard-stepper.js +2 -3
  174. package/dist/components/wizard-stepper.js.map +1 -1
  175. package/dist/currencies.d.ts +23 -0
  176. package/dist/currencies.js +38 -0
  177. package/dist/currencies.js.map +1 -0
  178. package/dist/demo/demo-banner.d.ts +7 -2
  179. package/dist/demo/demo-banner.js.map +1 -1
  180. package/dist/eslint/index.d.ts +83 -0
  181. package/dist/eslint/index.js +69 -0
  182. package/dist/eslint/index.js.map +1 -0
  183. package/dist/eslint/role-utilities.d.ts +48 -0
  184. package/dist/eslint/role-utilities.generated.d.ts +2 -0
  185. package/dist/eslint/role-utilities.generated.js +143 -0
  186. package/dist/eslint/role-utilities.generated.js.map +1 -0
  187. package/dist/eslint/role-utilities.js +43 -0
  188. package/dist/eslint/role-utilities.js.map +1 -0
  189. package/dist/feedback/feedback-menu.d.ts +2 -2
  190. package/dist/feedback/feedback-menu.js.map +1 -1
  191. package/dist/feedback/feedback-thread.d.ts +3 -8
  192. package/dist/feedback/feedback-thread.js +0 -2
  193. package/dist/feedback/feedback-thread.js.map +1 -1
  194. package/dist/hooks/use-dismiss.d.ts +16 -3
  195. package/dist/hooks/use-dismiss.js +14 -2
  196. package/dist/hooks/use-dismiss.js.map +1 -1
  197. package/dist/i18n/defaults.js +5 -1
  198. package/dist/i18n/defaults.js.map +1 -1
  199. package/dist/i18n/german.js +97 -1
  200. package/dist/i18n/german.js.map +1 -1
  201. package/dist/i18n/kit-labels.d.ts +29 -4
  202. package/dist/i18n/kit-labels.js +21 -1
  203. package/dist/i18n/kit-labels.js.map +1 -1
  204. package/dist/i18n/locales/en.js +104 -3
  205. package/dist/i18n/locales/en.js.map +3 -3
  206. package/dist/i18n/locales/es.js +95 -1
  207. package/dist/i18n/locales/es.js.map +1 -1
  208. package/dist/i18n/locales/fr.js +99 -3
  209. package/dist/i18n/locales/fr.js.map +1 -1
  210. package/dist/i18n/locales/hu.js +95 -1
  211. package/dist/i18n/locales/hu.js.map +1 -1
  212. package/dist/i18n/locales/it.js +99 -3
  213. package/dist/i18n/locales/it.js.map +1 -1
  214. package/dist/i18n/locales/zh.js +95 -1
  215. package/dist/i18n/locales/zh.js.map +1 -1
  216. package/dist/i18n/review.js +13 -0
  217. package/dist/i18n/review.js.map +1 -1
  218. package/dist/i18n/shared-labels.js +3 -1
  219. package/dist/i18n/shared-labels.js.map +1 -1
  220. package/dist/index.d.ts +23 -1
  221. package/dist/index.js +40 -2
  222. package/dist/index.js.map +1 -1
  223. package/dist/lib/device-settings.d.ts +72 -0
  224. package/dist/lib/device-settings.js +64 -0
  225. package/dist/lib/device-settings.js.map +1 -0
  226. package/dist/lib/plain-text.d.ts +11 -0
  227. package/dist/lib/plain-text.js +16 -0
  228. package/dist/lib/plain-text.js.map +1 -0
  229. package/dist/lib/refs.d.ts +13 -0
  230. package/dist/lib/refs.js +15 -0
  231. package/dist/lib/refs.js.map +1 -0
  232. package/dist/lib/safe-storage.d.ts +6 -0
  233. package/dist/lib/safe-storage.js +11 -0
  234. package/dist/lib/safe-storage.js.map +1 -1
  235. package/dist/notifications/notification-parts.d.ts +39 -0
  236. package/dist/notifications/notification-parts.js +47 -0
  237. package/dist/notifications/notification-parts.js.map +1 -0
  238. package/dist/notifications/notification-types-setting.d.ts +62 -0
  239. package/dist/notifications/notification-types-setting.js +192 -0
  240. package/dist/notifications/notification-types-setting.js.map +1 -0
  241. package/dist/notifications/notification-types.d.ts +75 -0
  242. package/dist/notifications/notification-types.js +2 -0
  243. package/dist/notifications/notification-types.js.map +1 -0
  244. package/dist/notifications/notifications-labels.d.ts +131 -0
  245. package/dist/notifications/notifications-labels.js +83 -0
  246. package/dist/notifications/notifications-labels.js.map +1 -0
  247. package/dist/notifications/push-device-setting.d.ts +37 -0
  248. package/dist/notifications/push-device-setting.js +164 -0
  249. package/dist/notifications/push-device-setting.js.map +1 -0
  250. package/dist/notifications/push-devices-setting.d.ts +44 -0
  251. package/dist/notifications/push-devices-setting.js +203 -0
  252. package/dist/notifications/push-devices-setting.js.map +1 -0
  253. package/dist/notifications/quiet-hours-setting.d.ts +47 -0
  254. package/dist/notifications/quiet-hours-setting.js +131 -0
  255. package/dist/notifications/quiet-hours-setting.js.map +1 -0
  256. package/dist/notifications/time-zone-select.d.ts +50 -0
  257. package/dist/notifications/time-zone-select.js +76 -0
  258. package/dist/notifications/time-zone-select.js.map +1 -0
  259. package/dist/notifications/unsubscribe-panel.d.ts +53 -0
  260. package/dist/notifications/unsubscribe-panel.js +139 -0
  261. package/dist/notifications/unsubscribe-panel.js.map +1 -0
  262. package/dist/notifications/use-push-device.d.ts +122 -0
  263. package/dist/notifications/use-push-device.js +230 -0
  264. package/dist/notifications/use-push-device.js.map +1 -0
  265. package/dist/rhf/fields.d.ts +36 -29
  266. package/dist/rhf/fields.js +51 -22
  267. package/dist/rhf/fields.js.map +1 -1
  268. package/dist/rhf/form-core.d.ts +5 -4
  269. package/dist/rhf/form-core.js.map +1 -1
  270. package/dist/rhf/form.d.ts +7 -36
  271. package/dist/rhf/form.js +1 -16
  272. package/dist/rhf/form.js.map +1 -1
  273. package/dist/rhf/line-items.d.ts +1 -1
  274. package/dist/rhf/line-items.js.map +1 -1
  275. package/dist/rhf/use-rhf-wizard-step.js.map +1 -1
  276. package/dist/rhf.js.map +1 -1
  277. package/dist/settings/device-reset-setting-labels.d.ts +3 -0
  278. package/dist/settings/device-reset-setting-labels.js +15 -0
  279. package/dist/settings/device-reset-setting-labels.js.map +1 -0
  280. package/dist/settings/device-reset-setting.d.ts +58 -0
  281. package/dist/settings/device-reset-setting.js +51 -0
  282. package/dist/settings/device-reset-setting.js.map +1 -0
  283. package/dist/shell/app-shell.js +5 -0
  284. package/dist/shell/app-shell.js.map +1 -1
  285. package/dist/shell/option-switcher-menu.d.ts +5 -17
  286. package/dist/shell/option-switcher-menu.js +1 -3
  287. package/dist/shell/option-switcher-menu.js.map +1 -1
  288. package/dist/shell/role-switcher.d.ts +1 -4
  289. package/dist/shell/role-switcher.js +2 -3
  290. package/dist/shell/role-switcher.js.map +1 -1
  291. package/dist/shell/topbar-action-menu.d.ts +7 -19
  292. package/dist/shell/topbar-action-menu.js +1 -3
  293. package/dist/shell/topbar-action-menu.js.map +1 -1
  294. package/dist/shell/topbar-controls.d.ts +3 -12
  295. package/dist/shell/topbar-controls.js +6 -9
  296. package/dist/shell/topbar-controls.js.map +1 -1
  297. package/dist/testing/index.d.ts +1 -1
  298. package/dist/testing/index.js +2 -0
  299. package/dist/testing/index.js.map +1 -1
  300. package/dist/testing/viewport.d.ts +25 -2
  301. package/dist/testing/viewport.js +61 -10
  302. package/dist/testing/viewport.js.map +1 -1
  303. package/dist/theme/contrast-tokens.d.ts +42 -4
  304. package/dist/theme/contrast-tokens.js +56 -9
  305. package/dist/theme/contrast-tokens.js.map +1 -1
  306. package/dist/theme/contrast.d.ts +4 -2
  307. package/dist/theme/contrast.js +13 -0
  308. package/dist/theme/contrast.js.map +1 -1
  309. package/dist/theme/palette-derive.d.ts +15 -1
  310. package/dist/theme/palette-derive.js +37 -8
  311. package/dist/theme/palette-derive.js.map +1 -1
  312. package/dist/theme/palette-presets.d.ts +2 -8
  313. package/dist/theme/palette-presets.js +5 -284
  314. package/dist/theme/palette-presets.js.map +1 -1
  315. package/dist/theme/palette-store.js +6 -0
  316. package/dist/theme/palette-store.js.map +1 -1
  317. package/dist/theme/text-size.js +6 -0
  318. package/dist/theme/text-size.js.map +1 -1
  319. package/dist/theme/theme-store.js +6 -0
  320. package/dist/theme/theme-store.js.map +1 -1
  321. package/dist/wizard/types.d.ts +0 -5
  322. package/dist/wizard/types.js +1 -5
  323. package/dist/wizard/types.js.map +1 -1
  324. package/package.json +9 -1
  325. package/src/admin/role-select.tsx +4 -1
  326. package/src/billing/billing-banner.tsx +5 -2
  327. package/src/billing/plan-limit-notice.tsx +5 -2
  328. package/src/chart.ts +5 -3
  329. package/src/components/amount-input.tsx +4 -7
  330. package/src/components/autocomplete.tsx +5 -2
  331. package/src/components/button-look.ts +15 -5
  332. package/src/components/calculator.tsx +2 -7
  333. package/src/components/chart-zoom.tsx +4 -47
  334. package/src/components/checkbox-group.tsx +22 -4
  335. package/src/components/chip-input.tsx +0 -7
  336. package/src/components/column-mapper.tsx +6 -2
  337. package/src/components/combobox.tsx +6 -3
  338. package/src/components/copy-button.tsx +5 -1
  339. package/src/components/country-select.tsx +6 -1
  340. package/src/components/currency-option-list.tsx +8 -42
  341. package/src/components/currency-select.tsx +12 -3
  342. package/src/components/danger-confirm.tsx +3 -3
  343. package/src/components/data-table-filter-popover.tsx +2 -1
  344. package/src/components/data-table-labels.ts +2 -84
  345. package/src/components/data-table-shared.tsx +55 -2
  346. package/src/components/data-table.tsx +29 -17
  347. package/src/components/date-field.tsx +2 -2
  348. package/src/components/date-picker.tsx +3 -0
  349. package/src/components/date-range-picker.tsx +3 -0
  350. package/src/components/dialog-frame.tsx +3 -1
  351. package/src/components/dropdown.tsx +42 -18
  352. package/src/components/entity-combobox.tsx +6 -3
  353. package/src/components/field-base.tsx +0 -11
  354. package/src/components/field-parts.tsx +112 -38
  355. package/src/components/field-strip.tsx +12 -27
  356. package/src/components/field-sync.tsx +0 -7
  357. package/src/components/field.tsx +32 -19
  358. package/src/components/full-bleed-dialog.tsx +4 -3
  359. package/src/components/help-popover.tsx +9 -7
  360. package/src/components/hover-menu.tsx +12 -16
  361. package/src/components/icon-picker.tsx +8 -3
  362. package/src/components/inline-entity-combobox.tsx +6 -3
  363. package/src/components/input.tsx +4 -2
  364. package/src/components/modal.tsx +20 -4
  365. package/src/components/month-picker.tsx +10 -3
  366. package/src/components/multi-entity-combobox.tsx +5 -2
  367. package/src/components/multi-select.tsx +19 -31
  368. package/src/components/number-input.tsx +5 -10
  369. package/src/components/numeric-field.ts +10 -2
  370. package/src/components/one-time-code-input.tsx +5 -3
  371. package/src/components/phone-input.tsx +4 -0
  372. package/src/components/popover.tsx +8 -4
  373. package/src/components/select.tsx +6 -3
  374. package/src/components/series-chart.tsx +1 -1
  375. package/src/components/server-wake.tsx +0 -6
  376. package/src/components/settings-fields.tsx +4 -2
  377. package/src/components/slider.tsx +10 -3
  378. package/src/components/stat-tile.tsx +11 -20
  379. package/src/components/swatch-picker.tsx +9 -4
  380. package/src/components/swipeable-row.tsx +15 -37
  381. package/src/components/text-link.tsx +3 -1
  382. package/src/components/textarea.tsx +11 -4
  383. package/src/components/toggle-group.tsx +21 -5
  384. package/src/components/tooltip.tsx +37 -6
  385. package/src/components/translation-review.tsx +25 -7
  386. package/src/components/use-table-state.ts +91 -10
  387. package/src/components/user-avatar.tsx +2 -2
  388. package/src/components/wizard-stepper.tsx +2 -6
  389. package/src/currencies.ts +70 -0
  390. package/src/demo/demo-banner.tsx +7 -2
  391. package/src/eslint/index.ts +161 -0
  392. package/src/eslint/role-utilities.generated.ts +146 -0
  393. package/src/eslint/role-utilities.ts +99 -0
  394. package/src/feedback/feedback-menu.tsx +2 -2
  395. package/src/feedback/feedback-thread.tsx +3 -8
  396. package/src/hooks/use-dismiss.ts +39 -4
  397. package/src/i18n/defaults.ts +4 -0
  398. package/src/i18n/german.ts +113 -0
  399. package/src/i18n/kit-labels.tsx +66 -6
  400. package/src/i18n/locales/en.ts +6 -0
  401. package/src/i18n/locales/es.ts +106 -0
  402. package/src/i18n/locales/fr.ts +109 -2
  403. package/src/i18n/locales/hu.ts +104 -0
  404. package/src/i18n/locales/it.ts +108 -2
  405. package/src/i18n/locales/zh.ts +96 -0
  406. package/src/i18n/review.ts +13 -0
  407. package/src/i18n/shared-labels.ts +2 -0
  408. package/src/index.ts +53 -1
  409. package/src/lib/device-settings.ts +146 -0
  410. package/src/lib/plain-text.ts +22 -0
  411. package/src/lib/refs.ts +22 -0
  412. package/src/lib/safe-storage.ts +16 -0
  413. package/src/notifications/notification-parts.tsx +83 -0
  414. package/src/notifications/notification-types-setting.tsx +309 -0
  415. package/src/notifications/notification-types.ts +80 -0
  416. package/src/notifications/notifications-labels.ts +238 -0
  417. package/src/notifications/push-device-setting.tsx +224 -0
  418. package/src/notifications/push-devices-setting.tsx +306 -0
  419. package/src/notifications/quiet-hours-setting.tsx +185 -0
  420. package/src/notifications/time-zone-select.tsx +126 -0
  421. package/src/notifications/unsubscribe-panel.tsx +203 -0
  422. package/src/notifications/use-push-device.ts +392 -0
  423. package/src/rhf/fields.tsx +87 -39
  424. package/src/rhf/form-core.tsx +5 -4
  425. package/src/rhf/form.tsx +7 -43
  426. package/src/rhf/line-items.tsx +1 -1
  427. package/src/rhf/use-rhf-wizard-step.ts +4 -4
  428. package/src/rhf.ts +3 -2
  429. package/src/settings/device-reset-setting-labels.ts +20 -0
  430. package/src/settings/device-reset-setting.tsx +119 -0
  431. package/src/shell/app-shell.tsx +8 -0
  432. package/src/shell/option-switcher-menu.tsx +5 -22
  433. package/src/shell/role-switcher.tsx +2 -6
  434. package/src/shell/topbar-action-menu.tsx +7 -24
  435. package/src/shell/topbar-controls.tsx +6 -18
  436. package/src/testing/index.ts +3 -1
  437. package/src/testing/viewport.ts +125 -19
  438. package/src/theme/contrast-tokens.ts +106 -12
  439. package/src/theme/contrast.ts +30 -4
  440. package/src/theme/palette-derive.ts +68 -7
  441. package/src/theme/palette-presets.ts +16 -299
  442. package/src/theme/palette-store.ts +12 -0
  443. package/src/theme/text-size.ts +8 -0
  444. package/src/theme/theme-store.ts +10 -0
  445. package/src/wizard/types.ts +0 -8
  446. package/tokens.css +38 -4
@@ -87,6 +87,7 @@ import { DEFAULT_DEMO_LABELS } from "../demo/demo-labels";
87
87
  import { DEFAULT_BILLING_LABELS } from "../billing/billing-labels";
88
88
  import { DEFAULT_PLAN_CHANGE_LABELS } from "../admin/plan-change-labels";
89
89
  import { DEFAULT_APPEARANCE_LABELS } from "../components/appearance-labels";
90
+ import { DEFAULT_DEVICE_RESET_LABELS } from "../settings/device-reset-setting-labels";
90
91
  import { DEFAULT_ROW_ACTIONS_LABELS } from "../components/row-actions-labels";
91
92
  import { DEFAULT_APP_SHELL_MORE_LABELS } from "../shell/app-shell-labels";
92
93
  import { DEFAULT_ACCOUNT_STATE_LABELS } from "../components/account-chips-labels";
@@ -100,6 +101,7 @@ import { DEFAULT_IBAN_INPUT_LABELS } from "../components/iban-input-labels";
100
101
  import { DEFAULT_PHONE_INPUT_LABELS } from "../components/phone-input-labels";
101
102
  import { DEFAULT_SIGN_CHIP_LABELS } from "../components/sign-chip-labels";
102
103
  import { DEFAULT_COLUMN_MAPPER_LABELS } from "../components/column-mapper-labels";
104
+ import { DEFAULT_NOTIFICATIONS_LABELS } from "../notifications/notifications-labels";
103
105
  import {
104
106
  DEFAULT_APP_SHELL_LABELS,
105
107
  DEFAULT_CALCULATOR_LABELS,
@@ -231,6 +233,7 @@ export const DEFAULT_UI_KIT_LABELS: UiKitLabels = {
231
233
  billing: DEFAULT_BILLING_LABELS,
232
234
  planChange: DEFAULT_PLAN_CHANGE_LABELS,
233
235
  appearance: DEFAULT_APPEARANCE_LABELS,
236
+ deviceReset: DEFAULT_DEVICE_RESET_LABELS,
234
237
  rowActions: DEFAULT_ROW_ACTIONS_LABELS,
235
238
  appShellMore: DEFAULT_APP_SHELL_MORE_LABELS,
236
239
  characterCount: DEFAULT_CHARACTER_COUNT_LABELS,
@@ -240,4 +243,5 @@ export const DEFAULT_UI_KIT_LABELS: UiKitLabels = {
240
243
  phoneInput: DEFAULT_PHONE_INPUT_LABELS,
241
244
  signChip: DEFAULT_SIGN_CHIP_LABELS,
242
245
  columnMapper: DEFAULT_COLUMN_MAPPER_LABELS,
246
+ notifications: DEFAULT_NOTIFICATIONS_LABELS,
243
247
  };
@@ -268,6 +268,8 @@ export function germanLabels(numberLocale: string): UiKitLabels {
268
268
  noResults: "Keine Ergebnisse",
269
269
  fieldValue: (field, value) => `${field}: ${value}`,
270
270
  opensInNewTab: "öffnet in einem neuen Tab",
271
+ aboutField: (field) => `Hilfe zu „${field}“`,
272
+ help: "Hilfe",
271
273
  },
272
274
  dataTable: {
273
275
  columns: "Spalten",
@@ -1072,6 +1074,102 @@ export function germanLabels(numberLocale: string): UiKitLabels {
1072
1074
  rateLimited,
1073
1075
  failed: "Das hat nicht geklappt. Bitte erneut versuchen.",
1074
1076
  },
1077
+ // 0.36.0 — docs/notifications-harmonization.md §4.2: the notification cards. The push
1078
+ // and device words follow keksdose's reviewed German, formal.
1079
+ notifications: {
1080
+ typesTitle: "Benachrichtigungen zu",
1081
+ typesDescription: "Wählen Sie, worüber Sie benachrichtigt werden, und wie.",
1082
+ byEmail: "Per E-Mail",
1083
+ emailUnverified: "Bestätigen Sie Ihre Adresse, um diese zu erhalten.",
1084
+ digestCadence: "Häufigkeit",
1085
+ digestWeekly: "Wöchentlich",
1086
+ digestMonthly: "Monatlich",
1087
+ typesLoading: "Benachrichtigungseinstellungen werden geladen…",
1088
+ typesEmpty: "Für dieses Konto gibt es keine Benachrichtigungen.",
1089
+ quietTitle: "Ruhezeiten",
1090
+ quietDescription: (inbox) =>
1091
+ inbox
1092
+ ? "In diesem Zeitfenster kommen keine Push-Benachrichtigungen. Im Posteingang kommen sie trotzdem an."
1093
+ : "In diesem Zeitfenster kommen keine Push-Benachrichtigungen.",
1094
+ quietFrom: "Von",
1095
+ quietUntil: "Bis",
1096
+ quietIncomplete: "Legen Sie eine Start- und eine Endzeit fest. Ruhezeiten gelten erst, wenn beide gesetzt sind.",
1097
+ timeZone: "Zeitzone",
1098
+ deviceZone: (zone) => `Dieses Gerät ist in der Zeitzone ${zone}.`,
1099
+ useDeviceZone: "Übernehmen",
1100
+ regions: {
1101
+ Africa: "Afrika",
1102
+ America: "Amerika",
1103
+ Antarctica: "Antarktis",
1104
+ Arctic: "Arktis",
1105
+ Asia: "Asien",
1106
+ Atlantic: "Atlantik",
1107
+ Australia: "Australien",
1108
+ Europe: "Europa",
1109
+ Indian: "Indischer Ozean",
1110
+ Pacific: "Pazifik",
1111
+ },
1112
+ pushTitle: "Push-Benachrichtigungen",
1113
+ pushDescription: "Benachrichtigungen auf diesem Gerät, auch wenn die App geschlossen ist.",
1114
+ unsupported: "Dieser Browser unterstützt keine Push-Benachrichtigungen.",
1115
+ iosInstall: (app) =>
1116
+ `Fügen Sie ${app} auf dem iPhone oder iPad zuerst zum Home-Bildschirm hinzu: iOS stellt Benachrichtigungen nur der installierten App zu.`,
1117
+ notConfigured: "Push-Benachrichtigungen sind auf diesem Server nicht eingerichtet.",
1118
+ blocked: "Benachrichtigungen sind in den Einstellungen dieses Browsers blockiert.",
1119
+ on: "Benachrichtigungen sind für dieses Gerät eingeschaltet.",
1120
+ off: "Benachrichtigungen sind für dieses Gerät ausgeschaltet.",
1121
+ otherAccount:
1122
+ "Dieser Browser erhält Benachrichtigungen für ein anderes Konto. Schalten Sie sie hier ein, um sie für das angemeldete Konto zu erhalten.",
1123
+ enable: "Benachrichtigungen einschalten",
1124
+ disable: "Ausschalten",
1125
+ sendTest: "Test senden",
1126
+ enableFailed: "Benachrichtigungen konnten nicht eingeschaltet werden.",
1127
+ noServiceWorker:
1128
+ "Der Service Worker der App ist nicht erreichbar. Laden Sie die Seite neu und versuchen Sie es erneut.",
1129
+ pushTimeout:
1130
+ "Der Push-Dienst des Browsers antwortet nicht. Prüfen Sie Ihre Verbindung und versuchen Sie es erneut.",
1131
+ testSent: (count) =>
1132
+ count === 1 ? `Test an ${n(count)} Gerät gesendet` : `Test an ${n(count)} Geräte gesendet`,
1133
+ testNone:
1134
+ "Kein Gerät hat den Test angenommen. Schalten Sie zuerst die Benachrichtigungen für dieses Gerät ein.",
1135
+ testFailed: "Die Test-Benachrichtigung konnte nicht gesendet werden.",
1136
+ explainerTitle: "Benachrichtigungen einschalten?",
1137
+ explainerBody: (app) =>
1138
+ `${app} sendet nur Benachrichtigungen zu dem, was Sie auswählen, und Sie können sie jederzeit ausschalten.`,
1139
+ explainerHint: "Als Nächstes fragt Ihr Browser nach der Berechtigung.",
1140
+ explainerContinue: "Weiter",
1141
+ devicesTitle: "Benachrichtigungsgeräte",
1142
+ devicesDescription:
1143
+ "Alle Geräte, die Push-Benachrichtigungen für Ihr Konto erhalten. Entfernen Sie die, die Sie nicht mehr nutzen.",
1144
+ devicesLoading: "Geräte werden geladen…",
1145
+ devicesEmpty: "Noch kein Gerät erhält Benachrichtigungen.",
1146
+ unknownDevice: "Unbekanntes Gerät",
1147
+ thisDevice: "Dieses Gerät",
1148
+ added: (date) => `Hinzugefügt am ${date}`,
1149
+ lastDelivery: (date) => `Letzte Zustellung am ${date}`,
1150
+ noDelivery: "Noch keine Zustellung",
1151
+ failures: (count) =>
1152
+ count === 1
1153
+ ? `${n(count)} fehlgeschlagene Zustellung in Folge`
1154
+ : `${n(count)} fehlgeschlagene Zustellungen in Folge`,
1155
+ remove: "Entfernen",
1156
+ // Starts with `remove`, the button's visible text, for voice control.
1157
+ removeItem: (device) => `Entfernen: ${device}`,
1158
+ removePrompt: "Keine Benachrichtigungen mehr an dieses Gerät senden?",
1159
+ unsubscribeTitle: "E-Mail-Benachrichtigungen",
1160
+ unsubscribeAbout: (type) => `Sie erhalten E-Mails zu: ${type}.`,
1161
+ unsubscribeGeneric: "Sie erhalten Benachrichtigungs-E-Mails.",
1162
+ stopThese: "Diese E-Mails abbestellen",
1163
+ stopAll: (app) => `Alle Benachrichtigungs-E-Mails von ${app} abbestellen`,
1164
+ stoppedThese: "Erledigt. Sie erhalten diese E-Mails nicht mehr.",
1165
+ stoppedAll: (app) => `Erledigt. Sie erhalten keine Benachrichtigungs-E-Mails von ${app} mehr.`,
1166
+ accountMail: "E-Mails zu Ihrem Konto erhalten Sie weiterhin.",
1167
+ turnBackOn: "Sie können sie jederzeit in den Einstellungen wieder einschalten.",
1168
+ openSettings: "Einstellungen öffnen",
1169
+ invalidLink:
1170
+ "Dieser Link funktioniert nicht mehr. Sie können E-Mails stattdessen in den Einstellungen abbestellen.",
1171
+ failed: "Das hat nicht geklappt. Bitte erneut versuchen.",
1172
+ },
1075
1173
  sessions: {
1076
1174
  title: "Sitzungen",
1077
1175
  description:
@@ -1634,6 +1732,21 @@ export function germanLabels(numberLocale: string): UiKitLabels {
1634
1732
  contrastModes: { system: "System", standard: "Standard", more: "Mehr" },
1635
1733
  saveFailed: "Konnte nicht in Ihrem Konto gespeichert werden. Auf diesem Gerät gilt es trotzdem.",
1636
1734
  },
1735
+ // 0.36.0 — docs/settings-harmonization.md §11.3: resetting this device's settings, the
1736
+ // last card of "Darstellung". "Theme", as `topBar.theme`; "Bereiche" for the panels
1737
+ // (the sidebar, folded groups).
1738
+ deviceReset: {
1739
+ title: "Dieses Gerät zurücksetzen",
1740
+ description:
1741
+ "Setzt die Darstellung auf diesem Gerät und die Ansicht seiner Tabellen und Bereiche auf die Standardwerte zurück. Ihr Konto, Ihre Daten und Ihre Anmeldung bleiben unberührt.",
1742
+ action: "Einstellungen dieses Geräts zurücksetzen",
1743
+ confirmTitle: "Einstellungen dieses Geräts zurücksetzen?",
1744
+ confirmBody:
1745
+ "Theme, Farben, Textgröße, Kontrast und Sprache kehren hier zu ihren Standardwerten zurück, und Tabellen und Bereiche öffnen sich wie beim ersten Mal. Wo Ihr Konto eine Sprache, eine Textgröße oder einen Kontrast festlegt, folgt dieses Gerät wieder dem Konto. Ihr Konto und Ihre anderen Geräte bleiben, wie sie sind.",
1746
+ confirmAction: "Zurücksetzen",
1747
+ done: "Die Einstellungen dieses Geräts sind auf die Standardwerte zurückgesetzt.",
1748
+ keywords: "zurücksetzen standard standardwerte gerät wiederherstellen darstellung tabellen layout",
1749
+ },
1637
1750
  rowActions: {
1638
1751
  actions: "Aktionen",
1639
1752
  actionsFor: (name) => `Aktionen für ${name}`,
@@ -1,4 +1,4 @@
1
- import { createContext, useContext, useMemo } from "react";
1
+ import { createContext, useContext, useEffect, useMemo } from "react";
2
2
  import {
3
3
  DEFAULT_APP_SHELL_LABELS,
4
4
  DEFAULT_CALCULATOR_LABELS,
@@ -98,6 +98,7 @@ import type { DemoLabels } from "../demo/demo-labels";
98
98
  import type { BillingLabels } from "../billing/billing-labels";
99
99
  import type { PlanChangeLabels } from "../admin/plan-change";
100
100
  import type { AppearanceLabels } from "../components/appearance-labels";
101
+ import type { DeviceResetLabels } from "../settings/device-reset-setting";
101
102
  import type { RowActionsLabels } from "../components/row-actions";
102
103
  import type { AppShellMoreLabels } from "../shell/app-shell";
103
104
  import type { AccountStateLabels } from "../components/account-chips";
@@ -111,6 +112,7 @@ import type { IbanInputLabels } from "../components/iban-input";
111
112
  import type { PhoneInputLabels } from "../components/phone-input";
112
113
  import type { SignChipLabels } from "../components/sign-chip";
113
114
  import type { ColumnMapperLabels } from "../components/column-mapper";
115
+ import type { NotificationsLabels } from "../notifications/notifications-labels";
114
116
 
115
117
  /**
116
118
  * EVERY string the kit renders, as one typed tree — and an optional provider that
@@ -168,6 +170,12 @@ export interface CommonLabels {
168
170
  /** Read after a link that opens a new tab (`<Button href external>`, TextLink):
169
171
  * nothing else tells a screen reader the page is about to change tabs. */
170
172
  opensInNewTab: string;
173
+ /** The name of a field's `help` "?" and its panel (round 0.36): "About <field>", the
174
+ * field's label as the argument — "About Jerk shape". A `HelpPopover` passed as
175
+ * `help` keeps its own name. */
176
+ aboutField: (field: string) => string;
177
+ /** …and of a `help` "?" on a field with no label and no `aria-label` to name it by. */
178
+ help: string;
171
179
  }
172
180
 
173
181
  /** `DatePicker` / `DateRangePicker` chrome. The calendar inside has its own
@@ -421,6 +429,9 @@ export interface UiKitLabels {
421
429
  planChange: PlanChangeLabels;
422
430
  /** 0.32.0: the text-size and contrast settings (docs/text-size-harmonization.md §6). */
423
431
  appearance: AppearanceLabels;
432
+ /** 0.36.0: resetting this device's settings, the appearance group's last card
433
+ * (docs/settings-harmonization.md §11.3). */
434
+ deviceReset: DeviceResetLabels;
424
435
  /** 0.32.0: a row's actions folded into a "⋯" menu at Large (text size §10.8). */
425
436
  rowActions: RowActionsLabels;
426
437
  /** 0.32.0: the phone bar's "More" cell and sheet (text size §10.7). */
@@ -440,6 +451,10 @@ export interface UiKitLabels {
440
451
  /** 0.23.0: `ColumnMapper` / `ColumnRoleTable` — a pasted or dropped table, a role per
441
452
  * column. */
442
453
  columnMapper: ColumnMapperLabels;
454
+ /** 0.36.0: the notification cards — the types, quiet hours and the zone picker, this
455
+ * device's push, the device list, and the unsubscribe page
456
+ * (docs/notifications-harmonization.md §4.2). */
457
+ notifications: NotificationsLabels;
443
458
  }
444
459
 
445
460
  /**
@@ -660,9 +675,44 @@ export function UiKitProvider({
660
675
  }),
661
676
  [outer, labels, locale, weekStartsOn, linkComponent, chartTooltipPlacement, formatDate, tableStorageKeyPrefix],
662
677
  );
678
+ useTableViewsJoin(value.tableStorageKeyPrefix ?? DEFAULT_TABLE_STORAGE_KEY_PREFIX);
663
679
  return <KitI18nContext.Provider value={value}>{children}</KitI18nContext.Provider>;
664
680
  }
665
681
 
682
+ /** The kit's own table prefix: `DEFAULT_PERSIST_PREFIX` of components/use-table-state,
683
+ * restated because that module imports the router (a test pins the two equal). */
684
+ const DEFAULT_TABLE_STORAGE_KEY_PREFIX = "hbui-table:";
685
+
686
+ /**
687
+ * Reset this device's settings (docs/settings-harmonization.md §11.4): the tables below a
688
+ * provider keep their views under its prefix, so the provider joins the registry with
689
+ * that prefix — a view, no `reset`, since a table reads its view when it next mounts —
690
+ * while it is mounted. Nested providers with one prefix hold one entry.
691
+ *
692
+ * Through a literal `import()`, not a static import: every catalogue reaches this module,
693
+ * and a catalogue may reach nothing outside i18n/ (scripts/check-module-graph.mjs,
694
+ * english-catalogue-graph.test.ts). The theme stores and the shell import the registry
695
+ * statically, so it is loaded already and the join lands a microtask after the mount.
696
+ */
697
+ function useTableViewsJoin(prefix: string): void {
698
+ useEffect(() => {
699
+ let leave: (() => void) | undefined;
700
+ let gone = false;
701
+ import("../lib/device-settings").then(
702
+ ({ registerDeviceSetting }) => {
703
+ if (!gone) leave = registerDeviceSetting({ key: prefix, prefix: true, kind: "view" });
704
+ },
705
+ // A module of the kit's own that fails to load has nothing to join; the provider
706
+ // and its tables work as before.
707
+ () => undefined,
708
+ );
709
+ return () => {
710
+ gone = true;
711
+ leave?.();
712
+ };
713
+ }, [prefix]);
714
+ }
715
+
666
716
  function isRecord(v: unknown): v is Record<string, unknown> {
667
717
  return typeof v === "object" && v !== null && !Array.isArray(v);
668
718
  }
@@ -701,13 +751,23 @@ function mergeOverrides(
701
751
  return out as UiKitLabelOverrides;
702
752
  }
703
753
 
704
- /** What the nearest provider says about one namespace — `undefined` outside one.
705
- * For a component whose own resolver does more than a merge (the data table
706
- * derives `columnsCount` from `columns`): feed `{ ...overrides, ...props }` to it. */
754
+ /**
755
+ * What the nearest provider says about one namespace — `undefined` outside one. Nested
756
+ * providers' words come merged, at every depth; no English default is filled in.
757
+ *
758
+ * A {@link LabelOverride}, partial at every depth, like the components' `labels` props
759
+ * that take it: a provider that names one key of a section (`accountSettings.passkeys`)
760
+ * or one preset (`dataTable.presets`) hands over just that (round 0.35 R3 — until then
761
+ * it was typed partial at the top only, so a nested section read as complete).
762
+ *
763
+ * For a component whose own resolver does more than a merge (the data table derives
764
+ * `columnsCount` from `columns`): merge the component's prop over it — a record key by
765
+ * key — and feed the result to that resolver.
766
+ */
707
767
  export function useKitLabelOverrides<K extends keyof UiKitLabels>(
708
768
  ns: K,
709
- ): Partial<UiKitLabels[K]> | undefined {
710
- return useContext(KitI18nContext).labels?.[ns] as Partial<UiKitLabels[K]> | undefined;
769
+ ): LabelOverride<UiKitLabels[K]> | undefined {
770
+ return useContext(KitI18nContext).labels?.[ns];
711
771
  }
712
772
 
713
773
  /**
@@ -198,6 +198,12 @@ export function uiKitLabelsEn(numberLocale = "en-US"): UiKitLabels {
198
198
  ? "1 item others can see will pass to an administrator."
199
199
  : `${n(count)} items others can see will pass to an administrator.`,
200
200
  },
201
+ notifications: {
202
+ ...d.notifications,
203
+ testSent: (count) => (count === 1 ? "Test sent to 1 device" : `Test sent to ${n(count)} devices`),
204
+ failures: (count) =>
205
+ count === 1 ? "1 failed delivery in a row" : `${n(count)} failed deliveries in a row`,
206
+ },
201
207
  settings: {
202
208
  ...d.settings,
203
209
  matchCount: (count) => (count === 1 ? "1 match" : `${n(count)} matches`),
@@ -259,6 +259,8 @@ export function uiKitLabelsEs(numberLocale = "es-ES"): UiKitLabels {
259
259
  noResults: "Sin resultados",
260
260
  fieldValue: (field, value) => `${field}: ${value}`,
261
261
  opensInNewTab: "se abre en una pestaña nueva",
262
+ aboutField: (field) => `Acerca de «${field}»`,
263
+ help: "Ayuda",
262
264
  },
263
265
  dataTable: {
264
266
  columns: "Columnas",
@@ -1047,6 +1049,96 @@ export function uiKitLabelsEs(numberLocale = "es-ES"): UiKitLabels {
1047
1049
  rateLimited,
1048
1050
  failed: "No ha funcionado. Inténtelo de nuevo.",
1049
1051
  },
1052
+ // 0.36.0 — docs/notifications-harmonization.md §4.2: the notification cards.
1053
+ notifications: {
1054
+ typesTitle: "Avisarme de",
1055
+ typesDescription: "Elija de qué se entera y cómo.",
1056
+ byEmail: "Por correo electrónico",
1057
+ emailUnverified: "Confirme su dirección para recibirlos.",
1058
+ digestCadence: "Frecuencia",
1059
+ digestWeekly: "Semanal",
1060
+ digestMonthly: "Mensual",
1061
+ typesLoading: "Cargando los ajustes de notificaciones…",
1062
+ typesEmpty: "No hay notificaciones para esta cuenta.",
1063
+ quietTitle: "Horas de silencio",
1064
+ quietDescription: (inbox) =>
1065
+ inbox
1066
+ ? "Sin notificaciones push durante este intervalo. Aun así, llegan a su bandeja de entrada."
1067
+ : "Sin notificaciones push durante este intervalo.",
1068
+ quietFrom: "Desde",
1069
+ quietUntil: "Hasta",
1070
+ quietIncomplete:
1071
+ "Indique una hora de inicio y una de fin. Las horas de silencio se aplican cuando ambas están definidas.",
1072
+ timeZone: "Zona horaria",
1073
+ deviceZone: (zone) => `Este dispositivo está en ${zone}.`,
1074
+ useDeviceZone: "Usarla",
1075
+ regions: {
1076
+ Africa: "África",
1077
+ America: "América",
1078
+ Antarctica: "Antártida",
1079
+ Arctic: "Ártico",
1080
+ Asia: "Asia",
1081
+ Atlantic: "Atlántico",
1082
+ Australia: "Australia",
1083
+ Europe: "Europa",
1084
+ Indian: "Océano Índico",
1085
+ Pacific: "Pacífico",
1086
+ },
1087
+ pushTitle: "Notificaciones push",
1088
+ pushDescription: "Notificaciones en este dispositivo, también con la app cerrada.",
1089
+ unsupported: "Este navegador no admite notificaciones push.",
1090
+ iosInstall: (app) =>
1091
+ `En iPhone o iPad, añada primero ${app} a la pantalla de inicio: iOS solo entrega notificaciones a la app instalada.`,
1092
+ notConfigured: "Las notificaciones push no están configuradas en este servidor.",
1093
+ blocked: "Las notificaciones están bloqueadas en los ajustes de este navegador.",
1094
+ on: "Las notificaciones están activadas en este dispositivo.",
1095
+ off: "Las notificaciones están desactivadas en este dispositivo.",
1096
+ otherAccount:
1097
+ "Este navegador recibe notificaciones de otra cuenta. Actívelas aquí para recibirlas en la cuenta con la que ha iniciado sesión.",
1098
+ enable: "Activar notificaciones",
1099
+ disable: "Desactivar",
1100
+ sendTest: "Enviar una prueba",
1101
+ enableFailed: "No se pudieron activar las notificaciones.",
1102
+ noServiceWorker:
1103
+ "No se pudo contactar con el service worker de la app. Recargue la página e inténtelo de nuevo.",
1104
+ pushTimeout: "El servicio push del navegador no respondió. Compruebe su conexión e inténtelo de nuevo.",
1105
+ testSent: (count) => `Prueba enviada a ${n(count)} ${plural(count, "dispositivo", "dispositivos")}`,
1106
+ testNone: "Ningún dispositivo aceptó la prueba. Active primero las notificaciones en este dispositivo.",
1107
+ testFailed: "No se pudo enviar la notificación de prueba.",
1108
+ explainerTitle: "¿Activar las notificaciones?",
1109
+ explainerBody: (app) =>
1110
+ `${app} solo envía notificaciones de lo que usted elija, y puede desactivarlas en cualquier momento.`,
1111
+ explainerHint: "A continuación, su navegador le pedirá permiso.",
1112
+ explainerContinue: "Continuar",
1113
+ devicesTitle: "Dispositivos de notificación",
1114
+ devicesDescription:
1115
+ "Todos los dispositivos que reciben notificaciones push de su cuenta. Quite los que ya no use.",
1116
+ devicesLoading: "Cargando dispositivos…",
1117
+ devicesEmpty: "Aún no hay ningún dispositivo que reciba notificaciones.",
1118
+ unknownDevice: "Dispositivo desconocido",
1119
+ thisDevice: "Este dispositivo",
1120
+ added: (date) => `Añadido el ${date}`,
1121
+ lastDelivery: (date) => `Última entrega el ${date}`,
1122
+ noDelivery: "Aún sin entregas",
1123
+ failures: (count) =>
1124
+ `${n(count)} ${plural(count, "entrega fallida consecutiva", "entregas fallidas consecutivas")}`,
1125
+ remove: "Quitar",
1126
+ // Starts with `remove`, the button's visible text, for voice control.
1127
+ removeItem: (device) => `Quitar ${device}`,
1128
+ removePrompt: "¿Dejar de enviar notificaciones a este dispositivo?",
1129
+ unsubscribeTitle: "Notificaciones por correo electrónico",
1130
+ unsubscribeAbout: (type) => `Recibe correos sobre: ${type}.`,
1131
+ unsubscribeGeneric: "Recibe correos de notificación.",
1132
+ stopThese: "Dejar de recibir estos correos",
1133
+ stopAll: (app) => `Dejar de recibir todos los correos de notificación de ${app}`,
1134
+ stoppedThese: "Hecho. Ya no recibirá estos correos.",
1135
+ stoppedAll: (app) => `Hecho. Ya no recibirá correos de notificación de ${app}.`,
1136
+ accountMail: "Los correos sobre su cuenta seguirán llegando.",
1137
+ turnBackOn: "Puede volver a activarlos en cualquier momento en los ajustes.",
1138
+ openSettings: "Abrir los ajustes",
1139
+ invalidLink: "Este enlace ya no funciona. Puede desactivar los correos en los ajustes.",
1140
+ failed: "No ha funcionado. Inténtelo de nuevo.",
1141
+ },
1050
1142
  sessions: {
1051
1143
  title: "Sesiones",
1052
1144
  description:
@@ -1584,6 +1676,20 @@ export function uiKitLabelsEs(numberLocale = "es-ES"): UiKitLabels {
1584
1676
  contrastModes: { system: "Sistema", standard: "Estándar", more: "Aumentado" },
1585
1677
  saveFailed: "No se ha podido guardar en su cuenta. En este dispositivo se aplica igualmente.",
1586
1678
  },
1679
+ // 0.36.0 — docs/settings-harmonization.md §11.3: resetting this device's settings, the
1680
+ // last card of "Apariencia". "Restablecer", as a phone's own settings say it.
1681
+ deviceReset: {
1682
+ title: "Restablecer este dispositivo",
1683
+ description:
1684
+ "Devuelve a sus valores predeterminados el aspecto de este dispositivo y la vista en que quedaron sus tablas y paneles. Su cuenta, sus datos y su inicio de sesión no se tocan.",
1685
+ action: "Restablecer los ajustes de este dispositivo",
1686
+ confirmTitle: "¿Restablecer los ajustes de este dispositivo?",
1687
+ confirmBody:
1688
+ "El tema, los colores, el tamaño del texto, el contraste y el idioma vuelven aquí a sus valores predeterminados, y las tablas y los paneles se abren como la primera vez. Si su cuenta tiene un idioma, un tamaño de texto o un contraste, este dispositivo vuelve a seguirlo. Su cuenta y sus otros dispositivos quedan como están.",
1689
+ confirmAction: "Restablecer",
1690
+ done: "Los ajustes de este dispositivo han vuelto a sus valores predeterminados.",
1691
+ keywords: "restablecer predeterminado valores dispositivo restaurar apariencia tablas diseño",
1692
+ },
1587
1693
  rowActions: {
1588
1694
  actions: "Acciones",
1589
1695
  actionsFor: (name) => `Acciones de ${name}`,
@@ -265,6 +265,8 @@ export function uiKitLabelsFr(numberLocale = "fr-FR"): UiKitLabels {
265
265
  // No-break space before the colon, per French typography.
266
266
  fieldValue: (field, value) => `${field}\u00a0: ${value}`,
267
267
  opensInNewTab: "s’ouvre dans un nouvel onglet",
268
+ aboutField: (field) => `À propos de «\u202f${field}\u202f»`,
269
+ help: "Aide",
268
270
  },
269
271
  dataTable: {
270
272
  columns: "Colonnes",
@@ -774,10 +776,11 @@ export function uiKitLabelsFr(numberLocale = "fr-FR"): UiKitLabels {
774
776
  submit: "Continuer",
775
777
  cancel: "Annuler",
776
778
  },
779
+ // 0.35: keksdose's reviewed French (its `boot.slow` / `boot.waking`), which is canon.
777
780
  serverWake: {
778
- slow: "Chargement en cours — cela prend plus de temps que d’habitude.",
781
+ slow: "Chargement en cours — c’est plus long que d’habitude.",
779
782
  waking: (appName) =>
780
- `Le serveur se met en veille quand personne n’utilise ${appName ?? "l’application"}, donc la première requête après une pause doit le redémarrer. Cela peut prendre un moment — rien n’est perdu, la page se remplira d’elle-même.`,
783
+ `Le serveur se met en veille quand personne n’utilise ${appName ?? "l’application"}\u202f; la première requête après une pause doit donc le réveiller. Cela peut prendre un instant — rien n’est perdu, la page se remplit toute seule.`,
781
784
  },
782
785
  // 0.28.0 — docs/legal-harmonization.md §4.3/§4.4: keksdose's reviewed French, and
783
786
  // Kurvenschmiede's for the browser section and the beta notice; spaced as this
@@ -1073,6 +1076,96 @@ export function uiKitLabelsFr(numberLocale = "fr-FR"): UiKitLabels {
1073
1076
  rateLimited,
1074
1077
  failed: "Cela n’a pas fonctionné. Veuillez réessayer.",
1075
1078
  },
1079
+ // 0.36.0 — docs/notifications-harmonization.md §4.2: the notification cards. The push
1080
+ // and device words follow keksdose's reviewed French.
1081
+ notifications: {
1082
+ typesTitle: "Me notifier pour",
1083
+ typesDescription: "Choisissez ce dont vous êtes averti, et comment.",
1084
+ byEmail: "Par e-mail",
1085
+ emailUnverified: "Confirmez votre adresse pour les recevoir.",
1086
+ digestCadence: "Fréquence",
1087
+ digestWeekly: "Hebdomadaire",
1088
+ digestMonthly: "Mensuelle",
1089
+ typesLoading: "Chargement des paramètres de notification…",
1090
+ typesEmpty: "Il n’y a aucune notification pour ce compte.",
1091
+ quietTitle: "Heures calmes",
1092
+ quietDescription: (inbox) =>
1093
+ inbox
1094
+ ? "Aucune notification push pendant cette plage. Elles arrivent quand même dans votre boîte de réception."
1095
+ : "Aucune notification push pendant cette plage.",
1096
+ quietFrom: "De",
1097
+ quietUntil: "Jusqu’à",
1098
+ quietIncomplete:
1099
+ "Définissez une heure de début et une heure de fin. Les heures calmes s’appliquent une fois les deux renseignées.",
1100
+ timeZone: "Fuseau horaire",
1101
+ deviceZone: (zone) => `Cet appareil est dans le fuseau ${zone}.`,
1102
+ useDeviceZone: "L’utiliser",
1103
+ regions: {
1104
+ Africa: "Afrique",
1105
+ America: "Amériques",
1106
+ Antarctica: "Antarctique",
1107
+ Arctic: "Arctique",
1108
+ Asia: "Asie",
1109
+ Atlantic: "Atlantique",
1110
+ Australia: "Australie",
1111
+ Europe: "Europe",
1112
+ Indian: "Océan Indien",
1113
+ Pacific: "Pacifique",
1114
+ },
1115
+ pushTitle: "Notifications push",
1116
+ pushDescription: "Les notifications sur cet appareil, même quand l’app est fermée.",
1117
+ unsupported: "Ce navigateur ne prend pas en charge les notifications push.",
1118
+ iosInstall: (app) =>
1119
+ `Sur iPhone ou iPad, ajoutez d’abord ${app} à votre écran d’accueil\u00a0: iOS ne délivre les notifications qu’à l’app installée.`,
1120
+ notConfigured: "Les notifications push ne sont pas configurées sur ce serveur.",
1121
+ blocked: "Les notifications sont bloquées dans les réglages de ce navigateur.",
1122
+ on: "Les notifications sont activées pour cet appareil.",
1123
+ off: "Les notifications sont désactivées pour cet appareil.",
1124
+ otherAccount:
1125
+ "Ce navigateur reçoit les notifications d’un autre compte. Activez-les ici pour les recevoir sur le compte avec lequel vous êtes connecté.",
1126
+ enable: "Activer les notifications",
1127
+ disable: "Désactiver",
1128
+ sendTest: "Envoyer un test",
1129
+ enableFailed: "Impossible d’activer les notifications.",
1130
+ noServiceWorker: "Impossible de joindre le service worker de l’app. Rechargez la page et réessayez.",
1131
+ pushTimeout: "Le service push du navigateur n’a pas répondu. Vérifiez votre connexion et réessayez.",
1132
+ testSent: (count) => `Test envoyé à ${n(count)} ${plural(count, "appareil", "appareils")}`,
1133
+ testNone: "Aucun appareil n’a accepté le test. Activez d’abord les notifications pour cet appareil.",
1134
+ testFailed: "Impossible d’envoyer la notification de test.",
1135
+ explainerTitle: "Activer les notifications\u202f?",
1136
+ explainerBody: (app) =>
1137
+ `${app} n’envoie de notifications que pour ce que vous choisissez, et vous pouvez les désactiver à tout moment.`,
1138
+ explainerHint: "Votre navigateur va ensuite demander l’autorisation.",
1139
+ explainerContinue: "Continuer",
1140
+ devicesTitle: "Appareils de notification",
1141
+ devicesDescription:
1142
+ "Tous les appareils qui reçoivent des notifications push pour votre compte. Retirez ceux que vous n’utilisez plus.",
1143
+ devicesLoading: "Chargement des appareils…",
1144
+ devicesEmpty: "Aucun appareil ne reçoit encore de notifications.",
1145
+ unknownDevice: "Appareil inconnu",
1146
+ thisDevice: "Cet appareil",
1147
+ added: (date) => `Ajouté le ${date}`,
1148
+ lastDelivery: (date) => `Dernière remise le ${date}`,
1149
+ noDelivery: "Aucune remise pour l’instant",
1150
+ failures: (count) =>
1151
+ `${n(count)} ${plural(count, "remise échouée", "remises échouées")} d’affilée`,
1152
+ remove: "Retirer",
1153
+ // Starts with `remove`, the button's visible text, for voice control.
1154
+ removeItem: (device) => `Retirer ${device}`,
1155
+ removePrompt: "Ne plus envoyer de notifications à cet appareil\u202f?",
1156
+ unsubscribeTitle: "Notifications par e-mail",
1157
+ unsubscribeAbout: (type) => `Vous recevez des e-mails concernant\u00a0: ${type}.`,
1158
+ unsubscribeGeneric: "Vous recevez des e-mails de notification.",
1159
+ stopThese: "Ne plus recevoir ces e-mails",
1160
+ stopAll: (app) => `Ne plus recevoir aucun e-mail de notification de ${app}`,
1161
+ stoppedThese: "C’est fait. Vous ne recevrez plus ces e-mails.",
1162
+ stoppedAll: (app) => `C’est fait. Vous ne recevrez plus d’e-mails de notification de ${app}.`,
1163
+ accountMail: "Les e-mails concernant votre compte continuent d’arriver.",
1164
+ turnBackOn: "Vous pouvez les réactiver à tout moment dans les paramètres.",
1165
+ openSettings: "Ouvrir les paramètres",
1166
+ invalidLink: "Ce lien ne fonctionne plus. Vous pouvez désactiver les e-mails dans les paramètres.",
1167
+ failed: "Cela n’a pas fonctionné. Veuillez réessayer.",
1168
+ },
1076
1169
  sessions: {
1077
1170
  title: "Sessions",
1078
1171
  description:
@@ -1623,6 +1716,20 @@ export function uiKitLabelsFr(numberLocale = "fr-FR"): UiKitLabels {
1623
1716
  contrastModes: { system: "Système", standard: "Standard", more: "Renforcé" },
1624
1717
  saveFailed: "Impossible de l’enregistrer dans votre compte. Le réglage s’applique tout de même sur cet appareil.",
1625
1718
  },
1719
+ // 0.36.0 — docs/settings-harmonization.md §11.3: resetting this device's settings, the
1720
+ // last card of "Apparence". "Réglages", as `contrastHelp` says "réglage".
1721
+ deviceReset: {
1722
+ title: "Réinitialiser cet appareil",
1723
+ description:
1724
+ "Rétablit les valeurs par défaut de l’apparence de cet appareil et de l’état dans lequel ses tableaux et ses panneaux ont été laissés. Votre compte, vos données et votre connexion ne sont pas touchés.",
1725
+ action: "Réinitialiser les réglages de cet appareil",
1726
+ confirmTitle: "Réinitialiser les réglages de cet appareil ?",
1727
+ confirmBody:
1728
+ "Le thème, les couleurs, la taille du texte, le contraste et la langue reprennent ici leurs valeurs par défaut, et les tableaux et les panneaux s’ouvrent comme la première fois. Si votre compte définit une langue, une taille de texte ou un contraste, cet appareil s’y conforme de nouveau. Votre compte et vos autres appareils restent tels quels.",
1729
+ confirmAction: "Réinitialiser",
1730
+ done: "Les réglages de cet appareil ont retrouvé leurs valeurs par défaut.",
1731
+ keywords: "réinitialiser défaut appareil restaurer rétablir apparence tableaux disposition",
1732
+ },
1626
1733
  rowActions: {
1627
1734
  actions: "Actions",
1628
1735
  actionsFor: (name) => `Actions pour ${name}`,