@eifi1/ui-kit 0.54.0 → 0.56.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 +6 -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 +7 -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 +83 -0
- package/dist/components/legended-series-chart.js +77 -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 +9 -12
- 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
package/src/components/card.tsx
DELETED
|
@@ -1,377 +0,0 @@
|
|
|
1
|
-
import { createContext, useContext } from "react";
|
|
2
|
-
import type { ComponentPropsWithoutRef, ComponentPropsWithRef, ReactNode, Ref } from "react";
|
|
3
|
-
import { cn } from "../lib/cn";
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* A `div`'s props, `ref` included since 0.34 — and the same for every Card part (API-2,
|
|
7
|
-
* refactor audit 2026-10, Skeleton's 0.33.1 change). They always reached the element;
|
|
8
|
-
* `ComponentPropsWithoutRef` only kept `ref` out of the type, so keksdose wrapped a Card in
|
|
9
|
-
* a `<div ref>` to scroll it into view (admin-actions-panel).
|
|
10
|
-
*/
|
|
11
|
-
export interface CardProps extends ComponentPropsWithRef<"div"> {
|
|
12
|
-
children: ReactNode;
|
|
13
|
-
/**
|
|
14
|
-
* When true, drop the card chrome (border, rounded corners, shadow) on mobile so the
|
|
15
|
-
* card spans edge-to-edge. Chrome reappears at the `md` breakpoint. Use for primary
|
|
16
|
-
* content cards on data pages; leave off for centered dialog/panel cards.
|
|
17
|
-
*/
|
|
18
|
-
flush?: boolean;
|
|
19
|
-
/**
|
|
20
|
-
* `inset`: a panel INSIDE a card rather than a card on the page — the raised
|
|
21
|
-
* `--bg-surface-2`, a small radius, `p-3` of its own and no border or shadow, since
|
|
22
|
-
* it is already sitting on the card that has them. Lenkbank's results blocks and
|
|
23
|
-
* corner panels write this by hand (`rounded-md bg-surface-2 p-3`) under a Card of
|
|
24
|
-
* their own. Unlike the default card it carries its padding, because every one of
|
|
25
|
-
* those copies wanted the same one; a caller's `p-*` still wins. `flush` is ignored:
|
|
26
|
-
* an inset panel never runs edge to edge.
|
|
27
|
-
*/
|
|
28
|
-
variant?: "default" | "inset" | "outline";
|
|
29
|
-
/**
|
|
30
|
-
* The card's own padding: `none`, `sm` (`p-3`) or `md` (`p-4`).
|
|
31
|
-
*
|
|
32
|
-
* `outline` is the bordered box with no shadow — a row or a block INSIDE a section
|
|
33
|
-
* rather than a card on the page: kastlan's rent breakdown rows
|
|
34
|
-
* (tenancy/components/breakdown-row.tsx, `rounded-lg border p-4`) and the meters
|
|
35
|
-
* list's inline add row (meters/components/meter-add-row.tsx). It takes `md` by
|
|
36
|
-
* default, as every one of those copies does; `sm` is the dense row.
|
|
37
|
-
*
|
|
38
|
-
* Left out, the default card keeps no padding (its CardHeader / CardContent own the
|
|
39
|
-
* rhythm) and `inset` keeps its `p-3`; passing it sets theirs too. A caller's `p-*`
|
|
40
|
-
* in `className` still wins.
|
|
41
|
-
*
|
|
42
|
-
* Whenever the card carries a padding — this prop, or the `inset` / `outline` one —
|
|
43
|
-
* CardHeader, CardContent and CardFooter drop their own `px-6` / `pt-6` / `pb-6`, so
|
|
44
|
-
* the card's padding is the only one. Before 0.16 they kept it regardless and a
|
|
45
|
-
* `padding="md"` card with parts was padded twice (40px a side); keksdose's settings
|
|
46
|
-
* cards zeroed all three parts by hand (`<CardHeader className="p-0">`). A padding set
|
|
47
|
-
* only through `className` cannot be seen from the parts: use the prop.
|
|
48
|
-
*/
|
|
49
|
-
padding?: "none" | "sm" | "md";
|
|
50
|
-
/**
|
|
51
|
-
* A card that is a WARNING (or other status) as a whole: the border in the tone's
|
|
52
|
-
* `-border` colour and the {@link CardTitle} in the tone's text colour. kastlan's
|
|
53
|
-
* dunning summary (invoice-detail-page.tsx:231-235) writes both by hand —
|
|
54
|
-
* `border-[var(--warning-border)]` on the Card, `text-[var(--warning)]` on the title
|
|
55
|
-
* — and the next status card would copy the pair (`outline` takes it the same way).
|
|
56
|
-
* An `inset` panel has no border, so it takes the tone's quiet `-bg` fill instead.
|
|
57
|
-
* `data-tone` is set for a caller's own
|
|
58
|
-
* selectors.
|
|
59
|
-
*/
|
|
60
|
-
tone?: CardTone;
|
|
61
|
-
/**
|
|
62
|
-
* How loud the `tone` frame is. `"strong"`: a 2px border in the tone's strong
|
|
63
|
-
* colour — `--danger-border-strong` for `danger`, `--warning-border-strong` for
|
|
64
|
-
* `warning` (0.33: amber-600 in dark, where `--warning` stood 13:1 off the card and
|
|
65
|
-
* shouted; docs/colour-roles-harmonization.md §5.2), the tone's own text colour
|
|
66
|
-
* (`--info`, `--success`) for the two with no `-border-strong` token of their own.
|
|
67
|
-
* For the one tile on a page that guards something destructive or security-relevant:
|
|
68
|
-
* keksdose's password / delete-account tile (shared/components/password-danger-card.tsx)
|
|
69
|
-
* wrote `toneFrameClass(tone)` over the Card by hand for the 2px rule, and `p-[15px]`
|
|
70
|
-
* under it so the content did not move. Here the extra pixel comes off the padding the
|
|
71
|
-
* same way (`padding` or the variant's own), so a strong card's content sits exactly
|
|
72
|
-
* where a soft one's does.
|
|
73
|
-
*
|
|
74
|
-
* Default `"soft"`: the 1px `-border` it has always been. No effect without `tone`,
|
|
75
|
-
* nor on `inset`, which has no border to make louder (its tone is a fill).
|
|
76
|
-
*/
|
|
77
|
-
toneStrength?: "soft" | "strong";
|
|
78
|
-
/**
|
|
79
|
-
* Wash the card in the tone's quiet `-bg` surface as well as framing it. A toned
|
|
80
|
-
* card is a border and a title colour, at either strength — the wash belongs to
|
|
81
|
-
* `AlertBanner`, the message, not to a card that holds a form — so it stays
|
|
82
|
-
* off by default. Some tiles want both: keksdose's password / delete-account tile
|
|
83
|
-
* was `toneFrameClass(tone)` (border AND wash) before 0.16, and after moving to
|
|
84
|
-
* `toneStrength="strong"` it re-added `bg-[var(--danger-bg)]` by hand. The wash is
|
|
85
|
-
* layered OVER the card's own `--bg-surface` (as AlertBanner's `elevated` does), so
|
|
86
|
-
* the dark theme's translucent tints stay a card, not a hole to the page below.
|
|
87
|
-
*
|
|
88
|
-
* No effect without `tone`, nor on `inset`, whose tone is already the fill.
|
|
89
|
-
*/
|
|
90
|
-
toneFill?: boolean;
|
|
91
|
-
/**
|
|
92
|
-
* The parts' type scale. `"compact"`: CardTitle `text-sm font-medium`,
|
|
93
|
-
* CardDescription `text-xs` and the CardHeader's title-to-description gap
|
|
94
|
-
* `gap-0.5` — the small settings / admin card. keksdose wrote those three classes by
|
|
95
|
-
* hand on ~25 cards. Set here, they reach the parts through context; a class on a
|
|
96
|
-
* part still wins, and a Card nested inside starts again from its own density.
|
|
97
|
-
*
|
|
98
|
-
* Default `"comfortable"`: the parts as they have always been.
|
|
99
|
-
*/
|
|
100
|
-
density?: CardDensity;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
export type CardDensity = "comfortable" | "compact";
|
|
104
|
-
|
|
105
|
-
export type CardTone = "warning" | "danger" | "info" | "success";
|
|
106
|
-
|
|
107
|
-
// The title is reached through its `data-slot`, so the tone needs no context and a
|
|
108
|
-
// caller's `className` on CardTitle still wins (it is on the element itself).
|
|
109
|
-
const CARD_TONES: Record<CardTone, { border: string; fill: string; title: string }> = {
|
|
110
|
-
warning: {
|
|
111
|
-
border: "border-warning",
|
|
112
|
-
fill: "bg-warning-soft",
|
|
113
|
-
title: "[&_[data-slot=card-title]]:text-warning",
|
|
114
|
-
},
|
|
115
|
-
danger: {
|
|
116
|
-
border: "border-danger",
|
|
117
|
-
fill: "bg-danger-soft",
|
|
118
|
-
title: "[&_[data-slot=card-title]]:text-danger",
|
|
119
|
-
},
|
|
120
|
-
info: {
|
|
121
|
-
border: "border-info",
|
|
122
|
-
fill: "bg-info-soft",
|
|
123
|
-
title: "[&_[data-slot=card-title]]:text-info",
|
|
124
|
-
},
|
|
125
|
-
success: {
|
|
126
|
-
border: "border-success",
|
|
127
|
-
fill: "bg-success-soft",
|
|
128
|
-
title: "[&_[data-slot=card-title]]:text-success",
|
|
129
|
-
},
|
|
130
|
-
};
|
|
131
|
-
|
|
132
|
-
const CARD_PADDING: Record<NonNullable<CardProps["padding"]>, string> = {
|
|
133
|
-
none: "p-0",
|
|
134
|
-
sm: "p-3",
|
|
135
|
-
md: "p-4",
|
|
136
|
-
};
|
|
137
|
-
|
|
138
|
-
// The same padding one pixel short, for a 2px `toneStrength="strong"` frame: the
|
|
139
|
-
// border grows inwards by that pixel, so the content stays where the 1px card had it.
|
|
140
|
-
// `calc(rem − 1px)` (0.32, §3.2): the padding grows with the text like `p-3` / `p-4`,
|
|
141
|
-
// the border does not — a fixed 11 / 15 px stopped matching them at 125 %, and toggling
|
|
142
|
-
// the tone shifted the content.
|
|
143
|
-
const CARD_PADDING_STRONG: Record<NonNullable<CardProps["padding"]>, string> = {
|
|
144
|
-
none: "p-0",
|
|
145
|
-
sm: "p-[calc(0.75rem-1px)]",
|
|
146
|
-
md: "p-[calc(1rem-1px)]",
|
|
147
|
-
};
|
|
148
|
-
|
|
149
|
-
// The wash as a background IMAGE over the card's opaque `--bg-surface` — see
|
|
150
|
-
// `toneFill`. A plain `bg-danger-soft` would REPLACE the surface, and the dark
|
|
151
|
-
// theme's washes are a translucent tint.
|
|
152
|
-
const CARD_TONE_WASH: Record<CardTone, string> = {
|
|
153
|
-
warning: "bg-[image:linear-gradient(var(--warning-bg),var(--warning-bg))]",
|
|
154
|
-
danger: "bg-[image:linear-gradient(var(--danger-bg),var(--danger-bg))]",
|
|
155
|
-
info: "bg-[image:linear-gradient(var(--info-bg),var(--info-bg))]",
|
|
156
|
-
success: "bg-[image:linear-gradient(var(--success-bg),var(--success-bg))]",
|
|
157
|
-
};
|
|
158
|
-
|
|
159
|
-
const CARD_TONES_STRONG: Record<CardTone, string> = {
|
|
160
|
-
warning: "border-2 border-warning-strong",
|
|
161
|
-
danger: "border-2 border-danger-strong",
|
|
162
|
-
info: "border-2 border-[var(--info)]",
|
|
163
|
-
success: "border-2 border-[var(--success)]",
|
|
164
|
-
};
|
|
165
|
-
|
|
166
|
-
/**
|
|
167
|
-
* Whether the {@link Card} round the parts carries the padding itself — so CardHeader,
|
|
168
|
-
* CardContent and CardFooter must not add theirs on top. `false` (no Card, or a default
|
|
169
|
-
* card with no `padding`) keeps the parts' own `px-6` rhythm, as it always was.
|
|
170
|
-
*/
|
|
171
|
-
const CardPaddedContext = createContext(false);
|
|
172
|
-
|
|
173
|
-
/** The {@link CardProps.density} of the nearest Card — the parts' type scale. */
|
|
174
|
-
const CardDensityContext = createContext<CardDensity>("comfortable");
|
|
175
|
-
|
|
176
|
-
export function Card({
|
|
177
|
-
className,
|
|
178
|
-
children,
|
|
179
|
-
flush,
|
|
180
|
-
variant = "default",
|
|
181
|
-
tone,
|
|
182
|
-
toneStrength = "soft",
|
|
183
|
-
toneFill = false,
|
|
184
|
-
density = "comfortable",
|
|
185
|
-
padding,
|
|
186
|
-
...rest
|
|
187
|
-
}: CardProps) {
|
|
188
|
-
const toned = tone ? CARD_TONES[tone] : undefined;
|
|
189
|
-
// An outline card is bordered like the default one, so a tone recolours its border.
|
|
190
|
-
const bordered = variant !== "inset";
|
|
191
|
-
const strong = toned !== undefined && bordered && toneStrength === "strong";
|
|
192
|
-
// The padding the card itself carries: the prop, else the variant's own (`inset`
|
|
193
|
-
// p-3, `outline` p-4). A default card with no prop carries none — its parts do.
|
|
194
|
-
const ownPadding = padding ?? (variant === "inset" ? "sm" : variant === "outline" ? "md" : undefined);
|
|
195
|
-
return (
|
|
196
|
-
<div
|
|
197
|
-
data-tone={tone}
|
|
198
|
-
data-tone-strength={strong ? "strong" : undefined}
|
|
199
|
-
data-density={density === "compact" ? "compact" : undefined}
|
|
200
|
-
{...rest}
|
|
201
|
-
className={cn(
|
|
202
|
-
variant === "inset"
|
|
203
|
-
? "rounded-md bg-surface-2 p-3"
|
|
204
|
-
: variant === "outline"
|
|
205
|
-
? // No shadow and no `flush`: it sits on a surface that already has both.
|
|
206
|
-
"rounded-lg border border-subtle bg-surface p-4"
|
|
207
|
-
: cn(
|
|
208
|
-
// Surface + border are theme tokens so the palette switcher (feedback
|
|
209
|
-
// #307) can re-skin every card; a caller's own bg-*/border-* override
|
|
210
|
-
// still wins via tailwind-merge.
|
|
211
|
-
"bg-surface",
|
|
212
|
-
flush
|
|
213
|
-
? "border-y border-subtle md:rounded-lg md:border md:shadow-sm"
|
|
214
|
-
: "rounded-lg border border-subtle shadow-sm",
|
|
215
|
-
),
|
|
216
|
-
toned && (bordered ? toned.border : toned.fill),
|
|
217
|
-
strong && tone && CARD_TONES_STRONG[tone],
|
|
218
|
-
toneFill && bordered && tone && CARD_TONE_WASH[tone],
|
|
219
|
-
toned?.title,
|
|
220
|
-
ownPadding && (strong ? CARD_PADDING_STRONG : CARD_PADDING)[ownPadding],
|
|
221
|
-
className,
|
|
222
|
-
)}
|
|
223
|
-
>
|
|
224
|
-
<CardPaddedContext.Provider value={ownPadding !== undefined}>
|
|
225
|
-
<CardDensityContext.Provider value={density}>{children}</CardDensityContext.Provider>
|
|
226
|
-
</CardPaddedContext.Provider>
|
|
227
|
-
</div>
|
|
228
|
-
);
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
// Composed shadcn-style Card sub-parts. A default `Card` with no `padding` stays
|
|
232
|
-
// padding-less, so these own the padding/rhythm (`px-6`, the header's `pt-6`, the
|
|
233
|
-
// last part's `pb-6`). A Card that carries a padding of its own — the `padding` prop,
|
|
234
|
-
// or `inset` / `outline`, which have one built in — tells them so through context and
|
|
235
|
-
// they add none on top (see CardPaddedContext). Token-driven so they re-skin with the
|
|
236
|
-
// palette. Use CardHeader → CardTitle/CardDescription (+ optional CardAction,
|
|
237
|
-
// top-right) → CardContent → CardFooter.
|
|
238
|
-
/** The sub-parts add nothing to a `<div>`'s props — they are the SAME element with a
|
|
239
|
-
* `data-slot` and a padding rhythm — so most names are aliases rather than an empty
|
|
240
|
-
* interface pretending to be more. They exist so a consumer's own wrapper can say
|
|
241
|
-
* `CardHeaderProps` instead of `ComponentProps<typeof CardHeader>`. */
|
|
242
|
-
export interface CardHeaderProps extends ComponentPropsWithRef<"div"> {
|
|
243
|
-
/**
|
|
244
|
-
* Below the `sm` breakpoint, put the {@link CardAction} UNDER the title and
|
|
245
|
-
* description instead of beside them. For an action that is wider than an icon —
|
|
246
|
-
* a "Set up two-factor" button, a checkbox and a filter — which, kept in the
|
|
247
|
-
* top-end column on a 390px phone, squeezed the title into a ribbon two words wide
|
|
248
|
-
* (keksdose's settings cards). Off by default at Normal: an icon action (the wizard
|
|
249
|
-
* summary's pencil) is narrow enough to stay beside the title at every width.
|
|
250
|
-
*
|
|
251
|
-
* Unset, it stacks at Large and Extra large only (0.32.1, the 360 px Extra-large
|
|
252
|
-
* sweep; docs/text-size-harmonization.md §4): there an IconButton shows its label as
|
|
253
|
-
* text, so the "icon" action is a word-wide pill, and "Refresh sessions" beside
|
|
254
|
-
* "Sessions" ran 47 px past a 360 px phone. `false` keeps the action beside the title
|
|
255
|
-
* at every size, for an action the caller knows stays narrow (`labelVisible={false}`).
|
|
256
|
-
*/
|
|
257
|
-
stackAction?: boolean;
|
|
258
|
-
}
|
|
259
|
-
export type CardTitleLevel = "div" | "h2" | "h3" | "h4";
|
|
260
|
-
export interface CardTitleProps extends ComponentPropsWithoutRef<"div"> {
|
|
261
|
-
/**
|
|
262
|
-
* The element the title is: `"div"` (default) or a heading level. Five of keksdose's
|
|
263
|
-
* settings cards nested their own `<h2>` / `<h3>` INSIDE CardTitle to put the card in
|
|
264
|
-
* the page's outline — a heading in a div that looks like a heading. The heading
|
|
265
|
-
* takes the title's look unchanged (the reset leaves `h2`–`h4` at inherited size and
|
|
266
|
-
* weight), so only the outline changes.
|
|
267
|
-
*/
|
|
268
|
-
as?: CardTitleLevel;
|
|
269
|
-
/** The title's element — a `div` or the heading `as` names, hence `HTMLElement`. */
|
|
270
|
-
ref?: Ref<HTMLElement>;
|
|
271
|
-
}
|
|
272
|
-
export type CardDescriptionProps = ComponentPropsWithRef<"div">;
|
|
273
|
-
export type CardActionProps = ComponentPropsWithRef<"div">;
|
|
274
|
-
export type CardContentProps = ComponentPropsWithRef<"div">;
|
|
275
|
-
export type CardFooterProps = ComponentPropsWithRef<"div">;
|
|
276
|
-
|
|
277
|
-
/** {@link CardHeaderProps.stackAction}: one column under `sm`, and the action back into
|
|
278
|
-
* the flow (DOM order, so after the description when it is written after it), at the
|
|
279
|
-
* start edge. The descendant selector outranks CardAction's own placement classes. */
|
|
280
|
-
const CARD_STACK_ACTION =
|
|
281
|
-
"max-sm:grid-cols-1 max-sm:[&>[data-slot=card-action]]:col-start-1 max-sm:[&>[data-slot=card-action]]:row-span-1 max-sm:[&>[data-slot=card-action]]:row-start-auto max-sm:[&>[data-slot=card-action]]:justify-self-start";
|
|
282
|
-
/** The same at Large and Extra large only — `stackAction` unset (see its note). A
|
|
283
|
-
* `large:` class over the scaled `max-sm`, so it costs no render and is right on the
|
|
284
|
-
* first paint. */
|
|
285
|
-
const CARD_STACK_ACTION_AT_LARGE =
|
|
286
|
-
"large:max-sm:grid-cols-1 large:max-sm:[&>[data-slot=card-action]]:col-start-1 large:max-sm:[&>[data-slot=card-action]]:row-span-1 large:max-sm:[&>[data-slot=card-action]]:row-start-auto large:max-sm:[&>[data-slot=card-action]]:justify-self-start";
|
|
287
|
-
|
|
288
|
-
export function CardHeader({ className, stackAction, ...props }: CardHeaderProps) {
|
|
289
|
-
const padded = useContext(CardPaddedContext);
|
|
290
|
-
const compact = useContext(CardDensityContext) === "compact";
|
|
291
|
-
return (
|
|
292
|
-
<div
|
|
293
|
-
data-slot="card-header"
|
|
294
|
-
className={cn(
|
|
295
|
-
// Grid (not flex) so CardAction can occupy a top-right column; with no
|
|
296
|
-
// action it collapses to one column and title/description stack.
|
|
297
|
-
//
|
|
298
|
-
// The two-column switch sets a VARIABLE, not `grid-template-columns`. As
|
|
299
|
-
// `has-data-[slot=card-action]:grid-cols-[1fr_auto]` it was two classes of
|
|
300
|
-
// specificity (the class plus the attribute inside `:has()`), and a caller's
|
|
301
|
-
// `max-sm:grid-cols-1` — one class inside a media query — lost to it at every
|
|
302
|
-
// width, so the action could never be stacked on a phone from outside. Now the
|
|
303
|
-
// property itself is set by a plain one-class utility that any `grid-cols-*`
|
|
304
|
-
// variant of the caller's outranks by coming later in the sheet; the `:has()`
|
|
305
|
-
// rule only picks the value. The base `1fr` resets the variable so a header
|
|
306
|
-
// never inherits an ancestor header's two columns.
|
|
307
|
-
"grid auto-rows-min items-start gap-1.5 [--card-header-cols:1fr] has-data-[slot=card-action]:[--card-header-cols:1fr_auto] grid-cols-[var(--card-header-cols,1fr)]",
|
|
308
|
-
padded ? "px-0 pt-0" : "px-6 pt-6",
|
|
309
|
-
compact && "gap-0.5",
|
|
310
|
-
stackAction === true && CARD_STACK_ACTION,
|
|
311
|
-
stackAction === undefined && CARD_STACK_ACTION_AT_LARGE,
|
|
312
|
-
className,
|
|
313
|
-
)}
|
|
314
|
-
{...props}
|
|
315
|
-
/>
|
|
316
|
-
);
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
export function CardTitle({ className, as: Tag = "div", ref, ...props }: CardTitleProps) {
|
|
320
|
-
const compact = useContext(CardDensityContext) === "compact";
|
|
321
|
-
return (
|
|
322
|
-
<Tag
|
|
323
|
-
ref={ref as Ref<HTMLDivElement & HTMLHeadingElement>}
|
|
324
|
-
data-slot="card-title"
|
|
325
|
-
// Compact is `leading-snug`, not `leading-none`: there the title sits on a
|
|
326
|
-
// 12px description `gap-0.5` below, and a line box exactly the cap height left
|
|
327
|
-
// the hint hugging the title's descenders (every keksdose admin card added
|
|
328
|
-
// `leading-normal` by hand). Comfortable keeps `leading-none` — its 14px
|
|
329
|
-
// description is `gap-1.5` away and has always read right.
|
|
330
|
-
className={cn(compact ? "text-sm font-medium leading-snug" : "font-semibold leading-none", className)}
|
|
331
|
-
{...props}
|
|
332
|
-
/>
|
|
333
|
-
);
|
|
334
|
-
}
|
|
335
|
-
|
|
336
|
-
export function CardDescription({ className, ...props }: CardDescriptionProps) {
|
|
337
|
-
const compact = useContext(CardDensityContext) === "compact";
|
|
338
|
-
return (
|
|
339
|
-
<div
|
|
340
|
-
data-slot="card-description"
|
|
341
|
-
// `--text-muted`, the kit's secondary-line colour (StatTile's description, the
|
|
342
|
-
// field captions). It was `--money-neutral`, a MONEY token that happened to be
|
|
343
|
-
// a similar grey — and a palette that re-tunes the money colours moved every
|
|
344
|
-
// card's description with them.
|
|
345
|
-
className={cn(compact ? "text-xs" : "text-sm", "text-muted", className)}
|
|
346
|
-
{...props}
|
|
347
|
-
/>
|
|
348
|
-
);
|
|
349
|
-
}
|
|
350
|
-
|
|
351
|
-
export function CardAction({ className, ...props }: CardActionProps) {
|
|
352
|
-
return (
|
|
353
|
-
<div
|
|
354
|
-
data-slot="card-action"
|
|
355
|
-
className={cn("col-start-2 row-start-1 row-span-2 self-start justify-self-end", className)}
|
|
356
|
-
{...props}
|
|
357
|
-
/>
|
|
358
|
-
);
|
|
359
|
-
}
|
|
360
|
-
|
|
361
|
-
export function CardContent({ className, ...props }: CardContentProps) {
|
|
362
|
-
const padded = useContext(CardPaddedContext);
|
|
363
|
-
// `last:pb-6`, not a plain `pb-6`: CardHeader owns the top padding and CardFooter
|
|
364
|
-
// owns the bottom one, so a card WITHOUT a footer had nothing closing it off and
|
|
365
|
-
// its last field sat flush against the card edge (kastlan feedback: the language
|
|
366
|
-
// input touching the card bottom on /profile). Scoping to `:last-child` fixes that
|
|
367
|
-
// case and leaves a footered card's rhythm exactly as it was. Inside a padded Card
|
|
368
|
-
// the card closes itself off, so there is nothing to add.
|
|
369
|
-
return <div data-slot="card-content" className={cn(!padded && "px-6 last:pb-6", className)} {...props} />;
|
|
370
|
-
}
|
|
371
|
-
|
|
372
|
-
export function CardFooter({ className, ...props }: CardFooterProps) {
|
|
373
|
-
const padded = useContext(CardPaddedContext);
|
|
374
|
-
return (
|
|
375
|
-
<div data-slot="card-footer" className={cn("flex items-center", !padded && "px-6 pb-6", className)} {...props} />
|
|
376
|
-
);
|
|
377
|
-
}
|
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
// The live side of `chartEdge` (theme/chart-palette.ts): which colours a FILLED mark is
|
|
2
|
-
// painted with and which grounds it sits on, read off <html> as the page resolves them —
|
|
3
|
-
// so the 1px ink edge follows a theme toggle and a palette switch without the chart
|
|
4
|
-
// knowing either store. And WHETHER a mark gets one: `useEdgesInForce`, the contrast
|
|
5
|
-
// setting's switch. Shared by SeriesChart (bars, areas) and Treemap (tiles).
|
|
6
|
-
import { useCallback, useSyncExternalStore } from "react";
|
|
7
|
-
import { chartEdge } from "../theme/chart-palette";
|
|
8
|
-
import { parseHex } from "../theme/color";
|
|
9
|
-
|
|
10
|
-
/** The tokens a theme or palette change can move, read as ONE string so
|
|
11
|
-
* `useSyncExternalStore` compares a primitive (a fresh array would never be equal). */
|
|
12
|
-
const WATCHED = [
|
|
13
|
-
"--bg-surface",
|
|
14
|
-
"--bg-page",
|
|
15
|
-
...Array.from({ length: 9 }, (_, i) => `--chart-${i + 1}`),
|
|
16
|
-
"--chart-ink",
|
|
17
|
-
"--chart-muted",
|
|
18
|
-
"--money-income",
|
|
19
|
-
"--money-expense",
|
|
20
|
-
"--money-net",
|
|
21
|
-
"--money-neutral",
|
|
22
|
-
"--brand",
|
|
23
|
-
];
|
|
24
|
-
|
|
25
|
-
function readWatched(): string {
|
|
26
|
-
const style = getComputedStyle(document.documentElement);
|
|
27
|
-
return WATCHED.map((name) => style.getPropertyValue(name).trim()).join(",");
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
function subscribe(onChange: () => void): () => void {
|
|
31
|
-
const observer = new MutationObserver(onChange);
|
|
32
|
-
observer.observe(document.documentElement, {
|
|
33
|
-
attributes: true,
|
|
34
|
-
attributeFilter: ["class", "style", "data-theme", "data-contrast"],
|
|
35
|
-
});
|
|
36
|
-
return () => observer.disconnect();
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
/** Server render: nothing measured, so no edge — the client adds it on hydration. */
|
|
40
|
-
const SERVER = "";
|
|
41
|
-
|
|
42
|
-
const BARE_VAR = /^var\(\s*(--[A-Za-z0-9_-]+)\s*\)$/;
|
|
43
|
-
|
|
44
|
-
/** A colour as the page resolves it: a hex as it is, a bare `var(--token)` read off
|
|
45
|
-
* <html>, anything else (a `color-mix()`, a var with a fallback) null. */
|
|
46
|
-
export function resolveChartColor(color: string, style: Pick<CSSStyleDeclaration, "getPropertyValue">): string | null {
|
|
47
|
-
const trimmed = color.trim();
|
|
48
|
-
if (parseHex(trimmed)) return trimmed;
|
|
49
|
-
const m = BARE_VAR.exec(trimmed);
|
|
50
|
-
if (!m) return null;
|
|
51
|
-
const value = style.getPropertyValue(m[1]).trim();
|
|
52
|
-
return parseHex(value) ? value : null;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* `(fill) => edge`: the ink stroke a filled mark in `fill` needs on this page, or
|
|
57
|
-
* `undefined` — only for a colour under 3:1 against the card or the page (WCAG 1.4.11).
|
|
58
|
-
* `fill` may be a hex or a bare `var(--chart-N)` / `var(--money-…)`; anything it cannot
|
|
59
|
-
* measure gets no edge.
|
|
60
|
-
*/
|
|
61
|
-
export function useChartEdge(): (fill: string | undefined) => string | undefined {
|
|
62
|
-
const snapshot = useSyncExternalStore(subscribe, readWatched, () => SERVER);
|
|
63
|
-
return useCallback(
|
|
64
|
-
(fill: string | undefined) => {
|
|
65
|
-
if (!fill || snapshot === SERVER || typeof document === "undefined") return undefined;
|
|
66
|
-
const style = getComputedStyle(document.documentElement);
|
|
67
|
-
const hex = resolveChartColor(fill, style);
|
|
68
|
-
if (!hex) return undefined;
|
|
69
|
-
const surfaces = ["--bg-surface", "--bg-page"].map((n) => style.getPropertyValue(n).trim());
|
|
70
|
-
return chartEdge(hex, surfaces);
|
|
71
|
-
},
|
|
72
|
-
[snapshot],
|
|
73
|
-
);
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
/**
|
|
77
|
-
* How filled marks are parted — see `TreemapProps.edges` (0.51.6, keksdose dev #642).
|
|
78
|
-
* `"auto"`: `"uniform"` at Standard contrast, `"contrast"` while More contrast is in force.
|
|
79
|
-
*/
|
|
80
|
-
export type ChartEdges = "auto" | "uniform" | "contrast";
|
|
81
|
-
|
|
82
|
-
// `<html data-contrast>`, followed live: what `"auto"` keys on. Read here rather than
|
|
83
|
-
// through theme/contrast, whose store would come into the chart entry with it.
|
|
84
|
-
function subscribeContrast(onChange: () => void): () => void {
|
|
85
|
-
if (typeof MutationObserver === "undefined" || typeof document === "undefined") return () => {};
|
|
86
|
-
const observer = new MutationObserver(onChange);
|
|
87
|
-
observer.observe(document.documentElement, { attributes: true, attributeFilter: ["data-contrast"] });
|
|
88
|
-
return () => observer.disconnect();
|
|
89
|
-
}
|
|
90
|
-
const readMoreContrast = () =>
|
|
91
|
-
typeof document !== "undefined" && document.documentElement.getAttribute("data-contrast") === "more";
|
|
92
|
-
|
|
93
|
-
/**
|
|
94
|
-
* The edges a filled mark draws: `"auto"` resolved against the contrast in force, live.
|
|
95
|
-
*
|
|
96
|
-
* Under `"contrast"` a mark whose hue is under 3:1 against the ground gets the 1px ink
|
|
97
|
-
* edge ({@link useChartEdge}); under `"uniform"` none does. The tiles took this rule in
|
|
98
|
-
* 0.51.6 (#642: "The borders do not look nice when changing from tile to tile"), and
|
|
99
|
-
* SeriesChart's bars and areas in 0.52 (refactor audit 2026-10-30, DSP-18, Marcel's
|
|
100
|
-
* decision 3): at Standard contrast the edge fell on 5 of 8 hues in light, and in dark on
|
|
101
|
-
* chart-5 and chart-7 alone — the same unevenness, in a bar chart.
|
|
102
|
-
*/
|
|
103
|
-
export function useEdgesInForce(edges: ChartEdges = "auto"): "uniform" | "contrast" {
|
|
104
|
-
const more = useSyncExternalStore(subscribeContrast, readMoreContrast, () => false);
|
|
105
|
-
return edges === "auto" ? (more ? "contrast" : "uniform") : edges;
|
|
106
|
-
}
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
// A chart's accessible description — internal, not exported from the barrel.
|
|
2
|
-
//
|
|
3
|
-
// A chart is a `role="figure"` named by its `aria-label` and described by a sentence of
|
|
4
|
-
// what it shows (0.52, refactor audit 2026-10-30, DSP-5). SeriesChart and Treemap each
|
|
5
|
-
// built the `hidden` sentence and the `aria-describedby` that points at it, and already
|
|
6
|
-
// differed: Treemap kept a caller's own ids, SeriesChart had none to keep. Both put the
|
|
7
|
-
// sentence AFTER the figure, as its sibling, so the chart stopped being its parent's last
|
|
8
|
-
// child and a stack's `space-y-*` or `divide-y` gave it a margin or a rule underneath (0.52
|
|
9
|
-
// code review, deep, charts, findings 7 and 14). One copy now, rendered inside the root.
|
|
10
|
-
import { useId, type ReactNode } from "react";
|
|
11
|
-
|
|
12
|
-
export interface FigureDescription {
|
|
13
|
-
/** The root's `aria-describedby`: the caller's own ids, then the description's. */
|
|
14
|
-
describedBy: string | undefined;
|
|
15
|
-
/** The description, to render INSIDE the root; `null` when there is none. */
|
|
16
|
-
node: ReactNode;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* The description of a figure, and the `aria-describedby` that reads it — after the
|
|
21
|
-
* caller's own ids (`describedBy`), which it keeps. The sentence is `hidden`: it is read
|
|
22
|
-
* through the reference, never a second time in browse mode, and takes no room.
|
|
23
|
-
*/
|
|
24
|
-
export function useFigureDescription(description: string | undefined, describedBy?: string): FigureDescription {
|
|
25
|
-
const id = useId();
|
|
26
|
-
if (!description) return { describedBy, node: null };
|
|
27
|
-
return {
|
|
28
|
-
describedBy: describedBy ? `${describedBy} ${id}` : id,
|
|
29
|
-
node: (
|
|
30
|
-
<span id={id} hidden>
|
|
31
|
-
{description}
|
|
32
|
-
</span>
|
|
33
|
-
),
|
|
34
|
-
};
|
|
35
|
-
}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import type { CSSProperties } from "react";
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* A chart's height as the kit's charts take it (docs/text-size-harmonization.md §10.10):
|
|
5
|
-
*
|
|
6
|
-
* - a CSS length — `"20rem"`, `"min(20rem, 60dvh)"`, `"clamp(14rem, 40vh, 28rem)"` —
|
|
7
|
-
* set inline, so a height can grow with the text size AND stop at the screen: scaled
|
|
8
|
-
* px would make a 480 px chart 720 px at Extra large, more than a phone shows;
|
|
9
|
-
* - a Tailwind class (`"h-72"`, `"h-64 md:h-80"`), as before;
|
|
10
|
-
* - a number of px, set inline, as before — kept for the callers that hold their height
|
|
11
|
-
* as a number, but it does not follow the text size.
|
|
12
|
-
*/
|
|
13
|
-
export type ChartHeight = string | number;
|
|
14
|
-
|
|
15
|
-
/** A number with an optional unit, or one of the CSS functions a length is written with.
|
|
16
|
-
* A Tailwind class never starts with a digit or `min(`, so the two cannot be confused. */
|
|
17
|
-
const CSS_LENGTH = /^(?:[-+]?(?:\d+\.?\d*|\.\d+)(?:%|[a-z]+)?|(?:min|max|clamp|calc|var)\(.*\))$/i;
|
|
18
|
-
|
|
19
|
-
/** Whether a string `height` is a CSS length rather than a class. */
|
|
20
|
-
export function isCssLength(value: string): boolean {
|
|
21
|
-
return CSS_LENGTH.test(value.trim());
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
/** The class or the inline style a {@link ChartHeight} becomes — one of the two, or
|
|
25
|
-
* neither for `undefined`. */
|
|
26
|
-
export function chartHeightProps(height: ChartHeight | undefined): { className?: string; style?: CSSProperties } {
|
|
27
|
-
if (height === undefined) return {};
|
|
28
|
-
if (typeof height === "number") return { style: { height } };
|
|
29
|
-
return isCssLength(height) ? { style: { height: height.trim() } } : { className: height };
|
|
30
|
-
}
|