@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.
Files changed (216) hide show
  1. package/README.md +8 -6
  2. package/dist/admin/admin-sections.d.ts +8 -0
  3. package/dist/admin/admin-sections.js +2 -1
  4. package/dist/admin/admin-sections.js.map +1 -1
  5. package/dist/auth/verify-email.d.ts +9 -1
  6. package/dist/auth/verify-email.js +22 -13
  7. package/dist/auth/verify-email.js.map +1 -1
  8. package/dist/components/alert-banner.d.ts +29 -1
  9. package/dist/components/alert-banner.js +84 -7
  10. package/dist/components/alert-banner.js.map +1 -1
  11. package/dist/components/button-look.d.ts +4 -0
  12. package/dist/components/button-look.js +2 -0
  13. package/dist/components/button-look.js.map +1 -1
  14. package/dist/components/combobox-core.js +5 -1
  15. package/dist/components/combobox-core.js.map +1 -1
  16. package/dist/components/data-table-column-settings.d.ts +6 -1
  17. package/dist/components/data-table-column-settings.js +12 -2
  18. package/dist/components/data-table-column-settings.js.map +1 -1
  19. package/dist/components/data-table-fit.d.ts +44 -0
  20. package/dist/components/data-table-fit.js +103 -0
  21. package/dist/components/data-table-fit.js.map +1 -0
  22. package/dist/components/data-table-groups.d.ts +95 -0
  23. package/dist/components/data-table-groups.js +165 -0
  24. package/dist/components/data-table-groups.js.map +1 -0
  25. package/dist/components/data-table-head.js +3 -1
  26. package/dist/components/data-table-head.js.map +1 -1
  27. package/dist/components/data-table-labels.d.ts +7 -0
  28. package/dist/components/data-table-labels.js +3 -0
  29. package/dist/components/data-table-labels.js.map +1 -1
  30. package/dist/components/data-table-leading-row.d.ts +17 -0
  31. package/dist/components/data-table-leading-row.js +41 -0
  32. package/dist/components/data-table-leading-row.js.map +1 -0
  33. package/dist/components/data-table-resize.js +1 -1
  34. package/dist/components/data-table-resize.js.map +1 -1
  35. package/dist/components/data-table.d.ts +78 -2
  36. package/dist/components/data-table.js +355 -247
  37. package/dist/components/data-table.js.map +1 -1
  38. package/dist/components/disclosure.d.ts +3 -1
  39. package/dist/components/disclosure.js +10 -4
  40. package/dist/components/disclosure.js.map +1 -1
  41. package/dist/components/dropdown.js +8 -1
  42. package/dist/components/dropdown.js.map +1 -1
  43. package/dist/components/floating-panel.d.ts +14 -1
  44. package/dist/components/floating-panel.js +7 -2
  45. package/dist/components/floating-panel.js.map +1 -1
  46. package/dist/components/hover-menu.js +5 -1
  47. package/dist/components/hover-menu.js.map +1 -1
  48. package/dist/components/icon-button.js +2 -1
  49. package/dist/components/icon-button.js.map +1 -1
  50. package/dist/components/popover.js +5 -1
  51. package/dist/components/popover.js.map +1 -1
  52. package/dist/components/row-actions.d.ts +25 -0
  53. package/dist/components/row-actions.js +13 -3
  54. package/dist/components/row-actions.js.map +1 -1
  55. package/dist/components/table-skeleton.d.ts +35 -0
  56. package/dist/components/table-skeleton.js +75 -0
  57. package/dist/components/table-skeleton.js.map +1 -0
  58. package/dist/components/tabs.d.ts +22 -16
  59. package/dist/components/tabs.js +47 -31
  60. package/dist/components/tabs.js.map +1 -1
  61. package/dist/components/ui-labels.js +1 -1
  62. package/dist/components/ui-labels.js.map +1 -1
  63. package/dist/components/use-table-state.d.ts +8 -7
  64. package/dist/components/use-table-state.js +37 -3
  65. package/dist/components/use-table-state.js.map +1 -1
  66. package/dist/data-table.d.ts +1 -0
  67. package/dist/data-table.js.map +1 -1
  68. package/dist/eslint/index.js +1 -1
  69. package/dist/feedback/feedback-attachment-download.d.ts +19 -0
  70. package/dist/feedback/feedback-attachment-download.js +59 -0
  71. package/dist/feedback/feedback-attachment-download.js.map +1 -0
  72. package/dist/feedback/feedback-comment-thread.d.ts +17 -6
  73. package/dist/feedback/feedback-comment-thread.js +21 -2
  74. package/dist/feedback/feedback-comment-thread.js.map +1 -1
  75. package/dist/feedback/feedback-entry-file.d.ts +61 -0
  76. package/dist/feedback/feedback-entry-file.js +76 -0
  77. package/dist/feedback/feedback-entry-file.js.map +1 -0
  78. package/dist/feedback/feedback-public-list.d.ts +18 -5
  79. package/dist/feedback/feedback-public-list.js +8 -0
  80. package/dist/feedback/feedback-public-list.js.map +1 -1
  81. package/dist/feedback/feedback-public-types.d.ts +7 -2
  82. package/dist/feedback/feedback-replies.d.ts +26 -9
  83. package/dist/feedback/feedback-replies.js +20 -10
  84. package/dist/feedback/feedback-replies.js.map +1 -1
  85. package/dist/feedback/feedback-row-detail-labels.js +0 -1
  86. package/dist/feedback/feedback-row-detail-labels.js.map +1 -1
  87. package/dist/feedback/feedback-row-detail.d.ts +23 -10
  88. package/dist/feedback/feedback-row-detail.js +10 -54
  89. package/dist/feedback/feedback-row-detail.js.map +1 -1
  90. package/dist/feedback/feedback-table.d.ts +5 -0
  91. package/dist/feedback/feedback-table.js +30 -7
  92. package/dist/feedback/feedback-table.js.map +1 -1
  93. package/dist/feedback.d.ts +1 -0
  94. package/dist/feedback.js +1 -0
  95. package/dist/feedback.js.map +1 -1
  96. package/dist/hooks/use-dismiss.d.ts +30 -1
  97. package/dist/hooks/use-dismiss.js +30 -2
  98. package/dist/hooks/use-dismiss.js.map +1 -1
  99. package/dist/i18n/german.js +7 -7
  100. package/dist/i18n/german.js.map +1 -1
  101. package/dist/i18n/kit-labels.d.ts +4 -0
  102. package/dist/i18n/kit-labels.js.map +1 -1
  103. package/dist/i18n/locales/en.js +7 -7
  104. package/dist/i18n/locales/en.js.map +2 -2
  105. package/dist/i18n/locales/es.js +7 -7
  106. package/dist/i18n/locales/es.js.map +1 -1
  107. package/dist/i18n/locales/fr.js +7 -7
  108. package/dist/i18n/locales/fr.js.map +1 -1
  109. package/dist/i18n/locales/hu.js +7 -7
  110. package/dist/i18n/locales/hu.js.map +1 -1
  111. package/dist/i18n/locales/it.js +7 -7
  112. package/dist/i18n/locales/it.js.map +1 -1
  113. package/dist/i18n/locales/zh.js +7 -7
  114. package/dist/i18n/locales/zh.js.map +1 -1
  115. package/dist/i18n/review.js +0 -1
  116. package/dist/i18n/review.js.map +1 -1
  117. package/dist/i18n/shared-labels.js +3 -1
  118. package/dist/i18n/shared-labels.js.map +1 -1
  119. package/dist/index.d.ts +4 -4
  120. package/dist/index.js +13 -4
  121. package/dist/index.js.map +1 -1
  122. package/dist/lib/float-clearance.d.ts +8 -0
  123. package/dist/lib/float-clearance.js +29 -0
  124. package/dist/lib/float-clearance.js.map +1 -0
  125. package/dist/notifications/device-zone-report.d.ts +1 -1
  126. package/dist/notifications/device-zone-report.js.map +1 -1
  127. package/dist/notifications/notification-types.d.ts +0 -3
  128. package/dist/notifications/notifications-labels.d.ts +2 -15
  129. package/dist/notifications/notifications-labels.js +0 -4
  130. package/dist/notifications/notifications-labels.js.map +1 -1
  131. package/dist/notifications/quiet-hours-setting.d.ts +3 -8
  132. package/dist/notifications/quiet-hours-setting.js +8 -3
  133. package/dist/notifications/quiet-hours-setting.js.map +1 -1
  134. package/dist/settings/settings-catalogue.d.ts +10 -0
  135. package/dist/settings/settings-catalogue.js.map +1 -1
  136. package/dist/settings/settings-layout.js +10 -3
  137. package/dist/settings/settings-layout.js.map +1 -1
  138. package/dist/shell/app-shell.d.ts +5 -0
  139. package/dist/shell/app-shell.js +5 -3
  140. package/dist/shell/app-shell.js.map +1 -1
  141. package/dist/shell/option-switcher-menu.d.ts +2 -0
  142. package/dist/shell/option-switcher-menu.js +6 -2
  143. package/dist/shell/option-switcher-menu.js.map +1 -1
  144. package/dist/shell/topbar-action-menu.js +2 -1
  145. package/dist/shell/topbar-action-menu.js.map +1 -1
  146. package/dist/shell/topbar-controls.js +5 -3
  147. package/dist/shell/topbar-controls.js.map +1 -1
  148. package/dist/theme/theme-store.d.ts +4 -4
  149. package/dist/theme/theme-store.js +1 -0
  150. package/dist/theme/theme-store.js.map +1 -1
  151. package/dist/tour/tour.js +1 -0
  152. package/dist/tour/tour.js.map +1 -1
  153. package/package.json +2 -2
  154. package/src/admin/admin-sections.tsx +8 -0
  155. package/src/auth/verify-email.tsx +34 -9
  156. package/src/components/alert-banner.tsx +131 -7
  157. package/src/components/button-look.ts +6 -0
  158. package/src/components/combobox-core.tsx +7 -1
  159. package/src/components/data-table-column-settings.tsx +23 -2
  160. package/src/components/data-table-fit.ts +187 -0
  161. package/src/components/data-table-groups.tsx +275 -0
  162. package/src/components/data-table-head.tsx +4 -1
  163. package/src/components/data-table-labels.ts +13 -0
  164. package/src/components/data-table-leading-row.tsx +55 -0
  165. package/src/components/data-table-resize.ts +2 -1
  166. package/src/components/data-table.tsx +274 -45
  167. package/src/components/disclosure.tsx +22 -5
  168. package/src/components/dropdown.tsx +11 -1
  169. package/src/components/floating-panel.tsx +24 -1
  170. package/src/components/hover-menu.tsx +6 -1
  171. package/src/components/icon-button.tsx +3 -3
  172. package/src/components/popover.tsx +7 -1
  173. package/src/components/row-actions.tsx +42 -3
  174. package/src/components/table-skeleton.tsx +133 -0
  175. package/src/components/tabs.tsx +102 -50
  176. package/src/components/ui-labels.ts +1 -1
  177. package/src/components/use-table-state.ts +54 -3
  178. package/src/data-table.ts +2 -0
  179. package/src/feedback/feedback-attachment-download.tsx +77 -0
  180. package/src/feedback/feedback-comment-thread.tsx +42 -7
  181. package/src/feedback/feedback-entry-file.tsx +150 -0
  182. package/src/feedback/feedback-public-list.tsx +25 -4
  183. package/src/feedback/feedback-public-types.ts +7 -2
  184. package/src/feedback/feedback-replies.tsx +46 -19
  185. package/src/feedback/feedback-row-detail-labels.ts +0 -1
  186. package/src/feedback/feedback-row-detail.tsx +35 -86
  187. package/src/feedback/feedback-table.tsx +33 -1
  188. package/src/feedback.ts +1 -0
  189. package/src/hooks/use-dismiss.ts +65 -3
  190. package/src/i18n/german.ts +6 -6
  191. package/src/i18n/kit-labels.tsx +4 -0
  192. package/src/i18n/locales/es.ts +6 -6
  193. package/src/i18n/locales/fr.ts +6 -6
  194. package/src/i18n/locales/hu.ts +6 -6
  195. package/src/i18n/locales/it.ts +6 -6
  196. package/src/i18n/locales/zh.ts +6 -6
  197. package/src/i18n/review.ts +0 -1
  198. package/src/i18n/shared-labels.ts +2 -0
  199. package/src/index.ts +13 -3
  200. package/src/lib/float-clearance.ts +54 -0
  201. package/src/notifications/device-zone-report.ts +1 -1
  202. package/src/notifications/notification-types.ts +0 -3
  203. package/src/notifications/notifications-labels.ts +2 -19
  204. package/src/notifications/quiet-hours-setting.tsx +16 -11
  205. package/src/settings/settings-catalogue.ts +10 -0
  206. package/src/settings/settings-layout.tsx +18 -4
  207. package/src/shell/app-shell.tsx +17 -3
  208. package/src/shell/option-switcher-menu.tsx +16 -4
  209. package/src/shell/topbar-action-menu.tsx +22 -10
  210. package/src/shell/topbar-controls.tsx +18 -12
  211. package/src/theme/theme-store.ts +13 -5
  212. package/src/tour/tour.tsx +5 -0
  213. package/dist/notifications/time-zone-select.d.ts +0 -54
  214. package/dist/notifications/time-zone-select.js +0 -71
  215. package/dist/notifications/time-zone-select.js.map +0 -1
  216. package/src/notifications/time-zone-select.tsx +0 -125
@@ -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
- backToFirst: "Volver a la primera pestaña",
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",
@@ -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
- backToFirst: "Retour au premier onglet",
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",
@@ -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
- backToFirst: "Vissza az első lapra",
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",
@@ -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
- backToFirst: "Torna alla prima scheda",
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",
@@ -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
- backToFirst: "返回第一个标签页",
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: "美洲",
@@ -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 { RowActions, rowActionsColumn, DEFAULT_ROW_ACTIONS_LABELS } from "./components/row-actions";
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); the deprecated `time-zone-select` module re-exports it until 0.47.
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 and the zone picker, this device's push, the device list, and the
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 picker's label.
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 neither `zone` nor `timezone` names one: the one the server
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 the deprecated `timezone`, 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 = (zone === undefined ? timezone : zone) ?? fallbackZone;
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={<ChevronRight aria-hidden className="size-4 rtl:-scale-x-100" />}
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
- searching && count > 0 ? (
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}