@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,335 +0,0 @@
|
|
|
1
|
-
import { useId, type ReactNode } from "react";
|
|
2
|
-
import { Circle, CircleCheck, Clock, Play } from "lucide-react";
|
|
3
|
-
import { cn } from "../lib/cn";
|
|
4
|
-
import { useDayFormatter } from "../lib/day-format";
|
|
5
|
-
import { matchesSearch, searchWords } from "../lib/text-match";
|
|
6
|
-
import { useKitLabels, useKitLocale, type LabelOverride } from "../i18n/kit-labels";
|
|
7
|
-
import { Button } from "../components/button";
|
|
8
|
-
import { Card } from "../components/card";
|
|
9
|
-
import { Chip } from "../components/chip";
|
|
10
|
-
import { Caption } from "../components/text";
|
|
11
|
-
import { EmptyState } from "../components/empty-state";
|
|
12
|
-
import { SearchField } from "../components/search-field";
|
|
13
|
-
import { Select } from "../components/select";
|
|
14
|
-
import { ToggleGroup } from "../components/toggle-group";
|
|
15
|
-
import { DEFAULT_TOUR_CATALOGUE_LABELS, type TourCatalogueLabels } from "./tour-catalogue-labels";
|
|
16
|
-
import { isTourDone, isTourNew, isTourReset, type TourCompletions, type TourGroup, type TourInfo } from "./tour-info";
|
|
17
|
-
import type { TourCatalogueFilter, TourStateFilter } from "./use-tour-url-sync";
|
|
18
|
-
|
|
19
|
-
export { DEFAULT_TOUR_CATALOGUE_LABELS };
|
|
20
|
-
export type { TourCatalogueLabels };
|
|
21
|
-
|
|
22
|
-
/* ── The card ───────────────────────────────────────────────────────────────── */
|
|
23
|
-
|
|
24
|
-
export interface TourCatalogueCardProps {
|
|
25
|
-
tour: TourInfo;
|
|
26
|
-
/** The completion's ISO timestamp, `null` for one without a date; absent while untaken. */
|
|
27
|
-
completedAt?: string | null;
|
|
28
|
-
/** NEW — `isTourNew`. The catalogue works it out; a card on its own is told. */
|
|
29
|
-
isNew?: boolean;
|
|
30
|
-
onLaunch: (id: string) => void;
|
|
31
|
-
/** "Mark as not done". Without it, the link is not drawn. */
|
|
32
|
-
onReset?: (id: string) => void;
|
|
33
|
-
/**
|
|
34
|
-
* Formats the completion and update days. Default (0.52): the `<UiKitProvider formatDate>`
|
|
35
|
-
* when the app set one — its date preference, no weekday: the day sits in a sentence —
|
|
36
|
-
* else the kit's medium date in the provider's locale and `timeZone`. It gets the
|
|
37
|
-
* completion's ISO instant and the update's bare `"YYYY-MM-DD"` (`updated.date`): read the
|
|
38
|
-
* bare day on its calendar (the kit's `formatDate`, `parseIsoDate`), never `new Date(day)`,
|
|
39
|
-
* which is UTC midnight and the day before west of UTC (round 0.45, N9). An empty answer
|
|
40
|
-
* falls back to the kit's.
|
|
41
|
-
*/
|
|
42
|
-
formatDate?: (iso: string) => string;
|
|
43
|
-
labels?: LabelOverride<TourCatalogueLabels>;
|
|
44
|
-
className?: string;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* One tour's card — keksdose's (tours-page.tsx `TourCard`, dev#557), laid out top to
|
|
49
|
-
* bottom so the cards sit side by side: the state icon beside a column holding the tour's
|
|
50
|
-
* icon, title, NEW (or "Updated", §8) and the app's `badge`, the one-liner and, from `sm`,
|
|
51
|
-
* the longer account. The foot is pinned to the bottom edge, so every Start in a row of
|
|
52
|
-
* cards lands on one line: the points chip, the step count and the duration, the
|
|
53
|
-
* completion (or reset) line, "Mark as not done" and Start / Replay. Points, steps and
|
|
54
|
-
* duration are each left out when the tour has none — no gap, no "0 points" (KS).
|
|
55
|
-
*/
|
|
56
|
-
export function TourCatalogueCard({
|
|
57
|
-
tour,
|
|
58
|
-
completedAt,
|
|
59
|
-
isNew = false,
|
|
60
|
-
onLaunch,
|
|
61
|
-
onReset,
|
|
62
|
-
formatDate: formatDateProp,
|
|
63
|
-
labels: labelsProp,
|
|
64
|
-
className,
|
|
65
|
-
}: TourCatalogueCardProps) {
|
|
66
|
-
const words = useKitLabels("tourCatalogue", DEFAULT_TOUR_CATALOGUE_LABELS, labelsProp);
|
|
67
|
-
const day = useDayFormatter(formatDateProp);
|
|
68
|
-
const titleId = useId();
|
|
69
|
-
const done = isTourDone(tour, completedAt);
|
|
70
|
-
const reset = isTourReset(tour, completedAt);
|
|
71
|
-
const hasFacts = tour.points != null || tour.steps != null || tour.duration != null;
|
|
72
|
-
const note = done
|
|
73
|
-
? completedAt
|
|
74
|
-
? words.completedOn(day(completedAt))
|
|
75
|
-
: words.completed
|
|
76
|
-
: reset && tour.updated
|
|
77
|
-
? words.resetOn(day(tour.updated.date), tour.updated.reason)
|
|
78
|
-
: null;
|
|
79
|
-
|
|
80
|
-
return (
|
|
81
|
-
<Card className={cn("flex h-full flex-col p-4", className)}>
|
|
82
|
-
{/* Title, one-liner and the long body share ONE left edge, in the column beside the
|
|
83
|
-
state icon. */}
|
|
84
|
-
<div className="flex flex-1 items-start gap-3">
|
|
85
|
-
<div className={cn("mt-0.5 shrink-0", done ? "text-success" : "text-muted")}>
|
|
86
|
-
{done ? <CircleCheck aria-hidden className="size-5" /> : <Circle aria-hidden className="size-5" />}
|
|
87
|
-
<span className="sr-only">{done ? words.completed : words.notCompleted}</span>
|
|
88
|
-
</div>
|
|
89
|
-
<div className="min-w-0 flex-1">
|
|
90
|
-
<div className="flex flex-wrap items-center gap-2">
|
|
91
|
-
{tour.icon != null && (
|
|
92
|
-
<span aria-hidden className="inline-flex shrink-0 text-brand [&_svg]:size-4">
|
|
93
|
-
{tour.icon}
|
|
94
|
-
</span>
|
|
95
|
-
)}
|
|
96
|
-
{/* The id on the words, not the heading: the Start button is described by them. */}
|
|
97
|
-
<h3 className="font-medium">
|
|
98
|
-
<span id={titleId}>{tour.title}</span>
|
|
99
|
-
</h3>
|
|
100
|
-
{/* It retires itself the moment the tour is taken — nothing to dismiss. */}
|
|
101
|
-
{isNew && !reset && (
|
|
102
|
-
<Chip size="sm" tone="brand" caps className="px-1.5">
|
|
103
|
-
{words.badgeNew}
|
|
104
|
-
</Chip>
|
|
105
|
-
)}
|
|
106
|
-
{reset && (
|
|
107
|
-
<Chip size="sm" tone="brand" caps className="px-1.5">
|
|
108
|
-
{words.badgeUpdated}
|
|
109
|
-
</Chip>
|
|
110
|
-
)}
|
|
111
|
-
{tour.badge}
|
|
112
|
-
</div>
|
|
113
|
-
{tour.description && <p className="mt-1 text-sm text-muted">{tour.description}</p>}
|
|
114
|
-
{/* `hidden sm:block`: one card per row is the phone, where these paragraphs
|
|
115
|
-
would turn the page into a scroll; the search still reads them. */}
|
|
116
|
-
{tour.about && <p className="mt-2 hidden text-sm leading-relaxed text-secondary sm:block">{tour.about}</p>}
|
|
117
|
-
</div>
|
|
118
|
-
</div>
|
|
119
|
-
<div className="mt-3 flex flex-wrap items-end justify-between gap-2">
|
|
120
|
-
<div className="min-w-0">
|
|
121
|
-
{hasFacts && (
|
|
122
|
-
<div className="flex flex-wrap items-center gap-1.5">
|
|
123
|
-
{tour.points != null && (
|
|
124
|
-
<Chip size="sm" tone="brand">
|
|
125
|
-
{words.points(tour.points)}
|
|
126
|
-
</Chip>
|
|
127
|
-
)}
|
|
128
|
-
{tour.steps != null && <Caption as="span">{words.steps(tour.steps)}</Caption>}
|
|
129
|
-
{tour.duration != null && (
|
|
130
|
-
<Caption as="span" className="inline-flex items-center gap-1">
|
|
131
|
-
<Clock aria-hidden className="size-3" />
|
|
132
|
-
{words.duration(tour.duration)}
|
|
133
|
-
</Caption>
|
|
134
|
-
)}
|
|
135
|
-
</div>
|
|
136
|
-
)}
|
|
137
|
-
{note && <p className={cn("text-xs text-muted", hasFacts && "mt-1")}>{note}</p>}
|
|
138
|
-
</div>
|
|
139
|
-
<div className="flex shrink-0 items-center gap-2">
|
|
140
|
-
{done && onReset && (
|
|
141
|
-
<Button variant="link" tone="muted" size="sm" aria-describedby={titleId} onClick={() => onReset(tour.id)}>
|
|
142
|
-
{words.markUndone}
|
|
143
|
-
</Button>
|
|
144
|
-
)}
|
|
145
|
-
<Button aria-describedby={titleId} onClick={() => onLaunch(tour.id)}>
|
|
146
|
-
<Play aria-hidden className="size-4" /> {done ? words.replay : words.start}
|
|
147
|
-
</Button>
|
|
148
|
-
</div>
|
|
149
|
-
</div>
|
|
150
|
-
</Card>
|
|
151
|
-
);
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
/* ── The page body ─────────────────────────────────────────────────────────── */
|
|
155
|
-
|
|
156
|
-
export interface TourCatalogueProps extends TourCatalogueFilter {
|
|
157
|
-
/** The tours this person may take, already filtered by role and data (§6.3). */
|
|
158
|
-
tours: readonly TourInfo[];
|
|
159
|
-
/** The sections, in the app's order. A tour whose group is not here is not listed. */
|
|
160
|
-
groups: readonly TourGroup[];
|
|
161
|
-
completed: TourCompletions;
|
|
162
|
-
/** The account's `created_at`: a tour shipped after it, untaken, is NEW. Unknown → none is. */
|
|
163
|
-
joined?: string | null;
|
|
164
|
-
/** A filter changed — `{query}`, `{group}`, `{state}`, or all three for "Clear filters". */
|
|
165
|
-
onChange: (patch: Partial<TourCatalogueFilter>) => void;
|
|
166
|
-
onLaunch: (id: string) => void;
|
|
167
|
-
/** "Mark as not done" — `useTourProgress().reset`. */
|
|
168
|
-
onReset?: (id: string) => void;
|
|
169
|
-
/** Above the filter bar: the app's page header with its points tile (§6.1). */
|
|
170
|
-
header?: ReactNode;
|
|
171
|
-
/** Each card's `formatDate`: see {@link TourCatalogueCardProps.formatDate} (a bare day for the update). */
|
|
172
|
-
formatDate?: (iso: string) => string;
|
|
173
|
-
/** The search's locale (case folding). Default: the provider's. */
|
|
174
|
-
locale?: string;
|
|
175
|
-
labels?: LabelOverride<TourCatalogueLabels>;
|
|
176
|
-
className?: string;
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
const STATE_FILTERS: readonly TourStateFilter[] = ["all", "todo", "done"];
|
|
180
|
-
|
|
181
|
-
/**
|
|
182
|
-
* The tours page's body (docs/tours-harmonization.md §2.1, §3) — keksdose's /tours:
|
|
183
|
-
*
|
|
184
|
-
* - **The filter bar**: a search, a group select and an all / to do / done toggle,
|
|
185
|
-
* stacked below `lg` and side by side from it. Each count is what the OTHER filters
|
|
186
|
-
* leave: the toggle counts the search and the group, each group the search and the
|
|
187
|
-
* state. Under it, while a filter is on, "Showing X of Y tours".
|
|
188
|
-
* - **The sections**: one per group, in the app's order — an h2 with its icon and help
|
|
189
|
-
* line over a `sm:2 / xl:3` grid of `TourCatalogueCard`s. A group the filters empty is
|
|
190
|
-
* hidden; when nothing is left, an empty state with "Clear filters".
|
|
191
|
-
* - **Controlled**: `query`, `group`, `state` and `onChange`, so the app keeps them in its
|
|
192
|
-
* URL (`useTourCatalogueUrlState`).
|
|
193
|
-
*
|
|
194
|
-
* A tour reset by an update (§8) is "to do" for the toggle and the counts.
|
|
195
|
-
*/
|
|
196
|
-
export function TourCatalogue({
|
|
197
|
-
tours,
|
|
198
|
-
groups,
|
|
199
|
-
completed,
|
|
200
|
-
joined,
|
|
201
|
-
query,
|
|
202
|
-
group: groupProp,
|
|
203
|
-
state: stateProp,
|
|
204
|
-
onChange,
|
|
205
|
-
onLaunch,
|
|
206
|
-
onReset,
|
|
207
|
-
header,
|
|
208
|
-
formatDate,
|
|
209
|
-
locale: localeProp,
|
|
210
|
-
labels: labelsProp,
|
|
211
|
-
className,
|
|
212
|
-
}: TourCatalogueProps) {
|
|
213
|
-
const words = useKitLabels("tourCatalogue", DEFAULT_TOUR_CATALOGUE_LABELS, labelsProp);
|
|
214
|
-
const uid = useId();
|
|
215
|
-
const locale = useKitLocale(localeProp);
|
|
216
|
-
// A group or state the list does not have is no filter at all (an old link).
|
|
217
|
-
const group = groups.some((g) => g.id === groupProp) ? groupProp : null;
|
|
218
|
-
const state = STATE_FILTERS.includes(stateProp) ? stateProp : "all";
|
|
219
|
-
|
|
220
|
-
const listed = tours.filter((t) => groups.some((g) => g.id === t.group));
|
|
221
|
-
const done = (tour: TourInfo) => isTourDone(tour, completed[tour.id]);
|
|
222
|
-
// Every word somewhere in the title, the one-liner or the about — "budget visits" finds
|
|
223
|
-
// "Your budget" whose about says "Visits the budget page" — as every kit list searches
|
|
224
|
-
// since 0.51.4 (refactor audit 2026-10-30, DUP-4: the whole query had to be one
|
|
225
|
-
// substring of one text).
|
|
226
|
-
// `|| undefined`: an app's JSON says `null` where TourInfo says absent, and
|
|
227
|
-
// `matchesSearch` leaves out only `undefined` — `"about": null` threw on the first letter
|
|
228
|
-
// typed, as the old matcher's `!!text` never did (0.52 code review, tour-catalogue.tsx).
|
|
229
|
-
const queryWords = searchWords(query, locale);
|
|
230
|
-
const matchesQuery = (tour: TourInfo) =>
|
|
231
|
-
matchesSearch(
|
|
232
|
-
queryWords,
|
|
233
|
-
[tour.title || undefined, tour.description || undefined, tour.about || undefined],
|
|
234
|
-
locale,
|
|
235
|
-
);
|
|
236
|
-
const inState = (tour: TourInfo) => (state === "all" ? true : state === "done" ? done(tour) : !done(tour));
|
|
237
|
-
const inGroup = (tour: TourInfo, id: string | null = group) => id === null || tour.group === id;
|
|
238
|
-
|
|
239
|
-
const found = listed.filter((t) => matchesQuery(t) && inGroup(t));
|
|
240
|
-
const foundDone = found.filter(done).length;
|
|
241
|
-
const visible = found.filter(inState);
|
|
242
|
-
const groupCount = (id: string | null) =>
|
|
243
|
-
listed.filter((t) => matchesQuery(t) && inState(t) && inGroup(t, id)).length;
|
|
244
|
-
const filtering = queryWords.length > 0 || state !== "all" || group !== null;
|
|
245
|
-
const sections = groups
|
|
246
|
-
.map((g) => ({ ...g, tours: visible.filter((t) => t.group === g.id) }))
|
|
247
|
-
.filter((g) => g.tours.length > 0);
|
|
248
|
-
|
|
249
|
-
return (
|
|
250
|
-
<div className={cn("space-y-4", className)}>
|
|
251
|
-
{header}
|
|
252
|
-
<div className="flex flex-col gap-2 lg:flex-row lg:items-center">
|
|
253
|
-
<SearchField
|
|
254
|
-
className="lg:max-w-xs lg:flex-1"
|
|
255
|
-
value={query}
|
|
256
|
-
onChange={(value) => onChange({ query: value })}
|
|
257
|
-
aria-label={words.searchLabel}
|
|
258
|
-
placeholder={words.searchPlaceholder}
|
|
259
|
-
/>
|
|
260
|
-
{/* A select, not a chip per group: on a phone those wrap into rows above the list
|
|
261
|
-
they filter, and an app may have ten groups (ka F8). Named, not labelled: a
|
|
262
|
-
floating label makes it taller than the search box beside it (dev #589). */}
|
|
263
|
-
<Select
|
|
264
|
-
className="lg:w-60"
|
|
265
|
-
aria-label={words.groupLabel}
|
|
266
|
-
value={group ?? ""}
|
|
267
|
-
onChange={(event) => onChange({ group: event.target.value || null })}
|
|
268
|
-
>
|
|
269
|
-
<option value="">{words.groupAll(groupCount(null))}</option>
|
|
270
|
-
{groups.map((g) => (
|
|
271
|
-
<option key={g.id} value={g.id}>
|
|
272
|
-
{words.groupOption(g.title, groupCount(g.id))}
|
|
273
|
-
</option>
|
|
274
|
-
))}
|
|
275
|
-
</Select>
|
|
276
|
-
<ToggleGroup
|
|
277
|
-
value={state}
|
|
278
|
-
onChange={(value: TourStateFilter) => onChange({ state: value })}
|
|
279
|
-
aria-label={words.stateLabel}
|
|
280
|
-
className="lg:w-auto"
|
|
281
|
-
options={[
|
|
282
|
-
{ value: "all", label: words.stateAll(found.length) },
|
|
283
|
-
{ value: "todo", label: words.stateTodo(found.length - foundDone) },
|
|
284
|
-
{ value: "done", label: words.stateDone(foundDone) },
|
|
285
|
-
]}
|
|
286
|
-
/>
|
|
287
|
-
</div>
|
|
288
|
-
{filtering && (
|
|
289
|
-
<p role="status" className="-mt-2 text-xs text-muted">
|
|
290
|
-
{words.showing(visible.length, listed.length)}
|
|
291
|
-
</p>
|
|
292
|
-
)}
|
|
293
|
-
|
|
294
|
-
{visible.length === 0 ? (
|
|
295
|
-
<div className="space-y-3">
|
|
296
|
-
<EmptyState title={words.noMatches} hint={words.noMatchesHint} />
|
|
297
|
-
<div className="flex justify-center">
|
|
298
|
-
<Button variant="secondary" onClick={() => onChange({ query: "", group: null, state: "all" })}>
|
|
299
|
-
{words.clearFilters}
|
|
300
|
-
</Button>
|
|
301
|
-
</div>
|
|
302
|
-
</div>
|
|
303
|
-
) : (
|
|
304
|
-
// A GRID, never columns: a section holding one card keeps a cell's width.
|
|
305
|
-
sections.map((section) => (
|
|
306
|
-
<section key={section.id} aria-labelledby={`${uid}-${section.id}`} className="space-y-3">
|
|
307
|
-
<h2 id={`${uid}-${section.id}`} className="flex items-center gap-1.5 text-sm font-semibold text-muted">
|
|
308
|
-
{section.icon != null && (
|
|
309
|
-
<span aria-hidden className="inline-flex shrink-0 [&_svg]:size-4">
|
|
310
|
-
{section.icon}
|
|
311
|
-
</span>
|
|
312
|
-
)}
|
|
313
|
-
{section.title}
|
|
314
|
-
</h2>
|
|
315
|
-
{section.help && <p className="-mt-2 text-xs text-muted">{section.help}</p>}
|
|
316
|
-
<div className="grid gap-3 sm:grid-cols-2 xl:grid-cols-3">
|
|
317
|
-
{section.tours.map((tour) => (
|
|
318
|
-
<TourCatalogueCard
|
|
319
|
-
key={tour.id}
|
|
320
|
-
tour={tour}
|
|
321
|
-
completedAt={completed[tour.id]}
|
|
322
|
-
isNew={isTourNew({ since: tour.since, joined, completed: completed[tour.id] !== undefined })}
|
|
323
|
-
onLaunch={onLaunch}
|
|
324
|
-
onReset={onReset}
|
|
325
|
-
formatDate={formatDate}
|
|
326
|
-
labels={labelsProp}
|
|
327
|
-
/>
|
|
328
|
-
))}
|
|
329
|
-
</div>
|
|
330
|
-
</section>
|
|
331
|
-
))
|
|
332
|
-
)}
|
|
333
|
-
</div>
|
|
334
|
-
);
|
|
335
|
-
}
|
package/src/tour/tour-dock.ts
DELETED
|
@@ -1,134 +0,0 @@
|
|
|
1
|
-
import type { CSSProperties } from "react";
|
|
2
|
-
import { readKeyboardInset } from "../hooks/use-anchored-panel";
|
|
3
|
-
|
|
4
|
-
/*
|
|
5
|
-
* # The docked card (docs/tours-harmonization.md §11.7, contract round 054 §6)
|
|
6
|
-
*
|
|
7
|
-
* On a phone a field step's card is pinned full-width to the top or bottom edge of the
|
|
8
|
-
* USABLE BAND — the visual viewport less the keyboard, raised above the highest
|
|
9
|
-
* `[data-tour-obstruction]` (the number pad, a picker sheet) — on the edge away from the
|
|
10
|
-
* spotlighted field, so it covers neither the field nor the keyboard nor the pad.
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
export type DockEdge = "top" | "bottom";
|
|
14
|
-
|
|
15
|
-
export interface DockRect {
|
|
16
|
-
top: number;
|
|
17
|
-
left: number;
|
|
18
|
-
width: number;
|
|
19
|
-
height: number;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
/** The band, in layout-viewport px (what `position: fixed` measures from). */
|
|
23
|
-
export interface Band {
|
|
24
|
-
top: number;
|
|
25
|
-
bottom: number;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
/** The gutter between the card and the band's edge, and between the card and the field. */
|
|
29
|
-
const GUTTER = 8;
|
|
30
|
-
/** An obstruction whose top is within this of the band's top covers the screen. */
|
|
31
|
-
const FULL_SCREEN_SLACK = 64;
|
|
32
|
-
/** Under this much free space on its edge the card flips (the hysteresis floor). */
|
|
33
|
-
const MIN_DOCK = 140;
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* The usable band now: the visual viewport while a keyboard is up (`readKeyboardInset`'s
|
|
37
|
-
* rules — pinch zoom is not a keyboard, 100 px minimum), else the layout viewport; its
|
|
38
|
-
* bottom raised to the top of the highest visible obstruction that holds neither the field
|
|
39
|
-
* nor the card. An obstruction that starts at the band's top (a full-screen picker, opened
|
|
40
|
-
* over everything) is not a bottom layer and is ignored; a tall one (the number pad at
|
|
41
|
-
* Large text is over half a phone) still counts.
|
|
42
|
-
*/
|
|
43
|
-
export function readBand(target: Element | null, card: Element | null): Band {
|
|
44
|
-
const vh = window.innerHeight;
|
|
45
|
-
let top = 0;
|
|
46
|
-
let bottom = vh;
|
|
47
|
-
const vv = window.visualViewport;
|
|
48
|
-
if (vv && readKeyboardInset() > 0) {
|
|
49
|
-
top = vv.offsetTop;
|
|
50
|
-
bottom = vv.offsetTop + vv.height;
|
|
51
|
-
}
|
|
52
|
-
for (const el of Array.from(document.querySelectorAll("[data-tour-obstruction]"))) {
|
|
53
|
-
if ((target && el.contains(target)) || (card && el.contains(card))) continue;
|
|
54
|
-
const r = el.getBoundingClientRect();
|
|
55
|
-
if (r.width <= 0 || r.height <= 0 || r.top <= top + FULL_SCREEN_SLACK) continue;
|
|
56
|
-
if (r.top < bottom) bottom = r.top;
|
|
57
|
-
}
|
|
58
|
-
return { top, bottom };
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
/** The card's free space on `edge`, between the band's edge and the spotlight. */
|
|
62
|
-
function room(edge: DockEdge, spot: DockRect, band: Band): number {
|
|
63
|
-
return edge === "bottom" ? band.bottom - (spot.top + spot.height) - GUTTER * 2 : spot.top - band.top - GUTTER * 2;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* The edge away from the field: the bottom when the spotlight's centre is in the band's
|
|
68
|
-
* upper half, else the top. With a `previous` edge, it stays unless the card would have to
|
|
69
|
-
* cover the spotlight there (no flip on every keyboard animation frame).
|
|
70
|
-
*/
|
|
71
|
-
export function dockEdge(spot: DockRect, band: Band, previous: DockEdge | null, cardHeight: number): DockEdge {
|
|
72
|
-
const preferred: DockEdge = spot.top + spot.height / 2 < band.top + (band.bottom - band.top) / 2 ? "bottom" : "top";
|
|
73
|
-
if (!previous || previous === preferred) return preferred;
|
|
74
|
-
return room(previous, spot, band) >= Math.min(MIN_DOCK, cardHeight) ? previous : preferred;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
/** The docked card's position: full-width with 8 px (safe-area aware) gutters, its height
|
|
78
|
-
* capped to the free space so its body scrolls and its title and buttons show. */
|
|
79
|
-
export function dockStyle(edge: DockEdge, spot: DockRect | null, band: Band): CSSProperties {
|
|
80
|
-
const vh = window.innerHeight;
|
|
81
|
-
const cap = spot ? Math.max(MIN_DOCK / 2, room(edge, spot, band)) : band.bottom - band.top - GUTTER * 2;
|
|
82
|
-
const base: CSSProperties = {
|
|
83
|
-
left: `max(${GUTTER}px, env(safe-area-inset-left))`,
|
|
84
|
-
right: `max(${GUTTER}px, env(safe-area-inset-right))`,
|
|
85
|
-
width: "auto",
|
|
86
|
-
maxWidth: "none",
|
|
87
|
-
maxHeight: cap,
|
|
88
|
-
};
|
|
89
|
-
if (edge === "top") {
|
|
90
|
-
return {
|
|
91
|
-
...base,
|
|
92
|
-
top: band.top <= 0 ? `max(${GUTTER}px, env(safe-area-inset-top))` : band.top + GUTTER,
|
|
93
|
-
bottom: "auto",
|
|
94
|
-
};
|
|
95
|
-
}
|
|
96
|
-
const fromBottom = vh - band.bottom;
|
|
97
|
-
return {
|
|
98
|
-
...base,
|
|
99
|
-
top: "auto",
|
|
100
|
-
bottom: fromBottom <= 0 ? `max(${GUTTER}px, env(safe-area-inset-bottom))` : fromBottom + GUTTER,
|
|
101
|
-
};
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
/** The target's nearest ancestor that scrolls vertically now (a sheet's body), or null. */
|
|
105
|
-
export function scrollParent(el: Element): HTMLElement | null {
|
|
106
|
-
for (let node = el.parentElement; node && node !== document.body; node = node.parentElement) {
|
|
107
|
-
const { overflowY } = getComputedStyle(node);
|
|
108
|
-
if ((overflowY === "auto" || overflowY === "scroll") && node.scrollHeight > node.clientHeight) return node;
|
|
109
|
-
}
|
|
110
|
-
return null;
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
/**
|
|
114
|
-
* Scroll the field into the half of the band away from the card, through its nearest
|
|
115
|
-
* scrollable ancestor (the window only when there is none — the page behind a sheet never
|
|
116
|
-
* moves). A field already inside that half is left where it is. Returns the edge the card
|
|
117
|
-
* takes.
|
|
118
|
-
*/
|
|
119
|
-
export function scrollIntoFreeHalf(el: Element, card: Element | null, previous: DockEdge | null): DockEdge {
|
|
120
|
-
const r = el.getBoundingClientRect();
|
|
121
|
-
const band = readBand(el, card);
|
|
122
|
-
const edge = dockEdge(r, band, previous, card instanceof HTMLElement ? card.offsetHeight : MIN_DOCK);
|
|
123
|
-
const mid = band.top + (band.bottom - band.top) / 2;
|
|
124
|
-
const half = edge === "bottom" ? { top: band.top + GUTTER, bottom: mid } : { top: mid, bottom: band.bottom - GUTTER };
|
|
125
|
-
if (r.top >= half.top && r.top + r.height <= half.bottom) return edge;
|
|
126
|
-
// Centred in the half, or its top at the half's top when it is taller than the half.
|
|
127
|
-
const delta =
|
|
128
|
-
r.height > half.bottom - half.top ? r.top - half.top : r.top + r.height / 2 - (half.top + half.bottom) / 2;
|
|
129
|
-
const scroller = scrollParent(el);
|
|
130
|
-
if (scroller) scroller.scrollTop += delta;
|
|
131
|
-
// A field in a kit layer with nothing to scroll: the page behind it stays put.
|
|
132
|
-
else if (!el.closest("[data-kit-layer]")) window.scrollBy?.(0, delta);
|
|
133
|
-
return edge;
|
|
134
|
-
}
|
package/src/tour/tour-engine.ts
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 0.50.1 (keksdose N1): the tour engine a launcher is handed as its fourth argument — one
|
|
3
|
-
* object for the life of the provider (or of `useTourUrlSync`) whose fields always read the
|
|
4
|
-
* engine's LATEST render: `engine.active`, `engine.index` after an `await` are current, and
|
|
5
|
-
* `engine.stop()` mid-run stops the run that is up now. Internal: the type is `TourEngine`.
|
|
6
|
-
*
|
|
7
|
-
* `set` is called from a layout effect with each render's engine; `engine` reads it.
|
|
8
|
-
*/
|
|
9
|
-
export function liveEngine<T extends object>(
|
|
10
|
-
keys: readonly (keyof T & string)[],
|
|
11
|
-
initial: T | null = null,
|
|
12
|
-
): { engine: T; set: (current: T) => void } {
|
|
13
|
-
let current = initial;
|
|
14
|
-
const read = () => {
|
|
15
|
-
if (!current) throw new Error("[ui-kit] The tour engine was read before its provider rendered.");
|
|
16
|
-
return current;
|
|
17
|
-
};
|
|
18
|
-
const engine = {} as T;
|
|
19
|
-
for (const key of keys) {
|
|
20
|
-
Object.defineProperty(engine, key, {
|
|
21
|
-
enumerable: true,
|
|
22
|
-
get: () => {
|
|
23
|
-
const value = read()[key];
|
|
24
|
-
// A method is looked up when it is CALLED, so a kept `engine.stop` is the latest too.
|
|
25
|
-
return typeof value === "function"
|
|
26
|
-
? (...args: unknown[]) => (read()[key] as (...a: unknown[]) => unknown)(...args)
|
|
27
|
-
: value;
|
|
28
|
-
},
|
|
29
|
-
});
|
|
30
|
-
}
|
|
31
|
-
return {
|
|
32
|
-
engine,
|
|
33
|
-
set: (next) => {
|
|
34
|
-
current = next;
|
|
35
|
-
},
|
|
36
|
-
};
|
|
37
|
-
}
|