@eifi1/ui-kit 0.32.2 → 0.33.1
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 +17 -9
- package/dist/account/delete-account-setting.d.ts +11 -10
- package/dist/account/delete-account-setting.js +2 -1
- package/dist/account/delete-account-setting.js.map +1 -1
- package/dist/account/email-change-setting.d.ts +5 -0
- package/dist/account/email-change-setting.js +4 -3
- package/dist/account/email-change-setting.js.map +1 -1
- package/dist/account/sessions-setting.d.ts +4 -0
- package/dist/account/sessions-setting.js +3 -2
- package/dist/account/sessions-setting.js.map +1 -1
- package/dist/admin/admin-action-confirm.d.ts +11 -10
- package/dist/admin/admin-action-confirm.js.map +1 -1
- package/dist/admin/invitations-panel.d.ts +11 -10
- package/dist/admin/invitations-panel.js +4 -3
- package/dist/admin/invitations-panel.js.map +1 -1
- package/dist/admin/plan-change.d.ts +101 -0
- package/dist/admin/plan-change.js +210 -0
- package/dist/admin/plan-change.js.map +1 -0
- package/dist/admin/reviewer-scope-editor.d.ts +11 -10
- package/dist/admin/reviewer-scope-editor.js.map +1 -1
- package/dist/admin/role-select.d.ts +8 -7
- package/dist/admin/role-select.js.map +1 -1
- package/dist/admin/transfer-ownership-dialog.d.ts +11 -10
- package/dist/admin/user-roster.d.ts +8 -7
- package/dist/admin/user-roster.js +2 -2
- package/dist/admin/user-roster.js.map +1 -1
- package/dist/auth/auth-errors.d.ts +13 -2
- package/dist/auth/auth-errors.js +5 -1
- package/dist/auth/auth-errors.js.map +1 -1
- package/dist/auth/complete-name-dialog.d.ts +4 -1
- package/dist/auth/complete-name-dialog.js +2 -1
- package/dist/auth/complete-name-dialog.js.map +1 -1
- package/dist/auth/register-form.d.ts +11 -10
- package/dist/billing/billing-banner.d.ts +14 -11
- package/dist/billing/billing-banner.js.map +1 -1
- package/dist/billing/billing-labels.d.ts +11 -10
- package/dist/billing/billing-labels.js +10 -1
- package/dist/billing/billing-labels.js.map +1 -1
- package/dist/billing/billing-lock.d.ts +40 -12
- package/dist/billing/billing-lock.js +9 -3
- package/dist/billing/billing-lock.js.map +1 -1
- package/dist/billing/billing-overview.d.ts +155 -0
- package/dist/billing/billing-overview.js +2 -0
- package/dist/billing/billing-overview.js.map +1 -0
- package/dist/billing/billing-standing.d.ts +11 -10
- package/dist/billing/checkout-processing.d.ts +218 -0
- package/dist/billing/checkout-processing.js +198 -0
- package/dist/billing/checkout-processing.js.map +1 -0
- package/dist/billing/checkout-return.d.ts +51 -0
- package/dist/billing/checkout-return.js +43 -0
- package/dist/billing/checkout-return.js.map +1 -0
- package/dist/billing/pay-page.d.ts +215 -0
- package/dist/billing/pay-page.js +113 -0
- package/dist/billing/pay-page.js.map +1 -0
- package/dist/billing/plan-card.d.ts +11 -10
- package/dist/billing/plan-limit-notice.d.ts +11 -10
- package/dist/billing/plan-limit-toast.d.ts +144 -0
- package/dist/billing/plan-limit-toast.js +40 -0
- package/dist/billing/plan-limit-toast.js.map +1 -0
- package/dist/billing/subscription-actions.d.ts +39 -15
- package/dist/billing/subscription-actions.js +9 -2
- package/dist/billing/subscription-actions.js.map +1 -1
- package/dist/billing/subscription-status-chip.d.ts +10 -9
- package/dist/bin/eifi1-pay-page.mjs +166 -0
- package/dist/chart.d.ts +11 -10
- package/dist/components/account-chips.d.ts +6 -1
- package/dist/components/account-settings.d.ts +4 -1
- package/dist/components/account-settings.js +2 -1
- package/dist/components/account-settings.js.map +1 -1
- package/dist/components/amount-input.d.ts +11 -10
- package/dist/components/autocomplete.d.ts +2 -1
- package/dist/components/autocomplete.js +5 -3
- package/dist/components/autocomplete.js.map +1 -1
- package/dist/components/button-group.d.ts +11 -10
- package/dist/components/button-group.js +1 -1
- package/dist/components/button-group.js.map +1 -1
- package/dist/components/calculator.d.ts +11 -10
- package/dist/components/calculator.js +3 -3
- package/dist/components/calculator.js.map +1 -1
- package/dist/components/checkbox-group.d.ts +2 -1
- package/dist/components/checkbox-group.js.map +1 -1
- package/dist/components/checkbox.d.ts +2 -1
- package/dist/components/checkbox.js.map +1 -1
- package/dist/components/chip.d.ts +2 -1
- package/dist/components/chip.js +19 -17
- package/dist/components/chip.js.map +1 -1
- package/dist/components/choice-card.d.ts +3 -1
- package/dist/components/choice-card.js +1 -1
- package/dist/components/choice-card.js.map +1 -1
- package/dist/components/combobox-core.js +2 -1
- package/dist/components/combobox-core.js.map +1 -1
- package/dist/components/combobox.d.ts +4 -3
- package/dist/components/combobox.js +2 -2
- package/dist/components/combobox.js.map +1 -1
- package/dist/components/confirm-dialog.d.ts +11 -10
- package/dist/components/confirm-dialog.js +6 -3
- package/dist/components/confirm-dialog.js.map +1 -1
- package/dist/components/copy-button.d.ts +12 -11
- package/dist/components/country-select.d.ts +2 -1
- package/dist/components/country-select.js.map +1 -1
- package/dist/components/danger-confirm.d.ts +11 -10
- package/dist/components/danger-confirm.js.map +1 -1
- package/dist/components/data-table-cells.d.ts +12 -1
- package/dist/components/data-table-filter-popover.d.ts +12 -1
- package/dist/components/data-table-filters.d.ts +12 -1
- package/dist/components/data-table-labels.d.ts +12 -1
- package/dist/components/data-table-pagination.d.ts +12 -1
- package/dist/components/data-table.d.ts +12 -1
- package/dist/components/data-table.js +3 -3
- package/dist/components/data-table.js.map +1 -1
- package/dist/components/date-picker.js +6 -4
- package/dist/components/date-picker.js.map +1 -1
- package/dist/components/dropdown.js +9 -1
- package/dist/components/dropdown.js.map +1 -1
- package/dist/components/entity-combobox.d.ts +3 -2
- package/dist/components/entity-combobox.js.map +1 -1
- package/dist/components/facing-pair.d.ts +11 -10
- package/dist/components/field-parts.d.ts +32 -4
- package/dist/components/field-parts.js +54 -19
- package/dist/components/field-parts.js.map +1 -1
- package/dist/components/file-button.d.ts +11 -10
- package/dist/components/file-button.js +3 -2
- package/dist/components/file-button.js.map +1 -1
- package/dist/components/file-dropzone.d.ts +12 -11
- package/dist/components/file-dropzone.js.map +1 -1
- package/dist/components/floating-panel.js +5 -5
- package/dist/components/floating-panel.js.map +1 -1
- package/dist/components/form-actions.d.ts +10 -9
- package/dist/components/form-actions.js +3 -3
- package/dist/components/form-actions.js.map +1 -1
- package/dist/components/full-bleed-dialog.js.map +1 -1
- package/dist/components/iban-input.d.ts +11 -10
- package/dist/components/inline-edit-field.d.ts +2 -1
- package/dist/components/inline-edit-field.js +6 -6
- package/dist/components/inline-edit-field.js.map +1 -1
- package/dist/components/language-select.d.ts +11 -10
- package/dist/components/legal-page.d.ts +11 -10
- package/dist/components/legal.d.ts +11 -10
- package/dist/components/list.d.ts +2 -1
- package/dist/components/list.js +4 -5
- package/dist/components/list.js.map +1 -1
- package/dist/components/modal.js.map +1 -1
- package/dist/components/money-field.d.ts +11 -10
- package/dist/components/month-picker.js +54 -44
- package/dist/components/month-picker.js.map +1 -1
- package/dist/components/multi-entity-combobox.d.ts +3 -2
- package/dist/components/multi-entity-combobox.js.map +1 -1
- package/dist/components/number-field.d.ts +18 -10
- package/dist/components/number-field.js.map +1 -1
- package/dist/components/number-input.d.ts +37 -10
- package/dist/components/number-input.js +27 -12
- package/dist/components/number-input.js.map +1 -1
- package/dist/components/numpad-sheet.d.ts +11 -10
- package/dist/components/numpad-sheet.js +2 -2
- package/dist/components/numpad-sheet.js.map +1 -1
- package/dist/components/phone-input.d.ts +11 -10
- package/dist/components/popover.js +6 -2
- package/dist/components/popover.js.map +1 -1
- package/dist/components/row-actions.d.ts +6 -5
- package/dist/components/row-actions.js +130 -32
- package/dist/components/row-actions.js.map +1 -1
- package/dist/components/series-chart.d.ts +11 -10
- package/dist/components/settings-fields.d.ts +11 -10
- package/dist/components/share-card.d.ts +8 -7
- package/dist/components/share-card.js +26 -10
- package/dist/components/share-card.js.map +1 -1
- package/dist/components/skeleton.d.ts +10 -2
- package/dist/components/skeleton.js.map +1 -1
- package/dist/components/status-dot.d.ts +1 -0
- package/dist/components/status-dot.js +2 -2
- package/dist/components/status-dot.js.map +1 -1
- package/dist/components/swatch-picker.d.ts +2 -1
- package/dist/components/swatch-picker.js.map +1 -1
- package/dist/components/swipeable-row.d.ts +88 -17
- package/dist/components/swipeable-row.js +46 -9
- package/dist/components/swipeable-row.js.map +1 -1
- package/dist/components/switch.d.ts +2 -1
- package/dist/components/switch.js.map +1 -1
- package/dist/components/table.d.ts +2 -1
- package/dist/components/table.js +6 -0
- package/dist/components/table.js.map +1 -1
- package/dist/components/text-link.d.ts +10 -9
- package/dist/components/time-input.d.ts +11 -10
- package/dist/components/toggle-group.d.ts +2 -1
- package/dist/components/toggle-group.js +1 -1
- package/dist/components/toggle-group.js.map +1 -1
- package/dist/components/translation-review-editor.d.ts +4 -0
- package/dist/components/translation-review-editor.js +4 -3
- package/dist/components/translation-review-editor.js.map +1 -1
- package/dist/components/translation-review-parts.d.ts +1 -0
- package/dist/components/translation-review.d.ts +1 -0
- package/dist/components/translation-review.js +15 -18
- package/dist/components/translation-review.js.map +1 -1
- package/dist/components/ui.d.ts +10 -9
- package/dist/components/ui.js +47 -27
- package/dist/components/ui.js.map +1 -1
- package/dist/components/use-table-state.d.ts +12 -1
- package/dist/components/user-avatar.d.ts +1 -0
- package/dist/components/write-lock.d.ts +101 -13
- package/dist/components/write-lock.js +37 -13
- package/dist/components/write-lock.js.map +1 -1
- package/dist/{data-table-labels-kpAAVi6g.d.ts → data-table-labels-BJ5JE_X2.d.ts} +17 -0
- package/dist/data-table.d.ts +12 -1
- package/dist/{delete-account-setting-Dy4kJgUm.d.ts → delete-account-setting-DAgGBrbn.d.ts} +393 -42
- package/dist/feedback/feedback-attachment.d.ts +11 -10
- package/dist/feedback/feedback-attachment.js +7 -7
- package/dist/feedback/feedback-attachment.js.map +1 -1
- package/dist/feedback/feedback-context.d.ts +11 -10
- package/dist/feedback/feedback-crash.d.ts +11 -10
- package/dist/feedback/feedback-dialog.d.ts +11 -10
- package/dist/feedback/feedback-inbox.d.ts +10 -9
- package/dist/feedback/feedback-inbox.js +7 -3
- package/dist/feedback/feedback-inbox.js.map +1 -1
- package/dist/feedback/feedback-labels.d.ts +11 -10
- package/dist/feedback/feedback-menu.d.ts +4 -3
- package/dist/feedback/feedback-record.d.ts +11 -10
- package/dist/feedback/feedback-row-detail.d.ts +11 -10
- package/dist/feedback/feedback-row-detail.js.map +1 -1
- package/dist/feedback/feedback-status-undo.d.ts +11 -10
- package/dist/feedback/feedback-submit.d.ts +11 -10
- package/dist/feedback/feedback-swipe.d.ts +11 -10
- package/dist/feedback/feedback-swipe.js +3 -6
- package/dist/feedback/feedback-swipe.js.map +1 -1
- package/dist/feedback/feedback-table.d.ts +11 -10
- package/dist/feedback/feedback-table.js.map +1 -1
- package/dist/feedback/feedback-thread.d.ts +11 -10
- package/dist/feedback/feedback-thread.js +5 -1
- package/dist/feedback/feedback-thread.js.map +1 -1
- package/dist/feedback.d.ts +11 -10
- package/dist/hooks/use-anchored-panel.d.ts +37 -7
- package/dist/hooks/use-anchored-panel.js +6 -7
- package/dist/hooks/use-anchored-panel.js.map +1 -1
- package/dist/hooks/use-file-drop.d.ts +11 -10
- package/dist/hooks/use-focus-trap.d.ts +8 -0
- package/dist/hooks/use-focus-trap.js +17 -11
- package/dist/hooks/use-focus-trap.js.map +1 -1
- package/dist/i18n/defaults.d.ts +11 -10
- package/dist/i18n/defaults.js +2 -0
- package/dist/i18n/defaults.js.map +1 -1
- package/dist/i18n/german.d.ts +11 -10
- package/dist/i18n/german.js +37 -1
- package/dist/i18n/german.js.map +1 -1
- package/dist/i18n/kit-labels.d.ts +5 -4
- package/dist/i18n/kit-labels.js.map +1 -1
- package/dist/i18n/languages.d.ts +11 -10
- package/dist/i18n/locales/de-CH.d.ts +11 -10
- package/dist/i18n/locales/en.d.ts +11 -10
- package/dist/i18n/locales/es.d.ts +11 -10
- package/dist/i18n/locales/es.js +35 -1
- package/dist/i18n/locales/es.js.map +1 -1
- package/dist/i18n/locales/fr.d.ts +11 -10
- package/dist/i18n/locales/fr.js +37 -1
- package/dist/i18n/locales/fr.js.map +1 -1
- package/dist/i18n/locales/hu.d.ts +11 -10
- package/dist/i18n/locales/hu.js +38 -1
- package/dist/i18n/locales/hu.js.map +1 -1
- package/dist/i18n/locales/it.d.ts +11 -10
- package/dist/i18n/locales/it.js +35 -1
- package/dist/i18n/locales/it.js.map +1 -1
- package/dist/i18n/locales/zh.d.ts +11 -10
- package/dist/i18n/locales/zh.js +35 -1
- package/dist/i18n/locales/zh.js.map +1 -1
- package/dist/i18n/plurals.d.ts +20 -1
- package/dist/i18n/plurals.js +11 -0
- package/dist/i18n/plurals.js.map +1 -1
- package/dist/i18n/review.d.ts +11 -10
- package/dist/i18n/review.js +8 -1
- package/dist/i18n/review.js.map +1 -1
- package/dist/index.d.ts +11 -6
- package/dist/index.js +40 -2
- package/dist/index.js.map +1 -1
- package/dist/landing/landing-actions.d.ts +11 -10
- package/dist/landing/landing-sections.d.ts +11 -10
- package/dist/landing/public-header.d.ts +11 -10
- package/dist/landing/routing.d.ts +11 -10
- package/dist/pay/.well-known/apple-developer-merchantid-domain-association +1 -0
- package/dist/pay/index.html +30 -0
- package/dist/pay/pay.css +126 -0
- package/dist/pay/pay.js +198 -0
- package/dist/rhf/fields.d.ts +11 -10
- package/dist/rhf/form.d.ts +11 -10
- package/dist/rhf.d.ts +11 -10
- package/dist/settings/settings-section.d.ts +11 -10
- package/dist/shell/app-shell.d.ts +10 -9
- package/dist/shell/top-bar-brand.d.ts +11 -10
- package/dist/shell/topbar-action-menu.d.ts +1 -0
- package/dist/shell.d.ts +11 -10
- package/dist/testing/css-variables.d.ts +74 -0
- package/dist/testing/css-variables.generated.d.ts +7 -0
- package/dist/testing/css-variables.generated.js +8 -0
- package/dist/testing/css-variables.generated.js.map +1 -0
- package/dist/testing/css-variables.js +93 -0
- package/dist/testing/css-variables.js.map +1 -0
- package/dist/testing/index.d.ts +1 -0
- package/dist/testing/index.js +12 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/theme/contrast-tokens.d.ts +44 -1
- package/dist/theme/contrast-tokens.js +21 -0
- package/dist/theme/contrast-tokens.js.map +1 -1
- package/dist/theme/contrast.d.ts +2 -2
- package/dist/theme/palette-derive.js +60 -11
- package/dist/theme/palette-derive.js.map +1 -1
- package/dist/theme/palette-presets.js +45 -43
- package/dist/theme/palette-presets.js.map +1 -1
- package/dist/wizard/stepper-nav.d.ts +12 -11
- package/dist/wizard/stepper-nav.js.map +1 -1
- package/dist/wizard.d.ts +11 -10
- package/package.json +10 -2
- package/src/account/delete-account-setting.tsx +6 -1
- package/src/account/email-change-setting.tsx +9 -3
- package/src/account/sessions-setting.tsx +7 -2
- package/src/admin/admin-action-confirm.tsx +2 -1
- package/src/admin/invitations-panel.tsx +9 -3
- package/src/admin/plan-change.tsx +487 -0
- package/src/admin/reviewer-scope-editor.tsx +2 -1
- package/src/admin/role-select.tsx +2 -1
- package/src/admin/user-roster.tsx +5 -3
- package/src/auth/auth-errors.ts +25 -2
- package/src/auth/complete-name-dialog.tsx +6 -2
- package/src/billing/billing-banner.tsx +3 -1
- package/src/billing/billing-labels.ts +45 -0
- package/src/billing/billing-lock.ts +36 -3
- package/src/billing/billing-overview.ts +58 -0
- package/src/billing/checkout-processing.ts +391 -0
- package/src/billing/checkout-return.ts +90 -0
- package/src/billing/pay-page.ts +246 -0
- package/src/billing/plan-limit-toast.tsx +91 -0
- package/src/billing/subscription-actions.tsx +41 -8
- package/src/components/account-settings.tsx +6 -2
- package/src/components/autocomplete.tsx +10 -4
- package/src/components/button-group.tsx +4 -1
- package/src/components/calculator.tsx +10 -6
- package/src/components/checkbox-group.tsx +2 -2
- package/src/components/checkbox.tsx +2 -1
- package/src/components/chip.tsx +37 -32
- package/src/components/choice-card.tsx +4 -2
- package/src/components/combobox-core.tsx +5 -2
- package/src/components/combobox.tsx +8 -6
- package/src/components/confirm-dialog.tsx +13 -6
- package/src/components/country-select.tsx +2 -2
- package/src/components/danger-confirm.tsx +2 -2
- package/src/components/data-table.tsx +20 -9
- package/src/components/date-picker.tsx +10 -7
- package/src/components/dropdown.tsx +12 -2
- package/src/components/entity-combobox.tsx +3 -3
- package/src/components/field-parts.tsx +61 -14
- package/src/components/file-button.tsx +5 -4
- package/src/components/file-dropzone.tsx +2 -2
- package/src/components/floating-panel.tsx +7 -5
- package/src/components/form-actions.tsx +12 -5
- package/src/components/full-bleed-dialog.tsx +6 -0
- package/src/components/inline-edit-field.tsx +13 -13
- package/src/components/list.tsx +10 -9
- package/src/components/modal.tsx +5 -0
- package/src/components/month-picker.tsx +8 -2
- package/src/components/multi-entity-combobox.tsx +3 -3
- package/src/components/number-field.tsx +7 -0
- package/src/components/number-input.tsx +71 -11
- package/src/components/numpad-sheet.tsx +8 -4
- package/src/components/popover.tsx +6 -2
- package/src/components/row-actions.tsx +208 -58
- package/src/components/share-card.tsx +67 -13
- package/src/components/skeleton.tsx +10 -2
- package/src/components/status-dot.tsx +7 -7
- package/src/components/swatch-picker.tsx +2 -2
- package/src/components/swipeable-row.tsx +138 -27
- package/src/components/switch.tsx +2 -1
- package/src/components/table.tsx +8 -1
- package/src/components/toggle-group.tsx +5 -3
- package/src/components/translation-review-editor.tsx +8 -3
- package/src/components/translation-review.tsx +18 -22
- package/src/components/ui.tsx +92 -43
- package/src/components/write-lock.tsx +150 -24
- package/src/feedback/feedback-attachment.tsx +13 -9
- package/src/feedback/feedback-inbox.tsx +10 -6
- package/src/feedback/feedback-row-detail.tsx +3 -2
- package/src/feedback/feedback-swipe.tsx +6 -11
- package/src/feedback/feedback-table.tsx +2 -1
- package/src/feedback/feedback-thread.tsx +20 -1
- package/src/hooks/use-anchored-panel.ts +60 -14
- package/src/hooks/use-focus-trap.ts +55 -12
- package/src/i18n/defaults.ts +2 -0
- package/src/i18n/german.ts +41 -0
- package/src/i18n/kit-labels.tsx +4 -0
- package/src/i18n/locales/es.ts +35 -0
- package/src/i18n/locales/fr.ts +41 -0
- package/src/i18n/locales/hu.ts +39 -0
- package/src/i18n/locales/it.ts +36 -0
- package/src/i18n/locales/zh.ts +34 -0
- package/src/i18n/plurals.ts +29 -0
- package/src/i18n/review.ts +7 -0
- package/src/index.ts +51 -5
- package/src/testing/css-variables.generated.ts +112 -0
- package/src/testing/css-variables.ts +191 -0
- package/src/testing/index.ts +13 -0
- package/src/theme/contrast-tokens.ts +53 -2
- package/src/theme/palette-derive.ts +87 -10
- package/src/theme/palette-presets.ts +45 -43
- package/src/wizard/stepper-nav.tsx +2 -1
- package/tokens.css +324 -46
package/tokens.css
CHANGED
|
@@ -11,22 +11,25 @@
|
|
|
11
11
|
* (relative to the importing CSS file — see README §2. An @source that resolves to
|
|
12
12
|
* nothing is silent, and the app renders unstyled rather than erroring.)
|
|
13
13
|
*
|
|
14
|
-
* NOTE:
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
14
|
+
* NOTE: the :root/.dark values below MIRROR DEFAULT_PRESET in the palette theme module,
|
|
15
|
+
* and they are LIVE CSS. Tailwind 4.3.3 keeps a `:root` block that holds only custom
|
|
16
|
+
* properties — the built showcase CSS carries `--bg-surface-2` and `--danger`, and
|
|
17
|
+
* `check:tailwind` asserts such a block survives. (This note used to say Tailwind strips
|
|
18
|
+
* it, and the mirror was treated as documentation; that was never what 4.x did.)
|
|
19
|
+
* - In an app WITH a palette layer (keksdose, kastlan), `applyTokenSet` writes the
|
|
20
|
+
* active preset's values inline on <html>, and those beat these.
|
|
21
|
+
* - In an app WITHOUT one (Kurvenschmiede), these are what paints, and More contrast
|
|
22
|
+
* writes only its four stepped values over them (`reapplyContrastTokens`).
|
|
18
23
|
*
|
|
19
|
-
* Because it
|
|
20
|
-
* colour below still held the pre-#328 palette while DEFAULT_PRESET had moved
|
|
21
|
-
* Dusk;
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
* when they want to know what the brand IS.
|
|
24
|
+
* Because it was taken for inert, it drifted silently, and it did — twice. The surfaces
|
|
25
|
+
* and text colour below still held the pre-#328 palette while DEFAULT_PRESET had moved
|
|
26
|
+
* to Solar Dusk; the money trio and the dark brand accent were left behind after that
|
|
27
|
+
* and written off as "nothing reads them" — nine values, including the accent a
|
|
28
|
+
* consumer copies when they want to know what the brand IS.
|
|
25
29
|
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
* source, this file follows. */
|
|
30
|
+
* theme/__tests__/tokens-css-mirror.test.ts compares every one of these 46 values against
|
|
31
|
+
* DEFAULT_PRESET on each run, so a drift fails a test. The direction is one-way: the
|
|
32
|
+
* presets are the source, this file follows. */
|
|
30
33
|
|
|
31
34
|
@custom-variant dark (&:where(.dark, .dark *));
|
|
32
35
|
|
|
@@ -172,10 +175,45 @@ html[data-text-size="xlarge"] {
|
|
|
172
175
|
@custom-variant xlarge (&:where([data-text-size=xlarge], [data-text-size=xlarge] *));
|
|
173
176
|
@custom-variant contrast (&:where([data-contrast=more], [data-contrast=more] *));
|
|
174
177
|
|
|
178
|
+
/* "Truncate at Normal, wrap at Large" under one name (0.33, docs/text-size-harmonization.md
|
|
179
|
+
§10.17): `truncate` — one line and an ellipsis — and from Large up, the text wraps
|
|
180
|
+
instead, breaking a word only where nothing else fits (`overflow-wrap: anywhere`, as
|
|
181
|
+
List's copy had it). At Large and Extra large nothing may cut its text: the size sweep
|
|
182
|
+
reports a one-line ellipsis that does. Normal keeps its ellipses. It replaces the
|
|
183
|
+
hand-written `large:whitespace-normal large:…` copies, and an app's own JS switches
|
|
184
|
+
(`!large && "truncate"`) can take it too: it follows the attribute in CSS. */
|
|
185
|
+
@utility truncate-until-large {
|
|
186
|
+
overflow: hidden;
|
|
187
|
+
text-overflow: ellipsis;
|
|
188
|
+
white-space: nowrap;
|
|
189
|
+
@variant large {
|
|
190
|
+
white-space: normal;
|
|
191
|
+
overflow-wrap: anywhere;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/* The same for FIGURES — an amount, a date, a count with its unit (0.33.1, keksdose):
|
|
196
|
+
`truncate` at Normal, and from Large up a wrap at spaces only (`overflow-wrap: normal`).
|
|
197
|
+
`truncate-until-large` breaks anywhere, so at Large it split an amount mid-number
|
|
198
|
+
("CHF 1’2" over "34.50"), which reads as two numbers. Here "CHF" and "1’234.50" may
|
|
199
|
+
take two lines, but a number never splits: one wider than its box is cut at its end
|
|
200
|
+
instead, so give a figure's cell the room for it (`shrink-0`). Prose — a name, a
|
|
201
|
+
title, a sentence — keeps `truncate-until-large`, where breaking a long word is what
|
|
202
|
+
keeps the line on the screen. */
|
|
203
|
+
@utility truncate-until-large-words {
|
|
204
|
+
overflow: hidden;
|
|
205
|
+
text-overflow: ellipsis;
|
|
206
|
+
white-space: nowrap;
|
|
207
|
+
@variant large {
|
|
208
|
+
white-space: normal;
|
|
209
|
+
overflow-wrap: normal;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
|
|
175
213
|
:root {
|
|
176
214
|
--bg-page: #ede3cf; /* warm dim sand — low-glare light page */
|
|
177
215
|
--bg-surface: #f6ecd9; /* warm off-white card/panel (not pure white) */
|
|
178
|
-
--bg-surface-2: #
|
|
216
|
+
--bg-surface-2: #ede3cf; /* inset/well surface: the page itself in light (0.33) */
|
|
179
217
|
--border: #e2d6bd; /* warm hairline border */
|
|
180
218
|
--text-primary: #463f33; /* warm dark grey — not pure black */
|
|
181
219
|
/* The two quieter text roles. Contrast against the WORST of the three surfaces
|
|
@@ -204,9 +242,12 @@ html[data-text-size="xlarge"] {
|
|
|
204
242
|
|
|
205
243
|
They mark a field's FRAME and an ICON at its end — non-text graphics, for which
|
|
206
244
|
WCAG 1.4.11 asks 3:1 against the surface — and all four clear it on the worst of
|
|
207
|
-
the three light surfaces
|
|
245
|
+
the three light surfaces, in every shipped preset (theme/__tests__/
|
|
246
|
+
tokens-css-audit.test.ts measures it; until 0.33 this note only claimed it, and
|
|
247
|
+
amber-600 sat at 2.45:1). `--status-edited` is amber rather than the orange-800 it
|
|
208
248
|
was: beside red-700 that orange read as a second error colour, and "unsaved" has
|
|
209
|
-
to look like a caution, not an alarm.
|
|
249
|
+
to look like a caution, not an alarm. Light, it is amber-600's hue and chroma at a
|
|
250
|
+
SOLVED lightness (3.1:1 on the worst surface). Below 4.5:1, so it is not a TEXT
|
|
210
251
|
colour: `FieldSyncIndicator` prints its words in `--text-secondary` beside it.
|
|
211
252
|
|
|
212
253
|
GREEN AND RED ARE THE CLASSIC CVD-UNSAFE PAIR, and the rest of this file goes out
|
|
@@ -216,7 +257,7 @@ html[data-text-size="xlarge"] {
|
|
|
216
257
|
the only signal. Do not drop the icons. */
|
|
217
258
|
--status-synced: #166534; /* green-800 — persisted */
|
|
218
259
|
--status-pending: #1d4ed8; /* blue-700 — in flight */
|
|
219
|
-
--status-edited: #
|
|
260
|
+
--status-edited: #bf6800; /* solved — dirty, not yet saved */
|
|
220
261
|
--status-error: #b91c1c; /* red-700 — the save failed */
|
|
221
262
|
--chart-1: #332288;
|
|
222
263
|
--chart-2: #88ccee;
|
|
@@ -288,10 +329,23 @@ html[data-text-size="xlarge"] {
|
|
|
288
329
|
value. Mixing TOWARD the surface fades it in light and in dark alike. */
|
|
289
330
|
--text-placeholder: color-mix(in oklab, var(--text-muted) 65%, var(--bg-surface));
|
|
290
331
|
|
|
291
|
-
/* The wash under a hovered row, menu item or icon button. Mixing the TEXT
|
|
292
|
-
into the surface darkens it on a light theme and lightens it on a dark one,
|
|
293
|
-
which is the behaviour a fixed `slate-100`/`slate-800` pair was faking.
|
|
294
|
-
|
|
332
|
+
/* The wash under a hovered row, menu item or icon button ON A CARD. Mixing the TEXT
|
|
333
|
+
colour into the surface darkens it on a light theme and lightens it on a dark one,
|
|
334
|
+
which is the behaviour a fixed `slate-100`/`slate-800` pair was faking.
|
|
335
|
+
|
|
336
|
+
5.5 %, not the 7 % it was (0.33, colour-roles §12.10): text sits on a hovered row,
|
|
337
|
+
and at 7 % the status, money and muted colours fell to 4.25–4.49:1 on it. Text wins
|
|
338
|
+
over the hover's step, which is still 1.09–1.13:1 from the card. `HOVER_INK` in
|
|
339
|
+
theme/contrast-tokens.ts is this number for the deriver; the token audit holds them
|
|
340
|
+
equal.
|
|
341
|
+
|
|
342
|
+
Two hovers it is NOT for (§12.2, §12.10): a row that rests on `--bg-surface-2`
|
|
343
|
+
hovers to `--bg-surface` (in light the well is the page, and this wash sits only
|
|
344
|
+
1.04:1 from it); and a control that can sit on the page, the card or the well
|
|
345
|
+
(Button secondary/ghost, IconButton muted) hovers with a translucent ink,
|
|
346
|
+
`color-mix(in srgb, var(--text-primary) 7%, transparent)`, 1.11:1 or more on all
|
|
347
|
+
three. */
|
|
348
|
+
--bg-hover: color-mix(in oklab, var(--text-primary) 5.5%, var(--bg-surface));
|
|
295
349
|
--bg-active: color-mix(in oklab, var(--text-primary) 12%, var(--bg-surface));
|
|
296
350
|
|
|
297
351
|
/* A chip that inverts against the page — a selected day, a keyboard hint. These
|
|
@@ -313,8 +367,49 @@ html[data-text-size="xlarge"] {
|
|
|
313
367
|
--brand-bg: color-mix(in oklab, var(--brand) 14%, var(--bg-surface));
|
|
314
368
|
--brand-bg-hover: color-mix(in oklab, var(--brand) 24%, var(--bg-surface));
|
|
315
369
|
/* Brand text ON `--brand-bg` — pulled away from the surface so it keeps contrast
|
|
316
|
-
against its own tint in both themes.
|
|
317
|
-
|
|
370
|
+
against its own tint in both themes, and against `--brand-bg-hover` under it.
|
|
371
|
+
62 %, not the 70 % it was (0.33, colour-roles §12.11): on the hovered chip 70 %
|
|
372
|
+
read 4.08–4.42:1 (Default and Moss light; Ink, Moss, Plum and Contrast dark);
|
|
373
|
+
62 % clears 4.5:1 in every preset and mode.
|
|
374
|
+
`BRAND_MUTED_SHARE` in theme/contrast-tokens.ts is this number for the deriver; the
|
|
375
|
+
token audit holds them equal. */
|
|
376
|
+
--brand-muted: color-mix(in oklab, var(--brand) 62%, var(--text-primary));
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
/* ── A foreground for every fill (0.33, docs/colour-roles-harmonization.md §5.1) ──
|
|
380
|
+
A fill names the ink that goes on it, `<fill>-contrast`, so a pill, a badge or an
|
|
381
|
+
armed swipe never has to guess. Guessing is what went wrong: white on a money fill
|
|
382
|
+
(k22) and white on every status fill in dark mode, where the fills are pastels and
|
|
383
|
+
white sits at 1.4–3.6:1 (k23). The status and hue pairs are with their families
|
|
384
|
+
below; these are the money and neutral ones.
|
|
385
|
+
|
|
386
|
+
Money is white in light and the PAGE in dark — `--brand-contrast`'s precedent. Both
|
|
387
|
+
hold for any token set, not only the shipped ones: the preset audit solves income,
|
|
388
|
+
expense, net and neutral to 4.5:1 against the page, which is the darkest surface in
|
|
389
|
+
dark, and white is lighter than any light page. Four names for one value, one per
|
|
390
|
+
fill, so a preset whose money colours differ in lightness has room to differ. */
|
|
391
|
+
:root {
|
|
392
|
+
--money-income-contrast: #ffffff;
|
|
393
|
+
--money-expense-contrast: #ffffff;
|
|
394
|
+
--money-net-contrast: #ffffff;
|
|
395
|
+
--money-neutral-contrast: #ffffff;
|
|
396
|
+
}
|
|
397
|
+
.dark {
|
|
398
|
+
--money-income-contrast: var(--bg-page);
|
|
399
|
+
--money-expense-contrast: var(--bg-page);
|
|
400
|
+
--money-net-contrast: var(--bg-page);
|
|
401
|
+
--money-neutral-contrast: var(--bg-page);
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
/* "Neutral" as a fill — a step back, a state with no tone: the muted ink under the
|
|
405
|
+
surface colour, 5.1:1 and up in every preset. Not a new grey: it is the pair the
|
|
406
|
+
translation review's reset swipe improvised, made official, and it follows More
|
|
407
|
+
contrast through `--text-muted` (7.6:1 and up there). Chip `solid neutral` is a
|
|
408
|
+
different, louder thing — the inverse pair, a count pill — and keeps it. */
|
|
409
|
+
:root,
|
|
410
|
+
.dark {
|
|
411
|
+
--neutral: var(--text-muted);
|
|
412
|
+
--neutral-contrast: var(--text-inverse);
|
|
318
413
|
}
|
|
319
414
|
|
|
320
415
|
/* ── Semantic status ────────────────────────────────────────────────────────
|
|
@@ -327,20 +422,43 @@ html[data-text-size="xlarge"] {
|
|
|
327
422
|
Distinct from the `--status-*` family above: those describe a FIELD's journey
|
|
328
423
|
to the database, these describe an ACTION's consequence. A row can be
|
|
329
424
|
`--status-error` (its last save failed) inside a form whose delete button is
|
|
330
|
-
`--danger` (it will destroy something), and they should not look identical.
|
|
425
|
+
`--danger` (it will destroy something), and they should not look identical.
|
|
426
|
+
|
|
427
|
+
Each tone is a family: the colour (text on any surface, and a fill), `-contrast`
|
|
428
|
+
(text ON the fill), `-border` (a soft frame), `-bg` (a wash, text in the tone's
|
|
429
|
+
colour on it) and, for danger and warning, `-border-strong` (a line that has to be
|
|
430
|
+
seen: an invalid field, a loud frame, a focus ring). In dark the fills are pastels,
|
|
431
|
+
so their `-contrast` is the tone's 950, never white.
|
|
432
|
+
|
|
433
|
+
THE LIGHT VALUES ARE SOLVED, not Tailwind steps, where a 700 failed (0.33,
|
|
434
|
+
docs/colour-roles-harmonization.md §5.5): the cream and tinted grounds are darker
|
|
435
|
+
than the white those steps were made for. Each keeps its 700's OKLCH hue and chroma
|
|
436
|
+
at the lightness that clears 4.5:1 as text on the page, the card, the well, its own
|
|
437
|
+
wash and a hovered row, in every shipped preset — amber-700 managed 3.86:1, emerald
|
|
438
|
+
4.22. `--money-expense` went the same way earlier. tokens-css-audit.test.ts holds
|
|
439
|
+
every pair here to its ratio. */
|
|
331
440
|
:root {
|
|
332
441
|
--danger: #be123c; /* rose-700 */
|
|
333
442
|
--danger-hover: #9f1239; /* rose-800 */
|
|
334
443
|
--danger-contrast: #ffffff;
|
|
335
444
|
--danger-border: #fb7185; /* rose-400 */
|
|
336
445
|
/* The error LINE: an invalid field, a failed upload, a danger banner's frame, a focus
|
|
337
|
-
ring on a destructive control
|
|
338
|
-
|
|
339
|
-
|
|
446
|
+
ring on a destructive control — loud, WCAG 1.4.11's 3:1 against every surface.
|
|
447
|
+
Rose-600 in both modes since 0.33: light was rose-400, the soft border's value,
|
|
448
|
+
which reached only 2.07:1 while this note claimed 3:1. */
|
|
449
|
+
--danger-border-strong: #e11d48; /* rose-600 */
|
|
340
450
|
--danger-bg: #fff1f2; /* rose-50 */
|
|
341
451
|
|
|
342
|
-
--warning: #
|
|
452
|
+
--warning: #a34800; /* amber-700's hue, solved (was #b45309, 3.86:1) */
|
|
453
|
+
/* Text on a `--warning` fill (0.33, k24): a solid warning chip, a badge, an armed
|
|
454
|
+
swipe. White here, amber-950 on the dark theme's pastel. */
|
|
455
|
+
--warning-contrast: #ffffff;
|
|
343
456
|
--warning-border: #fcd34d; /* amber-300 */
|
|
457
|
+
/* Warning's loud line (0.33, k27), as `--danger-border-strong` is danger's: Card
|
|
458
|
+
`toneStrength="strong"`, IconButton's warning focus ring. In light the warning
|
|
459
|
+
colour itself — amber-600 would be only 2.5:1 on the cream page; in dark amber-600,
|
|
460
|
+
the step danger's line takes, 4.8:1 and up without shouting. */
|
|
461
|
+
--warning-border-strong: var(--warning);
|
|
344
462
|
--warning-bg: #fffbeb; /* amber-50 */
|
|
345
463
|
|
|
346
464
|
/* Informational, and deliberately NOT the brand: a count of active filters is
|
|
@@ -357,7 +475,7 @@ html[data-text-size="xlarge"] {
|
|
|
357
475
|
`--danger` is distinct from `--status-error`: that family describes a FIELD's
|
|
358
476
|
journey to the database, this one an ACTION's outcome. Emerald rather than the
|
|
359
477
|
money teal, so a "resolved" chip cannot be misread as an inflow. */
|
|
360
|
-
--success: #
|
|
478
|
+
--success: #007152; /* emerald-700's hue, solved (was #047857, 4.22:1) */
|
|
361
479
|
/* Text on a `--success` fill (0.26: a swipe's approve panel) — white here, the
|
|
362
480
|
darkest emerald in dark mode, where the fill is a pastel and white text failed. */
|
|
363
481
|
--success-contrast: #ffffff;
|
|
@@ -377,7 +495,9 @@ html[data-text-size="xlarge"] {
|
|
|
377
495
|
--danger-bg: rgba(136, 19, 55, 0.2);
|
|
378
496
|
|
|
379
497
|
--warning: #fcd34d; /* amber-300 */
|
|
498
|
+
--warning-contrast: #451a03; /* amber-950 */
|
|
380
499
|
--warning-border: rgba(180, 83, 9, 0.6);
|
|
500
|
+
--warning-border-strong: #d97706; /* amber-600 */
|
|
381
501
|
--warning-bg: rgba(120, 53, 15, 0.2);
|
|
382
502
|
|
|
383
503
|
--info: #7dd3fc; /* sky-300 */
|
|
@@ -434,15 +554,16 @@ html[data-text-size="xlarge"] {
|
|
|
434
554
|
.kit-toaster [data-sonner-toast][data-styled="true"]:not([data-type="success"], [data-type="info"], [data-type="warning"], [data-type="error"]) [data-description] {
|
|
435
555
|
color: var(--text-secondary);
|
|
436
556
|
}
|
|
437
|
-
/* The action button in the tone's own colour rather than sonner's black pill
|
|
557
|
+
/* The action button in the tone's own colour rather than sonner's black pill, under
|
|
558
|
+
that fill's own foreground (0.33): the surface colour on light warning was 4.3:1. */
|
|
438
559
|
.kit-toaster [data-sonner-toast][data-styled="true"] [data-button]:not([data-cancel]) {
|
|
439
560
|
background: var(--toast-action-bg, var(--text-primary));
|
|
440
|
-
color: var(--bg-surface);
|
|
561
|
+
color: var(--toast-action-fg, var(--bg-surface));
|
|
441
562
|
}
|
|
442
|
-
.kit-toaster [data-sonner-toast][data-type="success"] { --toast-action-bg: var(--success); }
|
|
443
|
-
.kit-toaster [data-sonner-toast][data-type="info"] { --toast-action-bg: var(--info); }
|
|
444
|
-
.kit-toaster [data-sonner-toast][data-type="warning"] { --toast-action-bg: var(--warning); }
|
|
445
|
-
.kit-toaster [data-sonner-toast][data-type="error"] { --toast-action-bg: var(--danger); }
|
|
563
|
+
.kit-toaster [data-sonner-toast][data-type="success"] { --toast-action-bg: var(--success); --toast-action-fg: var(--success-contrast); }
|
|
564
|
+
.kit-toaster [data-sonner-toast][data-type="info"] { --toast-action-bg: var(--info); --toast-action-fg: var(--info-contrast); }
|
|
565
|
+
.kit-toaster [data-sonner-toast][data-type="warning"] { --toast-action-bg: var(--warning); --toast-action-fg: var(--warning-contrast); }
|
|
566
|
+
.kit-toaster [data-sonner-toast][data-type="error"] { --toast-action-bg: var(--danger); --toast-action-fg: var(--danger-contrast); }
|
|
446
567
|
/* The kit's focus ring on the toast's buttons — sonner's is a black shadow that
|
|
447
568
|
vanishes on the dark theme. */
|
|
448
569
|
.kit-toaster [data-sonner-toast][data-styled="true"] :is([data-button], [data-close-button]):focus-visible {
|
|
@@ -459,64 +580,221 @@ html[data-text-size="xlarge"] {
|
|
|
459
580
|
orange (terminated / high urgency), teal (invoiced) and indigo (a meeting
|
|
460
581
|
stage). The smallest set that covers every enum; deliberately not a ramp.
|
|
461
582
|
|
|
462
|
-
Same
|
|
583
|
+
Same family and same shades as the status family (700 text / 300 border /
|
|
463
584
|
100 surface in light, 300 text / translucent 700 border / 900 wash in dark),
|
|
464
585
|
so a categorical chip sits beside a semantic one at the same weight. Not in
|
|
465
586
|
`TokenSet`: like `--danger`, a hue is a specific colour, not a tint of the
|
|
466
|
-
palette preset, so it lives here and nowhere else.
|
|
587
|
+
palette preset, so it lives here and nowhere else.
|
|
588
|
+
|
|
589
|
+
`-contrast` (0.33) is the text on the hue as a fill — a solid chip: white in light,
|
|
590
|
+
the hue's 950 on the dark pastel. Teal and orange are SOLVED in light, as warning
|
|
591
|
+
and success are (§5.5): their 700s reached 4.21 and 3.98:1 on the cream page. */
|
|
467
592
|
:root {
|
|
468
593
|
--hue-blue: #1d4ed8; /* blue-700 */
|
|
594
|
+
--hue-blue-contrast: #ffffff;
|
|
469
595
|
--hue-blue-border: #93c5fd; /* blue-300 */
|
|
470
596
|
--hue-blue-bg: #dbeafe; /* blue-100 */
|
|
471
597
|
--hue-indigo: #4338ca; /* indigo-700 */
|
|
598
|
+
--hue-indigo-contrast: #ffffff;
|
|
472
599
|
--hue-indigo-border: #a5b4fc; /* indigo-300 */
|
|
473
600
|
--hue-indigo-bg: #e0e7ff; /* indigo-100 */
|
|
474
601
|
--hue-purple: #7e22ce; /* purple-700 */
|
|
602
|
+
--hue-purple-contrast: #ffffff;
|
|
475
603
|
--hue-purple-border: #d8b4fe; /* purple-300 */
|
|
476
604
|
--hue-purple-bg: #f3e8ff; /* purple-100 */
|
|
477
|
-
--hue-teal: #
|
|
605
|
+
--hue-teal: #006f68; /* teal-700's hue, solved */
|
|
606
|
+
--hue-teal-contrast: #ffffff;
|
|
478
607
|
--hue-teal-border: #5eead4; /* teal-300 */
|
|
479
608
|
--hue-teal-bg: #ccfbf1; /* teal-100 */
|
|
480
|
-
--hue-orange: #
|
|
609
|
+
--hue-orange: #b43800; /* orange-700's hue, solved */
|
|
610
|
+
--hue-orange-contrast: #ffffff;
|
|
481
611
|
--hue-orange-border: #fdba74; /* orange-300 */
|
|
482
612
|
--hue-orange-bg: #ffedd5; /* orange-100 */
|
|
483
613
|
}
|
|
484
614
|
|
|
485
615
|
.dark {
|
|
486
616
|
--hue-blue: #93c5fd; /* blue-300 */
|
|
617
|
+
--hue-blue-contrast: #172554; /* blue-950 */
|
|
487
618
|
--hue-blue-border: rgba(29, 78, 216, 0.6);
|
|
488
619
|
--hue-blue-bg: rgba(30, 58, 138, 0.25);
|
|
489
620
|
--hue-indigo: #a5b4fc; /* indigo-300 */
|
|
621
|
+
--hue-indigo-contrast: #1e1b4b; /* indigo-950 */
|
|
490
622
|
--hue-indigo-border: rgba(67, 56, 202, 0.6);
|
|
491
623
|
--hue-indigo-bg: rgba(49, 46, 129, 0.25);
|
|
492
624
|
--hue-purple: #d8b4fe; /* purple-300 */
|
|
625
|
+
--hue-purple-contrast: #3b0764; /* purple-950 */
|
|
493
626
|
--hue-purple-border: rgba(126, 34, 206, 0.6);
|
|
494
627
|
--hue-purple-bg: rgba(88, 28, 135, 0.25);
|
|
495
628
|
--hue-teal: #5eead4; /* teal-300 */
|
|
629
|
+
--hue-teal-contrast: #042f2e; /* teal-950 */
|
|
496
630
|
--hue-teal-border: rgba(15, 118, 110, 0.6);
|
|
497
631
|
--hue-teal-bg: rgba(19, 78, 74, 0.25);
|
|
498
632
|
--hue-orange: #fdba74; /* orange-300 */
|
|
633
|
+
--hue-orange-contrast: #431407; /* orange-950 */
|
|
499
634
|
--hue-orange-border: rgba(194, 65, 12, 0.6);
|
|
500
635
|
--hue-orange-bg: rgba(124, 45, 18, 0.25);
|
|
501
636
|
}
|
|
502
637
|
|
|
503
|
-
/*
|
|
504
|
-
|
|
505
|
-
|
|
638
|
+
/* ── Role utilities (0.33, docs/colour-roles-harmonization.md §7, k25) ─────────────
|
|
639
|
+
*
|
|
640
|
+
* `text-muted`, `bg-surface-2`, `border-subtle`, `ring-brand`, `fill-surface` … instead of
|
|
641
|
+
* `text-[var(--text-muted)]`. Each name is the token's name with the property's own
|
|
642
|
+
* prefix dropped (`--bg-surface` → `bg-surface`, `--danger-border` → `border-danger`); a
|
|
643
|
+
* tone's wash is `-soft` (Chip's word for it), and `--border` is `subtle`.
|
|
644
|
+
*
|
|
645
|
+
* PROPERTY-SCOPED, on purpose. `--text-color-*` makes a `text-*` utility and nothing
|
|
646
|
+
* else, `--background-color-*` only `bg-*`, `--border-color-*` only `border-*` (and
|
|
647
|
+
* `divide-*`, which falls back to it). So `bg-muted` and `text-surface` do not exist,
|
|
648
|
+
* and a name cannot be put on the wrong property by accident. Shadcn-style `--color-*`
|
|
649
|
+
* names would make every name on every property — and fight an app's own
|
|
650
|
+
* `--color-muted` / `--color-primary` (kastlan's), where these win for their property
|
|
651
|
+
* only. No `text-*` for the border roles: an SVG drawn in `currentColor` takes
|
|
652
|
+
* `stroke-subtle` / `stroke-strong` instead.
|
|
653
|
+
*
|
|
654
|
+
* `inline`: each utility reads the role variable AT THE ELEMENT (`color: var(--text-muted)`),
|
|
655
|
+
* so a local override still works, and no `--text-color-muted` is emitted on `:root` —
|
|
656
|
+
* which is why `@eifi1/ui-kit/testing` does not count these names as declared:
|
|
657
|
+
* `var(--text-color-muted)` would paint nothing. A name costs nothing until a scanned
|
|
658
|
+
* file uses it, and variants and opacity work on all of them (`hover:bg-hover`,
|
|
659
|
+
* `md:text-secondary`, `text-muted/60`).
|
|
660
|
+
*
|
|
661
|
+
* The kit's own ~1,750 `[var(--…)]` classes stay where they are (a rewrite would change
|
|
662
|
+
* hundreds of class assertions here and in the apps); `scripts/check-token-discipline.mjs`
|
|
663
|
+
* counts them wherever one of these exists and lets the number only fall. New and
|
|
664
|
+
* touched code uses these. `check:tailwind` asserts one per namespace survives a build.
|
|
665
|
+
*
|
|
666
|
+
* `text-brand`, `bg-brand` and `border-brand` were plain classes until 0.33, which
|
|
667
|
+
* Tailwind gives no variants (`hover:bg-brand` generated nothing); they are theme names
|
|
668
|
+
* now. The money classes below stay plain: `-muted` is an opacity, not a colour. */
|
|
669
|
+
@theme inline {
|
|
670
|
+
/* text-* — the text roles, the tone colours as text, and every fill's foreground */
|
|
671
|
+
--text-color-primary: var(--text-primary);
|
|
672
|
+
--text-color-secondary: var(--text-secondary);
|
|
673
|
+
--text-color-muted: var(--text-muted);
|
|
674
|
+
--text-color-placeholder: var(--text-placeholder);
|
|
675
|
+
--text-color-inverse: var(--text-inverse);
|
|
676
|
+
--text-color-brand: var(--brand);
|
|
677
|
+
--text-color-brand-muted: var(--brand-muted);
|
|
678
|
+
--text-color-danger: var(--danger);
|
|
679
|
+
--text-color-warning: var(--warning);
|
|
680
|
+
--text-color-success: var(--success);
|
|
681
|
+
--text-color-info: var(--info);
|
|
682
|
+
--text-color-hue-blue: var(--hue-blue);
|
|
683
|
+
--text-color-hue-indigo: var(--hue-indigo);
|
|
684
|
+
--text-color-hue-purple: var(--hue-purple);
|
|
685
|
+
--text-color-hue-teal: var(--hue-teal);
|
|
686
|
+
--text-color-hue-orange: var(--hue-orange);
|
|
687
|
+
--text-color-brand-contrast: var(--brand-contrast);
|
|
688
|
+
--text-color-danger-contrast: var(--danger-contrast);
|
|
689
|
+
--text-color-warning-contrast: var(--warning-contrast);
|
|
690
|
+
--text-color-success-contrast: var(--success-contrast);
|
|
691
|
+
--text-color-info-contrast: var(--info-contrast);
|
|
692
|
+
--text-color-neutral-contrast: var(--neutral-contrast);
|
|
693
|
+
--text-color-money-income-contrast: var(--money-income-contrast);
|
|
694
|
+
--text-color-money-expense-contrast: var(--money-expense-contrast);
|
|
695
|
+
--text-color-money-net-contrast: var(--money-net-contrast);
|
|
696
|
+
--text-color-money-neutral-contrast: var(--money-neutral-contrast);
|
|
697
|
+
--text-color-hue-blue-contrast: var(--hue-blue-contrast);
|
|
698
|
+
--text-color-hue-indigo-contrast: var(--hue-indigo-contrast);
|
|
699
|
+
--text-color-hue-purple-contrast: var(--hue-purple-contrast);
|
|
700
|
+
--text-color-hue-teal-contrast: var(--hue-teal-contrast);
|
|
701
|
+
--text-color-hue-orange-contrast: var(--hue-orange-contrast);
|
|
702
|
+
--text-color-media-ink: var(--media-ink);
|
|
703
|
+
|
|
704
|
+
/* bg-* — the surfaces, the fills, and each tone's wash as `-soft` (Chip's word) */
|
|
705
|
+
--background-color-page: var(--bg-page);
|
|
706
|
+
--background-color-surface: var(--bg-surface);
|
|
707
|
+
--background-color-surface-2: var(--bg-surface-2);
|
|
708
|
+
--background-color-hover: var(--bg-hover);
|
|
709
|
+
--background-color-active: var(--bg-active);
|
|
710
|
+
--background-color-inverse: var(--bg-inverse);
|
|
711
|
+
--background-color-brand: var(--brand);
|
|
712
|
+
--background-color-brand-hover: var(--brand-hover);
|
|
713
|
+
--background-color-brand-soft: var(--brand-bg);
|
|
714
|
+
--background-color-brand-soft-hover: var(--brand-bg-hover);
|
|
715
|
+
--background-color-danger: var(--danger);
|
|
716
|
+
--background-color-danger-hover: var(--danger-hover);
|
|
717
|
+
--background-color-warning: var(--warning);
|
|
718
|
+
--background-color-success: var(--success);
|
|
719
|
+
--background-color-info: var(--info);
|
|
720
|
+
--background-color-neutral: var(--neutral);
|
|
721
|
+
--background-color-danger-soft: var(--danger-bg);
|
|
722
|
+
--background-color-warning-soft: var(--warning-bg);
|
|
723
|
+
--background-color-success-soft: var(--success-bg);
|
|
724
|
+
--background-color-info-soft: var(--info-bg);
|
|
725
|
+
--background-color-hue-blue: var(--hue-blue);
|
|
726
|
+
--background-color-hue-indigo: var(--hue-indigo);
|
|
727
|
+
--background-color-hue-purple: var(--hue-purple);
|
|
728
|
+
--background-color-hue-teal: var(--hue-teal);
|
|
729
|
+
--background-color-hue-orange: var(--hue-orange);
|
|
730
|
+
--background-color-hue-blue-soft: var(--hue-blue-bg);
|
|
731
|
+
--background-color-hue-indigo-soft: var(--hue-indigo-bg);
|
|
732
|
+
--background-color-hue-purple-soft: var(--hue-purple-bg);
|
|
733
|
+
--background-color-hue-teal-soft: var(--hue-teal-bg);
|
|
734
|
+
--background-color-hue-orange-soft: var(--hue-orange-bg);
|
|
735
|
+
--background-color-media-scrim: var(--media-scrim);
|
|
736
|
+
--background-color-media-scrim-hover: var(--media-scrim-hover);
|
|
737
|
+
|
|
738
|
+
/* border-* (and divide-*, which falls back to these) — `subtle` is `--border` */
|
|
739
|
+
--border-color-subtle: var(--border);
|
|
740
|
+
--border-color-strong: var(--border-strong);
|
|
741
|
+
--border-color-brand: var(--brand);
|
|
742
|
+
--border-color-danger: var(--danger-border);
|
|
743
|
+
--border-color-warning: var(--warning-border);
|
|
744
|
+
--border-color-success: var(--success-border);
|
|
745
|
+
--border-color-info: var(--info-border);
|
|
746
|
+
--border-color-danger-strong: var(--danger-border-strong);
|
|
747
|
+
--border-color-warning-strong: var(--warning-border-strong);
|
|
748
|
+
--border-color-hue-blue: var(--hue-blue-border);
|
|
749
|
+
--border-color-hue-indigo: var(--hue-indigo-border);
|
|
750
|
+
--border-color-hue-purple: var(--hue-purple-border);
|
|
751
|
+
--border-color-hue-teal: var(--hue-teal-border);
|
|
752
|
+
--border-color-hue-orange: var(--hue-orange-border);
|
|
753
|
+
--border-color-media-ink: var(--media-ink);
|
|
754
|
+
|
|
755
|
+
/* ring-* and outline-* — a focus ring, a selection frame, an inside line */
|
|
756
|
+
--ring-color-subtle: var(--border);
|
|
757
|
+
--ring-color-strong: var(--border-strong);
|
|
758
|
+
--ring-color-brand: var(--brand);
|
|
759
|
+
--ring-color-danger-strong: var(--danger-border-strong);
|
|
760
|
+
--ring-color-warning-strong: var(--warning-border-strong);
|
|
761
|
+
--outline-color-subtle: var(--border);
|
|
762
|
+
--outline-color-strong: var(--border-strong);
|
|
763
|
+
--outline-color-brand: var(--brand);
|
|
764
|
+
--outline-color-danger-strong: var(--danger-border-strong);
|
|
765
|
+
--outline-color-warning-strong: var(--warning-border-strong);
|
|
766
|
+
--ring-color-media-ink: var(--media-ink);
|
|
767
|
+
|
|
768
|
+
/* fill-* and stroke-* — for SVG: the text roles, the card, and the two lines */
|
|
769
|
+
--fill-primary: var(--text-primary);
|
|
770
|
+
--fill-secondary: var(--text-secondary);
|
|
771
|
+
--fill-muted: var(--text-muted);
|
|
772
|
+
--fill-surface: var(--bg-surface);
|
|
773
|
+
--fill-subtle: var(--border);
|
|
774
|
+
--fill-strong: var(--border-strong);
|
|
775
|
+
--stroke-primary: var(--text-primary);
|
|
776
|
+
--stroke-secondary: var(--text-secondary);
|
|
777
|
+
--stroke-muted: var(--text-muted);
|
|
778
|
+
--stroke-surface: var(--bg-surface);
|
|
779
|
+
--stroke-subtle: var(--border);
|
|
780
|
+
--stroke-strong: var(--border-strong);
|
|
781
|
+
}
|
|
782
|
+
|
|
783
|
+
/* Money utilities backed by the tokens above. Unlayered so they win over Tailwind's
|
|
784
|
+
layered colour utilities, and theme-aware for free (the var flips under .dark) — no
|
|
785
|
+
dark: variant needed at the call site. Plain classes, so no variants: a site that
|
|
786
|
+
needs one keeps `[var(--money-…)]` (no money theme names this round, §12.4). */
|
|
506
787
|
.text-money-pos { color: var(--money-income); }
|
|
507
788
|
.text-money-neg { color: var(--money-expense); }
|
|
508
789
|
.text-money-net { color: var(--money-net); }
|
|
509
790
|
.text-money-pos-muted { color: var(--money-income); opacity: 0.72; }
|
|
510
791
|
.text-money-neg-muted { color: var(--money-expense); opacity: 0.72; }
|
|
511
|
-
.text-brand { color: var(--brand); }
|
|
512
|
-
.bg-brand { background-color: var(--brand); }
|
|
513
792
|
.bg-money-pos { background-color: var(--money-income); }
|
|
514
793
|
.bg-money-neg { background-color: var(--money-expense); }
|
|
515
794
|
/* "No money has moved" — the fill for markers on rows that are not real yet
|
|
516
795
|
(scheduled / future-dated). Deliberately NOT brand and NOT money-pos: those
|
|
517
796
|
two mean settled, and a future row wearing one of them reads as done. */
|
|
518
797
|
.bg-money-neutral { background-color: var(--money-neutral); }
|
|
519
|
-
.border-brand { border-color: var(--brand); }
|
|
520
798
|
|
|
521
799
|
/* Visually hidden, like Tailwind's `sr-only`, but POSITION: FIXED rather than absolute.
|
|
522
800
|
*
|