@eifi1/ui-kit 0.46.1 → 0.48.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.
- package/README.md +8 -6
- package/dist/admin/admin-sections.d.ts +8 -0
- package/dist/admin/admin-sections.js +2 -1
- package/dist/admin/admin-sections.js.map +1 -1
- package/dist/auth/verify-email.d.ts +9 -1
- package/dist/auth/verify-email.js +22 -13
- package/dist/auth/verify-email.js.map +1 -1
- package/dist/components/alert-banner.d.ts +29 -1
- package/dist/components/alert-banner.js +84 -7
- package/dist/components/alert-banner.js.map +1 -1
- package/dist/components/button-look.d.ts +4 -0
- package/dist/components/button-look.js +2 -0
- package/dist/components/button-look.js.map +1 -1
- package/dist/components/combobox-core.js +5 -1
- package/dist/components/combobox-core.js.map +1 -1
- package/dist/components/data-table-column-settings.d.ts +6 -1
- package/dist/components/data-table-column-settings.js +12 -2
- package/dist/components/data-table-column-settings.js.map +1 -1
- package/dist/components/data-table-fit.d.ts +44 -0
- package/dist/components/data-table-fit.js +103 -0
- package/dist/components/data-table-fit.js.map +1 -0
- package/dist/components/data-table-groups.d.ts +95 -0
- package/dist/components/data-table-groups.js +165 -0
- package/dist/components/data-table-groups.js.map +1 -0
- package/dist/components/data-table-head.js +3 -1
- package/dist/components/data-table-head.js.map +1 -1
- package/dist/components/data-table-labels.d.ts +7 -0
- package/dist/components/data-table-labels.js +3 -0
- package/dist/components/data-table-labels.js.map +1 -1
- package/dist/components/data-table-leading-row.d.ts +17 -0
- package/dist/components/data-table-leading-row.js +41 -0
- package/dist/components/data-table-leading-row.js.map +1 -0
- package/dist/components/data-table-resize.js +1 -1
- package/dist/components/data-table-resize.js.map +1 -1
- package/dist/components/data-table.d.ts +78 -2
- package/dist/components/data-table.js +355 -247
- package/dist/components/data-table.js.map +1 -1
- package/dist/components/disclosure.d.ts +3 -1
- package/dist/components/disclosure.js +10 -4
- package/dist/components/disclosure.js.map +1 -1
- package/dist/components/dropdown.js +8 -1
- package/dist/components/dropdown.js.map +1 -1
- package/dist/components/floating-panel.d.ts +14 -1
- package/dist/components/floating-panel.js +7 -2
- package/dist/components/floating-panel.js.map +1 -1
- package/dist/components/hover-menu.js +5 -1
- package/dist/components/hover-menu.js.map +1 -1
- package/dist/components/icon-button.js +2 -1
- package/dist/components/icon-button.js.map +1 -1
- package/dist/components/popover.js +5 -1
- package/dist/components/popover.js.map +1 -1
- package/dist/components/row-actions.d.ts +25 -0
- package/dist/components/row-actions.js +13 -3
- package/dist/components/row-actions.js.map +1 -1
- package/dist/components/table-skeleton.d.ts +35 -0
- package/dist/components/table-skeleton.js +75 -0
- package/dist/components/table-skeleton.js.map +1 -0
- package/dist/components/tabs.d.ts +22 -16
- package/dist/components/tabs.js +47 -31
- package/dist/components/tabs.js.map +1 -1
- package/dist/components/ui-labels.js +1 -1
- package/dist/components/ui-labels.js.map +1 -1
- package/dist/components/use-table-state.d.ts +8 -7
- package/dist/components/use-table-state.js +37 -3
- package/dist/components/use-table-state.js.map +1 -1
- package/dist/data-table.d.ts +1 -0
- package/dist/data-table.js.map +1 -1
- package/dist/eslint/index.js +1 -1
- package/dist/feedback/feedback-attachment-download.d.ts +19 -0
- package/dist/feedback/feedback-attachment-download.js +59 -0
- package/dist/feedback/feedback-attachment-download.js.map +1 -0
- package/dist/feedback/feedback-comment-thread.d.ts +17 -6
- package/dist/feedback/feedback-comment-thread.js +21 -2
- package/dist/feedback/feedback-comment-thread.js.map +1 -1
- package/dist/feedback/feedback-entry-file.d.ts +61 -0
- package/dist/feedback/feedback-entry-file.js +76 -0
- package/dist/feedback/feedback-entry-file.js.map +1 -0
- package/dist/feedback/feedback-public-list.d.ts +18 -5
- package/dist/feedback/feedback-public-list.js +8 -0
- package/dist/feedback/feedback-public-list.js.map +1 -1
- package/dist/feedback/feedback-public-types.d.ts +7 -2
- package/dist/feedback/feedback-replies.d.ts +26 -9
- package/dist/feedback/feedback-replies.js +20 -10
- package/dist/feedback/feedback-replies.js.map +1 -1
- package/dist/feedback/feedback-row-detail-labels.js +0 -1
- package/dist/feedback/feedback-row-detail-labels.js.map +1 -1
- package/dist/feedback/feedback-row-detail.d.ts +23 -10
- package/dist/feedback/feedback-row-detail.js +10 -54
- package/dist/feedback/feedback-row-detail.js.map +1 -1
- package/dist/feedback/feedback-table.d.ts +5 -0
- package/dist/feedback/feedback-table.js +30 -7
- package/dist/feedback/feedback-table.js.map +1 -1
- package/dist/feedback.d.ts +1 -0
- package/dist/feedback.js +1 -0
- package/dist/feedback.js.map +1 -1
- package/dist/hooks/use-dismiss.d.ts +30 -1
- package/dist/hooks/use-dismiss.js +30 -2
- package/dist/hooks/use-dismiss.js.map +1 -1
- package/dist/i18n/german.js +7 -7
- package/dist/i18n/german.js.map +1 -1
- package/dist/i18n/kit-labels.d.ts +4 -0
- package/dist/i18n/kit-labels.js.map +1 -1
- package/dist/i18n/locales/en.js +7 -7
- package/dist/i18n/locales/en.js.map +2 -2
- package/dist/i18n/locales/es.js +7 -7
- package/dist/i18n/locales/es.js.map +1 -1
- package/dist/i18n/locales/fr.js +7 -7
- package/dist/i18n/locales/fr.js.map +1 -1
- package/dist/i18n/locales/hu.js +7 -7
- package/dist/i18n/locales/hu.js.map +1 -1
- package/dist/i18n/locales/it.js +7 -7
- package/dist/i18n/locales/it.js.map +1 -1
- package/dist/i18n/locales/zh.js +7 -7
- package/dist/i18n/locales/zh.js.map +1 -1
- package/dist/i18n/review.js +0 -1
- package/dist/i18n/review.js.map +1 -1
- package/dist/i18n/shared-labels.js +3 -1
- package/dist/i18n/shared-labels.js.map +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.js +13 -4
- package/dist/index.js.map +1 -1
- package/dist/lib/float-clearance.d.ts +8 -0
- package/dist/lib/float-clearance.js +29 -0
- package/dist/lib/float-clearance.js.map +1 -0
- package/dist/notifications/device-zone-report.d.ts +1 -1
- package/dist/notifications/device-zone-report.js.map +1 -1
- package/dist/notifications/notification-types.d.ts +0 -3
- package/dist/notifications/notifications-labels.d.ts +2 -15
- package/dist/notifications/notifications-labels.js +0 -4
- package/dist/notifications/notifications-labels.js.map +1 -1
- package/dist/notifications/quiet-hours-setting.d.ts +3 -8
- package/dist/notifications/quiet-hours-setting.js +8 -3
- package/dist/notifications/quiet-hours-setting.js.map +1 -1
- package/dist/settings/settings-catalogue.d.ts +10 -0
- package/dist/settings/settings-catalogue.js.map +1 -1
- package/dist/settings/settings-layout.js +10 -3
- package/dist/settings/settings-layout.js.map +1 -1
- package/dist/shell/app-shell.d.ts +5 -0
- package/dist/shell/app-shell.js +5 -3
- package/dist/shell/app-shell.js.map +1 -1
- package/dist/shell/option-switcher-menu.d.ts +2 -0
- package/dist/shell/option-switcher-menu.js +6 -2
- package/dist/shell/option-switcher-menu.js.map +1 -1
- package/dist/shell/topbar-action-menu.js +2 -1
- package/dist/shell/topbar-action-menu.js.map +1 -1
- package/dist/shell/topbar-controls.js +5 -3
- package/dist/shell/topbar-controls.js.map +1 -1
- package/dist/theme/theme-store.d.ts +4 -4
- package/dist/theme/theme-store.js +1 -0
- package/dist/theme/theme-store.js.map +1 -1
- package/dist/tour/tour.js +1 -0
- package/dist/tour/tour.js.map +1 -1
- package/package.json +2 -2
- package/src/admin/admin-sections.tsx +8 -0
- package/src/auth/verify-email.tsx +34 -9
- package/src/components/alert-banner.tsx +131 -7
- package/src/components/button-look.ts +6 -0
- package/src/components/combobox-core.tsx +7 -1
- package/src/components/data-table-column-settings.tsx +23 -2
- package/src/components/data-table-fit.ts +187 -0
- package/src/components/data-table-groups.tsx +275 -0
- package/src/components/data-table-head.tsx +4 -1
- package/src/components/data-table-labels.ts +13 -0
- package/src/components/data-table-leading-row.tsx +55 -0
- package/src/components/data-table-resize.ts +2 -1
- package/src/components/data-table.tsx +274 -45
- package/src/components/disclosure.tsx +22 -5
- package/src/components/dropdown.tsx +11 -1
- package/src/components/floating-panel.tsx +24 -1
- package/src/components/hover-menu.tsx +6 -1
- package/src/components/icon-button.tsx +3 -3
- package/src/components/popover.tsx +7 -1
- package/src/components/row-actions.tsx +42 -3
- package/src/components/table-skeleton.tsx +133 -0
- package/src/components/tabs.tsx +102 -50
- package/src/components/ui-labels.ts +1 -1
- package/src/components/use-table-state.ts +54 -3
- package/src/data-table.ts +2 -0
- package/src/feedback/feedback-attachment-download.tsx +77 -0
- package/src/feedback/feedback-comment-thread.tsx +42 -7
- package/src/feedback/feedback-entry-file.tsx +150 -0
- package/src/feedback/feedback-public-list.tsx +25 -4
- package/src/feedback/feedback-public-types.ts +7 -2
- package/src/feedback/feedback-replies.tsx +46 -19
- package/src/feedback/feedback-row-detail-labels.ts +0 -1
- package/src/feedback/feedback-row-detail.tsx +35 -86
- package/src/feedback/feedback-table.tsx +33 -1
- package/src/feedback.ts +1 -0
- package/src/hooks/use-dismiss.ts +65 -3
- package/src/i18n/german.ts +6 -6
- package/src/i18n/kit-labels.tsx +4 -0
- package/src/i18n/locales/es.ts +6 -6
- package/src/i18n/locales/fr.ts +6 -6
- package/src/i18n/locales/hu.ts +6 -6
- package/src/i18n/locales/it.ts +6 -6
- package/src/i18n/locales/zh.ts +6 -6
- package/src/i18n/review.ts +0 -1
- package/src/i18n/shared-labels.ts +2 -0
- package/src/index.ts +13 -3
- package/src/lib/float-clearance.ts +54 -0
- package/src/notifications/device-zone-report.ts +1 -1
- package/src/notifications/notification-types.ts +0 -3
- package/src/notifications/notifications-labels.ts +2 -19
- package/src/notifications/quiet-hours-setting.tsx +16 -11
- package/src/settings/settings-catalogue.ts +10 -0
- package/src/settings/settings-layout.tsx +18 -4
- package/src/shell/app-shell.tsx +17 -3
- package/src/shell/option-switcher-menu.tsx +16 -4
- package/src/shell/topbar-action-menu.tsx +22 -10
- package/src/shell/topbar-controls.tsx +18 -12
- package/src/theme/theme-store.ts +13 -5
- package/src/tour/tour.tsx +5 -0
- package/dist/notifications/time-zone-select.d.ts +0 -54
- package/dist/notifications/time-zone-select.js +0 -71
- package/dist/notifications/time-zone-select.js.map +0 -1
- package/src/notifications/time-zone-select.tsx +0 -125
package/src/i18n/locales/es.ts
CHANGED
|
@@ -193,7 +193,6 @@ export function uiKitLabelsEs(numberLocale = "es-ES"): UiKitLabels {
|
|
|
193
193
|
outcomeUpdate: "Actualizar",
|
|
194
194
|
outcomePlaceholder: "Qué se ha hecho o decidido, o por qué no se abordará.",
|
|
195
195
|
rework: "Corrección",
|
|
196
|
-
openPage: "Abrir página",
|
|
197
196
|
reworkTitle: "Devolver para corrección",
|
|
198
197
|
reworkSend: "Solicitar corrección",
|
|
199
198
|
reworkPlaceholder: "¿Qué falta por pulir? Nuevos requisitos o cambios de rumbo.",
|
|
@@ -331,6 +330,8 @@ export function uiKitLabelsEs(numberLocale = "es-ES"): UiKitLabels {
|
|
|
331
330
|
opensInNewTab: "se abre en una pestaña nueva",
|
|
332
331
|
aboutField: (field) => `Acerca de «${field}»`,
|
|
333
332
|
help: "Ayuda",
|
|
333
|
+
showMore: "Más",
|
|
334
|
+
showLess: "Menos",
|
|
334
335
|
},
|
|
335
336
|
dataTable: {
|
|
336
337
|
columns: "Columnas",
|
|
@@ -343,6 +344,7 @@ export function uiKitLabelsEs(numberLocale = "es-ES"): UiKitLabels {
|
|
|
343
344
|
cancelSelection: "Cancelar",
|
|
344
345
|
rowDetails: "Detalles",
|
|
345
346
|
autoSize: "Ajustar ancho de columnas",
|
|
347
|
+
hiddenForWidth: "oculta por falta de espacio",
|
|
346
348
|
loading: "Cargando…",
|
|
347
349
|
filters: "Filtros",
|
|
348
350
|
clearAll: "Borrar todo",
|
|
@@ -392,6 +394,8 @@ export function uiKitLabelsEs(numberLocale = "es-ES"): UiKitLabels {
|
|
|
392
394
|
booleanTrue: "Sí",
|
|
393
395
|
booleanFalse: "No",
|
|
394
396
|
booleanUnset: "Sin definir",
|
|
397
|
+
loadMore: "Cargar más",
|
|
398
|
+
allLoaded: "Todas las filas cargadas",
|
|
395
399
|
sortBy: "Ordenar por",
|
|
396
400
|
sortDefault: "Orden predeterminado",
|
|
397
401
|
sortAscending: "Ascendente",
|
|
@@ -528,7 +532,7 @@ export function uiKitLabelsEs(numberLocale = "es-ES"): UiKitLabels {
|
|
|
528
532
|
add: "Añadir pestaña",
|
|
529
533
|
remove: (tab) => `Quitar ${tab}`,
|
|
530
534
|
more: "Más pestañas",
|
|
531
|
-
|
|
535
|
+
previous: "Pestañas anteriores",
|
|
532
536
|
},
|
|
533
537
|
appShell: {
|
|
534
538
|
collapse: "Contraer barra lateral",
|
|
@@ -1158,7 +1162,6 @@ export function uiKitLabelsEs(numberLocale = "es-ES"): UiKitLabels {
|
|
|
1158
1162
|
notifications: {
|
|
1159
1163
|
typesTitle: "Avisarme de",
|
|
1160
1164
|
typesDescription: "Elija de qué se entera y cómo.",
|
|
1161
|
-
byEmail: "Por correo electrónico",
|
|
1162
1165
|
channelApp: "En la app",
|
|
1163
1166
|
channelPush: "Push",
|
|
1164
1167
|
channelEmail: "Correo",
|
|
@@ -1182,9 +1185,6 @@ export function uiKitLabelsEs(numberLocale = "es-ES"): UiKitLabels {
|
|
|
1182
1185
|
quietUntil: "Hasta",
|
|
1183
1186
|
quietIncomplete:
|
|
1184
1187
|
"Indique una hora de inicio y una de fin. Las horas de silencio se aplican cuando ambas están definidas.",
|
|
1185
|
-
timeZone: "Zona horaria",
|
|
1186
|
-
deviceZone: (zone) => `Este dispositivo está en ${zone}.`,
|
|
1187
|
-
useDeviceZone: "Usarla",
|
|
1188
1188
|
regions: {
|
|
1189
1189
|
Africa: "África",
|
|
1190
1190
|
America: "América",
|
package/src/i18n/locales/fr.ts
CHANGED
|
@@ -191,7 +191,6 @@ export function uiKitLabelsFr(numberLocale = "fr-FR"): UiKitLabels {
|
|
|
191
191
|
outcomeUpdate: "Mettre à jour",
|
|
192
192
|
outcomePlaceholder: "Ce qui a été fait ou décidé, ou pourquoi ce point ne sera pas traité.",
|
|
193
193
|
rework: "Reprise",
|
|
194
|
-
openPage: "Ouvrir la page",
|
|
195
194
|
reworkTitle: "Renvoyer pour reprise",
|
|
196
195
|
reworkSend: "Demander la reprise",
|
|
197
196
|
reworkPlaceholder:
|
|
@@ -337,6 +336,8 @@ export function uiKitLabelsFr(numberLocale = "fr-FR"): UiKitLabels {
|
|
|
337
336
|
opensInNewTab: "s’ouvre dans un nouvel onglet",
|
|
338
337
|
aboutField: (field) => `À propos de «\u202f${field}\u202f»`,
|
|
339
338
|
help: "Aide",
|
|
339
|
+
showMore: "Plus",
|
|
340
|
+
showLess: "Moins",
|
|
340
341
|
},
|
|
341
342
|
dataTable: {
|
|
342
343
|
columns: "Colonnes",
|
|
@@ -349,6 +350,7 @@ export function uiKitLabelsFr(numberLocale = "fr-FR"): UiKitLabels {
|
|
|
349
350
|
cancelSelection: "Annuler",
|
|
350
351
|
rowDetails: "Détails",
|
|
351
352
|
autoSize: "Ajuster la largeur des colonnes",
|
|
353
|
+
hiddenForWidth: "masquée faute de place",
|
|
352
354
|
loading: "Chargement…",
|
|
353
355
|
filters: "Filtres",
|
|
354
356
|
clearAll: "Tout effacer",
|
|
@@ -398,6 +400,8 @@ export function uiKitLabelsFr(numberLocale = "fr-FR"): UiKitLabels {
|
|
|
398
400
|
booleanTrue: "Oui",
|
|
399
401
|
booleanFalse: "Non",
|
|
400
402
|
booleanUnset: "Non défini",
|
|
403
|
+
loadMore: "Charger plus",
|
|
404
|
+
allLoaded: "Toutes les lignes sont chargées",
|
|
401
405
|
sortBy: "Trier par",
|
|
402
406
|
sortDefault: "Ordre par défaut",
|
|
403
407
|
sortAscending: "Croissant",
|
|
@@ -536,7 +540,7 @@ export function uiKitLabelsFr(numberLocale = "fr-FR"): UiKitLabels {
|
|
|
536
540
|
add: "Ajouter un onglet",
|
|
537
541
|
remove: (tab) => `Supprimer ${tab}`,
|
|
538
542
|
more: "Autres onglets",
|
|
539
|
-
|
|
543
|
+
previous: "Onglets précédents",
|
|
540
544
|
},
|
|
541
545
|
appShell: {
|
|
542
546
|
collapse: "Réduire la barre latérale",
|
|
@@ -1186,7 +1190,6 @@ export function uiKitLabelsFr(numberLocale = "fr-FR"): UiKitLabels {
|
|
|
1186
1190
|
notifications: {
|
|
1187
1191
|
typesTitle: "Me notifier pour",
|
|
1188
1192
|
typesDescription: "Choisissez ce dont vous êtes averti, et comment.",
|
|
1189
|
-
byEmail: "Par e-mail",
|
|
1190
1193
|
channelApp: "Dans l’app",
|
|
1191
1194
|
channelPush: "Push",
|
|
1192
1195
|
channelEmail: "E-mail",
|
|
@@ -1210,9 +1213,6 @@ export function uiKitLabelsFr(numberLocale = "fr-FR"): UiKitLabels {
|
|
|
1210
1213
|
quietUntil: "Jusqu’à",
|
|
1211
1214
|
quietIncomplete:
|
|
1212
1215
|
"Définissez une heure de début et une heure de fin. Les heures calmes s’appliquent une fois les deux renseignées.",
|
|
1213
|
-
timeZone: "Fuseau horaire",
|
|
1214
|
-
deviceZone: (zone) => `Cet appareil est dans le fuseau ${zone}.`,
|
|
1215
|
-
useDeviceZone: "L’utiliser",
|
|
1216
1216
|
regions: {
|
|
1217
1217
|
Africa: "Afrique",
|
|
1218
1218
|
America: "Amériques",
|
package/src/i18n/locales/hu.ts
CHANGED
|
@@ -190,7 +190,6 @@ export function uiKitLabelsHu(numberLocale = "hu-HU"): UiKitLabels {
|
|
|
190
190
|
outcomeUpdate: "Frissítés",
|
|
191
191
|
outcomePlaceholder: "Mi készült el, mi a döntés, vagy miért nem valósul meg.",
|
|
192
192
|
rework: "Átdolgozás",
|
|
193
|
-
openPage: "Oldal megnyitása",
|
|
194
193
|
reworkTitle: "Visszaküldés átdolgozásra",
|
|
195
194
|
reworkSend: "Átdolgozás kérése",
|
|
196
195
|
reworkPlaceholder: "Min kell még finomítani? Új feltételek vagy irányváltás.",
|
|
@@ -329,6 +328,8 @@ export function uiKitLabelsHu(numberLocale = "hu-HU"): UiKitLabels {
|
|
|
329
328
|
opensInNewTab: "új lapon nyílik meg",
|
|
330
329
|
aboutField: (field) => `Súgó: ${field}`,
|
|
331
330
|
help: "Súgó",
|
|
331
|
+
showMore: "Több",
|
|
332
|
+
showLess: "Kevesebb",
|
|
332
333
|
},
|
|
333
334
|
dataTable: {
|
|
334
335
|
columns: "Oszlopok",
|
|
@@ -341,6 +342,7 @@ export function uiKitLabelsHu(numberLocale = "hu-HU"): UiKitLabels {
|
|
|
341
342
|
cancelSelection: "Mégse",
|
|
342
343
|
rowDetails: "Részletek",
|
|
343
344
|
autoSize: "Oszlopszélességek igazítása",
|
|
345
|
+
hiddenForWidth: "szélesség miatt rejtve",
|
|
344
346
|
loading: "Betöltés…",
|
|
345
347
|
filters: "Szűrők",
|
|
346
348
|
clearAll: "Összes törlése",
|
|
@@ -390,6 +392,8 @@ export function uiKitLabelsHu(numberLocale = "hu-HU"): UiKitLabels {
|
|
|
390
392
|
booleanTrue: "Igen",
|
|
391
393
|
booleanFalse: "Nem",
|
|
392
394
|
booleanUnset: "Nincs megadva",
|
|
395
|
+
loadMore: "Továbbiak betöltése",
|
|
396
|
+
allLoaded: "Minden sor betöltve",
|
|
393
397
|
sortBy: "Rendezés alapja",
|
|
394
398
|
sortDefault: "Alapértelmezett sorrend",
|
|
395
399
|
sortAscending: "Növekvő",
|
|
@@ -526,7 +530,7 @@ export function uiKitLabelsHu(numberLocale = "hu-HU"): UiKitLabels {
|
|
|
526
530
|
add: "Lap hozzáadása",
|
|
527
531
|
remove: (tab) => `${tab} eltávolítása`,
|
|
528
532
|
more: "További lapok",
|
|
529
|
-
|
|
533
|
+
previous: "Előző lapok",
|
|
530
534
|
},
|
|
531
535
|
appShell: {
|
|
532
536
|
collapse: "Oldalsáv összecsukása",
|
|
@@ -1169,7 +1173,6 @@ export function uiKitLabelsHu(numberLocale = "hu-HU"): UiKitLabels {
|
|
|
1169
1173
|
notifications: {
|
|
1170
1174
|
typesTitle: "Értesítést kérek ezekről",
|
|
1171
1175
|
typesDescription: "Válassza ki, miről és hogyan kapjon értesítést.",
|
|
1172
|
-
byEmail: "E-mailben",
|
|
1173
1176
|
channelApp: "Az appban",
|
|
1174
1177
|
channelPush: "Push",
|
|
1175
1178
|
channelEmail: "E-mail",
|
|
@@ -1193,9 +1196,6 @@ export function uiKitLabelsHu(numberLocale = "hu-HU"): UiKitLabels {
|
|
|
1193
1196
|
quietUntil: "Eddig",
|
|
1194
1197
|
quietIncomplete:
|
|
1195
1198
|
"Adjon meg kezdő és záró időpontot is. A csendes órák csak akkor lépnek életbe, ha mindkettő be van állítva.",
|
|
1196
|
-
timeZone: "Időzóna",
|
|
1197
|
-
deviceZone: (zone) => `Ez az eszköz ebben az időzónában van: ${zone}.`,
|
|
1198
|
-
useDeviceZone: "Ezt használom",
|
|
1199
1199
|
regions: {
|
|
1200
1200
|
Africa: "Afrika",
|
|
1201
1201
|
America: "Amerika",
|
package/src/i18n/locales/it.ts
CHANGED
|
@@ -193,7 +193,6 @@ export function uiKitLabelsIt(numberLocale = "it-IT"): UiKitLabels {
|
|
|
193
193
|
outcomeUpdate: "Aggiorna",
|
|
194
194
|
outcomePlaceholder: "Cosa è stato fatto o deciso, oppure perché non verrà affrontato.",
|
|
195
195
|
rework: "Rielaborazione",
|
|
196
|
-
openPage: "Apri pagina",
|
|
197
196
|
reworkTitle: "Rimanda in rielaborazione",
|
|
198
197
|
reworkSend: "Richiedi rielaborazione",
|
|
199
198
|
reworkPlaceholder: "Cosa va ancora perfezionato? Eventuali nuovi vincoli o cambi di direzione.",
|
|
@@ -333,6 +332,8 @@ export function uiKitLabelsIt(numberLocale = "it-IT"): UiKitLabels {
|
|
|
333
332
|
opensInNewTab: "si apre in una nuova scheda",
|
|
334
333
|
aboutField: (field) => `Informazioni su «${field}»`,
|
|
335
334
|
help: "Aiuto",
|
|
335
|
+
showMore: "Altro",
|
|
336
|
+
showLess: "Meno",
|
|
336
337
|
},
|
|
337
338
|
dataTable: {
|
|
338
339
|
columns: "Colonne",
|
|
@@ -345,6 +346,7 @@ export function uiKitLabelsIt(numberLocale = "it-IT"): UiKitLabels {
|
|
|
345
346
|
cancelSelection: "Annulla",
|
|
346
347
|
rowDetails: "Dettagli",
|
|
347
348
|
autoSize: "Adatta larghezza colonne",
|
|
349
|
+
hiddenForWidth: "nascosta per mancanza di spazio",
|
|
348
350
|
loading: "Caricamento…",
|
|
349
351
|
filters: "Filtri",
|
|
350
352
|
clearAll: "Cancella tutto",
|
|
@@ -394,6 +396,8 @@ export function uiKitLabelsIt(numberLocale = "it-IT"): UiKitLabels {
|
|
|
394
396
|
booleanTrue: "Sì",
|
|
395
397
|
booleanFalse: "No",
|
|
396
398
|
booleanUnset: "Non impostato",
|
|
399
|
+
loadMore: "Carica altro",
|
|
400
|
+
allLoaded: "Tutte le righe caricate",
|
|
397
401
|
sortBy: "Ordina per",
|
|
398
402
|
sortDefault: "Ordine predefinito",
|
|
399
403
|
sortAscending: "Crescente",
|
|
@@ -531,7 +535,7 @@ export function uiKitLabelsIt(numberLocale = "it-IT"): UiKitLabels {
|
|
|
531
535
|
add: "Aggiungi scheda",
|
|
532
536
|
remove: (tab) => `Rimuovi ${tab}`,
|
|
533
537
|
more: "Altre schede",
|
|
534
|
-
|
|
538
|
+
previous: "Schede precedenti",
|
|
535
539
|
},
|
|
536
540
|
appShell: {
|
|
537
541
|
collapse: "Comprimi barra laterale",
|
|
@@ -1170,7 +1174,6 @@ export function uiKitLabelsIt(numberLocale = "it-IT"): UiKitLabels {
|
|
|
1170
1174
|
notifications: {
|
|
1171
1175
|
typesTitle: "Avvisami per",
|
|
1172
1176
|
typesDescription: "Scelga di cosa essere avvisato, e come.",
|
|
1173
|
-
byEmail: "Per e-mail",
|
|
1174
1177
|
channelApp: "Nell’app",
|
|
1175
1178
|
channelPush: "Push",
|
|
1176
1179
|
channelEmail: "E-mail",
|
|
@@ -1194,9 +1197,6 @@ export function uiKitLabelsIt(numberLocale = "it-IT"): UiKitLabels {
|
|
|
1194
1197
|
quietUntil: "Alle",
|
|
1195
1198
|
quietIncomplete:
|
|
1196
1199
|
"Imposti sia l’ora di inizio sia quella di fine. Le ore di silenzio valgono solo quando sono impostate entrambe.",
|
|
1197
|
-
timeZone: "Fuso orario",
|
|
1198
|
-
deviceZone: (zone) => `Questo dispositivo è nel fuso ${zone}.`,
|
|
1199
|
-
useDeviceZone: "Usa questo",
|
|
1200
1200
|
regions: {
|
|
1201
1201
|
Africa: "Africa",
|
|
1202
1202
|
America: "Americhe",
|
package/src/i18n/locales/zh.ts
CHANGED
|
@@ -183,7 +183,6 @@ export function uiKitLabelsZh(numberLocale = "zh-CN"): UiKitLabels {
|
|
|
183
183
|
outcomeUpdate: "更新",
|
|
184
184
|
outcomePlaceholder: "做了什么、作出了什么决定,或为什么不予处理。",
|
|
185
185
|
rework: "返工",
|
|
186
|
-
openPage: "打开页面",
|
|
187
186
|
reworkTitle: "退回返工",
|
|
188
187
|
reworkSend: "提交返工",
|
|
189
188
|
reworkPlaceholder: "还有哪些需要完善?如有新的限制或方向调整,请一并说明。",
|
|
@@ -321,6 +320,8 @@ export function uiKitLabelsZh(numberLocale = "zh-CN"): UiKitLabels {
|
|
|
321
320
|
opensInNewTab: "在新标签页中打开",
|
|
322
321
|
aboutField: (field) => `关于“${field}”`,
|
|
323
322
|
help: "帮助",
|
|
323
|
+
showMore: "更多",
|
|
324
|
+
showLess: "收起",
|
|
324
325
|
},
|
|
325
326
|
dataTable: {
|
|
326
327
|
columns: "列",
|
|
@@ -333,6 +334,7 @@ export function uiKitLabelsZh(numberLocale = "zh-CN"): UiKitLabels {
|
|
|
333
334
|
cancelSelection: "取消",
|
|
334
335
|
rowDetails: "详情",
|
|
335
336
|
autoSize: "自动调整列宽",
|
|
337
|
+
hiddenForWidth: "宽度不足,已隐藏",
|
|
336
338
|
loading: "加载中…",
|
|
337
339
|
filters: "筛选条件",
|
|
338
340
|
clearAll: "全部清除",
|
|
@@ -381,6 +383,8 @@ export function uiKitLabelsZh(numberLocale = "zh-CN"): UiKitLabels {
|
|
|
381
383
|
booleanTrue: "是",
|
|
382
384
|
booleanFalse: "否",
|
|
383
385
|
booleanUnset: "未设置",
|
|
386
|
+
loadMore: "加载更多",
|
|
387
|
+
allLoaded: "已加载全部行",
|
|
384
388
|
sortBy: "排序依据",
|
|
385
389
|
sortDefault: "默认顺序",
|
|
386
390
|
sortAscending: "升序",
|
|
@@ -514,7 +518,7 @@ export function uiKitLabelsZh(numberLocale = "zh-CN"): UiKitLabels {
|
|
|
514
518
|
// Quoted, so the spacing rule holds whether the tab's name is Han or Latin.
|
|
515
519
|
remove: (tab) => `移除“${tab}”`,
|
|
516
520
|
more: "更多标签页",
|
|
517
|
-
|
|
521
|
+
previous: "之前的标签页",
|
|
518
522
|
},
|
|
519
523
|
appShell: {
|
|
520
524
|
collapse: "收起侧边栏",
|
|
@@ -1129,7 +1133,6 @@ export function uiKitLabelsZh(numberLocale = "zh-CN"): UiKitLabels {
|
|
|
1129
1133
|
notifications: {
|
|
1130
1134
|
typesTitle: "通知我以下内容",
|
|
1131
1135
|
typesDescription: "选择要接收哪些通知,以及接收方式。",
|
|
1132
|
-
byEmail: "通过电子邮件",
|
|
1133
1136
|
channelApp: "应用内",
|
|
1134
1137
|
channelPush: "推送",
|
|
1135
1138
|
channelEmail: "电子邮件",
|
|
@@ -1152,9 +1155,6 @@ export function uiKitLabelsZh(numberLocale = "zh-CN"): UiKitLabels {
|
|
|
1152
1155
|
quietFrom: "从",
|
|
1153
1156
|
quietUntil: "到",
|
|
1154
1157
|
quietIncomplete: "请同时设置开始和结束时间。两者都设置后,免打扰时段才会生效。",
|
|
1155
|
-
timeZone: "时区",
|
|
1156
|
-
deviceZone: (zone) => `此设备位于 ${zone} 时区。`,
|
|
1157
|
-
useDeviceZone: "使用此时区",
|
|
1158
1158
|
regions: {
|
|
1159
1159
|
Africa: "非洲",
|
|
1160
1160
|
America: "美洲",
|
package/src/i18n/review.ts
CHANGED
|
@@ -333,7 +333,6 @@ export const KIT_LABEL_SAMPLES: Readonly<Record<string, readonly (readonly unkno
|
|
|
333
333
|
"notifications.quietDescription": [[false], [true], [false, true], [true, true]],
|
|
334
334
|
"notifications.quietZone": [["{{zone}}"]],
|
|
335
335
|
"notifications.bellUnread": one,
|
|
336
|
-
"notifications.deviceZone": [["{{zone}}"]],
|
|
337
336
|
"notifications.iosInstall": [["{{app}}"]],
|
|
338
337
|
"notifications.testSent": one,
|
|
339
338
|
"notifications.explainerBody": [["{{app}}"]],
|
|
@@ -39,6 +39,8 @@ export const DEFAULT_COMMON_LABELS: CommonLabels = {
|
|
|
39
39
|
opensInNewTab: "opens in a new tab",
|
|
40
40
|
aboutField: (field) => `About “${field}”`,
|
|
41
41
|
help: "Help",
|
|
42
|
+
showMore: "More",
|
|
43
|
+
showLess: "Less",
|
|
42
44
|
};
|
|
43
45
|
|
|
44
46
|
export const DEFAULT_DATE_PICKER_LABELS: DatePickerLabels = {
|
package/src/index.ts
CHANGED
|
@@ -430,6 +430,9 @@ export * from "./components/progress-bar";
|
|
|
430
430
|
// Named: skeleton.tsx also holds SKELETON_CLASS, the look StatTile shares — internal.
|
|
431
431
|
export { Skeleton } from "./components/skeleton";
|
|
432
432
|
export type { SkeletonProps, SkeletonShape } from "./components/skeleton";
|
|
433
|
+
// 0.48 (keksdose dev #628): the table/list loading preset, one status label.
|
|
434
|
+
export { TableSkeleton } from "./components/table-skeleton";
|
|
435
|
+
export type { TableSkeletonProps } from "./components/table-skeleton";
|
|
433
436
|
// 0.12.0: a centred spinner with words, signed figures and deltas, a render-error fallback.
|
|
434
437
|
export * from "./components/loading-state";
|
|
435
438
|
export * from "./components/signed-amount";
|
|
@@ -567,7 +570,15 @@ export {
|
|
|
567
570
|
export type { DateFormatPreference, DateFormatOptions, ResolvedDateFormat } from "./lib/date-format";
|
|
568
571
|
export { DateFormatSetting } from "./components/date-format-setting";
|
|
569
572
|
export type { DateFormatSettingProps } from "./components/date-format-setting";
|
|
570
|
-
export {
|
|
573
|
+
export {
|
|
574
|
+
RowActions,
|
|
575
|
+
rowActionsColumn,
|
|
576
|
+
DEFAULT_ROW_ACTIONS_LABELS,
|
|
577
|
+
// 0.47.0 (keksdose N17): a hand-built table's actions heading and cell.
|
|
578
|
+
RowActionsHead,
|
|
579
|
+
ROW_ACTIONS_CELL_CLASS,
|
|
580
|
+
ROW_ACTIONS_HEAD_CLASS,
|
|
581
|
+
} from "./components/row-actions";
|
|
571
582
|
export type {
|
|
572
583
|
RowAction,
|
|
573
584
|
RowActionList,
|
|
@@ -576,6 +587,7 @@ export type {
|
|
|
576
587
|
RowActionsCollapse,
|
|
577
588
|
RowActionsSize,
|
|
578
589
|
RowActionsColumnOptions,
|
|
590
|
+
RowActionsHeadProps,
|
|
579
591
|
RowActionTone,
|
|
580
592
|
} from "./components/row-actions";
|
|
581
593
|
// 0.22.0: the inputs round (kastlan's, keksdose's and Kurvenschmiede's audits).
|
|
@@ -971,8 +983,6 @@ export { NotificationTypesSetting } from "./notifications/notification-types-set
|
|
|
971
983
|
export type { NotificationTypesSettingProps } from "./notifications/notification-types-setting";
|
|
972
984
|
export { QuietHoursSetting } from "./notifications/quiet-hours-setting";
|
|
973
985
|
export type { QuietHoursSettingProps } from "./notifications/quiet-hours-setting";
|
|
974
|
-
export { TimeZoneSelect, timeZoneOptions } from "./notifications/time-zone-select";
|
|
975
|
-
export type { TimeZoneSelectProps } from "./notifications/time-zone-select";
|
|
976
986
|
// 0.46 (docs/notifications-harmonization.md §10.1, §10.3): the inbox list, the bell and
|
|
977
987
|
// the device-zone report (the account's zone is automatic only, amended 2026-10-20).
|
|
978
988
|
export { NotificationInbox, INBOX_BADGE_INTERVAL } from "./notifications/notification-inbox";
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { useEffect } from "react";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* The room the floating launchers take above the bottom nav, published as
|
|
5
|
+
* `--app-float-clearance` on `<html>` so `AppShell` can pad `<main>` past them.
|
|
6
|
+
*
|
|
7
|
+
* keksdose dev#612 (UX-1.3, "the help button covers content"): the shell padded `<main>`
|
|
8
|
+
* for the nav plus 1.5rem, so on a phone the last row of every page ended under the help
|
|
9
|
+
* launcher — and on /transactions under the action group below it, exactly where the
|
|
10
|
+
* row's amount is. keksdose patched it with its own `--help-launcher-clearance` and an
|
|
11
|
+
* unlayered app.css rule. Here every kit launcher (`FloatingActionButton`, so
|
|
12
|
+
* `FloatingPanel`'s too, and `FloatingActionGroup`) declares its own room while it is
|
|
13
|
+
* mounted and shown, and the shell takes the largest.
|
|
14
|
+
*
|
|
15
|
+
* Declared, not measured: a launcher knows its `offset` and its 3rem height exactly, as
|
|
16
|
+
* CSS lengths, and the variable then follows the nav and the text size by itself. A
|
|
17
|
+
* `hidden` launcher keeps its claim: the room is its own while it is mounted, so the page
|
|
18
|
+
* does not change length as it hides and shows (keksdose's launcher steps aside while an
|
|
19
|
+
* editor covers its corner). Unmount it to give the room back.
|
|
20
|
+
*
|
|
21
|
+
* Internal: not exported from the barrel.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
const claims = new Map<symbol, string>();
|
|
25
|
+
|
|
26
|
+
function publish() {
|
|
27
|
+
if (typeof document === "undefined") return;
|
|
28
|
+
const root = document.documentElement;
|
|
29
|
+
const values = [...claims.values()];
|
|
30
|
+
if (values.length === 0) root.style.removeProperty("--app-float-clearance");
|
|
31
|
+
else root.style.setProperty("--app-float-clearance", values.length === 1 ? values[0] : `max(${values.join(", ")})`);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/** Claim `value` (a CSS length: the launcher's top edge above the nav, plus a gap) until
|
|
35
|
+
* the returned function is called. */
|
|
36
|
+
export function claimFloatClearance(value: string): () => void {
|
|
37
|
+
const key = Symbol("float-clearance");
|
|
38
|
+
claims.set(key, value);
|
|
39
|
+
publish();
|
|
40
|
+
return () => {
|
|
41
|
+
claims.delete(key);
|
|
42
|
+
publish();
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* A launcher at `offset` above the nav claims its 3rem height plus a 0.5rem gap while
|
|
48
|
+
* mounted (`extra`: what its frame adds, the group's 1px borders).
|
|
49
|
+
*/
|
|
50
|
+
export function useFloatClearance(offset: string, extra?: string): void {
|
|
51
|
+
useEffect(() => {
|
|
52
|
+
return claimFloatClearance(`calc(${offset} + 3.5rem${extra ? ` + ${extra}` : ""})`);
|
|
53
|
+
}, [offset, extra]);
|
|
54
|
+
}
|
|
@@ -20,7 +20,7 @@ export interface DeviceZoneReportOptions {
|
|
|
20
20
|
* This device's IANA zone ("Europe/Zurich"), or `"UTC"` where the runtime names none —
|
|
21
21
|
* the zone `useDeviceZoneReport` reports, which becomes the account's (§10.3, automatic
|
|
22
22
|
* only), and the one sign-up sends (`RegisterRequest.device_timezone`). Here since 0.46.1
|
|
23
|
-
* (keksdose N6)
|
|
23
|
+
* (keksdose N6).
|
|
24
24
|
*/
|
|
25
25
|
export function deviceTimeZone(): string {
|
|
26
26
|
try {
|
|
@@ -68,9 +68,6 @@ export interface NotificationSettingsPatch<Id extends string = string> {
|
|
|
68
68
|
digest_cadence?: DigestCadence;
|
|
69
69
|
quiet_hours_start?: string | null;
|
|
70
70
|
quiet_hours_end?: string | null;
|
|
71
|
-
/** @deprecated 0.46 — the zone is the account's, automatic only (§10.3), and server-kit 0.16 refuses it here;
|
|
72
|
-
* removed in 0.47. No kit card sends it. */
|
|
73
|
-
timezone?: string;
|
|
74
71
|
}
|
|
75
72
|
|
|
76
73
|
/** One registered push device, as `GET /notifications/devices` lists it (§3.5), oldest
|
|
@@ -21,7 +21,7 @@ export interface NotificationRegionLabels {
|
|
|
21
21
|
/**
|
|
22
22
|
* Every string the notification parts render — the `notifications` namespace of
|
|
23
23
|
* `<UiKitProvider labels>`, overridable per instance through `labels`: the types card,
|
|
24
|
-
* quiet hours
|
|
24
|
+
* quiet hours, this device's push, the device list, and the
|
|
25
25
|
* unsubscribe page. Cancel is `common.cancel`.
|
|
26
26
|
*/
|
|
27
27
|
export interface NotificationsLabels {
|
|
@@ -30,9 +30,6 @@ export interface NotificationsLabels {
|
|
|
30
30
|
typesTitle: string;
|
|
31
31
|
/** The line under it. */
|
|
32
32
|
typesDescription: string;
|
|
33
|
-
/** @deprecated 0.46 — the card's channels are columns now (`channelEmail`); removed in 0.47. Unused,
|
|
34
|
-
* kept so an app's override still type-checks. */
|
|
35
|
-
byEmail: string;
|
|
36
33
|
/** 0.46 (§10.2): the channel columns' headings, and each switch's name. */
|
|
37
34
|
channelApp: string;
|
|
38
35
|
channelPush: string;
|
|
@@ -64,17 +61,7 @@ export interface NotificationsLabels {
|
|
|
64
61
|
quietUntil: string;
|
|
65
62
|
/** One time set, the other not: quiet hours fail open until both are. */
|
|
66
63
|
quietIncomplete: string;
|
|
67
|
-
/** The zone
|
|
68
|
-
* @deprecated 0.46 — the zone is automatic (§10.3): only the deprecated `TimeZoneSelect` reads it, the
|
|
69
|
-
* 0.46 card does not; removed in 0.47. Kept so an app's override still type-checks. */
|
|
70
|
-
timeZone: string;
|
|
71
|
-
/** @deprecated 0.46 — the zone is automatic (§10.3), the card offers no device zone; removed in 0.47.
|
|
72
|
-
* Unused, kept so an app's override still type-checks. */
|
|
73
|
-
deviceZone: (zone: string) => string;
|
|
74
|
-
/** @deprecated 0.46 — the zone is automatic (§10.3), nothing to take; removed in 0.47. Unused, kept
|
|
75
|
-
* so an app's override still type-checks. */
|
|
76
|
-
useDeviceZone: string;
|
|
77
|
-
/** The zone's region headings, in the picker and in a zone's name ("Europe / Zurich"). */
|
|
64
|
+
/** The zone's region headings, in a zone's name ("Europe / Zurich"). */
|
|
78
65
|
regions: NotificationRegionLabels;
|
|
79
66
|
|
|
80
67
|
/* ── This device ────────────────────────────────────────────────────── */
|
|
@@ -187,7 +174,6 @@ export interface NotificationsLabels {
|
|
|
187
174
|
export const DEFAULT_NOTIFICATIONS_LABELS: NotificationsLabels = {
|
|
188
175
|
typesTitle: "Notify me about",
|
|
189
176
|
typesDescription: "Choose what you hear about, and how.",
|
|
190
|
-
byEmail: "By e-mail",
|
|
191
177
|
channelApp: "In the app",
|
|
192
178
|
channelPush: "Push",
|
|
193
179
|
channelEmail: "E-mail",
|
|
@@ -211,9 +197,6 @@ export const DEFAULT_NOTIFICATIONS_LABELS: NotificationsLabels = {
|
|
|
211
197
|
quietFrom: "From",
|
|
212
198
|
quietUntil: "Until",
|
|
213
199
|
quietIncomplete: "Set both a start and an end time. Quiet hours take effect once both are set.",
|
|
214
|
-
timeZone: "Time zone",
|
|
215
|
-
deviceZone: (zone) => `This device is in ${zone}.`,
|
|
216
|
-
useDeviceZone: "Use it",
|
|
217
200
|
regions: {
|
|
218
201
|
Africa: "Africa",
|
|
219
202
|
America: "Americas",
|
|
@@ -10,22 +10,29 @@ import { CARD_DESCRIPTION_CLASS } from "../settings/settings-card-classes";
|
|
|
10
10
|
import { SettingsCardTitle } from "../settings/settings-heading";
|
|
11
11
|
import { settle, useMounted } from "../account/account-parts";
|
|
12
12
|
import { describeFailure, FailureLine, useNotificationsLabels, useWriteOverlay } from "./notification-parts";
|
|
13
|
-
import type { NotificationsLabels } from "./notifications-labels";
|
|
13
|
+
import type { NotificationRegionLabels, NotificationsLabels } from "./notifications-labels";
|
|
14
14
|
import type { NotificationSettingsPatch } from "./notification-types";
|
|
15
|
-
import { zoneName } from "./time-zone-select";
|
|
16
15
|
|
|
17
16
|
/** The zone the server applies while no device ever reported one (§10.3): every app's. */
|
|
18
17
|
const DEFAULT_FALLBACK_ZONE = "Europe/Zurich";
|
|
19
18
|
|
|
19
|
+
/** A zone for a sentence: "Europe / Zurich", the region in the kit's words (`labels.regions`);
|
|
20
|
+
* a region the labels do not know keeps its IANA name, a zone with none ("UTC") is itself. */
|
|
21
|
+
function zoneName(zone: string, regions: NotificationRegionLabels): string {
|
|
22
|
+
const slash = zone.indexOf("/");
|
|
23
|
+
if (slash < 0) return zone;
|
|
24
|
+
const region = zone.slice(0, slash);
|
|
25
|
+
const named = Object.prototype.hasOwnProperty.call(regions, region)
|
|
26
|
+
? regions[region as keyof NotificationRegionLabels]
|
|
27
|
+
: region;
|
|
28
|
+
return `${named} / ${zone.slice(slash + 1).replace(/_/g, " ").replace(/\//g, " / ")}`;
|
|
29
|
+
}
|
|
30
|
+
|
|
20
31
|
export interface QuietHoursSettingProps extends Omit<ComponentPropsWithRef<"div">, "children" | "onChange"> {
|
|
21
32
|
/** The `GET`'s `quiet_hours_start`, `"HH:MM"`, or `null`. */
|
|
22
33
|
start: string | null;
|
|
23
34
|
/** The `GET`'s `quiet_hours_end`. */
|
|
24
35
|
end: string | null;
|
|
25
|
-
/** The zone the 0.36 card showed, an IANA name, or `null`.
|
|
26
|
-
* @deprecated 0.46 — pass `zone` (§10.3: the zone is the account's, automatic only); removed in 0.47.
|
|
27
|
-
* Shown read-only while `zone` is left out; the card no longer offers a picker. */
|
|
28
|
-
timezone?: string | null;
|
|
29
36
|
/**
|
|
30
37
|
* 0.46 (§10.3, amended 2026-10-20: automatic only): the account's zone — `/auth/me`'s
|
|
31
38
|
* `device_timezone`, the zone of the device last used; `null` while no device has
|
|
@@ -43,7 +50,7 @@ export interface QuietHoursSettingProps extends Omit<ComponentPropsWithRef<"div"
|
|
|
43
50
|
* rejects.
|
|
44
51
|
*/
|
|
45
52
|
onChange: (patch: NotificationSettingsPatch) => Promise<unknown> | void;
|
|
46
|
-
/** The zone named while
|
|
53
|
+
/** The zone named while `zone` names none: the one the server
|
|
47
54
|
* applies. Default `"Europe/Zurich"`, every app's. */
|
|
48
55
|
fallbackZone?: string;
|
|
49
56
|
/** The app keeps an inbox, and the description says a held push still reaches it. */
|
|
@@ -69,15 +76,13 @@ type QuietField = "quiet_hours_start" | "quiet_hours_end";
|
|
|
69
76
|
*
|
|
70
77
|
* - **Two times**, each saved as it is entered; a cleared time sends `null`. While only
|
|
71
78
|
* one is set the card says so: the window fails open until both are.
|
|
72
|
-
* - **The zone** shows while a time is set: `zone`, else
|
|
73
|
-
* `fallbackZone`.
|
|
79
|
+
* - **The zone** shows while a time is set: `zone`, else `fallbackZone`.
|
|
74
80
|
*
|
|
75
81
|
* Under a write lock the fields are `commit` controls exempt from billing.
|
|
76
82
|
*/
|
|
77
83
|
export function QuietHoursSetting({
|
|
78
84
|
start,
|
|
79
85
|
end,
|
|
80
|
-
timezone = null,
|
|
81
86
|
zone,
|
|
82
87
|
held = false,
|
|
83
88
|
onChange,
|
|
@@ -99,7 +104,7 @@ export function QuietHoursSetting({
|
|
|
99
104
|
overlay.has(field) ? (overlay.get(field) ?? null) : server;
|
|
100
105
|
const startShown = shown("quiet_hours_start", start);
|
|
101
106
|
const endShown = shown("quiet_hours_end", end);
|
|
102
|
-
const accountZone =
|
|
107
|
+
const accountZone = zone ?? fallbackZone;
|
|
103
108
|
|
|
104
109
|
const save = (patch: NotificationSettingsPatch) => {
|
|
105
110
|
const fields = Object.keys(patch) as QuietField[];
|
|
@@ -23,6 +23,16 @@ export interface SettingsGroup<G extends string = string> {
|
|
|
23
23
|
title: string;
|
|
24
24
|
/** One line under the heading and in the phone list, where it is cut to one line. */
|
|
25
25
|
help: string;
|
|
26
|
+
/**
|
|
27
|
+
* 0.48 (keksdose live #450): a count or a mark drawn on the group's ROW — at the end of
|
|
28
|
+
* its desktop sidebar row and before the chevron of its phone list row — never on the
|
|
29
|
+
* heading over its cards. The admin area's waiting work: `<AdminWaitingBadge count={n} />`
|
|
30
|
+
* (nothing for 0), so the account menu's badge leads to the section that holds it. It
|
|
31
|
+
* sits inside the row's link and is read with its name, so say what the number is (the
|
|
32
|
+
* waiting pill does: "3, 3 waiting"). While the page is searched the sidebar shows the
|
|
33
|
+
* hit count in its place. Default: none.
|
|
34
|
+
*/
|
|
35
|
+
badge?: ReactNode;
|
|
26
36
|
/**
|
|
27
37
|
* `false` hides the group: no row, no hits, and its path acts as an unknown one — it
|
|
28
38
|
* lands on the default group (desktop) or the list (phone), never on a 404 (§3.1).
|
|
@@ -369,7 +369,17 @@ export function SettingsLayout<G extends string>({
|
|
|
369
369
|
}
|
|
370
370
|
title={g.title}
|
|
371
371
|
subtitle={g.help}
|
|
372
|
-
trailing={
|
|
372
|
+
trailing={
|
|
373
|
+
g.badge == null ? (
|
|
374
|
+
<ChevronRight aria-hidden className="size-4 rtl:-scale-x-100" />
|
|
375
|
+
) : (
|
|
376
|
+
// The group's badge (0.48) before the chevron, the two as one end.
|
|
377
|
+
<span className="flex items-center gap-2">
|
|
378
|
+
{g.badge}
|
|
379
|
+
<ChevronRight aria-hidden className="size-4 rtl:-scale-x-100" />
|
|
380
|
+
</span>
|
|
381
|
+
)
|
|
382
|
+
}
|
|
373
383
|
/>
|
|
374
384
|
))}
|
|
375
385
|
</List>
|
|
@@ -421,13 +431,17 @@ export function SettingsLayout<G extends string>({
|
|
|
421
431
|
name: g.title,
|
|
422
432
|
label: <span className={cn(dim && "opacity-40")}>{g.title}</span>,
|
|
423
433
|
icon: <span className={cn("inline-flex [&_svg]:size-4", dim && "opacity-40")}>{g.icon}</span>,
|
|
424
|
-
badge
|
|
425
|
-
|
|
434
|
+
// While searching, the hit count; otherwise the group's own badge (0.48).
|
|
435
|
+
badge: searching ? (
|
|
436
|
+
count > 0 ? (
|
|
426
437
|
<Chip size="sm" tone="brand">
|
|
427
438
|
<span aria-hidden>{count}</span>
|
|
428
439
|
<span className="sr-only-fixed">{labels.matchCount(count)}</span>
|
|
429
440
|
</Chip>
|
|
430
|
-
) : undefined
|
|
441
|
+
) : undefined
|
|
442
|
+
) : (
|
|
443
|
+
g.badge
|
|
444
|
+
),
|
|
431
445
|
};
|
|
432
446
|
})}
|
|
433
447
|
active={(open?.id ?? route.groups[0]?.id) as G}
|