@eifi1/ui-kit 0.46.0 → 0.47.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 +12 -11
- package/dist/admin/user-roster.d.ts +6 -2
- package/dist/admin/user-roster.js +7 -3
- package/dist/admin/user-roster.js.map +1 -1
- package/dist/components/data-table-row-actions.d.ts +22 -5
- package/dist/components/data-table-row-actions.js +14 -5
- package/dist/components/data-table-row-actions.js.map +1 -1
- package/dist/components/data-table.d.ts +16 -1
- package/dist/components/data-table.js +20 -1
- package/dist/components/data-table.js.map +1 -1
- package/dist/components/row-actions.d.ts +37 -5
- package/dist/components/row-actions.js +22 -5
- package/dist/components/row-actions.js.map +1 -1
- package/dist/components/tabs.d.ts +24 -16
- package/dist/components/tabs.js +37 -31
- package/dist/components/tabs.js.map +1 -1
- package/dist/components/translation-review.js +3 -1
- package/dist/components/translation-review.js.map +1 -1
- package/dist/components/ui-labels.js +1 -1
- package/dist/components/ui-labels.js.map +1 -1
- package/dist/data-table.d.ts +1 -0
- package/dist/data-table.js +2 -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.d.ts +1 -0
- package/dist/feedback.js +1 -0
- package/dist/feedback.js.map +1 -1
- package/dist/i18n/german.js +1 -6
- package/dist/i18n/german.js.map +1 -1
- package/dist/i18n/locales/en.js +1 -6
- package/dist/i18n/locales/en.js.map +2 -2
- package/dist/i18n/locales/es.js +1 -6
- package/dist/i18n/locales/es.js.map +1 -1
- package/dist/i18n/locales/fr.js +1 -6
- package/dist/i18n/locales/fr.js.map +1 -1
- package/dist/i18n/locales/hu.js +1 -6
- package/dist/i18n/locales/hu.js.map +1 -1
- package/dist/i18n/locales/it.js +1 -6
- package/dist/i18n/locales/it.js.map +1 -1
- package/dist/i18n/locales/zh.js +1 -6
- 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/index.d.ts +5 -7
- package/dist/index.js +14 -5
- package/dist/index.js.map +1 -1
- package/dist/notifications/device-zone-report.d.ts +7 -0
- package/dist/notifications/device-zone-report.js +8 -1
- package/dist/notifications/device-zone-report.js.map +1 -1
- package/dist/notifications/feedback-notification-types.d.ts +14 -1
- package/dist/notifications/feedback-notification-types.js +5 -1
- package/dist/notifications/feedback-notification-types.js.map +1 -1
- package/dist/notifications/notification-bell.d.ts +1 -1
- package/dist/notifications/notification-bell.js.map +1 -1
- package/dist/notifications/notification-inbox.d.ts +12 -3
- package/dist/notifications/notification-inbox.js +2 -2
- package/dist/notifications/notification-inbox.js.map +1 -1
- package/dist/notifications/notification-types.d.ts +0 -3
- package/dist/notifications/notifications-labels.d.ts +2 -13
- 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/offline/local-first.d.ts +9 -0
- package/dist/offline/local-first.js +14 -0
- package/dist/offline/local-first.js.map +1 -1
- package/dist/offline.d.ts +1 -1
- package/dist/offline.js +2 -1
- package/dist/offline.js.map +1 -1
- package/dist/sync/db.d.ts +17 -0
- package/dist/sync/db.js +10 -1
- package/dist/sync/db.js.map +1 -1
- package/dist/sync/engine.d.ts +11 -9
- package/dist/sync/engine.js.map +1 -1
- package/dist/sync/hooks.d.ts +5 -0
- package/dist/sync/hooks.js.map +1 -1
- package/dist/sync.d.ts +2 -2
- package/dist/sync.js +5 -2
- package/dist/sync.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/package.json +2 -2
- package/src/admin/user-roster.tsx +12 -3
- package/src/components/data-table-row-actions.tsx +33 -9
- package/src/components/data-table.tsx +46 -3
- package/src/components/row-actions.tsx +73 -10
- package/src/components/tabs.tsx +66 -44
- package/src/components/translation-review.tsx +3 -1
- package/src/components/ui-labels.ts +1 -1
- package/src/data-table.ts +3 -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.ts +1 -0
- package/src/i18n/german.ts +1 -6
- package/src/i18n/locales/es.ts +1 -6
- package/src/i18n/locales/fr.ts +1 -6
- package/src/i18n/locales/hu.ts +1 -6
- package/src/i18n/locales/it.ts +1 -6
- package/src/i18n/locales/zh.ts +1 -6
- package/src/i18n/review.ts +0 -1
- package/src/index.ts +19 -5
- package/src/notifications/device-zone-report.ts +14 -1
- package/src/notifications/feedback-notification-types.ts +19 -1
- package/src/notifications/notification-bell.tsx +1 -1
- package/src/notifications/notification-inbox.tsx +15 -5
- package/src/notifications/notification-types.ts +0 -3
- package/src/notifications/notifications-labels.ts +2 -17
- package/src/notifications/quiet-hours-setting.tsx +16 -11
- package/src/offline/local-first.ts +24 -0
- package/src/offline.ts +1 -1
- package/src/sync/db.ts +22 -0
- package/src/sync/engine.ts +11 -9
- package/src/sync/hooks.ts +5 -0
- package/src/sync.ts +2 -2
- package/src/theme/theme-store.ts +13 -5
- package/dist/notifications/time-zone-select.d.ts +0 -53
- package/dist/notifications/time-zone-select.js +0 -76
- package/dist/notifications/time-zone-select.js.map +0 -1
- package/src/notifications/time-zone-select.tsx +0 -129
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/components/data-table-labels.ts", "../../../src/components/mini-calendar-labels.ts", "../../../src/components/calendar-heatmap-labels.ts", "../../../src/components/month-picker-labels.ts", "../../../src/components/page-contents-labels.ts", "../../../src/components/popover-labels.ts", "../../../src/components/chip-labels.ts", "../../../src/components/field-sync-labels.ts", "../../../src/components/ui-labels.ts", "../../../src/wizard/wizard-labels.ts", "../../../src/tour/tour-labels.ts", "../../../src/tour/tour-catalogue-labels.ts", "../../../src/search/command-palette-labels.ts", "../../../src/search/global-search-labels.ts", "../../../src/components/series-chart-labels.ts", "../../../src/components/pie-chart-labels.ts", "../../../src/components/sparkline-labels.ts", "../../../src/components/stat-tile-labels.ts", "../../../src/components/signature-pad-labels.ts", "../../../src/components/password-strength-labels.ts", "../../../src/components/danger-confirm-labels.ts", "../../../src/components/swatch-picker-labels.ts", "../../../src/components/icon-picker-labels.ts", "../../../src/components/dialog-frame-labels.ts", "../../../src/hooks/use-file-picker-labels.ts", "../../../src/components/measured-grid-labels.ts", "../../../src/components/confirm-dialog-labels.ts", "../../../src/components/floating-panel-labels.ts", "../../../src/feedback/feedback-attachment-labels.ts", "../../../src/feedback/feedback-dialog-labels.ts", "../../../src/feedback/feedback-thread-labels.ts", "../../../src/feedback/feedback-labels.ts", "../../../src/feedback/feedback-menu-labels.ts", "../../../src/feedback/feedback-public-labels.ts", "../../../src/notifications/feedback-notification-types-labels.ts", "../../../src/feedback/feedback-context-labels.ts", "../../../src/feedback/feedback-table-labels.ts", "../../../src/feedback/feedback-row-detail-labels.ts", "../../../src/feedback/feedback-thread-parts-labels.ts", "../../../src/account/account-settings-labels.ts", "../../../src/components/copy-button-labels.ts", "../../../src/components/bulk-action-bar-labels.ts", "../../../src/components/list-labels.ts", "../../../src/components/breadcrumbs-labels.ts", "../../../src/components/toast-labels.ts", "../../../src/components/form-actions-labels.ts", "../../../src/components/description-list-labels.ts", "../../../src/components/line-items-labels.ts", "../../../src/components/progress-bar-labels.ts", "../../../src/components/signed-amount-labels.ts", "../../../src/components/error-boundary-labels.ts", "../../../src/components/authed-image-labels.ts", "../../../src/components/image-grid-labels.ts", "../../../src/components/lightbox-labels.ts", "../../../src/components/write-lock-labels.ts", "../../../src/components/legal-labels.ts", "../../../src/auth/auth-errors.ts", "../../../src/auth/sign-in-form-labels.ts", "../../../src/auth/register-form-labels.ts", "../../../src/auth/complete-name-dialog-labels.ts", "../../../src/auth/forgot-password-form-labels.ts", "../../../src/auth/reset-password-form-labels.ts", "../../../src/auth/verify-email-labels.ts", "../../../src/auth/not-found-page-labels.ts", "../../../src/auth/accept-invitation-labels.ts", "../../../src/shell/company-switcher-labels.ts", "../../../src/account/email-change-setting-labels.ts", "../../../src/account/sessions-setting-labels.ts", "../../../src/account/delete-account-setting-labels.ts", "../../../src/account/data-export-setting-labels.ts", "../../../src/admin/user-roster-labels.ts", "../../../src/admin/role-select-labels.ts", "../../../src/admin/reviewer-scope-editor-labels.ts", "../../../src/admin/admin-action-confirm-labels.ts", "../../../src/admin/admin-action-log-labels.ts", "../../../src/admin/transfer-ownership-dialog-labels.ts", "../../../src/admin/invitations-panel-labels.ts", "../../../src/settings/settings-labels.ts", "../../../src/landing/landing-labels.ts", "../../../src/demo/demo-labels.ts", "../../../src/billing/billing-labels.ts", "../../../src/admin/plan-change-labels.ts", "../../../src/components/appearance-labels.ts", "../../../src/settings/device-reset-setting-labels.ts", "../../../src/components/row-actions-labels.ts", "../../../src/shell/app-shell-labels.ts", "../../../src/components/account-chips-labels.ts", "../../../src/admin/admin-area-labels.ts", "../../../src/admin/mail-test-card-labels.ts", "../../../src/offline/sign-out-pending-dialog-labels.ts", "../../../src/offline/pwa-update-prompt-labels.ts", "../../../src/offline/shared-computer-labels.ts", "../../../src/shell/top-bar-parts-labels.ts", "../../../src/components/share-card-labels.ts", "../../../src/components/reauth-dialog-labels.ts", "../../../src/components/server-wake-labels.ts", "../../../src/components/translation-review-labels.ts", "../../../src/components/country-select-labels.ts", "../../../src/components/inline-edit-field-labels.ts", "../../../src/components/iban-input-labels.ts", "../../../src/components/phone-input-labels.ts", "../../../src/components/sign-chip-labels.ts", "../../../src/components/column-mapper-labels.ts", "../../../src/notifications/notifications-labels.ts", "../../../src/i18n/shared-labels.ts", "../../../src/i18n/defaults.ts", "../../../src/i18n/locales/en.ts"],
|
|
4
|
-
"sourcesContent": ["// All user-facing strings for the DataTable system \u2014 the `dataTable` namespace of\n// `<UiKitProvider labels>`, and per table the `labels` prop over that. The kit's seven\n// catalogues carry the translations; the English defaults below make the table usable\n// with no wiring.\n\n// A type-only import: erased at build time, so this module stays free of the table\n// itself (and of react-router), which `i18n/defaults` relies on.\nimport type { DataTableSortLabels } from \"./data-table\";\n\n/** The phone sort control's four keys (`sortBy`, `sortDefault`, `sortAscending`,\n * `sortDescending`, 0.22.0) are {@link DataTableSortLabels}', declared beside the\n * control and part of this namespace like every other key. */\nexport interface DataTableLabels extends DataTableSortLabels {\n // Table chrome\n columns: string;\n selectAllRows: string;\n sortHint: string;\n filter: string;\n close: string;\n selectRow: string;\n /** The phone card list's way into selection mode for a keyboard and a screen reader\n * (0.40, #421) \u2014 a button, visually hidden until focused; a long press is the touch way in. */\n selectRows: string;\n /** Leaves the phone card list's selection mode, clearing the selection (0.40, #421). */\n cancelSelection: string;\n /**\n * The name of an opening row's disclosure button on desktop \u2014 visually hidden, in the\n * row's first cell, carrying `aria-expanded` and `aria-controls` (round 0.34, the\n * showcase's axe check: ARIA allows `aria-expanded` on a row only in a treegrid, and\n * the `<tr>` wore it). The same words whether the row is open or shut: the state is\n * the button's to say.\n */\n rowDetails: string;\n autoSize: string;\n loading: string;\n filters: string;\n clearAll: string;\n done: string;\n // Pagination\n pageSize: string;\n pageSizeAll: string;\n prevPage: string;\n nextPage: string;\n // Filter popover\n clearFilter: string;\n filterPlaceholder: string;\n selectFilter: string;\n selectAll: string;\n selectNone: string;\n dateFrom: string;\n dateTo: string;\n numberMin: string;\n numberMax: string;\n numberAbs: string;\n // Date-range preset labels, keyed by preset key (see dateRangePresets()).\n presets: Record<string, string>;\n\n /**\n * The table's own accessible name. Deliberately a label rather than a second,\n * parallel `tableLabel` prop: the audit already records \"three different prop\n * names for the accessible name\" as a finding, and a table that is not \"Data\n * table\" says so with `labels={{ table: \"Transactions\" }}` at the call site.\n */\n table: string;\n\n // ---- Announcements ----\n // Spoken through the live region, never rendered. Each takes its numbers as\n // ARGUMENTS: a count glued into an English template literal is untranslatable,\n // and the grammar around it moves with the number in most languages.\n\n /** After a filter changes: \"12 of 137 rows\". */\n filterResults: (shown: number, total: number) => string;\n /** After a header is activated: \"Sorted by Name, ascending\". */\n sortedAscending: (column: string) => string;\n sortedDescending: (column: string) => string;\n /** The third click, which removes the column from the sort entirely. */\n sortCleared: (column: string) => string;\n /** After paging: \"Page 3 of 14\". `page` is 1-BASED, as spoken. */\n pageChanged: (page: number, totalPages: number) => string;\n\n // ---- Counted chrome ----\n // Visible text that interpolates numbers. These were template literals until the\n // audit flagged them: a consumer could translate every key in this file and still\n // be left with English (and with ASCII digit grouping) in the footer.\n\n /** The pagination range summary: \"1\u201325 / 137\". */\n pageRange: (from: number, to: number, total: number) => string;\n /** The same summary when the page size is \"all\" \u2014 just the row count. */\n rowCount: (total: number) => string;\n /** The column-settings rail and its heading: \"Columns (4/9)\". */\n columnsCount: (visible: number, total: number) => string;\n /**\n * A column's filter button and panel: \"Filter Amount\", and \"Filter Amount (active)\"\n * while the column is filtered (round 0.34 Wave 2, BUG-7c). Every column's used to be\n * \"Filter\" alike, and \"filtered\" was a colour. An app that translated only `filter`\n * gets `\"<filter>: <column>\"` from it: DataTable derives the one from the other.\n */\n filterColumn: (column: string, active: boolean) => string;\n\n // ---- Empty state, row actions, boolean cells (0.12.0) ----\n\n /** The body of a table with no rows and no `empty` prop of its own. A sentence, not\n * \"\u2014\": a dash in the only row of a table reads as one row with a missing value. */\n empty: string;\n /** The accessible name of the `rowActions` column (its header is visually empty). */\n actions: string;\n /** The `kind: \"edit\"` row action's name \u2014 its tooltip and its swipe label. */\n edit: string;\n /** The `kind: \"delete\"` row action's name. */\n delete: string;\n /** What {@link BooleanMark} says to a screen reader for `true` / `false` / nothing. */\n booleanTrue: string;\n booleanFalse: string;\n booleanUnset: string;\n}\n\nexport const DEFAULT_DATA_TABLE_LABELS: DataTableLabels = {\n columns: \"Columns\",\n selectAllRows: \"Select all rows\",\n sortHint: \"Click to sort \u00B7 Shift-click to add a sort\",\n filter: \"Filter\",\n close: \"Close\",\n selectRow: \"Select row\",\n selectRows: \"Select rows\",\n cancelSelection: \"Cancel\",\n rowDetails: \"Details\",\n autoSize: \"Auto-size columns\",\n loading: \"Loading\u2026\",\n filters: \"Filters\",\n clearAll: \"Clear all\",\n done: \"Done\",\n pageSize: \"Rows per page\",\n pageSizeAll: \"All\",\n prevPage: \"Previous page\",\n nextPage: \"Next page\",\n clearFilter: \"Clear filter\",\n filterPlaceholder: \"Filter\u2026\",\n selectFilter: \"Select\",\n selectAll: \"All\",\n selectNone: \"None\",\n dateFrom: \"From\",\n dateTo: \"To\",\n numberMin: \"Min\",\n numberMax: \"Max\",\n numberAbs: \"Absolute value\",\n presets: {\n today: \"Today\",\n yesterday: \"Yesterday\",\n this_week: \"This week\",\n last_week: \"Last week\",\n last_7_days: \"Last 7 days\",\n last_30_days: \"Last 30 days\",\n this_month: \"This month\",\n last_month: \"Last month\",\n last_3_months: \"Last 3 months\",\n ytd: \"Year to date\",\n last_year: \"Last year\",\n },\n table: \"Data table\",\n filterResults: (shown, total) => `${shown} of ${total} rows`,\n sortedAscending: (column) => `Sorted by ${column}, ascending`,\n sortedDescending: (column) => `Sorted by ${column}, descending`,\n sortCleared: (column) => `Sort cleared on ${column}`,\n pageChanged: (page, totalPages) => `Page ${page} of ${totalPages}`,\n // The separators are the ones that shipped, so adding the seam changes no screen.\n pageRange: (from, to, total) => `${from}\u2013${to} / ${total}`,\n rowCount: (total) => `${total}`,\n columnsCount: (visible, total) => `Columns (${visible}/${total})`,\n filterColumn: (column, active) => (active ? `Filter ${column} (active)` : `Filter ${column}`),\n empty: \"No entries\",\n actions: \"Actions\",\n edit: \"Edit\",\n delete: \"Delete\",\n booleanTrue: \"Yes\",\n booleanFalse: \"No\",\n booleanUnset: \"Not set\",\n // The phone sort control (0.22.0). The same words as `DEFAULT_DATA_TABLE_SORT_LABELS`\n // in data-table.tsx, written out rather than spread in: importing that VALUE here\n // would make data-table.tsx and this module import each other (data-table.tsx reads\n // these defaults from here), and would pull the whole table into `i18n/defaults`.\n sortBy: \"Sort by\",\n sortDefault: \"Default order\",\n sortAscending: \"Ascending\",\n sortDescending: \"Descending\",\n};\n", "// The English words of ./mini-calendar, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./mini-calendar re-exports them.\n\nimport type { MiniCalendarLabels } from \"./mini-calendar\";\n\n/** English defaults. Exported as the `miniCalendar` namespace of `UiKitLabels`\n * (src/i18n), the complete reference a translation is written against. */\nexport const DEFAULT_MINI_CALENDAR_LABELS: MiniCalendarLabels = {\n previousMonth: \"Previous month\",\n nextMonth: \"Next month\",\n day: (date) => date,\n chooseStart: \"Choose a start date\",\n chooseEnd: \"Choose an end date\",\n startSelected: (date) => `${date} selected as the start. Choose an end date.`,\n rangeSelected: (from, to) => `${from} to ${to} selected. Choose a start date to begin again.`,\n};\n", "// The English words of ./calendar-heatmap, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./calendar-heatmap re-exports them.\n\nimport type { CalendarHeatmapLabels } from \"./calendar-heatmap\";\n\n/** English defaults, exported as the `calendarHeatmap` namespace of `UiKitLabels`. */\nexport const DEFAULT_CALENDAR_HEATMAP_LABELS: CalendarHeatmapLabels = {\n grid: \"Daily values\",\n day: (date, value) => `${date}: ${value}`,\n less: \"Less\",\n more: \"More\",\n truncated: (count) =>\n `Showing the most recent days; ${count} earlier ${count === 1 ? \"day is\" : \"days are\"} not shown.`,\n};\n", "// The English words of ./month-picker, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./month-picker re-exports them.\n\nimport type { MonthPickerLabels } from \"./month-picker\";\n\n/** The English starting point every override is merged onto. Exported (unlike the\n * calendar's) because it is asked for by name: a host building its own translation\n * table can spread it rather than re-typing four keys to change one. */\nexport const DEFAULT_MONTH_PICKER_LABELS: MonthPickerLabels = {\n previousYear: \"Previous year\",\n nextYear: \"Next year\",\n panel: \"Choose a month\",\n month: (monthYear) => monthYear,\n previousMonth: \"Previous month\",\n nextMonth: \"Next month\",\n today: \"Today\",\n yearPanel: \"Choose a year\",\n earlierYears: \"Earlier years\",\n laterYears: \"Later years\",\n thisYear: \"This year\",\n};\n", "// The English words of ./page-contents, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./page-contents re-exports them.\n\nimport type { PageContentsLabels } from \"./page-contents\";\n\nexport const DEFAULT_PAGE_CONTENTS_LABELS: PageContentsLabels = {\n title: \"On this page\",\n};\n", "// The English words of ./popover, in a module with no component code: the English catalogue\n// (src/i18n/defaults.ts) imports them without the component, so `en` loads as one chunk\n// like the other languages (0.34, KS U8). ./popover re-exports them.\n\nimport type { PopoverLabels } from \"./popover\";\n\n// Exported since the kit grew one label tree (`UiKitLabels`, src/i18n): the complete\n// English reference a translator works from has to be able to name every namespace.\nexport const DEFAULT_POPOVER_LABELS: PopoverLabels = {\n // \"Pop-up\", not \"Popover\": the panel's accessible name is read to USERS, and\n // \"popover\" is a developer's word for it (reported by keksdose, 0.5.0). Only a\n // bare Popover falls back to this \u2014 the kit's own pickers name their panels.\n panel: \"Pop-up\",\n};\n", "// The English words of ./chip, in a module with no component code: the English catalogue\n// (src/i18n/defaults.ts) imports them without the component, so `en` loads as one chunk\n// like the other languages (0.34, KS U8). ./chip-input re-exports them.\n\nimport type { ChipInputLabels } from \"./chip\";\n\nexport const DEFAULT_CHIP_INPUT_LABELS: ChipInputLabels = {\n added: (v) => `${v} added`,\n removed: (v) => `${v} removed`,\n remove: \"Remove\",\n atLimit: (max) => `Limit of ${max} reached`,\n duplicate: (v) => `${v} is already in the list`,\n};\n", "// The English words of ./field-sync, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./field-sync re-exports them.\n\nimport type { FieldSyncLabels } from \"./field-sync\";\n\nexport const DEFAULT_FIELD_SYNC_LABELS: FieldSyncLabels = {\n synced: \"Saved\",\n edited: \"Unsaved changes\",\n pending: \"Saving\u2026\",\n error: \"Could not save\",\n retry: \"Retry\",\n};\n", "// The English words of ./ui, in a module with no component code: the English catalogue\n// (src/i18n/defaults.ts) imports them without the component, so `en` loads as one chunk\n// like the other languages (0.34, KS U8). ./ui re-exports them.\n\nimport type { CharacterCountLabels, PasswordRevealLabels } from \"./field-base\";\nimport type { TabsLabels } from \"./tabs\";\n\nexport const DEFAULT_PASSWORD_REVEAL_LABELS: PasswordRevealLabels = {\n show: \"Show password\",\n hide: \"Hide password\",\n};\n\nexport const DEFAULT_CHARACTER_COUNT_LABELS: CharacterCountLabels = {\n count: (used, max) => `${used} of ${max} characters`,\n remaining: (left) => (left === 1 ? \"1 character left\" : `${left} characters left`),\n limitReached: \"Character limit reached\",\n};\n\nexport const DEFAULT_TABS_LABELS: TabsLabels = {\n add: \"Add tab\",\n remove: (tab) => `Remove ${tab}`,\n more: \"More tabs\",\n backToFirst: \"Back to the first tab\",\n};\n", "// The English words of the wizard, in a module with no other code: the English catalogue\n// (src/i18n/defaults.ts) imports them as it imports every component's `*-labels.ts`.\n// ./types re-exports them. Until 0.34 they sat in ./types, the rule's one exception\n// outside the provider (round 0.34, DOC-6's sev-1 note).\n\nimport type { WizardLabels } from \"./types\";\n\n/** Typed with the two optional keys made required, so code reading the defaults\n * directly (the fallback in `useWizard`) needs no `!`. */\nexport const DEFAULT_WIZARD_LABELS: WizardLabels &\n Required<Pick<WizardLabels, \"missingRequired\" | \"genericError\" | \"done\">> = {\n cancel: \"Cancel\",\n back: \"Back\",\n next: \"Next\",\n skip: \"Skip\",\n finish: \"Finish\",\n submitting: \"Creating\u2026\",\n steps: \"Steps\",\n step: (current, total) => `Step ${current} of ${total}`,\n cancelTitle: \"Discard this form?\",\n confirmCancel: \"Your entries will be lost.\",\n cancelConfirmLabel: \"Discard\",\n cancelDismissLabel: \"Keep editing\",\n reviewTitle: \"Review\",\n edit: \"Edit\",\n missingRequired: \"Please fill in all required fields.\",\n genericError: \"An error occurred\",\n done: \"Done\",\n};\n", "// The English words of ./tour, in a module with no component code: the English catalogue\n// (src/i18n/defaults.ts) imports them without the component, so `en` loads as one chunk\n// like the other languages (0.34, KS U8). ./tour re-exports them.\n\nimport type { TourLabels } from \"./tour\";\n\nexport const DEFAULT_TOUR_LABELS: TourLabels = {\n next: \"Next\",\n back: \"Back\",\n skip: \"Skip\",\n done: \"Done\",\n awaitClickHint: \"Click the highlighted element to continue\",\n awaitInputHint: \"Enter a value in the highlighted field to continue\",\n step: (c, t) => `${c} / ${t}`,\n};\n", "// The English words of `TourCatalogue` and `TourCatalogueCard` (docs/tours-harmonization.md\n// \u00A73), in a module with no component code, like every `*-labels.ts` (0.34, KS U8).\n// keksdose's reviewed words (tour.* in its en.json) where it had them.\n\n/** The `tourCatalogue` namespace. Counts arrive as numbers, dates already formatted. */\nexport interface TourCatalogueLabels {\n /** The search box's name. */\n searchLabel: string;\n searchPlaceholder: string;\n /** The group select's name (keksdose: \"Topic\"). */\n groupLabel: string;\n /** The select's first option, with the count the other filters leave. */\n groupAll: (count: number) => string;\n /** A group's option: its title and its count. */\n groupOption: (group: string, count: number) => string;\n /** The all / to do / done toggle's name. */\n stateLabel: string;\n stateAll: (count: number) => string;\n stateTodo: (count: number) => string;\n stateDone: (count: number) => string;\n /** Under the filter bar while a filter is on. */\n showing: (shown: number, total: number) => string;\n noMatches: string;\n noMatchesHint: string;\n clearFilters: string;\n /** The NEW pill. */\n badgeNew: string;\n /** The pill on a tour reset by an update (\u00A78). */\n badgeUpdated: string;\n /** A reset tour's line: the update's day (formatted) and its reason (\u00A78); `reason` is\n * left out when the tour's update carries none. */\n resetOn: (date: string, reason?: string) => string;\n /** The points chip. */\n points: (count: number) => string;\n steps: (count: number) => string;\n /** The duration, in minutes. */\n duration: (minutes: number) => string;\n /** Completed, with the day (formatted). */\n completedOn: (date: string) => string;\n /** Completed without a date (kastlan's old id list, \u00A76.2). */\n completed: string;\n /** Not taken yet \u2014 the state icon, for a reader. */\n notCompleted: string;\n markUndone: string;\n start: string;\n replay: string;\n}\n\nexport const DEFAULT_TOUR_CATALOGUE_LABELS: TourCatalogueLabels = {\n searchLabel: \"Search tours\",\n searchPlaceholder: \"Search tours\u2026\",\n groupLabel: \"Topic\",\n groupAll: (count) => `All topics (${count})`,\n groupOption: (group, count) => `${group} (${count})`,\n stateLabel: \"Filter tours\",\n stateAll: (count) => `All (${count})`,\n stateTodo: (count) => `Not taken (${count})`,\n stateDone: (count) => `Completed (${count})`,\n showing: (shown, total) => `Showing ${shown} of ${total} tours`,\n noMatches: \"No tour matches\",\n noMatchesHint: \"Try another word, or clear the filter.\",\n clearFilters: \"Clear filters\",\n badgeNew: \"New\",\n badgeUpdated: \"Updated\",\n resetOn: (date, reason) => (reason ? `Reset on ${date}: ${reason}` : `Reset on ${date}`),\n points: (count) => `+${count} pts`,\n steps: (count) => (count === 1 ? \"1 step\" : `${count} steps`),\n duration: (minutes) => `About ${minutes} min`,\n completedOn: (date) => `Completed on ${date}`,\n completed: \"Completed\",\n notCompleted: \"Not completed\",\n markUndone: \"Mark as not done\",\n start: \"Start\",\n replay: \"Replay\",\n};\n", "// The English words of ./command-palette, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./command-palette re-exports them.\n\nimport type { CommandPaletteLabels } from \"./command-palette\";\n\nexport const DEFAULT_COMMAND_PALETTE_LABELS: CommandPaletteLabels = {\n placeholder: \"Search\u2026\",\n empty: \"No results\",\n loading: \"Searching\u2026\",\n dialog: \"Search\",\n error: \"Search failed. Try again.\",\n clear: \"Clear search\",\n submit: \"Search\",\n close: \"Close\",\n};\n", "// The English words of ./global-search, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./global-search re-exports them.\n\nimport type { GlobalSearchLabels } from \"./global-search\";\n\nexport const DEFAULT_GLOBAL_SEARCH_LABELS: GlobalSearchLabels = {\n trigger: \"Search\",\n placeholder: \"Search or jump to\u2026\",\n shortcut: (keys) => `Search (${keys})`,\n suggestions: \"Try\",\n results: \"Results\",\n};\n", "// All user-facing strings for the series chart family \u2014 `SeriesChart`, its drag-to-zoom\n// layer and `ToggleLegend` \u2014 as the `seriesChart` namespace of `<UiKitProvider labels>`,\n// and per chart the `labels` prop over that.\n//\n// A module of its own, with no recharts in it, so the label registry (src/i18n) can\n// import the defaults without pulling the chart library in behind them.\n\nexport interface SeriesChartLabels {\n /** The button that puts a zoomed chart back to its full extent. Visible text. */\n resetZoom: string;\n /** Accessible name of the drag surface laid over the plot. It is the only place the\n * gesture is explained, so it says how the drag is read and how to undo it. */\n zoomHint: string;\n /** What a chart with nothing to draw says, when the caller passes no `empty`. */\n empty: string;\n /** Accessible name of a `ToggleLegend` \u2014 a group of switches, one per series. */\n legend: string;\n /** Accessible name of the group of keyboard stops a clickable chart (`onPointClick`)\n * lays over its bars or periods \u2014 one tab stop, arrow keys between them. */\n points: string;\n}\n\nexport const DEFAULT_SERIES_CHART_LABELS: SeriesChartLabels = {\n resetZoom: \"Reset zoom\",\n zoomHint:\n \"Drag to zoom: a roughly square selection zooms both axes, a long thin one only its own. Double-click to reset.\",\n empty: \"No data\",\n legend: \"Series\",\n points: \"Chart values\",\n};\n", "// All user-facing strings for `PieChart`, as the `pieChart` namespace of\n// `<UiKitProvider labels>`, and per chart the `labels` prop over that.\n//\n// A module of its own, with no recharts in it, for the reason `series-chart-labels`\n// is one: the label registry (src/i18n) imports the defaults, and must not pull the\n// chart library in behind them.\n\nexport interface PieChartLabels {\n /** Accessible name of the group of keyboard stops laid over the slices \u2014 one tab\n * stop, arrow keys between them. */\n slices: string;\n /**\n * One slice's accessible name. `value` arrives through `formatValue`, `percent` as\n * the slice's share of what is drawn, already formatted in the locale (\"42 %\" in\n * German, \"42%\" in English) \u2014 the function only arranges them.\n */\n slice: (label: string, value: string, percent: string) => string;\n /** The caption over the donut's centre figure. */\n total: string;\n /** What a chart with nothing to draw says, when the caller passes no `empty`. */\n empty: string;\n /** Accessible name of the chart's legend (a group of switches, one per slice). */\n legend: string;\n}\n\nexport const DEFAULT_PIE_CHART_LABELS: PieChartLabels = {\n slices: \"Chart slices\",\n slice: (label, value, percent) => `${label}: ${value} (${percent})`,\n total: \"Total\",\n empty: \"No data\",\n legend: \"Categories\",\n};\n", "// The English words of ./sparkline, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./sparkline re-exports them.\n\nimport type { SparklineLabels } from \"./sparkline\";\n\nexport const DEFAULT_SPARKLINE_LABELS: SparklineLabels = {\n rising: (first, last) => `Rising from ${first} to ${last}`,\n falling: (first, last) => `Falling from ${first} to ${last}`,\n flat: (value) => `Unchanged at ${value}`,\n single: (value) => `One value: ${value}`,\n noData: \"No data\",\n named: (name, summary) => `${name}: ${summary}`,\n};\n", "// The English words of ./stat-tile, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./stat-tile re-exports them.\n\nimport type { StatTileLabels } from \"./stat-tile\";\n\nexport const DEFAULT_STAT_TILE_LABELS: StatTileLabels = {\n increase: (amount) => `Up ${amount}`,\n decrease: (amount) => `Down ${amount}`,\n unchanged: \"No change\",\n better: (change) => `${change} (better)`,\n worse: (change) => `${change} (worse)`,\n noValue: \"No data\",\n loading: \"Loading\u2026\",\n};\n", "// The English words of ./signature-pad, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./signature-pad re-exports them.\n\nimport type { SignaturePadLabels } from \"./signature-pad\";\n\nexport const DEFAULT_SIGNATURE_PAD_LABELS: SignaturePadLabels = {\n label: \"Signature\",\n instructions: \"Sign in the box with a mouse, your finger or a pen.\",\n typedFallbackHint: \"If you cannot draw, type your name instead.\",\n empty: \"Nothing drawn yet\",\n signed: \"Signature drawn\",\n undo: \"Undo last stroke\",\n clear: \"Clear\",\n save: \"Save signature\",\n useTyped: \"Type name instead\",\n useDrawn: \"Draw instead\",\n typedName: \"Full name\",\n cleared: \"Signature cleared\",\n undone: \"Last stroke removed\",\n viewEmpty: \"Not signed\",\n viewDrawn: \"Handwritten signature\",\n viewTyped: (name) => `Signed with the typed name ${name}`,\n};\n", "// The English words of ./password-strength, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./password-strength re-exports them.\n\nimport type { PasswordStrengthLabels } from \"./password-strength\";\n\nexport const DEFAULT_PASSWORD_STRENGTH_LABELS: PasswordStrengthLabels = {\n tooShort: \"Too short\",\n weak: \"Weak\",\n fair: \"Fair\",\n good: \"Good\",\n strong: \"Strong\",\n announcement: (level) => `Password strength: ${level}`,\n ruleLength: (minLength) => `At least ${minLength} characters`,\n ruleCase: \"Upper and lower case\",\n ruleDigit: \"A number\",\n ruleSymbol: \"A symbol\",\n optional: (rule) => `${rule} (optional)`,\n met: \"Met:\",\n notMet: \"Not met:\",\n tooLong: (maxBytes) =>\n `At most ${maxBytes} characters (accents and emoji count for more than one).`,\n};\n", "// The English words of ./danger-confirm, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./danger-confirm re-exports them.\n\nimport type { DangerConfirmLabels } from \"./danger-confirm\";\n\n/** `satisfies` rather than a type annotation, so `DEFAULT_DANGER_CONFIRM_LABELS.phrase`\n * stays callable for a caller that composes its own label from it. */\nexport const DEFAULT_DANGER_CONFIRM_LABELS = {\n arm: \"Delete\u2026\",\n confirm: \"Delete\",\n cancel: \"Cancel\",\n prompt: \"This cannot be undone.\",\n password: \"Password\",\n phrase: (phrase: string) => `Type \u201C${phrase}\u201D to confirm`,\n acknowledge: \"I have read what this does and want to continue.\",\n needsPhrase: (phrase: string) => `Type \u201C${phrase}\u201D to confirm`,\n needsAcknowledge: \"Tick the box to confirm\",\n needsPassword: \"Enter your password to confirm\",\n} satisfies DangerConfirmLabels;\n", "// The English words of ./swatch-picker, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./swatch-picker re-exports them.\n\nimport type { SwatchPickerLabels } from \"./swatch-picker\";\n\nexport const DEFAULT_SWATCH_PICKER_LABELS: SwatchPickerLabels = {\n none: \"No colour\",\n mixed: \"Mixed: the selected items have different colours\",\n};\n", "// The English words of ./icon-picker, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./icon-picker re-exports them.\n\nimport type { IconPickerLabels } from \"./icon-picker\";\n\nexport const DEFAULT_ICON_PICKER_LABELS: IconPickerLabels = {\n none: \"No icon\",\n mixed: \"Mixed: the selected items have different icons\",\n search: \"Search icons\",\n noResults: \"No icons match\",\n resultCount: (count) => (count === 1 ? \"1 icon\" : `${count} icons`),\n};\n", "// The English words of ./dialog-frame, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./dialog-frame re-exports them.\n\nimport type { DialogFrameLabels } from \"./dialog-frame\";\n\nexport const DEFAULT_DIALOG_FRAME_LABELS: DialogFrameLabels = { close: \"Close\" };\n", "// The English words of the file pickers (./use-file-picker), in a module with no component\n// code: the English catalogue (src/i18n/defaults.ts) imports them without the component, so\n// `en` loads as one chunk like the other languages (0.34, KS U8). In hooks/ beside the hook\n// since 0.34 (MOD-8); components/file-button re-exports them.\n\nimport type { FilePickerLabels } from \"./use-file-picker\";\n\nexport const DEFAULT_FILE_PICKER_LABELS: FilePickerLabels = {\n rejectedType: (name) => `\u201C${name}\u201D is not a supported file type`,\n rejectedTypeOnly: (accept) => `Only ${accept} files`,\n rejectedSize: (name, maxSize) => `\u201C${name}\u201D is larger than ${maxSize}`,\n rejectedCount: (name, maxFiles) =>\n `\u201C${name}\u201D was not added: at most ${maxFiles} ${maxFiles === 1 ? \"file\" : \"files\"}`,\n rejectedInvalid: (name) => `\u201C${name}\u201D cannot be used here`,\n rejectedMany: (count) => `${count} files were not added`,\n rejectedPick: (count) =>\n count === 1 ? \"The file was not added\" : `None of the ${count} files were added`,\n selected: (count, firstName) => (count === 1 ? `\u201C${firstName}\u201D selected` : `${count} files selected`),\n remove: (name) => `Remove \u201C${name}\u201D`,\n clearAll: \"Remove all files\",\n removed: (name) => `\u201C${name}\u201D removed`,\n cleared: \"All files removed\",\n dropzone: \"File upload\",\n browse: \"Browse\",\n empty: \"Drop a file here\",\n emptyMultiple: \"Drop files here\",\n hint: (accept) => (accept ? `Accepted: ${accept}` : \"Any file type\"),\n busy: \"Uploading\u2026\",\n};\n", "// The English words of ./measured-grid, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./measured-grid re-exports them.\n\nimport type { MeasuredGridLabels } from \"./measured-grid\";\n\n/** English defaults. Exported as the `measuredGrid` namespace of `UiKitLabels`\n * (src/i18n), the complete reference a translation is written against. */\nexport const DEFAULT_MEASURED_GRID_LABELS: MeasuredGridLabels = {\n view: \"Table view\",\n cellsView: \"Cells\",\n textView: \"Text\",\n addRow: \"Add row\",\n removeRow: (row) => `Remove row ${row}`,\n clear: \"Clear table\",\n pasteHint: \"Paste a block from a spreadsheet into any cell\",\n cell: (column, row) => `${column}, row ${row}`,\n rowNumber: \"Row\",\n rowActions: \"Row actions\",\n keyboardHint:\n \"Arrow keys move between cells. Type to replace a cell, F2 to edit it, Escape to undo the edit. Enter moves down and adds a row at the end.\",\n lineError: (line) => `Line ${line} could not be read`,\n points: (count) => (count === 1 ? \"1 point\" : `${count} points`),\n problems: (count) => (count === 1 ? \"1 cell is not a number\" : `${count} cells are not numbers`),\n};\n", "// The English words of ./confirm-dialog, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./confirm-dialog re-exports them.\n\nimport type { ConfirmDialogLabels } from \"./confirm-dialog\";\n\n/** `satisfies` rather than a type annotation, so `.typed` stays known-callable for a\n * caller composing its own label from it. */\nexport const DEFAULT_CONFIRM_DIALOG_LABELS = {\n confirm: \"Confirm\",\n cancel: \"Cancel\",\n typed: (text: string) => `Type \u201C${text}\u201D to confirm`,\n} satisfies ConfirmDialogLabels;\n", "// The English words of ./floating-panel, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./floating-panel re-exports them.\n\nimport type { FloatingPanelLabels } from \"./floating-panel\";\n\nexport const DEFAULT_FLOATING_PANEL_LABELS: FloatingPanelLabels = {\n close: \"Close\",\n badge: (count) => `${count} new`,\n};\n", "// The English words of ./feedback-attachment, in a module with no component code: the\n// English catalogue (src/i18n/defaults.ts) imports them without the component, so `en`\n// loads as one chunk like the other languages (0.34, KS U8). ./feedback-attachment\n// re-exports them.\n\nimport type { FeedbackAttachmentFieldLabels } from \"./feedback-attachment\";\n\n/**\n * English, in the feedback contract's wording since 0.27.0 (docs/feedback-harmonization.md\n * \u00A74.2: keksdose's `feedback.*` keys are the canon, and the kit owns them now). Three\n * strings moved with it:\n *\n * - `attachmentAdd` \"Attach image\" \u2192 **\"Add attachment\"**: the field takes a PDF or a text\n * log as well wherever the app passes `FEEDBACK_ATTACHMENT_ACCEPT` (keksdose feedback\n * #87), and a button that says \"image\" over a picker that offers a PDF is wrong in one\n * of the two places.\n * - `attachmentPaste` \u2192 keksdose's longer line, which says WHY one would paste \u2014 a region\n * snip shows one corner rather than the whole page (Steering Design feedback #39).\n * - `attachmentLimit` for one: \"remove **it**\", as keksdose's `attachments_full_one`;\n * \"remove one\" of a single file read oddly.\n */\nexport const DEFAULT_FEEDBACK_ATTACHMENT_LABELS: FeedbackAttachmentFieldLabels = {\n attachmentAdd: \"Add attachment\",\n attachmentCapture: \"Capture screenshot\",\n attachmentPaste: \"\u2026or paste a screenshot straight from the clipboard, so you can show one corner rather than the whole page.\",\n attachmentRemove: \"Remove attachment\",\n attachmentList: \"Attachments\",\n attachmentScreenshot: \"Screenshot\",\n attachmentRemoveFile: (name) => `Remove ${name}`,\n attachmentLimit: (max) =>\n max === 1\n ? \"Up to 1 attachment \u2014 remove it to add another.\"\n : `Up to ${max} attachments \u2014 remove one to add another.`,\n attachmentUploading: \"Uploading\u2026\",\n attachmentUploadFailed: (name) => `\u201C${name}\u201D could not be uploaded`,\n};\n", "// The English words of ./feedback-dialog, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./feedback-dialog re-exports them.\n\nimport type { FeedbackDialogTextLabels } from \"./feedback-dialog\";\n\n/**\n * English. The feedback contract's wording (docs/feedback-harmonization.md \u00A74.2, 0.27.0):\n * \"Send\", not keksdose's \"Save\", and the body asks \"What happened?\" (Marcel's two calls);\n * the rest is keksdose's. Since 0.27.0 `attachment`, the single-mode heading, is keksdose's\n * `feedback.attachment` **\"Attachment\"** (it said \"Screenshot\" over a button that says \"Add\n * attachment\" and a picker that may offer a PDF), and `submitHint` is keksdose's\n * **\"Ctrl+Enter to send\"** \u2014 \"\u2318 Enter to send\" on Apple platforms, where the old\n * \"Ctrl/\u2318 + Enter\" made every reader parse both. The `attachments=\"multiple\"` heading is\n * `feedbackAttachment.attachmentList` (\"Attachments\") and did not change.\n */\nexport const DEFAULT_FEEDBACK_DIALOG_LABELS: FeedbackDialogTextLabels = {\n title: \"Send feedback\",\n category: \"Category\",\n subject: \"Subject\",\n body: \"What happened?\",\n bodyOptional: \"What happened? (optional)\",\n attachment: \"Attachment\",\n // The modifier as `form.submitShortcut` writes it: \"\u2318 Enter\" on Apple, \"Ctrl+Enter\" elsewhere.\n submitHint: (apple) => (apple ? \"\u2318 Enter to send\" : \"Ctrl+Enter to send\"),\n cancel: \"Cancel\",\n save: \"Send\",\n publicNotice: \"Other users will see the title and text (never your screenshots or files).\",\n};\n", "// The English words of ./feedback-thread, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./feedback-thread re-exports them.\n\nimport type { FeedbackComposerLabels, FeedbackThreadLabels } from \"./feedback-thread\";\n\nexport const DEFAULT_FEEDBACK_THREAD_LABELS: FeedbackThreadLabels = {\n thread: \"Comments\",\n empty: \"No comments yet\",\n loading: \"Loading comments\u2026\",\n you: \"You\",\n staff: \"Staff\",\n attachments: \"Attachments\",\n};\n\nexport const DEFAULT_FEEDBACK_COMPOSER_LABELS: FeedbackComposerLabels = {\n field: \"Write a comment\",\n placeholder: \"Write a comment\u2026\",\n send: \"Send\",\n sendHint: (modifier) => `${modifier} + Enter to send`,\n sendHintEnter: \"Enter to send, Shift + Enter for a new line\",\n};\n", "import { useKitLabels, type LabelOverride } from \"../i18n/kit-labels\";\nimport type { FeedbackCategory, FeedbackStatus } from \"./feedback-vocabulary\";\n\n/**\n * The words of a report's status and category, and the toasts a feedback page shows \u2014\n * three `<UiKitProvider labels>` namespaces (0.27.0).\n *\n * Until 0.27 every app kept its own map from the enum to a translation key (keksdose\n * `STATUS_LABEL` and `categoryLabelKey`, \"the package has no translations\"), and the\n * three German maps had drifted apart: Kurvenschmiede said \"In Arbeit\", \"In Pr\u00FCfung\",\n * \"Test auf der Live-Umgebung\" where keksdose and kastlan said \"In Bearbeitung\",\n * \"Zur Pr\u00FCfung\", \"Live testen\". Marcel's feedback round (2026-10-04,\n * docs/feedback-harmonization.md \u00A72.4) made keksdose's wording the canon and the kit its\n * owner, in all seven languages. The English defaults below are keksdose's\n * `frontend/src/shared/i18n/locales/en.json` (`feedback.*`); the de-CH canon for the\n * catalogues is noted on each key (keksdose `de-CH.json` \u2014 ss, never \u00DF).\n *\n * `FeedbackStatusBadge`, `FeedbackCategoryBadge` and `FeedbackStatusTransitions` read\n * the first two by default, so an app drops its own maps; a `label` passed to them still\n * wins.\n */\n\n/**\n * `feedbackStatus` \u2014 one word per status, keyed by the enum value so\n * `labels[row.status]` is the whole lookup.\n *\n * de-CH canon: OPEN \"Offen\" \u00B7 READY \"Bereit zur Umsetzung\" \u00B7 REWORK \"Nacharbeit angefordert\"\n * (0.40, \u00A710.6) \u00B7 IN_PROGRESS \"In Bearbeitung\" \u00B7 IN_EVALUATION \"Zur Pr\u00FCfung\"\n * \u00B7 NEEDS_LIVE_TEST \"Live testen\" \u00B7 POSTPONED \"Zur\u00FCckgestellt\" \u00B7 DONE \"Erledigt\" \u00B7\n * WONT_DO \"Wird nicht umgesetzt\".\n */\nexport type FeedbackStatusLabels = Record<FeedbackStatus, string>;\n\nexport const DEFAULT_FEEDBACK_STATUS_LABELS: FeedbackStatusLabels = {\n OPEN: \"Open\",\n READY: \"Ready to implement\",\n REWORK: \"Rework requested\",\n IN_PROGRESS: \"In progress\",\n IN_EVALUATION: \"In evaluation\",\n NEEDS_LIVE_TEST: \"Test when live\",\n POSTPONED: \"Postponed\",\n DONE: \"Done\",\n WONT_DO: \"Won't do\",\n};\n\n/**\n * `feedbackCategory` \u2014 one word per category, keyed by the enum value. `CRASH` is never\n * pickable, but it is shown: on the badge, in the filter, in a row's detail.\n *\n * de-CH canon: CRASH \"Absturz\" \u00B7 BUG \"Fehler\" \u00B7 IDEA \"Idee\" \u00B7 QUESTION \"Frage\" \u00B7\n * OTHER \"Sonstiges\".\n */\nexport type FeedbackCategoryLabels = Record<FeedbackCategory, string>;\n\nexport const DEFAULT_FEEDBACK_CATEGORY_LABELS: FeedbackCategoryLabels = {\n CRASH: \"Crash\",\n BUG: \"Bug\",\n IDEA: \"Idea\",\n QUESTION: \"Question\",\n OTHER: \"Other\",\n};\n\n/**\n * `feedbackToast` \u2014 what the submit dialog, a failed save and a status change say in a\n * toast (\u00A74.2, \u00A74.4, \u00A74.5 of the contract). A server's `detail` sentence, when it sent\n * one, wins over `submitFailed` and `updateFailed` (\u00A73.7); that choice is the caller's.\n */\nexport interface FeedbackToastLabels {\n /** A report was filed. de-CH: \"Danke f\u00FCr Ihr Feedback!\" */\n submitted: string;\n /** `POST /feedback` failed with no `detail` of its own.\n * de-CH: \"Feedback konnte nicht gesendet werden\" */\n submitFailed: string;\n /** A picked file is not an image, a PDF or a text file (\u00A73.5).\n * de-CH: \"Nur Bilder, PDF- oder Textdateien sind erlaubt\" */\n attachmentUnsupported: string;\n /** A picked file is over the 10 MB the contract allows (\u00A73.5).\n * de-CH: \"Datei ist gr\u00F6sser als 10 MB\" */\n attachmentTooLarge: string;\n /** More files were picked than fit; `count` is how many fit.\n * de-CH: \"Es passen nur {{count}} Anh\u00E4nge \u2013 die \u00FCbrigen wurden weggelassen.\" */\n attachmentTooMany: (count: number) => string;\n /** The screenshot capture failed (or its optional peer is not installed).\n * de-CH: \"Screenshot konnte nicht aufgenommen werden\" */\n captureFailed: string;\n /** A `PATCH /feedback/{id}` failed with no `detail` of its own (\u00A74.4).\n * de-CH: \"\u00C4nderung konnte nicht gespeichert werden.\" */\n updateFailed: string;\n /** A status change landed \u2014 the 8 s Undo toast (\u00A74.5). `status` is the NEW status's\n * label, `title` the report's title. de-CH: \"Auf \u201E{{status}}\u201C gesetzt: {{title}}\" */\n statusChanged: (status: string, title: string) => string;\n /** That toast's action. de-CH: \"R\u00FCckg\u00E4ngig\" */\n statusUndo: string;\n /** The Undo landed \u2014 `status` is the RESTORED status's label.\n * de-CH: \"Zur\u00FCck auf \u201E{{status}}\u201C: {{title}}\" */\n statusRestored: (status: string, title: string) => string;\n /** 0.38.1: `POST /feedback/{id}/comments` failed with no `detail` of its own \u2014 for\n * `FeedbackCommentThread`'s `onComment`. de-CH: \"Kommentar konnte nicht gesendet\n * werden.\" */\n commentFailed: string;\n /** 0.38.1: `PUT` / `DELETE /feedback/{id}/vote` failed with no `detail` of its own \u2014\n * for `FeedbackVoteButton`'s `onVote` (the button rolls back; the app toasts).\n * de-CH: \"Stimme konnte nicht gespeichert werden.\" */\n voteFailed: string;\n /** 0.38.1: `POST /feedback/{id}/replies` failed with no `detail` of its own \u2014 for\n * `FeedbackRowDetail`'s `onReply`. de-CH: \"Antwort konnte nicht gesendet werden.\" */\n replyFailed: string;\n}\n\nexport const DEFAULT_FEEDBACK_TOAST_LABELS: FeedbackToastLabels = {\n submitted: \"Thanks for the feedback!\",\n submitFailed: \"Could not submit feedback\",\n attachmentUnsupported: \"Only images, PDF or text files are allowed\",\n attachmentTooLarge: \"File is larger than 10 MB\",\n attachmentTooMany: (count) =>\n count === 1\n ? \"Only 1 attachment fits \u2014 the rest were left out.\"\n : `Only ${count} attachments fit \u2014 the rest were left out.`,\n captureFailed: \"Could not capture a screenshot\",\n updateFailed: \"Could not save that change.\",\n statusChanged: (status, title) => `Set to \u201C${status}\u201D: ${title}`,\n statusUndo: \"Undo\",\n statusRestored: (status, title) => `Back to \u201C${status}\u201D: ${title}`,\n commentFailed: \"Could not post the comment.\",\n voteFailed: \"Could not save your vote.\",\n replyFailed: \"Could not send the reply.\",\n};\n\n/** `feedbackStatus` resolved: English, then `<UiKitProvider labels>`, then `labels`. For\n * the places that need a status's name outside the kit's own parts \u2014 a filter's options,\n * `feedbackSwipePlan`'s panels, an app's overview tile. */\nexport function useFeedbackStatusLabels(labels?: LabelOverride<FeedbackStatusLabels>): FeedbackStatusLabels {\n return useKitLabels(\"feedbackStatus\", DEFAULT_FEEDBACK_STATUS_LABELS, labels);\n}\n\n/** `feedbackCategory` resolved: English, then the provider, then `labels`. */\nexport function useFeedbackCategoryLabels(labels?: LabelOverride<FeedbackCategoryLabels>): FeedbackCategoryLabels {\n return useKitLabels(\"feedbackCategory\", DEFAULT_FEEDBACK_CATEGORY_LABELS, labels);\n}\n\n/** `feedbackToast` resolved: English, then the provider, then `labels`. */\nexport function useFeedbackToastLabels(labels?: LabelOverride<FeedbackToastLabels>): FeedbackToastLabels {\n return useKitLabels(\"feedbackToast\", DEFAULT_FEEDBACK_TOAST_LABELS, labels);\n}\n", "// The English words of ./feedback-menu, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./feedback-menu re-exports them.\n\nimport type { FeedbackMenuLabels } from \"./feedback-menu\";\n\nexport const DEFAULT_FEEDBACK_MENU_LABELS: FeedbackMenuLabels = {\n trigger: \"Send feedback\",\n myFeedback: \"My feedback\",\n discussion: \"Feedback discussion\",\n inbox: \"Feedback inbox\",\n};\n", "// The English words of the public feedback pages (round 0.38, docs/feedback-harmonization.md\n// \u00A79.15) \u2014 `FeedbackPublicList`, `FeedbackPublicDetail` and `FeedbackPublicSwitch` \u2014 in a\n// module with no component code: the English catalogue (src/i18n/defaults.ts) imports\n// them without the components, as every `*-labels.ts` (0.34, KS U8).\n\n/**\n * `feedbackPublic` \u2014 the words of the pages every user reads (\u00A79.3, \u00A79.9): the list's\n * sort, search and count, the detail's sections and the \"Visible to others\" switch. The\n * table's column names that the inbox already has (#, Date, Category, Subject, Status)\n * stay `feedbackPage`'s, so the two lists cannot disagree; the vote button's words are\n * `feedbackVote`'s, the thread's `feedbackComments`'.\n *\n * de-CH canon (\u00A79.2, \u00A79.5, \u00A710.6): `title` \"Feedback-Diskussion\", `anonymous` \"Eine Person\".\n */\nexport interface FeedbackPublicLabels {\n /** The page's heading \u2014 keksdose's `/all-feedback`, the menu's \"Feedback discussion\"\n * (0.40, \u00A710.2 decision 11; \"All feedback\" before). de-CH \"Feedback-Diskussion\". */\n title: string;\n /** The sort toggle's accessible name. */\n sort: string;\n /** `sort=newest`, the server's default. */\n sortNewest: string;\n /** `sort=votes`: most votes, then newest. */\n sortVotes: string;\n /** `sort=updated`. */\n sortUpdated: string;\n /** The search box's accessible name: it searches titles only (\u00A79.9). */\n search: string;\n /** The Votes column's header. */\n columnVotes: string;\n /** How many reports the server has for this query (`total`). */\n total: (count: number) => string;\n /** A row's visible comments, the chip beside its title. */\n comments: (count: number) => string;\n /** A row's votes, the count on a phone card (the button is in the opened report). */\n votes: (count: number) => string;\n /** A `null` name (\u00A79.5): an incomplete or erased account. */\n anonymous: string;\n /** Who filed it, with the server's first name (or {@link anonymous}). */\n filedBy: (name: string) => string;\n /** The detail's public body section. */\n body: string;\n /** The detail's merged replies and comments (\u00A79.8, \"Order\"). */\n conversation: string;\n /** While the list or the comments load. */\n loading: string;\n /** No public report (yet, or for this search). */\n empty: string;\n /** `FeedbackPublicSwitch`'s label (\u00A79.3, decision 6). */\n visibleToOthers: string;\n /** The line under it: what others see, and what never. */\n visibleHint: string;\n /** Why the author cannot flip it now: the report is past its open window (\u00A79.3). */\n visibleLocked: string;\n /** 0.38.1: the pager's \"where am I\" \u2014 `page` counts from 1. The server answers no\n * total, so there is no \"of N\". */\n page: (page: number) => string;\n}\n\nexport const DEFAULT_FEEDBACK_PUBLIC_LABELS: FeedbackPublicLabels = {\n title: \"Feedback discussion\",\n sort: \"Sort\",\n sortNewest: \"Newest\",\n sortVotes: \"Most wanted\",\n sortUpdated: \"Recently updated\",\n search: \"Search titles\",\n columnVotes: \"Votes\",\n total: (count) => (count === 1 ? \"1 report\" : `${count} reports`),\n comments: (count) => (count === 1 ? \"1 comment\" : `${count} comments`),\n votes: (count) => (count === 1 ? \"1 vote\" : `${count} votes`),\n anonymous: \"A user\",\n filedBy: (name) => `From ${name}`,\n body: \"Description\",\n conversation: \"Answers and comments\",\n loading: \"Loading\u2026\",\n empty: \"No reports yet\",\n visibleToOthers: \"Visible to others\",\n visibleHint: \"Other users see the title and text, never your screenshots or files.\",\n visibleLocked: \"Only while the report is still open.\",\n page: (page) => `Page ${page}`,\n};\n", "// The English words of `useFeedbackNotificationTypes` (round 0.38), in a module with no\n// component code, as every `*-labels.ts`: the English catalogue imports them alone.\n\n/**\n * `feedbackNotificationTypes` \u2014 the setting words of the feedback notification types\n * (docs/feedback-harmonization.md \u00A79.11). In the kit, not in each app, because two apps\n * declare them (keksdose, Kurvenschmiede; kastlan `feedback_answered` alone). The mail and\n * push texts stay the app's.\n */\nexport interface FeedbackNotificationTypesLabels {\n /** `feedback_answered`: a reply on a report the person wrote or commented on. */\n answered: string;\n answeredDescription: string;\n /** `feedback_comment`: a visible comment on such a report. */\n comment: string;\n commentDescription: string;\n /** 0.46 (feedback \u00A711): `feedback_received`, an admin's alert for a new report, a\n * rework and a new crash. */\n received: string;\n receivedDescription: string;\n /** A heading the apps may put over the admin's types (\"Admin\"). */\n adminGroup: string;\n}\n\nexport const DEFAULT_FEEDBACK_NOTIFICATION_TYPES_LABELS: FeedbackNotificationTypesLabels = {\n answered: \"Answers to your reports\",\n answeredDescription: \"When a report you wrote or commented on gets an answer.\",\n comment: \"Comments on reports you follow\",\n commentDescription: \"When someone comments on a report you wrote or commented on.\",\n received: \"New feedback and reworks\",\n receivedDescription: \"When someone files a report or sends one back.\",\n adminGroup: \"Admin\",\n};\n", "// The English words of ./feedback-context, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./feedback-context re-exports them.\n\nimport type { FeedbackContextLabels } from \"./feedback-context\";\n\nexport const DEFAULT_FEEDBACK_CONTEXT_LABELS: FeedbackContextLabels = {\n user: \"User\",\n attachUrl: \"Attach current page URL\",\n};\n", "// The English words of ./feedback-table, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./feedback-table re-exports them.\n\nimport type { FeedbackPageLabels } from \"./feedback-table\";\n\nexport const DEFAULT_FEEDBACK_PAGE_LABELS: FeedbackPageLabels = {\n title: \"Feedback inbox\",\n myTitle: \"My feedback\",\n columnId: \"#\",\n columnDate: \"Date\",\n columnCategory: \"Category\",\n columnSubject: \"Subject\",\n columnUser: \"User\",\n columnEmail: \"Email\",\n columnUrl: \"URL\",\n columnStatus: \"Status\",\n columnResolved: \"Resolved\",\n openPage: \"Open page\",\n empty: \"None\",\n deletedUser: \"<deleted user>\",\n userFallback: (id) => `user #${id}`,\n environment: (environment) => String(environment ?? \"\").toUpperCase(),\n reworkChip: (count) => (count === 1 ? \"Rework\" : `Rework \u00D7${count}`),\n awaitingFilter: \"Only what is waiting for you\",\n phoneActions: \"Feedback actions\",\n};\n", "// The English words of ./feedback-row-detail, in a module with no component code: the\n// English catalogue (src/i18n/defaults.ts) imports them without the component, so `en`\n// loads as one chunk like the other languages (0.34, KS U8). ./feedback-row-detail\n// re-exports them.\n\nimport type { FeedbackDetailLabels } from \"./feedback-row-detail\";\n\nexport const DEFAULT_FEEDBACK_DETAIL_LABELS: FeedbackDetailLabels = {\n subject: \"Subject\",\n body: \"Description\",\n edit: \"Edit\",\n editDescription: \"Edit description\",\n save: \"Save\",\n cancel: \"Cancel\",\n url: \"URL\",\n copyUrl: \"Copy URL\",\n attachment: \"Attachment\",\n download: (name) => `Download ${name}`,\n downloadFailed: \"The attachment could not be downloaded.\",\n outcome: \"Outcome\",\n replies: \"Replies\",\n resolvedAt: (date) => `Resolved: ${date}`,\n outcomeAdd: \"Add outcome\",\n outcomeUpdate: \"Update\",\n outcomePlaceholder: \"What was done, decided, or why this won't be addressed.\",\n rework: \"Rework\",\n openPage: \"Open page\",\n reworkTitle: \"Send for rework\",\n reworkSend: \"Send rework\",\n reworkPlaceholder: \"What still needs refinement? Any new constraints or change of direction.\",\n reworkUploadFailed: \"The file could not be uploaded. The rework was not sent.\",\n status: \"Status\",\n note: \"Note\",\n};\n", "// The English words of round 0.38's thread parts \u2014 ./feedback-vote-button,\n// ./feedback-comment-thread and ./feedback-replies \u2014 in a module with no component code:\n// the English catalogue (src/i18n/defaults.ts) imports them without the components, so\n// `en` loads as one chunk like the other languages (0.34, KS U8). Each component module\n// re-exports its own.\n\nimport type { FeedbackCommentsLabels } from \"./feedback-comment-thread\";\nimport type { FeedbackRepliesLabels } from \"./feedback-replies\";\nimport type { FeedbackVoteLabels } from \"./feedback-vote-button\";\n\nexport const DEFAULT_FEEDBACK_VOTE_LABELS: FeedbackVoteLabels = {\n vote: \"I want this too\",\n own: \"Your report\",\n};\n\nexport const DEFAULT_FEEDBACK_REPLIES_LABELS: FeedbackRepliesLabels = {\n replies: \"Replies\",\n empty: \"No reply yet\",\n admin: \"Admin\",\n statusChanged: \"Status changed to\",\n field: \"Write a reply\",\n placeholder: \"Write a reply\u2026\",\n reply: \"Reply\",\n status: \"Status with the reply\",\n noChange: \"No change\",\n nudge: \"The author has not been told. Add a reply.\",\n};\n\nexport const DEFAULT_FEEDBACK_COMMENTS_LABELS: FeedbackCommentsLabels = {\n comments: \"Comments\",\n empty: \"No comments yet\",\n hidden: \"Hidden by an admin\",\n hide: \"Hide\",\n unhide: \"Unhide\",\n delete: \"Delete\",\n deleteTitle: \"Delete this comment?\",\n deleteBody: \"It is removed for everyone. This cannot be undone.\",\n field: \"Write a comment\",\n placeholder: \"Write a comment\u2026\",\n send: \"Comment\",\n};\n", "import { useMemo } from \"react\";\nimport { useKitLabelOverrides } from \"../i18n/kit-labels\";\n\n/**\n * The `accountSettings` namespace of `<UiKitProvider labels>`: one record per section \u2014\n * `profile`, `password`, `twoFactor`, `passkeys` \u2014 each merged key by key, so an app\n * can translate `accountSettings.twoFactor.scanHint` alone.\n *\n * Before 0.12.0 every section took a REQUIRED `labels` prop and had no English of its\n * own, so each app spelled out 30-odd keys at the call site and still hard-coded some\n * (kastlan's profile page passed `email: \"Email\"` in English to a German page). The\n * prop stays, now partial, and wins over the provider as everywhere else in the kit.\n *\n * Its own module, beside the components rather than in them, so `PasskeysSetting`\n * (its own file) and the older three read one tree without importing each other.\n */\n\nexport interface ProfileSettingLabels {\n title: string;\n email: string;\n role: string;\n memberSince: string;\n /** The single name field \u2014 the card without `firstName` / `lastName`. */\n displayName: string;\n save: string;\n /**\n * 0.30.0 (docs/user-admin-harmonization.md \u00A76.1): the two fields that replace\n * `displayName` once the card is given `firstName` / `lastName`. OPTIONAL, like\n * `TwoFactorSettingLabels.qrAlt` and for its reason \u2014 this interface is annotated at\n * call sites \u2014 and filled from the provider's `accountSettings.profile`, then English.\n */\n firstName?: string;\n lastName?: string;\n /** Why Save is held while a name is blank: both are required (\u00A73.1). */\n nameRequired?: string;\n}\n\nexport interface PasswordSettingLabels {\n title: string;\n current: string;\n next: string;\n confirm: string;\n submit: string;\n tooShort: string;\n mismatch: string;\n /**\n * 0.34 (KS U3): `password_incorrect` \u2014 server-kit's `400` for a wrong current\n * password \u2014 under the current-password field, in the words `EmailChangeSetting`\n * and `DeleteAccountSetting` say it with. OPTIONAL, like\n * `TwoFactorSettingLabels.qrAlt` and for its reason \u2014 this interface is annotated at\n * call sites \u2014 and filled from the provider's `accountSettings.password`, then English.\n */\n wrongPassword?: string;\n}\n\nexport interface TwoFactorSettingLabels {\n /**\n * Before 0.31 the card's one line, \"<status>: On\". Since 0.31 the setting's name is the\n * card's {@link title} and the state stands beside it, so this is read only where no\n * `title` is given at the same level \u2014 an app that translated `status` keeps its word\n * as the title.\n */\n status: string;\n enabledText: string;\n disabledText: string;\n enable: string;\n scanHint: string;\n codeLabel: string;\n verify: string;\n disableSection: string;\n password: string;\n disable: string;\n /**\n * Alt text for the setup QR code, which shipped as a hardcoded `alt=\"QR\"`.\n *\n * OPTIONAL, like the two keys below, and not because it matters less: this interface\n * is annotated at consumer call sites (`const LABELS: TwoFactorSettingLabels = {\u2026}`),\n * so a new REQUIRED key is a compile error in every app on the next `npm update` \u2014\n * the additive-API rule in the README. Each falls back to the provider's\n * `accountSettings.twoFactor`, then English.\n */\n qrAlt?: string;\n /** The line over the manual-entry key, for a phone that cannot scan its own screen. */\n secretHint?: string;\n /** The copy button beside that key. */\n copySecret?: string;\n /**\n * 0.31.0 (docs/settings-harmonization.md \u00A73.7): the card's title, a heading inside a\n * `SettingsLayout`. OPTIONAL for the reason `qrAlt` is. Unset, the same source's\n * `status` stands in for it, then English.\n */\n title?: string;\n}\n\nexport interface PasskeysSettingLabels {\n title: string;\n /** The line under the title saying what a passkey is for \u2014 `mode=\"instead\"` (the\n * default): the passkey stands in for the password. */\n description: string;\n /**\n * The same line for `mode=\"alongside\"` (0.18.0): the password keeps working and the\n * passkey is a second way in. OPTIONAL for the reason `TwoFactorSettingLabels.qrAlt`\n * is \u2014 this interface is annotated at call sites \u2014 and filled from the provider's\n * `accountSettings.passkeys`, then English.\n */\n descriptionAlongside?: string;\n empty: string;\n loading: string;\n /** Accessible name of the list. */\n list: string;\n nameLabel: string;\n namePlaceholder: string;\n add: string;\n /** The add button while the app's WebAuthn ceremony runs \u2014 the OS prompt is open. */\n adding: string;\n rename: string;\n /** The row's rename button, named for its passkey \u2014 it starts with `rename`, the\n * visible text, so voice control finds it by what it says. */\n renameItem: (name: string) => string;\n /** Accessible name of the inline rename field. */\n renameField: (name: string) => string;\n save: string;\n cancel: string;\n delete: string;\n /** The row's delete button, named for its passkey (see `renameItem`). */\n deleteItem: (name: string) => string;\n /** The inline question a delete asks first. */\n deleteConfirm: (name: string) => string;\n /** The destructive button that answers it. */\n confirmDelete: string;\n /** `date` arrives formatted in the provider's locale. */\n created: (date: string) => string;\n lastUsed: (date: string) => string;\n neverUsed: string;\n}\n\nexport interface AccountSettingsLabels {\n profile: Required<ProfileSettingLabels>;\n password: Required<PasswordSettingLabels>;\n // `Required` here, optional on the section interfaces: the namespace is what a full\n // catalogue (`@eifi1/ui-kit/i18n/<code>`, `missingKitLabels`) is written against, so\n // it must name the late keys; the section interfaces are annotated at call sites.\n twoFactor: Required<TwoFactorSettingLabels>;\n passkeys: Required<PasskeysSettingLabels>;\n}\n\nexport const DEFAULT_ACCOUNT_SETTINGS_LABELS: AccountSettingsLabels = {\n profile: {\n title: \"Profile\",\n email: \"Email\",\n role: \"Role\",\n memberSince: \"Member since\",\n displayName: \"Display name\",\n save: \"Save\",\n firstName: \"First name\",\n lastName: \"Last name\",\n nameRequired: \"Enter both a first and a last name.\",\n },\n password: {\n title: \"Change password\",\n current: \"Current password\",\n next: \"New password\",\n confirm: \"Confirm new password\",\n submit: \"Change password\",\n tooShort: \"The new password is too short.\",\n mismatch: \"The passwords don\u2019t match.\",\n // The siblings' sentence (emailChange, deleteAccount), under the current password.\n wrongPassword: \"The password is incorrect.\",\n },\n twoFactor: {\n status: \"Two-factor authentication\",\n enabledText: \"On\",\n disabledText: \"Off\",\n enable: \"Set up two-factor authentication\",\n scanHint: \"Scan this code with your authenticator app, then enter the code it shows.\",\n codeLabel: \"Verification code\",\n verify: \"Verify and turn on\",\n disableSection: \"Turn off two-factor authentication\",\n password: \"Current password\",\n disable: \"Turn off\",\n // Unchanged from the fallback it had before the namespace (i18n-labels.test pins it).\n qrAlt: \"QR code\",\n secretHint: \"Can\u2019t scan it? Enter this key in the app instead:\",\n copySecret: \"Copy key\",\n title: \"Two-factor authentication\",\n },\n passkeys: {\n title: \"Passkeys\",\n description: \"Sign in with your fingerprint, face or device PIN instead of a password.\",\n // Kurvenschmiede overrode `description` because \"instead of\" is false where the\n // password stays; this is the sentence for those apps, picked by `mode`.\n descriptionAlongside: \"Sign in with your fingerprint, face or device PIN. Your password keeps working too.\",\n empty: \"No passkeys yet\",\n loading: \"Loading passkeys\u2026\",\n list: \"Your passkeys\",\n nameLabel: \"Name (optional)\",\n namePlaceholder: \"e.g. Laptop, Phone\",\n add: \"Add passkey\",\n adding: \"Waiting for your device\u2026\",\n rename: \"Rename\",\n renameItem: (name) => `Rename ${name}`,\n renameField: (name) => `New name for ${name}`,\n save: \"Save\",\n cancel: \"Cancel\",\n delete: \"Delete\",\n deleteItem: (name) => `Delete ${name}`,\n deleteConfirm: (name) => `Delete \u201C${name}\u201D? It can no longer be used to sign in.`,\n confirmDelete: \"Delete passkey\",\n created: (date) => `Added ${date}`,\n lastUsed: (date) => `Last used ${date}`,\n neverUsed: \"Never used\",\n },\n};\n\n/**\n * One section of the namespace, resolved: English, then the provider's\n * `accountSettings.<section>`, then the component's own `labels` prop. An `undefined`\n * in either source is skipped, so a prop object built from optional values cannot\n * blank out a default.\n */\nexport function useAccountSettingsLabels<K extends keyof AccountSettingsLabels>(\n section: K,\n prop?: Partial<AccountSettingsLabels[K]>,\n): AccountSettingsLabels[K] {\n const fromProvider = useKitLabelOverrides(\"accountSettings\")?.[section] as\n | Partial<AccountSettingsLabels[K]>\n | undefined;\n return useMemo(\n () => ({\n ...DEFAULT_ACCOUNT_SETTINGS_LABELS[section],\n ...definedOnly(fromProvider),\n ...definedOnly(prop),\n }),\n [section, fromProvider, prop],\n );\n}\n\nfunction definedOnly<T extends object>(value: T | undefined): Partial<T> {\n if (!value) return {};\n return Object.fromEntries(Object.entries(value).filter(([, v]) => v !== undefined)) as Partial<T>;\n}\n", "// The English words of ./copy-button, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./copy-button re-exports them.\n\nimport type { CopyButtonLabels } from \"./copy-button\";\n\nexport const DEFAULT_COPY_BUTTON_LABELS: CopyButtonLabels = {\n copy: \"Copy\",\n copied: \"Copied\",\n failed: \"Couldn\u2019t copy\",\n copiedAnnouncement: \"Copied to clipboard\",\n failedAnnouncement: \"Couldn\u2019t copy to the clipboard\",\n};\n", "// The English words of ./bulk-action-bar, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./bulk-action-bar re-exports them.\n\nimport type { BulkActionBarLabels } from \"./bulk-action-bar\";\n\nexport const DEFAULT_BULK_ACTION_BAR_LABELS: BulkActionBarLabels = {\n selected: (count) => `${count} selected`,\n clear: \"Clear selection\",\n cleared: \"Selection cleared\",\n};\n", "// The English words of ./list, in a module with no component code: the English catalogue\n// (src/i18n/defaults.ts) imports them without the component, so `en` loads as one chunk\n// like the other languages (0.34, KS U8). ./list re-exports them.\n\nimport type { ListLabels } from \"./list\";\n\nexport const DEFAULT_LIST_LABELS: ListLabels = {\n unread: \"Unread\",\n opensInNewTab: \"opens in a new tab\",\n};\n", "// The English words of ./breadcrumbs, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./breadcrumbs re-exports them.\n\nimport type { BreadcrumbsLabels } from \"./breadcrumbs\";\n\nexport const DEFAULT_BREADCRUMBS_LABELS: BreadcrumbsLabels = {\n label: \"Breadcrumb\",\n showAll: \"Show full path\",\n};\n", "// The English words of ./toast, in a module with no component code: the English catalogue\n// (src/i18n/defaults.ts) imports them without the component, so `en` loads as one chunk\n// like the other languages (0.34, KS U8). ./toast re-exports them.\n\nimport type { ToastLabels } from \"./toast\";\n\nexport const DEFAULT_TOAST_LABELS: ToastLabels = {\n close: \"Close notification\",\n notifications: \"Notifications\",\n undo: \"Undo\",\n redo: \"Redo\",\n};\n", "// The English words of ./form-actions, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./form-actions re-exports them.\n\nimport type { FormActionsLabels } from \"./form-actions\";\n\nexport const DEFAULT_FORM_ACTIONS_LABELS: FormActionsLabels = {\n save: \"Save\",\n cancel: \"Cancel\",\n submitShortcut: (apple) => (apple ? \"\u2318 Enter\" : \"Ctrl+Enter\"),\n};\n", "// The English words of ./description-list, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./description-list re-exports them.\n\nimport type { DescriptionListLabels } from \"./description-list\";\n\nexport const DEFAULT_DESCRIPTION_LIST_LABELS: DescriptionListLabels = {\n empty: \"\u2014\",\n};\n", "// The English words of ./line-items, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./line-items re-exports them.\n\nimport type { LineItemsLabels } from \"./line-items\";\n\nexport const DEFAULT_LINE_ITEMS_LABELS: LineItemsLabels = {\n add: \"Add row\",\n remove: (row) => `Remove row ${row}`,\n confirmRemove: (row) => `Remove row ${row}? Press again to confirm`,\n row: (row) => `Row ${row}`,\n cell: (column, row) => `${column}, row ${row}`,\n totals: \"Total\",\n};\n", "// The English words of ./progress-bar, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./progress-bar re-exports them.\n\nimport type { ProgressBarLabels } from \"./progress-bar\";\n\nexport const DEFAULT_PROGRESS_BAR_LABELS: ProgressBarLabels = {\n unlimited: \"Unlimited\",\n overLimit: (amount) => `${amount} over the limit`,\n};\n", "// The English words of ./signed-amount, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./signed-amount re-exports them.\n\nimport type { SignedAmountLabels } from \"./signed-amount\";\n\nexport const DEFAULT_SIGNED_AMOUNT_LABELS: SignedAmountLabels = {\n positive: (amount) => `plus ${amount}`,\n negative: (amount) => `minus ${amount}`,\n};\n", "// The English words of ./error-boundary, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./error-boundary re-exports them.\n\nimport type { ErrorBoundaryLabels } from \"./error-boundary\";\n\nexport const DEFAULT_ERROR_BOUNDARY_LABELS: ErrorBoundaryLabels = {\n title: \"Something went wrong\",\n message: \"This part of the page could not be shown. Try again, or reload the page.\",\n retry: \"Try again\",\n details: \"Error details\",\n reload: \"Reload\",\n updateTitle: \"A new version is available\",\n updateMessage: \"Part of the app has changed since this page was loaded. Reload to get the new version.\",\n offlineTitle: \"You\u2019re offline\",\n offlineMessage: \"This page could not be loaded without a connection. Reconnect, then reload the page.\",\n copyReport: \"Copy error report\",\n reported: \"This error has been reported automatically.\",\n reportedAs: (reference) => `Reported as ${reference}`,\n};\n", "// The English words of ./authed-image, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./authed-image re-exports them.\n\nimport type { AuthedImageLabels } from \"./authed-image\";\n\nexport const DEFAULT_AUTHED_IMAGE_LABELS: AuthedImageLabels = {\n loading: \"Loading image\u2026\",\n loadError: \"Image couldn\u2019t be loaded\",\n failedImage: (alt) => `${alt}: image couldn\u2019t be loaded`,\n};\n", "// The English words of ./image-grid, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./image-grid re-exports them.\n\nimport type { ImageGridLabels } from \"./image-grid\";\n\nexport const DEFAULT_IMAGE_GRID_LABELS: ImageGridLabels = {\n list: \"Images\",\n item: (index, count) => `Image ${index} of ${count}`,\n actions: (name) => `Actions for ${name}`,\n};\n", "// The English words of ./lightbox, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./lightbox re-exports them.\n\nimport type { LightboxLabels } from \"./lightbox\";\n\nexport const DEFAULT_LIGHTBOX_LABELS: LightboxLabels = {\n dialog: \"Image viewer\",\n close: \"Close\",\n previous: \"Previous image\",\n next: \"Next image\",\n counter: (index, count) => `${index} / ${count}`,\n position: (index, count) => `Image ${index} of ${count}`,\n download: \"Download\",\n zoom: \"Zoom\",\n noPreview: \"No preview available for this file\",\n openInNewTab: \"Open in new tab\",\n};\n", "// The English words of ./write-lock, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./write-lock re-exports them.\n\nimport type { WriteLockLabels } from \"./write-lock\";\n\nexport const DEFAULT_WRITE_LOCK_LABELS: WriteLockLabels = {\n reason: \"You can view this but not change it.\",\n offline: \"Needs a connection.\",\n};\n", "// The English words of ./legal, in a module with no component code: the English catalogue\n// (src/i18n/defaults.ts) imports them without the component, so `en` loads as one chunk\n// like the other languages (0.34, KS U8). ./legal re-exports them.\n\nimport type { LegalLabels } from \"./legal\";\n\nexport const DEFAULT_LEGAL_LABELS: LegalLabels = {\n navLabel: \"Legal\",\n links: {\n impressum: \"Imprint\",\n privacy: \"Privacy Policy\",\n terms: \"Terms\",\n },\n titles: {\n impressum: \"Imprint\",\n privacy: \"Privacy Policy\",\n terms: \"Terms of Service\",\n },\n backHome: \"Back to home\",\n accept: \"I accept the {terms} and the {privacy}\",\n notice: {\n beta: \"Closed beta. These texts have not been reviewed by a lawyer yet and will be before a public launch.\",\n privacy:\n \"Closed beta. The legal wording below has not been reviewed by a lawyer yet and will be before a public launch. The technical descriptions \u2014 what is stored, where, and who can read it \u2014 describe what the software actually does today, and are meant to be checked against it.\",\n },\n translation: {\n note: (o) =>\n `This is a translation for your convenience. The ${o.bindingLanguage} version is binding.`,\n show: (o) => `Show the ${o.bindingLanguage} version`,\n },\n sections: {\n impressum: {\n operator: {\n title: \"Operator\",\n body: (o) =>\n `${o.name}\\n${o.postalCode} ${o.city}\\n${o.country}\\n\\nThe full postal address is supplied on request to anyone with a legitimate legal interest; write to the contact address below.`,\n },\n contact: {\n title: \"Contact\",\n body: (o) => `Email: ${o.email}`,\n },\n disclaimer: {\n title: \"Liability for content and links\",\n body: \"This is a private, non-commercial project offered during a closed beta, without warranty. External sites we link to are the responsibility of their respective operators; we have no control over their content.\",\n commercial:\n \"This is a commercial service. Paid plans are sold by our reseller, which acts as the Merchant of Record: it sells the subscription in its own name, takes the payment, issues the invoice and handles VAT, and its terms of sale apply to the purchase. We take care that the content of this service is accurate, but cannot guarantee that it is complete or up to date. External sites we link to are the responsibility of their respective operators; we have no control over their content.\",\n },\n },\n privacy: {\n controller: {\n title: \"Controller\",\n body: (o) =>\n `The party responsible for processing personal data in this service is:\\n${o.name}\\n${o.postalCode} ${o.city}, ${o.country}\\nEmail: ${o.email}\\n\\nThe full postal address is supplied on request to data subjects and supervisory authorities.`,\n },\n legal_basis: {\n title: \"Legal basis\",\n body: \"As the operator is based in Switzerland, processing is governed by the Swiss Federal Act on Data Protection (FADP). Where the EU General Data Protection Regulation (GDPR) applies to you, we rely on the performance of a contract to provide the service (Art. 6(1)(b) GDPR) and our legitimate interest in operating and securing it (Art. 6(1)(f) GDPR).\",\n },\n browser: {\n title: \"What your browser stores\",\n lead: \"No cookies. The app keeps the following in your browser's storage:\",\n tail: \"None of it is used to track you. Entries waiting to be sent are sent to us as soon as they can be; everything else stays on your device. All of it disappears when you clear the site's data, and signing out removes the sign-in tokens.\",\n },\n rights: {\n title: \"Your rights\",\n lead: \"You have the right to access, rectification, erasure, restriction, data portability and objection.\",\n tail: \"If you are in Switzerland you may contact the Federal Data Protection and Information Commissioner (FDPIC); if you are in the EU you may lodge a complaint with your local supervisory authority.\",\n },\n contact: {\n title: \"Contact for data protection\",\n body: (o) => `For any privacy request, contact: ${o.email}`,\n },\n },\n terms: {\n warranty: {\n title: \"No warranty\",\n body: 'The service is provided \"as is\" and \"as available\", without warranties of any kind to the extent permitted by law. As a beta it may contain errors, change, or be interrupted at any time \u2014 keep your own backups of important data.',\n },\n liability: {\n title: \"Limitation of liability\",\n body: \"To the extent permitted by applicable law, the operator is not liable for any indirect or consequential damage arising from the use of, or inability to use, the service. Nothing here limits liability that cannot be limited by law.\",\n },\n changes: {\n title: \"Changes to these terms\",\n body: \"These terms may be updated as the service evolves. Material changes will be announced by email or in the app; continued use after a change means you accept it.\",\n },\n language: {\n title: \"Language\",\n body: (o) =>\n `These terms are written in ${o.bindingLanguage}. Translations into other languages are provided for convenience only; where a translation differs, the ${o.bindingLanguage} version prevails.`,\n },\n law: {\n title: \"Governing law\",\n body: (o) =>\n `These terms are governed by Swiss law, excluding its conflict-of-laws rules. As far as legally permissible, the place of jurisdiction is ${o.city} (${o.region}), ${o.country}.`,\n },\n },\n },\n};\n", "/**\n * The coded refusals of sign-in and sign-up (docs/auth-harmonization.md \u00A75.2): every\n * refusal the auth routes answer carries a machine-readable `code`, and the pages\n * recognise the CODE, never the server's sentence.\n *\n * Today each app's pages print the server's `detail` string (keksdose's\n * `extractApiErrorMessage`), which is English on every locale and, on a credential\n * check, would be an account-enumeration oracle if it ever said more than one thing.\n * keksdose already keys one refusal on a code (`features/budgets/plan-limit.ts`,\n * `402 {detail, code: \"plan_budget_limit\"}`); \u00A75.2 makes that the rule for auth. Each\n * app switches its server and its pages together (\u00A79).\n *\n * - `invalid_credentials` \u2014 unknown address, wrong password AND deactivated account:\n * one answer, in the same time (\u00A72.10). `401`.\n * - `registration_closed` \u2014 the sign-up gate refused the address. `403`.\n * - `email_taken` \u2014 an account with this address exists. `409`.\n * - `invitation_invalid`, `invitation_expired` \u2014 the `invite` token of a sign-up or an\n * accept (\u00A74.4).\n * - `token_invalid` \u2014 a one-time token (reset, verification, a sign-in challenge) is\n * unknown, spent or expired.\n * - `account_inactive` \u2014 **no server answers it.** \u00A72.10 decided that a deactivated\n * account gets `invalid_credentials`, because a separate answer after a correct\n * password would confirm a leaked one. It stays in the union only for a future server\n * step that is past the password (an admin view, a signed-in refresh) and may say so.\n * - `session_ended` \u2014 0.34.0 (\u00A711.2, decision 7; server-kit 0.8): every definitive\n * refusal of `POST /auth/refresh`, a `401`. No form shows it, so it has no label: the\n * kit's `attachSessionRefresh` decides by the STATUS, so an app whose server has not\n * switched yet keeps working.\n */\nexport type AuthErrorCode =\n | \"invalid_credentials\"\n | \"registration_closed\"\n | \"email_taken\"\n | \"invitation_invalid\"\n | \"invitation_expired\"\n | \"token_invalid\"\n /** 0.30.0: a link that WAS valid and ran out (verification, reset) \u2014 keksdose's step-3\n * refusals tell it from `token_invalid`, so a page can say \"expired, ask for a new one\". */\n | \"token_expired\"\n | \"account_inactive\"\n | \"session_ended\";\n\n/**\n * 0.30.0: the coded refusals of user administration and the account's own settings\n * (docs/user-admin-harmonization.md \u00A74, \u00A76) \u2014 server-kit 0.4.0's `AccountErrorCode`,\n * value for value. The same family of answer as the sign-in codes (`{detail, code}`,\n * plus `companies` on kastlan's `last_admin`), read by the same {@link authErrorCode}.\n *\n * - `last_admin` \u2014 the action would leave no active admin: deactivating, demoting or\n * deleting the last one (in kastlan, of a company; the answer names the `companies`).\n * - `self_action` \u2014 an admin acting on their own account where that is never allowed.\n * - `other_companies` \u2014 kastlan: the account belongs to other companies too, so a\n * company admin may not deactivate it; \"Remove from company\" instead (\u00A79.6).\n * - `household_has_members` \u2014 keksdose's guard on a deletion request (\u00A76.4).\n * - `confirmation_required`, `confirmation_mismatch` \u2014 the action's confirmation level\n * asked for a typed address (or a tick), and the request carried none, or another\n * address (\u00A74.2).\n * - `password_incorrect` \u2014 the CURRENT password is wrong on a signed-in route (the email\n * change, the deletion request). `400`, not `401`: an app's client reads a 401 as an\n * ended session and signs the user out, the wrong answer to a typo. Every other one\n * is a `409`.\n */\nexport type AccountErrorCode =\n | \"last_admin\"\n | \"self_action\"\n | \"other_companies\"\n | \"household_has_members\"\n | \"confirmation_required\"\n | \"confirmation_mismatch\"\n | \"password_incorrect\";\n\n/**\n * 0.31.0: the demo's coded refusals (docs/landing-demo-harmonization.md \u00A76.2) \u2014\n * server-kit 0.5's `DemoErrorCode`, value for value, answered as `{detail, code}` like\n * the others and read by the same {@link authErrorCode}.\n *\n * - `demo_disabled` \u2014 `404`: the demo switch is off (it is \"not there\", not forbidden).\n * - `demo_rate_limited` \u2014 `429` with `Retry-After`: the per-IP window of demo starts.\n * - `demo_capacity` \u2014 `429`, no `Retry-After`: the cap of live demo users.\n * - `demo_not_ready` \u2014 `503`: the demo data has not been seeded yet.\n * - `demo_read_only` \u2014 `403`, model R: any write by a demo user. The app's write lock\n * already explains it, so it shows no toast (\u00A75.4).\n * - `demo_refused` \u2014 `403`, both models: an action a demo never may \u2014 a way in or out,\n * mail, uploads, the account export (\u00A76.4).\n */\nexport type DemoErrorCode =\n | \"demo_disabled\"\n | \"demo_rate_limited\"\n | \"demo_capacity\"\n | \"demo_not_ready\"\n | \"demo_read_only\"\n | \"demo_refused\";\n\n/**\n * 0.32.0: billing's coded refusals (docs/billing-harmonization.md \u00A73.3, \u00A73.4, \u00A74, \u00A712.3) \u2014\n * server-kit 0.6's `BillingError` and `PlanLimitError`, value for value, answered as\n * `{detail, code}` like the others and read by the same {@link authErrorCode}.\n *\n * - `billing_disabled` \u2014 `404`: the billing switch is off (\u00A72.9), so every billing route\n * but `GET /billing/status` is \"not there\", as a switched-off demo is.\n * - `billing_read_only` \u2014 `402`: a write by (or into the data of) a payer out of good\n * standing (\u00A73.3, \u00A712.1). Inside a sync reply it marks the changes that were refused\n * and not applied (\u00A712.5). The app's write lock and banner already say why, so \u2014 like\n * `demo_read_only` \u2014 it needs no toast of its own.\n * - `plan_limit` \u2014 `402`: a create past the plan's limit (\u00A73.4), with the extra fields\n * `dimension`, `plan`, `limit` and `used` \u2014 read them with `isPlanLimit`. A lapsed payer\n * creating gets `billing_read_only` instead, never this (\u00A712.3).\n * - `billing_not_configured` \u2014 billing is switched on but the provider's settings are\n * missing (the secrets, a price id): the operator's mistake, not the payer's.\n *\n * 0.33.0 (server-kit 0.7, \u00A714.2): the provider's refusals, with the `billing_` prefix of\n * the others (decision 22).\n * - `billing_provider_unavailable` \u2014 `502`: Paddle didn't answer, or refused the request.\n * Try again.\n * - `billing_not_at_provider` \u2014 `409`: a portal request before the payer reached the\n * provider (\u00A714.5) \u2014 a stale page; the overview's `at_provider` says it first.\n * - `billing_already_subscribed` \u2014 `409`: a checkout while a provider subscription runs\n * (\u00A714.6). Since 0.39 plan changes go through the plan switch (\u00A715.2.10).\n * - `billing_plan_not_sold` \u2014 `422`: a checkout for a plan, currency or interval the\n * catalogue doesn't sell \u2014 or (0.39) a switch to one.\n *\n * 0.39.0 (server-kit 0.12, \u00A715.2.10): the plan switch's refusals.\n * - `billing_not_subscribed` \u2014 `409`: a switch with no running provider subscription;\n * the page offers the checkout instead.\n * - `billing_plan_unchanged` \u2014 `409`: a switch to the price the payer pays now.\n */\nexport type BillingErrorCode =\n | \"billing_disabled\"\n | \"billing_read_only\"\n | \"plan_limit\"\n | \"billing_not_configured\"\n | \"billing_provider_unavailable\"\n | \"billing_not_at_provider\"\n | \"billing_already_subscribed\"\n | \"billing_plan_not_sold\"\n | \"billing_not_subscribed\"\n | \"billing_plan_unchanged\";\n\n/** Every code the kit reads: the sign-in refusals, the account ones (0.30.0), the demo's\n * (0.31.0) and billing's (0.32.0). */\nexport type KitErrorCode = AuthErrorCode | AccountErrorCode | DemoErrorCode | BillingErrorCode;\n\nconst BILLING_CODES: ReadonlySet<BillingErrorCode> = new Set<BillingErrorCode>([\n \"billing_disabled\",\n \"billing_read_only\",\n \"plan_limit\",\n \"billing_not_configured\",\n \"billing_provider_unavailable\",\n \"billing_not_at_provider\",\n \"billing_already_subscribed\",\n \"billing_plan_not_sold\",\n \"billing_not_subscribed\",\n \"billing_plan_unchanged\",\n]);\n\nconst CODES: ReadonlySet<string> = new Set<KitErrorCode>([\n \"invalid_credentials\",\n \"registration_closed\",\n \"email_taken\",\n \"invitation_invalid\",\n \"invitation_expired\",\n \"token_invalid\",\n \"token_expired\",\n \"account_inactive\",\n \"session_ended\",\n \"last_admin\",\n \"self_action\",\n \"other_companies\",\n \"household_has_members\",\n \"confirmation_required\",\n \"confirmation_mismatch\",\n \"password_incorrect\",\n \"demo_disabled\",\n \"demo_rate_limited\",\n \"demo_capacity\",\n \"demo_not_ready\",\n \"demo_read_only\",\n \"demo_refused\",\n ...BILLING_CODES,\n]);\n\ntype Bag = Record<string, unknown>;\n\nconst isBag = (value: unknown): value is Bag => typeof value === \"object\" && value !== null;\n\n/** A known code, or undefined. */\nfunction known(value: unknown): KitErrorCode | undefined {\n return typeof value === \"string\" && CODES.has(value) ? (value as KitErrorCode) : undefined;\n}\n\n/** `{code}` on a parsed body, or FastAPI's `{detail: {code}}` \u2014 what an\n * `HTTPException(detail={\"code\": \u2026})` serialises to. */\nfunction codeOfBody(body: unknown): KitErrorCode | undefined {\n if (!isBag(body)) return undefined;\n return known(body.code) ?? (isBag(body.detail) ? known(body.detail.code) : undefined);\n}\n\n/**\n * The code an error carries \u2014 an {@link AuthErrorCode}, since 0.30.0 an\n * {@link AccountErrorCode}, since 0.31.0 a {@link DemoErrorCode}, since 0.32.0 a\n * {@link BillingErrorCode} \u2014 or `undefined` when it carries none.\n *\n * Reads the parsed response body wherever the apps' HTTP clients put it, without\n * depending on any of them:\n *\n * 1. `err.response.data` \u2014 axios (keksdose's, kastlan's and Kurvenschmiede's clients;\n * keksdose's `isPlanBudgetLimitRefusal` reads the same path);\n * 2. `err.data` \u2014 ofetch's `FetchError`, and most `fetch` wrappers that parse the body;\n * 3. `err.body` \u2014 the generated OpenAPI clients' `ApiError`;\n * 4. `err` itself \u2014 a body thrown as it came (`throw await res.json()`).\n *\n * In each, `code` or FastAPI's nested `detail.code`. Last, `err.code` \u2014 but only when\n * it is one of the codes above: axios writes its OWN codes there (`ERR_NETWORK`,\n * `ECONNABORTED`, `ERR_BAD_REQUEST`), and so does Node, so an unknown value is never\n * read as a refusal. The HTTP status is not checked: the code is the contract, and the\n * status differs per refusal (401, 402, 403, 404, 409, 410).\n */\nexport function authErrorCode(err: unknown): KitErrorCode | undefined {\n if (!isBag(err)) return undefined;\n const response = err.response;\n return (\n (isBag(response) ? codeOfBody(response.data) : undefined) ??\n codeOfBody(err.data) ??\n codeOfBody(err.body) ??\n codeOfBody(err)\n );\n}\n\n/**\n * Whether `err` is a coded auth refusal \u2014 any of them, or the one named:\n *\n * ```ts\n * try { await api.register(values) }\n * catch (err) { if (isAuthError(err, \"email_taken\")) \u2026 }\n * ```\n *\n * The kit's `SignInForm` and `RegisterForm` call it on what their callbacks reject\n * with, so an app's `onSubmit` can simply let its client's error through. See\n * {@link authErrorCode} for the shapes it reads. Since 0.30.0 it knows the account codes\n * too: `isAuthError(err, \"last_admin\")`; since 0.31.0 the demo's:\n * `isAuthError(err, \"demo_read_only\")`; since 0.32.0 billing's:\n * `isAuthError(err, \"billing_read_only\")` (or {@link isBillingError}).\n */\nexport function isAuthError(err: unknown, code?: KitErrorCode): boolean {\n const found = authErrorCode(err);\n return found !== undefined && (code === undefined || found === code);\n}\n\n/**\n * Whether `err` is one of billing's coded refusals (0.32.0, docs/billing-harmonization.md\n * \u00A710, \u00A714.2) \u2014 any of them, or the one named. {@link isAuthError} answers the same for a\n * named code; this one also answers \"is it billing's at all\", which an app's error\n * handler asks before it decides between the write lock, a `PlanLimitNotice` and a toast.\n */\nexport function isBillingError(err: unknown, code?: BillingErrorCode): boolean {\n const found = authErrorCode(err);\n return found !== undefined && BILLING_CODES.has(found as BillingErrorCode) && (code === undefined || found === code);\n}\n\n/**\n * The parsed body that carries a code, wherever {@link authErrorCode} would find it (in\n * the same order) \u2014 the object with the `code`, so FastAPI's nested `detail` when the code\n * is there. For a reader of a refusal's EXTRA fields (`isPlanLimit`: `dimension`, `limit`,\n * `used` sit beside the code). `accept` decides which codes count; default, the known ones.\n *\n * @internal Not part of the barrel.\n */\nexport function errorBodyWithCode(\n err: unknown,\n accept: (code: unknown) => boolean = (code) => known(code) !== undefined,\n): Record<string, unknown> | undefined {\n if (!isBag(err)) return undefined;\n const response = err.response;\n for (const body of [isBag(response) ? response.data : undefined, err.data, err.body, err]) {\n if (!isBag(body)) continue;\n if (accept(body.code)) return body;\n if (isBag(body.detail) && accept(body.detail.code)) return body.detail;\n }\n return undefined;\n}\n\n/** An HTTP status as a number, or undefined. */\nfunction statusOf(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isInteger(value) ? value : undefined;\n}\n\n/**\n * The HTTP status a thrown error carries, wherever the apps' HTTP clients put it \u2014\n * without depending on any of them:\n *\n * 1. `err.response.status` \u2014 axios (all three apps' clients);\n * 2. `err.status` \u2014 ofetch's `FetchError`, the generated OpenAPI clients' `ApiError`, and\n * a `Response` thrown as it came;\n * 3. `err.statusCode` \u2014 ofetch's alias, and Node-style errors.\n *\n * `undefined` when none is a whole number. Package-private \u2014 not re-exported from the\n * barrel; {@link isRateLimited} and the session refresh's classifier read it (DUP-11,\n * refactor audit 2026-10: the refresh carried its own copy of this probe).\n */\nexport function httpStatusOf(err: unknown): number | undefined {\n if (!isBag(err)) return undefined;\n const response = err.response;\n return (isBag(response) ? statusOf(response.status) : undefined) ?? statusOf(err.status) ?? statusOf(err.statusCode);\n}\n\n/**\n * Whether `err` is a throttled request \u2014 HTTP `429 Too Many Requests` (0.30.0, from the\n * apps' 0.29 adoption: every app answered a throttled sign-in, sign-up or reset through\n * its own `describeError`, with three wordings of one sentence).\n *\n * A throttle carries no `code` in the contract \u2014 the STATUS is the answer, set by the\n * apps' limiters (server-kit's `AuthLimiters`, keksdose's per-IP limit) \u2014 so this reads\n * the status, wherever the apps' HTTP clients put it ({@link httpStatusOf}).\n *\n * There is no `rate_limited` code: keksdose answers its 429s uncoded, with a\n * `Retry-After` header, and the status is the one signal every limiter gives.\n *\n * The kit's `SignInForm`, `RegisterForm`, `ForgotPasswordForm` and `ResetPasswordForm`\n * call it AFTER the app's `describeError` \u2014 an app with words of its own keeps them \u2014\n * and before their generic failure, so \"Too many attempts. Try again in 30 s.\" (with\n * {@link retryAfterSeconds}) or \"\u2026 Wait a moment and try again.\" needs no app code.\n */\nexport function isRateLimited(err: unknown): boolean {\n return httpStatusOf(err) === 429;\n}\n\n/** A header's value from a `Headers` (fetch, ofetch's `response`), axios' `AxiosHeaders`\n * or a plain record \u2014 whose keys may come in any case. */\nfunction headerOf(headers: unknown, name: string): unknown {\n if (!isBag(headers)) return undefined;\n if (typeof headers.get === \"function\") {\n try {\n const value: unknown = (headers.get as (key: string) => unknown).call(headers, name);\n if (value !== undefined && value !== null) return value;\n } catch {\n // A `get` that is not a header lookup; the record below is.\n }\n }\n for (const [key, value] of Object.entries(headers)) {\n if (key.toLowerCase() === name) return value;\n }\n return undefined;\n}\n\n/** `Retry-After` as seconds from `now`: delta-seconds (\"30\"), or an HTTP date\n * (\"Wed, 07 Oct 2026 10:00:00 GMT\") counted from now, never below 0 (RFC 9110 \u00A710.2.3). */\nfunction parseRetryAfter(value: unknown, now: number): number | undefined {\n const raw = Array.isArray(value) ? (value as unknown[])[0] : value;\n if (typeof raw === \"number\") return Number.isFinite(raw) && raw >= 0 ? Math.ceil(raw) : undefined;\n if (typeof raw !== \"string\") return undefined;\n const text = raw.trim();\n if (/^\\d+$/.test(text)) return Number(text);\n // An HTTP date names its day and month (\"Wed, 07 Oct 2026 \u2026\"). Without a letter it is\n // a malformed number (\"-5\", \"1.5\"), which `Date.parse` would happily read as a year.\n if (!/[a-z]/i.test(text)) return undefined;\n const at = Date.parse(text);\n if (Number.isNaN(at)) return undefined;\n return Math.max(0, Math.ceil((at - now) / 1000));\n}\n\n/**\n * How long a throttled request asks to wait, in whole seconds \u2014 its `Retry-After`\n * header (0.30.0, keksdose: its 429s carry no code, only the header) \u2014 or `undefined`\n * when there is none, or none that parses.\n *\n * Read where the apps' clients keep the response headers, without depending on any of\n * them: `err.response.headers` (axios' `AxiosHeaders` or a plain record; ofetch's\n * `FetchError.response`, a fetch `Headers`), then `err.headers` (a `Response` thrown as\n * it came). The value is delta-seconds, or an HTTP date turned into seconds from `now`\n * (default: the present moment) \u2014 never below 0.\n *\n * The forms hand it to their `rateLimited` label when {@link isRateLimited} is true:\n * \"Too many attempts. Try again in 30 s.\" \u2014 and, without one, \"\u2026 Wait a moment and try\n * again.\" A browser only exposes `Retry-After` to a cross-origin page when the server\n * lists it in `Access-Control-Expose-Headers`.\n */\nexport function retryAfterSeconds(err: unknown, now: number | Date = Date.now()): number | undefined {\n if (!isBag(err)) return undefined;\n const at = typeof now === \"number\" ? now : now.getTime();\n const response = err.response;\n const value =\n (isBag(response) ? headerOf(response.headers, \"retry-after\") : undefined) ?? headerOf(err.headers, \"retry-after\");\n return value === undefined ? undefined : parseRetryAfter(value, at);\n}\n\n/**\n * The English of every `rateLimited` label (0.30.0): \"Too many attempts. Try again in\n * 30 s.\" with a wait under a minute, in whole minutes from one minute up (keksdose's\n * reset throttle answers in hours, and \"3600 s\" is a number nobody reads), and \"Wait a\n * moment and try again.\" without one \u2014 or with a `0`.\n *\n * @internal The namespaces' English; not part of the barrel.\n */\nexport function englishRateLimited(seconds?: number): string {\n if (!seconds || seconds <= 0) return \"Too many attempts. Wait a moment and try again.\";\n return `Too many attempts. Try again in ${englishWait(seconds)}.`;\n}\n\n/** \"30 s\", \"2 min\" \u2014 a wait in English, rounded up. @internal */\nexport function englishWait(seconds: number): string {\n return seconds < 60 ? `${Math.ceil(seconds)} s` : `${Math.ceil(seconds / 60)} min`;\n}\n", "// The English words of ./sign-in-form, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./sign-in-form re-exports them.\n\nimport { englishRateLimited } from \"./auth-errors\";\nimport type { SignInLabels } from \"./sign-in-form\";\n\n/** `Required`: every key, the 0.30 ones included, has its English here. */\nexport const DEFAULT_SIGN_IN_LABELS: Required<SignInLabels> = {\n email: \"Email\",\n password: \"Password\",\n submit: \"Sign in\",\n passkey: \"Sign in with a passkey\",\n forgotPassword: \"Forgot your password?\",\n noAccount: \"No account yet?\",\n register: \"Create account\",\n invalidCredentials: \"The email or password is incorrect.\",\n failed: \"Sign-in failed. Please try again.\",\n passkeyFailed: \"Passkey sign-in failed.\",\n deactivatedHint: \"Account deactivated? Write to {contact}.\",\n tagHint: (taggedAddress) => `Signed up with ${taggedAddress}? Use that address.`,\n twoFactorTitle: \"Two-factor authentication\",\n twoFactorIntro: \"Enter the code your authenticator app shows.\",\n code: \"2FA code\",\n verify: \"Verify\",\n codeInvalid: \"Invalid 2FA code.\",\n setPasswordTitle: \"Choose a new password\",\n setPasswordIntro: \"A new password was requested for this account. Choose one and you are straight back in.\",\n newPassword: \"New password\",\n confirmPassword: \"Repeat new password\",\n passwordMismatch: \"The passwords don't match.\",\n setPasswordSubmit: \"Set password and sign in\",\n setPasswordFailed: \"The password could not be set.\",\n expired: \"This sign-in has expired. Please sign in again.\",\n backToSignIn: \"Back to sign in\",\n useRecoveryCode: \"Use a backup code\",\n useAuthenticatorCode: \"Use your authenticator app\",\n recoveryCode: \"Backup code\",\n recoveryIntro: \"Enter one of the backup codes you saved when you turned on two-factor authentication.\",\n recoveryCodeHint: (length) => `${length} letters and digits. Dashes and spaces don\u2019t matter.`,\n recoveryCodeInvalid: \"This backup code is not valid, or it has been used already.\",\n rateLimited: englishRateLimited,\n requestAccess: \"Request access\",\n};\n", "// The English words of ./register-form, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./register-form re-exports them.\n\nimport { englishRateLimited } from \"./auth-errors\";\nimport type { RegisterLabels } from \"./register-form\";\n\n/** `Required`: every key, the 0.30 one included, has its English here. */\nexport const DEFAULT_REGISTER_LABELS: Required<RegisterLabels> = {\n firstName: \"First name\",\n lastName: \"Last name\",\n email: \"Email\",\n emailTagUse: (address) => `Use ${address}`,\n emailTagHint:\n \"Many providers deliver name+tag@\u2026 to the same inbox, so mail from this app is easy to filter and trace. Check yours does before you rely on it: you would sign in with the tagged address.\",\n invitedEmailHint: \"The address your invitation was sent to.\",\n invitedTagNote: \"The tagged address gets a confirmation mail of its own.\",\n password: \"Password\",\n confirmPassword: \"Repeat password\",\n passwordMismatch: \"The passwords don't match.\",\n language: \"Language\",\n submit: \"Create account\",\n haveAccount: \"Already have an account?\",\n signIn: \"Sign in\",\n emailTaken: \"An account with this email address already exists.\",\n registrationClosed: \"New accounts are by invitation only. Ask the operator to invite your email address.\",\n invitationInvalid: \"This invitation link is not valid.\",\n invitationExpired: \"This invitation has expired. Ask for a new one.\",\n failed: \"Registration failed. Please try again.\",\n rateLimited: englishRateLimited,\n};\n", "// The English words of ./complete-name-dialog, in a module with no component code: the\n// English catalogue (src/i18n/defaults.ts) imports them without the component, so `en`\n// loads as one chunk like the other languages (0.34, KS U8). ./complete-name-dialog\n// re-exports them.\n\nimport type { CompleteNameLabels } from \"./complete-name-dialog\";\n\nexport const DEFAULT_COMPLETE_NAME_LABELS: CompleteNameLabels = {\n title: \"Complete your name\",\n description: \"First and last name are now asked for separately. Check what is filled in and add what is missing.\",\n firstName: \"First name\",\n lastName: \"Last name\",\n save: \"Save\",\n later: \"Later\",\n failed: \"Your name could not be saved. Please try again.\",\n};\n", "// The English words of ./forgot-password-form, in a module with no component code: the\n// English catalogue (src/i18n/defaults.ts) imports them without the component, so `en`\n// loads as one chunk like the other languages (0.34, KS U8). ./forgot-password-form\n// re-exports them.\n\nimport { englishRateLimited } from \"./auth-errors\";\nimport type { ForgotPasswordLabels } from \"./forgot-password-form\";\n\n/** `Required`: every key, the 0.30 one included, has its English here. */\nexport const DEFAULT_FORGOT_PASSWORD_LABELS: Required<ForgotPasswordLabels> = {\n title: \"Forgot password\",\n intro: \"Enter your account\u2019s email address. We\u2019ll send you a link to choose a new password.\",\n email: \"Email\",\n submit: \"Send the link\",\n sent: (email) => `If an account exists for ${email}, the link is on its way.`,\n sentHint: \"The link is valid for one hour and works exactly once. Check your spam folder too.\",\n backToSignIn: \"Back to sign in\",\n error: \"The request failed. Please try again later.\",\n rateLimited: englishRateLimited,\n};\n", "// The English words of ./reset-password-form, in a module with no component code: the\n// English catalogue (src/i18n/defaults.ts) imports them without the component, so `en`\n// loads as one chunk like the other languages (0.34, KS U8). ./reset-password-form\n// re-exports them.\n\nimport { englishRateLimited } from \"./auth-errors\";\nimport type { ResetPasswordLabels } from \"./reset-password-form\";\n\n/** `Required`: every key, the 0.30 one included, has its English here. */\nexport const DEFAULT_RESET_PASSWORD_LABELS: Required<ResetPasswordLabels> = {\n title: \"Choose a new password\",\n checking: \"Checking the link\u2026\",\n intro: (email) => `You\u2019re setting a new password for ${email}.`,\n newPassword: \"New password\",\n confirmPassword: \"Repeat new password\",\n mismatch: \"The passwords don\u2019t match.\",\n submit: \"Save password\",\n failed: \"The password could not be changed.\",\n noToken: \"This link is incomplete.\",\n invalid: \"This link is invalid or has expired.\",\n invalidHint: \"Links are valid for one hour and work only once. Just request a new one.\",\n requestNew: \"Request a new link\",\n success: \"Your password has been changed. You can sign in with it now.\",\n sessionsEnded: \"Signed-in devices were signed out \u2014 you\u2019ll need to sign in again there.\",\n signIn: \"Go to sign in\",\n rateLimited: englishRateLimited,\n};\n", "// The English words of ./verify-email, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./verify-email re-exports them.\n\nimport { englishRateLimited } from \"./auth-errors\";\nimport type { VerifyEmailLabels } from \"./verify-email\";\n\nexport const DEFAULT_VERIFY_EMAIL_LABELS: VerifyEmailLabels = {\n title: \"Confirm your email address\",\n verifying: \"Confirming\u2026\",\n verified: \"Your email address is confirmed.\",\n continue: \"Continue\",\n invalid: \"This confirmation link is not valid\",\n expired: \"This confirmation link has expired\",\n noToken: \"This link is missing its confirmation token.\",\n invalidHint: \"The link may have expired or already been used.\",\n requestInApp: \"You can request a new one from inside the app.\",\n requestHere: \"You can request a new one here.\",\n resend: \"Send again\",\n resendIn: (seconds) => `Send again in ${seconds} s`,\n resent: \"Confirmation email sent\",\n resendError: \"Could not send the confirmation email\",\n rateLimited: englishRateLimited,\n banner: \"Please confirm your email address.\",\n dismiss: \"Not now\",\n};\n", "// The English words of ./not-found-page, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./not-found-page re-exports them.\n\nimport type { NotFoundLabels } from \"./not-found-page\";\n\nexport const DEFAULT_NOT_FOUND_LABELS: NotFoundLabels = {\n title: \"Page not found\",\n body: \"This address doesn\u2019t exist (any more). It may be a typo, or the page has moved.\",\n home: \"Go to the start page\",\n app: \"Back to the app\",\n};\n", "// The English words of ./accept-invitation, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./accept-invitation re-exports them.\n\nimport type { AcceptInvitationLabels } from \"./accept-invitation\";\n\nexport const DEFAULT_ACCEPT_INVITATION_LABELS: AcceptInvitationLabels = {\n title: \"Accept invitation\",\n accepting: \"Joining\u2026\",\n accepted: \"Invitation accepted.\",\n joined: (name) => `You\u2019ve joined ${name}.`,\n continue: \"Continue\",\n invalid: \"Could not join with this link\",\n expired: \"This invitation has expired\",\n noToken: \"This link is missing its invite token.\",\n askAgain: \"Ask the person who invited you to send a new invitation.\",\n signInFirst: \"Sign in to accept this invitation\",\n signInHint: \"Use the account the invitation was sent to.\",\n signIn: \"Sign in\",\n register: \"Create account\",\n};\n", "// The English words of ./company-switcher, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./company-switcher re-exports them.\n\nimport type { CompanySwitcherLabels } from \"./company-switcher\";\n\nexport const DEFAULT_COMPANY_SWITCHER_LABELS: CompanySwitcherLabels = {\n switchCompany: \"Switch company\",\n heading: \"Companies\",\n current: (name) => `Company: ${name}`,\n currentMark: \"(current)\",\n switching: \"Switching company\u2026\",\n};\n", "// The English words of ./email-change-setting, in a module with no component code: the\n// English catalogue (src/i18n/defaults.ts) imports them without the component, so `en`\n// loads as one chunk like the other languages (0.34, KS U8). ./email-change-setting\n// re-exports them.\n\nimport { englishRateLimited } from \"../auth/auth-errors\";\nimport type { EmailChangeLabels } from \"./email-change-setting\";\n\nexport const DEFAULT_EMAIL_CHANGE_LABELS: EmailChangeLabels = {\n title: \"Email address\",\n current: \"Current address\",\n newEmail: \"New email address\",\n password: \"Current password\",\n passwordHint: \"Your address is how you sign in, so changing it takes your password.\",\n emailTagUse: (address) => `Use ${address}`,\n emailTagHint:\n \"Many providers deliver name+tag@\u2026 to the same inbox, so mail from this app is easy to filter and trace. Check yours does before you rely on it: you would sign in with the tagged address.\",\n submit: \"Change email address\",\n sameAsCurrent: \"This is already your address.\",\n emailTaken: \"An account with this email address already exists.\",\n wrongPassword: \"The password is incorrect.\",\n pending: (newEmail) => `Confirm the link we sent to ${newEmail}.`,\n pendingHint: (currentEmail) =>\n `Until you do, you keep signing in with ${currentEmail}. Check your spam folder too.`,\n resend: \"Send the link again\",\n resent: \"We sent the link again.\",\n cancel: \"Cancel the change\",\n confirmed: (email) => `Your email address is now ${email}.`,\n passkeyNote: \"Your passkeys keep working. Your device may still list them under your old address.\",\n rateLimited: englishRateLimited,\n failed: \"That didn\u2019t work. Please try again.\",\n};\n", "// The English words of ./sessions-setting, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./sessions-setting re-exports them.\n\nimport type { SessionsLabels } from \"./sessions-setting\";\n\nexport const DEFAULT_SESSIONS_LABELS: SessionsLabels = {\n title: \"Sessions\",\n description: \"Signed in on a device you no longer use, or don\u2019t trust? Sign out everywhere.\",\n signOutEverywhere: \"Sign out everywhere\u2026\",\n signOutEverywherePrompt:\n \"This ends every session, including this one: you will be signed out on this device too, and sign in again from here.\",\n confirmSignOutEverywhere: \"Sign out everywhere\",\n list: \"Where you\u2019re signed in\",\n loading: \"Loading sessions\u2026\",\n empty: \"No sessions to show.\",\n current: \"This device\",\n unknownDevice: \"Unknown device\",\n lastActive: (when) => `Last active ${when}`,\n ip: (address) => `IP ${address}`,\n revoke: \"Sign out\",\n revokeItem: (device) => `Sign out ${device}`,\n failed: \"That didn\u2019t work. Please try again.\",\n};\n", "// The English words of ./delete-account-setting, in a module with no component code: the\n// English catalogue (src/i18n/defaults.ts) imports them without the component, so `en`\n// loads as one chunk like the other languages (0.34, KS U8). ./delete-account-setting\n// re-exports them.\n\nimport { englishRateLimited } from \"../auth/auth-errors\";\nimport type { DeleteAccountLabels } from \"./delete-account-setting\";\n\nexport const DEFAULT_DELETE_ACCOUNT_LABELS: DeleteAccountLabels = {\n title: \"Delete account\",\n afterDays: (days) =>\n days === 1\n ? \"Your account is deactivated at once and erased for good 1 day later.\"\n : `Your account is deactivated at once and erased for good ${days} days later.`,\n operator: \"Your account is deactivated at once, and an operator will erase it for good.\",\n arm: \"Delete account\u2026\",\n prompt: \"You will be signed out on every device, and your account can no longer be used.\",\n handOver: (count) =>\n count === 1\n ? \"1 item others can see will pass to an administrator.\"\n : `${count} items others can see will pass to an administrator.`,\n confirm: \"Delete my account\",\n done: \"Your account is deactivated. You are being signed out.\",\n wrongPassword: \"The password is incorrect.\",\n confirmationMismatch: \"This is not your account\u2019s address.\",\n lastAdmin: \"You are the last administrator. Make someone else an administrator first.\",\n lastAdminOf: (companies) =>\n `You are the last administrator of ${companies}. Make someone else an administrator there first.`,\n householdHasMembers:\n \"Your household has other members, so the account can\u2019t be deleted here. Please write to the operator.\",\n rateLimited: englishRateLimited,\n failed: \"Your account could not be deleted. Please try again.\",\n};\n", "// The English words of ./data-export-setting, in a module with no component code: the\n// English catalogue (src/i18n/defaults.ts) imports them without the component, so `en`\n// loads as one chunk like the other languages (0.34, KS U8). ./data-export-setting\n// re-exports them.\n\nimport { englishWait } from \"../auth/auth-errors\";\nimport type { DataExportLabels } from \"./data-export-setting\";\n\nexport const DEFAULT_DATA_EXPORT_LABELS: DataExportLabels = {\n title: \"Export your data\",\n description: \"Download a copy of your account\u2019s data as a JSON file.\",\n download: \"Download my data\",\n started: \"Your download has started.\",\n saveAgain: \"Didn\u2019t start? Save the file\",\n rateLimited: (seconds) =>\n seconds && seconds > 0\n ? `You exported your data a moment ago. Try again in ${englishWait(seconds)}.`\n : \"You exported your data a moment ago. Please try again in a minute.\",\n failed: \"The export failed. Please try again.\",\n};\n", "// The English words of ./user-roster, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./user-roster re-exports them.\n\nimport type { UserRosterLabels } from \"./user-roster\";\n\nexport const DEFAULT_USER_ROSTER_LABELS: UserRosterLabels = {\n name: \"Name\",\n email: \"Email\",\n role: \"Role\",\n state: \"State\",\n created: \"Created\",\n lastLogin: \"Last login\",\n never: \"Never\",\n actions: \"Actions\",\n actionsFor: (name) => `Actions for ${name}`,\n};\n", "// The English words of ./role-select, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./role-select re-exports them.\n\nimport type { RoleSelectLabels } from \"./role-select\";\n\nexport const DEFAULT_ROLE_SELECT_LABELS: RoleSelectLabels = {\n label: \"Role\",\n rolesLegend: \"Roles\",\n roleOf: (name) => `Role of ${name}`,\n lockedLastAdmin: \"The last active administrator keeps this role.\",\n lockedSelf: \"You can\u2019t change your own role.\",\n notForLastAdmin: \"not for the last administrator\",\n notForSelf: \"not for your own account\",\n unavailable: (role, reason) => `${role} (${reason})`,\n};\n", "// The English words of ./reviewer-scope-editor, in a module with no component code: the\n// English catalogue (src/i18n/defaults.ts) imports them without the component, so `en`\n// loads as one chunk like the other languages (0.34, KS U8). ./reviewer-scope-editor\n// re-exports them.\n\nimport type { ReviewerScopeLabels } from \"./reviewer-scope-editor\";\n\nexport const DEFAULT_REVIEWER_SCOPE_LABELS: ReviewerScopeLabels = {\n languages: \"Languages\",\n hint: \"Tick the languages this person reviews.\",\n none: \"No language: saving takes the reviewer role away.\",\n areas: \"Limit to\",\n legalOnly: \"Only the legal pages\",\n legalOnlyHint: \"Imprint, Privacy Policy and Terms \u2014 for a lawyer rather than a native speaker.\",\n failed: \"The reviewer scope couldn\u2019t be saved. Please try again.\",\n};\n", "// The English words of ./admin-action-confirm, in a module with no component code: the\n// English catalogue (src/i18n/defaults.ts) imports them without the component, so `en`\n// loads as one chunk like the other languages (0.34, KS U8). ./admin-action-confirm\n// re-exports them.\n\nimport type { AdminActionLabels } from \"./admin-action-confirm\";\n\nexport const DEFAULT_ADMIN_ACTION_LABELS: AdminActionLabels = {\n confirm: \"Confirm\",\n cancel: \"Cancel\",\n close: \"Close\",\n lastAdmin: \"This is the last active administrator. Make someone else an administrator first.\",\n self: \"You can\u2019t do this to your own account.\",\n confirmationMismatch: \"The address doesn\u2019t match this account. Check which account you are on.\",\n otherCompanies:\n \"This account also belongs to other companies, so only the platform operator can do this. You can remove it from this company instead.\",\n removeFromCompany: \"Remove from company\",\n failed: \"That didn\u2019t work. Please try again.\",\n};\n", "// The English words of ./admin-action-log, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./admin-action-log re-exports them.\n\nimport type { AdminActionLogLabels } from \"./admin-action-log\";\n\nexport const DEFAULT_ADMIN_ACTION_LOG_LABELS: AdminActionLogLabels = {\n title: \"Admin actions\",\n empty: \"No admin actions yet.\",\n loading: \"Loading\u2026\",\n by: (actor) => `by ${actor}`,\n bySelf: \"by the user themselves\",\n automatic: \"automatically\",\n erased: \"an erased account\",\n filteredTo: (target) => `Only ${target}`,\n showAll: \"Show all actions\",\n filterBy: (target) => `Show only the actions on ${target}`,\n actions: {\n deactivate: \"Deactivated\",\n reactivate: \"Reactivated\",\n role: \"Role changed\",\n password_change_require: \"New password required\",\n password_change_withdraw: \"Password requirement withdrawn\",\n mail_verification: \"Verification mail sent\",\n mail_reset: \"Password reset mail sent\",\n reviewer: \"Reviewer scope changed\",\n invite: \"Invited\",\n invite_resend: \"Invitation resent\",\n invite_revoke: \"Invitation revoked\",\n transfer: \"Work transferred\",\n deletion_request: \"Deletion requested\",\n deletion_cancel: \"Deletion cancelled\",\n erase: \"Account erased\",\n plan: \"Plan changed\",\n },\n renamedFromTo: (from, to) => `from ${from} to ${to}`,\n groupActions: {\n group: {\n group_create: \"Group created\",\n group_rename: \"Group renamed\",\n group_delete: \"Group deleted\",\n group_deactivate: \"Group deactivated\",\n group_reactivate: \"Group reactivated\",\n membership_add: \"Added to the group\",\n membership_role: \"Role in the group changed\",\n membership_remove: \"Removed from the group\",\n deleted: \"a deleted group\",\n },\n team: {\n group_create: \"Team created\",\n group_rename: \"Team renamed\",\n group_delete: \"Team deleted\",\n group_deactivate: \"Team deactivated\",\n group_reactivate: \"Team reactivated\",\n membership_add: \"Added to the team\",\n membership_role: \"Role in the team changed\",\n membership_remove: \"Removed from the team\",\n deleted: \"a deleted team\",\n },\n company: {\n group_create: \"Company created\",\n group_rename: \"Company renamed\",\n group_delete: \"Company deleted\",\n group_deactivate: \"Company deactivated\",\n group_reactivate: \"Company reactivated\",\n membership_add: \"Added to the company\",\n membership_role: \"Role in the company changed\",\n membership_remove: \"Removed from the company\",\n deleted: \"a deleted company\",\n },\n budget: {\n group_create: \"Budget created\",\n group_rename: \"Budget renamed\",\n group_delete: \"Budget deleted\",\n group_deactivate: \"Budget deactivated\",\n group_reactivate: \"Budget reactivated\",\n membership_add: \"Added to the budget\",\n membership_role: \"Role in the budget changed\",\n membership_remove: \"Removed from the budget\",\n deleted: \"a deleted budget\",\n },\n },\n};\n", "// The English words of ./transfer-ownership-dialog, in a module with no component code: the\n// English catalogue (src/i18n/defaults.ts) imports them without the component, so `en`\n// loads as one chunk like the other languages (0.34, KS U8). ./transfer-ownership-dialog\n// re-exports them.\n\nimport type { TransferOwnershipLabels } from \"./transfer-ownership-dialog\";\n\nexport const DEFAULT_TRANSFER_OWNERSHIP_LABELS: TransferOwnershipLabels = {\n title: (name) => `Hand on ${name}\u2019s work`,\n body: \"Everything this account owns moves to the account you choose, in one step.\",\n recipient: \"Hand it to\",\n choose: \"Choose an account\u2026\",\n chooseFirst: \"Choose who receives the work\",\n confirm: \"Hand it on\",\n customer: \"a customer\",\n deactivated: \"deactivated\",\n self: \"the same account\",\n unavailable: (account, reason) => `${account} (${reason})`,\n noCandidates: \"No other account can receive it.\",\n};\n", "// The English words of ./invitations-panel, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./invitations-panel re-exports them.\n\nimport type { InvitationsLabels } from \"./invitations-panel\";\n\nexport const DEFAULT_INVITATIONS_LABELS: InvitationsLabels = {\n email: \"Email address\",\n invalidEmail: \"Enter a complete email address.\",\n role: \"Role\",\n scope: \"Scope\",\n scopeNone: \"None\",\n language: \"Language of the invitation\",\n note: \"Note\",\n invite: \"Invite\",\n listTitle: \"Invitations\",\n empty: \"Nobody has been invited yet.\",\n loading: \"Loading\u2026\",\n status: { open: \"Open\", accepted: \"Accepted\", expired: \"Expired\", revoked: \"Revoked\" },\n sent: (date) => `Sent ${date}`,\n expires: (date) => `Expires ${date}`,\n invitedBy: (name) => `by ${name}`,\n resend: (email) => `Send ${email} a new link`,\n copyLink: \"Copy invitation link\",\n revoke: (email) => `Revoke the invitation for ${email}`,\n consoleHint:\n \"Mail isn\u2019t sent on this server \u2014 it is written to the server log. Copy each invitation link from here and pass it on yourself: it is shown only once.\",\n linkReady: (email) => `The invitation link for ${email}, shown only this once:`,\n notSent: (email) => `${email} is invited, but the mail couldn\u2019t be sent. Resend it.`,\n failed: \"That didn\u2019t work. Please try again.\",\n};\n", "import { useKitLabels, type LabelOverride } from \"../i18n/kit-labels\";\n\n/**\n * The `settings` namespace (docs/settings-harmonization.md \u00A74.3): the settings page's\n * own words, and the names and help lines of the five core groups every app shares \u2014\n * appearance, account, security, notifications, data (\u00A72.6). An app's own groups bring\n * their own words; any core label may be overridden like any kit label (prop >\n * `<UiKitProvider labels={{ settings }}>` > English).\n */\n\n/** A core group's two strings, as {@link SettingsGroup} takes them. */\nexport interface SettingsGroupLabels {\n /** The group's name. */\n title: string;\n /** One line: under the heading, and in the phone list. */\n help: string;\n}\n\n/** The five groups whose words the kit ships (\u00A72.6, \u00A74.2). */\nexport type SettingsCoreGroup = \"appearance\" | \"account\" | \"security\" | \"notifications\" | \"data\";\n\nexport interface SettingsLabels {\n /** The page's heading, and the back link's visible text on a phone's group page. */\n title: string;\n /** The search field's accessible name. */\n search: string;\n /** The search field's placeholder. */\n searchPlaceholder: string;\n /** The hit list's accessible name. */\n results: string;\n /** No hits for the trimmed query (\u00A73.4). */\n noMatches: (query: string) => string;\n /** The button beside it that empties the field. */\n clearSearch: string;\n /** The phone's back link's accessible name: \"\u2039 Settings\" says where, this says what. */\n back: string;\n /** The sidebar's accessible name (the vertical tablist). */\n sections: string;\n /** A sidebar row's hit badge, read in place of the bare number while searching. */\n matchCount: (count: number) => string;\n /** The core groups' names and help lines. */\n groups: Record<SettingsCoreGroup, SettingsGroupLabels>;\n}\n\nexport const DEFAULT_SETTINGS_LABELS: SettingsLabels = {\n title: \"Settings\",\n search: \"Search settings\",\n searchPlaceholder: \"Search settings\u2026\",\n results: \"Matching settings\",\n noMatches: (query) => `No settings match \u201C${query}\u201D.`,\n clearSearch: \"Clear search\",\n back: \"Back to settings\",\n sections: \"Settings sections\",\n matchCount: (count) => (count === 1 ? \"1 match\" : `${count} matches`),\n groups: {\n appearance: {\n title: \"Appearance\",\n help: \"Language, theme and how the app looks on this device.\",\n },\n account: {\n title: \"Account\",\n help: \"Your profile and your email address.\",\n },\n security: {\n title: \"Security\",\n help: \"How you sign in, and where you are signed in.\",\n },\n notifications: {\n title: \"Notifications\",\n help: \"What you are told about, when, and on which devices.\",\n },\n data: {\n title: \"Data\",\n help: \"Export what is yours, or delete it together with your account.\",\n },\n },\n};\n\n/**\n * 0.31.1: the `settings` namespace, resolved \u2014 English, then the provider, then `labels`.\n * What an app reads for its catalogue's core group titles and help lines, and for the\n * page title \"<group> \u00B7 Settings \u00B7 <app>\" (settings contract \u00A73.1), without restating\n * the namespace and its defaults (Kurvenschmiede's 0.31 adoption).\n */\nexport function useSettingsLabels(labels?: LabelOverride<SettingsLabels>): SettingsLabels {\n return useKitLabels(\"settings\", DEFAULT_SETTINGS_LABELS, labels);\n}\n", "import { useKitLabels, type LabelOverride } from \"../i18n/kit-labels\";\n\n/**\n * The kit's words on the public landing page (docs/landing-demo-harmonization.md \u00A74.1,\n * \u00A74.2) \u2014 the `landing` namespace of `<UiKitProvider labels>`.\n *\n * Only the GENERIC words are the kit's: the actions every app's header, hero and CTA band\n * share, the \"Beta\" badge, and the template of the request-access mail. The marketing\n * copy (the hero's title, the feature rows, the trust strip, the tagline) is each app's,\n * in every language it ships (\u00A74.1 \"Words\").\n *\n * The demo parts and `SignInForm` read the access words from here too, so \"Request\n * access\" and its mail are said the same way on the landing, the sign-in page, the demo\n * start, the banner and the end page.\n */\nexport interface LandingLabels {\n /** The header's secondary action without a session; also the demo banner's and the\n * end page's way to an existing account. */\n signIn: string;\n /** The access action of an invitation-only app: a mail to support (\u00A72.2, \u00A74.2). */\n requestAccess: string;\n /** The access action once an app opens registration (`{kind: \"register\"}`, \u00A74.2). */\n getStarted: string;\n /** The hero's and the CTA band's second action without a session. */\n tryDemo: string;\n /** The one action for a real session: into the app, at the resume target. */\n openApp: string;\n /** The secondary action for a demo session: back into the live demo. */\n continueDemo: string;\n /** The hero's optional badge. */\n beta: string;\n /** The request mail's subject, given the app's name (`access.app`): \"Access to\n * Kastlan\". `undefined` when the app named none. */\n accessSubject: (app?: string) => string;\n /** The request mail's body, one prompt per line; the sender writes after each. */\n accessName: string;\n /** Asked only where the app says so (`askCompany`, kastlan). */\n accessCompany: string;\n accessUse: string;\n}\n\nexport const DEFAULT_LANDING_LABELS: LandingLabels = {\n signIn: \"Sign in\",\n requestAccess: \"Request access\",\n getStarted: \"Get started\",\n tryDemo: \"Try the demo\",\n openApp: \"Open app\",\n continueDemo: \"Continue the demo\",\n beta: \"Beta\",\n accessSubject: (app) => (app ? `Access to ${app}` : \"Access request\"),\n accessName: \"Name:\",\n accessCompany: \"Company:\",\n accessUse: \"What would you use it for:\",\n};\n\n/** The `landing` namespace, resolved: English, then the provider, then `labels`. */\nexport function useLandingLabels(labels?: LabelOverride<LandingLabels>): LandingLabels {\n return useKitLabels(\"landing\", DEFAULT_LANDING_LABELS, labels);\n}\n", "import { useKitLabels, type LabelOverride } from \"../i18n/kit-labels\";\n\n/**\n * The demo's words (docs/landing-demo-harmonization.md \u00A75) \u2014 the `demo` namespace of\n * `<UiKitProvider labels>`: `DemoStart`'s progress and refusals, `DemoBanner`'s\n * countdown and model line, `DemoEnded`, and the reason of the read-only lock.\n *\n * \"Demo\" means the demo session and the shared demo data it shows (\u00A72.10) \u2014 never\n * keksdose's blur toggle, which is \"Presentation mode\" now. \"Request access\" and \"Sign\n * in\" are the `landing` namespace's, so they read the same on every public page.\n */\nexport interface DemoLabels {\n /** `DemoStart` while the demo is being created. */\n starting: string;\n /** `demo_rate_limited`: too many demos from one network, given the wait in whole\n * minutes from `Retry-After` \u2014 or `undefined` without one. */\n rateLimited: (minutes?: number) => string;\n /** `demo_capacity`: the live cap is reached. */\n capacity: string;\n /** `demo_disabled` and `demo_not_ready`: the demo is off, or its data isn't there. */\n unavailable: string;\n /** Any other failure \u2014 the network, a 500. */\n failed: string;\n /** `DemoStart`'s way out after a refusal, to the landing. */\n backToStart: string;\n /** The banner's countdown with an hour or more left: \"Demo \u00B7 23 h 12 min left\". */\n hoursLeft: (hours: number, minutes: number) => string;\n /** \u2026and in the last hour, minutes only: \"Demo \u00B7 50 min left\". */\n minutesLeft: (minutes: number) => string;\n /** The banner's word when the end is unknown (no readable `expiresAt`). */\n badge: string;\n /** The banner's line for model R, shared read-only data. */\n readOnly: string;\n /** The banner's line for model S, a sandbox of one's own. */\n sandbox: string;\n /** The name of the banner's show/hide toggle (`aria-expanded` says which). */\n details: string;\n /** The reason a locked commit shows in a read-only demo (model R) \u2014 for the app's\n * `<WriteLockProvider locked reason={\u2026}>` (\u00A75.4). */\n writeLocked: string;\n /** `DemoEnded`'s heading; also the banner's text at zero. */\n endedTitle: string;\n /** `DemoEnded`'s line for model R. */\n endedReadOnly: string;\n /** `DemoEnded`'s line for model S. */\n endedSandbox: string;\n /** `DemoEnded`'s first action, to `/demo`. */\n restart: string;\n}\n\nexport const DEFAULT_DEMO_LABELS: DemoLabels = {\n starting: \"Starting the demo\u2026\",\n rateLimited: (minutes) =>\n minutes\n ? `Too many demos from this network. Try again in ${minutes} min.`\n : \"Too many demos from this network. Try again later.\",\n capacity: \"The demo is full right now. Try again later.\",\n unavailable: \"The demo isn\u2019t available right now.\",\n failed: \"The demo could not be started. Please try again.\",\n backToStart: \"Back to the start page\",\n hoursLeft: (hours, minutes) => `Demo \u00B7 ${hours} h ${minutes} min left`,\n minutesLeft: (minutes) => `Demo \u00B7 ${minutes} min left`,\n badge: \"Demo\",\n readOnly: \"You\u2019re looking at sample data. Changes aren\u2019t possible.\",\n sandbox: \"Your own work is deleted when the demo ends.\",\n details: \"Demo details\",\n writeLocked: \"Not possible in the demo.\",\n endedTitle: \"The demo has ended\",\n endedReadOnly: \"Sample data is reset regularly.\",\n endedSandbox: \"Sample data is reset regularly; your own work from the demo is deleted.\",\n restart: \"Start a new demo\",\n};\n\n/** The `demo` namespace, resolved: English, then the provider, then `labels`. The app\n * reads `writeLocked` from here for its `WriteLockProvider`. */\nexport function useDemoLabels(labels?: LabelOverride<DemoLabels>): DemoLabels {\n return useKitLabels(\"demo\", DEFAULT_DEMO_LABELS, labels);\n}\n", "import { useKitLabels } from \"../i18n/kit-labels\";\nimport type { LabelOverride } from \"../i18n/kit-labels\";\n\n/**\n * The subscription's status vocabulary (docs/billing-harmonization.md \u00A73.2) \u2014 server-kit's\n * `SubscriptionStatus`, value for value:\n *\n * - `trialing` \u2014 the 30-day trial without a card (\u00A72.7), or a pure guest's row whose trial\n * has not started (\u00A712.9, `trial_ends_at` empty);\n * - `active` \u2014 paid;\n * - `past_due` \u2014 a payment failed; in good standing during the provider's retries (\u00A73.3);\n * - `canceled` \u2014 the payer cancelled; the American spelling is the wire's, the word shown\n * is \"Cancelled\";\n * - `expired` \u2014 a trial, a grant or a failed subscription ran out: read-only (\u00A72.3);\n * - `comped` \u2014 free by the operator's grant or as a beta user (\u00A73.2, `comped_until`).\n */\nexport type SubscriptionStatus = \"trialing\" | \"active\" | \"past_due\" | \"canceled\" | \"expired\" | \"comped\";\n\n/** Every status, in the order a lifecycle reads: trial, paid, trouble, ended, granted. */\nexport const SUBSCRIPTION_STATUSES: readonly SubscriptionStatus[] = Object.freeze([\n \"trialing\",\n \"active\",\n \"past_due\",\n \"canceled\",\n \"expired\",\n \"comped\",\n]);\n\n/**\n * The words of the subscription parts \u2014 the `billing` namespace of `<UiKitProvider labels>`\n * (docs/billing-harmonization.md \u00A77, \u00A710; ui-kit 0.32.0).\n *\n * WORDING (\u00A712.24): the English group is \"Subscription\", never \"Plan\" \u2014 keksdose's \"plan\"\n * is the month's budget plan (\"One plan per month\"), and two meanings of one word on one\n * settings page is the clash the review found. \"Plan\" stays the word for WHAT is bought\n * (Free, Pro), \"subscription\" for the standing arrangement. German says \"Tarif\" for the\n * plan and \"Abonnement\" for the subscription (\u00A710).\n *\n * Prices are GROSS (\u00A712.17): Swiss consumer law (PBV) wants a consumer price with the\n * MWST in it, so the cards say so (`vatIncluded`).\n */\nexport interface BillingLabels {\n /** The settings group or admin section the parts live on (\u00A77, \u00A712.24): \"Subscription\". */\n group: string;\n\n /* \u2500\u2500 PlanPicker / PlanCard (\u00A77) \u2500\u2500 */\n /** The picker's name when it has no visible `legend`: \"Plans\". */\n plans: string;\n /** The name of the billing-period switch: \"Billing period\". */\n interval: string;\n /** The switch's two options \u2014 yearly first (\u00A712.17). */\n yearly: string;\n monthly: string;\n /** The name of the currency switch: \"Currency\". */\n currency: string;\n /** After a price: \"per year\", \"per month\". */\n perYear: string;\n perMonth: string;\n /** Under a price (\u00A712.17): \"VAT included\". German: \"inkl. MWST\". */\n vatIncluded: string;\n /** A plan with no price, or a price of 0: \"Free\". */\n free: string;\n /** A plan with prices, but none for this currency and period. */\n notOffered: string;\n /** A limit of `null` (\u00A73.1): \"Unlimited\". */\n unlimited: string;\n /** The accessible names of a card's two lists. */\n limits: string;\n features: string;\n /** The chip on the payer's current plan. */\n current: string;\n /** The picker's button for `plan` (the plan's display name) with no current plan \u2014\n * during a trial, or after a plan ended: \"Choose Pro\". */\n choose: (plan: string) => string;\n /** \u2026for a plan after the current one in the catalogue's order: \"Upgrade to Pro\". */\n upgrade: (plan: string) => string;\n /** \u2026for a plan before it: \"Switch to Free\". */\n downgrade: (plan: string) => string;\n /** Why the button is off while the current plan is the one picked. */\n isCurrent: string;\n /** Why it is off while nothing is picked. */\n pickFirst: string;\n\n /* \u2500\u2500 SubscriptionStatusChip (\u00A76) \u2500\u2500 */\n /** One word per status. */\n status: Record<SubscriptionStatus, string>;\n\n /* \u2500\u2500 BillingBanner (\u00A73.3, \u00A712.6, \u00A712.21) \u2500\u2500 */\n /** A trial ends in `days` calendar days \u2014 0 is today, 1 tomorrow. */\n trialEnding: (days: number) => string;\n /** A free grant (`comped_until`: a beta user's 12 months, an operator's grant) ends in\n * `days` calendar days. */\n grantEnding: (days: number) => string;\n /** The first failed payment (`past_due`), while the provider retries. */\n paymentFailed: string;\n /** Out of good standing: read-only, never locked (\u00A72.3). */\n planEnded: string;\n /**\n * A guest in someone else's item that is read-only for billing (\u00A712.6). It never says\n * WHY beyond \"for now\": the owner's payment status is the owner's personal data.\n * `item` is the item's own name (\"Household 2026\"), shown in quotes \u2014 or `undefined`.\n */\n guestReadOnly: (item?: string) => string;\n /** Back from checkout before the provider's webhook landed (\u00A712.21). */\n processing: string;\n /** The action of the trial, grant and plan-ended banners, and of `PlanLimitNotice`'s\n * `upgrade` mode: \"Choose a plan\". */\n choosePlan: string;\n /** The payment-failed banner's action, to the provider's portal: \"Update payment method\". */\n updatePayment: string;\n /**\n * 0.42 (\u00A716.7 A, \u00A716.8): the payment-failed banner for an admin who isn't the buyer\n * (`portal: \"buyer_only\"`), with no button \u2014 only the buyer can change the card.\n * `buyer` is their display name, or `undefined` when they are gone (\"the admin who\n * bought the subscription\").\n */\n paymentFailedAskBuyer: (buyer?: string) => string;\n /** The processing banner's action, when the app gives one: \"Check again\". */\n checkAgain: string;\n\n /* \u2500\u2500 The read-only lock (\u00A73.3, \u00A712.6) \u2500\u2500 */\n /** The `WriteLockProvider` reason for the payer (\u00A73.3, verbatim). A guest's reason is\n * {@link guestReadOnly}. */\n lockReason: string;\n\n /* \u2500\u2500 PlanLimitNotice (\u00A73.4) \u2500\u2500 */\n /** The notice's first line: \"Plan limit reached\". */\n limitReached: string;\n /** Mode `upgrade`: what the action does. */\n limitUpgrade: string;\n /** Mode `contact` (the operator grants plans by hand, keksdose's today). */\n limitContact: string;\n /** Mode `contact`'s action, a mail to support: \"Ask for more\". */\n askForMore: string;\n /** The meter's value: \"3 of 3\". Both figures are formatted already. */\n usage: (used: string, limit: string) => string;\n /** The subject of the `contact` mail; `dimension` is the app's name for it (\"Budgets\"). */\n contactSubject: (dimension: string) => string;\n /**\n * The figure line of the limit's toast (`usePlanLimitToast`, \u00A714.11) and of an\n * operator's plan change over the new limit (\u00A714.12): \"Budgets: 3 of 3\". A key of its\n * own rather than `${dimension}: ${usage}`, because French puts a space before the\n * colon. Both figures are formatted already.\n */\n limitUsageLine: (dimension: string, used: string, limit: string) => string;\n\n /* \u2500\u2500 The provider's portal (\u00A77, \u00A712.26) \u2500\u2500 */\n /** The portal: payment method and invoices (\u00A72.8, the provider hosts both). */\n manage: string;\n /**\n * The visible cancel link on the app's subscription page (\u00A712.26). German: \u00A7312k BGB\n * wants the button that leads to the cancellation labelled \"Vertr\u00E4ge hier k\u00FCndigen\" or\n * as unambiguously \u2014 a translator should use exactly that.\n */\n cancel: string;\n /**\n * In place of both while the payer hasn't reached the provider (the overview's\n * `at_provider` is false, \u00A714.5): there is no customer to open a portal for yet. Also\n * the words for `409 billing_not_at_provider`, a stale page that asked anyway.\n */\n notAtProvider: string;\n\n /* \u2500\u2500 The portal for the buyer only, the in-app cancel (0.42, \u00A716) \u2500\u2500 */\n /**\n * In place of \"Payment and invoices\" for an admin who isn't the buyer (`portal:\n * \"buyer_only\"`, \u00A716.2 decision 3): the provider's portal opens only for the buyer.\n * `buyer` is their display name \u2014 or `undefined` when they are gone or have left the\n * company, and the words then say \"the admin who bought the subscription\".\n */\n buyerHolds: (buyer?: string) => string;\n /** `CancelSubscriptionConfirm`'s title: \"Cancel subscription\". */\n cancelConfirmTitle: string;\n /** Its body; `date` is the period's end, formatted: \"Your subscription ends on\n * 9 Nov 2026. Until then everything works as before.\" */\n cancelConfirmBody: (date: string) => string;\n /** Its confirm button (\u00A716.4): \"Cancel subscription now\". German: \"Jetzt k\u00FCndigen\",\n * the confirmation button's words in \u00A7312k BGB. */\n cancelConfirmAction: string;\n /** In place of \"Cancel subscription\" while a cancel is scheduled (\u00A716.7 C, `POST\n * /billing/resume`): \"Keep subscription\". */\n keepSubscription: string;\n /** 0.43 (\u00A717.3): the muted note under the actions while the portal opens in a new tab \u2014\n * `provider` the provider's name (\"Paddle\"), `app` the app's; without the app, \"this\n * page\". \"Payment and invoices open at Paddle in a new tab; Kastlan stays open here.\" */\n portalOpensNewTab: (provider: string, app?: string) => string;\n\n /* \u2500\u2500 The pay page (\u00A714.4) \u2500\u2500 */\n /* Built into the static page `dist/pay/` at the kit's build: it has no React and no\n provider, so an app's override never reaches it. */\n /** While the checkout opens. */\n payOpening: string;\n /** A link without a transaction, or billing switched off: nothing to pay. */\n payNothing: string;\n /** Paddle's script didn't load, or the page's configuration is wrong. */\n payFailed: string;\n /** The buyer closed the checkout without paying. */\n payBack: string;\n /** 0.39 (\u00A715.2.5): paid, for a transaction that names no app the page knows (a\n * payment-method update from Paddle's e-mail) \u2014 no way back to offer. */\n payDone: string;\n\n /* \u2500\u2500 PlanSwitchConfirm (0.39, \u00A715.2.10) \u2500\u2500 */\n /** The dialog's title: \"Change plan\". */\n switchTitle: string;\n /** The line naming both plans, each with its billing period: \"From Pro (Monthly) to\n * Business (Yearly)\". */\n switchFromTo: (from: string, to: string) => string;\n /** What an upgrade charges at once (Paddle's preview, prorated): \"Charged now\". */\n switchChargedNow: string;\n /** What a downgrade credits \u2014 the customer's balance, which Paddle takes off the next\n * charges: \"Credited towards your next charges\". */\n switchCredited: string;\n /** The next regular charge; `date` is formatted: \"Next charge on 9 Nov 2026\". */\n switchNextCharge: (date: string) => string;\n /** The confirm button: \"Change plan\". */\n switchConfirm: string;\n\n /* \u2500\u2500 The permanent-grant warning (0.42, \u00A716.2 decision 5, \u00A716.8 B) \u2500\u2500 */\n /** The warning's title, before a checkout (`PlanPicker`) or a switch\n * (`PlanSwitchConfirm`) under a grant without an end: \"Your free access continues\". */\n grantWarningTitle: string;\n /** What the purchase does under it: nothing to the plan while the grant runs. */\n grantWarningBody: string;\n /** `PlanPicker`'s button that goes on to the checkout: \"Buy anyway\". */\n grantWarningAction: string;\n\n /* \u2500\u2500 Offline (\u00A712.5) \u2500\u2500 */\n /** Changes refused as `billing_read_only` inside a sync reply, kept queued and sent\n * after payment: \"3 changes waiting for a plan\". */\n waitingChanges: (count: number) => string;\n /** The sign-out guard's way out for someone who will not pay. */\n discardWaiting: string;\n\n /* \u2500\u2500 Refusals with no part of their own (0.32.1, kastlan's 0.32 report) \u2500\u2500 */\n /**\n * `billing_not_configured`: billing is on but the provider's settings are missing \u2014 the\n * operator's mistake, so the words ask the payer to wait, not to act. For the toast or\n * alert after \"Choose a plan\" or \"Payment and invoices\" (`isBillingError(err,\n * \"billing_not_configured\")`). `billing_read_only` and `plan_limit` need none: the\n * write lock, the banner and `PlanLimitNotice` say them.\n */\n notConfigured: string;\n /** `billing_disabled`: billing is switched off on this server (\u00A72.9), for a page or a\n * link that reached it anyway. */\n disabled: string;\n /* 0.33.0 \u2014 server-kit 0.7's refusals (\u00A714.2). `billing_not_at_provider` is\n {@link notAtProvider}'s: a stale page that asked for the portal anyway. */\n /** `billing_provider_unavailable` (502): the provider didn't answer. Try again. */\n providerUnavailable: string;\n /** `billing_already_subscribed` (409): a second checkout while a subscription runs\n * (\u00A714.6). Since 0.39 plan changes go through the app's own switch (\u00A715.2.10), not the\n * portal, and the words say so. */\n alreadySubscribed: string;\n /** `billing_plan_not_sold` (422): the catalogue doesn't sell this plan with that\n * period or currency \u2014 at a checkout, or (0.39) a switch to a plan no longer sold. */\n planNotSold: string;\n /** 0.39 (\u00A715.2.10): `billing_not_subscribed` (409), a plan switch with no running\n * provider subscription \u2014 the page offers the checkout instead. */\n notSubscribed: string;\n /** 0.39: `billing_plan_unchanged` (409), a switch to the price the payer pays now. */\n planUnchanged: string;\n}\n\n/** \"today\", \"tomorrow\", \"in 5 days\". */\nfunction inDays(days: number): string {\n if (days <= 0) return \"today\";\n if (days === 1) return \"tomorrow\";\n return `in ${days} days`;\n}\n\nexport const DEFAULT_BILLING_LABELS: BillingLabels = {\n group: \"Subscription\",\n\n plans: \"Plans\",\n interval: \"Billing period\",\n yearly: \"Yearly\",\n monthly: \"Monthly\",\n currency: \"Currency\",\n perYear: \"per year\",\n perMonth: \"per month\",\n vatIncluded: \"VAT included\",\n free: \"Free\",\n notOffered: \"Not offered for this billing period\",\n unlimited: \"Unlimited\",\n limits: \"Limits\",\n features: \"Included\",\n current: \"Current plan\",\n choose: (plan) => `Choose ${plan}`,\n upgrade: (plan) => `Upgrade to ${plan}`,\n downgrade: (plan) => `Switch to ${plan}`,\n isCurrent: \"This is your current plan.\",\n pickFirst: \"Pick a plan first.\",\n\n status: {\n trialing: \"Trial\",\n active: \"Active\",\n past_due: \"Payment overdue\",\n canceled: \"Cancelled\",\n expired: \"Expired\",\n comped: \"Complimentary\",\n },\n\n trialEnding: (days) =>\n `Your trial ends ${inDays(days)}. After that you can still view everything, but changes need a plan.`,\n grantEnding: (days) =>\n `Your free access ends ${inDays(days)}. After that you can still view everything, but changes need a plan.`,\n paymentFailed: \"Your last payment didn\u2019t go through. Update your payment method to keep your plan.\",\n planEnded: \"Your plan has ended. You can still view and export everything; choose a plan to make changes again.\",\n guestReadOnly: (item) =>\n item ? `\u201C${item}\u201D is read-only for now; its owner can lift that.` : \"This is read-only for now; its owner can lift that.\",\n processing: \"Your payment is being processed. Your plan starts as soon as it\u2019s confirmed; this page updates by itself.\",\n choosePlan: \"Choose a plan\",\n updatePayment: \"Update payment method\",\n paymentFailedAskBuyer: (buyer) =>\n buyer\n ? `The payment failed. ${buyer} can update the payment method.`\n : \"The payment failed. The admin who bought the subscription can update the payment method.\",\n checkAgain: \"Check again\",\n\n lockReason: \"Your plan has ended. Choose a plan to make changes again.\",\n\n limitReached: \"Plan limit reached\",\n limitUpgrade: \"To add more, choose a plan with a higher limit.\",\n limitContact: \"To add more, ask us for a higher limit.\",\n askForMore: \"Ask for more\",\n usage: (used, limit) => `${used} of ${limit}`,\n contactSubject: (dimension) => `Plan limit: ${dimension}`,\n limitUsageLine: (dimension, used, limit) => `${dimension}: ${used} of ${limit}`,\n\n manage: \"Payment and invoices\",\n cancel: \"Cancel subscription\",\n notAtProvider: \"Nothing to manage yet. Payments and invoices appear here once you have a paid plan.\",\n buyerHolds: (buyer) =>\n buyer\n ? `The payment method and the invoices are with ${buyer}, who bought the subscription.`\n : \"The payment method and the invoices are with the admin who bought the subscription.\",\n cancelConfirmTitle: \"Cancel subscription\",\n cancelConfirmBody: (date) => `Your subscription ends on ${date}. Until then everything works as before.`,\n cancelConfirmAction: \"Cancel subscription now\",\n keepSubscription: \"Keep subscription\",\n portalOpensNewTab: (provider, app) =>\n `Payment and invoices open at ${provider} in a new tab; ${app ? `${app} stays open here` : \"this page stays open\"}.`,\n\n payOpening: \"Opening the secure checkout\u2026\",\n payNothing: \"There\u2019s no payment to make here. To choose a plan, go back to the app.\",\n payFailed: \"The checkout couldn\u2019t be opened. Please go back and try again in a moment.\",\n payBack: \"The checkout was closed. You can go back, or reload this page to open it again.\",\n payDone: \"Payment complete. You can close this page.\",\n\n switchTitle: \"Change plan\",\n switchFromTo: (from, to) => `From ${from} to ${to}`,\n switchChargedNow: \"Charged now\",\n switchCredited: \"Credited towards your next charges\",\n switchNextCharge: (date) => `Next charge on ${date}`,\n switchConfirm: \"Change plan\",\n\n grantWarningTitle: \"Your free access continues\",\n grantWarningBody:\n \"You have free access with no end date. A purchase won\u2019t change your plan while the free access runs: you would pay for a plan that doesn\u2019t apply.\",\n grantWarningAction: \"Buy anyway\",\n\n waitingChanges: (count) =>\n count === 1 ? \"1 change waiting for a plan\" : `${count} changes waiting for a plan`,\n discardWaiting: \"Discard waiting changes\",\n\n notConfigured: \"Payments aren't set up yet. Please try again later.\",\n disabled: \"Subscriptions aren't available here.\",\n providerUnavailable: \"The payment provider can\u2019t be reached right now. Please try again in a moment.\",\n alreadySubscribed: \"You already have a subscription. Change your plan above.\",\n planNotSold: \"This plan isn\u2019t offered for that billing period or currency. Please choose another.\",\n notSubscribed: \"There\u2019s no running subscription to change. Choose a plan to subscribe.\",\n planUnchanged: \"That\u2019s already your plan. Pick another plan or billing period.\",\n};\n\n/** The `billing` namespace, resolved: English, then the provider, then `labels` \u2014 which\n * may be partial at every depth (`{ status: { comped: \"Beta\" } }`). */\nexport function useBillingLabels(labels?: LabelOverride<BillingLabels>): BillingLabels {\n return useKitLabels(\"billing\", DEFAULT_BILLING_LABELS, labels);\n}\n", "// The English words of ./plan-change, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./plan-change re-exports them.\n\nimport type { PlanChangeLabels } from \"./plan-change\";\n\nexport const DEFAULT_PLAN_CHANGE_LABELS: PlanChangeLabels = {\n column: \"Plan\",\n title: \"Change plan\",\n confirm: \"Change plan\",\n plan: \"Plan\",\n current: (plan) => `Current plan: ${plan}`,\n keepsItems: \"A smaller plan only blocks creating more; nothing is deleted.\",\n until: \"Free until\",\n untilHint: \"Leave empty for no end. A running beta keeps its own end.\",\n needsChange: \"Pick another plan or an end date.\",\n changed: (from, to) => `Plan changed from ${from} to ${to}.`,\n set: (to) => `Plan set to ${to}.`,\n keptBeta: \"The beta keeps its end; only the plan changed.\",\n untilDone: (date) => `Free until ${date}.`,\n overLimit: \"Above the new plan\u2019s limit: nothing is removed, new items are blocked.\",\n usageOf: (used, limit, dimension) => `${used} of ${limit} ${dimension}`,\n};\n", "import { useKitLabels, type LabelOverride } from \"../i18n/kit-labels\";\nimport type { ContrastMode } from \"../theme/contrast\";\nimport type { TextSize } from \"../theme/text-size\";\n\n/**\n * The `appearance` namespace (0.32, docs/text-size-harmonization.md \u00A76): the words of the\n * two new settings in the core `appearance` group \u2014 `TextSizeSetting` and\n * `ContrastSetting` \u2014 and of any quick switch an app builds from the same vocabulary (the\n * showcase's top bar). Like every kit label: prop > `<UiKitProvider labels={{ appearance\n * }}>` > English.\n */\nexport interface AppearanceLabels {\n /** The text-size setting's name. */\n textSize: string;\n /** One line under it: what changes, so \"Large\" is not mistaken for zoom. */\n textSizeHelp: string;\n /** The three steps, in {@link TEXT_SIZES} order. */\n textSizes: Record<TextSize, string>;\n /** The contrast setting's name. */\n contrast: string;\n /** One line under it. */\n contrastHelp: string;\n /** The three choices, in {@link CONTRAST_MODES} order. */\n contrastModes: Record<ContrastMode, string>;\n /**\n * The account could not keep the pick (`useAccountAppearance`'s `pickTextSize` /\n * `pickContrast` rejected): this device keeps it, the account doesn't. For the app's\n * toast or the line under the setting (0.32.1, keksdose's 0.32 report).\n */\n saveFailed: string;\n /** The date-format setting's name (0.46, `DateFormatSetting`). */\n dateFormat: string;\n /** One line under it: the format is its own choice, apart from the language. */\n dateFormatHelp: string;\n /** Its first option, followed by that language's sample: \"Follow language \u2014 01 Aug 2026\". */\n dateFormatAuto: string;\n /** `AccountMenuTextSize`'s A\u2212 button (0.46, keksdose live #426): one step smaller. */\n textSmaller: string;\n /** Its A+ button: one step larger. */\n textLarger: string;\n}\n\nexport const DEFAULT_APPEARANCE_LABELS: AppearanceLabels = {\n textSize: \"Text size\",\n textSizeHelp: \"Larger letters, and a layout that makes room for them.\",\n textSizes: { normal: \"Normal\", large: \"Large\", xlarge: \"Extra large\" },\n contrast: \"Contrast\",\n contrastHelp: \"More contrast darkens quiet text and lines, and thickens focus frames. System follows this device.\",\n contrastModes: { system: \"System\", standard: \"Standard\", more: \"More\" },\n saveFailed: \"Couldn't save this to your account. It still applies on this device.\",\n dateFormat: \"Date format\",\n dateFormatHelp:\n \"How dates are written throughout the app. Independent of the interface language, so you can read the app in English and still see German dates.\",\n dateFormatAuto: \"Follow language\",\n textSmaller: \"Smaller text\",\n textLarger: \"Larger text\",\n};\n\n/** The `appearance` namespace, resolved \u2014 English, then the provider, then `labels`. For\n * an app's catalogue entries and quick switches, without restating the defaults. */\nexport function useAppearanceLabels(labels?: LabelOverride<AppearanceLabels>): AppearanceLabels {\n return useKitLabels(\"appearance\", DEFAULT_APPEARANCE_LABELS, labels);\n}\n", "// The English words of ./device-reset-setting, in a module with no component code: the\n// English catalogue (src/i18n/defaults.ts) imports them without the component, so `en`\n// loads as one chunk like the other languages (0.34, KS U8). ./device-reset-setting\n// re-exports them.\n\nimport type { DeviceResetLabels } from \"./device-reset-setting\";\n\n/** docs/settings-harmonization.md \u00A711.3, word for word. */\nexport const DEFAULT_DEVICE_RESET_LABELS: DeviceResetLabels = {\n title: \"Reset this device\",\n description:\n \"Puts this device's appearance, and the way its tables and panels were left, back to the defaults. Your account, your data and your sign-in are not touched.\",\n action: \"Reset this device's settings\",\n confirmTitle: \"Reset this device's settings?\",\n confirmBody:\n \"Theme, colours, text size, contrast and language go back to their defaults here, and tables and panels open as they first did. Where your account has a language, a text size or a contrast, this device follows it again. Your account and your other devices stay as they are.\",\n confirmAction: \"Reset\",\n done: \"This device's settings are back to their defaults.\",\n keywords: \"reset defaults device restore appearance tables layout\",\n};\n", "// The English words of ./row-actions, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./row-actions re-exports them.\n\nimport type { RowActionsLabels } from \"./row-actions\";\n\nexport const DEFAULT_ROW_ACTIONS_LABELS: RowActionsLabels = {\n actions: \"Actions\",\n actionsFor: (name) => `Actions for ${name}`,\n};\n", "// The English words of ./app-shell, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./app-shell re-exports them.\n\nimport type { AppShellMoreLabels } from \"./app-shell\";\n\nexport const DEFAULT_APP_SHELL_MORE_LABELS: AppShellMoreLabels = {\n more: \"More\",\n moreTitle: \"More pages\",\n};\n", "// The English words of ./account-chips, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./account-chips re-exports them.\n\nimport type { AccountStateLabels } from \"./account-chips\";\n\nexport const DEFAULT_ACCOUNT_STATE_LABELS = {\n active: \"Active\",\n inactive: \"Inactive\",\n invited: \"Invited\",\n registered: \"Registered\",\n unverified: \"Unverified\",\n passwordChange: \"Must change password\",\n deletion: \"Deletion requested\",\n deletionOn: (date: string) => `Deletion on ${date}`,\n} satisfies Required<AccountStateLabels>;\n", "import { useKitLabels, type LabelOverride } from \"../i18n/kit-labels\";\nimport type { SettingsGroupLabels } from \"../settings/settings-labels\";\n\n/**\n * The `adminArea` namespace (0.42, docs/admin-harmonization.md \u00A73.1): the kit's words of\n * the admin area every app shares \u2014 the account menu's \"Administration\" row, the 403\n * page, the shared sections' names and help lines, the overview's tiles and the Tools\n * list. A module of words with no component code, like every `*-labels.ts` (0.34, KS U8).\n * An app's own sections and tiles bring their own words.\n */\n\n/** The sections every app's admin area shares, in the template's order (\u00A72.3). */\nexport type AdminSharedSection = \"overview\" | \"users\" | \"invitations\" | \"billing\" | \"activity\";\n\n/** The overview's shared tiles (\u00A72.4, \u00A76.1). */\nexport interface AdminTileLabels {\n /** `feedback_waiting`: OPEN reports, crash reports included (\u00A76.1). */\n feedbackWaiting: string;\n /** `deletion_requests`. */\n deletionRequests: string;\n /** `invitations_pending`. */\n invitationsPending: string;\n /** `users_total`. */\n users: string;\n /** `users_new_7d`, the line under the users tile. */\n usersNew: (count: number) => string;\n /** 0.46 (Kurvenschmiede 1, admin \u00A79.5): server-kit's `awaiting_verdict` as an `extra`\n * tile \u2014 answered reports that wait on a verdict (IN_EVALUATION, NEEDS_LIVE_TEST). */\n awaitingVerdict: string;\n /** Its line under the count. */\n awaitingVerdictHint: string;\n /** 0.46: server-kit's `released_for_work` \u2014 the reports released for the work queue. */\n releasedForWork: string;\n /** Its line under the count. */\n releasedForWorkHint: string;\n}\n\nexport interface AdminAreaLabels {\n /** \"Administration\": the account menu's row, and the admin page's heading. */\n title: string;\n /** The row's waiting count, for a reader (\"Administration, 3 waiting\"); the eye sees\n * the number in the badge. */\n waiting: (count: number) => string;\n /**\n * 0.45 (admin \u00A79.3.4): a button's whole name with its count \u2014 \"Platform, 2 waiting\" \u2014\n * for an `IconButton` whose `badge` is an `AdminWaitingBadge`: the badge is decorative\n * there, so the name carries the count. `label` is the button's own name.\n */\n waitingLabel: (label: string, count: number) => string;\n /** The 403 page's heading (\u00A72.2 decision 8). */\n forbiddenTitle: string;\n /**\n * Under it. Says only that THIS area is closed to the account \u2014 never that the person\n * administers nothing anywhere (\u00A76.7: a kastlan superuser who isn't ADMIN in the acting\n * company gets this page).\n */\n forbiddenBody: (appName: string) => string;\n /** The button back to the app's start, unless the app names its own (`homeLabel`). */\n forbiddenHome: string;\n /** A reviewer's second way out, to the translations review. */\n forbiddenReviewer: string;\n /** The shared sections' names and help lines (\u00A72.3 decision 11). */\n sections: Record<AdminSharedSection, SettingsGroupLabels>;\n /** The overview's tiles. */\n tiles: AdminTileLabels;\n /** 0.43: `AdminOverview`'s `error` \u2014 the counts could not be loaded. */\n overviewError: string;\n /** 0.43: its button, which calls `onRetry`. */\n retry: string;\n /** The Tools list's heading and name (\u00A72.5 decision 16). */\n tools: string;\n}\n\nexport const DEFAULT_ADMIN_AREA_LABELS: AdminAreaLabels = {\n title: \"Administration\",\n waiting: (count) => `${count} waiting`,\n waitingLabel: (label, count) => `${label}, ${count} waiting`,\n forbiddenTitle: \"Only for administrators\",\n forbiddenBody: (appName) => `This is where administrators run ${appName}. Your account cannot open this page.`,\n forbiddenHome: \"Go to the start page\",\n forbiddenReviewer: \"Review translations\",\n sections: {\n overview: { title: \"Overview\", help: \"What is waiting, at a glance.\" },\n users: { title: \"Users\", help: \"Who has an account, and what each may do.\" },\n invitations: { title: \"Invitations\", help: \"Invite people by e-mail in their language; resend or revoke what\u2019s still open.\" },\n billing: { title: \"Billing\", help: \"The plan, the payment and the invoices.\" },\n activity: { title: \"Activity\", help: \"What the admins did, newest first.\" },\n },\n tiles: {\n feedbackWaiting: \"To triage\",\n deletionRequests: \"Deletion requests\",\n invitationsPending: \"Pending invitations\",\n users: \"Users\",\n usersNew: (count) => `${count} new in 7 days`,\n awaitingVerdict: \"Awaiting a verdict\",\n awaitingVerdictHint: \"Answered, and waiting for you or the reporter to confirm the fix\",\n releasedForWork: \"Released for work\",\n releasedForWorkHint: \"Ready, rework requested or in progress\",\n },\n overviewError: \"The overview couldn\u2019t be loaded.\",\n retry: \"Try again\",\n tools: \"Tools\",\n};\n\n/**\n * The `adminArea` namespace, resolved \u2014 English, then the provider, then `labels`. What\n * an app reads to hand {@link adminSections} its words from inside a component.\n */\nexport function useAdminAreaLabels(labels?: LabelOverride<AdminAreaLabels>): AdminAreaLabels {\n return useKitLabels(\"adminArea\", DEFAULT_ADMIN_AREA_LABELS, labels);\n}\n", "// The English words of ./mail-test-card, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./mail-test-card re-exports them.\n\nimport { englishRateLimited } from \"../auth/auth-errors\";\nimport type { MailTestCardLabels } from \"./mail-test-card\";\n\n/** docs/admin-harmonization.md \u00A79.2.4, word for word. */\nexport const DEFAULT_MAIL_TEST_CARD_LABELS: MailTestCardLabels = {\n title: \"Test mail\",\n description: \"Sends one mail to your own address, through the transport this installation sends all its mail with.\",\n transport: (backend) => `Transport: ${backend}`,\n action: \"Send a test mail to me\",\n sent: (address) => `Sent to ${address}. Check the inbox.`,\n console: \"The console transport only logs mail; nothing was sent.\",\n failed: \"Could not send. The server log has the provider\u2019s answer.\",\n rateLimited: englishRateLimited,\n keywords: \"test mail email e-mail transport smtp resend console send deliver\",\n};\n", "// The English words of ./sign-out-pending-dialog, in a module with no component code: the\n// English catalogue (src/i18n/defaults.ts) imports them without the component (0.34, KS U8).\n// keksdose's reviewed words (nav.logout_queued_*, account-menu.tsx:247-317) are the canon.\n\nimport type { SignOutPendingDialogLabels } from \"./sign-out-pending-dialog\";\n\nexport const DEFAULT_SIGN_OUT_PENDING_DIALOG_LABELS: SignOutPendingDialogLabels = {\n title: \"Some changes have not been saved to the server yet\",\n lost: (count) =>\n count === 1\n ? \"1 change is still waiting to sync. Logging out clears this device\u2019s copy, and it is the only copy.\"\n : `${count} changes are still waiting to sync. Logging out clears this device\u2019s copy, and it is the only copy.`,\n kept: (count) =>\n count === 1\n ? \"1 change is still waiting to sync. It stays on this device for you and syncs the next time you log in here.\"\n : `${count} changes are still waiting to sync. They stay on this device for you and sync the next time you log in here.`,\n syncNow: \"Sync now\",\n signOutAnyway: \"Log out anyway\",\n discardWaiting: \"Discard waiting changes\",\n cancel: \"Cancel\",\n};\n", "// The English words of ./pwa-update-prompt, in a module with no component code (0.34, KS U8).\n// keksdose's reviewed words (pwa.updateAvailable, pwa.reload) are the canon.\n\nimport type { PwaUpdatePromptLabels } from \"./pwa-update-prompt\";\n\nexport const DEFAULT_PWA_UPDATE_PROMPT_LABELS: PwaUpdatePromptLabels = {\n updateAvailable: \"A new version is available.\",\n reload: \"Reload\",\n};\n", "// The English words of ./shared-computer, in a module with no component code (0.34, KS U8).\n\nimport type { SharedComputerLabels } from \"./shared-computer\";\n\nexport const DEFAULT_SHARED_COMPUTER_LABELS: SharedComputerLabels = {\n label: \"This is a shared computer\",\n hint: \"No copy of your data stays on this device. Pages then open only with a connection.\",\n};\n", "import { useKitLabels, type LabelOverride } from \"../i18n/kit-labels\";\n\n/**\n * The `topBarParts` namespace (0.42, docs/top-bar-harmonization.md \u00A73.1): the words of the\n * top bar's shared parts \u2014 `TourMenu`, `SyncStatusIndicator` and `DevSwitchers`. A module\n * of words with no component code, like every `*-labels.ts` (0.34, KS U8). The language\n * sub-list (`AccountMenuLanguage`) names itself with `topBar.language`, and the dev role\n * switcher's name and tooltip are `topBar.switchRole` / `topBar.role`, as `RoleSwitcher`'s.\n */\n\n/** `TourMenu`'s words (\u00A72.4). */\nexport interface TourMenuLabels {\n /** The compass's name, and the menu's. */\n menu: string;\n /** The NEW dot on the compass, for a reader: it joins the trigger's name. */\n newDot: string;\n /** The heading over the tours that start on the open page. */\n thisPage: string;\n /** The heading over the untaken new tours. */\n newTours: string;\n /** The last row, the way to the app's tours page (only with `href`). */\n allTours: string;\n /** The chip on a new tour's row. */\n badgeNew: string;\n /** What the \u2713 on a taken tour's row says to a reader. */\n completed: string;\n /** The chip on a tour reset by an update (0.43, docs/tours-harmonization.md \u00A78). */\n badgeUpdated: string;\n /** The dot on the compass while only updated tours light it, for a reader. */\n updatedDot: string;\n /** The heading over the untaken new tours when updated ones are among them. */\n newAndUpdated: string;\n}\n\n/** `SyncStatusIndicator`'s words (\u00A72.6). The \"waiting for a plan\" state is\n * `billing.waitingChanges`, the kit's words for it since billing \u00A712.5. */\nexport interface SyncStatusLabels {\n /** Writes this device cannot send (keksdose: no key for the budget). Ranked first. */\n blocked: (count: number) => string;\n offline: string;\n /** The server refused the last round. */\n refused: string;\n syncing: string;\n pending: (count: number) => string;\n /** Settled, with the time of the last good round (already formatted). */\n syncedAt: (time: string) => string;\n /** Settled, before the first round. */\n idle: string;\n /** Joined to the state when a tap syncs: what the tap does. */\n syncHint: string;\n /** Joined to the state while offline, when a tap can do nothing. */\n offlineHint: string;\n /** The state and what a tap does, as one tooltip: \"Offline \u2014 nothing to sync\u2026\". */\n withHint: (state: string, hint: string) => string;\n /** The state with the app's `scope` words before it: \"Handovers on this device: \u2026\". */\n scoped: (scope: string, state: string) => string;\n /** The short words beside the cloud (`showLabel`): offline. */\n offlineShort: string;\n /** The short words while syncing. */\n syncingShort: string;\n /** The short words while changes wait (pending, held for a plan, or blocked). */\n waitingShort: (count: number) => string;\n /** The short words after a refused round. */\n refusedShort: string;\n /** Offline in an online-only app (`storage=\"none\"`): nothing is kept on the device. */\n offlineUnsaved: string;\n /** A round under way in an online-only app \u2014 it saves, it doesn't sync. Also its short\n * words beside the cloud. */\n saving: string;\n}\n\n/** `DevSwitchers`' words (\u00A72.7, \u00A76.2, \u00A76.3). */\nexport interface DevSwitchersLabels {\n /** The heading of the role menu. */\n roleHeading: string;\n /** The plan switcher's name. */\n switchPlan: string;\n /** The plan switcher's tooltip, given the active plan. */\n plan: (value: string) => string;\n /** The heading of the plan menu. */\n planHeading: string;\n /** The row back to the role the session started with. */\n backTo: (role: string) => string;\n /** The plan menu's note while billing is off locally. */\n billingOff: string;\n}\n\nexport interface TopBarPartsLabels {\n tours: TourMenuLabels;\n sync: SyncStatusLabels;\n dev: DevSwitchersLabels;\n}\n\nexport const DEFAULT_TOP_BAR_PARTS_LABELS: TopBarPartsLabels = {\n tours: {\n menu: \"Guided tours\",\n newDot: \"New tours\",\n thisPage: \"On this page\",\n newTours: \"New tours\",\n allTours: \"All tours\u2026\",\n badgeNew: \"New\",\n completed: \"Completed\",\n badgeUpdated: \"Updated\",\n updatedDot: \"Updated tours\",\n newAndUpdated: \"New and updated\",\n },\n sync: {\n blocked: (count) =>\n count === 1\n ? \"1 change cannot be sent from this device\"\n : `${count} changes cannot be sent from this device`,\n offline: \"Offline \u2014 changes are saved on this device and will sync when you reconnect\",\n refused: \"The server refused the last sync\",\n syncing: \"Syncing\u2026\",\n pending: (count) => (count === 1 ? \"1 change waiting to sync\" : `${count} changes waiting to sync`),\n syncedAt: (time) => `Synced at ${time}`,\n idle: \"Up to date\",\n syncHint: \"Tap to sync now\",\n offlineHint: \"nothing to sync while offline\",\n withHint: (state, hint) => `${state} \u2014 ${hint}`,\n scoped: (scope, state) => `${scope}: ${state}`,\n offlineShort: \"Offline\",\n syncingShort: \"Syncing\u2026\",\n waitingShort: (count) => `${count} waiting`,\n refusedShort: \"Not synced\",\n offlineUnsaved: \"Offline \u2014 changes can't be saved until you reconnect\",\n saving: \"Saving\u2026\",\n },\n dev: {\n roleHeading: \"Dev \u00B7 role\",\n switchPlan: \"Switch plan\",\n plan: (value) => `Plan: ${value}`,\n planHeading: \"Dev \u00B7 plan\",\n backTo: (role) => `Back to ${role}`,\n billingOff: \"Billing is off locally: plans change nothing\",\n },\n};\n\n/** The `topBarParts` namespace, resolved \u2014 English, then the provider, then `labels`. */\nexport function useTopBarPartsLabels(labels?: LabelOverride<TopBarPartsLabels>): TopBarPartsLabels {\n return useKitLabels(\"topBarParts\", DEFAULT_TOP_BAR_PARTS_LABELS, labels);\n}\n", "// The English words of ./share-card, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./share-card re-exports them.\n\nimport type { ShareCardLabels } from \"./share-card\";\n\nexport const DEFAULT_SHARE_CARD_LABELS: ShareCardLabels = {\n dialogTitle: \"Share\",\n close: \"Close\",\n email: \"Email address\",\n emailOptional: \"Email address (optional)\",\n emailPlaceholder: \"name@example.com\",\n invalidEmail: \"Enter a complete email address.\",\n role: \"Role\",\n roleOf: (name) => `Role of ${name}`,\n add: \"Share\",\n whoHasAccess: \"Who has access\",\n nobodyYet: \"Nobody else has access yet.\",\n pending: \"Pending\",\n openInvite: \"Open invite link\",\n copyLink: \"Copy link\",\n team: \"Team\",\n teamHint: (name) => `Everyone in ${name} gets access.`,\n remove: \"Remove access\",\n removeConfirm: (name) => `Remove access for ${name}?`,\n revokePending: \"Withdraw invitation\",\n revokePendingConfirm: (name) => `Withdraw the invitation for ${name}?`,\n failed: \"That did not work. Please try again.\",\n loading: \"Loading\u2026\",\n};\n", "// The English words of ./reauth-dialog, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./reauth-dialog re-exports them.\n\nimport type { ReauthDialogLabels } from \"./reauth-dialog\";\n\nexport const DEFAULT_REAUTH_DIALOG_LABELS: ReauthDialogLabels = {\n title: \"Confirm it\u2019s you\",\n description: \"Enter your current password to continue.\",\n password: \"Current password\",\n submit: \"Continue\",\n cancel: \"Cancel\",\n};\n", "// The English words of ./server-wake, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./server-wake re-exports them.\n\nimport type { ServerWakeLabels } from \"./server-wake\";\n\nexport const DEFAULT_SERVER_WAKE_LABELS: ServerWakeLabels = {\n slow: \"Still loading \u2014 this is taking longer than usual.\",\n waking: (appName) =>\n `The server goes to sleep when nobody is using ${appName ?? \"the app\"}, so the first request after a break has to start it again. That can take a moment \u2014 nothing is lost, the page fills in by itself.`,\n};\n", "import type { ReviewStatus } from \"../lib/translation-review\";\n\n/**\n * The `translationReview` namespace: every word of the translation-review parts\n * (`ReviewStatusChip`, `TranslationProgress`, `TranslationLocaleTabs`,\n * `TranslationExportButton`, `TranslationReviewEditor`, `TranslationReviewPanel`).\n *\n * Its own module, like `data-table-labels.ts`: `kit-labels.tsx` and `defaults.ts` import\n * it, and neither has to load the components to get the words. The English is keksdose's\n * and kastlan's own (`translation_review.*`, `translations:*`), British.\n */\nexport interface TranslationReviewLabels {\n /** The five statuses \u2014 the chip, the filter, the progress legend. */\n statusMissing: string;\n statusUnreviewed: string;\n statusChanged: string;\n statusNeedsChange: string;\n statusApproved: string;\n /** Accessible name of the status filter. */\n statusFilter: string;\n /** The status filter's first option. */\n all: string;\n /** A status filter option with its count: \"Unreviewed \u00B7 12\". */\n filterCount: (label: string, count: number) => string;\n /** The source filter's label \u2014 shown only when the rows come from several sources\n * (kastlan's screen texts and documents). */\n source: string;\n allSources: string;\n /** The namespace filter's label and its \"every one\" option. */\n namespace: string;\n allNamespaces: string;\n search: string;\n /** The placeholder filter, with how many rows it would show. */\n placeholdersOnly: (count: number) => string;\n /** The chip on a row whose placeholders differ from the reference's. */\n placeholderChip: string;\n /** The key column, and the key's caption in the editor. */\n key: string;\n statusColumn: string;\n /** No row matches the filters. */\n empty: string;\n /** In place of the text of a string the locale lacks. */\n missingText: string;\n /** The progress bar's label. */\n progress: (approved: number, total: number) => string;\n /** A locale tab's badge. */\n localeProgress: (approved: number, total: number) => string;\n /** Accessible name of the locale tabs. */\n locales: string;\n approve: string;\n /** Send a string back: \"Needs a change\". */\n flag: string;\n /** \"Needs a change\" for a MISSING string: the suggestion is the translation to add. */\n suggest: string;\n /** 0.46 (keksdose B2/S3): the desktop row's button that OPENS the editor to send a\n * string back \u2014 its own name, apart from the editor's `flag`, which saves. */\n flagRow: string;\n /** The same for a MISSING string: opens the editor to add the translation. */\n suggestRow: string;\n /** Clear a verdict: back to unreviewed. */\n reset: string;\n /** The editor's way out without saving. */\n cancel: string;\n approveSelected: string;\n resetSelected: string;\n /** Selects every row the filters show \u2014 the phone's way into the bulk actions, where\n * the table has no checkboxes. */\n selectShown: string;\n /** Over the old wording of a row that changed since its verdict. */\n changedSince: string;\n reviewedWording: string;\n reviewedReference: string;\n /** The placeholders differ: the reference's and the text's, each a list. */\n placeholderMismatch: (reference: string, text: string) => string;\n lastApproved: (name: string, date: string) => string;\n lastFlagged: (name: string, date: string) => string;\n /** The reviewer's name once the account is gone \u2014 what `name` above becomes. */\n erasedReviewer: string;\n /** The editor's wording field, opened on the current text. */\n suggestion: string;\n /** The same field for a missing string. */\n translation: string;\n note: string;\n notePlaceholder: string;\n /** The viewer may read this locale but not review it. */\n readOnly: string;\n /** The reviewer is limited to some areas \u2014 `areas` is their names, joined. */\n scope: (areas: string) => string;\n exportCorrections: (count: number) => string;\n /** A callback rejected and no `formatError` says better. */\n failed: string;\n /** 0.25: the Undo toast after an approval (`undo`) \u2014 one string, or a batch of them. */\n approvedToast: (count: number) => string;\n /** 0.25: a group's header under `groupBy` \u2014 how many of its rows nobody has read yet,\n * of how many the filters show in it. */\n groupCount: (unreviewed: number, total: number) => string;\n /** 0.25: a group's bulk action \u2014 approve its unreviewed rows. */\n approveGroup: (count: number) => string;\n /** 0.25: asked first when a group's bulk approve is larger than a page \u2014 more than the\n * reviewer can have had on screen. `group` is the group's name. */\n confirmGroup: (count: number, group: string) => string;\n /** The Undo toast after a swipe bound to `clear` took a verdict back (keksdose, live\n * #377 rework: the swipes bound in its settings) \u2014 one string, or a batch of them.\n * The swipe itself is named by {@link reset}. */\n clearedToast: (count: number) => string;\n}\n\nexport const DEFAULT_TRANSLATION_REVIEW_LABELS: TranslationReviewLabels = {\n statusMissing: \"Missing\",\n statusUnreviewed: \"Unreviewed\",\n statusChanged: \"Changed since review\",\n statusNeedsChange: \"Needs a change\",\n statusApproved: \"Approved\",\n statusFilter: \"Status\",\n all: \"All\",\n filterCount: (label, count) => `${label} \u00B7 ${count}`,\n source: \"Texts\",\n allSources: \"All texts\",\n namespace: \"Area\",\n allNamespaces: \"All areas\",\n search: \"Search keys and text\",\n placeholdersOnly: (count) => `Only placeholder problems (${count})`,\n placeholderChip: \"Placeholders\",\n key: \"Key\",\n statusColumn: \"Status\",\n empty: \"No strings match these filters.\",\n missingText: \"Missing in this language\",\n progress: (approved, total) => `${approved} of ${total} approved`,\n localeProgress: (approved, total) => `${approved}/${total}`,\n locales: \"Languages\",\n approve: \"Approve\",\n flag: \"Needs a change\",\n suggest: \"Suggest translation\",\n flagRow: \"Flag for a change\u2026\",\n suggestRow: \"Add a translation\u2026\",\n reset: \"Mark unreviewed\",\n cancel: \"Cancel\",\n approveSelected: \"Approve selected\",\n resetSelected: \"Mark selected unreviewed\",\n selectShown: \"Select all shown\",\n changedSince: \"This string changed after it was reviewed. Please read it again.\",\n reviewedWording: \"Wording when reviewed\",\n reviewedReference: \"Reference when reviewed\",\n placeholderMismatch: (reference, text) =>\n `The placeholders differ from the reference \u2014 reference: ${reference}; this text: ${text}. The app fills these in, so they must stay exactly as they are.`,\n lastApproved: (name, date) => `Approved by ${name} on ${date}`,\n lastFlagged: (name, date) => `Marked as needing a change by ${name} on ${date}`,\n erasedReviewer: \"a deleted account\",\n suggestion: \"Better wording\",\n translation: \"Translation\",\n note: \"Note (optional)\",\n notePlaceholder: \"What is wrong, or what to keep in mind\",\n readOnly: \"You can read this language but not review it.\",\n scope: (areas) => `Your review is limited to: ${areas}.`,\n exportCorrections: (count) => `Export corrections (${count})`,\n failed: \"That did not work. Please try again.\",\n approvedToast: (count) => (count === 1 ? \"String approved\" : `${count} strings approved`),\n groupCount: (unreviewed, total) => `${unreviewed} unreviewed / ${total}`,\n approveGroup: (count) => `Approve unreviewed (${count})`,\n confirmGroup: (count, group) =>\n count === 1\n ? `Approve the unreviewed string in ${group}?`\n : `Approve all ${count} unreviewed strings in ${group}, including those not on screen?`,\n clearedToast: (count) => (count === 1 ? \"String marked unreviewed\" : `${count} strings marked unreviewed`),\n};\n\n/** A status's word, from the namespace's five. */\nexport function reviewStatusLabel(labels: TranslationReviewLabels, status: ReviewStatus): string {\n switch (status) {\n case \"missing\":\n return labels.statusMissing;\n case \"unreviewed\":\n return labels.statusUnreviewed;\n case \"changed\":\n return labels.statusChanged;\n case \"needs_change\":\n return labels.statusNeedsChange;\n case \"approved\":\n return labels.statusApproved;\n }\n}\n", "// The English words of ./country-select, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./country-select re-exports them.\n\nimport type { CountrySelectLabels } from \"./country-select\";\n\nexport const DEFAULT_COUNTRY_SELECT_LABELS: CountrySelectLabels = {\n country: \"Country\",\n search: \"Search country\",\n others: \"Other countries\",\n};\n", "// The English words of ./inline-edit-field, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./inline-edit-field re-exports them.\n\nimport type { InlineEditLabels } from \"./inline-edit-field\";\n\nexport const DEFAULT_INLINE_EDIT_LABELS: InlineEditLabels = {\n edit: (label) => `Edit ${label}`,\n failed: \"The change could not be saved.\",\n empty: \"Empty\",\n};\n", "// The English words of ./iban-input, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./iban-input re-exports them.\n\nimport type { IbanInputLabels } from \"./iban-input\";\n\nexport const DEFAULT_IBAN_INPUT_LABELS: IbanInputLabels = {\n format: \"An IBAN starts with a two-letter country code and two check digits.\",\n country: (code) => `\u201C${code}\u201D is not the country code of an IBAN.`,\n length: (actual, expected) =>\n `An IBAN from this country has ${expected} characters \u2014 this one has ${actual}.`,\n checksum: \"The check digits don\u2019t match \u2014 a character is probably mistyped.\",\n qrRequired: \"This is a regular IBAN. A QR-bill needs the account\u2019s QR-IBAN.\",\n qrNotAllowed: \"This is a QR-IBAN, which only receives QR-bill payments. Enter the account\u2019s regular IBAN.\",\n};\n", "// The English words of ./phone-input, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./phone-input re-exports them.\n\nimport type { PhoneInputLabels } from \"./phone-input\";\n\nexport const DEFAULT_PHONE_INPUT_LABELS: PhoneInputLabels = {\n countryCode: \"Country code\",\n other: \"Other\",\n};\n", "// The English words of ./sign-chip, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./sign-chip re-exports them.\n\nimport type { SignChipLabels } from \"./sign-chip\";\n\nexport const DEFAULT_SIGN_CHIP_LABELS: SignChipLabels = {\n outflow: \"Outflow\",\n inflow: \"Inflow\",\n direction: (current, next) => `Direction: ${current} \u2014 switch to ${next}`,\n switchTo: (next) => `Switch to ${next}`,\n};\n", "// The English words of ./column-mapper, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./column-mapper re-exports them.\n\nimport type { ColumnMapperLabels } from \"./column-mapper\";\n\n/** {@link ColumnMapperLabels.requiredRoleShort}'s English \u2014 and its fallback for a\n * provider whose labels predate the key. */\nexport const markedShort = (role: string) => `${role} *`;\n\nexport const DEFAULT_COLUMN_MAPPER_LABELS: ColumnMapperLabels = {\n paste: \"Paste a table\",\n pasteHint:\n \"Copy the rows out of a spreadsheet and paste them here, or drop a CSV or text file.\",\n chooseFile: \"Choose a file\",\n readError: (name) => `\u201C${name}\u201D could not be read`,\n headerRow: \"The first line names the columns\",\n summary: (columns, rows) =>\n `${columns} ${columns === 1 ? \"column\" : \"columns\"}, ${rows} ${rows === 1 ? \"row\" : \"rows\"}`,\n separatorSemicolon: \"separated by semicolons\",\n separatorComma: \"separated by commas\",\n separatorTab: \"separated by tabs\",\n separatorSpace: \"separated by spaces\",\n decimalComma: \"decimal comma (1,5)\",\n decimalPoint: \"decimal point (1.5)\",\n unreadCount: (count) =>\n count === 1\n ? \"1 line could not be read\"\n : `${count} lines could not be read`,\n unreadLine: (line) => `Line ${line} could not be read`,\n unreadMore: (count) => `\u2026and ${count} more`,\n noRows: \"No line of this text reads as a row of the table.\",\n table: \"Columns and their roles\",\n columnN: (n) => `Column ${n}`,\n roleOf: (column) => `What does column \u201C${column}\u201D hold?`,\n ignore: \"Ignore\",\n requiredRole: (role) => `${role} (required)`,\n requiredRoleShort: markedShort,\n previewOf: (shown, total) =>\n shown === 1\n ? `The first of ${total} rows`\n : `The first ${shown} of ${total} rows`,\n oneOf: (roles) => `either ${roles}`,\n missing: (roles) => `Still needed: ${roles}.`,\n};\n", "// The words of the notification cards (docs/notifications-harmonization.md \u00A74.2), in a\n// module with no component code: the English catalogue (src/i18n/defaults.ts) imports\n// them without the components, so `en` loads as one chunk like the other languages\n// (0.34, KS U8). The cards read it through `useKitLabels(\"notifications\", \u2026)`.\n\n/** The ten IANA regions `Intl` lists zones under \u2014 keksdose's `tz_region_*` \u2014 in the\n * kit's words. A region a runtime adds later keeps its IANA name. */\nexport interface NotificationRegionLabels {\n Africa: string;\n America: string;\n Antarctica: string;\n Arctic: string;\n Asia: string;\n Atlantic: string;\n Australia: string;\n Europe: string;\n Indian: string;\n Pacific: string;\n}\n\n/**\n * Every string the notification parts render \u2014 the `notifications` namespace of\n * `<UiKitProvider labels>`, overridable per instance through `labels`: the types card,\n * quiet hours and the zone picker, this device's push, the device list, and the\n * unsubscribe page. Cancel is `common.cancel`.\n */\nexport interface NotificationsLabels {\n /* \u2500\u2500 The types card \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n /** The types card's title. */\n typesTitle: string;\n /** The line under it. */\n typesDescription: string;\n /** @deprecated 0.46 \u2014 the card's channels are columns now (`channelEmail`); removed in 0.47. Unused,\n * kept so an app's override still type-checks. */\n byEmail: string;\n /** 0.46 (\u00A710.2): the channel columns' headings, and each switch's name. */\n channelApp: string;\n channelPush: string;\n channelEmail: string;\n /** Under every e-mail switch while the account's address is unverified (decision 16):\n * no notification mail goes to an unverified address. */\n emailUnverified: string;\n /** The digest's cadence select. */\n digestCadence: string;\n digestWeekly: string;\n digestMonthly: string;\n /** While the settings load. */\n typesLoading: string;\n /** The server answered no types for this account. */\n typesEmpty: string;\n\n /* \u2500\u2500 Quiet hours \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n quietTitle: string;\n /** The line under the title; `inbox`: the app keeps an inbox, which a held push still\n * reaches; `held` (0.46, \u00A710.4): the app queues a held push and sends it when the\n * window ends, instead of dropping it. */\n quietDescription: (inbox: boolean, held?: boolean) => string;\n /** 0.46 (\u00A710.3, automatic only): the card names the account's zone, read-only, given\n * the zone as `zoneName` writes it (\"Europe / Zurich\"); it follows the device last used. */\n quietZone: (zone: string) => string;\n /** The start time's label. */\n quietFrom: string;\n /** The end time's label. */\n quietUntil: string;\n /** One time set, the other not: quiet hours fail open until both are. */\n quietIncomplete: string;\n /** The zone picker's label. */\n timeZone: string;\n /** @deprecated 0.46 \u2014 the zone is automatic (\u00A710.3), the card offers no device zone; removed in 0.47.\n * Unused, kept so an app's override still type-checks. */\n deviceZone: (zone: string) => string;\n /** @deprecated 0.46 \u2014 the zone is automatic (\u00A710.3), nothing to take; removed in 0.47. Unused, kept\n * so an app's override still type-checks. */\n useDeviceZone: string;\n /** The zone's region headings, in the picker and in a zone's name (\"Europe / Zurich\"). */\n regions: NotificationRegionLabels;\n\n /* \u2500\u2500 This device \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n pushTitle: string;\n pushDescription: string;\n /** The browser has no push. */\n unsupported: string;\n /** iOS outside the installed app, given the app's name. */\n iosInstall: (app: string) => string;\n /** The server has no VAPID keys. */\n notConfigured: string;\n /** The browser's permission is denied. */\n blocked: string;\n /** This device gets notifications for the signed-in account. */\n on: string;\n off: string;\n /** This browser's subscription belongs to another account. */\n otherAccount: string;\n enable: string;\n disable: string;\n sendTest: string;\n /** Turning on did not finish (the permission prompt dismissed, a refusal). */\n enableFailed: string;\n /** No service worker, or one that is not ready in 10 s. */\n noServiceWorker: string;\n /** The browser's push service did not answer in 15 s. */\n pushTimeout: string;\n /** Given how many devices the push service accepted the test for (\u2265 1). */\n testSent: (count: number) => string;\n /** The test reached no device. */\n testNone: string;\n testFailed: string;\n /** The explainer before the browser's one permission prompt. */\n explainerTitle: string;\n explainerBody: (app: string) => string;\n explainerHint: string;\n explainerContinue: string;\n\n /* \u2500\u2500 The device list \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n devicesTitle: string;\n devicesDescription: string;\n devicesLoading: string;\n devicesEmpty: string;\n /** A device whose user agent says nothing the kit recognises. */\n unknownDevice: string;\n /** The chip on this browser's row. */\n thisDevice: string;\n /** Given the registration date, formatted. */\n added: (date: string) => string;\n /** Given the last accepted delivery, formatted. */\n lastDelivery: (date: string) => string;\n noDelivery: string;\n /** Given the failed deliveries in a row (\u2265 1). */\n failures: (count: number) => string;\n /** A row's button, visible text \u2014 and the confirm's answer. */\n remove: string;\n /** The same button's accessible name, given the device: it starts with `remove`. */\n removeItem: (device: string) => string;\n /** The question the row asks before it removes. */\n removePrompt: string;\n /** 0.46 (\u00A710.2): the disclosure on a device's row listing the types with push on. */\n deviceTypes: string;\n /** The line inside it. */\n deviceTypesDescription: string;\n /** No type has push on for the account. */\n deviceTypesEmpty: string;\n\n /* \u2500\u2500 The inbox and the bell (0.46, \u00A710.1) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n /** The inbox's heading (keksdose's \"Inbox\"). */\n inboxTitle: string;\n inboxLoading: string;\n /** Nothing in the inbox. */\n inboxEmpty: string;\n markAllRead: string;\n /** The header's clear button, and the confirm's answer. */\n clearAll: string;\n /** The question asked before the inbox is cleared. */\n clearPrompt: string;\n /** The row that loads the next page. */\n showMore: string;\n /** The bell's name. */\n bellLabel: string;\n /** Read after the bell's name, given the unread count (\u2265 1). */\n bellUnread: (count: number) => string;\n /** The bell panel's link to the app's inbox. */\n allNotifications: string;\n\n /* \u2500\u2500 The unsubscribe page \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n unsubscribeTitle: string;\n /** Given the type's name in the app's words. */\n unsubscribeAbout: (type: string) => string;\n /** No type name to give. */\n unsubscribeGeneric: string;\n stopThese: string;\n stopAll: (app: string) => string;\n stoppedThese: string;\n stoppedAll: (app: string) => string;\n /** Account mail is not a notification, and keeps coming. */\n accountMail: string;\n turnBackOn: string;\n openSettings: string;\n /** A token the server refused, or one that does not parse. */\n invalidLink: string;\n\n /* \u2500\u2500 Every card \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n /** A request failed, and the app had no words of its own. */\n failed: string;\n}\n\nexport const DEFAULT_NOTIFICATIONS_LABELS: NotificationsLabels = {\n typesTitle: \"Notify me about\",\n typesDescription: \"Choose what you hear about, and how.\",\n byEmail: \"By e-mail\",\n channelApp: \"In the app\",\n channelPush: \"Push\",\n channelEmail: \"E-mail\",\n emailUnverified: \"Confirm your address to receive these.\",\n digestCadence: \"Frequency\",\n digestWeekly: \"Weekly\",\n digestMonthly: \"Monthly\",\n typesLoading: \"Loading notification settings\u2026\",\n typesEmpty: \"There are no notifications for this account.\",\n\n quietTitle: \"Quiet hours\",\n quietDescription: (inbox, held) =>\n held\n ? inbox\n ? \"Push notifications wait during this window and arrive when it ends. They reach your inbox at once.\"\n : \"Push notifications wait during this window and arrive when it ends.\"\n : inbox\n ? \"No push notifications during this window. They still reach your inbox.\"\n : \"No push notifications during this window.\",\n quietZone: (zone) => `In your time zone (${zone}), which follows the device you last used.`,\n quietFrom: \"From\",\n quietUntil: \"Until\",\n quietIncomplete: \"Set both a start and an end time. Quiet hours take effect once both are set.\",\n timeZone: \"Time zone\",\n deviceZone: (zone) => `This device is in ${zone}.`,\n useDeviceZone: \"Use it\",\n regions: {\n Africa: \"Africa\",\n America: \"Americas\",\n Antarctica: \"Antarctica\",\n Arctic: \"Arctic\",\n Asia: \"Asia\",\n Atlantic: \"Atlantic\",\n Australia: \"Australia\",\n Europe: \"Europe\",\n Indian: \"Indian Ocean\",\n Pacific: \"Pacific\",\n },\n\n pushTitle: \"Push notifications\",\n pushDescription: \"Notifications on this device, also while the app is closed.\",\n unsupported: \"This browser doesn\u2019t support push notifications.\",\n iosInstall: (app) =>\n `On iPhone or iPad, add ${app} to your Home Screen first: iOS delivers notifications only to the installed app.`,\n notConfigured: \"Push notifications aren\u2019t set up on this server.\",\n blocked: \"Notifications are blocked in this browser\u2019s settings.\",\n on: \"Notifications are on for this device.\",\n off: \"Notifications are off for this device.\",\n otherAccount:\n \"This browser gets notifications for another account. Turn them on here to get them for the account you\u2019re signed in with.\",\n enable: \"Turn on notifications\",\n disable: \"Turn off\",\n sendTest: \"Send a test\",\n enableFailed: \"Couldn\u2019t turn on notifications.\",\n noServiceWorker: \"Couldn\u2019t reach the app\u2019s service worker. Reload the page and try again.\",\n pushTimeout: \"The browser\u2019s push service didn\u2019t answer. Check your connection and try again.\",\n testSent: (count) => (count === 1 ? \"Test sent to 1 device\" : `Test sent to ${count} devices`),\n testNone: \"No device accepted the test. Turn notifications on for this device first.\",\n testFailed: \"Couldn\u2019t send a test notification.\",\n explainerTitle: \"Turn on notifications?\",\n explainerBody: (app) =>\n `${app} sends a notification only for the kinds you choose, and you can turn them off at any time.`,\n explainerHint: \"Your browser asks for permission next.\",\n explainerContinue: \"Continue\",\n\n devicesTitle: \"Notification devices\",\n devicesDescription: \"Every device that gets push notifications for your account. Remove any you no longer use.\",\n devicesLoading: \"Loading devices\u2026\",\n devicesEmpty: \"No device gets notifications yet.\",\n unknownDevice: \"Unknown device\",\n thisDevice: \"This device\",\n added: (date) => `Added ${date}`,\n lastDelivery: (date) => `Last delivery ${date}`,\n noDelivery: \"No delivery yet\",\n failures: (count) =>\n count === 1 ? \"1 failed delivery in a row\" : `${count} failed deliveries in a row`,\n remove: \"Remove\",\n removeItem: (device) => `Remove ${device}`,\n removePrompt: \"Stop sending notifications to this device?\",\n deviceTypes: \"Types on this device\",\n deviceTypesDescription: \"Turn a type off to mute it on this device only.\",\n deviceTypesEmpty: \"No type has push notifications turned on.\",\n\n inboxTitle: \"Inbox\",\n inboxLoading: \"Loading notifications\u2026\",\n inboxEmpty: \"You\u2019re all caught up.\",\n markAllRead: \"Mark all as read\",\n clearAll: \"Clear all\",\n clearPrompt: \"Delete all notifications from your inbox?\",\n showMore: \"Show more\",\n bellLabel: \"Notifications\",\n bellUnread: (count) => `${count} unread`,\n allNotifications: \"All notifications\",\n\n unsubscribeTitle: \"E-mail notifications\",\n unsubscribeAbout: (type) => `You get e-mails about: ${type}.`,\n unsubscribeGeneric: \"You get notification e-mails.\",\n stopThese: \"Stop these e-mails\",\n stopAll: (app) => `Stop all notification e-mails from ${app}`,\n stoppedThese: \"Done. You won\u2019t get these e-mails any more.\",\n stoppedAll: (app) => `Done. You won\u2019t get notification e-mails from ${app} any more.`,\n accountMail: \"E-mails about your account still come.\",\n turnBackOn: \"You can turn them back on at any time in Settings.\",\n openSettings: \"Open Settings\",\n invalidLink: \"This link doesn\u2019t work any more. You can turn e-mails off in Settings instead.\",\n\n failed: \"That didn\u2019t work. Please try again.\",\n};\n", "// The English words of the eleven namespaces the provider types itself (./kit-labels),\n// in a module with no provider code: the English catalogue (./defaults) imports them\n// without the React context, as it imports every component's `*-labels.ts`, and\n// ./kit-labels re-exports them under the same names. Until 0.34 they were the rule's\n// exceptions, written in the provider (round 0.34, DOC-6's sev-1 note).\n//\n// Here rather than beside their components: the provider re-exports them, and the\n// catalogues reach the provider, so a module outside `i18n/` would put component\n// directories into every catalogue's graph (`npm run check:graph` refuses that).\n\nimport type {\n AppShellLabels,\n CalculatorLabels,\n ComboboxLabels,\n CommonLabels,\n CurrencyLabels,\n DatePickerLabels,\n FileLabels,\n MultiSelectLabels,\n PickerSheetLabels,\n SwipeableRowLabels,\n TopBarLabels,\n} from \"./kit-labels\";\n\nexport const DEFAULT_COMMON_LABELS: CommonLabels = {\n close: \"Close\",\n clear: \"Clear\",\n search: \"Search\",\n done: \"Done\",\n cancel: \"Cancel\",\n save: \"Save\",\n back: \"Back\",\n next: \"Next\",\n remove: \"Remove\",\n loading: \"Loading\u2026\",\n noResults: \"No results\",\n fieldValue: (field, value) => `${field}: ${value}`,\n dismiss: \"Dismiss\",\n opensInNewTab: \"opens in a new tab\",\n aboutField: (field) => `About \u201C${field}\u201D`,\n help: \"Help\",\n};\n\nexport const DEFAULT_DATE_PICKER_LABELS: DatePickerLabels = {\n panel: \"Choose a date\",\n rangePanel: \"Choose a date range\",\n clear: \"Clear\",\n previousDay: \"Previous day\",\n nextDay: \"Next day\",\n today: \"Today\",\n apply: \"Apply\",\n cancel: \"Cancel\",\n presets: \"Quick ranges\",\n};\n\nexport const DEFAULT_COMBOBOX_LABELS: ComboboxLabels = {\n search: \"Search\",\n noResults: \"No results\",\n clear: \"Clear\",\n loading: \"Loading\u2026\",\n create: (query) => `Create \u201C${query}\u201D`,\n selectedCount: (count) => `${count} selected`,\n loadError: \"Couldn\u2019t load results\",\n resultCount: (count) => (count === 1 ? \"1 result\" : `${count} results`),\n minChars: (count) =>\n count === 1 ? \"Type at least 1 character\" : `Type at least ${count} characters`,\n};\n\nexport const DEFAULT_MULTI_SELECT_LABELS: MultiSelectLabels = {\n search: \"Search\",\n selectAll: \"Select all\",\n clear: \"Clear\",\n all: \"All\",\n selectedCount: (count) => String(count),\n};\n\nexport const DEFAULT_CALCULATOR_LABELS: CalculatorLabels = {\n open: \"Open calculator\",\n panel: \"Calculator\",\n calculation: \"Calculation\",\n backspace: \"Backspace\",\n clear: \"Clear\",\n equals: \"Equals\",\n done: \"Done\",\n plus: \"Plus\",\n minus: \"Minus\",\n times: \"Times\",\n divide: \"Divide\",\n decimal: \"Decimal point\",\n};\n\nexport const DEFAULT_CURRENCY_LABELS: CurrencyLabels = {\n currency: \"Currency\",\n search: \"Search currency\",\n};\n\nexport const DEFAULT_APP_SHELL_LABELS: AppShellLabels = {\n collapse: \"Collapse sidebar\",\n expand: \"Expand sidebar\",\n toggleGroup: (groupLabel) => `${groupLabel}: pages`,\n};\n\nexport const DEFAULT_TOP_BAR_LABELS: TopBarLabels = {\n theme: \"Toggle theme\",\n palette: \"Appearance preset\",\n language: \"Language\",\n switchRole: \"Switch role\",\n role: (value) => `Role: ${value}`,\n};\n\nexport const DEFAULT_PICKER_SHEET_LABELS: PickerSheetLabels = { close: \"Close\", done: \"Done\" };\n\nexport const DEFAULT_SWIPEABLE_ROW_LABELS: SwipeableRowLabels = { actions: \"Row actions\" };\n\n/** Formats with the locale the provider was given (see {@link useKitFileLabels}).\n * This static default has no locale to hand and falls back to the runtime's. */\nexport const DEFAULT_FILE_LABELS: FileLabels = {\n size: (bytes) => formatFileSize(bytes),\n};\n\n/** \"12 kB\", \"3.4 MB\" \u2014 `Intl`'s unit formatting, so the digits, the decimal mark and\n * the unit's spelling all follow `locale`. */\nexport function formatFileSize(bytes: number, locale?: string): string {\n const units = [\"byte\", \"kilobyte\", \"megabyte\", \"gigabyte\"] as const;\n let value = bytes;\n let i = 0;\n while (value >= 1000 && i < units.length - 1) {\n value /= 1000;\n i += 1;\n }\n return new Intl.NumberFormat(locale, {\n style: \"unit\",\n unit: units[i],\n unitDisplay: i === 0 ? \"long\" : \"short\",\n maximumFractionDigits: value < 10 && i > 0 ? 1 : 0,\n }).format(value);\n}\n", "import { DEFAULT_DATA_TABLE_LABELS } from \"../components/data-table-labels\";\nimport { DEFAULT_MINI_CALENDAR_LABELS } from \"../components/mini-calendar-labels\";\nimport { DEFAULT_CALENDAR_HEATMAP_LABELS } from \"../components/calendar-heatmap-labels\";\nimport { DEFAULT_MONTH_PICKER_LABELS } from \"../components/month-picker-labels\";\nimport { DEFAULT_PAGE_CONTENTS_LABELS } from \"../components/page-contents-labels\";\nimport { DEFAULT_POPOVER_LABELS } from \"../components/popover-labels\";\nimport { DEFAULT_CHIP_INPUT_LABELS } from \"../components/chip-labels\";\nimport { DEFAULT_FIELD_SYNC_LABELS } from \"../components/field-sync-labels\";\nimport {\n DEFAULT_CHARACTER_COUNT_LABELS,\n DEFAULT_PASSWORD_REVEAL_LABELS,\n DEFAULT_TABS_LABELS,\n} from \"../components/ui-labels\";\nimport { DEFAULT_WIZARD_LABELS } from \"../wizard/wizard-labels\";\nimport { DEFAULT_TOUR_LABELS } from \"../tour/tour-labels\";\nimport { DEFAULT_TOUR_CATALOGUE_LABELS } from \"../tour/tour-catalogue-labels\";\nimport { DEFAULT_COMMAND_PALETTE_LABELS } from \"../search/command-palette-labels\";\nimport { DEFAULT_GLOBAL_SEARCH_LABELS } from \"../search/global-search-labels\";\nimport { DEFAULT_SERIES_CHART_LABELS } from \"../components/series-chart-labels\";\nimport { DEFAULT_PIE_CHART_LABELS } from \"../components/pie-chart-labels\";\nimport { DEFAULT_SPARKLINE_LABELS } from \"../components/sparkline-labels\";\nimport { DEFAULT_STAT_TILE_LABELS } from \"../components/stat-tile-labels\";\nimport { DEFAULT_SIGNATURE_PAD_LABELS } from \"../components/signature-pad-labels\";\nimport { DEFAULT_PASSWORD_STRENGTH_LABELS } from \"../components/password-strength-labels\";\nimport { DEFAULT_DANGER_CONFIRM_LABELS } from \"../components/danger-confirm-labels\";\nimport { DEFAULT_SWATCH_PICKER_LABELS } from \"../components/swatch-picker-labels\";\nimport { DEFAULT_ICON_PICKER_LABELS } from \"../components/icon-picker-labels\";\nimport { DEFAULT_DIALOG_FRAME_LABELS } from \"../components/dialog-frame-labels\";\nimport { DEFAULT_FILE_PICKER_LABELS } from \"../hooks/use-file-picker-labels\";\nimport { DEFAULT_MEASURED_GRID_LABELS } from \"../components/measured-grid-labels\";\nimport { DEFAULT_CONFIRM_DIALOG_LABELS } from \"../components/confirm-dialog-labels\";\nimport { DEFAULT_FLOATING_PANEL_LABELS } from \"../components/floating-panel-labels\";\nimport { DEFAULT_FEEDBACK_ATTACHMENT_LABELS } from \"../feedback/feedback-attachment-labels\";\nimport { DEFAULT_FEEDBACK_DIALOG_LABELS } from \"../feedback/feedback-dialog-labels\";\nimport {\n DEFAULT_FEEDBACK_COMPOSER_LABELS,\n DEFAULT_FEEDBACK_THREAD_LABELS,\n} from \"../feedback/feedback-thread-labels\";\nimport {\n DEFAULT_FEEDBACK_CATEGORY_LABELS,\n DEFAULT_FEEDBACK_STATUS_LABELS,\n DEFAULT_FEEDBACK_TOAST_LABELS,\n} from \"../feedback/feedback-labels\";\nimport { DEFAULT_FEEDBACK_MENU_LABELS } from \"../feedback/feedback-menu-labels\";\nimport { DEFAULT_FEEDBACK_PUBLIC_LABELS } from \"../feedback/feedback-public-labels\";\nimport { DEFAULT_FEEDBACK_NOTIFICATION_TYPES_LABELS } from \"../notifications/feedback-notification-types-labels\";\nimport { DEFAULT_FEEDBACK_CONTEXT_LABELS } from \"../feedback/feedback-context-labels\";\nimport { DEFAULT_FEEDBACK_PAGE_LABELS } from \"../feedback/feedback-table-labels\";\nimport { DEFAULT_FEEDBACK_DETAIL_LABELS } from \"../feedback/feedback-row-detail-labels\";\nimport {\n DEFAULT_FEEDBACK_COMMENTS_LABELS,\n DEFAULT_FEEDBACK_REPLIES_LABELS,\n DEFAULT_FEEDBACK_VOTE_LABELS,\n} from \"../feedback/feedback-thread-parts-labels\";\nimport { DEFAULT_ACCOUNT_SETTINGS_LABELS } from \"../account/account-settings-labels\";\nimport { DEFAULT_COPY_BUTTON_LABELS } from \"../components/copy-button-labels\";\nimport { DEFAULT_BULK_ACTION_BAR_LABELS } from \"../components/bulk-action-bar-labels\";\nimport { DEFAULT_LIST_LABELS } from \"../components/list-labels\";\nimport { DEFAULT_BREADCRUMBS_LABELS } from \"../components/breadcrumbs-labels\";\nimport { DEFAULT_TOAST_LABELS } from \"../components/toast-labels\";\nimport { DEFAULT_FORM_ACTIONS_LABELS } from \"../components/form-actions-labels\";\nimport { DEFAULT_DESCRIPTION_LIST_LABELS } from \"../components/description-list-labels\";\nimport { DEFAULT_LINE_ITEMS_LABELS } from \"../components/line-items-labels\";\nimport { DEFAULT_PROGRESS_BAR_LABELS } from \"../components/progress-bar-labels\";\nimport { DEFAULT_SIGNED_AMOUNT_LABELS } from \"../components/signed-amount-labels\";\nimport { DEFAULT_ERROR_BOUNDARY_LABELS } from \"../components/error-boundary-labels\";\nimport { DEFAULT_AUTHED_IMAGE_LABELS } from \"../components/authed-image-labels\";\nimport { DEFAULT_IMAGE_GRID_LABELS } from \"../components/image-grid-labels\";\nimport { DEFAULT_LIGHTBOX_LABELS } from \"../components/lightbox-labels\";\nimport { DEFAULT_WRITE_LOCK_LABELS } from \"../components/write-lock-labels\";\nimport { DEFAULT_LEGAL_LABELS } from \"../components/legal-labels\";\nimport { DEFAULT_SIGN_IN_LABELS } from \"../auth/sign-in-form-labels\";\nimport { DEFAULT_REGISTER_LABELS } from \"../auth/register-form-labels\";\nimport { DEFAULT_COMPLETE_NAME_LABELS } from \"../auth/complete-name-dialog-labels\";\nimport { DEFAULT_FORGOT_PASSWORD_LABELS } from \"../auth/forgot-password-form-labels\";\nimport { DEFAULT_RESET_PASSWORD_LABELS } from \"../auth/reset-password-form-labels\";\nimport { DEFAULT_VERIFY_EMAIL_LABELS } from \"../auth/verify-email-labels\";\nimport { DEFAULT_NOT_FOUND_LABELS } from \"../auth/not-found-page-labels\";\nimport { DEFAULT_ACCEPT_INVITATION_LABELS } from \"../auth/accept-invitation-labels\";\nimport { DEFAULT_COMPANY_SWITCHER_LABELS } from \"../shell/company-switcher-labels\";\nimport { DEFAULT_EMAIL_CHANGE_LABELS } from \"../account/email-change-setting-labels\";\nimport { DEFAULT_SESSIONS_LABELS } from \"../account/sessions-setting-labels\";\nimport { DEFAULT_DELETE_ACCOUNT_LABELS } from \"../account/delete-account-setting-labels\";\nimport { DEFAULT_DATA_EXPORT_LABELS } from \"../account/data-export-setting-labels\";\nimport { DEFAULT_USER_ROSTER_LABELS } from \"../admin/user-roster-labels\";\nimport { DEFAULT_ROLE_SELECT_LABELS } from \"../admin/role-select-labels\";\nimport { DEFAULT_REVIEWER_SCOPE_LABELS } from \"../admin/reviewer-scope-editor-labels\";\nimport { DEFAULT_ADMIN_ACTION_LABELS } from \"../admin/admin-action-confirm-labels\";\nimport { DEFAULT_ADMIN_ACTION_LOG_LABELS } from \"../admin/admin-action-log-labels\";\nimport { DEFAULT_TRANSFER_OWNERSHIP_LABELS } from \"../admin/transfer-ownership-dialog-labels\";\nimport { DEFAULT_INVITATIONS_LABELS } from \"../admin/invitations-panel-labels\";\nimport { DEFAULT_SETTINGS_LABELS } from \"../settings/settings-labels\";\nimport { DEFAULT_LANDING_LABELS } from \"../landing/landing-labels\";\nimport { DEFAULT_DEMO_LABELS } from \"../demo/demo-labels\";\nimport { DEFAULT_BILLING_LABELS } from \"../billing/billing-labels\";\nimport { DEFAULT_PLAN_CHANGE_LABELS } from \"../admin/plan-change-labels\";\nimport { DEFAULT_APPEARANCE_LABELS } from \"../components/appearance-labels\";\nimport { DEFAULT_DEVICE_RESET_LABELS } from \"../settings/device-reset-setting-labels\";\nimport { DEFAULT_ROW_ACTIONS_LABELS } from \"../components/row-actions-labels\";\nimport { DEFAULT_APP_SHELL_MORE_LABELS } from \"../shell/app-shell-labels\";\nimport { DEFAULT_ACCOUNT_STATE_LABELS } from \"../components/account-chips-labels\";\nimport { DEFAULT_ADMIN_AREA_LABELS } from \"../admin/admin-area-labels\";\nimport { DEFAULT_MAIL_TEST_CARD_LABELS } from \"../admin/mail-test-card-labels\";\nimport { DEFAULT_SIGN_OUT_PENDING_DIALOG_LABELS } from \"../offline/sign-out-pending-dialog-labels\";\nimport { DEFAULT_PWA_UPDATE_PROMPT_LABELS } from \"../offline/pwa-update-prompt-labels\";\nimport { DEFAULT_SHARED_COMPUTER_LABELS } from \"../offline/shared-computer-labels\";\nimport { DEFAULT_TOP_BAR_PARTS_LABELS } from \"../shell/top-bar-parts-labels\";\nimport { DEFAULT_SHARE_CARD_LABELS } from \"../components/share-card-labels\";\nimport { DEFAULT_REAUTH_DIALOG_LABELS } from \"../components/reauth-dialog-labels\";\nimport { DEFAULT_SERVER_WAKE_LABELS } from \"../components/server-wake-labels\";\nimport { DEFAULT_TRANSLATION_REVIEW_LABELS } from \"../components/translation-review-labels\";\nimport { DEFAULT_COUNTRY_SELECT_LABELS } from \"../components/country-select-labels\";\nimport { DEFAULT_INLINE_EDIT_LABELS } from \"../components/inline-edit-field-labels\";\nimport { DEFAULT_IBAN_INPUT_LABELS } from \"../components/iban-input-labels\";\nimport { DEFAULT_PHONE_INPUT_LABELS } from \"../components/phone-input-labels\";\nimport { DEFAULT_SIGN_CHIP_LABELS } from \"../components/sign-chip-labels\";\nimport { DEFAULT_COLUMN_MAPPER_LABELS } from \"../components/column-mapper-labels\";\nimport { DEFAULT_NOTIFICATIONS_LABELS } from \"../notifications/notifications-labels\";\nimport {\n DEFAULT_APP_SHELL_LABELS,\n DEFAULT_CALCULATOR_LABELS,\n DEFAULT_COMBOBOX_LABELS,\n DEFAULT_COMMON_LABELS,\n DEFAULT_CURRENCY_LABELS,\n DEFAULT_DATE_PICKER_LABELS,\n DEFAULT_FILE_LABELS,\n DEFAULT_MULTI_SELECT_LABELS,\n DEFAULT_PICKER_SHEET_LABELS,\n DEFAULT_SWIPEABLE_ROW_LABELS,\n DEFAULT_TOP_BAR_LABELS,\n} from \"./shared-labels\";\nimport type { UiKitLabels } from \"./kit-labels\";\n\n/**\n * The whole English tree in one object: what a translation is written against, and\n * the `reference` for {@link missingKitLabels}.\n *\n * A separate module from the provider on purpose. Components import the provider's\n * hooks; this file imports the components' defaults. Kept together they would be an\n * import cycle through every component in the kit.\n *\n * Every import here is a module of WORDS \u2014 a `*-labels.ts` beside its component, which\n * the component re-exports (`shared-labels` for the namespaces the provider types\n * itself, which `kit-labels` re-exports) \u2014 never a component. The\n * English catalogue (`locales/en.ts`) is built on this object, so a component imported\n * here rides along with English: in 0.33 that was 79 of them, and an app fetching `en`\n * lazily fetched ~40 chunks of component code with it, where every other language is one\n * (0.34, KS U8). `__tests__/english-catalogue-graph.test.ts` holds the line, and the\n * build makes `dist/i18n/locales/en.js` one file (scripts/flatten-en.mjs).\n */\nexport const DEFAULT_UI_KIT_LABELS: UiKitLabels = {\n common: DEFAULT_COMMON_LABELS,\n dataTable: DEFAULT_DATA_TABLE_LABELS,\n miniCalendar: DEFAULT_MINI_CALENDAR_LABELS,\n calendarHeatmap: DEFAULT_CALENDAR_HEATMAP_LABELS,\n datePicker: DEFAULT_DATE_PICKER_LABELS,\n monthPicker: DEFAULT_MONTH_PICKER_LABELS,\n popover: DEFAULT_POPOVER_LABELS,\n combobox: DEFAULT_COMBOBOX_LABELS,\n multiSelect: DEFAULT_MULTI_SELECT_LABELS,\n calculator: DEFAULT_CALCULATOR_LABELS,\n currency: DEFAULT_CURRENCY_LABELS,\n chipInput: DEFAULT_CHIP_INPUT_LABELS,\n fieldSync: DEFAULT_FIELD_SYNC_LABELS,\n passwordReveal: DEFAULT_PASSWORD_REVEAL_LABELS,\n tabs: DEFAULT_TABS_LABELS,\n appShell: DEFAULT_APP_SHELL_LABELS,\n pageContents: DEFAULT_PAGE_CONTENTS_LABELS,\n topBar: DEFAULT_TOP_BAR_LABELS,\n pickerSheet: DEFAULT_PICKER_SHEET_LABELS,\n swipeableRow: DEFAULT_SWIPEABLE_ROW_LABELS,\n file: DEFAULT_FILE_LABELS,\n wizard: DEFAULT_WIZARD_LABELS,\n tour: DEFAULT_TOUR_LABELS,\n tourCatalogue: DEFAULT_TOUR_CATALOGUE_LABELS,\n commandPalette: DEFAULT_COMMAND_PALETTE_LABELS,\n globalSearch: DEFAULT_GLOBAL_SEARCH_LABELS,\n seriesChart: DEFAULT_SERIES_CHART_LABELS,\n pieChart: DEFAULT_PIE_CHART_LABELS,\n sparkline: DEFAULT_SPARKLINE_LABELS,\n statTile: DEFAULT_STAT_TILE_LABELS,\n signaturePad: DEFAULT_SIGNATURE_PAD_LABELS,\n passwordStrength: DEFAULT_PASSWORD_STRENGTH_LABELS,\n dangerConfirm: DEFAULT_DANGER_CONFIRM_LABELS,\n swatchPicker: DEFAULT_SWATCH_PICKER_LABELS,\n iconPicker: DEFAULT_ICON_PICKER_LABELS,\n dialogFrame: DEFAULT_DIALOG_FRAME_LABELS,\n filePicker: DEFAULT_FILE_PICKER_LABELS,\n measuredGrid: DEFAULT_MEASURED_GRID_LABELS,\n feedbackAttachment: DEFAULT_FEEDBACK_ATTACHMENT_LABELS,\n feedbackDialog: DEFAULT_FEEDBACK_DIALOG_LABELS,\n feedbackThread: DEFAULT_FEEDBACK_THREAD_LABELS,\n feedbackComposer: DEFAULT_FEEDBACK_COMPOSER_LABELS,\n feedbackStatus: DEFAULT_FEEDBACK_STATUS_LABELS,\n feedbackCategory: DEFAULT_FEEDBACK_CATEGORY_LABELS,\n feedbackToast: DEFAULT_FEEDBACK_TOAST_LABELS,\n feedbackMenu: DEFAULT_FEEDBACK_MENU_LABELS,\n feedbackPublic: DEFAULT_FEEDBACK_PUBLIC_LABELS,\n feedbackNotificationTypes: DEFAULT_FEEDBACK_NOTIFICATION_TYPES_LABELS,\n feedbackContext: DEFAULT_FEEDBACK_CONTEXT_LABELS,\n feedbackPage: DEFAULT_FEEDBACK_PAGE_LABELS,\n feedbackDetail: DEFAULT_FEEDBACK_DETAIL_LABELS,\n feedbackVote: DEFAULT_FEEDBACK_VOTE_LABELS,\n feedbackComments: DEFAULT_FEEDBACK_COMMENTS_LABELS,\n feedbackReplies: DEFAULT_FEEDBACK_REPLIES_LABELS,\n accountSettings: DEFAULT_ACCOUNT_SETTINGS_LABELS,\n confirmDialog: DEFAULT_CONFIRM_DIALOG_LABELS,\n floatingPanel: DEFAULT_FLOATING_PANEL_LABELS,\n copyButton: DEFAULT_COPY_BUTTON_LABELS,\n bulkActionBar: DEFAULT_BULK_ACTION_BAR_LABELS,\n list: DEFAULT_LIST_LABELS,\n breadcrumbs: DEFAULT_BREADCRUMBS_LABELS,\n toast: DEFAULT_TOAST_LABELS,\n form: DEFAULT_FORM_ACTIONS_LABELS,\n descriptionList: DEFAULT_DESCRIPTION_LIST_LABELS,\n lineItems: DEFAULT_LINE_ITEMS_LABELS,\n progressBar: DEFAULT_PROGRESS_BAR_LABELS,\n signedAmount: DEFAULT_SIGNED_AMOUNT_LABELS,\n errorBoundary: DEFAULT_ERROR_BOUNDARY_LABELS,\n authedImage: DEFAULT_AUTHED_IMAGE_LABELS,\n imageGrid: DEFAULT_IMAGE_GRID_LABELS,\n lightbox: DEFAULT_LIGHTBOX_LABELS,\n writeLock: DEFAULT_WRITE_LOCK_LABELS,\n accountState: DEFAULT_ACCOUNT_STATE_LABELS,\n shareCard: DEFAULT_SHARE_CARD_LABELS,\n reauthDialog: DEFAULT_REAUTH_DIALOG_LABELS,\n serverWake: DEFAULT_SERVER_WAKE_LABELS,\n translationReview: DEFAULT_TRANSLATION_REVIEW_LABELS,\n legal: DEFAULT_LEGAL_LABELS,\n signIn: DEFAULT_SIGN_IN_LABELS,\n register: DEFAULT_REGISTER_LABELS,\n completeName: DEFAULT_COMPLETE_NAME_LABELS,\n forgotPassword: DEFAULT_FORGOT_PASSWORD_LABELS,\n resetPassword: DEFAULT_RESET_PASSWORD_LABELS,\n verifyEmail: DEFAULT_VERIFY_EMAIL_LABELS,\n notFound: DEFAULT_NOT_FOUND_LABELS,\n acceptInvitation: DEFAULT_ACCEPT_INVITATION_LABELS,\n companySwitcher: DEFAULT_COMPANY_SWITCHER_LABELS,\n emailChange: DEFAULT_EMAIL_CHANGE_LABELS,\n sessions: DEFAULT_SESSIONS_LABELS,\n deleteAccount: DEFAULT_DELETE_ACCOUNT_LABELS,\n dataExport: DEFAULT_DATA_EXPORT_LABELS,\n userRoster: DEFAULT_USER_ROSTER_LABELS,\n roleSelect: DEFAULT_ROLE_SELECT_LABELS,\n reviewerScope: DEFAULT_REVIEWER_SCOPE_LABELS,\n adminAction: DEFAULT_ADMIN_ACTION_LABELS,\n adminActionLog: DEFAULT_ADMIN_ACTION_LOG_LABELS,\n transferOwnership: DEFAULT_TRANSFER_OWNERSHIP_LABELS,\n invitations: DEFAULT_INVITATIONS_LABELS,\n settings: DEFAULT_SETTINGS_LABELS,\n landing: DEFAULT_LANDING_LABELS,\n demo: DEFAULT_DEMO_LABELS,\n billing: DEFAULT_BILLING_LABELS,\n planChange: DEFAULT_PLAN_CHANGE_LABELS,\n appearance: DEFAULT_APPEARANCE_LABELS,\n deviceReset: DEFAULT_DEVICE_RESET_LABELS,\n rowActions: DEFAULT_ROW_ACTIONS_LABELS,\n appShellMore: DEFAULT_APP_SHELL_MORE_LABELS,\n characterCount: DEFAULT_CHARACTER_COUNT_LABELS,\n countrySelect: DEFAULT_COUNTRY_SELECT_LABELS,\n inlineEdit: DEFAULT_INLINE_EDIT_LABELS,\n ibanInput: DEFAULT_IBAN_INPUT_LABELS,\n phoneInput: DEFAULT_PHONE_INPUT_LABELS,\n signChip: DEFAULT_SIGN_CHIP_LABELS,\n columnMapper: DEFAULT_COLUMN_MAPPER_LABELS,\n notifications: DEFAULT_NOTIFICATIONS_LABELS,\n adminArea: DEFAULT_ADMIN_AREA_LABELS,\n topBarParts: DEFAULT_TOP_BAR_PARTS_LABELS,\n mailTestCard: DEFAULT_MAIL_TEST_CARD_LABELS,\n signOutPending: DEFAULT_SIGN_OUT_PENDING_DIALOG_LABELS,\n pwaUpdate: DEFAULT_PWA_UPDATE_PROMPT_LABELS,\n sharedComputer: DEFAULT_SHARED_COMPUTER_LABELS,\n};\n", "import { DEFAULT_UI_KIT_LABELS } from \"../defaults\";\nimport { formatFileSize } from \"../kit-labels\";\nimport type { UiKitLabels } from \"../kit-labels\";\n\n/**\n * The kit's English words with every count and file size formatted for\n * `numberLocale` \u2014 `uiKitLabelsEn(\"en-CH\")` reads \"12\u2019345 rows\", where the defaults\n * print \"12345\". For `<UiKitProvider labels={uiKitLabelsEn(\"en-CH\")}>`.\n *\n * A factory and not a constant on purpose: {@link DEFAULT_UI_KIT_LABELS} prints counts\n * raw and has since 0.1, so an app that passes nothing must keep seeing exactly that.\n * Formatting is something an app asks for, by calling this.\n *\n * Derived rather than copied: every word is the default's own, spread in, and only the\n * labels that print a number are restated \u2014 with the same wording and the same\n * singular/plural split \u2014 so a key added to the defaults is here the moment it lands.\n * A new label that prints a count must be restated by hand; the catalogue parity test\n * in `__tests__/locales.test.ts` fails until it is (round 0.34 DOC-6: eleven were not).\n * Row and line numbers (`lineItems.row`, `measuredGrid.cell`) are positions, not\n * counts, and stay as the defaults print them, as in the other catalogues.\n */\nexport function uiKitLabelsEn(numberLocale = \"en-US\"): UiKitLabels {\n const num = new Intl.NumberFormat(numberLocale);\n const n = (value: number) => num.format(value);\n const d = DEFAULT_UI_KIT_LABELS;\n // As `inDays` in src/billing/billing-labels.ts: 0 (or less) is today, 1 tomorrow.\n const inDays = (days: number) =>\n days <= 0 ? \"today\" : days === 1 ? \"tomorrow\" : `in ${n(days)} days`;\n\n return {\n ...d,\n feedbackAttachment: {\n ...d.feedbackAttachment,\n attachmentLimit: (max) =>\n max === 1\n ? \"Up to 1 attachment \u2014 remove it to add another.\"\n : `Up to ${n(max)} attachments \u2014 remove one to add another.`,\n },\n feedbackToast: {\n ...d.feedbackToast,\n attachmentTooMany: (count) =>\n count === 1\n ? \"Only 1 attachment fits \u2014 the rest were left out.\"\n : `Only ${n(count)} attachments fit \u2014 the rest were left out.`,\n },\n feedbackPage: {\n ...d.feedbackPage,\n // `userFallback`'s number is an id, not a count: it stays as the default prints it.\n reworkChip: (count) => (count === 1 ? \"Rework\" : `Rework \u00D7${n(count)}`),\n },\n // 0.38.0: the public list's two counts.\n feedbackPublic: {\n ...d.feedbackPublic,\n total: (count) => (count === 1 ? \"1 report\" : `${n(count)} reports`),\n comments: (count) => (count === 1 ? \"1 comment\" : `${n(count)} comments`),\n votes: (count) => (count === 1 ? \"1 vote\" : `${n(count)} votes`),\n page: (page) => `Page ${n(page)}`,\n },\n measuredGrid: {\n ...d.measuredGrid,\n points: (count) => (count === 1 ? \"1 point\" : `${n(count)} points`),\n problems: (count) =>\n count === 1\n ? \"1 cell is not a number\"\n : `${n(count)} cells are not numbers`,\n },\n dataTable: {\n ...d.dataTable,\n filterResults: (shown, total) => `${n(shown)} of ${n(total)} rows`,\n pageChanged: (page, totalPages) => `Page ${n(page)} of ${n(totalPages)}`,\n pageRange: (from, to, total) => `${n(from)}\u2013${n(to)} / ${n(total)}`,\n rowCount: (total) => n(total),\n columnsCount: (visible, total) => `Columns (${n(visible)}/${n(total)})`,\n },\n calendarHeatmap: {\n ...d.calendarHeatmap,\n truncated: (count) =>\n `Showing the most recent days; ${n(count)} earlier ${count === 1 ? \"day is\" : \"days are\"} not shown.`,\n },\n combobox: {\n ...d.combobox,\n selectedCount: (count) => `${n(count)} selected`,\n resultCount: (count) =>\n count === 1 ? \"1 result\" : `${n(count)} results`,\n minChars: (count) =>\n count === 1\n ? \"Type at least 1 character\"\n : `Type at least ${n(count)} characters`,\n },\n multiSelect: {\n ...d.multiSelect,\n selectedCount: (count) => n(count),\n },\n chipInput: {\n ...d.chipInput,\n atLimit: (max) => `Limit of ${n(max)} reached`,\n },\n iconPicker: {\n ...d.iconPicker,\n resultCount: (count) => (count === 1 ? \"1 icon\" : `${n(count)} icons`),\n },\n bulkActionBar: {\n ...d.bulkActionBar,\n selected: (count) => `${n(count)} selected`,\n },\n file: {\n // The kit's own `Intl` unit formatting, pinned to this locale (\"3.4 MB\").\n size: (bytes) => formatFileSize(bytes, numberLocale),\n },\n filePicker: {\n ...d.filePicker,\n rejectedCount: (name, maxFiles) =>\n `\u201C${name}\u201D was not added: at most ${n(maxFiles)} ${maxFiles === 1 ? \"file\" : \"files\"}`,\n rejectedMany: (count) => `${n(count)} files were not added`,\n rejectedPick: (count) =>\n count === 1\n ? \"The file was not added\"\n : `None of the ${n(count)} files were added`,\n selected: (count, firstName) =>\n count === 1 ? `\u201C${firstName}\u201D selected` : `${n(count)} files selected`,\n },\n wizard: {\n ...d.wizard,\n step: (current, total) => `Step ${n(current)} of ${n(total)}`,\n },\n tour: {\n ...d.tour,\n step: (current, total) => `${n(current)} / ${n(total)}`,\n },\n passwordStrength: {\n ...d.passwordStrength,\n ruleLength: (minLength) => `At least ${n(minLength)} characters`,\n tooLong: (maxBytes) =>\n `At most ${n(maxBytes)} characters (accents and emoji count for more than one).`,\n },\n floatingPanel: {\n ...d.floatingPanel,\n badge: (count) => `${n(count)} new`,\n },\n imageGrid: {\n ...d.imageGrid,\n item: (index, count) => `Image ${n(index)} of ${n(count)}`,\n },\n lightbox: {\n ...d.lightbox,\n counter: (index, count) => `${n(index)} / ${n(count)}`,\n position: (index, count) => `Image ${n(index)} of ${n(count)}`,\n },\n translationReview: {\n ...d.translationReview,\n filterCount: (label, count) => `${label} \u00B7 ${n(count)}`,\n placeholdersOnly: (count) => `Only placeholder problems (${n(count)})`,\n progress: (approved, total) => `${n(approved)} of ${n(total)} approved`,\n localeProgress: (approved, total) => `${n(approved)}/${n(total)}`,\n exportCorrections: (count) => `Export corrections (${n(count)})`,\n approvedToast: (count) => (count === 1 ? \"String approved\" : `${n(count)} strings approved`),\n clearedToast: (count) => (count === 1 ? \"String marked unreviewed\" : `${n(count)} strings marked unreviewed`),\n groupCount: (unreviewed, total) => `${n(unreviewed)} unreviewed / ${n(total)}`,\n approveGroup: (count) => `Approve unreviewed (${n(count)})`,\n confirmGroup: (count, group) =>\n count === 1\n ? `Approve the unreviewed string in ${group}?`\n : `Approve all ${n(count)} unreviewed strings in ${group}, including those not on screen?`,\n },\n characterCount: {\n ...d.characterCount,\n count: (used, max) => `${n(used)} of ${n(max)} characters`,\n remaining: (left) =>\n left === 1 ? \"1 character left\" : `${n(left)} characters left`,\n },\n ibanInput: {\n ...d.ibanInput,\n length: (actual, expected) =>\n `An IBAN from this country has ${n(expected)} characters \u2014 this one has ${n(actual)}.`,\n },\n columnMapper: {\n ...d.columnMapper,\n summary: (columns, rows) =>\n `${n(columns)} ${columns === 1 ? \"column\" : \"columns\"}, ${n(rows)} ${rows === 1 ? \"row\" : \"rows\"}`,\n unreadCount: (count) =>\n count === 1\n ? \"1 line could not be read\"\n : `${n(count)} lines could not be read`,\n unreadMore: (count) => `\u2026and ${n(count)} more`,\n previewOf: (shown, total) =>\n shown === 1\n ? `The first of ${n(total)} rows`\n : `The first ${n(shown)} of ${n(total)} rows`,\n },\n signIn: {\n ...d.signIn,\n recoveryCodeHint: (length) => `${n(length)} letters and digits. Dashes and spaces don\u2019t matter.`,\n },\n verifyEmail: {\n ...d.verifyEmail,\n resendIn: (seconds) => `Send again in ${n(seconds)} s`,\n },\n deleteAccount: {\n ...d.deleteAccount,\n afterDays: (days) =>\n days === 1\n ? \"Your account is deactivated at once and erased for good 1 day later.\"\n : `Your account is deactivated at once and erased for good ${n(days)} days later.`,\n handOver: (count) =>\n count === 1\n ? \"1 item others can see will pass to an administrator.\"\n : `${n(count)} items others can see will pass to an administrator.`,\n },\n notifications: {\n ...d.notifications,\n testSent: (count) => (count === 1 ? \"Test sent to 1 device\" : `Test sent to ${n(count)} devices`),\n failures: (count) =>\n count === 1 ? \"1 failed delivery in a row\" : `${n(count)} failed deliveries in a row`,\n bellUnread: (count) => `${n(count)} unread`,\n },\n settings: {\n ...d.settings,\n matchCount: (count) => (count === 1 ? \"1 match\" : `${n(count)} matches`),\n },\n // 0.42.0: the admin area's two counts (docs/admin-harmonization.md \u00A73.1).\n adminArea: {\n ...d.adminArea,\n waiting: (count) => `${n(count)} waiting`,\n waitingLabel: (label, count) => `${label}, ${n(count)} waiting`,\n tiles: { ...d.adminArea.tiles, usersNew: (count) => `${n(count)} new in 7 days` },\n },\n // 0.43.0: the tours page's counts (docs/tours-harmonization.md \u00A73).\n tourCatalogue: {\n ...d.tourCatalogue,\n groupAll: (count) => `All topics (${n(count)})`,\n groupOption: (group, count) => `${group} (${n(count)})`,\n stateAll: (count) => `All (${n(count)})`,\n stateTodo: (count) => `Not taken (${n(count)})`,\n stateDone: (count) => `Completed (${n(count)})`,\n showing: (shown, total) => `Showing ${n(shown)} of ${n(total)} tours`,\n points: (count) => `+${n(count)} pts`,\n steps: (count) => (count === 1 ? \"1 step\" : `${n(count)} steps`),\n duration: (minutes) => `About ${n(minutes)} min`,\n },\n // 0.42.0: the top bar's three counts (docs/top-bar-harmonization.md \u00A73.1).\n topBarParts: {\n ...d.topBarParts,\n sync: {\n ...d.topBarParts.sync,\n blocked: (count) =>\n count === 1\n ? \"1 change cannot be sent from this device\"\n : `${n(count)} changes cannot be sent from this device`,\n pending: (count) => (count === 1 ? \"1 change waiting to sync\" : `${n(count)} changes waiting to sync`),\n waitingShort: (count) => `${n(count)} waiting`,\n },\n },\n demo: {\n ...d.demo,\n rateLimited: (minutes) =>\n minutes\n ? `Too many demos from this network. Try again in ${n(minutes)} min.`\n : \"Too many demos from this network. Try again later.\",\n hoursLeft: (hours, minutes) => `Demo \u00B7 ${n(hours)} h ${n(minutes)} min left`,\n minutesLeft: (minutes) => `Demo \u00B7 ${n(minutes)} min left`,\n },\n billing: {\n ...d.billing,\n trialEnding: (days) =>\n `Your trial ends ${inDays(days)}. After that you can still view everything, but changes need a plan.`,\n grantEnding: (days) =>\n `Your free access ends ${inDays(days)}. After that you can still view everything, but changes need a plan.`,\n waitingChanges: (count) =>\n count === 1 ? \"1 change waiting for a plan\" : `${n(count)} changes waiting for a plan`,\n },\n signOutPending: {\n ...d.signOutPending,\n lost: (count) =>\n count === 1\n ? d.signOutPending.lost(1)\n : `${n(count)} changes are still waiting to sync. Logging out clears this device\u2019s copy, and it is the only copy.`,\n kept: (count) =>\n count === 1\n ? d.signOutPending.kept(1)\n : `${n(count)} changes are still waiting to sync. They stay on this device for you and sync the next time you log in here.`,\n },\n };\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["// All user-facing strings for the DataTable system \u2014 the `dataTable` namespace of\n// `<UiKitProvider labels>`, and per table the `labels` prop over that. The kit's seven\n// catalogues carry the translations; the English defaults below make the table usable\n// with no wiring.\n\n// A type-only import: erased at build time, so this module stays free of the table\n// itself (and of react-router), which `i18n/defaults` relies on.\nimport type { DataTableSortLabels } from \"./data-table\";\n\n/** The phone sort control's four keys (`sortBy`, `sortDefault`, `sortAscending`,\n * `sortDescending`, 0.22.0) are {@link DataTableSortLabels}', declared beside the\n * control and part of this namespace like every other key. */\nexport interface DataTableLabels extends DataTableSortLabels {\n // Table chrome\n columns: string;\n selectAllRows: string;\n sortHint: string;\n filter: string;\n close: string;\n selectRow: string;\n /** The phone card list's way into selection mode for a keyboard and a screen reader\n * (0.40, #421) \u2014 a button, visually hidden until focused; a long press is the touch way in. */\n selectRows: string;\n /** Leaves the phone card list's selection mode, clearing the selection (0.40, #421). */\n cancelSelection: string;\n /**\n * The name of an opening row's disclosure button on desktop \u2014 visually hidden, in the\n * row's first cell, carrying `aria-expanded` and `aria-controls` (round 0.34, the\n * showcase's axe check: ARIA allows `aria-expanded` on a row only in a treegrid, and\n * the `<tr>` wore it). The same words whether the row is open or shut: the state is\n * the button's to say.\n */\n rowDetails: string;\n autoSize: string;\n loading: string;\n filters: string;\n clearAll: string;\n done: string;\n // Pagination\n pageSize: string;\n pageSizeAll: string;\n prevPage: string;\n nextPage: string;\n // Filter popover\n clearFilter: string;\n filterPlaceholder: string;\n selectFilter: string;\n selectAll: string;\n selectNone: string;\n dateFrom: string;\n dateTo: string;\n numberMin: string;\n numberMax: string;\n numberAbs: string;\n // Date-range preset labels, keyed by preset key (see dateRangePresets()).\n presets: Record<string, string>;\n\n /**\n * The table's own accessible name. Deliberately a label rather than a second,\n * parallel `tableLabel` prop: the audit already records \"three different prop\n * names for the accessible name\" as a finding, and a table that is not \"Data\n * table\" says so with `labels={{ table: \"Transactions\" }}` at the call site.\n */\n table: string;\n\n // ---- Announcements ----\n // Spoken through the live region, never rendered. Each takes its numbers as\n // ARGUMENTS: a count glued into an English template literal is untranslatable,\n // and the grammar around it moves with the number in most languages.\n\n /** After a filter changes: \"12 of 137 rows\". */\n filterResults: (shown: number, total: number) => string;\n /** After a header is activated: \"Sorted by Name, ascending\". */\n sortedAscending: (column: string) => string;\n sortedDescending: (column: string) => string;\n /** The third click, which removes the column from the sort entirely. */\n sortCleared: (column: string) => string;\n /** After paging: \"Page 3 of 14\". `page` is 1-BASED, as spoken. */\n pageChanged: (page: number, totalPages: number) => string;\n\n // ---- Counted chrome ----\n // Visible text that interpolates numbers. These were template literals until the\n // audit flagged them: a consumer could translate every key in this file and still\n // be left with English (and with ASCII digit grouping) in the footer.\n\n /** The pagination range summary: \"1\u201325 / 137\". */\n pageRange: (from: number, to: number, total: number) => string;\n /** The same summary when the page size is \"all\" \u2014 just the row count. */\n rowCount: (total: number) => string;\n /** The column-settings rail and its heading: \"Columns (4/9)\". */\n columnsCount: (visible: number, total: number) => string;\n /**\n * A column's filter button and panel: \"Filter Amount\", and \"Filter Amount (active)\"\n * while the column is filtered (round 0.34 Wave 2, BUG-7c). Every column's used to be\n * \"Filter\" alike, and \"filtered\" was a colour. An app that translated only `filter`\n * gets `\"<filter>: <column>\"` from it: DataTable derives the one from the other.\n */\n filterColumn: (column: string, active: boolean) => string;\n\n // ---- Empty state, row actions, boolean cells (0.12.0) ----\n\n /** The body of a table with no rows and no `empty` prop of its own. A sentence, not\n * \"\u2014\": a dash in the only row of a table reads as one row with a missing value. */\n empty: string;\n /** The accessible name of the `rowActions` column (its header is visually empty). */\n actions: string;\n /** The `kind: \"edit\"` row action's name \u2014 its tooltip and its swipe label. */\n edit: string;\n /** The `kind: \"delete\"` row action's name. */\n delete: string;\n /** What {@link BooleanMark} says to a screen reader for `true` / `false` / nothing. */\n booleanTrue: string;\n booleanFalse: string;\n booleanUnset: string;\n}\n\nexport const DEFAULT_DATA_TABLE_LABELS: DataTableLabels = {\n columns: \"Columns\",\n selectAllRows: \"Select all rows\",\n sortHint: \"Click to sort \u00B7 Shift-click to add a sort\",\n filter: \"Filter\",\n close: \"Close\",\n selectRow: \"Select row\",\n selectRows: \"Select rows\",\n cancelSelection: \"Cancel\",\n rowDetails: \"Details\",\n autoSize: \"Auto-size columns\",\n loading: \"Loading\u2026\",\n filters: \"Filters\",\n clearAll: \"Clear all\",\n done: \"Done\",\n pageSize: \"Rows per page\",\n pageSizeAll: \"All\",\n prevPage: \"Previous page\",\n nextPage: \"Next page\",\n clearFilter: \"Clear filter\",\n filterPlaceholder: \"Filter\u2026\",\n selectFilter: \"Select\",\n selectAll: \"All\",\n selectNone: \"None\",\n dateFrom: \"From\",\n dateTo: \"To\",\n numberMin: \"Min\",\n numberMax: \"Max\",\n numberAbs: \"Absolute value\",\n presets: {\n today: \"Today\",\n yesterday: \"Yesterday\",\n this_week: \"This week\",\n last_week: \"Last week\",\n last_7_days: \"Last 7 days\",\n last_30_days: \"Last 30 days\",\n this_month: \"This month\",\n last_month: \"Last month\",\n last_3_months: \"Last 3 months\",\n ytd: \"Year to date\",\n last_year: \"Last year\",\n },\n table: \"Data table\",\n filterResults: (shown, total) => `${shown} of ${total} rows`,\n sortedAscending: (column) => `Sorted by ${column}, ascending`,\n sortedDescending: (column) => `Sorted by ${column}, descending`,\n sortCleared: (column) => `Sort cleared on ${column}`,\n pageChanged: (page, totalPages) => `Page ${page} of ${totalPages}`,\n // The separators are the ones that shipped, so adding the seam changes no screen.\n pageRange: (from, to, total) => `${from}\u2013${to} / ${total}`,\n rowCount: (total) => `${total}`,\n columnsCount: (visible, total) => `Columns (${visible}/${total})`,\n filterColumn: (column, active) => (active ? `Filter ${column} (active)` : `Filter ${column}`),\n empty: \"No entries\",\n actions: \"Actions\",\n edit: \"Edit\",\n delete: \"Delete\",\n booleanTrue: \"Yes\",\n booleanFalse: \"No\",\n booleanUnset: \"Not set\",\n // The phone sort control (0.22.0). The same words as `DEFAULT_DATA_TABLE_SORT_LABELS`\n // in data-table.tsx, written out rather than spread in: importing that VALUE here\n // would make data-table.tsx and this module import each other (data-table.tsx reads\n // these defaults from here), and would pull the whole table into `i18n/defaults`.\n sortBy: \"Sort by\",\n sortDefault: \"Default order\",\n sortAscending: \"Ascending\",\n sortDescending: \"Descending\",\n};\n", "// The English words of ./mini-calendar, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./mini-calendar re-exports them.\n\nimport type { MiniCalendarLabels } from \"./mini-calendar\";\n\n/** English defaults. Exported as the `miniCalendar` namespace of `UiKitLabels`\n * (src/i18n), the complete reference a translation is written against. */\nexport const DEFAULT_MINI_CALENDAR_LABELS: MiniCalendarLabels = {\n previousMonth: \"Previous month\",\n nextMonth: \"Next month\",\n day: (date) => date,\n chooseStart: \"Choose a start date\",\n chooseEnd: \"Choose an end date\",\n startSelected: (date) => `${date} selected as the start. Choose an end date.`,\n rangeSelected: (from, to) => `${from} to ${to} selected. Choose a start date to begin again.`,\n};\n", "// The English words of ./calendar-heatmap, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./calendar-heatmap re-exports them.\n\nimport type { CalendarHeatmapLabels } from \"./calendar-heatmap\";\n\n/** English defaults, exported as the `calendarHeatmap` namespace of `UiKitLabels`. */\nexport const DEFAULT_CALENDAR_HEATMAP_LABELS: CalendarHeatmapLabels = {\n grid: \"Daily values\",\n day: (date, value) => `${date}: ${value}`,\n less: \"Less\",\n more: \"More\",\n truncated: (count) =>\n `Showing the most recent days; ${count} earlier ${count === 1 ? \"day is\" : \"days are\"} not shown.`,\n};\n", "// The English words of ./month-picker, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./month-picker re-exports them.\n\nimport type { MonthPickerLabels } from \"./month-picker\";\n\n/** The English starting point every override is merged onto. Exported (unlike the\n * calendar's) because it is asked for by name: a host building its own translation\n * table can spread it rather than re-typing four keys to change one. */\nexport const DEFAULT_MONTH_PICKER_LABELS: MonthPickerLabels = {\n previousYear: \"Previous year\",\n nextYear: \"Next year\",\n panel: \"Choose a month\",\n month: (monthYear) => monthYear,\n previousMonth: \"Previous month\",\n nextMonth: \"Next month\",\n today: \"Today\",\n yearPanel: \"Choose a year\",\n earlierYears: \"Earlier years\",\n laterYears: \"Later years\",\n thisYear: \"This year\",\n};\n", "// The English words of ./page-contents, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./page-contents re-exports them.\n\nimport type { PageContentsLabels } from \"./page-contents\";\n\nexport const DEFAULT_PAGE_CONTENTS_LABELS: PageContentsLabels = {\n title: \"On this page\",\n};\n", "// The English words of ./popover, in a module with no component code: the English catalogue\n// (src/i18n/defaults.ts) imports them without the component, so `en` loads as one chunk\n// like the other languages (0.34, KS U8). ./popover re-exports them.\n\nimport type { PopoverLabels } from \"./popover\";\n\n// Exported since the kit grew one label tree (`UiKitLabels`, src/i18n): the complete\n// English reference a translator works from has to be able to name every namespace.\nexport const DEFAULT_POPOVER_LABELS: PopoverLabels = {\n // \"Pop-up\", not \"Popover\": the panel's accessible name is read to USERS, and\n // \"popover\" is a developer's word for it (reported by keksdose, 0.5.0). Only a\n // bare Popover falls back to this \u2014 the kit's own pickers name their panels.\n panel: \"Pop-up\",\n};\n", "// The English words of ./chip, in a module with no component code: the English catalogue\n// (src/i18n/defaults.ts) imports them without the component, so `en` loads as one chunk\n// like the other languages (0.34, KS U8). ./chip-input re-exports them.\n\nimport type { ChipInputLabels } from \"./chip\";\n\nexport const DEFAULT_CHIP_INPUT_LABELS: ChipInputLabels = {\n added: (v) => `${v} added`,\n removed: (v) => `${v} removed`,\n remove: \"Remove\",\n atLimit: (max) => `Limit of ${max} reached`,\n duplicate: (v) => `${v} is already in the list`,\n};\n", "// The English words of ./field-sync, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./field-sync re-exports them.\n\nimport type { FieldSyncLabels } from \"./field-sync\";\n\nexport const DEFAULT_FIELD_SYNC_LABELS: FieldSyncLabels = {\n synced: \"Saved\",\n edited: \"Unsaved changes\",\n pending: \"Saving\u2026\",\n error: \"Could not save\",\n retry: \"Retry\",\n};\n", "// The English words of ./ui, in a module with no component code: the English catalogue\n// (src/i18n/defaults.ts) imports them without the component, so `en` loads as one chunk\n// like the other languages (0.34, KS U8). ./ui re-exports them.\n\nimport type { CharacterCountLabels, PasswordRevealLabels } from \"./field-base\";\nimport type { TabsLabels } from \"./tabs\";\n\nexport const DEFAULT_PASSWORD_REVEAL_LABELS: PasswordRevealLabels = {\n show: \"Show password\",\n hide: \"Hide password\",\n};\n\nexport const DEFAULT_CHARACTER_COUNT_LABELS: CharacterCountLabels = {\n count: (used, max) => `${used} of ${max} characters`,\n remaining: (left) => (left === 1 ? \"1 character left\" : `${left} characters left`),\n limitReached: \"Character limit reached\",\n};\n\nexport const DEFAULT_TABS_LABELS: TabsLabels = {\n add: \"Add tab\",\n remove: (tab) => `Remove ${tab}`,\n more: \"More tabs\",\n previous: \"Previous tabs\",\n};\n", "// The English words of the wizard, in a module with no other code: the English catalogue\n// (src/i18n/defaults.ts) imports them as it imports every component's `*-labels.ts`.\n// ./types re-exports them. Until 0.34 they sat in ./types, the rule's one exception\n// outside the provider (round 0.34, DOC-6's sev-1 note).\n\nimport type { WizardLabels } from \"./types\";\n\n/** Typed with the two optional keys made required, so code reading the defaults\n * directly (the fallback in `useWizard`) needs no `!`. */\nexport const DEFAULT_WIZARD_LABELS: WizardLabels &\n Required<Pick<WizardLabels, \"missingRequired\" | \"genericError\" | \"done\">> = {\n cancel: \"Cancel\",\n back: \"Back\",\n next: \"Next\",\n skip: \"Skip\",\n finish: \"Finish\",\n submitting: \"Creating\u2026\",\n steps: \"Steps\",\n step: (current, total) => `Step ${current} of ${total}`,\n cancelTitle: \"Discard this form?\",\n confirmCancel: \"Your entries will be lost.\",\n cancelConfirmLabel: \"Discard\",\n cancelDismissLabel: \"Keep editing\",\n reviewTitle: \"Review\",\n edit: \"Edit\",\n missingRequired: \"Please fill in all required fields.\",\n genericError: \"An error occurred\",\n done: \"Done\",\n};\n", "// The English words of ./tour, in a module with no component code: the English catalogue\n// (src/i18n/defaults.ts) imports them without the component, so `en` loads as one chunk\n// like the other languages (0.34, KS U8). ./tour re-exports them.\n\nimport type { TourLabels } from \"./tour\";\n\nexport const DEFAULT_TOUR_LABELS: TourLabels = {\n next: \"Next\",\n back: \"Back\",\n skip: \"Skip\",\n done: \"Done\",\n awaitClickHint: \"Click the highlighted element to continue\",\n awaitInputHint: \"Enter a value in the highlighted field to continue\",\n step: (c, t) => `${c} / ${t}`,\n};\n", "// The English words of `TourCatalogue` and `TourCatalogueCard` (docs/tours-harmonization.md\n// \u00A73), in a module with no component code, like every `*-labels.ts` (0.34, KS U8).\n// keksdose's reviewed words (tour.* in its en.json) where it had them.\n\n/** The `tourCatalogue` namespace. Counts arrive as numbers, dates already formatted. */\nexport interface TourCatalogueLabels {\n /** The search box's name. */\n searchLabel: string;\n searchPlaceholder: string;\n /** The group select's name (keksdose: \"Topic\"). */\n groupLabel: string;\n /** The select's first option, with the count the other filters leave. */\n groupAll: (count: number) => string;\n /** A group's option: its title and its count. */\n groupOption: (group: string, count: number) => string;\n /** The all / to do / done toggle's name. */\n stateLabel: string;\n stateAll: (count: number) => string;\n stateTodo: (count: number) => string;\n stateDone: (count: number) => string;\n /** Under the filter bar while a filter is on. */\n showing: (shown: number, total: number) => string;\n noMatches: string;\n noMatchesHint: string;\n clearFilters: string;\n /** The NEW pill. */\n badgeNew: string;\n /** The pill on a tour reset by an update (\u00A78). */\n badgeUpdated: string;\n /** A reset tour's line: the update's day (formatted) and its reason (\u00A78); `reason` is\n * left out when the tour's update carries none. */\n resetOn: (date: string, reason?: string) => string;\n /** The points chip. */\n points: (count: number) => string;\n steps: (count: number) => string;\n /** The duration, in minutes. */\n duration: (minutes: number) => string;\n /** Completed, with the day (formatted). */\n completedOn: (date: string) => string;\n /** Completed without a date (kastlan's old id list, \u00A76.2). */\n completed: string;\n /** Not taken yet \u2014 the state icon, for a reader. */\n notCompleted: string;\n markUndone: string;\n start: string;\n replay: string;\n}\n\nexport const DEFAULT_TOUR_CATALOGUE_LABELS: TourCatalogueLabels = {\n searchLabel: \"Search tours\",\n searchPlaceholder: \"Search tours\u2026\",\n groupLabel: \"Topic\",\n groupAll: (count) => `All topics (${count})`,\n groupOption: (group, count) => `${group} (${count})`,\n stateLabel: \"Filter tours\",\n stateAll: (count) => `All (${count})`,\n stateTodo: (count) => `Not taken (${count})`,\n stateDone: (count) => `Completed (${count})`,\n showing: (shown, total) => `Showing ${shown} of ${total} tours`,\n noMatches: \"No tour matches\",\n noMatchesHint: \"Try another word, or clear the filter.\",\n clearFilters: \"Clear filters\",\n badgeNew: \"New\",\n badgeUpdated: \"Updated\",\n resetOn: (date, reason) => (reason ? `Reset on ${date}: ${reason}` : `Reset on ${date}`),\n points: (count) => `+${count} pts`,\n steps: (count) => (count === 1 ? \"1 step\" : `${count} steps`),\n duration: (minutes) => `About ${minutes} min`,\n completedOn: (date) => `Completed on ${date}`,\n completed: \"Completed\",\n notCompleted: \"Not completed\",\n markUndone: \"Mark as not done\",\n start: \"Start\",\n replay: \"Replay\",\n};\n", "// The English words of ./command-palette, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./command-palette re-exports them.\n\nimport type { CommandPaletteLabels } from \"./command-palette\";\n\nexport const DEFAULT_COMMAND_PALETTE_LABELS: CommandPaletteLabels = {\n placeholder: \"Search\u2026\",\n empty: \"No results\",\n loading: \"Searching\u2026\",\n dialog: \"Search\",\n error: \"Search failed. Try again.\",\n clear: \"Clear search\",\n submit: \"Search\",\n close: \"Close\",\n};\n", "// The English words of ./global-search, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./global-search re-exports them.\n\nimport type { GlobalSearchLabels } from \"./global-search\";\n\nexport const DEFAULT_GLOBAL_SEARCH_LABELS: GlobalSearchLabels = {\n trigger: \"Search\",\n placeholder: \"Search or jump to\u2026\",\n shortcut: (keys) => `Search (${keys})`,\n suggestions: \"Try\",\n results: \"Results\",\n};\n", "// All user-facing strings for the series chart family \u2014 `SeriesChart`, its drag-to-zoom\n// layer and `ToggleLegend` \u2014 as the `seriesChart` namespace of `<UiKitProvider labels>`,\n// and per chart the `labels` prop over that.\n//\n// A module of its own, with no recharts in it, so the label registry (src/i18n) can\n// import the defaults without pulling the chart library in behind them.\n\nexport interface SeriesChartLabels {\n /** The button that puts a zoomed chart back to its full extent. Visible text. */\n resetZoom: string;\n /** Accessible name of the drag surface laid over the plot. It is the only place the\n * gesture is explained, so it says how the drag is read and how to undo it. */\n zoomHint: string;\n /** What a chart with nothing to draw says, when the caller passes no `empty`. */\n empty: string;\n /** Accessible name of a `ToggleLegend` \u2014 a group of switches, one per series. */\n legend: string;\n /** Accessible name of the group of keyboard stops a clickable chart (`onPointClick`)\n * lays over its bars or periods \u2014 one tab stop, arrow keys between them. */\n points: string;\n}\n\nexport const DEFAULT_SERIES_CHART_LABELS: SeriesChartLabels = {\n resetZoom: \"Reset zoom\",\n zoomHint:\n \"Drag to zoom: a roughly square selection zooms both axes, a long thin one only its own. Double-click to reset.\",\n empty: \"No data\",\n legend: \"Series\",\n points: \"Chart values\",\n};\n", "// All user-facing strings for `PieChart`, as the `pieChart` namespace of\n// `<UiKitProvider labels>`, and per chart the `labels` prop over that.\n//\n// A module of its own, with no recharts in it, for the reason `series-chart-labels`\n// is one: the label registry (src/i18n) imports the defaults, and must not pull the\n// chart library in behind them.\n\nexport interface PieChartLabels {\n /** Accessible name of the group of keyboard stops laid over the slices \u2014 one tab\n * stop, arrow keys between them. */\n slices: string;\n /**\n * One slice's accessible name. `value` arrives through `formatValue`, `percent` as\n * the slice's share of what is drawn, already formatted in the locale (\"42 %\" in\n * German, \"42%\" in English) \u2014 the function only arranges them.\n */\n slice: (label: string, value: string, percent: string) => string;\n /** The caption over the donut's centre figure. */\n total: string;\n /** What a chart with nothing to draw says, when the caller passes no `empty`. */\n empty: string;\n /** Accessible name of the chart's legend (a group of switches, one per slice). */\n legend: string;\n}\n\nexport const DEFAULT_PIE_CHART_LABELS: PieChartLabels = {\n slices: \"Chart slices\",\n slice: (label, value, percent) => `${label}: ${value} (${percent})`,\n total: \"Total\",\n empty: \"No data\",\n legend: \"Categories\",\n};\n", "// The English words of ./sparkline, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./sparkline re-exports them.\n\nimport type { SparklineLabels } from \"./sparkline\";\n\nexport const DEFAULT_SPARKLINE_LABELS: SparklineLabels = {\n rising: (first, last) => `Rising from ${first} to ${last}`,\n falling: (first, last) => `Falling from ${first} to ${last}`,\n flat: (value) => `Unchanged at ${value}`,\n single: (value) => `One value: ${value}`,\n noData: \"No data\",\n named: (name, summary) => `${name}: ${summary}`,\n};\n", "// The English words of ./stat-tile, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./stat-tile re-exports them.\n\nimport type { StatTileLabels } from \"./stat-tile\";\n\nexport const DEFAULT_STAT_TILE_LABELS: StatTileLabels = {\n increase: (amount) => `Up ${amount}`,\n decrease: (amount) => `Down ${amount}`,\n unchanged: \"No change\",\n better: (change) => `${change} (better)`,\n worse: (change) => `${change} (worse)`,\n noValue: \"No data\",\n loading: \"Loading\u2026\",\n};\n", "// The English words of ./signature-pad, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./signature-pad re-exports them.\n\nimport type { SignaturePadLabels } from \"./signature-pad\";\n\nexport const DEFAULT_SIGNATURE_PAD_LABELS: SignaturePadLabels = {\n label: \"Signature\",\n instructions: \"Sign in the box with a mouse, your finger or a pen.\",\n typedFallbackHint: \"If you cannot draw, type your name instead.\",\n empty: \"Nothing drawn yet\",\n signed: \"Signature drawn\",\n undo: \"Undo last stroke\",\n clear: \"Clear\",\n save: \"Save signature\",\n useTyped: \"Type name instead\",\n useDrawn: \"Draw instead\",\n typedName: \"Full name\",\n cleared: \"Signature cleared\",\n undone: \"Last stroke removed\",\n viewEmpty: \"Not signed\",\n viewDrawn: \"Handwritten signature\",\n viewTyped: (name) => `Signed with the typed name ${name}`,\n};\n", "// The English words of ./password-strength, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./password-strength re-exports them.\n\nimport type { PasswordStrengthLabels } from \"./password-strength\";\n\nexport const DEFAULT_PASSWORD_STRENGTH_LABELS: PasswordStrengthLabels = {\n tooShort: \"Too short\",\n weak: \"Weak\",\n fair: \"Fair\",\n good: \"Good\",\n strong: \"Strong\",\n announcement: (level) => `Password strength: ${level}`,\n ruleLength: (minLength) => `At least ${minLength} characters`,\n ruleCase: \"Upper and lower case\",\n ruleDigit: \"A number\",\n ruleSymbol: \"A symbol\",\n optional: (rule) => `${rule} (optional)`,\n met: \"Met:\",\n notMet: \"Not met:\",\n tooLong: (maxBytes) =>\n `At most ${maxBytes} characters (accents and emoji count for more than one).`,\n};\n", "// The English words of ./danger-confirm, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./danger-confirm re-exports them.\n\nimport type { DangerConfirmLabels } from \"./danger-confirm\";\n\n/** `satisfies` rather than a type annotation, so `DEFAULT_DANGER_CONFIRM_LABELS.phrase`\n * stays callable for a caller that composes its own label from it. */\nexport const DEFAULT_DANGER_CONFIRM_LABELS = {\n arm: \"Delete\u2026\",\n confirm: \"Delete\",\n cancel: \"Cancel\",\n prompt: \"This cannot be undone.\",\n password: \"Password\",\n phrase: (phrase: string) => `Type \u201C${phrase}\u201D to confirm`,\n acknowledge: \"I have read what this does and want to continue.\",\n needsPhrase: (phrase: string) => `Type \u201C${phrase}\u201D to confirm`,\n needsAcknowledge: \"Tick the box to confirm\",\n needsPassword: \"Enter your password to confirm\",\n} satisfies DangerConfirmLabels;\n", "// The English words of ./swatch-picker, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./swatch-picker re-exports them.\n\nimport type { SwatchPickerLabels } from \"./swatch-picker\";\n\nexport const DEFAULT_SWATCH_PICKER_LABELS: SwatchPickerLabels = {\n none: \"No colour\",\n mixed: \"Mixed: the selected items have different colours\",\n};\n", "// The English words of ./icon-picker, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./icon-picker re-exports them.\n\nimport type { IconPickerLabels } from \"./icon-picker\";\n\nexport const DEFAULT_ICON_PICKER_LABELS: IconPickerLabels = {\n none: \"No icon\",\n mixed: \"Mixed: the selected items have different icons\",\n search: \"Search icons\",\n noResults: \"No icons match\",\n resultCount: (count) => (count === 1 ? \"1 icon\" : `${count} icons`),\n};\n", "// The English words of ./dialog-frame, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./dialog-frame re-exports them.\n\nimport type { DialogFrameLabels } from \"./dialog-frame\";\n\nexport const DEFAULT_DIALOG_FRAME_LABELS: DialogFrameLabels = { close: \"Close\" };\n", "// The English words of the file pickers (./use-file-picker), in a module with no component\n// code: the English catalogue (src/i18n/defaults.ts) imports them without the component, so\n// `en` loads as one chunk like the other languages (0.34, KS U8). In hooks/ beside the hook\n// since 0.34 (MOD-8); components/file-button re-exports them.\n\nimport type { FilePickerLabels } from \"./use-file-picker\";\n\nexport const DEFAULT_FILE_PICKER_LABELS: FilePickerLabels = {\n rejectedType: (name) => `\u201C${name}\u201D is not a supported file type`,\n rejectedTypeOnly: (accept) => `Only ${accept} files`,\n rejectedSize: (name, maxSize) => `\u201C${name}\u201D is larger than ${maxSize}`,\n rejectedCount: (name, maxFiles) =>\n `\u201C${name}\u201D was not added: at most ${maxFiles} ${maxFiles === 1 ? \"file\" : \"files\"}`,\n rejectedInvalid: (name) => `\u201C${name}\u201D cannot be used here`,\n rejectedMany: (count) => `${count} files were not added`,\n rejectedPick: (count) =>\n count === 1 ? \"The file was not added\" : `None of the ${count} files were added`,\n selected: (count, firstName) => (count === 1 ? `\u201C${firstName}\u201D selected` : `${count} files selected`),\n remove: (name) => `Remove \u201C${name}\u201D`,\n clearAll: \"Remove all files\",\n removed: (name) => `\u201C${name}\u201D removed`,\n cleared: \"All files removed\",\n dropzone: \"File upload\",\n browse: \"Browse\",\n empty: \"Drop a file here\",\n emptyMultiple: \"Drop files here\",\n hint: (accept) => (accept ? `Accepted: ${accept}` : \"Any file type\"),\n busy: \"Uploading\u2026\",\n};\n", "// The English words of ./measured-grid, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./measured-grid re-exports them.\n\nimport type { MeasuredGridLabels } from \"./measured-grid\";\n\n/** English defaults. Exported as the `measuredGrid` namespace of `UiKitLabels`\n * (src/i18n), the complete reference a translation is written against. */\nexport const DEFAULT_MEASURED_GRID_LABELS: MeasuredGridLabels = {\n view: \"Table view\",\n cellsView: \"Cells\",\n textView: \"Text\",\n addRow: \"Add row\",\n removeRow: (row) => `Remove row ${row}`,\n clear: \"Clear table\",\n pasteHint: \"Paste a block from a spreadsheet into any cell\",\n cell: (column, row) => `${column}, row ${row}`,\n rowNumber: \"Row\",\n rowActions: \"Row actions\",\n keyboardHint:\n \"Arrow keys move between cells. Type to replace a cell, F2 to edit it, Escape to undo the edit. Enter moves down and adds a row at the end.\",\n lineError: (line) => `Line ${line} could not be read`,\n points: (count) => (count === 1 ? \"1 point\" : `${count} points`),\n problems: (count) => (count === 1 ? \"1 cell is not a number\" : `${count} cells are not numbers`),\n};\n", "// The English words of ./confirm-dialog, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./confirm-dialog re-exports them.\n\nimport type { ConfirmDialogLabels } from \"./confirm-dialog\";\n\n/** `satisfies` rather than a type annotation, so `.typed` stays known-callable for a\n * caller composing its own label from it. */\nexport const DEFAULT_CONFIRM_DIALOG_LABELS = {\n confirm: \"Confirm\",\n cancel: \"Cancel\",\n typed: (text: string) => `Type \u201C${text}\u201D to confirm`,\n} satisfies ConfirmDialogLabels;\n", "// The English words of ./floating-panel, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./floating-panel re-exports them.\n\nimport type { FloatingPanelLabels } from \"./floating-panel\";\n\nexport const DEFAULT_FLOATING_PANEL_LABELS: FloatingPanelLabels = {\n close: \"Close\",\n badge: (count) => `${count} new`,\n};\n", "// The English words of ./feedback-attachment, in a module with no component code: the\n// English catalogue (src/i18n/defaults.ts) imports them without the component, so `en`\n// loads as one chunk like the other languages (0.34, KS U8). ./feedback-attachment\n// re-exports them.\n\nimport type { FeedbackAttachmentFieldLabels } from \"./feedback-attachment\";\n\n/**\n * English, in the feedback contract's wording since 0.27.0 (docs/feedback-harmonization.md\n * \u00A74.2: keksdose's `feedback.*` keys are the canon, and the kit owns them now). Three\n * strings moved with it:\n *\n * - `attachmentAdd` \"Attach image\" \u2192 **\"Add attachment\"**: the field takes a PDF or a text\n * log as well wherever the app passes `FEEDBACK_ATTACHMENT_ACCEPT` (keksdose feedback\n * #87), and a button that says \"image\" over a picker that offers a PDF is wrong in one\n * of the two places.\n * - `attachmentPaste` \u2192 keksdose's longer line, which says WHY one would paste \u2014 a region\n * snip shows one corner rather than the whole page (Steering Design feedback #39).\n * - `attachmentLimit` for one: \"remove **it**\", as keksdose's `attachments_full_one`;\n * \"remove one\" of a single file read oddly.\n */\nexport const DEFAULT_FEEDBACK_ATTACHMENT_LABELS: FeedbackAttachmentFieldLabels = {\n attachmentAdd: \"Add attachment\",\n attachmentCapture: \"Capture screenshot\",\n attachmentPaste: \"\u2026or paste a screenshot straight from the clipboard, so you can show one corner rather than the whole page.\",\n attachmentRemove: \"Remove attachment\",\n attachmentList: \"Attachments\",\n attachmentScreenshot: \"Screenshot\",\n attachmentRemoveFile: (name) => `Remove ${name}`,\n attachmentLimit: (max) =>\n max === 1\n ? \"Up to 1 attachment \u2014 remove it to add another.\"\n : `Up to ${max} attachments \u2014 remove one to add another.`,\n attachmentUploading: \"Uploading\u2026\",\n attachmentUploadFailed: (name) => `\u201C${name}\u201D could not be uploaded`,\n};\n", "// The English words of ./feedback-dialog, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./feedback-dialog re-exports them.\n\nimport type { FeedbackDialogTextLabels } from \"./feedback-dialog\";\n\n/**\n * English. The feedback contract's wording (docs/feedback-harmonization.md \u00A74.2, 0.27.0):\n * \"Send\", not keksdose's \"Save\", and the body asks \"What happened?\" (Marcel's two calls);\n * the rest is keksdose's. Since 0.27.0 `attachment`, the single-mode heading, is keksdose's\n * `feedback.attachment` **\"Attachment\"** (it said \"Screenshot\" over a button that says \"Add\n * attachment\" and a picker that may offer a PDF), and `submitHint` is keksdose's\n * **\"Ctrl+Enter to send\"** \u2014 \"\u2318 Enter to send\" on Apple platforms, where the old\n * \"Ctrl/\u2318 + Enter\" made every reader parse both. The `attachments=\"multiple\"` heading is\n * `feedbackAttachment.attachmentList` (\"Attachments\") and did not change.\n */\nexport const DEFAULT_FEEDBACK_DIALOG_LABELS: FeedbackDialogTextLabels = {\n title: \"Send feedback\",\n category: \"Category\",\n subject: \"Subject\",\n body: \"What happened?\",\n bodyOptional: \"What happened? (optional)\",\n attachment: \"Attachment\",\n // The modifier as `form.submitShortcut` writes it: \"\u2318 Enter\" on Apple, \"Ctrl+Enter\" elsewhere.\n submitHint: (apple) => (apple ? \"\u2318 Enter to send\" : \"Ctrl+Enter to send\"),\n cancel: \"Cancel\",\n save: \"Send\",\n publicNotice: \"Other users will see the title and text (never your screenshots or files).\",\n};\n", "// The English words of ./feedback-thread, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./feedback-thread re-exports them.\n\nimport type { FeedbackComposerLabels, FeedbackThreadLabels } from \"./feedback-thread\";\n\nexport const DEFAULT_FEEDBACK_THREAD_LABELS: FeedbackThreadLabels = {\n thread: \"Comments\",\n empty: \"No comments yet\",\n loading: \"Loading comments\u2026\",\n you: \"You\",\n staff: \"Staff\",\n attachments: \"Attachments\",\n};\n\nexport const DEFAULT_FEEDBACK_COMPOSER_LABELS: FeedbackComposerLabels = {\n field: \"Write a comment\",\n placeholder: \"Write a comment\u2026\",\n send: \"Send\",\n sendHint: (modifier) => `${modifier} + Enter to send`,\n sendHintEnter: \"Enter to send, Shift + Enter for a new line\",\n};\n", "import { useKitLabels, type LabelOverride } from \"../i18n/kit-labels\";\nimport type { FeedbackCategory, FeedbackStatus } from \"./feedback-vocabulary\";\n\n/**\n * The words of a report's status and category, and the toasts a feedback page shows \u2014\n * three `<UiKitProvider labels>` namespaces (0.27.0).\n *\n * Until 0.27 every app kept its own map from the enum to a translation key (keksdose\n * `STATUS_LABEL` and `categoryLabelKey`, \"the package has no translations\"), and the\n * three German maps had drifted apart: Kurvenschmiede said \"In Arbeit\", \"In Pr\u00FCfung\",\n * \"Test auf der Live-Umgebung\" where keksdose and kastlan said \"In Bearbeitung\",\n * \"Zur Pr\u00FCfung\", \"Live testen\". Marcel's feedback round (2026-10-04,\n * docs/feedback-harmonization.md \u00A72.4) made keksdose's wording the canon and the kit its\n * owner, in all seven languages. The English defaults below are keksdose's\n * `frontend/src/shared/i18n/locales/en.json` (`feedback.*`); the de-CH canon for the\n * catalogues is noted on each key (keksdose `de-CH.json` \u2014 ss, never \u00DF).\n *\n * `FeedbackStatusBadge`, `FeedbackCategoryBadge` and `FeedbackStatusTransitions` read\n * the first two by default, so an app drops its own maps; a `label` passed to them still\n * wins.\n */\n\n/**\n * `feedbackStatus` \u2014 one word per status, keyed by the enum value so\n * `labels[row.status]` is the whole lookup.\n *\n * de-CH canon: OPEN \"Offen\" \u00B7 READY \"Bereit zur Umsetzung\" \u00B7 REWORK \"Nacharbeit angefordert\"\n * (0.40, \u00A710.6) \u00B7 IN_PROGRESS \"In Bearbeitung\" \u00B7 IN_EVALUATION \"Zur Pr\u00FCfung\"\n * \u00B7 NEEDS_LIVE_TEST \"Live testen\" \u00B7 POSTPONED \"Zur\u00FCckgestellt\" \u00B7 DONE \"Erledigt\" \u00B7\n * WONT_DO \"Wird nicht umgesetzt\".\n */\nexport type FeedbackStatusLabels = Record<FeedbackStatus, string>;\n\nexport const DEFAULT_FEEDBACK_STATUS_LABELS: FeedbackStatusLabels = {\n OPEN: \"Open\",\n READY: \"Ready to implement\",\n REWORK: \"Rework requested\",\n IN_PROGRESS: \"In progress\",\n IN_EVALUATION: \"In evaluation\",\n NEEDS_LIVE_TEST: \"Test when live\",\n POSTPONED: \"Postponed\",\n DONE: \"Done\",\n WONT_DO: \"Won't do\",\n};\n\n/**\n * `feedbackCategory` \u2014 one word per category, keyed by the enum value. `CRASH` is never\n * pickable, but it is shown: on the badge, in the filter, in a row's detail.\n *\n * de-CH canon: CRASH \"Absturz\" \u00B7 BUG \"Fehler\" \u00B7 IDEA \"Idee\" \u00B7 QUESTION \"Frage\" \u00B7\n * OTHER \"Sonstiges\".\n */\nexport type FeedbackCategoryLabels = Record<FeedbackCategory, string>;\n\nexport const DEFAULT_FEEDBACK_CATEGORY_LABELS: FeedbackCategoryLabels = {\n CRASH: \"Crash\",\n BUG: \"Bug\",\n IDEA: \"Idea\",\n QUESTION: \"Question\",\n OTHER: \"Other\",\n};\n\n/**\n * `feedbackToast` \u2014 what the submit dialog, a failed save and a status change say in a\n * toast (\u00A74.2, \u00A74.4, \u00A74.5 of the contract). A server's `detail` sentence, when it sent\n * one, wins over `submitFailed` and `updateFailed` (\u00A73.7); that choice is the caller's.\n */\nexport interface FeedbackToastLabels {\n /** A report was filed. de-CH: \"Danke f\u00FCr Ihr Feedback!\" */\n submitted: string;\n /** `POST /feedback` failed with no `detail` of its own.\n * de-CH: \"Feedback konnte nicht gesendet werden\" */\n submitFailed: string;\n /** A picked file is not an image, a PDF or a text file (\u00A73.5).\n * de-CH: \"Nur Bilder, PDF- oder Textdateien sind erlaubt\" */\n attachmentUnsupported: string;\n /** A picked file is over the 10 MB the contract allows (\u00A73.5).\n * de-CH: \"Datei ist gr\u00F6sser als 10 MB\" */\n attachmentTooLarge: string;\n /** More files were picked than fit; `count` is how many fit.\n * de-CH: \"Es passen nur {{count}} Anh\u00E4nge \u2013 die \u00FCbrigen wurden weggelassen.\" */\n attachmentTooMany: (count: number) => string;\n /** The screenshot capture failed (or its optional peer is not installed).\n * de-CH: \"Screenshot konnte nicht aufgenommen werden\" */\n captureFailed: string;\n /** A `PATCH /feedback/{id}` failed with no `detail` of its own (\u00A74.4).\n * de-CH: \"\u00C4nderung konnte nicht gespeichert werden.\" */\n updateFailed: string;\n /** A status change landed \u2014 the 8 s Undo toast (\u00A74.5). `status` is the NEW status's\n * label, `title` the report's title. de-CH: \"Auf \u201E{{status}}\u201C gesetzt: {{title}}\" */\n statusChanged: (status: string, title: string) => string;\n /** That toast's action. de-CH: \"R\u00FCckg\u00E4ngig\" */\n statusUndo: string;\n /** The Undo landed \u2014 `status` is the RESTORED status's label.\n * de-CH: \"Zur\u00FCck auf \u201E{{status}}\u201C: {{title}}\" */\n statusRestored: (status: string, title: string) => string;\n /** 0.38.1: `POST /feedback/{id}/comments` failed with no `detail` of its own \u2014 for\n * `FeedbackCommentThread`'s `onComment`. de-CH: \"Kommentar konnte nicht gesendet\n * werden.\" */\n commentFailed: string;\n /** 0.38.1: `PUT` / `DELETE /feedback/{id}/vote` failed with no `detail` of its own \u2014\n * for `FeedbackVoteButton`'s `onVote` (the button rolls back; the app toasts).\n * de-CH: \"Stimme konnte nicht gespeichert werden.\" */\n voteFailed: string;\n /** 0.38.1: `POST /feedback/{id}/replies` failed with no `detail` of its own \u2014 for\n * `FeedbackRowDetail`'s `onReply`. de-CH: \"Antwort konnte nicht gesendet werden.\" */\n replyFailed: string;\n}\n\nexport const DEFAULT_FEEDBACK_TOAST_LABELS: FeedbackToastLabels = {\n submitted: \"Thanks for the feedback!\",\n submitFailed: \"Could not submit feedback\",\n attachmentUnsupported: \"Only images, PDF or text files are allowed\",\n attachmentTooLarge: \"File is larger than 10 MB\",\n attachmentTooMany: (count) =>\n count === 1\n ? \"Only 1 attachment fits \u2014 the rest were left out.\"\n : `Only ${count} attachments fit \u2014 the rest were left out.`,\n captureFailed: \"Could not capture a screenshot\",\n updateFailed: \"Could not save that change.\",\n statusChanged: (status, title) => `Set to \u201C${status}\u201D: ${title}`,\n statusUndo: \"Undo\",\n statusRestored: (status, title) => `Back to \u201C${status}\u201D: ${title}`,\n commentFailed: \"Could not post the comment.\",\n voteFailed: \"Could not save your vote.\",\n replyFailed: \"Could not send the reply.\",\n};\n\n/** `feedbackStatus` resolved: English, then `<UiKitProvider labels>`, then `labels`. For\n * the places that need a status's name outside the kit's own parts \u2014 a filter's options,\n * `feedbackSwipePlan`'s panels, an app's overview tile. */\nexport function useFeedbackStatusLabels(labels?: LabelOverride<FeedbackStatusLabels>): FeedbackStatusLabels {\n return useKitLabels(\"feedbackStatus\", DEFAULT_FEEDBACK_STATUS_LABELS, labels);\n}\n\n/** `feedbackCategory` resolved: English, then the provider, then `labels`. */\nexport function useFeedbackCategoryLabels(labels?: LabelOverride<FeedbackCategoryLabels>): FeedbackCategoryLabels {\n return useKitLabels(\"feedbackCategory\", DEFAULT_FEEDBACK_CATEGORY_LABELS, labels);\n}\n\n/** `feedbackToast` resolved: English, then the provider, then `labels`. */\nexport function useFeedbackToastLabels(labels?: LabelOverride<FeedbackToastLabels>): FeedbackToastLabels {\n return useKitLabels(\"feedbackToast\", DEFAULT_FEEDBACK_TOAST_LABELS, labels);\n}\n", "// The English words of ./feedback-menu, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./feedback-menu re-exports them.\n\nimport type { FeedbackMenuLabels } from \"./feedback-menu\";\n\nexport const DEFAULT_FEEDBACK_MENU_LABELS: FeedbackMenuLabels = {\n trigger: \"Send feedback\",\n myFeedback: \"My feedback\",\n discussion: \"Feedback discussion\",\n inbox: \"Feedback inbox\",\n};\n", "// The English words of the public feedback pages (round 0.38, docs/feedback-harmonization.md\n// \u00A79.15) \u2014 `FeedbackPublicList`, `FeedbackPublicDetail` and `FeedbackPublicSwitch` \u2014 in a\n// module with no component code: the English catalogue (src/i18n/defaults.ts) imports\n// them without the components, as every `*-labels.ts` (0.34, KS U8).\n\n/**\n * `feedbackPublic` \u2014 the words of the pages every user reads (\u00A79.3, \u00A79.9): the list's\n * sort, search and count, the detail's sections and the \"Visible to others\" switch. The\n * table's column names that the inbox already has (#, Date, Category, Subject, Status)\n * stay `feedbackPage`'s, so the two lists cannot disagree; the vote button's words are\n * `feedbackVote`'s, the thread's `feedbackComments`'.\n *\n * de-CH canon (\u00A79.2, \u00A79.5, \u00A710.6): `title` \"Feedback-Diskussion\", `anonymous` \"Eine Person\".\n */\nexport interface FeedbackPublicLabels {\n /** The page's heading \u2014 keksdose's `/all-feedback`, the menu's \"Feedback discussion\"\n * (0.40, \u00A710.2 decision 11; \"All feedback\" before). de-CH \"Feedback-Diskussion\". */\n title: string;\n /** The sort toggle's accessible name. */\n sort: string;\n /** `sort=newest`, the server's default. */\n sortNewest: string;\n /** `sort=votes`: most votes, then newest. */\n sortVotes: string;\n /** `sort=updated`. */\n sortUpdated: string;\n /** The search box's accessible name: it searches titles only (\u00A79.9). */\n search: string;\n /** The Votes column's header. */\n columnVotes: string;\n /** How many reports the server has for this query (`total`). */\n total: (count: number) => string;\n /** A row's visible comments, the chip beside its title. */\n comments: (count: number) => string;\n /** A row's votes, the count on a phone card (the button is in the opened report). */\n votes: (count: number) => string;\n /** A `null` name (\u00A79.5): an incomplete or erased account. */\n anonymous: string;\n /** Who filed it, with the server's first name (or {@link anonymous}). */\n filedBy: (name: string) => string;\n /** The detail's public body section. */\n body: string;\n /** The detail's merged replies and comments (\u00A79.8, \"Order\"). */\n conversation: string;\n /** While the list or the comments load. */\n loading: string;\n /** No public report (yet, or for this search). */\n empty: string;\n /** `FeedbackPublicSwitch`'s label (\u00A79.3, decision 6). */\n visibleToOthers: string;\n /** The line under it: what others see, and what never. */\n visibleHint: string;\n /** Why the author cannot flip it now: the report is past its open window (\u00A79.3). */\n visibleLocked: string;\n /** 0.38.1: the pager's \"where am I\" \u2014 `page` counts from 1. The server answers no\n * total, so there is no \"of N\". */\n page: (page: number) => string;\n}\n\nexport const DEFAULT_FEEDBACK_PUBLIC_LABELS: FeedbackPublicLabels = {\n title: \"Feedback discussion\",\n sort: \"Sort\",\n sortNewest: \"Newest\",\n sortVotes: \"Most wanted\",\n sortUpdated: \"Recently updated\",\n search: \"Search titles\",\n columnVotes: \"Votes\",\n total: (count) => (count === 1 ? \"1 report\" : `${count} reports`),\n comments: (count) => (count === 1 ? \"1 comment\" : `${count} comments`),\n votes: (count) => (count === 1 ? \"1 vote\" : `${count} votes`),\n anonymous: \"A user\",\n filedBy: (name) => `From ${name}`,\n body: \"Description\",\n conversation: \"Answers and comments\",\n loading: \"Loading\u2026\",\n empty: \"No reports yet\",\n visibleToOthers: \"Visible to others\",\n visibleHint: \"Other users see the title and text, never your screenshots or files.\",\n visibleLocked: \"Only while the report is still open.\",\n page: (page) => `Page ${page}`,\n};\n", "// The English words of `useFeedbackNotificationTypes` (round 0.38), in a module with no\n// component code, as every `*-labels.ts`: the English catalogue imports them alone.\n\n/**\n * `feedbackNotificationTypes` \u2014 the setting words of the feedback notification types\n * (docs/feedback-harmonization.md \u00A79.11). In the kit, not in each app, because two apps\n * declare them (keksdose, Kurvenschmiede; kastlan `feedback_answered` alone). The mail and\n * push texts stay the app's.\n */\nexport interface FeedbackNotificationTypesLabels {\n /** `feedback_answered`: a reply on a report the person wrote or commented on. */\n answered: string;\n answeredDescription: string;\n /** `feedback_comment`: a visible comment on such a report. */\n comment: string;\n commentDescription: string;\n /** 0.46 (feedback \u00A711): `feedback_received`, an admin's alert for a new report, a\n * rework and a new crash. */\n received: string;\n receivedDescription: string;\n /** A heading the apps may put over the admin's types (\"Admin\"). */\n adminGroup: string;\n}\n\nexport const DEFAULT_FEEDBACK_NOTIFICATION_TYPES_LABELS: FeedbackNotificationTypesLabels = {\n answered: \"Answers to your reports\",\n answeredDescription: \"When a report you wrote or commented on gets an answer.\",\n comment: \"Comments on reports you follow\",\n commentDescription: \"When someone comments on a report you wrote or commented on.\",\n received: \"New feedback and reworks\",\n receivedDescription: \"When someone files a report or sends one back.\",\n adminGroup: \"Admin\",\n};\n", "// The English words of ./feedback-context, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./feedback-context re-exports them.\n\nimport type { FeedbackContextLabels } from \"./feedback-context\";\n\nexport const DEFAULT_FEEDBACK_CONTEXT_LABELS: FeedbackContextLabels = {\n user: \"User\",\n attachUrl: \"Attach current page URL\",\n};\n", "// The English words of ./feedback-table, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./feedback-table re-exports them.\n\nimport type { FeedbackPageLabels } from \"./feedback-table\";\n\nexport const DEFAULT_FEEDBACK_PAGE_LABELS: FeedbackPageLabels = {\n title: \"Feedback inbox\",\n myTitle: \"My feedback\",\n columnId: \"#\",\n columnDate: \"Date\",\n columnCategory: \"Category\",\n columnSubject: \"Subject\",\n columnUser: \"User\",\n columnEmail: \"Email\",\n columnUrl: \"URL\",\n columnStatus: \"Status\",\n columnResolved: \"Resolved\",\n openPage: \"Open page\",\n empty: \"None\",\n deletedUser: \"<deleted user>\",\n userFallback: (id) => `user #${id}`,\n environment: (environment) => String(environment ?? \"\").toUpperCase(),\n reworkChip: (count) => (count === 1 ? \"Rework\" : `Rework \u00D7${count}`),\n awaitingFilter: \"Only what is waiting for you\",\n phoneActions: \"Feedback actions\",\n};\n", "// The English words of ./feedback-row-detail, in a module with no component code: the\n// English catalogue (src/i18n/defaults.ts) imports them without the component, so `en`\n// loads as one chunk like the other languages (0.34, KS U8). ./feedback-row-detail\n// re-exports them.\n\nimport type { FeedbackDetailLabels } from \"./feedback-row-detail\";\n\nexport const DEFAULT_FEEDBACK_DETAIL_LABELS: FeedbackDetailLabels = {\n subject: \"Subject\",\n body: \"Description\",\n edit: \"Edit\",\n editDescription: \"Edit description\",\n save: \"Save\",\n cancel: \"Cancel\",\n url: \"URL\",\n copyUrl: \"Copy URL\",\n attachment: \"Attachment\",\n download: (name) => `Download ${name}`,\n downloadFailed: \"The attachment could not be downloaded.\",\n outcome: \"Outcome\",\n replies: \"Replies\",\n resolvedAt: (date) => `Resolved: ${date}`,\n outcomeAdd: \"Add outcome\",\n outcomeUpdate: \"Update\",\n outcomePlaceholder: \"What was done, decided, or why this won't be addressed.\",\n rework: \"Rework\",\n reworkTitle: \"Send for rework\",\n reworkSend: \"Send rework\",\n reworkPlaceholder: \"What still needs refinement? Any new constraints or change of direction.\",\n reworkUploadFailed: \"The file could not be uploaded. The rework was not sent.\",\n status: \"Status\",\n note: \"Note\",\n};\n", "// The English words of round 0.38's thread parts \u2014 ./feedback-vote-button,\n// ./feedback-comment-thread and ./feedback-replies \u2014 in a module with no component code:\n// the English catalogue (src/i18n/defaults.ts) imports them without the components, so\n// `en` loads as one chunk like the other languages (0.34, KS U8). Each component module\n// re-exports its own.\n\nimport type { FeedbackCommentsLabels } from \"./feedback-comment-thread\";\nimport type { FeedbackRepliesLabels } from \"./feedback-replies\";\nimport type { FeedbackVoteLabels } from \"./feedback-vote-button\";\n\nexport const DEFAULT_FEEDBACK_VOTE_LABELS: FeedbackVoteLabels = {\n vote: \"I want this too\",\n own: \"Your report\",\n};\n\nexport const DEFAULT_FEEDBACK_REPLIES_LABELS: FeedbackRepliesLabels = {\n replies: \"Replies\",\n empty: \"No reply yet\",\n admin: \"Admin\",\n statusChanged: \"Status changed to\",\n field: \"Write a reply\",\n placeholder: \"Write a reply\u2026\",\n reply: \"Reply\",\n status: \"Status with the reply\",\n noChange: \"No change\",\n nudge: \"The author has not been told. Add a reply.\",\n};\n\nexport const DEFAULT_FEEDBACK_COMMENTS_LABELS: FeedbackCommentsLabels = {\n comments: \"Comments\",\n empty: \"No comments yet\",\n hidden: \"Hidden by an admin\",\n hide: \"Hide\",\n unhide: \"Unhide\",\n delete: \"Delete\",\n deleteTitle: \"Delete this comment?\",\n deleteBody: \"It is removed for everyone. This cannot be undone.\",\n field: \"Write a comment\",\n placeholder: \"Write a comment\u2026\",\n send: \"Comment\",\n};\n", "import { useMemo } from \"react\";\nimport { useKitLabelOverrides } from \"../i18n/kit-labels\";\n\n/**\n * The `accountSettings` namespace of `<UiKitProvider labels>`: one record per section \u2014\n * `profile`, `password`, `twoFactor`, `passkeys` \u2014 each merged key by key, so an app\n * can translate `accountSettings.twoFactor.scanHint` alone.\n *\n * Before 0.12.0 every section took a REQUIRED `labels` prop and had no English of its\n * own, so each app spelled out 30-odd keys at the call site and still hard-coded some\n * (kastlan's profile page passed `email: \"Email\"` in English to a German page). The\n * prop stays, now partial, and wins over the provider as everywhere else in the kit.\n *\n * Its own module, beside the components rather than in them, so `PasskeysSetting`\n * (its own file) and the older three read one tree without importing each other.\n */\n\nexport interface ProfileSettingLabels {\n title: string;\n email: string;\n role: string;\n memberSince: string;\n /** The single name field \u2014 the card without `firstName` / `lastName`. */\n displayName: string;\n save: string;\n /**\n * 0.30.0 (docs/user-admin-harmonization.md \u00A76.1): the two fields that replace\n * `displayName` once the card is given `firstName` / `lastName`. OPTIONAL, like\n * `TwoFactorSettingLabels.qrAlt` and for its reason \u2014 this interface is annotated at\n * call sites \u2014 and filled from the provider's `accountSettings.profile`, then English.\n */\n firstName?: string;\n lastName?: string;\n /** Why Save is held while a name is blank: both are required (\u00A73.1). */\n nameRequired?: string;\n}\n\nexport interface PasswordSettingLabels {\n title: string;\n current: string;\n next: string;\n confirm: string;\n submit: string;\n tooShort: string;\n mismatch: string;\n /**\n * 0.34 (KS U3): `password_incorrect` \u2014 server-kit's `400` for a wrong current\n * password \u2014 under the current-password field, in the words `EmailChangeSetting`\n * and `DeleteAccountSetting` say it with. OPTIONAL, like\n * `TwoFactorSettingLabels.qrAlt` and for its reason \u2014 this interface is annotated at\n * call sites \u2014 and filled from the provider's `accountSettings.password`, then English.\n */\n wrongPassword?: string;\n}\n\nexport interface TwoFactorSettingLabels {\n /**\n * Before 0.31 the card's one line, \"<status>: On\". Since 0.31 the setting's name is the\n * card's {@link title} and the state stands beside it, so this is read only where no\n * `title` is given at the same level \u2014 an app that translated `status` keeps its word\n * as the title.\n */\n status: string;\n enabledText: string;\n disabledText: string;\n enable: string;\n scanHint: string;\n codeLabel: string;\n verify: string;\n disableSection: string;\n password: string;\n disable: string;\n /**\n * Alt text for the setup QR code, which shipped as a hardcoded `alt=\"QR\"`.\n *\n * OPTIONAL, like the two keys below, and not because it matters less: this interface\n * is annotated at consumer call sites (`const LABELS: TwoFactorSettingLabels = {\u2026}`),\n * so a new REQUIRED key is a compile error in every app on the next `npm update` \u2014\n * the additive-API rule in the README. Each falls back to the provider's\n * `accountSettings.twoFactor`, then English.\n */\n qrAlt?: string;\n /** The line over the manual-entry key, for a phone that cannot scan its own screen. */\n secretHint?: string;\n /** The copy button beside that key. */\n copySecret?: string;\n /**\n * 0.31.0 (docs/settings-harmonization.md \u00A73.7): the card's title, a heading inside a\n * `SettingsLayout`. OPTIONAL for the reason `qrAlt` is. Unset, the same source's\n * `status` stands in for it, then English.\n */\n title?: string;\n}\n\nexport interface PasskeysSettingLabels {\n title: string;\n /** The line under the title saying what a passkey is for \u2014 `mode=\"instead\"` (the\n * default): the passkey stands in for the password. */\n description: string;\n /**\n * The same line for `mode=\"alongside\"` (0.18.0): the password keeps working and the\n * passkey is a second way in. OPTIONAL for the reason `TwoFactorSettingLabels.qrAlt`\n * is \u2014 this interface is annotated at call sites \u2014 and filled from the provider's\n * `accountSettings.passkeys`, then English.\n */\n descriptionAlongside?: string;\n empty: string;\n loading: string;\n /** Accessible name of the list. */\n list: string;\n nameLabel: string;\n namePlaceholder: string;\n add: string;\n /** The add button while the app's WebAuthn ceremony runs \u2014 the OS prompt is open. */\n adding: string;\n rename: string;\n /** The row's rename button, named for its passkey \u2014 it starts with `rename`, the\n * visible text, so voice control finds it by what it says. */\n renameItem: (name: string) => string;\n /** Accessible name of the inline rename field. */\n renameField: (name: string) => string;\n save: string;\n cancel: string;\n delete: string;\n /** The row's delete button, named for its passkey (see `renameItem`). */\n deleteItem: (name: string) => string;\n /** The inline question a delete asks first. */\n deleteConfirm: (name: string) => string;\n /** The destructive button that answers it. */\n confirmDelete: string;\n /** `date` arrives formatted in the provider's locale. */\n created: (date: string) => string;\n lastUsed: (date: string) => string;\n neverUsed: string;\n}\n\nexport interface AccountSettingsLabels {\n profile: Required<ProfileSettingLabels>;\n password: Required<PasswordSettingLabels>;\n // `Required` here, optional on the section interfaces: the namespace is what a full\n // catalogue (`@eifi1/ui-kit/i18n/<code>`, `missingKitLabels`) is written against, so\n // it must name the late keys; the section interfaces are annotated at call sites.\n twoFactor: Required<TwoFactorSettingLabels>;\n passkeys: Required<PasskeysSettingLabels>;\n}\n\nexport const DEFAULT_ACCOUNT_SETTINGS_LABELS: AccountSettingsLabels = {\n profile: {\n title: \"Profile\",\n email: \"Email\",\n role: \"Role\",\n memberSince: \"Member since\",\n displayName: \"Display name\",\n save: \"Save\",\n firstName: \"First name\",\n lastName: \"Last name\",\n nameRequired: \"Enter both a first and a last name.\",\n },\n password: {\n title: \"Change password\",\n current: \"Current password\",\n next: \"New password\",\n confirm: \"Confirm new password\",\n submit: \"Change password\",\n tooShort: \"The new password is too short.\",\n mismatch: \"The passwords don\u2019t match.\",\n // The siblings' sentence (emailChange, deleteAccount), under the current password.\n wrongPassword: \"The password is incorrect.\",\n },\n twoFactor: {\n status: \"Two-factor authentication\",\n enabledText: \"On\",\n disabledText: \"Off\",\n enable: \"Set up two-factor authentication\",\n scanHint: \"Scan this code with your authenticator app, then enter the code it shows.\",\n codeLabel: \"Verification code\",\n verify: \"Verify and turn on\",\n disableSection: \"Turn off two-factor authentication\",\n password: \"Current password\",\n disable: \"Turn off\",\n // Unchanged from the fallback it had before the namespace (i18n-labels.test pins it).\n qrAlt: \"QR code\",\n secretHint: \"Can\u2019t scan it? Enter this key in the app instead:\",\n copySecret: \"Copy key\",\n title: \"Two-factor authentication\",\n },\n passkeys: {\n title: \"Passkeys\",\n description: \"Sign in with your fingerprint, face or device PIN instead of a password.\",\n // Kurvenschmiede overrode `description` because \"instead of\" is false where the\n // password stays; this is the sentence for those apps, picked by `mode`.\n descriptionAlongside: \"Sign in with your fingerprint, face or device PIN. Your password keeps working too.\",\n empty: \"No passkeys yet\",\n loading: \"Loading passkeys\u2026\",\n list: \"Your passkeys\",\n nameLabel: \"Name (optional)\",\n namePlaceholder: \"e.g. Laptop, Phone\",\n add: \"Add passkey\",\n adding: \"Waiting for your device\u2026\",\n rename: \"Rename\",\n renameItem: (name) => `Rename ${name}`,\n renameField: (name) => `New name for ${name}`,\n save: \"Save\",\n cancel: \"Cancel\",\n delete: \"Delete\",\n deleteItem: (name) => `Delete ${name}`,\n deleteConfirm: (name) => `Delete \u201C${name}\u201D? It can no longer be used to sign in.`,\n confirmDelete: \"Delete passkey\",\n created: (date) => `Added ${date}`,\n lastUsed: (date) => `Last used ${date}`,\n neverUsed: \"Never used\",\n },\n};\n\n/**\n * One section of the namespace, resolved: English, then the provider's\n * `accountSettings.<section>`, then the component's own `labels` prop. An `undefined`\n * in either source is skipped, so a prop object built from optional values cannot\n * blank out a default.\n */\nexport function useAccountSettingsLabels<K extends keyof AccountSettingsLabels>(\n section: K,\n prop?: Partial<AccountSettingsLabels[K]>,\n): AccountSettingsLabels[K] {\n const fromProvider = useKitLabelOverrides(\"accountSettings\")?.[section] as\n | Partial<AccountSettingsLabels[K]>\n | undefined;\n return useMemo(\n () => ({\n ...DEFAULT_ACCOUNT_SETTINGS_LABELS[section],\n ...definedOnly(fromProvider),\n ...definedOnly(prop),\n }),\n [section, fromProvider, prop],\n );\n}\n\nfunction definedOnly<T extends object>(value: T | undefined): Partial<T> {\n if (!value) return {};\n return Object.fromEntries(Object.entries(value).filter(([, v]) => v !== undefined)) as Partial<T>;\n}\n", "// The English words of ./copy-button, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./copy-button re-exports them.\n\nimport type { CopyButtonLabels } from \"./copy-button\";\n\nexport const DEFAULT_COPY_BUTTON_LABELS: CopyButtonLabels = {\n copy: \"Copy\",\n copied: \"Copied\",\n failed: \"Couldn\u2019t copy\",\n copiedAnnouncement: \"Copied to clipboard\",\n failedAnnouncement: \"Couldn\u2019t copy to the clipboard\",\n};\n", "// The English words of ./bulk-action-bar, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./bulk-action-bar re-exports them.\n\nimport type { BulkActionBarLabels } from \"./bulk-action-bar\";\n\nexport const DEFAULT_BULK_ACTION_BAR_LABELS: BulkActionBarLabels = {\n selected: (count) => `${count} selected`,\n clear: \"Clear selection\",\n cleared: \"Selection cleared\",\n};\n", "// The English words of ./list, in a module with no component code: the English catalogue\n// (src/i18n/defaults.ts) imports them without the component, so `en` loads as one chunk\n// like the other languages (0.34, KS U8). ./list re-exports them.\n\nimport type { ListLabels } from \"./list\";\n\nexport const DEFAULT_LIST_LABELS: ListLabels = {\n unread: \"Unread\",\n opensInNewTab: \"opens in a new tab\",\n};\n", "// The English words of ./breadcrumbs, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./breadcrumbs re-exports them.\n\nimport type { BreadcrumbsLabels } from \"./breadcrumbs\";\n\nexport const DEFAULT_BREADCRUMBS_LABELS: BreadcrumbsLabels = {\n label: \"Breadcrumb\",\n showAll: \"Show full path\",\n};\n", "// The English words of ./toast, in a module with no component code: the English catalogue\n// (src/i18n/defaults.ts) imports them without the component, so `en` loads as one chunk\n// like the other languages (0.34, KS U8). ./toast re-exports them.\n\nimport type { ToastLabels } from \"./toast\";\n\nexport const DEFAULT_TOAST_LABELS: ToastLabels = {\n close: \"Close notification\",\n notifications: \"Notifications\",\n undo: \"Undo\",\n redo: \"Redo\",\n};\n", "// The English words of ./form-actions, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./form-actions re-exports them.\n\nimport type { FormActionsLabels } from \"./form-actions\";\n\nexport const DEFAULT_FORM_ACTIONS_LABELS: FormActionsLabels = {\n save: \"Save\",\n cancel: \"Cancel\",\n submitShortcut: (apple) => (apple ? \"\u2318 Enter\" : \"Ctrl+Enter\"),\n};\n", "// The English words of ./description-list, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./description-list re-exports them.\n\nimport type { DescriptionListLabels } from \"./description-list\";\n\nexport const DEFAULT_DESCRIPTION_LIST_LABELS: DescriptionListLabels = {\n empty: \"\u2014\",\n};\n", "// The English words of ./line-items, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./line-items re-exports them.\n\nimport type { LineItemsLabels } from \"./line-items\";\n\nexport const DEFAULT_LINE_ITEMS_LABELS: LineItemsLabels = {\n add: \"Add row\",\n remove: (row) => `Remove row ${row}`,\n confirmRemove: (row) => `Remove row ${row}? Press again to confirm`,\n row: (row) => `Row ${row}`,\n cell: (column, row) => `${column}, row ${row}`,\n totals: \"Total\",\n};\n", "// The English words of ./progress-bar, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./progress-bar re-exports them.\n\nimport type { ProgressBarLabels } from \"./progress-bar\";\n\nexport const DEFAULT_PROGRESS_BAR_LABELS: ProgressBarLabels = {\n unlimited: \"Unlimited\",\n overLimit: (amount) => `${amount} over the limit`,\n};\n", "// The English words of ./signed-amount, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./signed-amount re-exports them.\n\nimport type { SignedAmountLabels } from \"./signed-amount\";\n\nexport const DEFAULT_SIGNED_AMOUNT_LABELS: SignedAmountLabels = {\n positive: (amount) => `plus ${amount}`,\n negative: (amount) => `minus ${amount}`,\n};\n", "// The English words of ./error-boundary, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./error-boundary re-exports them.\n\nimport type { ErrorBoundaryLabels } from \"./error-boundary\";\n\nexport const DEFAULT_ERROR_BOUNDARY_LABELS: ErrorBoundaryLabels = {\n title: \"Something went wrong\",\n message: \"This part of the page could not be shown. Try again, or reload the page.\",\n retry: \"Try again\",\n details: \"Error details\",\n reload: \"Reload\",\n updateTitle: \"A new version is available\",\n updateMessage: \"Part of the app has changed since this page was loaded. Reload to get the new version.\",\n offlineTitle: \"You\u2019re offline\",\n offlineMessage: \"This page could not be loaded without a connection. Reconnect, then reload the page.\",\n copyReport: \"Copy error report\",\n reported: \"This error has been reported automatically.\",\n reportedAs: (reference) => `Reported as ${reference}`,\n};\n", "// The English words of ./authed-image, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./authed-image re-exports them.\n\nimport type { AuthedImageLabels } from \"./authed-image\";\n\nexport const DEFAULT_AUTHED_IMAGE_LABELS: AuthedImageLabels = {\n loading: \"Loading image\u2026\",\n loadError: \"Image couldn\u2019t be loaded\",\n failedImage: (alt) => `${alt}: image couldn\u2019t be loaded`,\n};\n", "// The English words of ./image-grid, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./image-grid re-exports them.\n\nimport type { ImageGridLabels } from \"./image-grid\";\n\nexport const DEFAULT_IMAGE_GRID_LABELS: ImageGridLabels = {\n list: \"Images\",\n item: (index, count) => `Image ${index} of ${count}`,\n actions: (name) => `Actions for ${name}`,\n};\n", "// The English words of ./lightbox, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./lightbox re-exports them.\n\nimport type { LightboxLabels } from \"./lightbox\";\n\nexport const DEFAULT_LIGHTBOX_LABELS: LightboxLabels = {\n dialog: \"Image viewer\",\n close: \"Close\",\n previous: \"Previous image\",\n next: \"Next image\",\n counter: (index, count) => `${index} / ${count}`,\n position: (index, count) => `Image ${index} of ${count}`,\n download: \"Download\",\n zoom: \"Zoom\",\n noPreview: \"No preview available for this file\",\n openInNewTab: \"Open in new tab\",\n};\n", "// The English words of ./write-lock, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./write-lock re-exports them.\n\nimport type { WriteLockLabels } from \"./write-lock\";\n\nexport const DEFAULT_WRITE_LOCK_LABELS: WriteLockLabels = {\n reason: \"You can view this but not change it.\",\n offline: \"Needs a connection.\",\n};\n", "// The English words of ./legal, in a module with no component code: the English catalogue\n// (src/i18n/defaults.ts) imports them without the component, so `en` loads as one chunk\n// like the other languages (0.34, KS U8). ./legal re-exports them.\n\nimport type { LegalLabels } from \"./legal\";\n\nexport const DEFAULT_LEGAL_LABELS: LegalLabels = {\n navLabel: \"Legal\",\n links: {\n impressum: \"Imprint\",\n privacy: \"Privacy Policy\",\n terms: \"Terms\",\n },\n titles: {\n impressum: \"Imprint\",\n privacy: \"Privacy Policy\",\n terms: \"Terms of Service\",\n },\n backHome: \"Back to home\",\n accept: \"I accept the {terms} and the {privacy}\",\n notice: {\n beta: \"Closed beta. These texts have not been reviewed by a lawyer yet and will be before a public launch.\",\n privacy:\n \"Closed beta. The legal wording below has not been reviewed by a lawyer yet and will be before a public launch. The technical descriptions \u2014 what is stored, where, and who can read it \u2014 describe what the software actually does today, and are meant to be checked against it.\",\n },\n translation: {\n note: (o) =>\n `This is a translation for your convenience. The ${o.bindingLanguage} version is binding.`,\n show: (o) => `Show the ${o.bindingLanguage} version`,\n },\n sections: {\n impressum: {\n operator: {\n title: \"Operator\",\n body: (o) =>\n `${o.name}\\n${o.postalCode} ${o.city}\\n${o.country}\\n\\nThe full postal address is supplied on request to anyone with a legitimate legal interest; write to the contact address below.`,\n },\n contact: {\n title: \"Contact\",\n body: (o) => `Email: ${o.email}`,\n },\n disclaimer: {\n title: \"Liability for content and links\",\n body: \"This is a private, non-commercial project offered during a closed beta, without warranty. External sites we link to are the responsibility of their respective operators; we have no control over their content.\",\n commercial:\n \"This is a commercial service. Paid plans are sold by our reseller, which acts as the Merchant of Record: it sells the subscription in its own name, takes the payment, issues the invoice and handles VAT, and its terms of sale apply to the purchase. We take care that the content of this service is accurate, but cannot guarantee that it is complete or up to date. External sites we link to are the responsibility of their respective operators; we have no control over their content.\",\n },\n },\n privacy: {\n controller: {\n title: \"Controller\",\n body: (o) =>\n `The party responsible for processing personal data in this service is:\\n${o.name}\\n${o.postalCode} ${o.city}, ${o.country}\\nEmail: ${o.email}\\n\\nThe full postal address is supplied on request to data subjects and supervisory authorities.`,\n },\n legal_basis: {\n title: \"Legal basis\",\n body: \"As the operator is based in Switzerland, processing is governed by the Swiss Federal Act on Data Protection (FADP). Where the EU General Data Protection Regulation (GDPR) applies to you, we rely on the performance of a contract to provide the service (Art. 6(1)(b) GDPR) and our legitimate interest in operating and securing it (Art. 6(1)(f) GDPR).\",\n },\n browser: {\n title: \"What your browser stores\",\n lead: \"No cookies. The app keeps the following in your browser's storage:\",\n tail: \"None of it is used to track you. Entries waiting to be sent are sent to us as soon as they can be; everything else stays on your device. All of it disappears when you clear the site's data, and signing out removes the sign-in tokens.\",\n },\n rights: {\n title: \"Your rights\",\n lead: \"You have the right to access, rectification, erasure, restriction, data portability and objection.\",\n tail: \"If you are in Switzerland you may contact the Federal Data Protection and Information Commissioner (FDPIC); if you are in the EU you may lodge a complaint with your local supervisory authority.\",\n },\n contact: {\n title: \"Contact for data protection\",\n body: (o) => `For any privacy request, contact: ${o.email}`,\n },\n },\n terms: {\n warranty: {\n title: \"No warranty\",\n body: 'The service is provided \"as is\" and \"as available\", without warranties of any kind to the extent permitted by law. As a beta it may contain errors, change, or be interrupted at any time \u2014 keep your own backups of important data.',\n },\n liability: {\n title: \"Limitation of liability\",\n body: \"To the extent permitted by applicable law, the operator is not liable for any indirect or consequential damage arising from the use of, or inability to use, the service. Nothing here limits liability that cannot be limited by law.\",\n },\n changes: {\n title: \"Changes to these terms\",\n body: \"These terms may be updated as the service evolves. Material changes will be announced by email or in the app; continued use after a change means you accept it.\",\n },\n language: {\n title: \"Language\",\n body: (o) =>\n `These terms are written in ${o.bindingLanguage}. Translations into other languages are provided for convenience only; where a translation differs, the ${o.bindingLanguage} version prevails.`,\n },\n law: {\n title: \"Governing law\",\n body: (o) =>\n `These terms are governed by Swiss law, excluding its conflict-of-laws rules. As far as legally permissible, the place of jurisdiction is ${o.city} (${o.region}), ${o.country}.`,\n },\n },\n },\n};\n", "/**\n * The coded refusals of sign-in and sign-up (docs/auth-harmonization.md \u00A75.2): every\n * refusal the auth routes answer carries a machine-readable `code`, and the pages\n * recognise the CODE, never the server's sentence.\n *\n * Today each app's pages print the server's `detail` string (keksdose's\n * `extractApiErrorMessage`), which is English on every locale and, on a credential\n * check, would be an account-enumeration oracle if it ever said more than one thing.\n * keksdose already keys one refusal on a code (`features/budgets/plan-limit.ts`,\n * `402 {detail, code: \"plan_budget_limit\"}`); \u00A75.2 makes that the rule for auth. Each\n * app switches its server and its pages together (\u00A79).\n *\n * - `invalid_credentials` \u2014 unknown address, wrong password AND deactivated account:\n * one answer, in the same time (\u00A72.10). `401`.\n * - `registration_closed` \u2014 the sign-up gate refused the address. `403`.\n * - `email_taken` \u2014 an account with this address exists. `409`.\n * - `invitation_invalid`, `invitation_expired` \u2014 the `invite` token of a sign-up or an\n * accept (\u00A74.4).\n * - `token_invalid` \u2014 a one-time token (reset, verification, a sign-in challenge) is\n * unknown, spent or expired.\n * - `account_inactive` \u2014 **no server answers it.** \u00A72.10 decided that a deactivated\n * account gets `invalid_credentials`, because a separate answer after a correct\n * password would confirm a leaked one. It stays in the union only for a future server\n * step that is past the password (an admin view, a signed-in refresh) and may say so.\n * - `session_ended` \u2014 0.34.0 (\u00A711.2, decision 7; server-kit 0.8): every definitive\n * refusal of `POST /auth/refresh`, a `401`. No form shows it, so it has no label: the\n * kit's `attachSessionRefresh` decides by the STATUS, so an app whose server has not\n * switched yet keeps working.\n */\nexport type AuthErrorCode =\n | \"invalid_credentials\"\n | \"registration_closed\"\n | \"email_taken\"\n | \"invitation_invalid\"\n | \"invitation_expired\"\n | \"token_invalid\"\n /** 0.30.0: a link that WAS valid and ran out (verification, reset) \u2014 keksdose's step-3\n * refusals tell it from `token_invalid`, so a page can say \"expired, ask for a new one\". */\n | \"token_expired\"\n | \"account_inactive\"\n | \"session_ended\";\n\n/**\n * 0.30.0: the coded refusals of user administration and the account's own settings\n * (docs/user-admin-harmonization.md \u00A74, \u00A76) \u2014 server-kit 0.4.0's `AccountErrorCode`,\n * value for value. The same family of answer as the sign-in codes (`{detail, code}`,\n * plus `companies` on kastlan's `last_admin`), read by the same {@link authErrorCode}.\n *\n * - `last_admin` \u2014 the action would leave no active admin: deactivating, demoting or\n * deleting the last one (in kastlan, of a company; the answer names the `companies`).\n * - `self_action` \u2014 an admin acting on their own account where that is never allowed.\n * - `other_companies` \u2014 kastlan: the account belongs to other companies too, so a\n * company admin may not deactivate it; \"Remove from company\" instead (\u00A79.6).\n * - `household_has_members` \u2014 keksdose's guard on a deletion request (\u00A76.4).\n * - `confirmation_required`, `confirmation_mismatch` \u2014 the action's confirmation level\n * asked for a typed address (or a tick), and the request carried none, or another\n * address (\u00A74.2).\n * - `password_incorrect` \u2014 the CURRENT password is wrong on a signed-in route (the email\n * change, the deletion request). `400`, not `401`: an app's client reads a 401 as an\n * ended session and signs the user out, the wrong answer to a typo. Every other one\n * is a `409`.\n */\nexport type AccountErrorCode =\n | \"last_admin\"\n | \"self_action\"\n | \"other_companies\"\n | \"household_has_members\"\n | \"confirmation_required\"\n | \"confirmation_mismatch\"\n | \"password_incorrect\";\n\n/**\n * 0.31.0: the demo's coded refusals (docs/landing-demo-harmonization.md \u00A76.2) \u2014\n * server-kit 0.5's `DemoErrorCode`, value for value, answered as `{detail, code}` like\n * the others and read by the same {@link authErrorCode}.\n *\n * - `demo_disabled` \u2014 `404`: the demo switch is off (it is \"not there\", not forbidden).\n * - `demo_rate_limited` \u2014 `429` with `Retry-After`: the per-IP window of demo starts.\n * - `demo_capacity` \u2014 `429`, no `Retry-After`: the cap of live demo users.\n * - `demo_not_ready` \u2014 `503`: the demo data has not been seeded yet.\n * - `demo_read_only` \u2014 `403`, model R: any write by a demo user. The app's write lock\n * already explains it, so it shows no toast (\u00A75.4).\n * - `demo_refused` \u2014 `403`, both models: an action a demo never may \u2014 a way in or out,\n * mail, uploads, the account export (\u00A76.4).\n */\nexport type DemoErrorCode =\n | \"demo_disabled\"\n | \"demo_rate_limited\"\n | \"demo_capacity\"\n | \"demo_not_ready\"\n | \"demo_read_only\"\n | \"demo_refused\";\n\n/**\n * 0.32.0: billing's coded refusals (docs/billing-harmonization.md \u00A73.3, \u00A73.4, \u00A74, \u00A712.3) \u2014\n * server-kit 0.6's `BillingError` and `PlanLimitError`, value for value, answered as\n * `{detail, code}` like the others and read by the same {@link authErrorCode}.\n *\n * - `billing_disabled` \u2014 `404`: the billing switch is off (\u00A72.9), so every billing route\n * but `GET /billing/status` is \"not there\", as a switched-off demo is.\n * - `billing_read_only` \u2014 `402`: a write by (or into the data of) a payer out of good\n * standing (\u00A73.3, \u00A712.1). Inside a sync reply it marks the changes that were refused\n * and not applied (\u00A712.5). The app's write lock and banner already say why, so \u2014 like\n * `demo_read_only` \u2014 it needs no toast of its own.\n * - `plan_limit` \u2014 `402`: a create past the plan's limit (\u00A73.4), with the extra fields\n * `dimension`, `plan`, `limit` and `used` \u2014 read them with `isPlanLimit`. A lapsed payer\n * creating gets `billing_read_only` instead, never this (\u00A712.3).\n * - `billing_not_configured` \u2014 billing is switched on but the provider's settings are\n * missing (the secrets, a price id): the operator's mistake, not the payer's.\n *\n * 0.33.0 (server-kit 0.7, \u00A714.2): the provider's refusals, with the `billing_` prefix of\n * the others (decision 22).\n * - `billing_provider_unavailable` \u2014 `502`: Paddle didn't answer, or refused the request.\n * Try again.\n * - `billing_not_at_provider` \u2014 `409`: a portal request before the payer reached the\n * provider (\u00A714.5) \u2014 a stale page; the overview's `at_provider` says it first.\n * - `billing_already_subscribed` \u2014 `409`: a checkout while a provider subscription runs\n * (\u00A714.6). Since 0.39 plan changes go through the plan switch (\u00A715.2.10).\n * - `billing_plan_not_sold` \u2014 `422`: a checkout for a plan, currency or interval the\n * catalogue doesn't sell \u2014 or (0.39) a switch to one.\n *\n * 0.39.0 (server-kit 0.12, \u00A715.2.10): the plan switch's refusals.\n * - `billing_not_subscribed` \u2014 `409`: a switch with no running provider subscription;\n * the page offers the checkout instead.\n * - `billing_plan_unchanged` \u2014 `409`: a switch to the price the payer pays now.\n */\nexport type BillingErrorCode =\n | \"billing_disabled\"\n | \"billing_read_only\"\n | \"plan_limit\"\n | \"billing_not_configured\"\n | \"billing_provider_unavailable\"\n | \"billing_not_at_provider\"\n | \"billing_already_subscribed\"\n | \"billing_plan_not_sold\"\n | \"billing_not_subscribed\"\n | \"billing_plan_unchanged\";\n\n/** Every code the kit reads: the sign-in refusals, the account ones (0.30.0), the demo's\n * (0.31.0) and billing's (0.32.0). */\nexport type KitErrorCode = AuthErrorCode | AccountErrorCode | DemoErrorCode | BillingErrorCode;\n\nconst BILLING_CODES: ReadonlySet<BillingErrorCode> = new Set<BillingErrorCode>([\n \"billing_disabled\",\n \"billing_read_only\",\n \"plan_limit\",\n \"billing_not_configured\",\n \"billing_provider_unavailable\",\n \"billing_not_at_provider\",\n \"billing_already_subscribed\",\n \"billing_plan_not_sold\",\n \"billing_not_subscribed\",\n \"billing_plan_unchanged\",\n]);\n\nconst CODES: ReadonlySet<string> = new Set<KitErrorCode>([\n \"invalid_credentials\",\n \"registration_closed\",\n \"email_taken\",\n \"invitation_invalid\",\n \"invitation_expired\",\n \"token_invalid\",\n \"token_expired\",\n \"account_inactive\",\n \"session_ended\",\n \"last_admin\",\n \"self_action\",\n \"other_companies\",\n \"household_has_members\",\n \"confirmation_required\",\n \"confirmation_mismatch\",\n \"password_incorrect\",\n \"demo_disabled\",\n \"demo_rate_limited\",\n \"demo_capacity\",\n \"demo_not_ready\",\n \"demo_read_only\",\n \"demo_refused\",\n ...BILLING_CODES,\n]);\n\ntype Bag = Record<string, unknown>;\n\nconst isBag = (value: unknown): value is Bag => typeof value === \"object\" && value !== null;\n\n/** A known code, or undefined. */\nfunction known(value: unknown): KitErrorCode | undefined {\n return typeof value === \"string\" && CODES.has(value) ? (value as KitErrorCode) : undefined;\n}\n\n/** `{code}` on a parsed body, or FastAPI's `{detail: {code}}` \u2014 what an\n * `HTTPException(detail={\"code\": \u2026})` serialises to. */\nfunction codeOfBody(body: unknown): KitErrorCode | undefined {\n if (!isBag(body)) return undefined;\n return known(body.code) ?? (isBag(body.detail) ? known(body.detail.code) : undefined);\n}\n\n/**\n * The code an error carries \u2014 an {@link AuthErrorCode}, since 0.30.0 an\n * {@link AccountErrorCode}, since 0.31.0 a {@link DemoErrorCode}, since 0.32.0 a\n * {@link BillingErrorCode} \u2014 or `undefined` when it carries none.\n *\n * Reads the parsed response body wherever the apps' HTTP clients put it, without\n * depending on any of them:\n *\n * 1. `err.response.data` \u2014 axios (keksdose's, kastlan's and Kurvenschmiede's clients;\n * keksdose's `isPlanBudgetLimitRefusal` reads the same path);\n * 2. `err.data` \u2014 ofetch's `FetchError`, and most `fetch` wrappers that parse the body;\n * 3. `err.body` \u2014 the generated OpenAPI clients' `ApiError`;\n * 4. `err` itself \u2014 a body thrown as it came (`throw await res.json()`).\n *\n * In each, `code` or FastAPI's nested `detail.code`. Last, `err.code` \u2014 but only when\n * it is one of the codes above: axios writes its OWN codes there (`ERR_NETWORK`,\n * `ECONNABORTED`, `ERR_BAD_REQUEST`), and so does Node, so an unknown value is never\n * read as a refusal. The HTTP status is not checked: the code is the contract, and the\n * status differs per refusal (401, 402, 403, 404, 409, 410).\n */\nexport function authErrorCode(err: unknown): KitErrorCode | undefined {\n if (!isBag(err)) return undefined;\n const response = err.response;\n return (\n (isBag(response) ? codeOfBody(response.data) : undefined) ??\n codeOfBody(err.data) ??\n codeOfBody(err.body) ??\n codeOfBody(err)\n );\n}\n\n/**\n * Whether `err` is a coded auth refusal \u2014 any of them, or the one named:\n *\n * ```ts\n * try { await api.register(values) }\n * catch (err) { if (isAuthError(err, \"email_taken\")) \u2026 }\n * ```\n *\n * The kit's `SignInForm` and `RegisterForm` call it on what their callbacks reject\n * with, so an app's `onSubmit` can simply let its client's error through. See\n * {@link authErrorCode} for the shapes it reads. Since 0.30.0 it knows the account codes\n * too: `isAuthError(err, \"last_admin\")`; since 0.31.0 the demo's:\n * `isAuthError(err, \"demo_read_only\")`; since 0.32.0 billing's:\n * `isAuthError(err, \"billing_read_only\")` (or {@link isBillingError}).\n */\nexport function isAuthError(err: unknown, code?: KitErrorCode): boolean {\n const found = authErrorCode(err);\n return found !== undefined && (code === undefined || found === code);\n}\n\n/**\n * Whether `err` is one of billing's coded refusals (0.32.0, docs/billing-harmonization.md\n * \u00A710, \u00A714.2) \u2014 any of them, or the one named. {@link isAuthError} answers the same for a\n * named code; this one also answers \"is it billing's at all\", which an app's error\n * handler asks before it decides between the write lock, a `PlanLimitNotice` and a toast.\n */\nexport function isBillingError(err: unknown, code?: BillingErrorCode): boolean {\n const found = authErrorCode(err);\n return found !== undefined && BILLING_CODES.has(found as BillingErrorCode) && (code === undefined || found === code);\n}\n\n/**\n * The parsed body that carries a code, wherever {@link authErrorCode} would find it (in\n * the same order) \u2014 the object with the `code`, so FastAPI's nested `detail` when the code\n * is there. For a reader of a refusal's EXTRA fields (`isPlanLimit`: `dimension`, `limit`,\n * `used` sit beside the code). `accept` decides which codes count; default, the known ones.\n *\n * @internal Not part of the barrel.\n */\nexport function errorBodyWithCode(\n err: unknown,\n accept: (code: unknown) => boolean = (code) => known(code) !== undefined,\n): Record<string, unknown> | undefined {\n if (!isBag(err)) return undefined;\n const response = err.response;\n for (const body of [isBag(response) ? response.data : undefined, err.data, err.body, err]) {\n if (!isBag(body)) continue;\n if (accept(body.code)) return body;\n if (isBag(body.detail) && accept(body.detail.code)) return body.detail;\n }\n return undefined;\n}\n\n/** An HTTP status as a number, or undefined. */\nfunction statusOf(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isInteger(value) ? value : undefined;\n}\n\n/**\n * The HTTP status a thrown error carries, wherever the apps' HTTP clients put it \u2014\n * without depending on any of them:\n *\n * 1. `err.response.status` \u2014 axios (all three apps' clients);\n * 2. `err.status` \u2014 ofetch's `FetchError`, the generated OpenAPI clients' `ApiError`, and\n * a `Response` thrown as it came;\n * 3. `err.statusCode` \u2014 ofetch's alias, and Node-style errors.\n *\n * `undefined` when none is a whole number. Package-private \u2014 not re-exported from the\n * barrel; {@link isRateLimited} and the session refresh's classifier read it (DUP-11,\n * refactor audit 2026-10: the refresh carried its own copy of this probe).\n */\nexport function httpStatusOf(err: unknown): number | undefined {\n if (!isBag(err)) return undefined;\n const response = err.response;\n return (isBag(response) ? statusOf(response.status) : undefined) ?? statusOf(err.status) ?? statusOf(err.statusCode);\n}\n\n/**\n * Whether `err` is a throttled request \u2014 HTTP `429 Too Many Requests` (0.30.0, from the\n * apps' 0.29 adoption: every app answered a throttled sign-in, sign-up or reset through\n * its own `describeError`, with three wordings of one sentence).\n *\n * A throttle carries no `code` in the contract \u2014 the STATUS is the answer, set by the\n * apps' limiters (server-kit's `AuthLimiters`, keksdose's per-IP limit) \u2014 so this reads\n * the status, wherever the apps' HTTP clients put it ({@link httpStatusOf}).\n *\n * There is no `rate_limited` code: keksdose answers its 429s uncoded, with a\n * `Retry-After` header, and the status is the one signal every limiter gives.\n *\n * The kit's `SignInForm`, `RegisterForm`, `ForgotPasswordForm` and `ResetPasswordForm`\n * call it AFTER the app's `describeError` \u2014 an app with words of its own keeps them \u2014\n * and before their generic failure, so \"Too many attempts. Try again in 30 s.\" (with\n * {@link retryAfterSeconds}) or \"\u2026 Wait a moment and try again.\" needs no app code.\n */\nexport function isRateLimited(err: unknown): boolean {\n return httpStatusOf(err) === 429;\n}\n\n/** A header's value from a `Headers` (fetch, ofetch's `response`), axios' `AxiosHeaders`\n * or a plain record \u2014 whose keys may come in any case. */\nfunction headerOf(headers: unknown, name: string): unknown {\n if (!isBag(headers)) return undefined;\n if (typeof headers.get === \"function\") {\n try {\n const value: unknown = (headers.get as (key: string) => unknown).call(headers, name);\n if (value !== undefined && value !== null) return value;\n } catch {\n // A `get` that is not a header lookup; the record below is.\n }\n }\n for (const [key, value] of Object.entries(headers)) {\n if (key.toLowerCase() === name) return value;\n }\n return undefined;\n}\n\n/** `Retry-After` as seconds from `now`: delta-seconds (\"30\"), or an HTTP date\n * (\"Wed, 07 Oct 2026 10:00:00 GMT\") counted from now, never below 0 (RFC 9110 \u00A710.2.3). */\nfunction parseRetryAfter(value: unknown, now: number): number | undefined {\n const raw = Array.isArray(value) ? (value as unknown[])[0] : value;\n if (typeof raw === \"number\") return Number.isFinite(raw) && raw >= 0 ? Math.ceil(raw) : undefined;\n if (typeof raw !== \"string\") return undefined;\n const text = raw.trim();\n if (/^\\d+$/.test(text)) return Number(text);\n // An HTTP date names its day and month (\"Wed, 07 Oct 2026 \u2026\"). Without a letter it is\n // a malformed number (\"-5\", \"1.5\"), which `Date.parse` would happily read as a year.\n if (!/[a-z]/i.test(text)) return undefined;\n const at = Date.parse(text);\n if (Number.isNaN(at)) return undefined;\n return Math.max(0, Math.ceil((at - now) / 1000));\n}\n\n/**\n * How long a throttled request asks to wait, in whole seconds \u2014 its `Retry-After`\n * header (0.30.0, keksdose: its 429s carry no code, only the header) \u2014 or `undefined`\n * when there is none, or none that parses.\n *\n * Read where the apps' clients keep the response headers, without depending on any of\n * them: `err.response.headers` (axios' `AxiosHeaders` or a plain record; ofetch's\n * `FetchError.response`, a fetch `Headers`), then `err.headers` (a `Response` thrown as\n * it came). The value is delta-seconds, or an HTTP date turned into seconds from `now`\n * (default: the present moment) \u2014 never below 0.\n *\n * The forms hand it to their `rateLimited` label when {@link isRateLimited} is true:\n * \"Too many attempts. Try again in 30 s.\" \u2014 and, without one, \"\u2026 Wait a moment and try\n * again.\" A browser only exposes `Retry-After` to a cross-origin page when the server\n * lists it in `Access-Control-Expose-Headers`.\n */\nexport function retryAfterSeconds(err: unknown, now: number | Date = Date.now()): number | undefined {\n if (!isBag(err)) return undefined;\n const at = typeof now === \"number\" ? now : now.getTime();\n const response = err.response;\n const value =\n (isBag(response) ? headerOf(response.headers, \"retry-after\") : undefined) ?? headerOf(err.headers, \"retry-after\");\n return value === undefined ? undefined : parseRetryAfter(value, at);\n}\n\n/**\n * The English of every `rateLimited` label (0.30.0): \"Too many attempts. Try again in\n * 30 s.\" with a wait under a minute, in whole minutes from one minute up (keksdose's\n * reset throttle answers in hours, and \"3600 s\" is a number nobody reads), and \"Wait a\n * moment and try again.\" without one \u2014 or with a `0`.\n *\n * @internal The namespaces' English; not part of the barrel.\n */\nexport function englishRateLimited(seconds?: number): string {\n if (!seconds || seconds <= 0) return \"Too many attempts. Wait a moment and try again.\";\n return `Too many attempts. Try again in ${englishWait(seconds)}.`;\n}\n\n/** \"30 s\", \"2 min\" \u2014 a wait in English, rounded up. @internal */\nexport function englishWait(seconds: number): string {\n return seconds < 60 ? `${Math.ceil(seconds)} s` : `${Math.ceil(seconds / 60)} min`;\n}\n", "// The English words of ./sign-in-form, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./sign-in-form re-exports them.\n\nimport { englishRateLimited } from \"./auth-errors\";\nimport type { SignInLabels } from \"./sign-in-form\";\n\n/** `Required`: every key, the 0.30 ones included, has its English here. */\nexport const DEFAULT_SIGN_IN_LABELS: Required<SignInLabels> = {\n email: \"Email\",\n password: \"Password\",\n submit: \"Sign in\",\n passkey: \"Sign in with a passkey\",\n forgotPassword: \"Forgot your password?\",\n noAccount: \"No account yet?\",\n register: \"Create account\",\n invalidCredentials: \"The email or password is incorrect.\",\n failed: \"Sign-in failed. Please try again.\",\n passkeyFailed: \"Passkey sign-in failed.\",\n deactivatedHint: \"Account deactivated? Write to {contact}.\",\n tagHint: (taggedAddress) => `Signed up with ${taggedAddress}? Use that address.`,\n twoFactorTitle: \"Two-factor authentication\",\n twoFactorIntro: \"Enter the code your authenticator app shows.\",\n code: \"2FA code\",\n verify: \"Verify\",\n codeInvalid: \"Invalid 2FA code.\",\n setPasswordTitle: \"Choose a new password\",\n setPasswordIntro: \"A new password was requested for this account. Choose one and you are straight back in.\",\n newPassword: \"New password\",\n confirmPassword: \"Repeat new password\",\n passwordMismatch: \"The passwords don't match.\",\n setPasswordSubmit: \"Set password and sign in\",\n setPasswordFailed: \"The password could not be set.\",\n expired: \"This sign-in has expired. Please sign in again.\",\n backToSignIn: \"Back to sign in\",\n useRecoveryCode: \"Use a backup code\",\n useAuthenticatorCode: \"Use your authenticator app\",\n recoveryCode: \"Backup code\",\n recoveryIntro: \"Enter one of the backup codes you saved when you turned on two-factor authentication.\",\n recoveryCodeHint: (length) => `${length} letters and digits. Dashes and spaces don\u2019t matter.`,\n recoveryCodeInvalid: \"This backup code is not valid, or it has been used already.\",\n rateLimited: englishRateLimited,\n requestAccess: \"Request access\",\n};\n", "// The English words of ./register-form, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./register-form re-exports them.\n\nimport { englishRateLimited } from \"./auth-errors\";\nimport type { RegisterLabels } from \"./register-form\";\n\n/** `Required`: every key, the 0.30 one included, has its English here. */\nexport const DEFAULT_REGISTER_LABELS: Required<RegisterLabels> = {\n firstName: \"First name\",\n lastName: \"Last name\",\n email: \"Email\",\n emailTagUse: (address) => `Use ${address}`,\n emailTagHint:\n \"Many providers deliver name+tag@\u2026 to the same inbox, so mail from this app is easy to filter and trace. Check yours does before you rely on it: you would sign in with the tagged address.\",\n invitedEmailHint: \"The address your invitation was sent to.\",\n invitedTagNote: \"The tagged address gets a confirmation mail of its own.\",\n password: \"Password\",\n confirmPassword: \"Repeat password\",\n passwordMismatch: \"The passwords don't match.\",\n language: \"Language\",\n submit: \"Create account\",\n haveAccount: \"Already have an account?\",\n signIn: \"Sign in\",\n emailTaken: \"An account with this email address already exists.\",\n registrationClosed: \"New accounts are by invitation only. Ask the operator to invite your email address.\",\n invitationInvalid: \"This invitation link is not valid.\",\n invitationExpired: \"This invitation has expired. Ask for a new one.\",\n failed: \"Registration failed. Please try again.\",\n rateLimited: englishRateLimited,\n};\n", "// The English words of ./complete-name-dialog, in a module with no component code: the\n// English catalogue (src/i18n/defaults.ts) imports them without the component, so `en`\n// loads as one chunk like the other languages (0.34, KS U8). ./complete-name-dialog\n// re-exports them.\n\nimport type { CompleteNameLabels } from \"./complete-name-dialog\";\n\nexport const DEFAULT_COMPLETE_NAME_LABELS: CompleteNameLabels = {\n title: \"Complete your name\",\n description: \"First and last name are now asked for separately. Check what is filled in and add what is missing.\",\n firstName: \"First name\",\n lastName: \"Last name\",\n save: \"Save\",\n later: \"Later\",\n failed: \"Your name could not be saved. Please try again.\",\n};\n", "// The English words of ./forgot-password-form, in a module with no component code: the\n// English catalogue (src/i18n/defaults.ts) imports them without the component, so `en`\n// loads as one chunk like the other languages (0.34, KS U8). ./forgot-password-form\n// re-exports them.\n\nimport { englishRateLimited } from \"./auth-errors\";\nimport type { ForgotPasswordLabels } from \"./forgot-password-form\";\n\n/** `Required`: every key, the 0.30 one included, has its English here. */\nexport const DEFAULT_FORGOT_PASSWORD_LABELS: Required<ForgotPasswordLabels> = {\n title: \"Forgot password\",\n intro: \"Enter your account\u2019s email address. We\u2019ll send you a link to choose a new password.\",\n email: \"Email\",\n submit: \"Send the link\",\n sent: (email) => `If an account exists for ${email}, the link is on its way.`,\n sentHint: \"The link is valid for one hour and works exactly once. Check your spam folder too.\",\n backToSignIn: \"Back to sign in\",\n error: \"The request failed. Please try again later.\",\n rateLimited: englishRateLimited,\n};\n", "// The English words of ./reset-password-form, in a module with no component code: the\n// English catalogue (src/i18n/defaults.ts) imports them without the component, so `en`\n// loads as one chunk like the other languages (0.34, KS U8). ./reset-password-form\n// re-exports them.\n\nimport { englishRateLimited } from \"./auth-errors\";\nimport type { ResetPasswordLabels } from \"./reset-password-form\";\n\n/** `Required`: every key, the 0.30 one included, has its English here. */\nexport const DEFAULT_RESET_PASSWORD_LABELS: Required<ResetPasswordLabels> = {\n title: \"Choose a new password\",\n checking: \"Checking the link\u2026\",\n intro: (email) => `You\u2019re setting a new password for ${email}.`,\n newPassword: \"New password\",\n confirmPassword: \"Repeat new password\",\n mismatch: \"The passwords don\u2019t match.\",\n submit: \"Save password\",\n failed: \"The password could not be changed.\",\n noToken: \"This link is incomplete.\",\n invalid: \"This link is invalid or has expired.\",\n invalidHint: \"Links are valid for one hour and work only once. Just request a new one.\",\n requestNew: \"Request a new link\",\n success: \"Your password has been changed. You can sign in with it now.\",\n sessionsEnded: \"Signed-in devices were signed out \u2014 you\u2019ll need to sign in again there.\",\n signIn: \"Go to sign in\",\n rateLimited: englishRateLimited,\n};\n", "// The English words of ./verify-email, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./verify-email re-exports them.\n\nimport { englishRateLimited } from \"./auth-errors\";\nimport type { VerifyEmailLabels } from \"./verify-email\";\n\nexport const DEFAULT_VERIFY_EMAIL_LABELS: VerifyEmailLabels = {\n title: \"Confirm your email address\",\n verifying: \"Confirming\u2026\",\n verified: \"Your email address is confirmed.\",\n continue: \"Continue\",\n invalid: \"This confirmation link is not valid\",\n expired: \"This confirmation link has expired\",\n noToken: \"This link is missing its confirmation token.\",\n invalidHint: \"The link may have expired or already been used.\",\n requestInApp: \"You can request a new one from inside the app.\",\n requestHere: \"You can request a new one here.\",\n resend: \"Send again\",\n resendIn: (seconds) => `Send again in ${seconds} s`,\n resent: \"Confirmation email sent\",\n resendError: \"Could not send the confirmation email\",\n rateLimited: englishRateLimited,\n banner: \"Please confirm your email address.\",\n dismiss: \"Not now\",\n};\n", "// The English words of ./not-found-page, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./not-found-page re-exports them.\n\nimport type { NotFoundLabels } from \"./not-found-page\";\n\nexport const DEFAULT_NOT_FOUND_LABELS: NotFoundLabels = {\n title: \"Page not found\",\n body: \"This address doesn\u2019t exist (any more). It may be a typo, or the page has moved.\",\n home: \"Go to the start page\",\n app: \"Back to the app\",\n};\n", "// The English words of ./accept-invitation, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./accept-invitation re-exports them.\n\nimport type { AcceptInvitationLabels } from \"./accept-invitation\";\n\nexport const DEFAULT_ACCEPT_INVITATION_LABELS: AcceptInvitationLabels = {\n title: \"Accept invitation\",\n accepting: \"Joining\u2026\",\n accepted: \"Invitation accepted.\",\n joined: (name) => `You\u2019ve joined ${name}.`,\n continue: \"Continue\",\n invalid: \"Could not join with this link\",\n expired: \"This invitation has expired\",\n noToken: \"This link is missing its invite token.\",\n askAgain: \"Ask the person who invited you to send a new invitation.\",\n signInFirst: \"Sign in to accept this invitation\",\n signInHint: \"Use the account the invitation was sent to.\",\n signIn: \"Sign in\",\n register: \"Create account\",\n};\n", "// The English words of ./company-switcher, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./company-switcher re-exports them.\n\nimport type { CompanySwitcherLabels } from \"./company-switcher\";\n\nexport const DEFAULT_COMPANY_SWITCHER_LABELS: CompanySwitcherLabels = {\n switchCompany: \"Switch company\",\n heading: \"Companies\",\n current: (name) => `Company: ${name}`,\n currentMark: \"(current)\",\n switching: \"Switching company\u2026\",\n};\n", "// The English words of ./email-change-setting, in a module with no component code: the\n// English catalogue (src/i18n/defaults.ts) imports them without the component, so `en`\n// loads as one chunk like the other languages (0.34, KS U8). ./email-change-setting\n// re-exports them.\n\nimport { englishRateLimited } from \"../auth/auth-errors\";\nimport type { EmailChangeLabels } from \"./email-change-setting\";\n\nexport const DEFAULT_EMAIL_CHANGE_LABELS: EmailChangeLabels = {\n title: \"Email address\",\n current: \"Current address\",\n newEmail: \"New email address\",\n password: \"Current password\",\n passwordHint: \"Your address is how you sign in, so changing it takes your password.\",\n emailTagUse: (address) => `Use ${address}`,\n emailTagHint:\n \"Many providers deliver name+tag@\u2026 to the same inbox, so mail from this app is easy to filter and trace. Check yours does before you rely on it: you would sign in with the tagged address.\",\n submit: \"Change email address\",\n sameAsCurrent: \"This is already your address.\",\n emailTaken: \"An account with this email address already exists.\",\n wrongPassword: \"The password is incorrect.\",\n pending: (newEmail) => `Confirm the link we sent to ${newEmail}.`,\n pendingHint: (currentEmail) =>\n `Until you do, you keep signing in with ${currentEmail}. Check your spam folder too.`,\n resend: \"Send the link again\",\n resent: \"We sent the link again.\",\n cancel: \"Cancel the change\",\n confirmed: (email) => `Your email address is now ${email}.`,\n passkeyNote: \"Your passkeys keep working. Your device may still list them under your old address.\",\n rateLimited: englishRateLimited,\n failed: \"That didn\u2019t work. Please try again.\",\n};\n", "// The English words of ./sessions-setting, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./sessions-setting re-exports them.\n\nimport type { SessionsLabels } from \"./sessions-setting\";\n\nexport const DEFAULT_SESSIONS_LABELS: SessionsLabels = {\n title: \"Sessions\",\n description: \"Signed in on a device you no longer use, or don\u2019t trust? Sign out everywhere.\",\n signOutEverywhere: \"Sign out everywhere\u2026\",\n signOutEverywherePrompt:\n \"This ends every session, including this one: you will be signed out on this device too, and sign in again from here.\",\n confirmSignOutEverywhere: \"Sign out everywhere\",\n list: \"Where you\u2019re signed in\",\n loading: \"Loading sessions\u2026\",\n empty: \"No sessions to show.\",\n current: \"This device\",\n unknownDevice: \"Unknown device\",\n lastActive: (when) => `Last active ${when}`,\n ip: (address) => `IP ${address}`,\n revoke: \"Sign out\",\n revokeItem: (device) => `Sign out ${device}`,\n failed: \"That didn\u2019t work. Please try again.\",\n};\n", "// The English words of ./delete-account-setting, in a module with no component code: the\n// English catalogue (src/i18n/defaults.ts) imports them without the component, so `en`\n// loads as one chunk like the other languages (0.34, KS U8). ./delete-account-setting\n// re-exports them.\n\nimport { englishRateLimited } from \"../auth/auth-errors\";\nimport type { DeleteAccountLabels } from \"./delete-account-setting\";\n\nexport const DEFAULT_DELETE_ACCOUNT_LABELS: DeleteAccountLabels = {\n title: \"Delete account\",\n afterDays: (days) =>\n days === 1\n ? \"Your account is deactivated at once and erased for good 1 day later.\"\n : `Your account is deactivated at once and erased for good ${days} days later.`,\n operator: \"Your account is deactivated at once, and an operator will erase it for good.\",\n arm: \"Delete account\u2026\",\n prompt: \"You will be signed out on every device, and your account can no longer be used.\",\n handOver: (count) =>\n count === 1\n ? \"1 item others can see will pass to an administrator.\"\n : `${count} items others can see will pass to an administrator.`,\n confirm: \"Delete my account\",\n done: \"Your account is deactivated. You are being signed out.\",\n wrongPassword: \"The password is incorrect.\",\n confirmationMismatch: \"This is not your account\u2019s address.\",\n lastAdmin: \"You are the last administrator. Make someone else an administrator first.\",\n lastAdminOf: (companies) =>\n `You are the last administrator of ${companies}. Make someone else an administrator there first.`,\n householdHasMembers:\n \"Your household has other members, so the account can\u2019t be deleted here. Please write to the operator.\",\n rateLimited: englishRateLimited,\n failed: \"Your account could not be deleted. Please try again.\",\n};\n", "// The English words of ./data-export-setting, in a module with no component code: the\n// English catalogue (src/i18n/defaults.ts) imports them without the component, so `en`\n// loads as one chunk like the other languages (0.34, KS U8). ./data-export-setting\n// re-exports them.\n\nimport { englishWait } from \"../auth/auth-errors\";\nimport type { DataExportLabels } from \"./data-export-setting\";\n\nexport const DEFAULT_DATA_EXPORT_LABELS: DataExportLabels = {\n title: \"Export your data\",\n description: \"Download a copy of your account\u2019s data as a JSON file.\",\n download: \"Download my data\",\n started: \"Your download has started.\",\n saveAgain: \"Didn\u2019t start? Save the file\",\n rateLimited: (seconds) =>\n seconds && seconds > 0\n ? `You exported your data a moment ago. Try again in ${englishWait(seconds)}.`\n : \"You exported your data a moment ago. Please try again in a minute.\",\n failed: \"The export failed. Please try again.\",\n};\n", "// The English words of ./user-roster, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./user-roster re-exports them.\n\nimport type { UserRosterLabels } from \"./user-roster\";\n\nexport const DEFAULT_USER_ROSTER_LABELS: UserRosterLabels = {\n name: \"Name\",\n email: \"Email\",\n role: \"Role\",\n state: \"State\",\n created: \"Created\",\n lastLogin: \"Last login\",\n never: \"Never\",\n actions: \"Actions\",\n actionsFor: (name) => `Actions for ${name}`,\n};\n", "// The English words of ./role-select, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./role-select re-exports them.\n\nimport type { RoleSelectLabels } from \"./role-select\";\n\nexport const DEFAULT_ROLE_SELECT_LABELS: RoleSelectLabels = {\n label: \"Role\",\n rolesLegend: \"Roles\",\n roleOf: (name) => `Role of ${name}`,\n lockedLastAdmin: \"The last active administrator keeps this role.\",\n lockedSelf: \"You can\u2019t change your own role.\",\n notForLastAdmin: \"not for the last administrator\",\n notForSelf: \"not for your own account\",\n unavailable: (role, reason) => `${role} (${reason})`,\n};\n", "// The English words of ./reviewer-scope-editor, in a module with no component code: the\n// English catalogue (src/i18n/defaults.ts) imports them without the component, so `en`\n// loads as one chunk like the other languages (0.34, KS U8). ./reviewer-scope-editor\n// re-exports them.\n\nimport type { ReviewerScopeLabels } from \"./reviewer-scope-editor\";\n\nexport const DEFAULT_REVIEWER_SCOPE_LABELS: ReviewerScopeLabels = {\n languages: \"Languages\",\n hint: \"Tick the languages this person reviews.\",\n none: \"No language: saving takes the reviewer role away.\",\n areas: \"Limit to\",\n legalOnly: \"Only the legal pages\",\n legalOnlyHint: \"Imprint, Privacy Policy and Terms \u2014 for a lawyer rather than a native speaker.\",\n failed: \"The reviewer scope couldn\u2019t be saved. Please try again.\",\n};\n", "// The English words of ./admin-action-confirm, in a module with no component code: the\n// English catalogue (src/i18n/defaults.ts) imports them without the component, so `en`\n// loads as one chunk like the other languages (0.34, KS U8). ./admin-action-confirm\n// re-exports them.\n\nimport type { AdminActionLabels } from \"./admin-action-confirm\";\n\nexport const DEFAULT_ADMIN_ACTION_LABELS: AdminActionLabels = {\n confirm: \"Confirm\",\n cancel: \"Cancel\",\n close: \"Close\",\n lastAdmin: \"This is the last active administrator. Make someone else an administrator first.\",\n self: \"You can\u2019t do this to your own account.\",\n confirmationMismatch: \"The address doesn\u2019t match this account. Check which account you are on.\",\n otherCompanies:\n \"This account also belongs to other companies, so only the platform operator can do this. You can remove it from this company instead.\",\n removeFromCompany: \"Remove from company\",\n failed: \"That didn\u2019t work. Please try again.\",\n};\n", "// The English words of ./admin-action-log, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./admin-action-log re-exports them.\n\nimport type { AdminActionLogLabels } from \"./admin-action-log\";\n\nexport const DEFAULT_ADMIN_ACTION_LOG_LABELS: AdminActionLogLabels = {\n title: \"Admin actions\",\n empty: \"No admin actions yet.\",\n loading: \"Loading\u2026\",\n by: (actor) => `by ${actor}`,\n bySelf: \"by the user themselves\",\n automatic: \"automatically\",\n erased: \"an erased account\",\n filteredTo: (target) => `Only ${target}`,\n showAll: \"Show all actions\",\n filterBy: (target) => `Show only the actions on ${target}`,\n actions: {\n deactivate: \"Deactivated\",\n reactivate: \"Reactivated\",\n role: \"Role changed\",\n password_change_require: \"New password required\",\n password_change_withdraw: \"Password requirement withdrawn\",\n mail_verification: \"Verification mail sent\",\n mail_reset: \"Password reset mail sent\",\n reviewer: \"Reviewer scope changed\",\n invite: \"Invited\",\n invite_resend: \"Invitation resent\",\n invite_revoke: \"Invitation revoked\",\n transfer: \"Work transferred\",\n deletion_request: \"Deletion requested\",\n deletion_cancel: \"Deletion cancelled\",\n erase: \"Account erased\",\n plan: \"Plan changed\",\n },\n renamedFromTo: (from, to) => `from ${from} to ${to}`,\n groupActions: {\n group: {\n group_create: \"Group created\",\n group_rename: \"Group renamed\",\n group_delete: \"Group deleted\",\n group_deactivate: \"Group deactivated\",\n group_reactivate: \"Group reactivated\",\n membership_add: \"Added to the group\",\n membership_role: \"Role in the group changed\",\n membership_remove: \"Removed from the group\",\n deleted: \"a deleted group\",\n },\n team: {\n group_create: \"Team created\",\n group_rename: \"Team renamed\",\n group_delete: \"Team deleted\",\n group_deactivate: \"Team deactivated\",\n group_reactivate: \"Team reactivated\",\n membership_add: \"Added to the team\",\n membership_role: \"Role in the team changed\",\n membership_remove: \"Removed from the team\",\n deleted: \"a deleted team\",\n },\n company: {\n group_create: \"Company created\",\n group_rename: \"Company renamed\",\n group_delete: \"Company deleted\",\n group_deactivate: \"Company deactivated\",\n group_reactivate: \"Company reactivated\",\n membership_add: \"Added to the company\",\n membership_role: \"Role in the company changed\",\n membership_remove: \"Removed from the company\",\n deleted: \"a deleted company\",\n },\n budget: {\n group_create: \"Budget created\",\n group_rename: \"Budget renamed\",\n group_delete: \"Budget deleted\",\n group_deactivate: \"Budget deactivated\",\n group_reactivate: \"Budget reactivated\",\n membership_add: \"Added to the budget\",\n membership_role: \"Role in the budget changed\",\n membership_remove: \"Removed from the budget\",\n deleted: \"a deleted budget\",\n },\n },\n};\n", "// The English words of ./transfer-ownership-dialog, in a module with no component code: the\n// English catalogue (src/i18n/defaults.ts) imports them without the component, so `en`\n// loads as one chunk like the other languages (0.34, KS U8). ./transfer-ownership-dialog\n// re-exports them.\n\nimport type { TransferOwnershipLabels } from \"./transfer-ownership-dialog\";\n\nexport const DEFAULT_TRANSFER_OWNERSHIP_LABELS: TransferOwnershipLabels = {\n title: (name) => `Hand on ${name}\u2019s work`,\n body: \"Everything this account owns moves to the account you choose, in one step.\",\n recipient: \"Hand it to\",\n choose: \"Choose an account\u2026\",\n chooseFirst: \"Choose who receives the work\",\n confirm: \"Hand it on\",\n customer: \"a customer\",\n deactivated: \"deactivated\",\n self: \"the same account\",\n unavailable: (account, reason) => `${account} (${reason})`,\n noCandidates: \"No other account can receive it.\",\n};\n", "// The English words of ./invitations-panel, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./invitations-panel re-exports them.\n\nimport type { InvitationsLabels } from \"./invitations-panel\";\n\nexport const DEFAULT_INVITATIONS_LABELS: InvitationsLabels = {\n email: \"Email address\",\n invalidEmail: \"Enter a complete email address.\",\n role: \"Role\",\n scope: \"Scope\",\n scopeNone: \"None\",\n language: \"Language of the invitation\",\n note: \"Note\",\n invite: \"Invite\",\n listTitle: \"Invitations\",\n empty: \"Nobody has been invited yet.\",\n loading: \"Loading\u2026\",\n status: { open: \"Open\", accepted: \"Accepted\", expired: \"Expired\", revoked: \"Revoked\" },\n sent: (date) => `Sent ${date}`,\n expires: (date) => `Expires ${date}`,\n invitedBy: (name) => `by ${name}`,\n resend: (email) => `Send ${email} a new link`,\n copyLink: \"Copy invitation link\",\n revoke: (email) => `Revoke the invitation for ${email}`,\n consoleHint:\n \"Mail isn\u2019t sent on this server \u2014 it is written to the server log. Copy each invitation link from here and pass it on yourself: it is shown only once.\",\n linkReady: (email) => `The invitation link for ${email}, shown only this once:`,\n notSent: (email) => `${email} is invited, but the mail couldn\u2019t be sent. Resend it.`,\n failed: \"That didn\u2019t work. Please try again.\",\n};\n", "import { useKitLabels, type LabelOverride } from \"../i18n/kit-labels\";\n\n/**\n * The `settings` namespace (docs/settings-harmonization.md \u00A74.3): the settings page's\n * own words, and the names and help lines of the five core groups every app shares \u2014\n * appearance, account, security, notifications, data (\u00A72.6). An app's own groups bring\n * their own words; any core label may be overridden like any kit label (prop >\n * `<UiKitProvider labels={{ settings }}>` > English).\n */\n\n/** A core group's two strings, as {@link SettingsGroup} takes them. */\nexport interface SettingsGroupLabels {\n /** The group's name. */\n title: string;\n /** One line: under the heading, and in the phone list. */\n help: string;\n}\n\n/** The five groups whose words the kit ships (\u00A72.6, \u00A74.2). */\nexport type SettingsCoreGroup = \"appearance\" | \"account\" | \"security\" | \"notifications\" | \"data\";\n\nexport interface SettingsLabels {\n /** The page's heading, and the back link's visible text on a phone's group page. */\n title: string;\n /** The search field's accessible name. */\n search: string;\n /** The search field's placeholder. */\n searchPlaceholder: string;\n /** The hit list's accessible name. */\n results: string;\n /** No hits for the trimmed query (\u00A73.4). */\n noMatches: (query: string) => string;\n /** The button beside it that empties the field. */\n clearSearch: string;\n /** The phone's back link's accessible name: \"\u2039 Settings\" says where, this says what. */\n back: string;\n /** The sidebar's accessible name (the vertical tablist). */\n sections: string;\n /** A sidebar row's hit badge, read in place of the bare number while searching. */\n matchCount: (count: number) => string;\n /** The core groups' names and help lines. */\n groups: Record<SettingsCoreGroup, SettingsGroupLabels>;\n}\n\nexport const DEFAULT_SETTINGS_LABELS: SettingsLabels = {\n title: \"Settings\",\n search: \"Search settings\",\n searchPlaceholder: \"Search settings\u2026\",\n results: \"Matching settings\",\n noMatches: (query) => `No settings match \u201C${query}\u201D.`,\n clearSearch: \"Clear search\",\n back: \"Back to settings\",\n sections: \"Settings sections\",\n matchCount: (count) => (count === 1 ? \"1 match\" : `${count} matches`),\n groups: {\n appearance: {\n title: \"Appearance\",\n help: \"Language, theme and how the app looks on this device.\",\n },\n account: {\n title: \"Account\",\n help: \"Your profile and your email address.\",\n },\n security: {\n title: \"Security\",\n help: \"How you sign in, and where you are signed in.\",\n },\n notifications: {\n title: \"Notifications\",\n help: \"What you are told about, when, and on which devices.\",\n },\n data: {\n title: \"Data\",\n help: \"Export what is yours, or delete it together with your account.\",\n },\n },\n};\n\n/**\n * 0.31.1: the `settings` namespace, resolved \u2014 English, then the provider, then `labels`.\n * What an app reads for its catalogue's core group titles and help lines, and for the\n * page title \"<group> \u00B7 Settings \u00B7 <app>\" (settings contract \u00A73.1), without restating\n * the namespace and its defaults (Kurvenschmiede's 0.31 adoption).\n */\nexport function useSettingsLabels(labels?: LabelOverride<SettingsLabels>): SettingsLabels {\n return useKitLabels(\"settings\", DEFAULT_SETTINGS_LABELS, labels);\n}\n", "import { useKitLabels, type LabelOverride } from \"../i18n/kit-labels\";\n\n/**\n * The kit's words on the public landing page (docs/landing-demo-harmonization.md \u00A74.1,\n * \u00A74.2) \u2014 the `landing` namespace of `<UiKitProvider labels>`.\n *\n * Only the GENERIC words are the kit's: the actions every app's header, hero and CTA band\n * share, the \"Beta\" badge, and the template of the request-access mail. The marketing\n * copy (the hero's title, the feature rows, the trust strip, the tagline) is each app's,\n * in every language it ships (\u00A74.1 \"Words\").\n *\n * The demo parts and `SignInForm` read the access words from here too, so \"Request\n * access\" and its mail are said the same way on the landing, the sign-in page, the demo\n * start, the banner and the end page.\n */\nexport interface LandingLabels {\n /** The header's secondary action without a session; also the demo banner's and the\n * end page's way to an existing account. */\n signIn: string;\n /** The access action of an invitation-only app: a mail to support (\u00A72.2, \u00A74.2). */\n requestAccess: string;\n /** The access action once an app opens registration (`{kind: \"register\"}`, \u00A74.2). */\n getStarted: string;\n /** The hero's and the CTA band's second action without a session. */\n tryDemo: string;\n /** The one action for a real session: into the app, at the resume target. */\n openApp: string;\n /** The secondary action for a demo session: back into the live demo. */\n continueDemo: string;\n /** The hero's optional badge. */\n beta: string;\n /** The request mail's subject, given the app's name (`access.app`): \"Access to\n * Kastlan\". `undefined` when the app named none. */\n accessSubject: (app?: string) => string;\n /** The request mail's body, one prompt per line; the sender writes after each. */\n accessName: string;\n /** Asked only where the app says so (`askCompany`, kastlan). */\n accessCompany: string;\n accessUse: string;\n}\n\nexport const DEFAULT_LANDING_LABELS: LandingLabels = {\n signIn: \"Sign in\",\n requestAccess: \"Request access\",\n getStarted: \"Get started\",\n tryDemo: \"Try the demo\",\n openApp: \"Open app\",\n continueDemo: \"Continue the demo\",\n beta: \"Beta\",\n accessSubject: (app) => (app ? `Access to ${app}` : \"Access request\"),\n accessName: \"Name:\",\n accessCompany: \"Company:\",\n accessUse: \"What would you use it for:\",\n};\n\n/** The `landing` namespace, resolved: English, then the provider, then `labels`. */\nexport function useLandingLabels(labels?: LabelOverride<LandingLabels>): LandingLabels {\n return useKitLabels(\"landing\", DEFAULT_LANDING_LABELS, labels);\n}\n", "import { useKitLabels, type LabelOverride } from \"../i18n/kit-labels\";\n\n/**\n * The demo's words (docs/landing-demo-harmonization.md \u00A75) \u2014 the `demo` namespace of\n * `<UiKitProvider labels>`: `DemoStart`'s progress and refusals, `DemoBanner`'s\n * countdown and model line, `DemoEnded`, and the reason of the read-only lock.\n *\n * \"Demo\" means the demo session and the shared demo data it shows (\u00A72.10) \u2014 never\n * keksdose's blur toggle, which is \"Presentation mode\" now. \"Request access\" and \"Sign\n * in\" are the `landing` namespace's, so they read the same on every public page.\n */\nexport interface DemoLabels {\n /** `DemoStart` while the demo is being created. */\n starting: string;\n /** `demo_rate_limited`: too many demos from one network, given the wait in whole\n * minutes from `Retry-After` \u2014 or `undefined` without one. */\n rateLimited: (minutes?: number) => string;\n /** `demo_capacity`: the live cap is reached. */\n capacity: string;\n /** `demo_disabled` and `demo_not_ready`: the demo is off, or its data isn't there. */\n unavailable: string;\n /** Any other failure \u2014 the network, a 500. */\n failed: string;\n /** `DemoStart`'s way out after a refusal, to the landing. */\n backToStart: string;\n /** The banner's countdown with an hour or more left: \"Demo \u00B7 23 h 12 min left\". */\n hoursLeft: (hours: number, minutes: number) => string;\n /** \u2026and in the last hour, minutes only: \"Demo \u00B7 50 min left\". */\n minutesLeft: (minutes: number) => string;\n /** The banner's word when the end is unknown (no readable `expiresAt`). */\n badge: string;\n /** The banner's line for model R, shared read-only data. */\n readOnly: string;\n /** The banner's line for model S, a sandbox of one's own. */\n sandbox: string;\n /** The name of the banner's show/hide toggle (`aria-expanded` says which). */\n details: string;\n /** The reason a locked commit shows in a read-only demo (model R) \u2014 for the app's\n * `<WriteLockProvider locked reason={\u2026}>` (\u00A75.4). */\n writeLocked: string;\n /** `DemoEnded`'s heading; also the banner's text at zero. */\n endedTitle: string;\n /** `DemoEnded`'s line for model R. */\n endedReadOnly: string;\n /** `DemoEnded`'s line for model S. */\n endedSandbox: string;\n /** `DemoEnded`'s first action, to `/demo`. */\n restart: string;\n}\n\nexport const DEFAULT_DEMO_LABELS: DemoLabels = {\n starting: \"Starting the demo\u2026\",\n rateLimited: (minutes) =>\n minutes\n ? `Too many demos from this network. Try again in ${minutes} min.`\n : \"Too many demos from this network. Try again later.\",\n capacity: \"The demo is full right now. Try again later.\",\n unavailable: \"The demo isn\u2019t available right now.\",\n failed: \"The demo could not be started. Please try again.\",\n backToStart: \"Back to the start page\",\n hoursLeft: (hours, minutes) => `Demo \u00B7 ${hours} h ${minutes} min left`,\n minutesLeft: (minutes) => `Demo \u00B7 ${minutes} min left`,\n badge: \"Demo\",\n readOnly: \"You\u2019re looking at sample data. Changes aren\u2019t possible.\",\n sandbox: \"Your own work is deleted when the demo ends.\",\n details: \"Demo details\",\n writeLocked: \"Not possible in the demo.\",\n endedTitle: \"The demo has ended\",\n endedReadOnly: \"Sample data is reset regularly.\",\n endedSandbox: \"Sample data is reset regularly; your own work from the demo is deleted.\",\n restart: \"Start a new demo\",\n};\n\n/** The `demo` namespace, resolved: English, then the provider, then `labels`. The app\n * reads `writeLocked` from here for its `WriteLockProvider`. */\nexport function useDemoLabels(labels?: LabelOverride<DemoLabels>): DemoLabels {\n return useKitLabels(\"demo\", DEFAULT_DEMO_LABELS, labels);\n}\n", "import { useKitLabels } from \"../i18n/kit-labels\";\nimport type { LabelOverride } from \"../i18n/kit-labels\";\n\n/**\n * The subscription's status vocabulary (docs/billing-harmonization.md \u00A73.2) \u2014 server-kit's\n * `SubscriptionStatus`, value for value:\n *\n * - `trialing` \u2014 the 30-day trial without a card (\u00A72.7), or a pure guest's row whose trial\n * has not started (\u00A712.9, `trial_ends_at` empty);\n * - `active` \u2014 paid;\n * - `past_due` \u2014 a payment failed; in good standing during the provider's retries (\u00A73.3);\n * - `canceled` \u2014 the payer cancelled; the American spelling is the wire's, the word shown\n * is \"Cancelled\";\n * - `expired` \u2014 a trial, a grant or a failed subscription ran out: read-only (\u00A72.3);\n * - `comped` \u2014 free by the operator's grant or as a beta user (\u00A73.2, `comped_until`).\n */\nexport type SubscriptionStatus = \"trialing\" | \"active\" | \"past_due\" | \"canceled\" | \"expired\" | \"comped\";\n\n/** Every status, in the order a lifecycle reads: trial, paid, trouble, ended, granted. */\nexport const SUBSCRIPTION_STATUSES: readonly SubscriptionStatus[] = Object.freeze([\n \"trialing\",\n \"active\",\n \"past_due\",\n \"canceled\",\n \"expired\",\n \"comped\",\n]);\n\n/**\n * The words of the subscription parts \u2014 the `billing` namespace of `<UiKitProvider labels>`\n * (docs/billing-harmonization.md \u00A77, \u00A710; ui-kit 0.32.0).\n *\n * WORDING (\u00A712.24): the English group is \"Subscription\", never \"Plan\" \u2014 keksdose's \"plan\"\n * is the month's budget plan (\"One plan per month\"), and two meanings of one word on one\n * settings page is the clash the review found. \"Plan\" stays the word for WHAT is bought\n * (Free, Pro), \"subscription\" for the standing arrangement. German says \"Tarif\" for the\n * plan and \"Abonnement\" for the subscription (\u00A710).\n *\n * Prices are GROSS (\u00A712.17): Swiss consumer law (PBV) wants a consumer price with the\n * MWST in it, so the cards say so (`vatIncluded`).\n */\nexport interface BillingLabels {\n /** The settings group or admin section the parts live on (\u00A77, \u00A712.24): \"Subscription\". */\n group: string;\n\n /* \u2500\u2500 PlanPicker / PlanCard (\u00A77) \u2500\u2500 */\n /** The picker's name when it has no visible `legend`: \"Plans\". */\n plans: string;\n /** The name of the billing-period switch: \"Billing period\". */\n interval: string;\n /** The switch's two options \u2014 yearly first (\u00A712.17). */\n yearly: string;\n monthly: string;\n /** The name of the currency switch: \"Currency\". */\n currency: string;\n /** After a price: \"per year\", \"per month\". */\n perYear: string;\n perMonth: string;\n /** Under a price (\u00A712.17): \"VAT included\". German: \"inkl. MWST\". */\n vatIncluded: string;\n /** A plan with no price, or a price of 0: \"Free\". */\n free: string;\n /** A plan with prices, but none for this currency and period. */\n notOffered: string;\n /** A limit of `null` (\u00A73.1): \"Unlimited\". */\n unlimited: string;\n /** The accessible names of a card's two lists. */\n limits: string;\n features: string;\n /** The chip on the payer's current plan. */\n current: string;\n /** The picker's button for `plan` (the plan's display name) with no current plan \u2014\n * during a trial, or after a plan ended: \"Choose Pro\". */\n choose: (plan: string) => string;\n /** \u2026for a plan after the current one in the catalogue's order: \"Upgrade to Pro\". */\n upgrade: (plan: string) => string;\n /** \u2026for a plan before it: \"Switch to Free\". */\n downgrade: (plan: string) => string;\n /** Why the button is off while the current plan is the one picked. */\n isCurrent: string;\n /** Why it is off while nothing is picked. */\n pickFirst: string;\n\n /* \u2500\u2500 SubscriptionStatusChip (\u00A76) \u2500\u2500 */\n /** One word per status. */\n status: Record<SubscriptionStatus, string>;\n\n /* \u2500\u2500 BillingBanner (\u00A73.3, \u00A712.6, \u00A712.21) \u2500\u2500 */\n /** A trial ends in `days` calendar days \u2014 0 is today, 1 tomorrow. */\n trialEnding: (days: number) => string;\n /** A free grant (`comped_until`: a beta user's 12 months, an operator's grant) ends in\n * `days` calendar days. */\n grantEnding: (days: number) => string;\n /** The first failed payment (`past_due`), while the provider retries. */\n paymentFailed: string;\n /** Out of good standing: read-only, never locked (\u00A72.3). */\n planEnded: string;\n /**\n * A guest in someone else's item that is read-only for billing (\u00A712.6). It never says\n * WHY beyond \"for now\": the owner's payment status is the owner's personal data.\n * `item` is the item's own name (\"Household 2026\"), shown in quotes \u2014 or `undefined`.\n */\n guestReadOnly: (item?: string) => string;\n /** Back from checkout before the provider's webhook landed (\u00A712.21). */\n processing: string;\n /** The action of the trial, grant and plan-ended banners, and of `PlanLimitNotice`'s\n * `upgrade` mode: \"Choose a plan\". */\n choosePlan: string;\n /** The payment-failed banner's action, to the provider's portal: \"Update payment method\". */\n updatePayment: string;\n /**\n * 0.42 (\u00A716.7 A, \u00A716.8): the payment-failed banner for an admin who isn't the buyer\n * (`portal: \"buyer_only\"`), with no button \u2014 only the buyer can change the card.\n * `buyer` is their display name, or `undefined` when they are gone (\"the admin who\n * bought the subscription\").\n */\n paymentFailedAskBuyer: (buyer?: string) => string;\n /** The processing banner's action, when the app gives one: \"Check again\". */\n checkAgain: string;\n\n /* \u2500\u2500 The read-only lock (\u00A73.3, \u00A712.6) \u2500\u2500 */\n /** The `WriteLockProvider` reason for the payer (\u00A73.3, verbatim). A guest's reason is\n * {@link guestReadOnly}. */\n lockReason: string;\n\n /* \u2500\u2500 PlanLimitNotice (\u00A73.4) \u2500\u2500 */\n /** The notice's first line: \"Plan limit reached\". */\n limitReached: string;\n /** Mode `upgrade`: what the action does. */\n limitUpgrade: string;\n /** Mode `contact` (the operator grants plans by hand, keksdose's today). */\n limitContact: string;\n /** Mode `contact`'s action, a mail to support: \"Ask for more\". */\n askForMore: string;\n /** The meter's value: \"3 of 3\". Both figures are formatted already. */\n usage: (used: string, limit: string) => string;\n /** The subject of the `contact` mail; `dimension` is the app's name for it (\"Budgets\"). */\n contactSubject: (dimension: string) => string;\n /**\n * The figure line of the limit's toast (`usePlanLimitToast`, \u00A714.11) and of an\n * operator's plan change over the new limit (\u00A714.12): \"Budgets: 3 of 3\". A key of its\n * own rather than `${dimension}: ${usage}`, because French puts a space before the\n * colon. Both figures are formatted already.\n */\n limitUsageLine: (dimension: string, used: string, limit: string) => string;\n\n /* \u2500\u2500 The provider's portal (\u00A77, \u00A712.26) \u2500\u2500 */\n /** The portal: payment method and invoices (\u00A72.8, the provider hosts both). */\n manage: string;\n /**\n * The visible cancel link on the app's subscription page (\u00A712.26). German: \u00A7312k BGB\n * wants the button that leads to the cancellation labelled \"Vertr\u00E4ge hier k\u00FCndigen\" or\n * as unambiguously \u2014 a translator should use exactly that.\n */\n cancel: string;\n /**\n * In place of both while the payer hasn't reached the provider (the overview's\n * `at_provider` is false, \u00A714.5): there is no customer to open a portal for yet. Also\n * the words for `409 billing_not_at_provider`, a stale page that asked anyway.\n */\n notAtProvider: string;\n\n /* \u2500\u2500 The portal for the buyer only, the in-app cancel (0.42, \u00A716) \u2500\u2500 */\n /**\n * In place of \"Payment and invoices\" for an admin who isn't the buyer (`portal:\n * \"buyer_only\"`, \u00A716.2 decision 3): the provider's portal opens only for the buyer.\n * `buyer` is their display name \u2014 or `undefined` when they are gone or have left the\n * company, and the words then say \"the admin who bought the subscription\".\n */\n buyerHolds: (buyer?: string) => string;\n /** `CancelSubscriptionConfirm`'s title: \"Cancel subscription\". */\n cancelConfirmTitle: string;\n /** Its body; `date` is the period's end, formatted: \"Your subscription ends on\n * 9 Nov 2026. Until then everything works as before.\" */\n cancelConfirmBody: (date: string) => string;\n /** Its confirm button (\u00A716.4): \"Cancel subscription now\". German: \"Jetzt k\u00FCndigen\",\n * the confirmation button's words in \u00A7312k BGB. */\n cancelConfirmAction: string;\n /** In place of \"Cancel subscription\" while a cancel is scheduled (\u00A716.7 C, `POST\n * /billing/resume`): \"Keep subscription\". */\n keepSubscription: string;\n /** 0.43 (\u00A717.3): the muted note under the actions while the portal opens in a new tab \u2014\n * `provider` the provider's name (\"Paddle\"), `app` the app's; without the app, \"this\n * page\". \"Payment and invoices open at Paddle in a new tab; Kastlan stays open here.\" */\n portalOpensNewTab: (provider: string, app?: string) => string;\n\n /* \u2500\u2500 The pay page (\u00A714.4) \u2500\u2500 */\n /* Built into the static page `dist/pay/` at the kit's build: it has no React and no\n provider, so an app's override never reaches it. */\n /** While the checkout opens. */\n payOpening: string;\n /** A link without a transaction, or billing switched off: nothing to pay. */\n payNothing: string;\n /** Paddle's script didn't load, or the page's configuration is wrong. */\n payFailed: string;\n /** The buyer closed the checkout without paying. */\n payBack: string;\n /** 0.39 (\u00A715.2.5): paid, for a transaction that names no app the page knows (a\n * payment-method update from Paddle's e-mail) \u2014 no way back to offer. */\n payDone: string;\n\n /* \u2500\u2500 PlanSwitchConfirm (0.39, \u00A715.2.10) \u2500\u2500 */\n /** The dialog's title: \"Change plan\". */\n switchTitle: string;\n /** The line naming both plans, each with its billing period: \"From Pro (Monthly) to\n * Business (Yearly)\". */\n switchFromTo: (from: string, to: string) => string;\n /** What an upgrade charges at once (Paddle's preview, prorated): \"Charged now\". */\n switchChargedNow: string;\n /** What a downgrade credits \u2014 the customer's balance, which Paddle takes off the next\n * charges: \"Credited towards your next charges\". */\n switchCredited: string;\n /** The next regular charge; `date` is formatted: \"Next charge on 9 Nov 2026\". */\n switchNextCharge: (date: string) => string;\n /** The confirm button: \"Change plan\". */\n switchConfirm: string;\n\n /* \u2500\u2500 The permanent-grant warning (0.42, \u00A716.2 decision 5, \u00A716.8 B) \u2500\u2500 */\n /** The warning's title, before a checkout (`PlanPicker`) or a switch\n * (`PlanSwitchConfirm`) under a grant without an end: \"Your free access continues\". */\n grantWarningTitle: string;\n /** What the purchase does under it: nothing to the plan while the grant runs. */\n grantWarningBody: string;\n /** `PlanPicker`'s button that goes on to the checkout: \"Buy anyway\". */\n grantWarningAction: string;\n\n /* \u2500\u2500 Offline (\u00A712.5) \u2500\u2500 */\n /** Changes refused as `billing_read_only` inside a sync reply, kept queued and sent\n * after payment: \"3 changes waiting for a plan\". */\n waitingChanges: (count: number) => string;\n /** The sign-out guard's way out for someone who will not pay. */\n discardWaiting: string;\n\n /* \u2500\u2500 Refusals with no part of their own (0.32.1, kastlan's 0.32 report) \u2500\u2500 */\n /**\n * `billing_not_configured`: billing is on but the provider's settings are missing \u2014 the\n * operator's mistake, so the words ask the payer to wait, not to act. For the toast or\n * alert after \"Choose a plan\" or \"Payment and invoices\" (`isBillingError(err,\n * \"billing_not_configured\")`). `billing_read_only` and `plan_limit` need none: the\n * write lock, the banner and `PlanLimitNotice` say them.\n */\n notConfigured: string;\n /** `billing_disabled`: billing is switched off on this server (\u00A72.9), for a page or a\n * link that reached it anyway. */\n disabled: string;\n /* 0.33.0 \u2014 server-kit 0.7's refusals (\u00A714.2). `billing_not_at_provider` is\n {@link notAtProvider}'s: a stale page that asked for the portal anyway. */\n /** `billing_provider_unavailable` (502): the provider didn't answer. Try again. */\n providerUnavailable: string;\n /** `billing_already_subscribed` (409): a second checkout while a subscription runs\n * (\u00A714.6). Since 0.39 plan changes go through the app's own switch (\u00A715.2.10), not the\n * portal, and the words say so. */\n alreadySubscribed: string;\n /** `billing_plan_not_sold` (422): the catalogue doesn't sell this plan with that\n * period or currency \u2014 at a checkout, or (0.39) a switch to a plan no longer sold. */\n planNotSold: string;\n /** 0.39 (\u00A715.2.10): `billing_not_subscribed` (409), a plan switch with no running\n * provider subscription \u2014 the page offers the checkout instead. */\n notSubscribed: string;\n /** 0.39: `billing_plan_unchanged` (409), a switch to the price the payer pays now. */\n planUnchanged: string;\n}\n\n/** \"today\", \"tomorrow\", \"in 5 days\". */\nfunction inDays(days: number): string {\n if (days <= 0) return \"today\";\n if (days === 1) return \"tomorrow\";\n return `in ${days} days`;\n}\n\nexport const DEFAULT_BILLING_LABELS: BillingLabels = {\n group: \"Subscription\",\n\n plans: \"Plans\",\n interval: \"Billing period\",\n yearly: \"Yearly\",\n monthly: \"Monthly\",\n currency: \"Currency\",\n perYear: \"per year\",\n perMonth: \"per month\",\n vatIncluded: \"VAT included\",\n free: \"Free\",\n notOffered: \"Not offered for this billing period\",\n unlimited: \"Unlimited\",\n limits: \"Limits\",\n features: \"Included\",\n current: \"Current plan\",\n choose: (plan) => `Choose ${plan}`,\n upgrade: (plan) => `Upgrade to ${plan}`,\n downgrade: (plan) => `Switch to ${plan}`,\n isCurrent: \"This is your current plan.\",\n pickFirst: \"Pick a plan first.\",\n\n status: {\n trialing: \"Trial\",\n active: \"Active\",\n past_due: \"Payment overdue\",\n canceled: \"Cancelled\",\n expired: \"Expired\",\n comped: \"Complimentary\",\n },\n\n trialEnding: (days) =>\n `Your trial ends ${inDays(days)}. After that you can still view everything, but changes need a plan.`,\n grantEnding: (days) =>\n `Your free access ends ${inDays(days)}. After that you can still view everything, but changes need a plan.`,\n paymentFailed: \"Your last payment didn\u2019t go through. Update your payment method to keep your plan.\",\n planEnded: \"Your plan has ended. You can still view and export everything; choose a plan to make changes again.\",\n guestReadOnly: (item) =>\n item ? `\u201C${item}\u201D is read-only for now; its owner can lift that.` : \"This is read-only for now; its owner can lift that.\",\n processing: \"Your payment is being processed. Your plan starts as soon as it\u2019s confirmed; this page updates by itself.\",\n choosePlan: \"Choose a plan\",\n updatePayment: \"Update payment method\",\n paymentFailedAskBuyer: (buyer) =>\n buyer\n ? `The payment failed. ${buyer} can update the payment method.`\n : \"The payment failed. The admin who bought the subscription can update the payment method.\",\n checkAgain: \"Check again\",\n\n lockReason: \"Your plan has ended. Choose a plan to make changes again.\",\n\n limitReached: \"Plan limit reached\",\n limitUpgrade: \"To add more, choose a plan with a higher limit.\",\n limitContact: \"To add more, ask us for a higher limit.\",\n askForMore: \"Ask for more\",\n usage: (used, limit) => `${used} of ${limit}`,\n contactSubject: (dimension) => `Plan limit: ${dimension}`,\n limitUsageLine: (dimension, used, limit) => `${dimension}: ${used} of ${limit}`,\n\n manage: \"Payment and invoices\",\n cancel: \"Cancel subscription\",\n notAtProvider: \"Nothing to manage yet. Payments and invoices appear here once you have a paid plan.\",\n buyerHolds: (buyer) =>\n buyer\n ? `The payment method and the invoices are with ${buyer}, who bought the subscription.`\n : \"The payment method and the invoices are with the admin who bought the subscription.\",\n cancelConfirmTitle: \"Cancel subscription\",\n cancelConfirmBody: (date) => `Your subscription ends on ${date}. Until then everything works as before.`,\n cancelConfirmAction: \"Cancel subscription now\",\n keepSubscription: \"Keep subscription\",\n portalOpensNewTab: (provider, app) =>\n `Payment and invoices open at ${provider} in a new tab; ${app ? `${app} stays open here` : \"this page stays open\"}.`,\n\n payOpening: \"Opening the secure checkout\u2026\",\n payNothing: \"There\u2019s no payment to make here. To choose a plan, go back to the app.\",\n payFailed: \"The checkout couldn\u2019t be opened. Please go back and try again in a moment.\",\n payBack: \"The checkout was closed. You can go back, or reload this page to open it again.\",\n payDone: \"Payment complete. You can close this page.\",\n\n switchTitle: \"Change plan\",\n switchFromTo: (from, to) => `From ${from} to ${to}`,\n switchChargedNow: \"Charged now\",\n switchCredited: \"Credited towards your next charges\",\n switchNextCharge: (date) => `Next charge on ${date}`,\n switchConfirm: \"Change plan\",\n\n grantWarningTitle: \"Your free access continues\",\n grantWarningBody:\n \"You have free access with no end date. A purchase won\u2019t change your plan while the free access runs: you would pay for a plan that doesn\u2019t apply.\",\n grantWarningAction: \"Buy anyway\",\n\n waitingChanges: (count) =>\n count === 1 ? \"1 change waiting for a plan\" : `${count} changes waiting for a plan`,\n discardWaiting: \"Discard waiting changes\",\n\n notConfigured: \"Payments aren't set up yet. Please try again later.\",\n disabled: \"Subscriptions aren't available here.\",\n providerUnavailable: \"The payment provider can\u2019t be reached right now. Please try again in a moment.\",\n alreadySubscribed: \"You already have a subscription. Change your plan above.\",\n planNotSold: \"This plan isn\u2019t offered for that billing period or currency. Please choose another.\",\n notSubscribed: \"There\u2019s no running subscription to change. Choose a plan to subscribe.\",\n planUnchanged: \"That\u2019s already your plan. Pick another plan or billing period.\",\n};\n\n/** The `billing` namespace, resolved: English, then the provider, then `labels` \u2014 which\n * may be partial at every depth (`{ status: { comped: \"Beta\" } }`). */\nexport function useBillingLabels(labels?: LabelOverride<BillingLabels>): BillingLabels {\n return useKitLabels(\"billing\", DEFAULT_BILLING_LABELS, labels);\n}\n", "// The English words of ./plan-change, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./plan-change re-exports them.\n\nimport type { PlanChangeLabels } from \"./plan-change\";\n\nexport const DEFAULT_PLAN_CHANGE_LABELS: PlanChangeLabels = {\n column: \"Plan\",\n title: \"Change plan\",\n confirm: \"Change plan\",\n plan: \"Plan\",\n current: (plan) => `Current plan: ${plan}`,\n keepsItems: \"A smaller plan only blocks creating more; nothing is deleted.\",\n until: \"Free until\",\n untilHint: \"Leave empty for no end. A running beta keeps its own end.\",\n needsChange: \"Pick another plan or an end date.\",\n changed: (from, to) => `Plan changed from ${from} to ${to}.`,\n set: (to) => `Plan set to ${to}.`,\n keptBeta: \"The beta keeps its end; only the plan changed.\",\n untilDone: (date) => `Free until ${date}.`,\n overLimit: \"Above the new plan\u2019s limit: nothing is removed, new items are blocked.\",\n usageOf: (used, limit, dimension) => `${used} of ${limit} ${dimension}`,\n};\n", "import { useKitLabels, type LabelOverride } from \"../i18n/kit-labels\";\nimport type { ContrastMode } from \"../theme/contrast\";\nimport type { TextSize } from \"../theme/text-size\";\n\n/**\n * The `appearance` namespace (0.32, docs/text-size-harmonization.md \u00A76): the words of the\n * two new settings in the core `appearance` group \u2014 `TextSizeSetting` and\n * `ContrastSetting` \u2014 and of any quick switch an app builds from the same vocabulary (the\n * showcase's top bar). Like every kit label: prop > `<UiKitProvider labels={{ appearance\n * }}>` > English.\n */\nexport interface AppearanceLabels {\n /** The text-size setting's name. */\n textSize: string;\n /** One line under it: what changes, so \"Large\" is not mistaken for zoom. */\n textSizeHelp: string;\n /** The three steps, in {@link TEXT_SIZES} order. */\n textSizes: Record<TextSize, string>;\n /** The contrast setting's name. */\n contrast: string;\n /** One line under it. */\n contrastHelp: string;\n /** The three choices, in {@link CONTRAST_MODES} order. */\n contrastModes: Record<ContrastMode, string>;\n /**\n * The account could not keep the pick (`useAccountAppearance`'s `pickTextSize` /\n * `pickContrast` rejected): this device keeps it, the account doesn't. For the app's\n * toast or the line under the setting (0.32.1, keksdose's 0.32 report).\n */\n saveFailed: string;\n /** The date-format setting's name (0.46, `DateFormatSetting`). */\n dateFormat: string;\n /** One line under it: the format is its own choice, apart from the language. */\n dateFormatHelp: string;\n /** Its first option, followed by that language's sample: \"Follow language \u2014 01 Aug 2026\". */\n dateFormatAuto: string;\n /** `AccountMenuTextSize`'s A\u2212 button (0.46, keksdose live #426): one step smaller. */\n textSmaller: string;\n /** Its A+ button: one step larger. */\n textLarger: string;\n}\n\nexport const DEFAULT_APPEARANCE_LABELS: AppearanceLabels = {\n textSize: \"Text size\",\n textSizeHelp: \"Larger letters, and a layout that makes room for them.\",\n textSizes: { normal: \"Normal\", large: \"Large\", xlarge: \"Extra large\" },\n contrast: \"Contrast\",\n contrastHelp: \"More contrast darkens quiet text and lines, and thickens focus frames. System follows this device.\",\n contrastModes: { system: \"System\", standard: \"Standard\", more: \"More\" },\n saveFailed: \"Couldn't save this to your account. It still applies on this device.\",\n dateFormat: \"Date format\",\n dateFormatHelp:\n \"How dates are written throughout the app. Independent of the interface language, so you can read the app in English and still see German dates.\",\n dateFormatAuto: \"Follow language\",\n textSmaller: \"Smaller text\",\n textLarger: \"Larger text\",\n};\n\n/** The `appearance` namespace, resolved \u2014 English, then the provider, then `labels`. For\n * an app's catalogue entries and quick switches, without restating the defaults. */\nexport function useAppearanceLabels(labels?: LabelOverride<AppearanceLabels>): AppearanceLabels {\n return useKitLabels(\"appearance\", DEFAULT_APPEARANCE_LABELS, labels);\n}\n", "// The English words of ./device-reset-setting, in a module with no component code: the\n// English catalogue (src/i18n/defaults.ts) imports them without the component, so `en`\n// loads as one chunk like the other languages (0.34, KS U8). ./device-reset-setting\n// re-exports them.\n\nimport type { DeviceResetLabels } from \"./device-reset-setting\";\n\n/** docs/settings-harmonization.md \u00A711.3, word for word. */\nexport const DEFAULT_DEVICE_RESET_LABELS: DeviceResetLabels = {\n title: \"Reset this device\",\n description:\n \"Puts this device's appearance, and the way its tables and panels were left, back to the defaults. Your account, your data and your sign-in are not touched.\",\n action: \"Reset this device's settings\",\n confirmTitle: \"Reset this device's settings?\",\n confirmBody:\n \"Theme, colours, text size, contrast and language go back to their defaults here, and tables and panels open as they first did. Where your account has a language, a text size or a contrast, this device follows it again. Your account and your other devices stay as they are.\",\n confirmAction: \"Reset\",\n done: \"This device's settings are back to their defaults.\",\n keywords: \"reset defaults device restore appearance tables layout\",\n};\n", "// The English words of ./row-actions, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./row-actions re-exports them.\n\nimport type { RowActionsLabels } from \"./row-actions\";\n\nexport const DEFAULT_ROW_ACTIONS_LABELS: RowActionsLabels = {\n actions: \"Actions\",\n actionsFor: (name) => `Actions for ${name}`,\n};\n", "// The English words of ./app-shell, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./app-shell re-exports them.\n\nimport type { AppShellMoreLabels } from \"./app-shell\";\n\nexport const DEFAULT_APP_SHELL_MORE_LABELS: AppShellMoreLabels = {\n more: \"More\",\n moreTitle: \"More pages\",\n};\n", "// The English words of ./account-chips, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./account-chips re-exports them.\n\nimport type { AccountStateLabels } from \"./account-chips\";\n\nexport const DEFAULT_ACCOUNT_STATE_LABELS = {\n active: \"Active\",\n inactive: \"Inactive\",\n invited: \"Invited\",\n registered: \"Registered\",\n unverified: \"Unverified\",\n passwordChange: \"Must change password\",\n deletion: \"Deletion requested\",\n deletionOn: (date: string) => `Deletion on ${date}`,\n} satisfies Required<AccountStateLabels>;\n", "import { useKitLabels, type LabelOverride } from \"../i18n/kit-labels\";\nimport type { SettingsGroupLabels } from \"../settings/settings-labels\";\n\n/**\n * The `adminArea` namespace (0.42, docs/admin-harmonization.md \u00A73.1): the kit's words of\n * the admin area every app shares \u2014 the account menu's \"Administration\" row, the 403\n * page, the shared sections' names and help lines, the overview's tiles and the Tools\n * list. A module of words with no component code, like every `*-labels.ts` (0.34, KS U8).\n * An app's own sections and tiles bring their own words.\n */\n\n/** The sections every app's admin area shares, in the template's order (\u00A72.3). */\nexport type AdminSharedSection = \"overview\" | \"users\" | \"invitations\" | \"billing\" | \"activity\";\n\n/** The overview's shared tiles (\u00A72.4, \u00A76.1). */\nexport interface AdminTileLabels {\n /** `feedback_waiting`: OPEN reports, crash reports included (\u00A76.1). */\n feedbackWaiting: string;\n /** `deletion_requests`. */\n deletionRequests: string;\n /** `invitations_pending`. */\n invitationsPending: string;\n /** `users_total`. */\n users: string;\n /** `users_new_7d`, the line under the users tile. */\n usersNew: (count: number) => string;\n /** 0.46 (Kurvenschmiede 1, admin \u00A79.5): server-kit's `awaiting_verdict` as an `extra`\n * tile \u2014 answered reports that wait on a verdict (IN_EVALUATION, NEEDS_LIVE_TEST). */\n awaitingVerdict: string;\n /** Its line under the count. */\n awaitingVerdictHint: string;\n /** 0.46: server-kit's `released_for_work` \u2014 the reports released for the work queue. */\n releasedForWork: string;\n /** Its line under the count. */\n releasedForWorkHint: string;\n}\n\nexport interface AdminAreaLabels {\n /** \"Administration\": the account menu's row, and the admin page's heading. */\n title: string;\n /** The row's waiting count, for a reader (\"Administration, 3 waiting\"); the eye sees\n * the number in the badge. */\n waiting: (count: number) => string;\n /**\n * 0.45 (admin \u00A79.3.4): a button's whole name with its count \u2014 \"Platform, 2 waiting\" \u2014\n * for an `IconButton` whose `badge` is an `AdminWaitingBadge`: the badge is decorative\n * there, so the name carries the count. `label` is the button's own name.\n */\n waitingLabel: (label: string, count: number) => string;\n /** The 403 page's heading (\u00A72.2 decision 8). */\n forbiddenTitle: string;\n /**\n * Under it. Says only that THIS area is closed to the account \u2014 never that the person\n * administers nothing anywhere (\u00A76.7: a kastlan superuser who isn't ADMIN in the acting\n * company gets this page).\n */\n forbiddenBody: (appName: string) => string;\n /** The button back to the app's start, unless the app names its own (`homeLabel`). */\n forbiddenHome: string;\n /** A reviewer's second way out, to the translations review. */\n forbiddenReviewer: string;\n /** The shared sections' names and help lines (\u00A72.3 decision 11). */\n sections: Record<AdminSharedSection, SettingsGroupLabels>;\n /** The overview's tiles. */\n tiles: AdminTileLabels;\n /** 0.43: `AdminOverview`'s `error` \u2014 the counts could not be loaded. */\n overviewError: string;\n /** 0.43: its button, which calls `onRetry`. */\n retry: string;\n /** The Tools list's heading and name (\u00A72.5 decision 16). */\n tools: string;\n}\n\nexport const DEFAULT_ADMIN_AREA_LABELS: AdminAreaLabels = {\n title: \"Administration\",\n waiting: (count) => `${count} waiting`,\n waitingLabel: (label, count) => `${label}, ${count} waiting`,\n forbiddenTitle: \"Only for administrators\",\n forbiddenBody: (appName) => `This is where administrators run ${appName}. Your account cannot open this page.`,\n forbiddenHome: \"Go to the start page\",\n forbiddenReviewer: \"Review translations\",\n sections: {\n overview: { title: \"Overview\", help: \"What is waiting, at a glance.\" },\n users: { title: \"Users\", help: \"Who has an account, and what each may do.\" },\n invitations: { title: \"Invitations\", help: \"Invite people by e-mail in their language; resend or revoke what\u2019s still open.\" },\n billing: { title: \"Billing\", help: \"The plan, the payment and the invoices.\" },\n activity: { title: \"Activity\", help: \"What the admins did, newest first.\" },\n },\n tiles: {\n feedbackWaiting: \"To triage\",\n deletionRequests: \"Deletion requests\",\n invitationsPending: \"Pending invitations\",\n users: \"Users\",\n usersNew: (count) => `${count} new in 7 days`,\n awaitingVerdict: \"Awaiting a verdict\",\n awaitingVerdictHint: \"Answered, and waiting for you or the reporter to confirm the fix\",\n releasedForWork: \"Released for work\",\n releasedForWorkHint: \"Ready, rework requested or in progress\",\n },\n overviewError: \"The overview couldn\u2019t be loaded.\",\n retry: \"Try again\",\n tools: \"Tools\",\n};\n\n/**\n * The `adminArea` namespace, resolved \u2014 English, then the provider, then `labels`. What\n * an app reads to hand {@link adminSections} its words from inside a component.\n */\nexport function useAdminAreaLabels(labels?: LabelOverride<AdminAreaLabels>): AdminAreaLabels {\n return useKitLabels(\"adminArea\", DEFAULT_ADMIN_AREA_LABELS, labels);\n}\n", "// The English words of ./mail-test-card, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./mail-test-card re-exports them.\n\nimport { englishRateLimited } from \"../auth/auth-errors\";\nimport type { MailTestCardLabels } from \"./mail-test-card\";\n\n/** docs/admin-harmonization.md \u00A79.2.4, word for word. */\nexport const DEFAULT_MAIL_TEST_CARD_LABELS: MailTestCardLabels = {\n title: \"Test mail\",\n description: \"Sends one mail to your own address, through the transport this installation sends all its mail with.\",\n transport: (backend) => `Transport: ${backend}`,\n action: \"Send a test mail to me\",\n sent: (address) => `Sent to ${address}. Check the inbox.`,\n console: \"The console transport only logs mail; nothing was sent.\",\n failed: \"Could not send. The server log has the provider\u2019s answer.\",\n rateLimited: englishRateLimited,\n keywords: \"test mail email e-mail transport smtp resend console send deliver\",\n};\n", "// The English words of ./sign-out-pending-dialog, in a module with no component code: the\n// English catalogue (src/i18n/defaults.ts) imports them without the component (0.34, KS U8).\n// keksdose's reviewed words (nav.logout_queued_*, account-menu.tsx:247-317) are the canon.\n\nimport type { SignOutPendingDialogLabels } from \"./sign-out-pending-dialog\";\n\nexport const DEFAULT_SIGN_OUT_PENDING_DIALOG_LABELS: SignOutPendingDialogLabels = {\n title: \"Some changes have not been saved to the server yet\",\n lost: (count) =>\n count === 1\n ? \"1 change is still waiting to sync. Logging out clears this device\u2019s copy, and it is the only copy.\"\n : `${count} changes are still waiting to sync. Logging out clears this device\u2019s copy, and it is the only copy.`,\n kept: (count) =>\n count === 1\n ? \"1 change is still waiting to sync. It stays on this device for you and syncs the next time you log in here.\"\n : `${count} changes are still waiting to sync. They stay on this device for you and sync the next time you log in here.`,\n syncNow: \"Sync now\",\n signOutAnyway: \"Log out anyway\",\n discardWaiting: \"Discard waiting changes\",\n cancel: \"Cancel\",\n};\n", "// The English words of ./pwa-update-prompt, in a module with no component code (0.34, KS U8).\n// keksdose's reviewed words (pwa.updateAvailable, pwa.reload) are the canon.\n\nimport type { PwaUpdatePromptLabels } from \"./pwa-update-prompt\";\n\nexport const DEFAULT_PWA_UPDATE_PROMPT_LABELS: PwaUpdatePromptLabels = {\n updateAvailable: \"A new version is available.\",\n reload: \"Reload\",\n};\n", "// The English words of ./shared-computer, in a module with no component code (0.34, KS U8).\n\nimport type { SharedComputerLabels } from \"./shared-computer\";\n\nexport const DEFAULT_SHARED_COMPUTER_LABELS: SharedComputerLabels = {\n label: \"This is a shared computer\",\n hint: \"No copy of your data stays on this device. Pages then open only with a connection.\",\n};\n", "import { useKitLabels, type LabelOverride } from \"../i18n/kit-labels\";\n\n/**\n * The `topBarParts` namespace (0.42, docs/top-bar-harmonization.md \u00A73.1): the words of the\n * top bar's shared parts \u2014 `TourMenu`, `SyncStatusIndicator` and `DevSwitchers`. A module\n * of words with no component code, like every `*-labels.ts` (0.34, KS U8). The language\n * sub-list (`AccountMenuLanguage`) names itself with `topBar.language`, and the dev role\n * switcher's name and tooltip are `topBar.switchRole` / `topBar.role`, as `RoleSwitcher`'s.\n */\n\n/** `TourMenu`'s words (\u00A72.4). */\nexport interface TourMenuLabels {\n /** The compass's name, and the menu's. */\n menu: string;\n /** The NEW dot on the compass, for a reader: it joins the trigger's name. */\n newDot: string;\n /** The heading over the tours that start on the open page. */\n thisPage: string;\n /** The heading over the untaken new tours. */\n newTours: string;\n /** The last row, the way to the app's tours page (only with `href`). */\n allTours: string;\n /** The chip on a new tour's row. */\n badgeNew: string;\n /** What the \u2713 on a taken tour's row says to a reader. */\n completed: string;\n /** The chip on a tour reset by an update (0.43, docs/tours-harmonization.md \u00A78). */\n badgeUpdated: string;\n /** The dot on the compass while only updated tours light it, for a reader. */\n updatedDot: string;\n /** The heading over the untaken new tours when updated ones are among them. */\n newAndUpdated: string;\n}\n\n/** `SyncStatusIndicator`'s words (\u00A72.6). The \"waiting for a plan\" state is\n * `billing.waitingChanges`, the kit's words for it since billing \u00A712.5. */\nexport interface SyncStatusLabels {\n /** Writes this device cannot send (keksdose: no key for the budget). Ranked first. */\n blocked: (count: number) => string;\n offline: string;\n /** The server refused the last round. */\n refused: string;\n syncing: string;\n pending: (count: number) => string;\n /** Settled, with the time of the last good round (already formatted). */\n syncedAt: (time: string) => string;\n /** Settled, before the first round. */\n idle: string;\n /** Joined to the state when a tap syncs: what the tap does. */\n syncHint: string;\n /** Joined to the state while offline, when a tap can do nothing. */\n offlineHint: string;\n /** The state and what a tap does, as one tooltip: \"Offline \u2014 nothing to sync\u2026\". */\n withHint: (state: string, hint: string) => string;\n /** The state with the app's `scope` words before it: \"Handovers on this device: \u2026\". */\n scoped: (scope: string, state: string) => string;\n /** The short words beside the cloud (`showLabel`): offline. */\n offlineShort: string;\n /** The short words while syncing. */\n syncingShort: string;\n /** The short words while changes wait (pending, held for a plan, or blocked). */\n waitingShort: (count: number) => string;\n /** The short words after a refused round. */\n refusedShort: string;\n /** Offline in an online-only app (`storage=\"none\"`): nothing is kept on the device. */\n offlineUnsaved: string;\n /** A round under way in an online-only app \u2014 it saves, it doesn't sync. Also its short\n * words beside the cloud. */\n saving: string;\n}\n\n/** `DevSwitchers`' words (\u00A72.7, \u00A76.2, \u00A76.3). */\nexport interface DevSwitchersLabels {\n /** The heading of the role menu. */\n roleHeading: string;\n /** The plan switcher's name. */\n switchPlan: string;\n /** The plan switcher's tooltip, given the active plan. */\n plan: (value: string) => string;\n /** The heading of the plan menu. */\n planHeading: string;\n /** The row back to the role the session started with. */\n backTo: (role: string) => string;\n /** The plan menu's note while billing is off locally. */\n billingOff: string;\n}\n\nexport interface TopBarPartsLabels {\n tours: TourMenuLabels;\n sync: SyncStatusLabels;\n dev: DevSwitchersLabels;\n}\n\nexport const DEFAULT_TOP_BAR_PARTS_LABELS: TopBarPartsLabels = {\n tours: {\n menu: \"Guided tours\",\n newDot: \"New tours\",\n thisPage: \"On this page\",\n newTours: \"New tours\",\n allTours: \"All tours\u2026\",\n badgeNew: \"New\",\n completed: \"Completed\",\n badgeUpdated: \"Updated\",\n updatedDot: \"Updated tours\",\n newAndUpdated: \"New and updated\",\n },\n sync: {\n blocked: (count) =>\n count === 1\n ? \"1 change cannot be sent from this device\"\n : `${count} changes cannot be sent from this device`,\n offline: \"Offline \u2014 changes are saved on this device and will sync when you reconnect\",\n refused: \"The server refused the last sync\",\n syncing: \"Syncing\u2026\",\n pending: (count) => (count === 1 ? \"1 change waiting to sync\" : `${count} changes waiting to sync`),\n syncedAt: (time) => `Synced at ${time}`,\n idle: \"Up to date\",\n syncHint: \"Tap to sync now\",\n offlineHint: \"nothing to sync while offline\",\n withHint: (state, hint) => `${state} \u2014 ${hint}`,\n scoped: (scope, state) => `${scope}: ${state}`,\n offlineShort: \"Offline\",\n syncingShort: \"Syncing\u2026\",\n waitingShort: (count) => `${count} waiting`,\n refusedShort: \"Not synced\",\n offlineUnsaved: \"Offline \u2014 changes can't be saved until you reconnect\",\n saving: \"Saving\u2026\",\n },\n dev: {\n roleHeading: \"Dev \u00B7 role\",\n switchPlan: \"Switch plan\",\n plan: (value) => `Plan: ${value}`,\n planHeading: \"Dev \u00B7 plan\",\n backTo: (role) => `Back to ${role}`,\n billingOff: \"Billing is off locally: plans change nothing\",\n },\n};\n\n/** The `topBarParts` namespace, resolved \u2014 English, then the provider, then `labels`. */\nexport function useTopBarPartsLabels(labels?: LabelOverride<TopBarPartsLabels>): TopBarPartsLabels {\n return useKitLabels(\"topBarParts\", DEFAULT_TOP_BAR_PARTS_LABELS, labels);\n}\n", "// The English words of ./share-card, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./share-card re-exports them.\n\nimport type { ShareCardLabels } from \"./share-card\";\n\nexport const DEFAULT_SHARE_CARD_LABELS: ShareCardLabels = {\n dialogTitle: \"Share\",\n close: \"Close\",\n email: \"Email address\",\n emailOptional: \"Email address (optional)\",\n emailPlaceholder: \"name@example.com\",\n invalidEmail: \"Enter a complete email address.\",\n role: \"Role\",\n roleOf: (name) => `Role of ${name}`,\n add: \"Share\",\n whoHasAccess: \"Who has access\",\n nobodyYet: \"Nobody else has access yet.\",\n pending: \"Pending\",\n openInvite: \"Open invite link\",\n copyLink: \"Copy link\",\n team: \"Team\",\n teamHint: (name) => `Everyone in ${name} gets access.`,\n remove: \"Remove access\",\n removeConfirm: (name) => `Remove access for ${name}?`,\n revokePending: \"Withdraw invitation\",\n revokePendingConfirm: (name) => `Withdraw the invitation for ${name}?`,\n failed: \"That did not work. Please try again.\",\n loading: \"Loading\u2026\",\n};\n", "// The English words of ./reauth-dialog, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./reauth-dialog re-exports them.\n\nimport type { ReauthDialogLabels } from \"./reauth-dialog\";\n\nexport const DEFAULT_REAUTH_DIALOG_LABELS: ReauthDialogLabels = {\n title: \"Confirm it\u2019s you\",\n description: \"Enter your current password to continue.\",\n password: \"Current password\",\n submit: \"Continue\",\n cancel: \"Cancel\",\n};\n", "// The English words of ./server-wake, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./server-wake re-exports them.\n\nimport type { ServerWakeLabels } from \"./server-wake\";\n\nexport const DEFAULT_SERVER_WAKE_LABELS: ServerWakeLabels = {\n slow: \"Still loading \u2014 this is taking longer than usual.\",\n waking: (appName) =>\n `The server goes to sleep when nobody is using ${appName ?? \"the app\"}, so the first request after a break has to start it again. That can take a moment \u2014 nothing is lost, the page fills in by itself.`,\n};\n", "import type { ReviewStatus } from \"../lib/translation-review\";\n\n/**\n * The `translationReview` namespace: every word of the translation-review parts\n * (`ReviewStatusChip`, `TranslationProgress`, `TranslationLocaleTabs`,\n * `TranslationExportButton`, `TranslationReviewEditor`, `TranslationReviewPanel`).\n *\n * Its own module, like `data-table-labels.ts`: `kit-labels.tsx` and `defaults.ts` import\n * it, and neither has to load the components to get the words. The English is keksdose's\n * and kastlan's own (`translation_review.*`, `translations:*`), British.\n */\nexport interface TranslationReviewLabels {\n /** The five statuses \u2014 the chip, the filter, the progress legend. */\n statusMissing: string;\n statusUnreviewed: string;\n statusChanged: string;\n statusNeedsChange: string;\n statusApproved: string;\n /** Accessible name of the status filter. */\n statusFilter: string;\n /** The status filter's first option. */\n all: string;\n /** A status filter option with its count: \"Unreviewed \u00B7 12\". */\n filterCount: (label: string, count: number) => string;\n /** The source filter's label \u2014 shown only when the rows come from several sources\n * (kastlan's screen texts and documents). */\n source: string;\n allSources: string;\n /** The namespace filter's label and its \"every one\" option. */\n namespace: string;\n allNamespaces: string;\n search: string;\n /** The placeholder filter, with how many rows it would show. */\n placeholdersOnly: (count: number) => string;\n /** The chip on a row whose placeholders differ from the reference's. */\n placeholderChip: string;\n /** The key column, and the key's caption in the editor. */\n key: string;\n statusColumn: string;\n /** No row matches the filters. */\n empty: string;\n /** In place of the text of a string the locale lacks. */\n missingText: string;\n /** The progress bar's label. */\n progress: (approved: number, total: number) => string;\n /** A locale tab's badge. */\n localeProgress: (approved: number, total: number) => string;\n /** Accessible name of the locale tabs. */\n locales: string;\n approve: string;\n /** Send a string back: \"Needs a change\". */\n flag: string;\n /** \"Needs a change\" for a MISSING string: the suggestion is the translation to add. */\n suggest: string;\n /** 0.46 (keksdose B2/S3): the desktop row's button that OPENS the editor to send a\n * string back \u2014 its own name, apart from the editor's `flag`, which saves. */\n flagRow: string;\n /** The same for a MISSING string: opens the editor to add the translation. */\n suggestRow: string;\n /** Clear a verdict: back to unreviewed. */\n reset: string;\n /** The editor's way out without saving. */\n cancel: string;\n approveSelected: string;\n resetSelected: string;\n /** Selects every row the filters show \u2014 the phone's way into the bulk actions, where\n * the table has no checkboxes. */\n selectShown: string;\n /** Over the old wording of a row that changed since its verdict. */\n changedSince: string;\n reviewedWording: string;\n reviewedReference: string;\n /** The placeholders differ: the reference's and the text's, each a list. */\n placeholderMismatch: (reference: string, text: string) => string;\n lastApproved: (name: string, date: string) => string;\n lastFlagged: (name: string, date: string) => string;\n /** The reviewer's name once the account is gone \u2014 what `name` above becomes. */\n erasedReviewer: string;\n /** The editor's wording field, opened on the current text. */\n suggestion: string;\n /** The same field for a missing string. */\n translation: string;\n note: string;\n notePlaceholder: string;\n /** The viewer may read this locale but not review it. */\n readOnly: string;\n /** The reviewer is limited to some areas \u2014 `areas` is their names, joined. */\n scope: (areas: string) => string;\n exportCorrections: (count: number) => string;\n /** A callback rejected and no `formatError` says better. */\n failed: string;\n /** 0.25: the Undo toast after an approval (`undo`) \u2014 one string, or a batch of them. */\n approvedToast: (count: number) => string;\n /** 0.25: a group's header under `groupBy` \u2014 how many of its rows nobody has read yet,\n * of how many the filters show in it. */\n groupCount: (unreviewed: number, total: number) => string;\n /** 0.25: a group's bulk action \u2014 approve its unreviewed rows. */\n approveGroup: (count: number) => string;\n /** 0.25: asked first when a group's bulk approve is larger than a page \u2014 more than the\n * reviewer can have had on screen. `group` is the group's name. */\n confirmGroup: (count: number, group: string) => string;\n /** The Undo toast after a swipe bound to `clear` took a verdict back (keksdose, live\n * #377 rework: the swipes bound in its settings) \u2014 one string, or a batch of them.\n * The swipe itself is named by {@link reset}. */\n clearedToast: (count: number) => string;\n}\n\nexport const DEFAULT_TRANSLATION_REVIEW_LABELS: TranslationReviewLabels = {\n statusMissing: \"Missing\",\n statusUnreviewed: \"Unreviewed\",\n statusChanged: \"Changed since review\",\n statusNeedsChange: \"Needs a change\",\n statusApproved: \"Approved\",\n statusFilter: \"Status\",\n all: \"All\",\n filterCount: (label, count) => `${label} \u00B7 ${count}`,\n source: \"Texts\",\n allSources: \"All texts\",\n namespace: \"Area\",\n allNamespaces: \"All areas\",\n search: \"Search keys and text\",\n placeholdersOnly: (count) => `Only placeholder problems (${count})`,\n placeholderChip: \"Placeholders\",\n key: \"Key\",\n statusColumn: \"Status\",\n empty: \"No strings match these filters.\",\n missingText: \"Missing in this language\",\n progress: (approved, total) => `${approved} of ${total} approved`,\n localeProgress: (approved, total) => `${approved}/${total}`,\n locales: \"Languages\",\n approve: \"Approve\",\n flag: \"Needs a change\",\n suggest: \"Suggest translation\",\n flagRow: \"Flag for a change\u2026\",\n suggestRow: \"Add a translation\u2026\",\n reset: \"Mark unreviewed\",\n cancel: \"Cancel\",\n approveSelected: \"Approve selected\",\n resetSelected: \"Mark selected unreviewed\",\n selectShown: \"Select all shown\",\n changedSince: \"This string changed after it was reviewed. Please read it again.\",\n reviewedWording: \"Wording when reviewed\",\n reviewedReference: \"Reference when reviewed\",\n placeholderMismatch: (reference, text) =>\n `The placeholders differ from the reference \u2014 reference: ${reference}; this text: ${text}. The app fills these in, so they must stay exactly as they are.`,\n lastApproved: (name, date) => `Approved by ${name} on ${date}`,\n lastFlagged: (name, date) => `Marked as needing a change by ${name} on ${date}`,\n erasedReviewer: \"a deleted account\",\n suggestion: \"Better wording\",\n translation: \"Translation\",\n note: \"Note (optional)\",\n notePlaceholder: \"What is wrong, or what to keep in mind\",\n readOnly: \"You can read this language but not review it.\",\n scope: (areas) => `Your review is limited to: ${areas}.`,\n exportCorrections: (count) => `Export corrections (${count})`,\n failed: \"That did not work. Please try again.\",\n approvedToast: (count) => (count === 1 ? \"String approved\" : `${count} strings approved`),\n groupCount: (unreviewed, total) => `${unreviewed} unreviewed / ${total}`,\n approveGroup: (count) => `Approve unreviewed (${count})`,\n confirmGroup: (count, group) =>\n count === 1\n ? `Approve the unreviewed string in ${group}?`\n : `Approve all ${count} unreviewed strings in ${group}, including those not on screen?`,\n clearedToast: (count) => (count === 1 ? \"String marked unreviewed\" : `${count} strings marked unreviewed`),\n};\n\n/** A status's word, from the namespace's five. */\nexport function reviewStatusLabel(labels: TranslationReviewLabels, status: ReviewStatus): string {\n switch (status) {\n case \"missing\":\n return labels.statusMissing;\n case \"unreviewed\":\n return labels.statusUnreviewed;\n case \"changed\":\n return labels.statusChanged;\n case \"needs_change\":\n return labels.statusNeedsChange;\n case \"approved\":\n return labels.statusApproved;\n }\n}\n", "// The English words of ./country-select, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./country-select re-exports them.\n\nimport type { CountrySelectLabels } from \"./country-select\";\n\nexport const DEFAULT_COUNTRY_SELECT_LABELS: CountrySelectLabels = {\n country: \"Country\",\n search: \"Search country\",\n others: \"Other countries\",\n};\n", "// The English words of ./inline-edit-field, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./inline-edit-field re-exports them.\n\nimport type { InlineEditLabels } from \"./inline-edit-field\";\n\nexport const DEFAULT_INLINE_EDIT_LABELS: InlineEditLabels = {\n edit: (label) => `Edit ${label}`,\n failed: \"The change could not be saved.\",\n empty: \"Empty\",\n};\n", "// The English words of ./iban-input, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./iban-input re-exports them.\n\nimport type { IbanInputLabels } from \"./iban-input\";\n\nexport const DEFAULT_IBAN_INPUT_LABELS: IbanInputLabels = {\n format: \"An IBAN starts with a two-letter country code and two check digits.\",\n country: (code) => `\u201C${code}\u201D is not the country code of an IBAN.`,\n length: (actual, expected) =>\n `An IBAN from this country has ${expected} characters \u2014 this one has ${actual}.`,\n checksum: \"The check digits don\u2019t match \u2014 a character is probably mistyped.\",\n qrRequired: \"This is a regular IBAN. A QR-bill needs the account\u2019s QR-IBAN.\",\n qrNotAllowed: \"This is a QR-IBAN, which only receives QR-bill payments. Enter the account\u2019s regular IBAN.\",\n};\n", "// The English words of ./phone-input, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./phone-input re-exports them.\n\nimport type { PhoneInputLabels } from \"./phone-input\";\n\nexport const DEFAULT_PHONE_INPUT_LABELS: PhoneInputLabels = {\n countryCode: \"Country code\",\n other: \"Other\",\n};\n", "// The English words of ./sign-chip, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./sign-chip re-exports them.\n\nimport type { SignChipLabels } from \"./sign-chip\";\n\nexport const DEFAULT_SIGN_CHIP_LABELS: SignChipLabels = {\n outflow: \"Outflow\",\n inflow: \"Inflow\",\n direction: (current, next) => `Direction: ${current} \u2014 switch to ${next}`,\n switchTo: (next) => `Switch to ${next}`,\n};\n", "// The English words of ./column-mapper, in a module with no component code: the English\n// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one\n// chunk like the other languages (0.34, KS U8). ./column-mapper re-exports them.\n\nimport type { ColumnMapperLabels } from \"./column-mapper\";\n\n/** {@link ColumnMapperLabels.requiredRoleShort}'s English \u2014 and its fallback for a\n * provider whose labels predate the key. */\nexport const markedShort = (role: string) => `${role} *`;\n\nexport const DEFAULT_COLUMN_MAPPER_LABELS: ColumnMapperLabels = {\n paste: \"Paste a table\",\n pasteHint:\n \"Copy the rows out of a spreadsheet and paste them here, or drop a CSV or text file.\",\n chooseFile: \"Choose a file\",\n readError: (name) => `\u201C${name}\u201D could not be read`,\n headerRow: \"The first line names the columns\",\n summary: (columns, rows) =>\n `${columns} ${columns === 1 ? \"column\" : \"columns\"}, ${rows} ${rows === 1 ? \"row\" : \"rows\"}`,\n separatorSemicolon: \"separated by semicolons\",\n separatorComma: \"separated by commas\",\n separatorTab: \"separated by tabs\",\n separatorSpace: \"separated by spaces\",\n decimalComma: \"decimal comma (1,5)\",\n decimalPoint: \"decimal point (1.5)\",\n unreadCount: (count) =>\n count === 1\n ? \"1 line could not be read\"\n : `${count} lines could not be read`,\n unreadLine: (line) => `Line ${line} could not be read`,\n unreadMore: (count) => `\u2026and ${count} more`,\n noRows: \"No line of this text reads as a row of the table.\",\n table: \"Columns and their roles\",\n columnN: (n) => `Column ${n}`,\n roleOf: (column) => `What does column \u201C${column}\u201D hold?`,\n ignore: \"Ignore\",\n requiredRole: (role) => `${role} (required)`,\n requiredRoleShort: markedShort,\n previewOf: (shown, total) =>\n shown === 1\n ? `The first of ${total} rows`\n : `The first ${shown} of ${total} rows`,\n oneOf: (roles) => `either ${roles}`,\n missing: (roles) => `Still needed: ${roles}.`,\n};\n", "// The words of the notification cards (docs/notifications-harmonization.md \u00A74.2), in a\n// module with no component code: the English catalogue (src/i18n/defaults.ts) imports\n// them without the components, so `en` loads as one chunk like the other languages\n// (0.34, KS U8). The cards read it through `useKitLabels(\"notifications\", \u2026)`.\n\n/** The ten IANA regions `Intl` lists zones under \u2014 keksdose's `tz_region_*` \u2014 in the\n * kit's words. A region a runtime adds later keeps its IANA name. */\nexport interface NotificationRegionLabels {\n Africa: string;\n America: string;\n Antarctica: string;\n Arctic: string;\n Asia: string;\n Atlantic: string;\n Australia: string;\n Europe: string;\n Indian: string;\n Pacific: string;\n}\n\n/**\n * Every string the notification parts render \u2014 the `notifications` namespace of\n * `<UiKitProvider labels>`, overridable per instance through `labels`: the types card,\n * quiet hours, this device's push, the device list, and the\n * unsubscribe page. Cancel is `common.cancel`.\n */\nexport interface NotificationsLabels {\n /* \u2500\u2500 The types card \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n /** The types card's title. */\n typesTitle: string;\n /** The line under it. */\n typesDescription: string;\n /** 0.46 (\u00A710.2): the channel columns' headings, and each switch's name. */\n channelApp: string;\n channelPush: string;\n channelEmail: string;\n /** Under every e-mail switch while the account's address is unverified (decision 16):\n * no notification mail goes to an unverified address. */\n emailUnverified: string;\n /** The digest's cadence select. */\n digestCadence: string;\n digestWeekly: string;\n digestMonthly: string;\n /** While the settings load. */\n typesLoading: string;\n /** The server answered no types for this account. */\n typesEmpty: string;\n\n /* \u2500\u2500 Quiet hours \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n quietTitle: string;\n /** The line under the title; `inbox`: the app keeps an inbox, which a held push still\n * reaches; `held` (0.46, \u00A710.4): the app queues a held push and sends it when the\n * window ends, instead of dropping it. */\n quietDescription: (inbox: boolean, held?: boolean) => string;\n /** 0.46 (\u00A710.3, automatic only): the card names the account's zone, read-only, given\n * the zone as `zoneName` writes it (\"Europe / Zurich\"); it follows the device last used. */\n quietZone: (zone: string) => string;\n /** The start time's label. */\n quietFrom: string;\n /** The end time's label. */\n quietUntil: string;\n /** One time set, the other not: quiet hours fail open until both are. */\n quietIncomplete: string;\n /** The zone's region headings, in a zone's name (\"Europe / Zurich\"). */\n regions: NotificationRegionLabels;\n\n /* \u2500\u2500 This device \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n pushTitle: string;\n pushDescription: string;\n /** The browser has no push. */\n unsupported: string;\n /** iOS outside the installed app, given the app's name. */\n iosInstall: (app: string) => string;\n /** The server has no VAPID keys. */\n notConfigured: string;\n /** The browser's permission is denied. */\n blocked: string;\n /** This device gets notifications for the signed-in account. */\n on: string;\n off: string;\n /** This browser's subscription belongs to another account. */\n otherAccount: string;\n enable: string;\n disable: string;\n sendTest: string;\n /** Turning on did not finish (the permission prompt dismissed, a refusal). */\n enableFailed: string;\n /** No service worker, or one that is not ready in 10 s. */\n noServiceWorker: string;\n /** The browser's push service did not answer in 15 s. */\n pushTimeout: string;\n /** Given how many devices the push service accepted the test for (\u2265 1). */\n testSent: (count: number) => string;\n /** The test reached no device. */\n testNone: string;\n testFailed: string;\n /** The explainer before the browser's one permission prompt. */\n explainerTitle: string;\n explainerBody: (app: string) => string;\n explainerHint: string;\n explainerContinue: string;\n\n /* \u2500\u2500 The device list \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n devicesTitle: string;\n devicesDescription: string;\n devicesLoading: string;\n devicesEmpty: string;\n /** A device whose user agent says nothing the kit recognises. */\n unknownDevice: string;\n /** The chip on this browser's row. */\n thisDevice: string;\n /** Given the registration date, formatted. */\n added: (date: string) => string;\n /** Given the last accepted delivery, formatted. */\n lastDelivery: (date: string) => string;\n noDelivery: string;\n /** Given the failed deliveries in a row (\u2265 1). */\n failures: (count: number) => string;\n /** A row's button, visible text \u2014 and the confirm's answer. */\n remove: string;\n /** The same button's accessible name, given the device: it starts with `remove`. */\n removeItem: (device: string) => string;\n /** The question the row asks before it removes. */\n removePrompt: string;\n /** 0.46 (\u00A710.2): the disclosure on a device's row listing the types with push on. */\n deviceTypes: string;\n /** The line inside it. */\n deviceTypesDescription: string;\n /** No type has push on for the account. */\n deviceTypesEmpty: string;\n\n /* \u2500\u2500 The inbox and the bell (0.46, \u00A710.1) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n /** The inbox's heading (keksdose's \"Inbox\"). */\n inboxTitle: string;\n inboxLoading: string;\n /** Nothing in the inbox. */\n inboxEmpty: string;\n markAllRead: string;\n /** The header's clear button, and the confirm's answer. */\n clearAll: string;\n /** The question asked before the inbox is cleared. */\n clearPrompt: string;\n /** The row that loads the next page. */\n showMore: string;\n /** The bell's name. */\n bellLabel: string;\n /** Read after the bell's name, given the unread count (\u2265 1). */\n bellUnread: (count: number) => string;\n /** The bell panel's link to the app's inbox. */\n allNotifications: string;\n\n /* \u2500\u2500 The unsubscribe page \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n unsubscribeTitle: string;\n /** Given the type's name in the app's words. */\n unsubscribeAbout: (type: string) => string;\n /** No type name to give. */\n unsubscribeGeneric: string;\n stopThese: string;\n stopAll: (app: string) => string;\n stoppedThese: string;\n stoppedAll: (app: string) => string;\n /** Account mail is not a notification, and keeps coming. */\n accountMail: string;\n turnBackOn: string;\n openSettings: string;\n /** A token the server refused, or one that does not parse. */\n invalidLink: string;\n\n /* \u2500\u2500 Every card \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n /** A request failed, and the app had no words of its own. */\n failed: string;\n}\n\nexport const DEFAULT_NOTIFICATIONS_LABELS: NotificationsLabels = {\n typesTitle: \"Notify me about\",\n typesDescription: \"Choose what you hear about, and how.\",\n channelApp: \"In the app\",\n channelPush: \"Push\",\n channelEmail: \"E-mail\",\n emailUnverified: \"Confirm your address to receive these.\",\n digestCadence: \"Frequency\",\n digestWeekly: \"Weekly\",\n digestMonthly: \"Monthly\",\n typesLoading: \"Loading notification settings\u2026\",\n typesEmpty: \"There are no notifications for this account.\",\n\n quietTitle: \"Quiet hours\",\n quietDescription: (inbox, held) =>\n held\n ? inbox\n ? \"Push notifications wait during this window and arrive when it ends. They reach your inbox at once.\"\n : \"Push notifications wait during this window and arrive when it ends.\"\n : inbox\n ? \"No push notifications during this window. They still reach your inbox.\"\n : \"No push notifications during this window.\",\n quietZone: (zone) => `In your time zone (${zone}), which follows the device you last used.`,\n quietFrom: \"From\",\n quietUntil: \"Until\",\n quietIncomplete: \"Set both a start and an end time. Quiet hours take effect once both are set.\",\n regions: {\n Africa: \"Africa\",\n America: \"Americas\",\n Antarctica: \"Antarctica\",\n Arctic: \"Arctic\",\n Asia: \"Asia\",\n Atlantic: \"Atlantic\",\n Australia: \"Australia\",\n Europe: \"Europe\",\n Indian: \"Indian Ocean\",\n Pacific: \"Pacific\",\n },\n\n pushTitle: \"Push notifications\",\n pushDescription: \"Notifications on this device, also while the app is closed.\",\n unsupported: \"This browser doesn\u2019t support push notifications.\",\n iosInstall: (app) =>\n `On iPhone or iPad, add ${app} to your Home Screen first: iOS delivers notifications only to the installed app.`,\n notConfigured: \"Push notifications aren\u2019t set up on this server.\",\n blocked: \"Notifications are blocked in this browser\u2019s settings.\",\n on: \"Notifications are on for this device.\",\n off: \"Notifications are off for this device.\",\n otherAccount:\n \"This browser gets notifications for another account. Turn them on here to get them for the account you\u2019re signed in with.\",\n enable: \"Turn on notifications\",\n disable: \"Turn off\",\n sendTest: \"Send a test\",\n enableFailed: \"Couldn\u2019t turn on notifications.\",\n noServiceWorker: \"Couldn\u2019t reach the app\u2019s service worker. Reload the page and try again.\",\n pushTimeout: \"The browser\u2019s push service didn\u2019t answer. Check your connection and try again.\",\n testSent: (count) => (count === 1 ? \"Test sent to 1 device\" : `Test sent to ${count} devices`),\n testNone: \"No device accepted the test. Turn notifications on for this device first.\",\n testFailed: \"Couldn\u2019t send a test notification.\",\n explainerTitle: \"Turn on notifications?\",\n explainerBody: (app) =>\n `${app} sends a notification only for the kinds you choose, and you can turn them off at any time.`,\n explainerHint: \"Your browser asks for permission next.\",\n explainerContinue: \"Continue\",\n\n devicesTitle: \"Notification devices\",\n devicesDescription: \"Every device that gets push notifications for your account. Remove any you no longer use.\",\n devicesLoading: \"Loading devices\u2026\",\n devicesEmpty: \"No device gets notifications yet.\",\n unknownDevice: \"Unknown device\",\n thisDevice: \"This device\",\n added: (date) => `Added ${date}`,\n lastDelivery: (date) => `Last delivery ${date}`,\n noDelivery: \"No delivery yet\",\n failures: (count) =>\n count === 1 ? \"1 failed delivery in a row\" : `${count} failed deliveries in a row`,\n remove: \"Remove\",\n removeItem: (device) => `Remove ${device}`,\n removePrompt: \"Stop sending notifications to this device?\",\n deviceTypes: \"Types on this device\",\n deviceTypesDescription: \"Turn a type off to mute it on this device only.\",\n deviceTypesEmpty: \"No type has push notifications turned on.\",\n\n inboxTitle: \"Inbox\",\n inboxLoading: \"Loading notifications\u2026\",\n inboxEmpty: \"You\u2019re all caught up.\",\n markAllRead: \"Mark all as read\",\n clearAll: \"Clear all\",\n clearPrompt: \"Delete all notifications from your inbox?\",\n showMore: \"Show more\",\n bellLabel: \"Notifications\",\n bellUnread: (count) => `${count} unread`,\n allNotifications: \"All notifications\",\n\n unsubscribeTitle: \"E-mail notifications\",\n unsubscribeAbout: (type) => `You get e-mails about: ${type}.`,\n unsubscribeGeneric: \"You get notification e-mails.\",\n stopThese: \"Stop these e-mails\",\n stopAll: (app) => `Stop all notification e-mails from ${app}`,\n stoppedThese: \"Done. You won\u2019t get these e-mails any more.\",\n stoppedAll: (app) => `Done. You won\u2019t get notification e-mails from ${app} any more.`,\n accountMail: \"E-mails about your account still come.\",\n turnBackOn: \"You can turn them back on at any time in Settings.\",\n openSettings: \"Open Settings\",\n invalidLink: \"This link doesn\u2019t work any more. You can turn e-mails off in Settings instead.\",\n\n failed: \"That didn\u2019t work. Please try again.\",\n};\n", "// The English words of the eleven namespaces the provider types itself (./kit-labels),\n// in a module with no provider code: the English catalogue (./defaults) imports them\n// without the React context, as it imports every component's `*-labels.ts`, and\n// ./kit-labels re-exports them under the same names. Until 0.34 they were the rule's\n// exceptions, written in the provider (round 0.34, DOC-6's sev-1 note).\n//\n// Here rather than beside their components: the provider re-exports them, and the\n// catalogues reach the provider, so a module outside `i18n/` would put component\n// directories into every catalogue's graph (`npm run check:graph` refuses that).\n\nimport type {\n AppShellLabels,\n CalculatorLabels,\n ComboboxLabels,\n CommonLabels,\n CurrencyLabels,\n DatePickerLabels,\n FileLabels,\n MultiSelectLabels,\n PickerSheetLabels,\n SwipeableRowLabels,\n TopBarLabels,\n} from \"./kit-labels\";\n\nexport const DEFAULT_COMMON_LABELS: CommonLabels = {\n close: \"Close\",\n clear: \"Clear\",\n search: \"Search\",\n done: \"Done\",\n cancel: \"Cancel\",\n save: \"Save\",\n back: \"Back\",\n next: \"Next\",\n remove: \"Remove\",\n loading: \"Loading\u2026\",\n noResults: \"No results\",\n fieldValue: (field, value) => `${field}: ${value}`,\n dismiss: \"Dismiss\",\n opensInNewTab: \"opens in a new tab\",\n aboutField: (field) => `About \u201C${field}\u201D`,\n help: \"Help\",\n};\n\nexport const DEFAULT_DATE_PICKER_LABELS: DatePickerLabels = {\n panel: \"Choose a date\",\n rangePanel: \"Choose a date range\",\n clear: \"Clear\",\n previousDay: \"Previous day\",\n nextDay: \"Next day\",\n today: \"Today\",\n apply: \"Apply\",\n cancel: \"Cancel\",\n presets: \"Quick ranges\",\n};\n\nexport const DEFAULT_COMBOBOX_LABELS: ComboboxLabels = {\n search: \"Search\",\n noResults: \"No results\",\n clear: \"Clear\",\n loading: \"Loading\u2026\",\n create: (query) => `Create \u201C${query}\u201D`,\n selectedCount: (count) => `${count} selected`,\n loadError: \"Couldn\u2019t load results\",\n resultCount: (count) => (count === 1 ? \"1 result\" : `${count} results`),\n minChars: (count) =>\n count === 1 ? \"Type at least 1 character\" : `Type at least ${count} characters`,\n};\n\nexport const DEFAULT_MULTI_SELECT_LABELS: MultiSelectLabels = {\n search: \"Search\",\n selectAll: \"Select all\",\n clear: \"Clear\",\n all: \"All\",\n selectedCount: (count) => String(count),\n};\n\nexport const DEFAULT_CALCULATOR_LABELS: CalculatorLabels = {\n open: \"Open calculator\",\n panel: \"Calculator\",\n calculation: \"Calculation\",\n backspace: \"Backspace\",\n clear: \"Clear\",\n equals: \"Equals\",\n done: \"Done\",\n plus: \"Plus\",\n minus: \"Minus\",\n times: \"Times\",\n divide: \"Divide\",\n decimal: \"Decimal point\",\n};\n\nexport const DEFAULT_CURRENCY_LABELS: CurrencyLabels = {\n currency: \"Currency\",\n search: \"Search currency\",\n};\n\nexport const DEFAULT_APP_SHELL_LABELS: AppShellLabels = {\n collapse: \"Collapse sidebar\",\n expand: \"Expand sidebar\",\n toggleGroup: (groupLabel) => `${groupLabel}: pages`,\n};\n\nexport const DEFAULT_TOP_BAR_LABELS: TopBarLabels = {\n theme: \"Toggle theme\",\n palette: \"Appearance preset\",\n language: \"Language\",\n switchRole: \"Switch role\",\n role: (value) => `Role: ${value}`,\n};\n\nexport const DEFAULT_PICKER_SHEET_LABELS: PickerSheetLabels = { close: \"Close\", done: \"Done\" };\n\nexport const DEFAULT_SWIPEABLE_ROW_LABELS: SwipeableRowLabels = { actions: \"Row actions\" };\n\n/** Formats with the locale the provider was given (see {@link useKitFileLabels}).\n * This static default has no locale to hand and falls back to the runtime's. */\nexport const DEFAULT_FILE_LABELS: FileLabels = {\n size: (bytes) => formatFileSize(bytes),\n};\n\n/** \"12 kB\", \"3.4 MB\" \u2014 `Intl`'s unit formatting, so the digits, the decimal mark and\n * the unit's spelling all follow `locale`. */\nexport function formatFileSize(bytes: number, locale?: string): string {\n const units = [\"byte\", \"kilobyte\", \"megabyte\", \"gigabyte\"] as const;\n let value = bytes;\n let i = 0;\n while (value >= 1000 && i < units.length - 1) {\n value /= 1000;\n i += 1;\n }\n return new Intl.NumberFormat(locale, {\n style: \"unit\",\n unit: units[i],\n unitDisplay: i === 0 ? \"long\" : \"short\",\n maximumFractionDigits: value < 10 && i > 0 ? 1 : 0,\n }).format(value);\n}\n", "import { DEFAULT_DATA_TABLE_LABELS } from \"../components/data-table-labels\";\nimport { DEFAULT_MINI_CALENDAR_LABELS } from \"../components/mini-calendar-labels\";\nimport { DEFAULT_CALENDAR_HEATMAP_LABELS } from \"../components/calendar-heatmap-labels\";\nimport { DEFAULT_MONTH_PICKER_LABELS } from \"../components/month-picker-labels\";\nimport { DEFAULT_PAGE_CONTENTS_LABELS } from \"../components/page-contents-labels\";\nimport { DEFAULT_POPOVER_LABELS } from \"../components/popover-labels\";\nimport { DEFAULT_CHIP_INPUT_LABELS } from \"../components/chip-labels\";\nimport { DEFAULT_FIELD_SYNC_LABELS } from \"../components/field-sync-labels\";\nimport {\n DEFAULT_CHARACTER_COUNT_LABELS,\n DEFAULT_PASSWORD_REVEAL_LABELS,\n DEFAULT_TABS_LABELS,\n} from \"../components/ui-labels\";\nimport { DEFAULT_WIZARD_LABELS } from \"../wizard/wizard-labels\";\nimport { DEFAULT_TOUR_LABELS } from \"../tour/tour-labels\";\nimport { DEFAULT_TOUR_CATALOGUE_LABELS } from \"../tour/tour-catalogue-labels\";\nimport { DEFAULT_COMMAND_PALETTE_LABELS } from \"../search/command-palette-labels\";\nimport { DEFAULT_GLOBAL_SEARCH_LABELS } from \"../search/global-search-labels\";\nimport { DEFAULT_SERIES_CHART_LABELS } from \"../components/series-chart-labels\";\nimport { DEFAULT_PIE_CHART_LABELS } from \"../components/pie-chart-labels\";\nimport { DEFAULT_SPARKLINE_LABELS } from \"../components/sparkline-labels\";\nimport { DEFAULT_STAT_TILE_LABELS } from \"../components/stat-tile-labels\";\nimport { DEFAULT_SIGNATURE_PAD_LABELS } from \"../components/signature-pad-labels\";\nimport { DEFAULT_PASSWORD_STRENGTH_LABELS } from \"../components/password-strength-labels\";\nimport { DEFAULT_DANGER_CONFIRM_LABELS } from \"../components/danger-confirm-labels\";\nimport { DEFAULT_SWATCH_PICKER_LABELS } from \"../components/swatch-picker-labels\";\nimport { DEFAULT_ICON_PICKER_LABELS } from \"../components/icon-picker-labels\";\nimport { DEFAULT_DIALOG_FRAME_LABELS } from \"../components/dialog-frame-labels\";\nimport { DEFAULT_FILE_PICKER_LABELS } from \"../hooks/use-file-picker-labels\";\nimport { DEFAULT_MEASURED_GRID_LABELS } from \"../components/measured-grid-labels\";\nimport { DEFAULT_CONFIRM_DIALOG_LABELS } from \"../components/confirm-dialog-labels\";\nimport { DEFAULT_FLOATING_PANEL_LABELS } from \"../components/floating-panel-labels\";\nimport { DEFAULT_FEEDBACK_ATTACHMENT_LABELS } from \"../feedback/feedback-attachment-labels\";\nimport { DEFAULT_FEEDBACK_DIALOG_LABELS } from \"../feedback/feedback-dialog-labels\";\nimport {\n DEFAULT_FEEDBACK_COMPOSER_LABELS,\n DEFAULT_FEEDBACK_THREAD_LABELS,\n} from \"../feedback/feedback-thread-labels\";\nimport {\n DEFAULT_FEEDBACK_CATEGORY_LABELS,\n DEFAULT_FEEDBACK_STATUS_LABELS,\n DEFAULT_FEEDBACK_TOAST_LABELS,\n} from \"../feedback/feedback-labels\";\nimport { DEFAULT_FEEDBACK_MENU_LABELS } from \"../feedback/feedback-menu-labels\";\nimport { DEFAULT_FEEDBACK_PUBLIC_LABELS } from \"../feedback/feedback-public-labels\";\nimport { DEFAULT_FEEDBACK_NOTIFICATION_TYPES_LABELS } from \"../notifications/feedback-notification-types-labels\";\nimport { DEFAULT_FEEDBACK_CONTEXT_LABELS } from \"../feedback/feedback-context-labels\";\nimport { DEFAULT_FEEDBACK_PAGE_LABELS } from \"../feedback/feedback-table-labels\";\nimport { DEFAULT_FEEDBACK_DETAIL_LABELS } from \"../feedback/feedback-row-detail-labels\";\nimport {\n DEFAULT_FEEDBACK_COMMENTS_LABELS,\n DEFAULT_FEEDBACK_REPLIES_LABELS,\n DEFAULT_FEEDBACK_VOTE_LABELS,\n} from \"../feedback/feedback-thread-parts-labels\";\nimport { DEFAULT_ACCOUNT_SETTINGS_LABELS } from \"../account/account-settings-labels\";\nimport { DEFAULT_COPY_BUTTON_LABELS } from \"../components/copy-button-labels\";\nimport { DEFAULT_BULK_ACTION_BAR_LABELS } from \"../components/bulk-action-bar-labels\";\nimport { DEFAULT_LIST_LABELS } from \"../components/list-labels\";\nimport { DEFAULT_BREADCRUMBS_LABELS } from \"../components/breadcrumbs-labels\";\nimport { DEFAULT_TOAST_LABELS } from \"../components/toast-labels\";\nimport { DEFAULT_FORM_ACTIONS_LABELS } from \"../components/form-actions-labels\";\nimport { DEFAULT_DESCRIPTION_LIST_LABELS } from \"../components/description-list-labels\";\nimport { DEFAULT_LINE_ITEMS_LABELS } from \"../components/line-items-labels\";\nimport { DEFAULT_PROGRESS_BAR_LABELS } from \"../components/progress-bar-labels\";\nimport { DEFAULT_SIGNED_AMOUNT_LABELS } from \"../components/signed-amount-labels\";\nimport { DEFAULT_ERROR_BOUNDARY_LABELS } from \"../components/error-boundary-labels\";\nimport { DEFAULT_AUTHED_IMAGE_LABELS } from \"../components/authed-image-labels\";\nimport { DEFAULT_IMAGE_GRID_LABELS } from \"../components/image-grid-labels\";\nimport { DEFAULT_LIGHTBOX_LABELS } from \"../components/lightbox-labels\";\nimport { DEFAULT_WRITE_LOCK_LABELS } from \"../components/write-lock-labels\";\nimport { DEFAULT_LEGAL_LABELS } from \"../components/legal-labels\";\nimport { DEFAULT_SIGN_IN_LABELS } from \"../auth/sign-in-form-labels\";\nimport { DEFAULT_REGISTER_LABELS } from \"../auth/register-form-labels\";\nimport { DEFAULT_COMPLETE_NAME_LABELS } from \"../auth/complete-name-dialog-labels\";\nimport { DEFAULT_FORGOT_PASSWORD_LABELS } from \"../auth/forgot-password-form-labels\";\nimport { DEFAULT_RESET_PASSWORD_LABELS } from \"../auth/reset-password-form-labels\";\nimport { DEFAULT_VERIFY_EMAIL_LABELS } from \"../auth/verify-email-labels\";\nimport { DEFAULT_NOT_FOUND_LABELS } from \"../auth/not-found-page-labels\";\nimport { DEFAULT_ACCEPT_INVITATION_LABELS } from \"../auth/accept-invitation-labels\";\nimport { DEFAULT_COMPANY_SWITCHER_LABELS } from \"../shell/company-switcher-labels\";\nimport { DEFAULT_EMAIL_CHANGE_LABELS } from \"../account/email-change-setting-labels\";\nimport { DEFAULT_SESSIONS_LABELS } from \"../account/sessions-setting-labels\";\nimport { DEFAULT_DELETE_ACCOUNT_LABELS } from \"../account/delete-account-setting-labels\";\nimport { DEFAULT_DATA_EXPORT_LABELS } from \"../account/data-export-setting-labels\";\nimport { DEFAULT_USER_ROSTER_LABELS } from \"../admin/user-roster-labels\";\nimport { DEFAULT_ROLE_SELECT_LABELS } from \"../admin/role-select-labels\";\nimport { DEFAULT_REVIEWER_SCOPE_LABELS } from \"../admin/reviewer-scope-editor-labels\";\nimport { DEFAULT_ADMIN_ACTION_LABELS } from \"../admin/admin-action-confirm-labels\";\nimport { DEFAULT_ADMIN_ACTION_LOG_LABELS } from \"../admin/admin-action-log-labels\";\nimport { DEFAULT_TRANSFER_OWNERSHIP_LABELS } from \"../admin/transfer-ownership-dialog-labels\";\nimport { DEFAULT_INVITATIONS_LABELS } from \"../admin/invitations-panel-labels\";\nimport { DEFAULT_SETTINGS_LABELS } from \"../settings/settings-labels\";\nimport { DEFAULT_LANDING_LABELS } from \"../landing/landing-labels\";\nimport { DEFAULT_DEMO_LABELS } from \"../demo/demo-labels\";\nimport { DEFAULT_BILLING_LABELS } from \"../billing/billing-labels\";\nimport { DEFAULT_PLAN_CHANGE_LABELS } from \"../admin/plan-change-labels\";\nimport { DEFAULT_APPEARANCE_LABELS } from \"../components/appearance-labels\";\nimport { DEFAULT_DEVICE_RESET_LABELS } from \"../settings/device-reset-setting-labels\";\nimport { DEFAULT_ROW_ACTIONS_LABELS } from \"../components/row-actions-labels\";\nimport { DEFAULT_APP_SHELL_MORE_LABELS } from \"../shell/app-shell-labels\";\nimport { DEFAULT_ACCOUNT_STATE_LABELS } from \"../components/account-chips-labels\";\nimport { DEFAULT_ADMIN_AREA_LABELS } from \"../admin/admin-area-labels\";\nimport { DEFAULT_MAIL_TEST_CARD_LABELS } from \"../admin/mail-test-card-labels\";\nimport { DEFAULT_SIGN_OUT_PENDING_DIALOG_LABELS } from \"../offline/sign-out-pending-dialog-labels\";\nimport { DEFAULT_PWA_UPDATE_PROMPT_LABELS } from \"../offline/pwa-update-prompt-labels\";\nimport { DEFAULT_SHARED_COMPUTER_LABELS } from \"../offline/shared-computer-labels\";\nimport { DEFAULT_TOP_BAR_PARTS_LABELS } from \"../shell/top-bar-parts-labels\";\nimport { DEFAULT_SHARE_CARD_LABELS } from \"../components/share-card-labels\";\nimport { DEFAULT_REAUTH_DIALOG_LABELS } from \"../components/reauth-dialog-labels\";\nimport { DEFAULT_SERVER_WAKE_LABELS } from \"../components/server-wake-labels\";\nimport { DEFAULT_TRANSLATION_REVIEW_LABELS } from \"../components/translation-review-labels\";\nimport { DEFAULT_COUNTRY_SELECT_LABELS } from \"../components/country-select-labels\";\nimport { DEFAULT_INLINE_EDIT_LABELS } from \"../components/inline-edit-field-labels\";\nimport { DEFAULT_IBAN_INPUT_LABELS } from \"../components/iban-input-labels\";\nimport { DEFAULT_PHONE_INPUT_LABELS } from \"../components/phone-input-labels\";\nimport { DEFAULT_SIGN_CHIP_LABELS } from \"../components/sign-chip-labels\";\nimport { DEFAULT_COLUMN_MAPPER_LABELS } from \"../components/column-mapper-labels\";\nimport { DEFAULT_NOTIFICATIONS_LABELS } from \"../notifications/notifications-labels\";\nimport {\n DEFAULT_APP_SHELL_LABELS,\n DEFAULT_CALCULATOR_LABELS,\n DEFAULT_COMBOBOX_LABELS,\n DEFAULT_COMMON_LABELS,\n DEFAULT_CURRENCY_LABELS,\n DEFAULT_DATE_PICKER_LABELS,\n DEFAULT_FILE_LABELS,\n DEFAULT_MULTI_SELECT_LABELS,\n DEFAULT_PICKER_SHEET_LABELS,\n DEFAULT_SWIPEABLE_ROW_LABELS,\n DEFAULT_TOP_BAR_LABELS,\n} from \"./shared-labels\";\nimport type { UiKitLabels } from \"./kit-labels\";\n\n/**\n * The whole English tree in one object: what a translation is written against, and\n * the `reference` for {@link missingKitLabels}.\n *\n * A separate module from the provider on purpose. Components import the provider's\n * hooks; this file imports the components' defaults. Kept together they would be an\n * import cycle through every component in the kit.\n *\n * Every import here is a module of WORDS \u2014 a `*-labels.ts` beside its component, which\n * the component re-exports (`shared-labels` for the namespaces the provider types\n * itself, which `kit-labels` re-exports) \u2014 never a component. The\n * English catalogue (`locales/en.ts`) is built on this object, so a component imported\n * here rides along with English: in 0.33 that was 79 of them, and an app fetching `en`\n * lazily fetched ~40 chunks of component code with it, where every other language is one\n * (0.34, KS U8). `__tests__/english-catalogue-graph.test.ts` holds the line, and the\n * build makes `dist/i18n/locales/en.js` one file (scripts/flatten-en.mjs).\n */\nexport const DEFAULT_UI_KIT_LABELS: UiKitLabels = {\n common: DEFAULT_COMMON_LABELS,\n dataTable: DEFAULT_DATA_TABLE_LABELS,\n miniCalendar: DEFAULT_MINI_CALENDAR_LABELS,\n calendarHeatmap: DEFAULT_CALENDAR_HEATMAP_LABELS,\n datePicker: DEFAULT_DATE_PICKER_LABELS,\n monthPicker: DEFAULT_MONTH_PICKER_LABELS,\n popover: DEFAULT_POPOVER_LABELS,\n combobox: DEFAULT_COMBOBOX_LABELS,\n multiSelect: DEFAULT_MULTI_SELECT_LABELS,\n calculator: DEFAULT_CALCULATOR_LABELS,\n currency: DEFAULT_CURRENCY_LABELS,\n chipInput: DEFAULT_CHIP_INPUT_LABELS,\n fieldSync: DEFAULT_FIELD_SYNC_LABELS,\n passwordReveal: DEFAULT_PASSWORD_REVEAL_LABELS,\n tabs: DEFAULT_TABS_LABELS,\n appShell: DEFAULT_APP_SHELL_LABELS,\n pageContents: DEFAULT_PAGE_CONTENTS_LABELS,\n topBar: DEFAULT_TOP_BAR_LABELS,\n pickerSheet: DEFAULT_PICKER_SHEET_LABELS,\n swipeableRow: DEFAULT_SWIPEABLE_ROW_LABELS,\n file: DEFAULT_FILE_LABELS,\n wizard: DEFAULT_WIZARD_LABELS,\n tour: DEFAULT_TOUR_LABELS,\n tourCatalogue: DEFAULT_TOUR_CATALOGUE_LABELS,\n commandPalette: DEFAULT_COMMAND_PALETTE_LABELS,\n globalSearch: DEFAULT_GLOBAL_SEARCH_LABELS,\n seriesChart: DEFAULT_SERIES_CHART_LABELS,\n pieChart: DEFAULT_PIE_CHART_LABELS,\n sparkline: DEFAULT_SPARKLINE_LABELS,\n statTile: DEFAULT_STAT_TILE_LABELS,\n signaturePad: DEFAULT_SIGNATURE_PAD_LABELS,\n passwordStrength: DEFAULT_PASSWORD_STRENGTH_LABELS,\n dangerConfirm: DEFAULT_DANGER_CONFIRM_LABELS,\n swatchPicker: DEFAULT_SWATCH_PICKER_LABELS,\n iconPicker: DEFAULT_ICON_PICKER_LABELS,\n dialogFrame: DEFAULT_DIALOG_FRAME_LABELS,\n filePicker: DEFAULT_FILE_PICKER_LABELS,\n measuredGrid: DEFAULT_MEASURED_GRID_LABELS,\n feedbackAttachment: DEFAULT_FEEDBACK_ATTACHMENT_LABELS,\n feedbackDialog: DEFAULT_FEEDBACK_DIALOG_LABELS,\n feedbackThread: DEFAULT_FEEDBACK_THREAD_LABELS,\n feedbackComposer: DEFAULT_FEEDBACK_COMPOSER_LABELS,\n feedbackStatus: DEFAULT_FEEDBACK_STATUS_LABELS,\n feedbackCategory: DEFAULT_FEEDBACK_CATEGORY_LABELS,\n feedbackToast: DEFAULT_FEEDBACK_TOAST_LABELS,\n feedbackMenu: DEFAULT_FEEDBACK_MENU_LABELS,\n feedbackPublic: DEFAULT_FEEDBACK_PUBLIC_LABELS,\n feedbackNotificationTypes: DEFAULT_FEEDBACK_NOTIFICATION_TYPES_LABELS,\n feedbackContext: DEFAULT_FEEDBACK_CONTEXT_LABELS,\n feedbackPage: DEFAULT_FEEDBACK_PAGE_LABELS,\n feedbackDetail: DEFAULT_FEEDBACK_DETAIL_LABELS,\n feedbackVote: DEFAULT_FEEDBACK_VOTE_LABELS,\n feedbackComments: DEFAULT_FEEDBACK_COMMENTS_LABELS,\n feedbackReplies: DEFAULT_FEEDBACK_REPLIES_LABELS,\n accountSettings: DEFAULT_ACCOUNT_SETTINGS_LABELS,\n confirmDialog: DEFAULT_CONFIRM_DIALOG_LABELS,\n floatingPanel: DEFAULT_FLOATING_PANEL_LABELS,\n copyButton: DEFAULT_COPY_BUTTON_LABELS,\n bulkActionBar: DEFAULT_BULK_ACTION_BAR_LABELS,\n list: DEFAULT_LIST_LABELS,\n breadcrumbs: DEFAULT_BREADCRUMBS_LABELS,\n toast: DEFAULT_TOAST_LABELS,\n form: DEFAULT_FORM_ACTIONS_LABELS,\n descriptionList: DEFAULT_DESCRIPTION_LIST_LABELS,\n lineItems: DEFAULT_LINE_ITEMS_LABELS,\n progressBar: DEFAULT_PROGRESS_BAR_LABELS,\n signedAmount: DEFAULT_SIGNED_AMOUNT_LABELS,\n errorBoundary: DEFAULT_ERROR_BOUNDARY_LABELS,\n authedImage: DEFAULT_AUTHED_IMAGE_LABELS,\n imageGrid: DEFAULT_IMAGE_GRID_LABELS,\n lightbox: DEFAULT_LIGHTBOX_LABELS,\n writeLock: DEFAULT_WRITE_LOCK_LABELS,\n accountState: DEFAULT_ACCOUNT_STATE_LABELS,\n shareCard: DEFAULT_SHARE_CARD_LABELS,\n reauthDialog: DEFAULT_REAUTH_DIALOG_LABELS,\n serverWake: DEFAULT_SERVER_WAKE_LABELS,\n translationReview: DEFAULT_TRANSLATION_REVIEW_LABELS,\n legal: DEFAULT_LEGAL_LABELS,\n signIn: DEFAULT_SIGN_IN_LABELS,\n register: DEFAULT_REGISTER_LABELS,\n completeName: DEFAULT_COMPLETE_NAME_LABELS,\n forgotPassword: DEFAULT_FORGOT_PASSWORD_LABELS,\n resetPassword: DEFAULT_RESET_PASSWORD_LABELS,\n verifyEmail: DEFAULT_VERIFY_EMAIL_LABELS,\n notFound: DEFAULT_NOT_FOUND_LABELS,\n acceptInvitation: DEFAULT_ACCEPT_INVITATION_LABELS,\n companySwitcher: DEFAULT_COMPANY_SWITCHER_LABELS,\n emailChange: DEFAULT_EMAIL_CHANGE_LABELS,\n sessions: DEFAULT_SESSIONS_LABELS,\n deleteAccount: DEFAULT_DELETE_ACCOUNT_LABELS,\n dataExport: DEFAULT_DATA_EXPORT_LABELS,\n userRoster: DEFAULT_USER_ROSTER_LABELS,\n roleSelect: DEFAULT_ROLE_SELECT_LABELS,\n reviewerScope: DEFAULT_REVIEWER_SCOPE_LABELS,\n adminAction: DEFAULT_ADMIN_ACTION_LABELS,\n adminActionLog: DEFAULT_ADMIN_ACTION_LOG_LABELS,\n transferOwnership: DEFAULT_TRANSFER_OWNERSHIP_LABELS,\n invitations: DEFAULT_INVITATIONS_LABELS,\n settings: DEFAULT_SETTINGS_LABELS,\n landing: DEFAULT_LANDING_LABELS,\n demo: DEFAULT_DEMO_LABELS,\n billing: DEFAULT_BILLING_LABELS,\n planChange: DEFAULT_PLAN_CHANGE_LABELS,\n appearance: DEFAULT_APPEARANCE_LABELS,\n deviceReset: DEFAULT_DEVICE_RESET_LABELS,\n rowActions: DEFAULT_ROW_ACTIONS_LABELS,\n appShellMore: DEFAULT_APP_SHELL_MORE_LABELS,\n characterCount: DEFAULT_CHARACTER_COUNT_LABELS,\n countrySelect: DEFAULT_COUNTRY_SELECT_LABELS,\n inlineEdit: DEFAULT_INLINE_EDIT_LABELS,\n ibanInput: DEFAULT_IBAN_INPUT_LABELS,\n phoneInput: DEFAULT_PHONE_INPUT_LABELS,\n signChip: DEFAULT_SIGN_CHIP_LABELS,\n columnMapper: DEFAULT_COLUMN_MAPPER_LABELS,\n notifications: DEFAULT_NOTIFICATIONS_LABELS,\n adminArea: DEFAULT_ADMIN_AREA_LABELS,\n topBarParts: DEFAULT_TOP_BAR_PARTS_LABELS,\n mailTestCard: DEFAULT_MAIL_TEST_CARD_LABELS,\n signOutPending: DEFAULT_SIGN_OUT_PENDING_DIALOG_LABELS,\n pwaUpdate: DEFAULT_PWA_UPDATE_PROMPT_LABELS,\n sharedComputer: DEFAULT_SHARED_COMPUTER_LABELS,\n};\n", "import { DEFAULT_UI_KIT_LABELS } from \"../defaults\";\nimport { formatFileSize } from \"../kit-labels\";\nimport type { UiKitLabels } from \"../kit-labels\";\n\n/**\n * The kit's English words with every count and file size formatted for\n * `numberLocale` \u2014 `uiKitLabelsEn(\"en-CH\")` reads \"12\u2019345 rows\", where the defaults\n * print \"12345\". For `<UiKitProvider labels={uiKitLabelsEn(\"en-CH\")}>`.\n *\n * A factory and not a constant on purpose: {@link DEFAULT_UI_KIT_LABELS} prints counts\n * raw and has since 0.1, so an app that passes nothing must keep seeing exactly that.\n * Formatting is something an app asks for, by calling this.\n *\n * Derived rather than copied: every word is the default's own, spread in, and only the\n * labels that print a number are restated \u2014 with the same wording and the same\n * singular/plural split \u2014 so a key added to the defaults is here the moment it lands.\n * A new label that prints a count must be restated by hand; the catalogue parity test\n * in `__tests__/locales.test.ts` fails until it is (round 0.34 DOC-6: eleven were not).\n * Row and line numbers (`lineItems.row`, `measuredGrid.cell`) are positions, not\n * counts, and stay as the defaults print them, as in the other catalogues.\n */\nexport function uiKitLabelsEn(numberLocale = \"en-US\"): UiKitLabels {\n const num = new Intl.NumberFormat(numberLocale);\n const n = (value: number) => num.format(value);\n const d = DEFAULT_UI_KIT_LABELS;\n // As `inDays` in src/billing/billing-labels.ts: 0 (or less) is today, 1 tomorrow.\n const inDays = (days: number) =>\n days <= 0 ? \"today\" : days === 1 ? \"tomorrow\" : `in ${n(days)} days`;\n\n return {\n ...d,\n feedbackAttachment: {\n ...d.feedbackAttachment,\n attachmentLimit: (max) =>\n max === 1\n ? \"Up to 1 attachment \u2014 remove it to add another.\"\n : `Up to ${n(max)} attachments \u2014 remove one to add another.`,\n },\n feedbackToast: {\n ...d.feedbackToast,\n attachmentTooMany: (count) =>\n count === 1\n ? \"Only 1 attachment fits \u2014 the rest were left out.\"\n : `Only ${n(count)} attachments fit \u2014 the rest were left out.`,\n },\n feedbackPage: {\n ...d.feedbackPage,\n // `userFallback`'s number is an id, not a count: it stays as the default prints it.\n reworkChip: (count) => (count === 1 ? \"Rework\" : `Rework \u00D7${n(count)}`),\n },\n // 0.38.0: the public list's two counts.\n feedbackPublic: {\n ...d.feedbackPublic,\n total: (count) => (count === 1 ? \"1 report\" : `${n(count)} reports`),\n comments: (count) => (count === 1 ? \"1 comment\" : `${n(count)} comments`),\n votes: (count) => (count === 1 ? \"1 vote\" : `${n(count)} votes`),\n page: (page) => `Page ${n(page)}`,\n },\n measuredGrid: {\n ...d.measuredGrid,\n points: (count) => (count === 1 ? \"1 point\" : `${n(count)} points`),\n problems: (count) =>\n count === 1\n ? \"1 cell is not a number\"\n : `${n(count)} cells are not numbers`,\n },\n dataTable: {\n ...d.dataTable,\n filterResults: (shown, total) => `${n(shown)} of ${n(total)} rows`,\n pageChanged: (page, totalPages) => `Page ${n(page)} of ${n(totalPages)}`,\n pageRange: (from, to, total) => `${n(from)}\u2013${n(to)} / ${n(total)}`,\n rowCount: (total) => n(total),\n columnsCount: (visible, total) => `Columns (${n(visible)}/${n(total)})`,\n },\n calendarHeatmap: {\n ...d.calendarHeatmap,\n truncated: (count) =>\n `Showing the most recent days; ${n(count)} earlier ${count === 1 ? \"day is\" : \"days are\"} not shown.`,\n },\n combobox: {\n ...d.combobox,\n selectedCount: (count) => `${n(count)} selected`,\n resultCount: (count) =>\n count === 1 ? \"1 result\" : `${n(count)} results`,\n minChars: (count) =>\n count === 1\n ? \"Type at least 1 character\"\n : `Type at least ${n(count)} characters`,\n },\n multiSelect: {\n ...d.multiSelect,\n selectedCount: (count) => n(count),\n },\n chipInput: {\n ...d.chipInput,\n atLimit: (max) => `Limit of ${n(max)} reached`,\n },\n iconPicker: {\n ...d.iconPicker,\n resultCount: (count) => (count === 1 ? \"1 icon\" : `${n(count)} icons`),\n },\n bulkActionBar: {\n ...d.bulkActionBar,\n selected: (count) => `${n(count)} selected`,\n },\n file: {\n // The kit's own `Intl` unit formatting, pinned to this locale (\"3.4 MB\").\n size: (bytes) => formatFileSize(bytes, numberLocale),\n },\n filePicker: {\n ...d.filePicker,\n rejectedCount: (name, maxFiles) =>\n `\u201C${name}\u201D was not added: at most ${n(maxFiles)} ${maxFiles === 1 ? \"file\" : \"files\"}`,\n rejectedMany: (count) => `${n(count)} files were not added`,\n rejectedPick: (count) =>\n count === 1\n ? \"The file was not added\"\n : `None of the ${n(count)} files were added`,\n selected: (count, firstName) =>\n count === 1 ? `\u201C${firstName}\u201D selected` : `${n(count)} files selected`,\n },\n wizard: {\n ...d.wizard,\n step: (current, total) => `Step ${n(current)} of ${n(total)}`,\n },\n tour: {\n ...d.tour,\n step: (current, total) => `${n(current)} / ${n(total)}`,\n },\n passwordStrength: {\n ...d.passwordStrength,\n ruleLength: (minLength) => `At least ${n(minLength)} characters`,\n tooLong: (maxBytes) =>\n `At most ${n(maxBytes)} characters (accents and emoji count for more than one).`,\n },\n floatingPanel: {\n ...d.floatingPanel,\n badge: (count) => `${n(count)} new`,\n },\n imageGrid: {\n ...d.imageGrid,\n item: (index, count) => `Image ${n(index)} of ${n(count)}`,\n },\n lightbox: {\n ...d.lightbox,\n counter: (index, count) => `${n(index)} / ${n(count)}`,\n position: (index, count) => `Image ${n(index)} of ${n(count)}`,\n },\n translationReview: {\n ...d.translationReview,\n filterCount: (label, count) => `${label} \u00B7 ${n(count)}`,\n placeholdersOnly: (count) => `Only placeholder problems (${n(count)})`,\n progress: (approved, total) => `${n(approved)} of ${n(total)} approved`,\n localeProgress: (approved, total) => `${n(approved)}/${n(total)}`,\n exportCorrections: (count) => `Export corrections (${n(count)})`,\n approvedToast: (count) => (count === 1 ? \"String approved\" : `${n(count)} strings approved`),\n clearedToast: (count) => (count === 1 ? \"String marked unreviewed\" : `${n(count)} strings marked unreviewed`),\n groupCount: (unreviewed, total) => `${n(unreviewed)} unreviewed / ${n(total)}`,\n approveGroup: (count) => `Approve unreviewed (${n(count)})`,\n confirmGroup: (count, group) =>\n count === 1\n ? `Approve the unreviewed string in ${group}?`\n : `Approve all ${n(count)} unreviewed strings in ${group}, including those not on screen?`,\n },\n characterCount: {\n ...d.characterCount,\n count: (used, max) => `${n(used)} of ${n(max)} characters`,\n remaining: (left) =>\n left === 1 ? \"1 character left\" : `${n(left)} characters left`,\n },\n ibanInput: {\n ...d.ibanInput,\n length: (actual, expected) =>\n `An IBAN from this country has ${n(expected)} characters \u2014 this one has ${n(actual)}.`,\n },\n columnMapper: {\n ...d.columnMapper,\n summary: (columns, rows) =>\n `${n(columns)} ${columns === 1 ? \"column\" : \"columns\"}, ${n(rows)} ${rows === 1 ? \"row\" : \"rows\"}`,\n unreadCount: (count) =>\n count === 1\n ? \"1 line could not be read\"\n : `${n(count)} lines could not be read`,\n unreadMore: (count) => `\u2026and ${n(count)} more`,\n previewOf: (shown, total) =>\n shown === 1\n ? `The first of ${n(total)} rows`\n : `The first ${n(shown)} of ${n(total)} rows`,\n },\n signIn: {\n ...d.signIn,\n recoveryCodeHint: (length) => `${n(length)} letters and digits. Dashes and spaces don\u2019t matter.`,\n },\n verifyEmail: {\n ...d.verifyEmail,\n resendIn: (seconds) => `Send again in ${n(seconds)} s`,\n },\n deleteAccount: {\n ...d.deleteAccount,\n afterDays: (days) =>\n days === 1\n ? \"Your account is deactivated at once and erased for good 1 day later.\"\n : `Your account is deactivated at once and erased for good ${n(days)} days later.`,\n handOver: (count) =>\n count === 1\n ? \"1 item others can see will pass to an administrator.\"\n : `${n(count)} items others can see will pass to an administrator.`,\n },\n notifications: {\n ...d.notifications,\n testSent: (count) => (count === 1 ? \"Test sent to 1 device\" : `Test sent to ${n(count)} devices`),\n failures: (count) =>\n count === 1 ? \"1 failed delivery in a row\" : `${n(count)} failed deliveries in a row`,\n bellUnread: (count) => `${n(count)} unread`,\n },\n settings: {\n ...d.settings,\n matchCount: (count) => (count === 1 ? \"1 match\" : `${n(count)} matches`),\n },\n // 0.42.0: the admin area's two counts (docs/admin-harmonization.md \u00A73.1).\n adminArea: {\n ...d.adminArea,\n waiting: (count) => `${n(count)} waiting`,\n waitingLabel: (label, count) => `${label}, ${n(count)} waiting`,\n tiles: { ...d.adminArea.tiles, usersNew: (count) => `${n(count)} new in 7 days` },\n },\n // 0.43.0: the tours page's counts (docs/tours-harmonization.md \u00A73).\n tourCatalogue: {\n ...d.tourCatalogue,\n groupAll: (count) => `All topics (${n(count)})`,\n groupOption: (group, count) => `${group} (${n(count)})`,\n stateAll: (count) => `All (${n(count)})`,\n stateTodo: (count) => `Not taken (${n(count)})`,\n stateDone: (count) => `Completed (${n(count)})`,\n showing: (shown, total) => `Showing ${n(shown)} of ${n(total)} tours`,\n points: (count) => `+${n(count)} pts`,\n steps: (count) => (count === 1 ? \"1 step\" : `${n(count)} steps`),\n duration: (minutes) => `About ${n(minutes)} min`,\n },\n // 0.42.0: the top bar's three counts (docs/top-bar-harmonization.md \u00A73.1).\n topBarParts: {\n ...d.topBarParts,\n sync: {\n ...d.topBarParts.sync,\n blocked: (count) =>\n count === 1\n ? \"1 change cannot be sent from this device\"\n : `${n(count)} changes cannot be sent from this device`,\n pending: (count) => (count === 1 ? \"1 change waiting to sync\" : `${n(count)} changes waiting to sync`),\n waitingShort: (count) => `${n(count)} waiting`,\n },\n },\n demo: {\n ...d.demo,\n rateLimited: (minutes) =>\n minutes\n ? `Too many demos from this network. Try again in ${n(minutes)} min.`\n : \"Too many demos from this network. Try again later.\",\n hoursLeft: (hours, minutes) => `Demo \u00B7 ${n(hours)} h ${n(minutes)} min left`,\n minutesLeft: (minutes) => `Demo \u00B7 ${n(minutes)} min left`,\n },\n billing: {\n ...d.billing,\n trialEnding: (days) =>\n `Your trial ends ${inDays(days)}. After that you can still view everything, but changes need a plan.`,\n grantEnding: (days) =>\n `Your free access ends ${inDays(days)}. After that you can still view everything, but changes need a plan.`,\n waitingChanges: (count) =>\n count === 1 ? \"1 change waiting for a plan\" : `${n(count)} changes waiting for a plan`,\n },\n signOutPending: {\n ...d.signOutPending,\n lost: (count) =>\n count === 1\n ? d.signOutPending.lost(1)\n : `${n(count)} changes are still waiting to sync. Logging out clears this device\u2019s copy, and it is the only copy.`,\n kept: (count) =>\n count === 1\n ? d.signOutPending.kept(1)\n : `${n(count)} changes are still waiting to sync. They stay on this device for you and sync the next time you log in here.`,\n },\n };\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["formatFileSize", "inDays"]
|
|
7
7
|
}
|