@eifi1/ui-kit 0.4.0 → 0.5.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/LICENSE +32 -0
- package/README.md +498 -57
- package/dist/chart.d.ts +10 -0
- package/dist/chart.js +10 -0
- package/dist/chart.js.map +1 -0
- package/dist/components/account-settings.d.ts +11 -0
- package/dist/components/account-settings.js +19 -12
- package/dist/components/account-settings.js.map +1 -1
- package/dist/components/alert-banner.d.ts +10 -6
- package/dist/components/alert-banner.js +20 -16
- package/dist/components/alert-banner.js.map +1 -1
- package/dist/components/amount-input.d.ts +30 -4
- package/dist/components/amount-input.js +36 -14
- package/dist/components/amount-input.js.map +1 -1
- package/dist/components/calculator.d.ts +24 -7
- package/dist/components/calculator.js +37 -20
- package/dist/components/calculator.js.map +1 -1
- package/dist/components/chart-zoom.d.ts +156 -0
- package/dist/components/chart-zoom.js +262 -0
- package/dist/components/chart-zoom.js.map +1 -0
- package/dist/components/chart.d.ts +28 -3
- package/dist/components/chart.js +71 -32
- package/dist/components/chart.js.map +1 -1
- package/dist/components/checkbox.d.ts +51 -0
- package/dist/components/checkbox.js +123 -0
- package/dist/components/checkbox.js.map +1 -0
- package/dist/components/chip.d.ts +128 -0
- package/dist/components/chip.js +357 -0
- package/dist/components/chip.js.map +1 -0
- package/dist/components/choice-parts.d.ts +24 -0
- package/dist/components/choice-parts.js +18 -0
- package/dist/components/choice-parts.js.map +1 -0
- package/dist/components/combobox-core.d.ts +52 -9
- package/dist/components/combobox-core.js +91 -20
- package/dist/components/combobox-core.js.map +1 -1
- package/dist/components/combobox.d.ts +43 -33
- package/dist/components/combobox.js +409 -340
- package/dist/components/combobox.js.map +1 -1
- package/dist/components/currency-select.d.ts +48 -8
- package/dist/components/currency-select.js +107 -65
- package/dist/components/currency-select.js.map +1 -1
- package/dist/components/data-table-filter-popover.d.ts +15 -3
- package/dist/components/data-table-filter-popover.js +23 -17
- package/dist/components/data-table-filter-popover.js.map +1 -1
- package/dist/components/data-table-filters.d.ts +1 -1
- package/dist/components/data-table-filters.js +3 -2
- package/dist/components/data-table-filters.js.map +1 -1
- package/dist/components/data-table-labels.d.ts +53 -2
- package/dist/components/data-table-labels.js +31 -2
- package/dist/components/data-table-labels.js.map +1 -1
- package/dist/components/data-table-pagination.d.ts +3 -1
- package/dist/components/data-table-pagination.js +16 -10
- package/dist/components/data-table-pagination.js.map +1 -1
- package/dist/components/data-table-sort.js +1 -0
- package/dist/components/data-table-sort.js.map +1 -1
- package/dist/components/data-table.d.ts +1 -1
- package/dist/components/data-table.js +201 -85
- package/dist/components/data-table.js.map +1 -1
- package/dist/components/date-picker.d.ts +25 -9
- package/dist/components/date-picker.js +232 -94
- package/dist/components/date-picker.js.map +1 -1
- package/dist/components/dropdown.d.ts +96 -20
- package/dist/components/dropdown.js +77 -33
- package/dist/components/dropdown.js.map +1 -1
- package/dist/components/entity-combobox.d.ts +5 -4
- package/dist/components/entity-combobox.js +107 -76
- package/dist/components/entity-combobox.js.map +1 -1
- package/dist/components/facing-pair.d.ts +36 -0
- package/dist/components/facing-pair.js +40 -0
- package/dist/components/facing-pair.js.map +1 -0
- package/dist/components/field-sync.d.ts +164 -0
- package/dist/components/field-sync.js +264 -0
- package/dist/components/field-sync.js.map +1 -0
- package/dist/components/file-dropzone.d.ts +38 -6
- package/dist/components/file-dropzone.js +34 -9
- package/dist/components/file-dropzone.js.map +1 -1
- package/dist/components/full-bleed-dialog.d.ts +37 -26
- package/dist/components/full-bleed-dialog.js +20 -5
- package/dist/components/full-bleed-dialog.js.map +1 -1
- package/dist/components/grouped-picker.d.ts +21 -10
- package/dist/components/grouped-picker.js +66 -52
- package/dist/components/grouped-picker.js.map +1 -1
- package/dist/components/hover-menu.d.ts +20 -4
- package/dist/components/hover-menu.js +15 -4
- package/dist/components/hover-menu.js.map +1 -1
- package/dist/components/mini-calendar.d.ts +102 -14
- package/dist/components/mini-calendar.js +256 -70
- package/dist/components/mini-calendar.js.map +1 -1
- package/dist/components/modal.d.ts +9 -3
- package/dist/components/modal.js +34 -45
- package/dist/components/modal.js.map +1 -1
- package/dist/components/month-picker.d.ts +79 -0
- package/dist/components/month-picker.js +342 -0
- package/dist/components/month-picker.js.map +1 -0
- package/dist/components/multi-entity-combobox.d.ts +7 -6
- package/dist/components/multi-entity-combobox.js +112 -72
- package/dist/components/multi-entity-combobox.js.map +1 -1
- package/dist/components/multi-select.d.ts +13 -11
- package/dist/components/multi-select.js +161 -84
- package/dist/components/multi-select.js.map +1 -1
- package/dist/components/number-field.d.ts +92 -0
- package/dist/components/number-field.js +111 -0
- package/dist/components/number-field.js.map +1 -0
- package/dist/components/number-input.d.ts +28 -2
- package/dist/components/number-input.js +12 -2
- package/dist/components/number-input.js.map +1 -1
- package/dist/components/numpad-sheet.d.ts +32 -4
- package/dist/components/numpad-sheet.js +30 -13
- package/dist/components/numpad-sheet.js.map +1 -1
- package/dist/components/page-contents.d.ts +90 -0
- package/dist/components/page-contents.js +170 -0
- package/dist/components/page-contents.js.map +1 -0
- package/dist/components/password-strength.d.ts +106 -0
- package/dist/components/password-strength.js +132 -0
- package/dist/components/password-strength.js.map +1 -0
- package/dist/components/picker-sheet.d.ts +23 -15
- package/dist/components/picker-sheet.js +34 -14
- package/dist/components/picker-sheet.js.map +1 -1
- package/dist/components/popover.d.ts +62 -4
- package/dist/components/popover.js +52 -2
- package/dist/components/popover.js.map +1 -1
- package/dist/components/search-field.d.ts +25 -7
- package/dist/components/search-field.js +7 -5
- package/dist/components/search-field.js.map +1 -1
- package/dist/components/series-chart-labels.d.ts +14 -0
- package/dist/components/series-chart-labels.js +11 -0
- package/dist/components/series-chart-labels.js.map +1 -0
- package/dist/components/series-chart.d.ts +207 -0
- package/dist/components/series-chart.js +223 -0
- package/dist/components/series-chart.js.map +1 -0
- package/dist/components/settings-fields.d.ts +14 -4
- package/dist/components/settings-fields.js +19 -8
- package/dist/components/settings-fields.js.map +1 -1
- package/dist/components/signature-pad.d.ts +119 -0
- package/dist/components/signature-pad.js +405 -0
- package/dist/components/signature-pad.js.map +1 -0
- package/dist/components/slider.d.ts +80 -0
- package/dist/components/slider.js +155 -0
- package/dist/components/slider.js.map +1 -0
- package/dist/components/sparkline.d.ts +93 -0
- package/dist/components/sparkline.js +205 -0
- package/dist/components/sparkline.js.map +1 -0
- package/dist/components/stat-tile.d.ts +151 -0
- package/dist/components/stat-tile.js +236 -0
- package/dist/components/stat-tile.js.map +1 -0
- package/dist/components/swipeable-row.d.ts +25 -2
- package/dist/components/swipeable-row.js +31 -0
- package/dist/components/swipeable-row.js.map +1 -1
- package/dist/components/switch.d.ts +60 -0
- package/dist/components/switch.js +81 -0
- package/dist/components/switch.js.map +1 -0
- package/dist/components/time-input.d.ts +58 -0
- package/dist/components/time-input.js +50 -0
- package/dist/components/time-input.js.map +1 -0
- package/dist/components/toggle-group.d.ts +18 -3
- package/dist/components/toggle-group.js +10 -6
- package/dist/components/toggle-group.js.map +1 -1
- package/dist/components/toggle-legend.d.ts +115 -0
- package/dist/components/toggle-legend.js +114 -0
- package/dist/components/toggle-legend.js.map +1 -0
- package/dist/components/tooltip.d.ts +40 -11
- package/dist/components/tooltip.js +77 -20
- package/dist/components/tooltip.js.map +1 -1
- package/dist/components/treemap.d.ts +132 -0
- package/dist/components/treemap.js +179 -0
- package/dist/components/treemap.js.map +1 -0
- package/dist/components/ui.d.ts +159 -46
- package/dist/components/ui.js +220 -115
- package/dist/components/ui.js.map +1 -1
- package/dist/components/use-mobile-reveal.js +1 -0
- package/dist/components/use-mobile-reveal.js.map +1 -1
- package/dist/components/use-table-state.d.ts +1 -1
- package/dist/components/use-table-state.js +38 -17
- package/dist/components/use-table-state.js.map +1 -1
- package/dist/components/user-avatar.d.ts +15 -4
- package/dist/components/user-avatar.js +5 -4
- package/dist/components/user-avatar.js.map +1 -1
- package/dist/components/wizard-stepper.js +3 -2
- package/dist/components/wizard-stepper.js.map +1 -1
- package/dist/{data-table-filters-aXyf0Xub.d.ts → data-table-filters-DM1auUfH.d.ts} +27 -5
- package/dist/data-table.d.ts +7 -0
- package/dist/data-table.js +12 -0
- package/dist/data-table.js.map +1 -0
- package/dist/feedback/feedback-attachment.js +12 -11
- package/dist/feedback/feedback-attachment.js.map +1 -1
- package/dist/feedback/feedback-dialog.js +2 -1
- package/dist/feedback/feedback-dialog.js.map +1 -1
- package/dist/feedback/feedback-inbox.d.ts +33 -7
- package/dist/feedback/feedback-inbox.js +49 -37
- package/dist/feedback/feedback-inbox.js.map +1 -1
- package/dist/feedback.d.ts +5 -0
- package/dist/feedback.js +5 -0
- package/dist/feedback.js.map +1 -0
- package/dist/hooks/use-anchored-panel.js +1 -0
- package/dist/hooks/use-anchored-panel.js.map +1 -1
- package/dist/hooks/use-anchored-rect.js +1 -0
- package/dist/hooks/use-anchored-rect.js.map +1 -1
- package/dist/hooks/use-announce.d.ts +46 -0
- package/dist/hooks/use-announce.js +37 -0
- package/dist/hooks/use-announce.js.map +1 -0
- package/dist/hooks/use-body-scroll-lock.js +1 -0
- package/dist/hooks/use-body-scroll-lock.js.map +1 -1
- package/dist/hooks/use-close-transition.js +1 -0
- package/dist/hooks/use-close-transition.js.map +1 -1
- package/dist/hooks/use-dismiss.js +1 -0
- package/dist/hooks/use-dismiss.js.map +1 -1
- package/dist/hooks/use-focus-trap.d.ts +16 -0
- package/dist/hooks/use-focus-trap.js +67 -0
- package/dist/hooks/use-focus-trap.js.map +1 -0
- package/dist/hooks/use-media-query.js +1 -0
- package/dist/hooks/use-media-query.js.map +1 -1
- package/dist/hooks/use-overlay-history.js +27 -1
- package/dist/hooks/use-overlay-history.js.map +1 -1
- package/dist/hooks/use-row-swipe.js +1 -0
- package/dist/hooks/use-row-swipe.js.map +1 -1
- package/dist/i18n/defaults.d.ts +31 -0
- package/dist/i18n/defaults.js +63 -0
- package/dist/i18n/defaults.js.map +1 -0
- package/dist/i18n/kit-labels.d.ts +250 -0
- package/dist/i18n/kit-labels.js +184 -0
- package/dist/i18n/kit-labels.js.map +1 -0
- package/dist/index.d.ts +47 -22
- package/dist/index.js +28 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/calc.js +1 -0
- package/dist/lib/calc.js.map +1 -1
- package/dist/lib/cn.js +1 -0
- package/dist/lib/cn.js.map +1 -1
- package/dist/lib/dates.js +1 -0
- package/dist/lib/dates.js.map +1 -1
- package/dist/lib/logger.js +1 -0
- package/dist/lib/logger.js.map +1 -1
- package/dist/lib/safe-storage.js +1 -0
- package/dist/lib/safe-storage.js.map +1 -1
- package/dist/search/command-palette.d.ts +11 -1
- package/dist/search/command-palette.js +21 -15
- package/dist/search/command-palette.js.map +1 -1
- package/dist/search.d.ts +2 -0
- package/dist/search.js +3 -0
- package/dist/search.js.map +1 -0
- package/dist/shell/app-shell.d.ts +33 -4
- package/dist/shell/app-shell.js +275 -78
- package/dist/shell/app-shell.js.map +1 -1
- package/dist/shell/option-switcher-menu.js +3 -2
- package/dist/shell/option-switcher-menu.js.map +1 -1
- package/dist/shell/role-switcher.d.ts +6 -0
- package/dist/shell/role-switcher.js +7 -4
- package/dist/shell/role-switcher.js.map +1 -1
- package/dist/shell/top-bar.d.ts +15 -7
- package/dist/shell/top-bar.js +3 -5
- package/dist/shell/top-bar.js.map +1 -1
- package/dist/shell/topbar-action-menu.js +3 -2
- package/dist/shell/topbar-action-menu.js.map +1 -1
- package/dist/shell/topbar-controls.d.ts +5 -2
- package/dist/shell/topbar-controls.js +20 -15
- package/dist/shell/topbar-controls.js.map +1 -1
- package/dist/shell.d.ts +13 -0
- package/dist/shell.js +8 -0
- package/dist/shell.js.map +1 -0
- package/dist/theme/chart-palette.d.ts +19 -12
- package/dist/theme/chart-palette.js +24 -30
- package/dist/theme/chart-palette.js.map +1 -1
- package/dist/theme/color.d.ts +78 -0
- package/dist/theme/color.js +148 -0
- package/dist/theme/color.js.map +1 -0
- package/dist/theme/palette-derive.d.ts +140 -0
- package/dist/theme/palette-derive.js +376 -0
- package/dist/theme/palette-derive.js.map +1 -0
- package/dist/theme/palette-presets.d.ts +27 -5
- package/dist/theme/palette-presets.js +231 -33
- package/dist/theme/palette-presets.js.map +1 -1
- package/dist/theme/palette-store.js +1 -0
- package/dist/theme/palette-store.js.map +1 -1
- package/dist/theme/theme-store.js +1 -0
- package/dist/theme/theme-store.js.map +1 -1
- package/dist/tour/tour.d.ts +2 -1
- package/dist/tour/tour.js +15 -9
- package/dist/tour/tour.js.map +1 -1
- package/dist/tour.d.ts +2 -0
- package/dist/tour.js +3 -0
- package/dist/tour.js.map +1 -0
- package/dist/wizard/stepper-nav.js +10 -8
- package/dist/wizard/stepper-nav.js.map +1 -1
- package/dist/wizard/types.d.ts +18 -2
- package/dist/wizard/types.js +4 -1
- package/dist/wizard/types.js.map +1 -1
- package/dist/wizard/use-wizard.js +12 -4
- package/dist/wizard/use-wizard.js.map +1 -1
- package/dist/wizard/validation.js +1 -0
- package/dist/wizard/validation.js.map +1 -1
- package/dist/wizard/wizard-context.js +1 -0
- package/dist/wizard/wizard-context.js.map +1 -1
- package/dist/wizard/wizard-step.js +1 -0
- package/dist/wizard/wizard-step.js.map +1 -1
- package/dist/wizard/wizard-summary.js +5 -3
- package/dist/wizard/wizard-summary.js.map +1 -1
- package/dist/wizard.d.ts +8 -0
- package/dist/wizard.js +9 -0
- package/dist/wizard.js.map +1 -0
- package/package.json +67 -14
- package/src/chart.ts +22 -0
- package/src/components/account-settings.tsx +275 -0
- package/src/components/alert-banner.tsx +75 -0
- package/src/components/amount-input.tsx +471 -0
- package/src/components/calculator.tsx +252 -0
- package/src/components/chart-zoom.tsx +499 -0
- package/src/components/chart.tsx +363 -0
- package/src/components/checkbox.tsx +222 -0
- package/src/components/chip.tsx +570 -0
- package/src/components/choice-parts.ts +33 -0
- package/src/components/combobox-core.tsx +540 -0
- package/src/components/combobox.tsx +1026 -0
- package/src/components/currency-select.tsx +269 -0
- package/src/components/data-table-filter-popover.tsx +252 -0
- package/src/components/data-table-filters.ts +176 -0
- package/src/components/data-table-labels.ts +190 -0
- package/src/components/data-table-pagination.tsx +126 -0
- package/src/components/data-table-sort.ts +70 -0
- package/src/components/data-table.tsx +1740 -0
- package/src/components/date-picker.tsx +631 -0
- package/src/components/dropdown.tsx +341 -0
- package/src/components/entity-combobox.tsx +215 -0
- package/src/components/facing-pair.ts +86 -0
- package/src/components/field-sync.tsx +472 -0
- package/src/components/file-dropzone.tsx +181 -0
- package/src/components/full-bleed-dialog.tsx +179 -0
- package/src/components/grouped-picker.tsx +157 -0
- package/src/components/hover-menu.tsx +183 -0
- package/src/components/mini-calendar.tsx +554 -0
- package/src/components/modal.tsx +287 -0
- package/src/components/month-picker.tsx +549 -0
- package/src/components/multi-entity-combobox.tsx +226 -0
- package/src/components/multi-select.tsx +303 -0
- package/src/components/number-field.tsx +225 -0
- package/src/components/number-input.tsx +211 -0
- package/src/components/numpad-sheet.tsx +264 -0
- package/src/components/page-contents.tsx +289 -0
- package/src/components/password-strength.tsx +258 -0
- package/src/components/picker-sheet.tsx +251 -0
- package/src/components/popover.tsx +195 -0
- package/src/components/search-field.tsx +146 -0
- package/src/components/series-chart-labels.ts +26 -0
- package/src/components/series-chart.tsx +481 -0
- package/src/components/settings-fields.tsx +68 -0
- package/src/components/signature-pad.tsx +630 -0
- package/src/components/slider.tsx +313 -0
- package/src/components/sparkline.tsx +329 -0
- package/src/components/stat-tile.tsx +448 -0
- package/src/components/swipeable-row.tsx +271 -0
- package/src/components/switch.tsx +170 -0
- package/src/components/time-input.tsx +107 -0
- package/src/components/toggle-group.tsx +153 -0
- package/src/components/toggle-legend.tsx +229 -0
- package/src/components/tooltip.tsx +477 -0
- package/src/components/treemap.tsx +390 -0
- package/src/components/ui.tsx +1284 -0
- package/src/components/use-mobile-reveal.ts +54 -0
- package/src/components/use-table-state.ts +295 -0
- package/src/components/user-avatar.tsx +61 -0
- package/src/components/wizard-stepper.tsx +37 -0
- package/src/data-table.ts +19 -0
- package/src/feedback/feedback-attachment.tsx +246 -0
- package/src/feedback/feedback-dialog.tsx +209 -0
- package/src/feedback/feedback-inbox.tsx +615 -0
- package/src/feedback.ts +8 -0
- package/src/hooks/use-anchored-panel.ts +169 -0
- package/src/hooks/use-anchored-rect.ts +78 -0
- package/src/hooks/use-announce.ts +85 -0
- package/src/hooks/use-body-scroll-lock.ts +94 -0
- package/src/hooks/use-close-transition.ts +99 -0
- package/src/hooks/use-dismiss.ts +77 -0
- package/src/hooks/use-focus-trap.ts +160 -0
- package/src/hooks/use-media-query.ts +23 -0
- package/src/hooks/use-overlay-history.ts +345 -0
- package/src/hooks/use-row-swipe.ts +212 -0
- package/src/i18n/defaults.ts +68 -0
- package/src/i18n/kit-labels.tsx +447 -0
- package/src/index.ts +169 -0
- package/src/lib/calc.ts +309 -0
- package/src/lib/cn.ts +5 -0
- package/src/lib/dates.ts +187 -0
- package/src/lib/logger.ts +73 -0
- package/src/lib/safe-storage.ts +37 -0
- package/src/search/command-palette.tsx +342 -0
- package/src/search.ts +3 -0
- package/src/shell/app-shell.tsx +772 -0
- package/src/shell/option-switcher-menu.tsx +72 -0
- package/src/shell/role-switcher.tsx +46 -0
- package/src/shell/top-bar.tsx +39 -0
- package/src/shell/topbar-action-menu.tsx +91 -0
- package/src/shell/topbar-controls.tsx +229 -0
- package/src/shell.ts +10 -0
- package/src/theme/chart-palette.ts +145 -0
- package/src/theme/color.ts +266 -0
- package/src/theme/palette-derive.ts +681 -0
- package/src/theme/palette-presets.ts +760 -0
- package/src/theme/palette-store.ts +94 -0
- package/src/theme/theme-store.ts +145 -0
- package/src/tour/tour.tsx +586 -0
- package/src/tour.ts +3 -0
- package/src/vite-env.d.ts +26 -0
- package/src/wizard/stepper-nav.tsx +221 -0
- package/src/wizard/types.ts +178 -0
- package/src/wizard/use-wizard.ts +345 -0
- package/src/wizard/validation.ts +37 -0
- package/src/wizard/wizard-context.tsx +29 -0
- package/src/wizard/wizard-step.tsx +14 -0
- package/src/wizard/wizard-summary.tsx +69 -0
- package/src/wizard.ts +14 -0
- package/tokens.css +222 -20
package/tokens.css
CHANGED
|
@@ -1,26 +1,32 @@
|
|
|
1
|
-
/* @
|
|
1
|
+
/* @eifi1/ui-kit design tokens + semantic utilities.
|
|
2
2
|
*
|
|
3
3
|
* The single source of truth for the shared appearance layer: brand + data
|
|
4
4
|
* colours (theme-aware via `.dark`), the semantic money utilities, the brand
|
|
5
5
|
* accent for checkboxes/radios, and the global keyframes/scrollbar chrome.
|
|
6
6
|
*
|
|
7
7
|
* Consumers import this ONCE (after their own `@import "tailwindcss"`):
|
|
8
|
-
* @import "@
|
|
8
|
+
* @import "@eifi1/ui-kit/tokens.css";
|
|
9
9
|
* and add the package to Tailwind's source scan so its class names are kept:
|
|
10
|
-
* @source "../node_modules/@
|
|
10
|
+
* @source "../node_modules/@eifi1/ui-kit/dist";
|
|
11
|
+
* (relative to the importing CSS file — see README §2. An @source that resolves to
|
|
12
|
+
* nothing is silent, and the app renders unstyled rather than erroring.)
|
|
11
13
|
*
|
|
12
14
|
* NOTE: these :root/.dark values MIRROR DEFAULT_PRESET in the palette theme module,
|
|
13
15
|
* which is what actually paints them — the palette layer writes the active preset
|
|
14
16
|
* tokens inline on <html> at runtime (Tailwind v4 strips a root block that holds only
|
|
15
17
|
* custom properties, so this block is a documentation mirror, not the live source).
|
|
16
18
|
*
|
|
17
|
-
* Because it is inert, it drifts silently, and it
|
|
18
|
-
* below still held the pre-#328 palette while DEFAULT_PRESET had moved to Solar
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
19
|
+
* Because it is inert, it drifts silently, and it did — twice. The surfaces and text
|
|
20
|
+
* colour below still held the pre-#328 palette while DEFAULT_PRESET had moved to Solar
|
|
21
|
+
* Dusk; they were resynced when --text-secondary/--text-muted were added. The money
|
|
22
|
+
* trio and the dark brand accent were left behind that time and written off in this
|
|
23
|
+
* note as "nothing reads them" — nine values, including the accent a consumer copies
|
|
24
|
+
* when they want to know what the brand IS.
|
|
25
|
+
*
|
|
26
|
+
* They are resynced now, and theme/__tests__/tokens-css-mirror.test.ts compares every
|
|
27
|
+
* one of these 46 values against DEFAULT_PRESET on each run, so the next drift fails a
|
|
28
|
+
* test instead of earning a paragraph. The direction is one-way: the presets are the
|
|
29
|
+
* source, this file follows. */
|
|
24
30
|
|
|
25
31
|
@custom-variant dark (&:where(.dark, .dark *));
|
|
26
32
|
|
|
@@ -39,10 +45,37 @@
|
|
|
39
45
|
--brand: #4f46e5; /* indigo-600 */
|
|
40
46
|
--brand-hover: #4338ca; /* indigo-700 */
|
|
41
47
|
--brand-contrast: #ffffff;
|
|
42
|
-
--money-income: #
|
|
43
|
-
|
|
44
|
-
--money-
|
|
45
|
-
|
|
48
|
+
--money-income: #0b6650; /* deep teal — the preset's own, darker than
|
|
49
|
+
teal-700 so it clears AA as TEXT on --bg-page */
|
|
50
|
+
--money-expense: #905902; /* solved: amber-700 (#b45309) reached only 3.88:1 as
|
|
51
|
+
TEXT on --bg-page, below WCAG AA. See the preset
|
|
52
|
+
audit in theme/__tests__/palette-audit.test.ts. */
|
|
53
|
+
--money-net: #7a4fa3; /* muted violet, warmed to this palette */
|
|
54
|
+
--money-neutral: #6b6453; /* warm slate */
|
|
55
|
+
|
|
56
|
+
/* ── Field sync status ─────────────────────────────────────────────────────
|
|
57
|
+
The four states a database-backed field can be in. Deliberately NOT part of
|
|
58
|
+
`TokenSet` and NOT per-preset: these are functional signals, like a traffic
|
|
59
|
+
light, and a field that means "saved" must not change meaning because somebody
|
|
60
|
+
picked a different appearance preset. They do flip light/dark, because contrast
|
|
61
|
+
is not optional.
|
|
62
|
+
|
|
63
|
+
They mark a field's FRAME and an ICON at its end — non-text graphics, for which
|
|
64
|
+
WCAG 1.4.11 asks 3:1 against the surface — and all four clear it on the worst of
|
|
65
|
+
the three light surfaces. `--status-edited` is amber rather than the orange-800 it
|
|
66
|
+
was: beside red-700 that orange read as a second error colour, and "unsaved" has
|
|
67
|
+
to look like a caution, not an alarm. Amber is below 4.5:1, so it is not a TEXT
|
|
68
|
+
colour: `FieldSyncIndicator` prints its words in `--text-secondary` beside it.
|
|
69
|
+
|
|
70
|
+
GREEN AND RED ARE THE CLASSIC CVD-UNSAFE PAIR, and the rest of this file goes out
|
|
71
|
+
of its way to avoid it — the money trio is teal/amber/violet for exactly this
|
|
72
|
+
reason. They are used here because the states were specified in these colours, so
|
|
73
|
+
`FieldSyncIndicator` gives every state its own ICON as well and colour is never
|
|
74
|
+
the only signal. Do not drop the icons. */
|
|
75
|
+
--status-synced: #166534; /* green-800 — persisted */
|
|
76
|
+
--status-pending: #1d4ed8; /* blue-700 — in flight */
|
|
77
|
+
--status-edited: #d97706; /* amber-600 — dirty, not yet saved */
|
|
78
|
+
--status-error: #b91c1c; /* red-700 — the save failed */
|
|
46
79
|
--chart-1: #332288;
|
|
47
80
|
--chart-2: #88ccee;
|
|
48
81
|
--chart-3: #44aa99;
|
|
@@ -63,10 +96,12 @@
|
|
|
63
96
|
/* As in `:root` — 7.0:1 and 4.8:1 against the worst of the three dark surfaces. */
|
|
64
97
|
--text-secondary: #adafbe;
|
|
65
98
|
--text-muted: #8d90a0;
|
|
66
|
-
--brand: #
|
|
67
|
-
|
|
68
|
-
--brand-
|
|
69
|
-
--
|
|
99
|
+
--brand: #8b93f8; /* indigo, lifted off the Tailwind scale to sit at
|
|
100
|
+
the same OKLab lightness as the other dark tokens */
|
|
101
|
+
--brand-hover: #aab1fb;
|
|
102
|
+
--brand-contrast: #16182b; /* the dark page, not indigo-950: a filled brand
|
|
103
|
+
button reads as a hole in the surface it sits on */
|
|
104
|
+
--money-income: #22c3b6; /* teal, pulled down to the dark set's lightness */
|
|
70
105
|
/* Deliberately NOT amber-400 (#fbbf24). Every other colour on a dark surface
|
|
71
106
|
sits around OKLab L 0.68–0.74 (brand 0.68, net 0.70, neutral 0.71, income
|
|
72
107
|
0.74); amber-400 lands at 0.84, so outflows — most rows in a register — shouted
|
|
@@ -74,8 +109,15 @@
|
|
|
74
109
|
meaning. Same hue (84°) and chroma, pulled to L 0.785: still 8.9:1 on the card
|
|
75
110
|
surface, still far from income in CVD space (Keksdose dev#434). */
|
|
76
111
|
--money-expense: #e4b035;
|
|
77
|
-
--money-net: #
|
|
78
|
-
--money-neutral: #
|
|
112
|
+
--money-net: #b39aef;
|
|
113
|
+
--money-neutral: #9aa1bd; /* the palette's own cool grey, not zinc-400 */
|
|
114
|
+
|
|
115
|
+
/* Field sync status — see the note in `:root`. Against the worst of the three dark
|
|
116
|
+
surfaces these run 8.7 / 9.1 / 6.7 / 8.0:1. */
|
|
117
|
+
--status-synced: #4ade80; /* green-400 */
|
|
118
|
+
--status-pending: #7dd3fc; /* sky-300 */
|
|
119
|
+
--status-edited: #fbbf24; /* amber-400 */
|
|
120
|
+
--status-error: #fca5a5; /* red-300 */
|
|
79
121
|
--chart-1: #7e72d6;
|
|
80
122
|
--chart-2: #9fd8f2;
|
|
81
123
|
--chart-3: #5fc4b0;
|
|
@@ -87,6 +129,110 @@
|
|
|
87
129
|
--chart-9: #cc78be;
|
|
88
130
|
}
|
|
89
131
|
|
|
132
|
+
/* ── Derived surface / text roles ───────────────────────────────────────────
|
|
133
|
+
Everything here is computed FROM the tokens `applyTokenSet` writes inline on
|
|
134
|
+
<html>, so each one follows the active palette preset without being part of
|
|
135
|
+
`TokenSet` and without every preset having to spell it out. That is also why
|
|
136
|
+
they are `color-mix` rather than literals: one formula is correct in both
|
|
137
|
+
themes, because the inputs flip.
|
|
138
|
+
|
|
139
|
+
These exist because the components did not have them and reached for Tailwind's
|
|
140
|
+
slate scale instead — 815 hardcoded colour utilities against 85 token
|
|
141
|
+
references, which is the reason a consumer could not re-skin this kit without
|
|
142
|
+
forking it. See docs/module-audit-2026-09-22.md §theming. */
|
|
143
|
+
:root,
|
|
144
|
+
.dark {
|
|
145
|
+
/* Dimmer than `--text-muted`: placeholders, disabled text, the empty half of a
|
|
146
|
+
value. Mixing TOWARD the surface fades it in light and in dark alike. */
|
|
147
|
+
--text-placeholder: color-mix(in oklab, var(--text-muted) 65%, var(--bg-surface));
|
|
148
|
+
|
|
149
|
+
/* The wash under a hovered row, menu item or icon button. Mixing the TEXT colour
|
|
150
|
+
into the surface darkens it on a light theme and lightens it on a dark one,
|
|
151
|
+
which is the behaviour a fixed `slate-100`/`slate-800` pair was faking. */
|
|
152
|
+
--bg-hover: color-mix(in oklab, var(--text-primary) 7%, var(--bg-surface));
|
|
153
|
+
--bg-active: color-mix(in oklab, var(--text-primary) 12%, var(--bg-surface));
|
|
154
|
+
|
|
155
|
+
/* A chip that inverts against the page — a selected day, a keyboard hint. These
|
|
156
|
+
are literally the text and surface colours swapped, which is what
|
|
157
|
+
`bg-slate-900 dark:bg-slate-100` was approximating. */
|
|
158
|
+
--bg-inverse: var(--text-primary);
|
|
159
|
+
--text-inverse: var(--bg-surface);
|
|
160
|
+
|
|
161
|
+
/* A border that has to be seen rather than merely felt: a focused field, a
|
|
162
|
+
selected card. `--border` pulled toward the text colour. */
|
|
163
|
+
--border-strong: color-mix(in oklab, var(--border) 55%, var(--text-primary));
|
|
164
|
+
|
|
165
|
+
/* The SOFT brand: a tinted chip rather than a filled one — an active filter, a
|
|
166
|
+
selected day, a resize handle under the cursor. The kit had `--brand`,
|
|
167
|
+
`--brand-hover` and `--brand-contrast` but nothing for "brand, quietly", so
|
|
168
|
+
components reached for `bg-indigo-100 dark:bg-indigo-500/20` and a consumer
|
|
169
|
+
who changed `--brand` was left with an indigo island. Derived, so it follows
|
|
170
|
+
whatever the brand becomes. */
|
|
171
|
+
--brand-bg: color-mix(in oklab, var(--brand) 14%, var(--bg-surface));
|
|
172
|
+
--brand-bg-hover: color-mix(in oklab, var(--brand) 24%, var(--bg-surface));
|
|
173
|
+
/* Brand text ON `--brand-bg` — pulled away from the surface so it keeps contrast
|
|
174
|
+
against its own tint in both themes. */
|
|
175
|
+
--brand-muted: color-mix(in oklab, var(--brand) 70%, var(--text-primary));
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/* ── Semantic status ────────────────────────────────────────────────────────
|
|
179
|
+
Destructive and cautionary UI. These are the values the components already
|
|
180
|
+
painted, lifted out of the class names so a consumer can change them — the kit
|
|
181
|
+
previously shipped two different destructive hues with no way to override
|
|
182
|
+
either. Not derived, because a warning is a specific colour, not a tint of the
|
|
183
|
+
page.
|
|
184
|
+
|
|
185
|
+
Distinct from the `--status-*` family above: those describe a FIELD's journey
|
|
186
|
+
to the database, these describe an ACTION's consequence. A row can be
|
|
187
|
+
`--status-error` (its last save failed) inside a form whose delete button is
|
|
188
|
+
`--danger` (it will destroy something), and they should not look identical. */
|
|
189
|
+
:root {
|
|
190
|
+
--danger: #be123c; /* rose-700 */
|
|
191
|
+
--danger-hover: #9f1239; /* rose-800 */
|
|
192
|
+
--danger-contrast: #ffffff;
|
|
193
|
+
--danger-border: #fb7185; /* rose-400 */
|
|
194
|
+
--danger-bg: #fff1f2; /* rose-50 */
|
|
195
|
+
|
|
196
|
+
--warning: #b45309; /* amber-700 */
|
|
197
|
+
--warning-border: #fcd34d; /* amber-300 */
|
|
198
|
+
--warning-bg: #fffbeb; /* amber-50 */
|
|
199
|
+
|
|
200
|
+
/* Informational, and deliberately NOT the brand: a count of active filters is
|
|
201
|
+
not a call to action, and painting it `--brand` would make every table look
|
|
202
|
+
like it had a primary button in the toolbar. */
|
|
203
|
+
--info: #0369a1; /* sky-700 */
|
|
204
|
+
--info-border: #7dd3fc; /* sky-300 */
|
|
205
|
+
--info-bg: #e0f2fe; /* sky-100 */
|
|
206
|
+
|
|
207
|
+
/* Done, resolved, accepted. Distinct from `--status-synced` for the same reason
|
|
208
|
+
`--danger` is distinct from `--status-error`: that family describes a FIELD's
|
|
209
|
+
journey to the database, this one an ACTION's outcome. Emerald rather than the
|
|
210
|
+
money teal, so a "resolved" chip cannot be misread as an inflow. */
|
|
211
|
+
--success: #047857; /* emerald-700 */
|
|
212
|
+
--success-border: #6ee7b7; /* emerald-300 */
|
|
213
|
+
--success-bg: #d1fae5; /* emerald-100 */
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
.dark {
|
|
217
|
+
--danger: #fda4af; /* rose-300 */
|
|
218
|
+
--danger-hover: #fecdd3; /* rose-200 */
|
|
219
|
+
--danger-contrast: #4c0519; /* rose-950 */
|
|
220
|
+
--danger-border: #e11d48; /* rose-600 */
|
|
221
|
+
--danger-bg: rgba(136, 19, 55, 0.2);
|
|
222
|
+
|
|
223
|
+
--warning: #fcd34d; /* amber-300 */
|
|
224
|
+
--warning-border: rgba(180, 83, 9, 0.6);
|
|
225
|
+
--warning-bg: rgba(120, 53, 15, 0.2);
|
|
226
|
+
|
|
227
|
+
--info: #7dd3fc; /* sky-300 */
|
|
228
|
+
--info-border: rgba(3, 105, 161, 0.6);
|
|
229
|
+
--info-bg: rgba(12, 74, 110, 0.25);
|
|
230
|
+
|
|
231
|
+
--success: #6ee7b7; /* emerald-300 */
|
|
232
|
+
--success-border: rgba(4, 120, 87, 0.6);
|
|
233
|
+
--success-bg: rgba(6, 78, 59, 0.25);
|
|
234
|
+
}
|
|
235
|
+
|
|
90
236
|
/* Semantic colour utilities backed by the tokens above. Unlayered so they win
|
|
91
237
|
over Tailwind's layered colour utilities, and theme-aware for free (the var
|
|
92
238
|
flips under .dark) — no dark: variant needed at the call site. */
|
|
@@ -105,6 +251,33 @@
|
|
|
105
251
|
.bg-money-neutral { background-color: var(--money-neutral); }
|
|
106
252
|
.border-brand { border-color: var(--brand); }
|
|
107
253
|
|
|
254
|
+
/* Visually hidden, like Tailwind's `sr-only`, but POSITION: FIXED rather than absolute.
|
|
255
|
+
*
|
|
256
|
+
* `sr-only` is `position: absolute`, so an element wearing it with no positioned
|
|
257
|
+
* ancestor resolves its containing block to the INITIAL one and is laid out at its own
|
|
258
|
+
* offset from the top of the document. Nothing looks wrong — it is 1x1 and clipped —
|
|
259
|
+
* but `documentElement.scrollHeight` grows to reach it, which on a long page produces a
|
|
260
|
+
* second, whole-document scrollbar beside the app shell's own, scrolling past the end of
|
|
261
|
+
* the content into nothing. Measured on the showcase: body 900px, document 47,919px,
|
|
262
|
+
* with the deepest escaped `input.sr-only` sitting at offsetTop 47,918.
|
|
263
|
+
*
|
|
264
|
+
* A fixed element is out of flow AND out of the document's scroll height, so this one
|
|
265
|
+
* can be dropped anywhere — a live region inside a table, a hidden input inside a
|
|
266
|
+
* dropzone — without its container having to remember to be `relative`. Prefer it for
|
|
267
|
+
* anything the kit renders on a consumer's behalf, where there is no wrapper to fix.
|
|
268
|
+
*/
|
|
269
|
+
.sr-only-fixed {
|
|
270
|
+
position: fixed;
|
|
271
|
+
width: 1px;
|
|
272
|
+
height: 1px;
|
|
273
|
+
padding: 0;
|
|
274
|
+
margin: -1px;
|
|
275
|
+
overflow: hidden;
|
|
276
|
+
clip-path: inset(50%);
|
|
277
|
+
white-space: nowrap;
|
|
278
|
+
border-width: 0;
|
|
279
|
+
}
|
|
280
|
+
|
|
108
281
|
html, body, #root {
|
|
109
282
|
height: 100%;
|
|
110
283
|
}
|
|
@@ -214,6 +387,30 @@ body {
|
|
|
214
387
|
.animate-overlay { animation-duration: 0.01ms; }
|
|
215
388
|
}
|
|
216
389
|
|
|
390
|
+
/* The sidebar's flyout panel: a short fade and a 4px slide out of the sidebar, so it
|
|
391
|
+
reads as coming FROM the entry it belongs to rather than appearing beside it. The
|
|
392
|
+
slide uses the inline axis, so it runs the right way under `dir="rtl"` too. Under
|
|
393
|
+
reduced motion it only fades — nothing travels. */
|
|
394
|
+
@keyframes flyout-in {
|
|
395
|
+
from { opacity: 0; translate: var(--flyout-from, -4px) 0; }
|
|
396
|
+
to { opacity: 1; translate: 0 0; }
|
|
397
|
+
}
|
|
398
|
+
[dir="rtl"] .animate-flyout { --flyout-from: 4px; }
|
|
399
|
+
.animate-flyout { animation: flyout-in 0.14s ease-out; }
|
|
400
|
+
@media (prefers-reduced-motion: reduce) {
|
|
401
|
+
.animate-flyout { animation-name: overlay-fade-in; }
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
/* The phone's page row (AppShell `mobileSubNav`) rising out of the bottom bar. */
|
|
405
|
+
@keyframes subnav-in {
|
|
406
|
+
from { opacity: 0; transform: translateY(6px); }
|
|
407
|
+
to { opacity: 1; transform: none; }
|
|
408
|
+
}
|
|
409
|
+
.animate-subnav { animation: subnav-in 0.2s ease-out; }
|
|
410
|
+
@media (prefers-reduced-motion: reduce) {
|
|
411
|
+
.animate-subnav { animation-name: overlay-fade-in; }
|
|
412
|
+
}
|
|
413
|
+
|
|
217
414
|
/* Chart drilldown fan-out/-in (feedback #260 rework): the remounted chart eases
|
|
218
415
|
in instead of snapping. */
|
|
219
416
|
@keyframes drill-in {
|
|
@@ -223,6 +420,11 @@ body {
|
|
|
223
420
|
.animate-drill {
|
|
224
421
|
animation: drill-in 0.25s ease-out;
|
|
225
422
|
}
|
|
423
|
+
/* A drilldown still has to SAY the level changed, so under reduced motion the chart
|
|
424
|
+
fades in rather than appearing in one frame — but it no longer scales. */
|
|
425
|
+
@media (prefers-reduced-motion: reduce) {
|
|
426
|
+
.animate-drill { animation-name: overlay-fade-in; }
|
|
427
|
+
}
|
|
226
428
|
|
|
227
429
|
/* Scrollbars: keep light defaults; theme to slate when dark mode is active. */
|
|
228
430
|
.dark {
|