@eifi1/ui-kit 0.54.0 → 0.55.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 +90 -76
- package/dist/admin/plan-change.js +2 -2
- package/dist/admin/plan-change.js.map +1 -1
- package/dist/admin/user-roster.d.ts +6 -0
- package/dist/admin/user-roster.js +4 -0
- package/dist/admin/user-roster.js.map +1 -1
- package/dist/billing/billing-labels.d.ts +26 -0
- package/dist/billing/billing-labels.js +9 -0
- package/dist/billing/billing-labels.js.map +1 -1
- package/dist/billing/subscription-standing.d.ts +61 -0
- package/dist/billing/subscription-standing.js +51 -0
- package/dist/billing/subscription-standing.js.map +1 -0
- package/dist/billing/usage-meter.d.ts +52 -0
- package/dist/billing/usage-meter.js +52 -0
- package/dist/billing/usage-meter.js.map +1 -0
- package/dist/chart.d.ts +1 -0
- package/dist/chart.js +4 -0
- package/dist/chart.js.map +1 -1
- package/dist/components/alert-banner.js +2 -3
- package/dist/components/alert-banner.js.map +1 -1
- package/dist/components/amount-input.js +3 -15
- package/dist/components/amount-input.js.map +1 -1
- package/dist/components/autocomplete.js +2 -2
- package/dist/components/autocomplete.js.map +1 -1
- package/dist/components/bulk-action-bar.js +2 -1
- package/dist/components/bulk-action-bar.js.map +1 -1
- package/dist/components/button.d.ts +35 -1
- package/dist/components/button.js +5 -9
- package/dist/components/button.js.map +1 -1
- package/dist/components/calendar-heatmap.js +2 -2
- package/dist/components/calendar-heatmap.js.map +1 -1
- package/dist/components/camera-button.d.ts +89 -0
- package/dist/components/camera-button.js +122 -0
- package/dist/components/camera-button.js.map +1 -0
- package/dist/components/camera-capture.d.ts +66 -0
- package/dist/components/camera-capture.js +190 -0
- package/dist/components/camera-capture.js.map +1 -0
- package/dist/components/camera-labels.d.ts +20 -0
- package/dist/components/camera-labels.js +15 -0
- package/dist/components/camera-labels.js.map +1 -0
- package/dist/components/chart-edge.d.ts +9 -0
- package/dist/components/chart-edge.js +14 -3
- package/dist/components/chart-edge.js.map +1 -1
- package/dist/components/chart-zoom-core.js +34 -29
- package/dist/components/chart-zoom-core.js.map +1 -1
- package/dist/components/checkbox-group.js +1 -1
- package/dist/components/checkbox-group.js.map +1 -1
- package/dist/components/combobox-core.js +3 -2
- package/dist/components/combobox-core.js.map +1 -1
- package/dist/components/combobox.js +2 -2
- package/dist/components/combobox.js.map +1 -1
- package/dist/components/consent-again-notice-labels.d.ts +25 -0
- package/dist/components/consent-again-notice-labels.js +15 -0
- package/dist/components/consent-again-notice-labels.js.map +1 -0
- package/dist/components/consent-again-notice.d.ts +85 -0
- package/dist/components/consent-again-notice.js +94 -0
- package/dist/components/consent-again-notice.js.map +1 -0
- package/dist/components/country-select.js +2 -7
- package/dist/components/country-select.js.map +1 -1
- package/dist/components/currency-select.js +2 -2
- package/dist/components/currency-select.js.map +1 -1
- package/dist/components/danger-confirm.js +2 -2
- package/dist/components/danger-confirm.js.map +1 -1
- package/dist/components/data-table-column-settings.js +2 -2
- package/dist/components/data-table-column-settings.js.map +1 -1
- package/dist/components/data-table-fit.js.map +1 -1
- package/dist/components/data-table-virtual.js +13 -3
- package/dist/components/data-table-virtual.js.map +1 -1
- package/dist/components/date-field.js +2 -2
- package/dist/components/date-field.js.map +1 -1
- package/dist/components/date-picker.js +2 -2
- package/dist/components/date-picker.js.map +1 -1
- package/dist/components/date-range-picker.js +2 -6
- package/dist/components/date-range-picker.js.map +1 -1
- package/dist/components/dialog-frame.d.ts +3 -1
- package/dist/components/dialog-frame.js.map +1 -1
- package/dist/components/dropdown.js +7 -3
- package/dist/components/dropdown.js.map +1 -1
- package/dist/components/entity-combobox.js +2 -2
- package/dist/components/entity-combobox.js.map +1 -1
- package/dist/components/field-parts.d.ts +108 -6
- package/dist/components/field-parts.js +59 -6
- package/dist/components/field-parts.js.map +1 -1
- package/dist/components/field-suggestion-labels.d.ts +2 -0
- package/dist/components/field-suggestion-labels.js +10 -0
- package/dist/components/field-suggestion-labels.js.map +1 -0
- package/dist/components/field.js +1 -1
- package/dist/components/field.js.map +1 -1
- package/dist/components/file-button.d.ts +1 -1
- package/dist/components/file-button.js.map +1 -1
- package/dist/components/floating-panel.d.ts +7 -6
- package/dist/components/floating-panel.js +3 -17
- package/dist/components/floating-panel.js.map +1 -1
- package/dist/components/form-actions.d.ts +3 -2
- package/dist/components/form-actions.js.map +1 -1
- package/dist/components/hover-menu.js +3 -2
- package/dist/components/hover-menu.js.map +1 -1
- package/dist/components/icon-button.d.ts +23 -5
- package/dist/components/icon-button.js +6 -8
- package/dist/components/icon-button.js.map +1 -1
- package/dist/components/inline-confirm.js +2 -1
- package/dist/components/inline-confirm.js.map +1 -1
- package/dist/components/inline-entity-combobox.js +2 -2
- package/dist/components/inline-entity-combobox.js.map +1 -1
- package/dist/components/input.js +2 -2
- package/dist/components/input.js.map +1 -1
- package/dist/components/jump-calendar.js +3 -3
- package/dist/components/jump-calendar.js.map +1 -1
- package/dist/components/legal.d.ts +13 -1
- package/dist/components/legal.js +12 -0
- package/dist/components/legal.js.map +1 -1
- package/dist/components/legended-series-chart.d.ts +80 -0
- package/dist/components/legended-series-chart.js +70 -0
- package/dist/components/legended-series-chart.js.map +1 -0
- package/dist/components/lightbox.js +2 -1
- package/dist/components/lightbox.js.map +1 -1
- package/dist/components/mini-calendar.js +13 -5
- package/dist/components/mini-calendar.js.map +1 -1
- package/dist/components/modal.d.ts +23 -2
- package/dist/components/modal.js +24 -6
- package/dist/components/modal.js.map +1 -1
- package/dist/components/month-picker.d.ts +1 -1
- package/dist/components/month-picker.js +6 -6
- package/dist/components/month-picker.js.map +1 -1
- package/dist/components/multi-entity-combobox.js +2 -2
- package/dist/components/multi-entity-combobox.js.map +1 -1
- package/dist/components/multi-select.js +2 -6
- package/dist/components/multi-select.js.map +1 -1
- package/dist/components/number-input.js +2 -2
- package/dist/components/number-input.js.map +1 -1
- package/dist/components/page-header-layout.d.ts +18 -0
- package/dist/components/page-header-layout.js +23 -0
- package/dist/components/page-header-layout.js.map +1 -0
- package/dist/components/page-header-skeleton.d.ts +41 -0
- package/dist/components/page-header-skeleton.js +52 -0
- package/dist/components/page-header-skeleton.js.map +1 -0
- package/dist/components/page-header.js +4 -17
- package/dist/components/page-header.js.map +1 -1
- package/dist/components/popover.js +7 -2
- package/dist/components/popover.js.map +1 -1
- package/dist/components/release-notes-labels.d.ts +16 -0
- package/dist/components/release-notes-labels.js +18 -0
- package/dist/components/release-notes-labels.js.map +1 -0
- package/dist/components/release-notes.d.ts +65 -0
- package/dist/components/release-notes.js +65 -0
- package/dist/components/release-notes.js.map +1 -0
- package/dist/components/select.js +2 -2
- package/dist/components/select.js.map +1 -1
- package/dist/components/series-chart-labels.d.ts +9 -0
- package/dist/components/series-chart-labels.js +3 -1
- package/dist/components/series-chart-labels.js.map +1 -1
- package/dist/components/series-chart.d.ts +5 -0
- package/dist/components/series-chart.js +89 -36
- package/dist/components/series-chart.js.map +1 -1
- package/dist/components/toggle-group.js +3 -2
- package/dist/components/toggle-group.js.map +1 -1
- package/dist/components/treemap-layout.js.map +1 -1
- package/dist/components/treemap.d.ts +17 -15
- package/dist/components/treemap.js +167 -85
- package/dist/components/treemap.js.map +1 -1
- package/dist/eslint/index.js +1 -1
- package/dist/eslint/role-utilities.d.ts +2 -2
- package/dist/eslint/role-utilities.js.map +1 -1
- package/dist/feedback/feedback-inbox-page.d.ts +260 -0
- package/dist/feedback/feedback-inbox-page.js +207 -0
- package/dist/feedback/feedback-inbox-page.js.map +1 -0
- package/dist/feedback/feedback-vocabulary.js +2 -2
- package/dist/feedback/feedback-vocabulary.js.map +1 -1
- package/dist/feedback.d.ts +1 -0
- package/dist/feedback.js +6 -0
- package/dist/feedback.js.map +1 -1
- package/dist/hooks/use-debounce.d.ts +32 -5
- package/dist/hooks/use-debounce.js +6 -5
- package/dist/hooks/use-debounce.js.map +1 -1
- package/dist/hooks/use-file-picker.d.ts +3 -1
- package/dist/hooks/use-file-picker.js.map +1 -1
- package/dist/hooks/use-focus-trap.d.ts +19 -3
- package/dist/hooks/use-focus-trap.js +15 -5
- package/dist/hooks/use-focus-trap.js.map +1 -1
- package/dist/hooks/use-has-camera.d.ts +36 -0
- package/dist/hooks/use-has-camera.js +53 -0
- package/dist/hooks/use-has-camera.js.map +1 -0
- package/dist/hooks/use-hotkey.js +1 -10
- package/dist/hooks/use-hotkey.js.map +1 -1
- package/dist/hooks/use-overlay-history.d.ts +6 -1
- package/dist/hooks/use-overlay-history.js +10 -2
- package/dist/hooks/use-overlay-history.js.map +1 -1
- package/dist/i18n/defaults.js +11 -1
- package/dist/i18n/defaults.js.map +1 -1
- package/dist/i18n/german.js +75 -3
- package/dist/i18n/german.js.map +1 -1
- package/dist/i18n/kit-labels.d.ts +20 -0
- package/dist/i18n/kit-labels.js.map +1 -1
- package/dist/i18n/locales/en.js +92 -4
- package/dist/i18n/locales/en.js.map +3 -3
- package/dist/i18n/locales/es.js +71 -3
- package/dist/i18n/locales/es.js.map +1 -1
- package/dist/i18n/locales/fr.js +72 -2
- package/dist/i18n/locales/fr.js.map +1 -1
- package/dist/i18n/locales/hu.js +74 -3
- package/dist/i18n/locales/hu.js.map +1 -1
- package/dist/i18n/locales/it.js +74 -3
- package/dist/i18n/locales/it.js.map +1 -1
- package/dist/i18n/locales/zh.js +71 -3
- package/dist/i18n/locales/zh.js.map +1 -1
- package/dist/i18n/review.js +22 -1
- package/dist/i18n/review.js.map +1 -1
- package/dist/index.d.ts +24 -5
- package/dist/index.js +35 -1
- package/dist/index.js.map +1 -1
- package/dist/landing/landing-labels.d.ts +8 -0
- package/dist/landing/landing-labels.js +2 -1
- package/dist/landing/landing-labels.js.map +1 -1
- package/dist/lib/changelog.d.ts +130 -0
- package/dist/lib/changelog.js +137 -0
- package/dist/lib/changelog.js.map +1 -0
- package/dist/lib/clipboard-minus.js +2 -2
- package/dist/lib/clipboard-minus.js.map +1 -1
- package/dist/lib/dates.d.ts +29 -3
- package/dist/lib/dates.js +41 -12
- package/dist/lib/dates.js.map +1 -1
- package/dist/lib/editable-content.d.ts +33 -0
- package/dist/lib/editable-content.js +15 -0
- package/dist/lib/editable-content.js.map +1 -0
- package/dist/lib/focus-left.d.ts +47 -1
- package/dist/lib/focus-left.js +11 -2
- package/dist/lib/focus-left.js.map +1 -1
- package/dist/lib/server-wake.d.ts +49 -9
- package/dist/lib/server-wake.js +25 -14
- package/dist/lib/server-wake.js.map +1 -1
- package/dist/lib/session-refresh.d.ts +53 -0
- package/dist/lib/session-refresh.js +27 -1
- package/dist/lib/session-refresh.js.map +1 -1
- package/dist/rhf/fields.js +3 -3
- package/dist/rhf/fields.js.map +1 -1
- package/dist/shell/app-shell.d.ts +25 -1
- package/dist/shell/app-shell.js +3 -1
- package/dist/shell/app-shell.js.map +1 -1
- package/dist/shell/dev-menu.d.ts +3 -0
- package/dist/shell/dev-menu.js +4 -2
- package/dist/shell/dev-menu.js.map +1 -1
- package/dist/shell/held-changes-banner-labels.d.ts +23 -0
- package/dist/shell/held-changes-banner-labels.js +14 -0
- package/dist/shell/held-changes-banner-labels.js.map +1 -0
- package/dist/shell/held-changes-banner.d.ts +75 -0
- package/dist/shell/held-changes-banner.js +106 -0
- package/dist/shell/held-changes-banner.js.map +1 -0
- package/dist/shell/sync-status-indicator.d.ts +27 -12
- package/dist/shell/sync-status-indicator.js +13 -4
- package/dist/shell/sync-status-indicator.js.map +1 -1
- package/dist/shell/top-bar-parts-labels.d.ts +5 -0
- package/dist/shell/top-bar-parts-labels.js +3 -1
- package/dist/shell/top-bar-parts-labels.js.map +1 -1
- package/dist/shell.d.ts +2 -0
- package/dist/shell.js +3 -0
- package/dist/shell.js.map +1 -1
- package/dist/sync/engine.d.ts +11 -2
- package/dist/sync/engine.js +13 -5
- package/dist/sync/engine.js.map +1 -1
- package/dist/sync/hooks.d.ts +3 -2
- package/dist/sync/hooks.js +4 -2
- package/dist/sync/hooks.js.map +1 -1
- package/dist/testing/css-variables.generated.d.ts +2 -2
- package/dist/testing/css-variables.generated.js +1 -1
- package/dist/testing/css-variables.generated.js.map +1 -1
- package/dist/theme/chart-palette.d.ts +18 -0
- package/dist/theme/chart-palette.js +17 -1
- package/dist/theme/chart-palette.js.map +1 -1
- package/dist/theme/contrast-tokens.d.ts +3 -3
- package/dist/theme/contrast-tokens.js.map +1 -1
- package/dist/theme/contrast.d.ts +4 -4
- package/dist/theme/contrast.js.map +1 -1
- package/dist/tour/tour-overlay.js +2 -1
- package/dist/tour/tour-overlay.js.map +1 -1
- package/package.json +5 -9
- package/tokens.css +19 -54
- package/src/account/account-parts.ts +0 -47
- package/src/account/account-settings-labels.ts +0 -240
- package/src/account/account-settings.tsx +0 -698
- package/src/account/data-export-setting-labels.ts +0 -20
- package/src/account/data-export-setting.tsx +0 -200
- package/src/account/delete-account-setting-labels.ts +0 -33
- package/src/account/delete-account-setting.tsx +0 -342
- package/src/account/email-change-setting-labels.ts +0 -31
- package/src/account/email-change-setting.tsx +0 -443
- package/src/account/passkeys-setting.tsx +0 -445
- package/src/account/sessions-setting-labels.ts +0 -24
- package/src/account/sessions-setting.tsx +0 -283
- package/src/admin/admin-action-confirm-labels.ts +0 -19
- package/src/admin/admin-action-confirm.tsx +0 -509
- package/src/admin/admin-action-log-labels.ts +0 -83
- package/src/admin/admin-action-log.tsx +0 -464
- package/src/admin/admin-area-labels.ts +0 -114
- package/src/admin/admin-forbidden.tsx +0 -75
- package/src/admin/admin-overview.tsx +0 -258
- package/src/admin/admin-parts.ts +0 -68
- package/src/admin/admin-sections.tsx +0 -208
- package/src/admin/admin-tool-links.tsx +0 -90
- package/src/admin/invitations-panel-labels.ts +0 -31
- package/src/admin/invitations-panel.tsx +0 -516
- package/src/admin/mail-test-card-labels.ts +0 -19
- package/src/admin/mail-test-card.tsx +0 -189
- package/src/admin/plan-change-labels.ts +0 -5
- package/src/admin/plan-change.tsx +0 -474
- package/src/admin/reviewer-scope-editor-labels.ts +0 -16
- package/src/admin/reviewer-scope-editor.tsx +0 -224
- package/src/admin/role-select-labels.ts +0 -16
- package/src/admin/role-select.tsx +0 -282
- package/src/admin/transfer-ownership-dialog-labels.ts +0 -20
- package/src/admin/transfer-ownership-dialog.tsx +0 -162
- package/src/admin/user-roster-labels.ts +0 -17
- package/src/admin/user-roster.tsx +0 -559
- package/src/auth/accept-invitation-labels.ts +0 -21
- package/src/auth/accept-invitation.tsx +0 -210
- package/src/auth/auth-errors-labels.ts +0 -23
- package/src/auth/auth-errors.ts +0 -439
- package/src/auth/complete-name-dialog-labels.ts +0 -16
- package/src/auth/complete-name-dialog.tsx +0 -253
- package/src/auth/email-tag.ts +0 -75
- package/src/auth/forgot-password-form-labels.ts +0 -20
- package/src/auth/forgot-password-form.tsx +0 -221
- package/src/auth/form-rules.ts +0 -40
- package/src/auth/new-password-fields.tsx +0 -85
- package/src/auth/not-found-page-labels.ts +0 -12
- package/src/auth/not-found-page.tsx +0 -95
- package/src/auth/register-form-labels.ts +0 -31
- package/src/auth/register-form.tsx +0 -456
- package/src/auth/reset-password-form-labels.ts +0 -27
- package/src/auth/reset-password-form.tsx +0 -341
- package/src/auth/sign-in-form-labels.ts +0 -44
- package/src/auth/sign-in-form.tsx +0 -858
- package/src/auth/status-parts.tsx +0 -132
- package/src/auth/verify-email-labels.ts +0 -26
- package/src/auth/verify-email.tsx +0 -445
- package/src/billing/billing-banner.tsx +0 -258
- package/src/billing/billing-labels.ts +0 -381
- package/src/billing/billing-lock.ts +0 -108
- package/src/billing/billing-overview.ts +0 -157
- package/src/billing/billing-standing.ts +0 -80
- package/src/billing/cancel-request.ts +0 -97
- package/src/billing/cancel-subscription.tsx +0 -98
- package/src/billing/checkout-processing.ts +0 -394
- package/src/billing/checkout-return.ts +0 -90
- package/src/billing/pay-page.ts +0 -330
- package/src/billing/plan-card.tsx +0 -562
- package/src/billing/plan-change-labels.ts +0 -66
- package/src/billing/plan-limit-notice.tsx +0 -148
- package/src/billing/plan-limit-toast.tsx +0 -90
- package/src/billing/plan-limit.ts +0 -52
- package/src/billing/plan-price.ts +0 -98
- package/src/billing/plan-switch.tsx +0 -216
- package/src/billing/provider-page.ts +0 -84
- package/src/billing/subscription-actions.tsx +0 -247
- package/src/billing/subscription-status-chip.tsx +0 -95
- package/src/chart.ts +0 -103
- package/src/components/account-chips-labels.ts +0 -16
- package/src/components/account-chips.tsx +0 -474
- package/src/components/alert-banner.tsx +0 -670
- package/src/components/amount-input.tsx +0 -816
- package/src/components/appearance-labels.ts +0 -63
- package/src/components/authed-image-labels.ts +0 -11
- package/src/components/authed-image.tsx +0 -209
- package/src/components/autocomplete.tsx +0 -645
- package/src/components/breadcrumbs-labels.ts +0 -10
- package/src/components/breadcrumbs.tsx +0 -205
- package/src/components/bulk-action-bar-labels.ts +0 -11
- package/src/components/bulk-action-bar.tsx +0 -443
- package/src/components/button-group.tsx +0 -223
- package/src/components/button-look.ts +0 -256
- package/src/components/button.tsx +0 -339
- package/src/components/calculator.tsx +0 -341
- package/src/components/calendar-heatmap-labels.ts +0 -15
- package/src/components/calendar-heatmap.tsx +0 -600
- package/src/components/card.tsx +0 -377
- package/src/components/chart-edge.ts +0 -106
- package/src/components/chart-figure.tsx +0 -35
- package/src/components/chart-height.ts +0 -30
- package/src/components/chart-zoom-core.tsx +0 -627
- package/src/components/chart-zoom.tsx +0 -22
- package/src/components/chart.tsx +0 -554
- package/src/components/checkbox-group.tsx +0 -247
- package/src/components/checkbox.tsx +0 -346
- package/src/components/chip-input.tsx +0 -370
- package/src/components/chip-labels.ts +0 -13
- package/src/components/chip.tsx +0 -843
- package/src/components/choice-card.tsx +0 -544
- package/src/components/column-mapper-labels.ts +0 -38
- package/src/components/column-mapper.tsx +0 -655
- package/src/components/combobox-core.tsx +0 -1321
- package/src/components/combobox-suggestions.tsx +0 -131
- package/src/components/combobox.tsx +0 -716
- package/src/components/confirm-context.ts +0 -7
- package/src/components/confirm-dialog-labels.ts +0 -13
- package/src/components/confirm-dialog.tsx +0 -341
- package/src/components/copy-button-labels.ts +0 -13
- package/src/components/copy-button.tsx +0 -192
- package/src/components/country-select-labels.ts +0 -11
- package/src/components/country-select.tsx +0 -539
- package/src/components/currency-option-list.tsx +0 -188
- package/src/components/currency-select.tsx +0 -343
- package/src/components/danger-confirm-labels.ts +0 -20
- package/src/components/danger-confirm.tsx +0 -987
- package/src/components/data-table-cells.tsx +0 -118
- package/src/components/data-table-column-settings.tsx +0 -198
- package/src/components/data-table-filter-popover.tsx +0 -289
- package/src/components/data-table-filters.ts +0 -315
- package/src/components/data-table-fit.ts +0 -301
- package/src/components/data-table-groups.tsx +0 -288
- package/src/components/data-table-head.tsx +0 -280
- package/src/components/data-table-labels.ts +0 -198
- package/src/components/data-table-leading-row.tsx +0 -58
- package/src/components/data-table-mobile.tsx +0 -1117
- package/src/components/data-table-pagination.tsx +0 -202
- package/src/components/data-table-resize.ts +0 -188
- package/src/components/data-table-row-actions.tsx +0 -302
- package/src/components/data-table-row.tsx +0 -496
- package/src/components/data-table-selection.ts +0 -71
- package/src/components/data-table-shared.tsx +0 -287
- package/src/components/data-table-sort.ts +0 -163
- package/src/components/data-table-virtual.ts +0 -576
- package/src/components/data-table.tsx +0 -2598
- package/src/components/date-field.tsx +0 -684
- package/src/components/date-format-setting.tsx +0 -64
- package/src/components/date-picker.tsx +0 -404
- package/src/components/date-range-picker.tsx +0 -518
- package/src/components/description-list-labels.ts +0 -9
- package/src/components/description-list.tsx +0 -386
- package/src/components/dialog-frame-labels.ts +0 -7
- package/src/components/dialog-frame.tsx +0 -284
- package/src/components/disclosure.tsx +0 -476
- package/src/components/dropdown.tsx +0 -461
- package/src/components/empty-state.tsx +0 -136
- package/src/components/entity-combobox.tsx +0 -422
- package/src/components/error-boundary-labels.ts +0 -20
- package/src/components/error-boundary.tsx +0 -675
- package/src/components/facing-pair.ts +0 -93
- package/src/components/field-base-labels.ts +0 -20
- package/src/components/field-base.tsx +0 -656
- package/src/components/field-parts.tsx +0 -825
- package/src/components/field-strip.tsx +0 -129
- package/src/components/field.tsx +0 -206
- package/src/components/file-button.tsx +0 -295
- package/src/components/file-dropzone.tsx +0 -559
- package/src/components/floating-panel-labels.ts +0 -10
- package/src/components/floating-panel.tsx +0 -828
- package/src/components/focus-ring.ts +0 -16
- package/src/components/form-actions-labels.ts +0 -11
- package/src/components/form-actions.tsx +0 -578
- package/src/components/full-bleed-dialog.tsx +0 -294
- package/src/components/grouped-picker.tsx +0 -184
- package/src/components/help-popover.tsx +0 -117
- package/src/components/hover-menu.tsx +0 -343
- package/src/components/iban-input-labels.ts +0 -14
- package/src/components/iban-input.tsx +0 -236
- package/src/components/icon-button.tsx +0 -959
- package/src/components/icon-picker-labels.ts +0 -13
- package/src/components/icon-picker.tsx +0 -232
- package/src/components/image-grid-labels.ts +0 -11
- package/src/components/image-grid.tsx +0 -202
- package/src/components/inline-confirm.tsx +0 -116
- package/src/components/inline-edit-field-labels.ts +0 -11
- package/src/components/inline-edit-field.tsx +0 -552
- package/src/components/inline-entity-combobox.tsx +0 -849
- package/src/components/input.tsx +0 -394
- package/src/components/jump-calendar.tsx +0 -265
- package/src/components/language-select.tsx +0 -93
- package/src/components/legal-labels.ts +0 -105
- package/src/components/legal-page.tsx +0 -711
- package/src/components/legal.tsx +0 -668
- package/src/components/lightbox-labels.ts +0 -18
- package/src/components/lightbox.tsx +0 -399
- package/src/components/line-items-labels.ts +0 -14
- package/src/components/line-items.tsx +0 -602
- package/src/components/list-labels.ts +0 -12
- package/src/components/list.tsx +0 -870
- package/src/components/loading-state.tsx +0 -78
- package/src/components/measured-grid-labels.ts +0 -25
- package/src/components/measured-grid.tsx +0 -837
- package/src/components/menu-item.tsx +0 -241
- package/src/components/mini-calendar-labels.ts +0 -17
- package/src/components/mini-calendar.tsx +0 -792
- package/src/components/modal.tsx +0 -534
- package/src/components/money-draft.ts +0 -83
- package/src/components/money-field.tsx +0 -76
- package/src/components/month-grid.tsx +0 -229
- package/src/components/month-picker-labels.ts +0 -22
- package/src/components/month-picker.tsx +0 -1087
- package/src/components/multi-entity-combobox.tsx +0 -369
- package/src/components/multi-select.tsx +0 -376
- package/src/components/nav-pills.tsx +0 -198
- package/src/components/number-field.tsx +0 -327
- package/src/components/number-input.tsx +0 -559
- package/src/components/numeric-field.ts +0 -169
- package/src/components/numpad-sheet.tsx +0 -285
- package/src/components/one-time-code-input.tsx +0 -270
- package/src/components/page-contents-labels.ts +0 -9
- package/src/components/page-contents.tsx +0 -282
- package/src/components/page-header-context.ts +0 -8
- package/src/components/page-header.tsx +0 -298
- package/src/components/password-strength-labels.ts +0 -22
- package/src/components/password-strength.tsx +0 -241
- package/src/components/phone-input-labels.ts +0 -10
- package/src/components/phone-input.tsx +0 -282
- package/src/components/picker-sheet.tsx +0 -330
- package/src/components/pie-chart-labels.ts +0 -40
- package/src/components/pie-chart.tsx +0 -480
- package/src/components/popover-labels.ts +0 -14
- package/src/components/popover.tsx +0 -268
- package/src/components/progress-bar-labels.ts +0 -10
- package/src/components/progress-bar.tsx +0 -479
- package/src/components/qr-code.tsx +0 -76
- package/src/components/reauth-dialog-labels.ts +0 -13
- package/src/components/reauth-dialog.tsx +0 -265
- package/src/components/row-actions-labels.ts +0 -12
- package/src/components/row-actions.tsx +0 -795
- package/src/components/scroll-area.tsx +0 -123
- package/src/components/search-field.tsx +0 -192
- package/src/components/select.tsx +0 -294
- package/src/components/separator.tsx +0 -33
- package/src/components/series-chart-axes.ts +0 -342
- package/src/components/series-chart-budget.ts +0 -150
- package/src/components/series-chart-labels.ts +0 -33
- package/src/components/series-chart-thin.ts +0 -180
- package/src/components/series-chart-ticks.ts +0 -194
- package/src/components/series-chart.tsx +0 -1906
- package/src/components/server-wake-labels.ts +0 -11
- package/src/components/server-wake.tsx +0 -129
- package/src/components/settings-fields.tsx +0 -237
- package/src/components/share-card-labels.ts +0 -30
- package/src/components/share-card.tsx +0 -675
- package/src/components/signature-pad-labels.ts +0 -24
- package/src/components/signature-pad.tsx +0 -747
- package/src/components/signed-amount-labels.ts +0 -10
- package/src/components/signed-amount.tsx +0 -336
- package/src/components/skeleton.tsx +0 -80
- package/src/components/slider.tsx +0 -338
- package/src/components/sparkline-labels.ts +0 -14
- package/src/components/sparkline.tsx +0 -322
- package/src/components/spinner.tsx +0 -81
- package/src/components/stat-tile-labels.ts +0 -15
- package/src/components/stat-tile.tsx +0 -754
- package/src/components/status-dot.tsx +0 -170
- package/src/components/swatch-picker-labels.ts +0 -10
- package/src/components/swatch-picker.tsx +0 -283
- package/src/components/swipeable-row.tsx +0 -386
- package/src/components/switch.tsx +0 -273
- package/src/components/table-skeleton.tsx +0 -136
- package/src/components/table.tsx +0 -647
- package/src/components/tabs-labels.ts +0 -13
- package/src/components/tabs.tsx +0 -693
- package/src/components/text-link.tsx +0 -359
- package/src/components/text.tsx +0 -150
- package/src/components/textarea.tsx +0 -330
- package/src/components/tile-radio.tsx +0 -332
- package/src/components/time-input.tsx +0 -121
- package/src/components/toast-labels.ts +0 -12
- package/src/components/toast.tsx +0 -519
- package/src/components/toggle-group.tsx +0 -752
- package/src/components/toggle-legend.tsx +0 -394
- package/src/components/tooltip.tsx +0 -1149
- package/src/components/translation-review-editor.tsx +0 -290
- package/src/components/translation-review-labels.ts +0 -181
- package/src/components/translation-review-parts.tsx +0 -272
- package/src/components/translation-review.tsx +0 -1240
- package/src/components/tree-view.tsx +0 -589
- package/src/components/treemap-labels.ts +0 -47
- package/src/components/treemap-layout.ts +0 -210
- package/src/components/treemap.tsx +0 -1184
- package/src/components/trigger-aria.ts +0 -44
- package/src/components/use-anchor-dir.ts +0 -20
- package/src/components/use-mobile-reveal.ts +0 -62
- package/src/components/use-table-state.ts +0 -753
- package/src/components/user-avatar.tsx +0 -116
- package/src/components/wizard-stepper.tsx +0 -42
- package/src/components/write-lock-labels.ts +0 -10
- package/src/components/write-lock.tsx +0 -253
- package/src/currencies.ts +0 -90
- package/src/data-table.ts +0 -42
- package/src/demo/demo-banner.tsx +0 -153
- package/src/demo/demo-countdown.ts +0 -136
- package/src/demo/demo-ended.tsx +0 -90
- package/src/demo/demo-labels.ts +0 -78
- package/src/demo/demo-session.ts +0 -32
- package/src/demo/demo-start.tsx +0 -156
- package/src/eslint/index.ts +0 -161
- package/src/eslint/role-utilities.generated.ts +0 -146
- package/src/eslint/role-utilities.ts +0 -233
- package/src/feedback/feedback-attachment-download.tsx +0 -77
- package/src/feedback/feedback-attachment-labels.ts +0 -37
- package/src/feedback/feedback-attachment.tsx +0 -1239
- package/src/feedback/feedback-capture.ts +0 -287
- package/src/feedback/feedback-comment-thread.tsx +0 -353
- package/src/feedback/feedback-context-labels.ts +0 -11
- package/src/feedback/feedback-context.tsx +0 -245
- package/src/feedback/feedback-crash.ts +0 -547
- package/src/feedback/feedback-diagnostics.tsx +0 -41
- package/src/feedback/feedback-dialog-labels.ts +0 -29
- package/src/feedback/feedback-dialog.tsx +0 -452
- package/src/feedback/feedback-entry-file.tsx +0 -150
- package/src/feedback/feedback-inbox.tsx +0 -552
- package/src/feedback/feedback-labels.ts +0 -144
- package/src/feedback/feedback-menu-labels.ts +0 -12
- package/src/feedback/feedback-menu.tsx +0 -177
- package/src/feedback/feedback-mutation.ts +0 -20
- package/src/feedback/feedback-page-link.ts +0 -90
- package/src/feedback/feedback-public-labels.ts +0 -81
- package/src/feedback/feedback-public-list.tsx +0 -524
- package/src/feedback/feedback-public-switch.tsx +0 -102
- package/src/feedback/feedback-public-types.ts +0 -101
- package/src/feedback/feedback-record.ts +0 -428
- package/src/feedback/feedback-replies-context.ts +0 -9
- package/src/feedback/feedback-replies.tsx +0 -343
- package/src/feedback/feedback-rework-entry-chip.tsx +0 -18
- package/src/feedback/feedback-row-detail-labels.ts +0 -31
- package/src/feedback/feedback-row-detail.tsx +0 -871
- package/src/feedback/feedback-status-undo.ts +0 -109
- package/src/feedback/feedback-submit-dialog.tsx +0 -131
- package/src/feedback/feedback-submit.tsx +0 -270
- package/src/feedback/feedback-swipe.tsx +0 -192
- package/src/feedback/feedback-table-labels.ts +0 -27
- package/src/feedback/feedback-table.tsx +0 -912
- package/src/feedback/feedback-thread-labels.ts +0 -22
- package/src/feedback/feedback-thread-parts-labels.ts +0 -41
- package/src/feedback/feedback-thread.tsx +0 -905
- package/src/feedback/feedback-vocabulary.ts +0 -263
- package/src/feedback/feedback-vote-button.tsx +0 -124
- package/src/feedback.ts +0 -116
- package/src/hooks/use-anchored-panel.ts +0 -396
- package/src/hooks/use-anchored-rect.ts +0 -77
- package/src/hooks/use-announce.ts +0 -85
- package/src/hooks/use-authed-src.ts +0 -167
- package/src/hooks/use-body-scroll-lock.ts +0 -119
- package/src/hooks/use-breakpoint.ts +0 -133
- package/src/hooks/use-close-transition.ts +0 -107
- package/src/hooks/use-copy-to-clipboard.ts +0 -122
- package/src/hooks/use-debounce.ts +0 -114
- package/src/hooks/use-dismiss.ts +0 -371
- package/src/hooks/use-document-title.ts +0 -33
- package/src/hooks/use-file-drop.ts +0 -121
- package/src/hooks/use-file-picker-labels.ts +0 -28
- package/src/hooks/use-file-picker.tsx +0 -359
- package/src/hooks/use-focus-trap.ts +0 -199
- package/src/hooks/use-hotkey.ts +0 -212
- package/src/hooks/use-large-text.ts +0 -41
- package/src/hooks/use-long-press.ts +0 -140
- package/src/hooks/use-media-query.ts +0 -39
- package/src/hooks/use-mounted.ts +0 -39
- package/src/hooks/use-noindex.ts +0 -37
- package/src/hooks/use-overlay-history.ts +0 -714
- package/src/hooks/use-row-swipe.ts +0 -207
- package/src/hooks/use-search-param-state.ts +0 -434
- package/src/hooks/use-windowed-rows.ts +0 -225
- package/src/i18n/defaults.ts +0 -267
- package/src/i18n/german.ts +0 -2059
- package/src/i18n/kit-labels.tsx +0 -1003
- package/src/i18n/languages.ts +0 -349
- package/src/i18n/locales/de-CH.ts +0 -24
- package/src/i18n/locales/en.ts +0 -267
- package/src/i18n/locales/es.ts +0 -1999
- package/src/i18n/locales/fr.ts +0 -2037
- package/src/i18n/locales/hu.ts +0 -2004
- package/src/i18n/locales/it.ts +0 -2014
- package/src/i18n/locales/zh.ts +0 -1912
- package/src/i18n/plurals.ts +0 -86
- package/src/i18n/review.ts +0 -475
- package/src/i18n/shared-labels.ts +0 -138
- package/src/i18n/swiss.ts +0 -29
- package/src/index.ts +0 -1191
- package/src/landing/access.ts +0 -93
- package/src/landing/landing-actions.tsx +0 -97
- package/src/landing/landing-labels.ts +0 -59
- package/src/landing/landing-sections.tsx +0 -341
- package/src/landing/page-seo.ts +0 -261
- package/src/landing/public-header.tsx +0 -121
- package/src/landing/public-page.tsx +0 -106
- package/src/landing/routing.tsx +0 -225
- package/src/lib/broadcast.ts +0 -52
- package/src/lib/calc.ts +0 -323
- package/src/lib/chip-edge-snap.ts +0 -212
- package/src/lib/clipboard-minus.ts +0 -107
- package/src/lib/clipping.ts +0 -34
- package/src/lib/cn.ts +0 -28
- package/src/lib/column-mapping.ts +0 -234
- package/src/lib/countries.ts +0 -91
- package/src/lib/data-attributes.ts +0 -14
- package/src/lib/date-format.ts +0 -227
- package/src/lib/dates.ts +0 -288
- package/src/lib/day-format.ts +0 -96
- package/src/lib/decimal-marks.ts +0 -108
- package/src/lib/describe-failure.ts +0 -18
- package/src/lib/device-settings.ts +0 -147
- package/src/lib/direction.ts +0 -74
- package/src/lib/document-navigation.ts +0 -17
- package/src/lib/document-title.ts +0 -41
- package/src/lib/download.ts +0 -172
- package/src/lib/float-clearance.ts +0 -70
- package/src/lib/floating-stack.ts +0 -70
- package/src/lib/focus-left.ts +0 -156
- package/src/lib/format.ts +0 -585
- package/src/lib/http-status.ts +0 -38
- package/src/lib/iban.ts +0 -251
- package/src/lib/ime.ts +0 -24
- package/src/lib/intl-cache.ts +0 -27
- package/src/lib/iso-day.ts +0 -13
- package/src/lib/lazy-with-fallback.ts +0 -82
- package/src/lib/logger.ts +0 -69
- package/src/lib/minus.ts +0 -50
- package/src/lib/path-pattern.ts +0 -55
- package/src/lib/person-name.ts +0 -155
- package/src/lib/phone.ts +0 -208
- package/src/lib/plain-text.ts +0 -22
- package/src/lib/presence.ts +0 -18
- package/src/lib/qr-encode.ts +0 -444
- package/src/lib/quiet-focus.ts +0 -32
- package/src/lib/reduced-motion.ts +0 -22
- package/src/lib/refs.ts +0 -22
- package/src/lib/round.ts +0 -43
- package/src/lib/safe-storage.ts +0 -119
- package/src/lib/server-wake.ts +0 -315
- package/src/lib/session-refresh.ts +0 -472
- package/src/lib/share-format.ts +0 -18
- package/src/lib/status-tone.ts +0 -43
- package/src/lib/strip-fade.ts +0 -287
- package/src/lib/table-text.ts +0 -554
- package/src/lib/text-case.ts +0 -19
- package/src/lib/text-match.ts +0 -169
- package/src/lib/thenable.ts +0 -19
- package/src/lib/translation-review.ts +0 -769
- package/src/notifications/device-zone-report.ts +0 -67
- package/src/notifications/feedback-notification-types-labels.ts +0 -33
- package/src/notifications/feedback-notification-types.ts +0 -71
- package/src/notifications/notification-bell.tsx +0 -119
- package/src/notifications/notification-inbox.tsx +0 -309
- package/src/notifications/notification-parts.tsx +0 -81
- package/src/notifications/notification-types-setting.tsx +0 -406
- package/src/notifications/notification-types.ts +0 -89
- package/src/notifications/notifications-labels.ts +0 -287
- package/src/notifications/push-device-setting.tsx +0 -230
- package/src/notifications/push-devices-setting.tsx +0 -374
- package/src/notifications/push-worker.ts +0 -168
- package/src/notifications/quiet-hours-setting.tsx +0 -238
- package/src/notifications/unsubscribe-panel.tsx +0 -200
- package/src/notifications/use-push-device.ts +0 -448
- package/src/offline/local-first.ts +0 -100
- package/src/offline/pwa-update-prompt-labels.ts +0 -9
- package/src/offline/pwa-update-prompt.tsx +0 -78
- package/src/offline/query-persistence.ts +0 -391
- package/src/offline/service-worker-updates.ts +0 -81
- package/src/offline/shared-computer-labels.ts +0 -8
- package/src/offline/shared-computer.tsx +0 -87
- package/src/offline/sign-out-pending-dialog-labels.ts +0 -21
- package/src/offline/sign-out-pending-dialog.tsx +0 -135
- package/src/offline.ts +0 -37
- package/src/push-worker.ts +0 -25
- package/src/rhf/fields.tsx +0 -2187
- package/src/rhf/form-core.tsx +0 -324
- package/src/rhf/form.tsx +0 -12
- package/src/rhf/line-items.tsx +0 -135
- package/src/rhf/use-rhf-wizard-step.ts +0 -104
- package/src/rhf.ts +0 -21
- package/src/search/command-palette-labels.ts +0 -16
- package/src/search/command-palette.tsx +0 -624
- package/src/search/global-search-labels.ts +0 -13
- package/src/search/global-search.tsx +0 -660
- package/src/search/search-index.ts +0 -283
- package/src/search/use-command-key.ts +0 -23
- package/src/search.ts +0 -14
- package/src/settings/device-reset-setting-labels.ts +0 -20
- package/src/settings/device-reset-setting.tsx +0 -116
- package/src/settings/settings-card-classes.ts +0 -11
- package/src/settings/settings-catalogue.ts +0 -150
- package/src/settings/settings-context.ts +0 -33
- package/src/settings/settings-heading.tsx +0 -67
- package/src/settings/settings-labels.ts +0 -87
- package/src/settings/settings-layout.tsx +0 -471
- package/src/settings/settings-section.tsx +0 -108
- package/src/settings/use-account-appearance.ts +0 -148
- package/src/settings/use-account-language.ts +0 -146
- package/src/settings/use-settings-focus.ts +0 -128
- package/src/settings/use-settings-route.ts +0 -258
- package/src/shell/account-menu-language.tsx +0 -130
- package/src/shell/account-menu-text-size.tsx +0 -80
- package/src/shell/admin-menu.tsx +0 -183
- package/src/shell/app-shell-labels.ts +0 -11
- package/src/shell/app-shell.tsx +0 -1560
- package/src/shell/auth-layout.tsx +0 -186
- package/src/shell/company-switcher-labels.ts +0 -13
- package/src/shell/company-switcher.tsx +0 -136
- package/src/shell/dev-menu.tsx +0 -257
- package/src/shell/fill-height.tsx +0 -45
- package/src/shell/language-code.ts +0 -5
- package/src/shell/option-switcher-menu.tsx +0 -84
- package/src/shell/sync-status-indicator.tsx +0 -303
- package/src/shell/top-bar-actions.tsx +0 -87
- package/src/shell/top-bar-brand.tsx +0 -78
- package/src/shell/top-bar-parts-labels.ts +0 -148
- package/src/shell/top-bar.tsx +0 -40
- package/src/shell/topbar-action-menu.tsx +0 -567
- package/src/shell/topbar-controls.tsx +0 -269
- package/src/shell/tour-menu.tsx +0 -187
- package/src/shell.ts +0 -108
- package/src/sync/db.ts +0 -129
- package/src/sync/engine.ts +0 -1011
- package/src/sync/hooks.ts +0 -98
- package/src/sync/testing.ts +0 -73
- package/src/sync/wire.ts +0 -61
- package/src/sync.ts +0 -37
- package/src/table-text.ts +0 -8
- package/src/testing/css-variables.generated.ts +0 -112
- package/src/testing/css-variables.ts +0 -189
- package/src/testing/index.ts +0 -29
- package/src/testing/react.ts +0 -58
- package/src/testing/tour.ts +0 -41
- package/src/testing/viewport.ts +0 -357
- package/src/theme/chart-palette.ts +0 -232
- package/src/theme/color.ts +0 -272
- package/src/theme/contrast-tokens.ts +0 -268
- package/src/theme/contrast.ts +0 -250
- package/src/theme/palette-derive.ts +0 -825
- package/src/theme/palette-presets.ts +0 -544
- package/src/theme/palette-store.ts +0 -108
- package/src/theme/text-size.ts +0 -289
- package/src/theme/theme-store.ts +0 -157
- package/src/tour/tour-catalogue-labels.ts +0 -75
- package/src/tour/tour-catalogue.tsx +0 -335
- package/src/tour/tour-dock.ts +0 -134
- package/src/tour/tour-engine.ts +0 -37
- package/src/tour/tour-gates.ts +0 -218
- package/src/tour/tour-guide-button.tsx +0 -64
- package/src/tour/tour-guide-labels.ts +0 -15
- package/src/tour/tour-info.ts +0 -144
- package/src/tour/tour-labels.ts +0 -23
- package/src/tour/tour-overlay.tsx +0 -1170
- package/src/tour/tour.tsx +0 -750
- package/src/tour/use-tour-progress.ts +0 -671
- package/src/tour/use-tour-url-sync.ts +0 -266
- package/src/tour.ts +0 -21
- package/src/vite-env.d.ts +0 -23
- package/src/wizard/stepper-nav.tsx +0 -360
- package/src/wizard/types.ts +0 -275
- package/src/wizard/use-wizard.ts +0 -560
- package/src/wizard/validation.ts +0 -39
- package/src/wizard/wizard-context.tsx +0 -74
- package/src/wizard/wizard-labels.ts +0 -29
- package/src/wizard/wizard-step.tsx +0 -76
- package/src/wizard/wizard-summary.tsx +0 -84
- package/src/wizard.ts +0 -15
|
@@ -1,445 +0,0 @@
|
|
|
1
|
-
import { useEffect, useMemo, useRef, useState } from "react";
|
|
2
|
-
import type { KeyboardEvent, ReactNode } from "react";
|
|
3
|
-
import { KeyRound } from "lucide-react";
|
|
4
|
-
import { cn } from "../lib/cn";
|
|
5
|
-
import { useDayFormatter } from "../lib/day-format";
|
|
6
|
-
import { toDate } from "../lib/format";
|
|
7
|
-
import type { LabelOverride } from "../i18n/kit-labels";
|
|
8
|
-
import { Button } from "../components/button";
|
|
9
|
-
import { Card } from "../components/card";
|
|
10
|
-
import { EmptyState } from "../components/empty-state";
|
|
11
|
-
import { InlineConfirm } from "../components/inline-confirm";
|
|
12
|
-
import { Input } from "../components/input";
|
|
13
|
-
import { Skeleton } from "../components/skeleton";
|
|
14
|
-
import { COMMIT_EXCEPT_BILLING, useWriteLock } from "../components/write-lock";
|
|
15
|
-
import { useAccountSettingsLabels } from "./account-settings-labels";
|
|
16
|
-
import { SettingsCardTitle } from "../settings/settings-heading";
|
|
17
|
-
import type { PasskeysSettingLabels } from "./account-settings-labels";
|
|
18
|
-
|
|
19
|
-
/** What a passkey's `id` may be: the app's own key type, string or numeric. */
|
|
20
|
-
export type PasskeyId = string | number;
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* One registered passkey, as the app's API lists it.
|
|
24
|
-
*
|
|
25
|
-
* Generic in its `id` (0.16.0): `PasskeysSetting` infers `Id` from `passkeys`, so an
|
|
26
|
-
* app whose ids are numbers gets numbers back in `onRename` / `onDelete` — keksdose
|
|
27
|
-
* cast `id as number` in both. Left unparameterised it is the old `string | number`.
|
|
28
|
-
*/
|
|
29
|
-
export interface PasskeyItem<Id extends PasskeyId = PasskeyId> {
|
|
30
|
-
id: Id;
|
|
31
|
-
name: string;
|
|
32
|
-
/** A `Date`, an ISO string or epoch ms. */
|
|
33
|
-
createdAt?: Date | string | number | null;
|
|
34
|
-
/** Null (or left out) reads as "Never used". */
|
|
35
|
-
lastUsedAt?: Date | string | number | null;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/** `data-*` attributes, passed through to the element they are given for. */
|
|
39
|
-
export type PasskeyDataAttributes = { [key: `data-${string}`]: string | number | boolean | undefined };
|
|
40
|
-
|
|
41
|
-
export interface PasskeysSettingProps<Id extends PasskeyId = PasskeyId> extends PasskeyDataAttributes {
|
|
42
|
-
/** `undefined` while the first load is in flight (or pass `loading`). */
|
|
43
|
-
passkeys: readonly PasskeyItem<Id>[] | undefined;
|
|
44
|
-
loading?: boolean;
|
|
45
|
-
/**
|
|
46
|
-
* Run the WebAuthn ceremony and register the passkey — app-side, since the options
|
|
47
|
-
* and the attestation are the app's server's business. Called with the trimmed name
|
|
48
|
-
* field, which may be EMPTY: pick your own default ("Passkey", the device name).
|
|
49
|
-
* Return the promise and the field clears when it resolves; a rejection (including
|
|
50
|
-
* the user cancelling the OS prompt) keeps what was typed.
|
|
51
|
-
*/
|
|
52
|
-
onAdd: (name: string) => void | Promise<unknown>;
|
|
53
|
-
/**
|
|
54
|
-
* A step the app runs BEFORE `onAdd` (0.18.0) — re-asking for the current password,
|
|
55
|
-
* a policy notice, anything that may stop the add. Called with the same trimmed name;
|
|
56
|
-
* resolve `true` to go on to `onAdd`, `false` to stop quietly (nothing is said, the
|
|
57
|
-
* typed name stays). A rejection, or a throw, stops the same way: the app reports
|
|
58
|
-
* its own errors. While it runs the add button is disabled and busy, so a second
|
|
59
|
-
* click cannot start a second check.
|
|
60
|
-
*
|
|
61
|
-
* Kurvenschmiede asked for the password in its own dialog by handing `onAdd` a
|
|
62
|
-
* promise it kept open across that dialog (passkeys-card.tsx) — which still works.
|
|
63
|
-
* This is the documented place for it: open the dialog here, resolve with whether it
|
|
64
|
-
* was confirmed, and keep what it produced (the server's registration options) for
|
|
65
|
-
* `onAdd` in a ref. The ceremony then starts from the dialog's click rather than the
|
|
66
|
-
* card's, which is the user activation `navigator.credentials.create` wants.
|
|
67
|
-
*
|
|
68
|
-
* Left out, `onAdd` is called synchronously in the click, exactly as before.
|
|
69
|
-
*/
|
|
70
|
-
beforeAdd?: (name: string) => boolean | Promise<boolean>;
|
|
71
|
-
/**
|
|
72
|
-
* What a passkey does to the password, which picks the line under the title (0.18.0).
|
|
73
|
-
* `"instead"` (default): it replaces it — `labels.description`, kastlan's promise.
|
|
74
|
-
* `"alongside"`: the password stays and the passkey is a second way in —
|
|
75
|
-
* `labels.descriptionAlongside`. Kurvenschmiede overrode `description` for exactly
|
|
76
|
-
* this; an app that sets `mode` needs no override.
|
|
77
|
-
*/
|
|
78
|
-
mode?: "instead" | "alongside";
|
|
79
|
-
/** The ceremony is running. The add button says so and does not start a second one. */
|
|
80
|
-
adding?: boolean;
|
|
81
|
-
/** Offer "Rename" on each row. Return a promise to leave edit mode only on success. */
|
|
82
|
-
onRename?: (id: Id, name: string) => void | Promise<unknown>;
|
|
83
|
-
/** Offer "Delete" on each row — always behind an inline confirmation. */
|
|
84
|
-
onDelete?: (id: Id) => void | Promise<unknown>;
|
|
85
|
-
/** A row whose rename or delete is in flight; its buttons are disabled. */
|
|
86
|
-
busyId?: Id | null;
|
|
87
|
-
/** Show the name field above the add button. Default true. */
|
|
88
|
-
nameField?: boolean;
|
|
89
|
-
/**
|
|
90
|
-
* Shown INSTEAD of the list and the add button — passkeys are not supported by this
|
|
91
|
-
* browser, or the page is not a secure context. Its wording is the app's: only the
|
|
92
|
-
* app knows which of those it detected.
|
|
93
|
-
*/
|
|
94
|
-
unavailable?: ReactNode;
|
|
95
|
-
/** A date for the "Added …" / "Last used …" lines. Default: the provider's `formatDate`
|
|
96
|
-
* (the app's date preference), else a medium date in the provider's locale and
|
|
97
|
-
* `timeZone`. */
|
|
98
|
-
formatDate?: (date: Date) => string;
|
|
99
|
-
/** Overrides the provider's locale for the default date format. */
|
|
100
|
-
locale?: string;
|
|
101
|
-
/** Prop > `<UiKitProvider labels={{ accountSettings: { passkeys } }}>` > English. */
|
|
102
|
-
labels?: LabelOverride<PasskeysSettingLabels>;
|
|
103
|
-
className?: string;
|
|
104
|
-
/** On the card (0.16.0), for an in-page link (`#passkeys`) or a test hook. `data-*`
|
|
105
|
-
* attributes go there too. */
|
|
106
|
-
id?: string;
|
|
107
|
-
/** Extra attributes for one row's `<li>` (0.16.0) — an `id` to scroll a just-added
|
|
108
|
-
* key into view, `data-*` for a test. Every row also carries `data-passkey-id`. */
|
|
109
|
-
rowProps?: (item: PasskeyItem<Id>) => ({ id?: string } & PasskeyDataAttributes) | undefined;
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
/**
|
|
113
|
-
* The passkeys section of an account page: what is registered, when it was last used,
|
|
114
|
-
* rename and delete, and "Add passkey" — the fourth card beside `ProfileSetting`,
|
|
115
|
-
* `PasswordSetting` and `TwoFactorSetting`, and built the same way (a self-contained
|
|
116
|
-
* `<Card>` owning its transient form state; the app owns the data and the API).
|
|
117
|
-
*
|
|
118
|
-
* Lifted from kastlan's passkeys-card. **The WebAuthn ceremony stays app-side**:
|
|
119
|
-
* `navigator.credentials.create` needs options minted by the app's server and hands
|
|
120
|
-
* back an attestation only that server can verify, so the kit calls `onAdd` and waits.
|
|
121
|
-
*
|
|
122
|
-
* **Delete confirms inline**, in the row, rather than through `useConfirm`: this card
|
|
123
|
-
* must work in an app without a `ConfirmProvider`, and the question belongs next to
|
|
124
|
-
* the passkey it names. Focus moves to Cancel, as in every destructive confirm in the
|
|
125
|
-
* kit, so the Enter that pressed Delete cannot also answer it.
|
|
126
|
-
*
|
|
127
|
-
* **Under a write lock** (0.52) Add, Rename, Delete and the confirm are `commit` controls
|
|
128
|
-
* exempt from billing — a lapsed plan still lets the account manage how it signs in, the
|
|
129
|
-
* demo does not. Until 0.52 the passkeys' confirm was the one inline confirm without it,
|
|
130
|
-
* so the demo could delete, rename and add (refactor audit 2026-10-30, DUP-10).
|
|
131
|
-
*/
|
|
132
|
-
export function PasskeysSetting<Id extends PasskeyId = PasskeyId>({
|
|
133
|
-
passkeys,
|
|
134
|
-
loading,
|
|
135
|
-
onAdd,
|
|
136
|
-
beforeAdd,
|
|
137
|
-
mode = "instead",
|
|
138
|
-
adding = false,
|
|
139
|
-
onRename,
|
|
140
|
-
onDelete,
|
|
141
|
-
busyId,
|
|
142
|
-
nameField = true,
|
|
143
|
-
unavailable,
|
|
144
|
-
formatDate,
|
|
145
|
-
locale: localeProp,
|
|
146
|
-
labels: labelsProp,
|
|
147
|
-
className,
|
|
148
|
-
rowProps,
|
|
149
|
-
...rest
|
|
150
|
-
}: PasskeysSettingProps<Id>) {
|
|
151
|
-
const labels = useAccountSettingsLabels("passkeys", labelsProp);
|
|
152
|
-
// The prop, else the provider's `formatDate`, else the kit's in the provider's locale and
|
|
153
|
-
// `timeZone`; a bare "YYYY-MM-DD" is read on its calendar (refactor audit 2026-10-30,
|
|
154
|
-
// DUP-2: this card parsed with `new Date` and built its own `Intl` formatter).
|
|
155
|
-
// The raw value goes in, so a bare day keeps its calendar; the prop still gets a Date.
|
|
156
|
-
const own = useMemo(
|
|
157
|
-
() =>
|
|
158
|
-
formatDate &&
|
|
159
|
-
((value: PasskeyItem["createdAt"]) => {
|
|
160
|
-
const date = toDate(value);
|
|
161
|
-
return date ? formatDate(date) : "";
|
|
162
|
-
}),
|
|
163
|
-
[formatDate],
|
|
164
|
-
);
|
|
165
|
-
const day = useDayFormatter(own, localeProp);
|
|
166
|
-
const lock = useWriteLock(COMMIT_EXCEPT_BILLING);
|
|
167
|
-
const [name, setName] = useState("");
|
|
168
|
-
// `beforeAdd` is running. State for the button, and a ref for the guard: two clicks
|
|
169
|
-
// in one frame both read the state from before either set it.
|
|
170
|
-
const [checking, setChecking] = useState(false);
|
|
171
|
-
const checkingRef = useRef(false);
|
|
172
|
-
|
|
173
|
-
const date = (value: PasskeyItem["createdAt"]): string | null => {
|
|
174
|
-
return toDate(value) ? day(value) : null;
|
|
175
|
-
};
|
|
176
|
-
|
|
177
|
-
const add = () => {
|
|
178
|
-
// The name field's Enter reaches here too, past the locked button.
|
|
179
|
-
if (adding || checkingRef.current || lock.locked) return;
|
|
180
|
-
const typed = name;
|
|
181
|
-
const value = typed.trim();
|
|
182
|
-
const send = () =>
|
|
183
|
-
Promise.resolve(onAdd(value))
|
|
184
|
-
// Clear only what was sent: the field stays editable while the OS prompt is up.
|
|
185
|
-
.then(() => setName((current) => (current === typed ? "" : current)));
|
|
186
|
-
if (!beforeAdd) {
|
|
187
|
-
send().catch(() => {});
|
|
188
|
-
return;
|
|
189
|
-
}
|
|
190
|
-
const done = () => {
|
|
191
|
-
checkingRef.current = false;
|
|
192
|
-
setChecking(false);
|
|
193
|
-
};
|
|
194
|
-
checkingRef.current = true;
|
|
195
|
-
setChecking(true);
|
|
196
|
-
let gate: Promise<boolean>;
|
|
197
|
-
// Called in the click, not a microtask later, so a step that itself needs the
|
|
198
|
-
// user's activation (a popup, the clipboard) still has it; a throw is a "no".
|
|
199
|
-
try {
|
|
200
|
-
gate = Promise.resolve(beforeAdd(value));
|
|
201
|
-
} catch (error) {
|
|
202
|
-
gate = Promise.reject(error);
|
|
203
|
-
}
|
|
204
|
-
gate
|
|
205
|
-
.then((go) => {
|
|
206
|
-
done();
|
|
207
|
-
// Strictly `true`: an app whose step resolves `undefined` meant nothing.
|
|
208
|
-
if (go === true) return send();
|
|
209
|
-
})
|
|
210
|
-
.catch(done);
|
|
211
|
-
};
|
|
212
|
-
const busy = adding || checking;
|
|
213
|
-
|
|
214
|
-
const isLoading = loading || passkeys === undefined;
|
|
215
|
-
const items = passkeys ?? [];
|
|
216
|
-
|
|
217
|
-
const body = (() => {
|
|
218
|
-
if (unavailable != null && unavailable !== false) {
|
|
219
|
-
return <EmptyState variant="inline" size="sm" icon={<KeyRound />} title={unavailable} />;
|
|
220
|
-
}
|
|
221
|
-
return (
|
|
222
|
-
<>
|
|
223
|
-
{isLoading ? (
|
|
224
|
-
<Skeleton lines={2} label={labels.loading} />
|
|
225
|
-
) : items.length === 0 ? (
|
|
226
|
-
<EmptyState variant="inline" size="sm" icon={<KeyRound />} title={labels.empty} />
|
|
227
|
-
) : (
|
|
228
|
-
<ul aria-label={labels.list} className="divide-y divide-subtle">
|
|
229
|
-
{items.map((item) => (
|
|
230
|
-
<PasskeyRow
|
|
231
|
-
key={item.id}
|
|
232
|
-
item={item}
|
|
233
|
-
created={date(item.createdAt)}
|
|
234
|
-
lastUsed={date(item.lastUsedAt)}
|
|
235
|
-
attributes={rowProps?.(item)}
|
|
236
|
-
busy={busyId !== undefined && busyId !== null && busyId === item.id}
|
|
237
|
-
locked={lock.locked}
|
|
238
|
-
onRename={onRename}
|
|
239
|
-
onDelete={onDelete}
|
|
240
|
-
labels={labels}
|
|
241
|
-
/>
|
|
242
|
-
))}
|
|
243
|
-
</ul>
|
|
244
|
-
)}
|
|
245
|
-
<div className="space-y-2 pt-1">
|
|
246
|
-
{nameField && (
|
|
247
|
-
<Input
|
|
248
|
-
label={labels.nameLabel}
|
|
249
|
-
placeholder={labels.namePlaceholder}
|
|
250
|
-
value={name}
|
|
251
|
-
maxLength={120}
|
|
252
|
-
onChange={(e) => setName(e.target.value)}
|
|
253
|
-
onKeyDown={(e: KeyboardEvent<HTMLInputElement>) => {
|
|
254
|
-
if (e.key === "Enter") {
|
|
255
|
-
e.preventDefault();
|
|
256
|
-
add();
|
|
257
|
-
}
|
|
258
|
-
}}
|
|
259
|
-
/>
|
|
260
|
-
)}
|
|
261
|
-
<Button onClick={add} commit={COMMIT_EXCEPT_BILLING} disabled={busy} aria-busy={busy || undefined}>
|
|
262
|
-
<KeyRound className="size-4" aria-hidden />
|
|
263
|
-
{adding ? labels.adding : labels.add}
|
|
264
|
-
</Button>
|
|
265
|
-
</div>
|
|
266
|
-
</>
|
|
267
|
-
);
|
|
268
|
-
})();
|
|
269
|
-
|
|
270
|
-
return (
|
|
271
|
-
// `rest` is only `id` and `data-*`: everything else the props name is destructured.
|
|
272
|
-
<Card {...rest} className={cn("p-4 space-y-3", className)}>
|
|
273
|
-
<div>
|
|
274
|
-
<SettingsCardTitle>{labels.title}</SettingsCardTitle>
|
|
275
|
-
<div className="text-xs text-muted">
|
|
276
|
-
{mode === "alongside" ? labels.descriptionAlongside : labels.description}
|
|
277
|
-
</div>
|
|
278
|
-
</div>
|
|
279
|
-
{body}
|
|
280
|
-
</Card>
|
|
281
|
-
);
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
type RowMode = "view" | "rename" | "delete";
|
|
285
|
-
|
|
286
|
-
function PasskeyRow<Id extends PasskeyId>({
|
|
287
|
-
item,
|
|
288
|
-
created,
|
|
289
|
-
lastUsed,
|
|
290
|
-
attributes,
|
|
291
|
-
busy,
|
|
292
|
-
locked,
|
|
293
|
-
onRename,
|
|
294
|
-
onDelete,
|
|
295
|
-
labels,
|
|
296
|
-
}: {
|
|
297
|
-
item: PasskeyItem<Id>;
|
|
298
|
-
created: string | null;
|
|
299
|
-
lastUsed: string | null;
|
|
300
|
-
attributes?: { id?: string } & PasskeyDataAttributes;
|
|
301
|
-
busy: boolean;
|
|
302
|
-
/** A write lock holds: the rename field's Enter saves nothing. */
|
|
303
|
-
locked: boolean;
|
|
304
|
-
onRename?: PasskeysSettingProps<Id>["onRename"];
|
|
305
|
-
onDelete?: PasskeysSettingProps<Id>["onDelete"];
|
|
306
|
-
labels: PasskeysSettingLabels;
|
|
307
|
-
}) {
|
|
308
|
-
const [mode, setMode] = useState<RowMode>("view");
|
|
309
|
-
const [draft, setDraft] = useState(item.name);
|
|
310
|
-
// Which button opened the sub-mode, so leaving it puts focus back there — the field or
|
|
311
|
-
// the confirm unmounts under the focus, which otherwise falls to <body>. InlineConfirm
|
|
312
|
-
// returns it on Cancel and Escape; this also covers a delete that succeeded while the
|
|
313
|
-
// row stayed (the list not refreshed yet) and a rename.
|
|
314
|
-
const [returnTo, setReturnTo] = useState<"rename" | "delete" | null>(null);
|
|
315
|
-
const renameRef = useRef<HTMLInputElement>(null);
|
|
316
|
-
const renameButtonRef = useRef<HTMLButtonElement>(null);
|
|
317
|
-
const deleteButtonRef = useRef<HTMLButtonElement>(null);
|
|
318
|
-
|
|
319
|
-
useEffect(() => {
|
|
320
|
-
if (mode === "rename") renameRef.current?.select();
|
|
321
|
-
else if (mode === "view" && returnTo) (returnTo === "rename" ? renameButtonRef : deleteButtonRef).current?.focus();
|
|
322
|
-
}, [mode, returnTo]);
|
|
323
|
-
|
|
324
|
-
const open = (next: "rename" | "delete") => {
|
|
325
|
-
setReturnTo(next);
|
|
326
|
-
setDraft(item.name);
|
|
327
|
-
setMode(next);
|
|
328
|
-
};
|
|
329
|
-
const leave = () => setMode("view");
|
|
330
|
-
|
|
331
|
-
const saveRename = () => {
|
|
332
|
-
const next = draft.trim();
|
|
333
|
-
if (!onRename || !next || busy || locked) return;
|
|
334
|
-
if (next === item.name) {
|
|
335
|
-
leave();
|
|
336
|
-
return;
|
|
337
|
-
}
|
|
338
|
-
Promise.resolve(onRename(item.id, next))
|
|
339
|
-
.then(leave)
|
|
340
|
-
.catch(() => {});
|
|
341
|
-
};
|
|
342
|
-
|
|
343
|
-
const confirmDelete = () => {
|
|
344
|
-
if (!onDelete || busy) return;
|
|
345
|
-
// The row unmounts once the list refreshes; on a failure it stays, confirm open.
|
|
346
|
-
Promise.resolve(onDelete(item.id))
|
|
347
|
-
.then(() => setMode("view"))
|
|
348
|
-
.catch(() => {});
|
|
349
|
-
};
|
|
350
|
-
|
|
351
|
-
// On every mode's <li>, so an id the app scrolls to survives a rename or a confirm.
|
|
352
|
-
const li = { ...attributes, "data-passkey-id": String(item.id) };
|
|
353
|
-
|
|
354
|
-
const meta = [created && labels.created(created), lastUsed ? labels.lastUsed(lastUsed) : labels.neverUsed]
|
|
355
|
-
.filter(Boolean)
|
|
356
|
-
.join(" · ");
|
|
357
|
-
|
|
358
|
-
if (mode === "rename") {
|
|
359
|
-
return (
|
|
360
|
-
<li {...li} className="flex flex-wrap items-center gap-2 py-2">
|
|
361
|
-
<Input
|
|
362
|
-
ref={renameRef}
|
|
363
|
-
aria-label={labels.renameField(item.name)}
|
|
364
|
-
className="min-w-0 flex-1"
|
|
365
|
-
value={draft}
|
|
366
|
-
maxLength={120}
|
|
367
|
-
onChange={(e) => setDraft(e.target.value)}
|
|
368
|
-
onKeyDown={(e: KeyboardEvent<HTMLInputElement>) => {
|
|
369
|
-
if (e.key === "Enter") {
|
|
370
|
-
e.preventDefault();
|
|
371
|
-
saveRename();
|
|
372
|
-
} else if (e.key === "Escape") {
|
|
373
|
-
e.preventDefault();
|
|
374
|
-
e.stopPropagation();
|
|
375
|
-
leave();
|
|
376
|
-
}
|
|
377
|
-
}}
|
|
378
|
-
/>
|
|
379
|
-
<Button size="sm" onClick={saveRename} commit={COMMIT_EXCEPT_BILLING} disabled={busy || !draft.trim()}>
|
|
380
|
-
{labels.save}
|
|
381
|
-
</Button>
|
|
382
|
-
<Button size="sm" variant="ghost" onClick={leave}>
|
|
383
|
-
{labels.cancel}
|
|
384
|
-
</Button>
|
|
385
|
-
</li>
|
|
386
|
-
);
|
|
387
|
-
}
|
|
388
|
-
|
|
389
|
-
if (mode === "delete") {
|
|
390
|
-
return (
|
|
391
|
-
<InlineConfirm
|
|
392
|
-
as="li"
|
|
393
|
-
{...li}
|
|
394
|
-
className="py-2"
|
|
395
|
-
prompt={labels.deleteConfirm(item.name)}
|
|
396
|
-
confirmLabel={labels.confirmDelete}
|
|
397
|
-
cancelLabel={labels.cancel}
|
|
398
|
-
onConfirm={confirmDelete}
|
|
399
|
-
onLeave={leave}
|
|
400
|
-
busy={busy}
|
|
401
|
-
commit={COMMIT_EXCEPT_BILLING}
|
|
402
|
-
returnFocusRef={deleteButtonRef}
|
|
403
|
-
/>
|
|
404
|
-
);
|
|
405
|
-
}
|
|
406
|
-
|
|
407
|
-
return (
|
|
408
|
-
<li {...li} className="flex items-center gap-3 py-2">
|
|
409
|
-
<KeyRound className="size-4 shrink-0 text-muted" aria-hidden />
|
|
410
|
-
<div className="min-w-0 flex-1">
|
|
411
|
-
{/* The passkey's own name, which its owner typed: cut at Normal, wrapped from
|
|
412
|
-
Large up (text size §10.17; round 0.34 T1: the sweep read "MacBook To…"). */}
|
|
413
|
-
<div className="truncate-until-large text-sm font-medium">{item.name}</div>
|
|
414
|
-
<div className="text-xs text-muted">{meta}</div>
|
|
415
|
-
</div>
|
|
416
|
-
{onRename && (
|
|
417
|
-
<Button
|
|
418
|
-
ref={renameButtonRef}
|
|
419
|
-
size="sm"
|
|
420
|
-
variant="ghost"
|
|
421
|
-
commit={COMMIT_EXCEPT_BILLING}
|
|
422
|
-
disabled={busy}
|
|
423
|
-
onClick={() => open("rename")}
|
|
424
|
-
aria-label={labels.renameItem(item.name)}
|
|
425
|
-
>
|
|
426
|
-
{labels.rename}
|
|
427
|
-
</Button>
|
|
428
|
-
)}
|
|
429
|
-
{onDelete && (
|
|
430
|
-
<Button
|
|
431
|
-
ref={deleteButtonRef}
|
|
432
|
-
size="sm"
|
|
433
|
-
variant="ghost"
|
|
434
|
-
tone="danger"
|
|
435
|
-
commit={COMMIT_EXCEPT_BILLING}
|
|
436
|
-
disabled={busy}
|
|
437
|
-
onClick={() => open("delete")}
|
|
438
|
-
aria-label={labels.deleteItem(item.name)}
|
|
439
|
-
>
|
|
440
|
-
{labels.delete}
|
|
441
|
-
</Button>
|
|
442
|
-
)}
|
|
443
|
-
</li>
|
|
444
|
-
);
|
|
445
|
-
}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
// The English words of ./sessions-setting, in a module with no component code: the English
|
|
2
|
-
// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one
|
|
3
|
-
// chunk like the other languages (0.34, KS U8). ./sessions-setting re-exports them.
|
|
4
|
-
|
|
5
|
-
import type { SessionsLabels } from "./sessions-setting";
|
|
6
|
-
|
|
7
|
-
export const DEFAULT_SESSIONS_LABELS: SessionsLabels = {
|
|
8
|
-
title: "Sessions",
|
|
9
|
-
description: "Signed in on a device you no longer use, or don’t trust? Sign out everywhere.",
|
|
10
|
-
signOutEverywhere: "Sign out everywhere…",
|
|
11
|
-
signOutEverywherePrompt:
|
|
12
|
-
"This ends every session, including this one: you will be signed out on this device too, and sign in again from here.",
|
|
13
|
-
confirmSignOutEverywhere: "Sign out everywhere",
|
|
14
|
-
list: "Where you’re signed in",
|
|
15
|
-
loading: "Loading sessions…",
|
|
16
|
-
empty: "No sessions to show.",
|
|
17
|
-
current: "This device",
|
|
18
|
-
unknownDevice: "Unknown device",
|
|
19
|
-
lastActive: (when) => `Last active ${when}`,
|
|
20
|
-
ip: (address) => `IP ${address}`,
|
|
21
|
-
revoke: "Sign out",
|
|
22
|
-
revokeItem: (device) => `Sign out ${device}`,
|
|
23
|
-
failed: "That didn’t work. Please try again.",
|
|
24
|
-
};
|