@memobit/themes 1.3.0 → 2.0.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.
Files changed (56) hide show
  1. package/README.md +70 -7
  2. package/dist/authored/sandy-parchment.css +83 -0
  3. package/dist/authored.css +83 -0
  4. package/dist/authoredEngine.d.ts +11 -0
  5. package/dist/authoredEngine.js +17 -0
  6. package/dist/authoredThemes.d.ts +4 -0
  7. package/dist/authoredThemes.js +6 -0
  8. package/dist/index.d.ts +2 -0
  9. package/dist/index.js +4 -3
  10. package/dist/previewPalettes.js +9 -162
  11. package/dist/themeConfig.js +9 -133
  12. package/dist/themes/circuit-harbor.css +1 -0
  13. package/dist/themes.css +1 -1
  14. package/dist/vite.js +1 -2
  15. package/package.json +10 -5
  16. package/src/theming/circuit-harbor.scss +36 -0
  17. package/dist/themes/amber-meridian.css +0 -1
  18. package/dist/themes/archive-indigo.css +0 -1
  19. package/dist/themes/blush-market.css +0 -1
  20. package/dist/themes/brass-chronicle.css +0 -1
  21. package/dist/themes/clinical-aqua.css +0 -1
  22. package/dist/themes/command-slate.css +0 -1
  23. package/dist/themes/ember-night.css +0 -1
  24. package/dist/themes/frost-petal.css +0 -1
  25. package/dist/themes/gilded-bear.css +0 -1
  26. package/dist/themes/horizon-drift.css +0 -1
  27. package/dist/themes/lavender-mist.css +0 -1
  28. package/dist/themes/light-blue.css +0 -1
  29. package/dist/themes/midnight-folio.css +0 -1
  30. package/dist/themes/mint-meadow.css +0 -1
  31. package/dist/themes/mintone.css +0 -1
  32. package/dist/themes/neon-tokyo.css +0 -1
  33. package/dist/themes/spectrum-vault.css +0 -1
  34. package/dist/themes/twilight-pulse.css +0 -1
  35. package/dist/themes/velvet-reel.css +0 -1
  36. package/dist/themes/velvet-tome.css +0 -1
  37. package/src/theming/amber-meridian.scss +0 -271
  38. package/src/theming/archive-indigo.scss +0 -270
  39. package/src/theming/blush-market.scss +0 -271
  40. package/src/theming/brass-chronicle.scss +0 -271
  41. package/src/theming/clinical-aqua.scss +0 -270
  42. package/src/theming/command-slate.scss +0 -34
  43. package/src/theming/ember-night.scss +0 -268
  44. package/src/theming/frost-petal.scss +0 -268
  45. package/src/theming/gilded-bear.scss +0 -271
  46. package/src/theming/horizon-drift.scss +0 -271
  47. package/src/theming/lavender-mist.scss +0 -268
  48. package/src/theming/light-blue.scss +0 -268
  49. package/src/theming/midnight-folio.scss +0 -34
  50. package/src/theming/mint-meadow.scss +0 -268
  51. package/src/theming/mintone.scss +0 -268
  52. package/src/theming/neon-tokyo.scss +0 -268
  53. package/src/theming/spectrum-vault.scss +0 -271
  54. package/src/theming/twilight-pulse.scss +0 -268
  55. package/src/theming/velvet-reel.scss +0 -272
  56. package/src/theming/velvet-tome.scss +0 -271
package/README.md CHANGED
@@ -1,24 +1,87 @@
1
1
  # @memobit/themes
2
2
 
3
- 68 themes for the Memobit apps. Each is published as its own stylesheet, so an app loads
4
- only the one it is showing instead of all of them.
3
+ Themes for the Memobit apps, in two forms:
4
+
5
+ - **Authored** (new in 2.0): a hand-made theme written as its design choices — ink and text
6
+ tiers, paper surfaces, lines, the accent and status colours, how a selection looks, the
7
+ voice of titles and labels, shadows and glass. The build derives every component value
8
+ from those choices through one shared bridge, so badges, chips, inputs and toasts behave
9
+ the same way in every theme while each keeps its own look.
10
+ - **Classic**: the 49 hand-written themes, each setting ~230 component values directly and
11
+ published as its own stylesheet. They keep working unchanged while apps move over.
5
12
 
6
13
  Extracted from [`@memobit/libs`](https://github.com/CristeaIulian/memobit-react-library) in
7
14
  v3.0.0 of that library.
8
15
 
9
- ## Why
16
+ ## Authored themes
17
+
18
+ ```ts
19
+ import '@memobit/themes/authored.css';
20
+ import { applyAuthoredEngine, clearAuthoredEngine } from '@memobit/themes';
21
+
22
+ applyAuthoredEngine(); // the authored version of whatever data-theme names, where one exists
23
+ clearAuthoredEngine(); // back to the classic theme
24
+ ```
25
+
26
+ An authored theme applies under its classic theme's `data-theme` while the root carries
27
+ `data-theme-engine="authored"`, so an app can flip between the two. Where no authored
28
+ version exists, the classic theme shows through.
29
+
30
+ ### Layers
31
+
32
+ 1. **The theme** (`src/authored/<id>.ts`): about 20 required choices and some optional
33
+ ones, typed by `src/authored/contract.ts`. Written by hand or with Claude Design.
34
+ 2. **Roles** (`scripts/authored/derive.ts`): turns the choices into semantic roles
35
+ (`--surface-*`, `--text-*`, `--border-*`, `--field-*`, `--tone-*`, `--selected-*`). An
36
+ optional choice left out gets the obvious derivation, e.g. a hover is the solid pushed
37
+ towards the ink.
38
+ 3. **Bridge** (`scripts/authored/bridge.ts`): maps the roles onto every component token
39
+ `@memobit/libs` reads (`--button-info-background-color`, `--dropdown-header-color`…).
40
+ 4. **Recipes** (`src/authored/recipes.css`): Badge and Chip share one tone recipe.
41
+
42
+ Every tone (neutral, accent, success, warning, danger) exposes the same roles: `solid`,
43
+ `solid-hover`, `on-solid`, `soft`, `soft-hover`, `on-soft`, `border`, `text`. Buttons,
44
+ badges, chips, toasts, progress bars and tabs all read them, which is what keeps a
45
+ "success" the same colour everywhere. The lib's `info` variant is its primary action and
46
+ maps to the accent tone. Every field (text inputs, dropdowns, date pickers, sliders) reads
47
+ the same `--field-*` roles, and the `selection` choice (`ink`, `soft`, `solid`) decides how
48
+ selected chips, tabs and ticked checkboxes look.
49
+
50
+ ### Checks
51
+
52
+ `npm run build:authored` fails when
53
+
54
+ - a token some classic theme sets is not produced by the bridge, since it would leak
55
+ through from the classic theme still loaded underneath, or
56
+ - a role the bridge or recipes read is not produced by a theme.
57
+
58
+ It also reports text/background pairs below their contrast target (4.5:1, 3:1 for
59
+ placeholders) without failing, while authored themes reproduce classic ones as they were.
60
+
61
+ ### Adding a theme
62
+
63
+ 1. Add `src/authored/<id>.ts` exporting an `AuthoredTheme`, with the classic theme's id.
64
+ 2. Add it to `AUTHORED_THEMES` in `scripts/build-authored.ts`.
65
+ 3. Run `npm run build`. Its stylesheet lands in `dist/authored/<id>.css` and in
66
+ `dist/authored.css`.
67
+
68
+ The theme's fonts are still loaded through the classic theme's `THEME_CONFIGS` entry.
69
+
70
+ ## Classic themes
71
+
72
+ ### Why
10
73
 
11
74
  Themes used to ship as a single aggregate stylesheet that every app imported wholesale —
12
75
  ~618 KB of which exactly one theme is ever active. Splitting them took one app's CSS from
13
76
  866 KB to 295 KB.
14
77
 
15
- ## Install
78
+ ### Install
16
79
 
17
80
  ```bash
18
81
  npm install @memobit/themes
19
82
  ```
20
83
 
21
- ## Usage
84
+ ### Usage
22
85
 
23
86
  Add the Vite plugin. It emits each theme as a separate asset and tells `@memobit/libs`
24
87
  where to find them, so `ThemeProvider` fetches the selected theme and nothing else.
@@ -46,7 +109,7 @@ import '@memobit/libs/dist/styles/base.scss';
46
109
  import '@memobit/libs/dist/styles/scrollbars.scss';
47
110
  ```
48
111
 
49
- ## Exports
112
+ ### Exports
50
113
 
51
114
  ```ts
52
115
  import {
@@ -63,7 +126,7 @@ import {
63
126
  whose stylesheet is not loaded. It is generated from the compiled CSS, because ten themes
64
127
  build their tokens through the `_profile-theme` mixin rather than declaring them literally.
65
128
 
66
- ## Adding a theme
129
+ ### Adding a theme
67
130
 
68
131
  1. Add `src/theming/<name>.scss`, scoped to `[data-theme='<name>']`.
69
132
  2. Add a `@use` line in `src/themes.scss`.
@@ -0,0 +1,83 @@
1
+ :root[data-theme-engine='authored'][data-theme='sandy-parchment']{color-scheme:light;--font-body:'Figtree', 'Avenir Next', sans-serif;--font-display:'Newsreader', Georgia, serif;--font-mono:ui-monospace, SFMono-Regular, 'JetBrains Mono', Menlo, Consolas, monospace;--display-style:italic;--display-weight:500;--display-size:var(--font-size-xl);--display-transform:none;--display-tracking:normal;--label-weight:500;--label-transform:uppercase;--label-tracking:0.18em;--header-weight:500;--canvas-layers:radial-gradient(120% 100% at 0% 0%, #f8ecd0 0%, #e8d7af 45%, #cbb383 100%);--surface-canvas:#f4ecdc;--surface-card:rgba(255, 248, 230, 0.95);--surface-raised:#f4ead2;--surface-raised-alt:rgba(255, 241, 207, 0.42);--surface-overlay:#f4ead2;--surface-overlay-card:rgba(255, 248, 230, 0.72);--surface-sunken:#e4d4a7;--control-hover:#ead8ae;--surface-hover:color-mix(in oklab, #c66f22 8%, transparent);--surface-stripe:#efe0bd;--rating-empty:color-mix(in oklab, #e4d4a7 85%, #20160d);--surface-selected:color-mix(in oklab, #c66f22 18%, transparent);--surface-blur:blur(22px) saturate(1.4);--text-strong:#20160d;--text-default:#423929;--text-soft:#635847;--text-muted:#7e725f;--text-subtle:#817664;--text-link:#a85b1c;--text-link-hover:#cf792c;--border-subtle:rgba(90, 68, 34, 0.18);--border-default:rgba(88, 67, 34, 0.22);--border-strong:rgba(88, 67, 34, 0.22);--border-card:rgba(255, 252, 240, 0.8);--border-card-hover:rgba(255, 252, 240, 0.8);--field-bg:#f4ead2;--field-bg-focus:#f8efd8;--field-bg-disabled:color-mix(in oklab, #f4ead2 94%, #20160d);--field-fg:#423929;--field-border:rgba(88, 67, 34, 0.28);--field-border-hover:#b7884d;--field-border-focus:#c66f22;--field-placeholder:#817664;--field-label:#7e725f;--field-ring:color-mix(in oklab, #c66f22 24%, transparent);--tone-neutral-solid:#20160d;--tone-neutral-solid-hover:color-mix(in oklab, #20160d 70%, #423929);--tone-neutral-on-solid:#fff8e9;--tone-neutral-soft:#ead8ae;--tone-neutral-soft-hover:color-mix(in oklab, #ead8ae 92%, #20160d);--tone-neutral-on-soft:#20160d;--tone-neutral-border:rgba(88, 67, 34, 0.22);--tone-neutral-text:#635847;--tone-accent-solid:#c66f22;--tone-accent-solid-hover:#a85618;--tone-accent-on-solid:#fff8e9;--tone-accent-soft:color-mix(in oklab, #c66f22 16%, transparent);--tone-accent-soft-hover:color-mix(in oklab, #c66f22 24%, transparent);--tone-accent-on-soft:color-mix(in oklab, #c66f22 80%, #20160d);--tone-accent-border:color-mix(in oklab, #c66f22 40%, transparent);--tone-accent-text:#c66f22;--tone-success-solid:#3f7d45;--tone-success-solid-hover:#326738;--tone-success-on-solid:#fff8e9;--tone-success-soft:color-mix(in oklab, #3f7d45 16%, transparent);--tone-success-soft-hover:color-mix(in oklab, #3f7d45 24%, transparent);--tone-success-on-soft:color-mix(in oklab, #3f7d45 80%, #20160d);--tone-success-border:color-mix(in oklab, #3f7d45 40%, transparent);--tone-success-text:#3f7d45;--tone-warning-solid:#b68432;--tone-warning-solid-hover:#9a6a25;--tone-warning-on-solid:#fff8e9;--tone-warning-soft:color-mix(in oklab, #b68432 16%, transparent);--tone-warning-soft-hover:color-mix(in oklab, #b68432 24%, transparent);--tone-warning-on-soft:#8a5f1e;--tone-warning-border:color-mix(in oklab, #b68432 40%, transparent);--tone-warning-text:#8a5f1e;--tone-danger-solid:#9f2f2f;--tone-danger-solid-hover:#842525;--tone-danger-on-solid:#fff8e9;--tone-danger-soft:color-mix(in oklab, #9f2f2f 16%, transparent);--tone-danger-soft-hover:color-mix(in oklab, #9f2f2f 24%, transparent);--tone-danger-on-soft:color-mix(in oklab, #9f2f2f 80%, #20160d);--tone-danger-border:color-mix(in oklab, #9f2f2f 40%, transparent);--tone-danger-text:#9f2f2f;--accent-glow:#df9048;--selected-bg:var(--tone-neutral-solid);--selected-bg-hover:var(--tone-neutral-solid-hover);--selected-fg:var(--tone-neutral-on-solid);--selected-border:var(--tone-neutral-solid);--selected-solid:var(--tone-neutral-solid);--selected-solid-fg:var(--tone-neutral-on-solid);--shadow-color:color-mix(in oklab, #20160d 18%, transparent);--shadow-color-strong:color-mix(in oklab, #20160d 28%, transparent);--shadow-sm:0 1px 0 rgba(255, 252, 240, 0.9) inset, 0 0 0 1px rgba(31, 24, 17, 0.08), 0 18px 40px -20px rgba(60, 40, 20, 0.45);--shadow-md:0 18px 40px rgba(68, 50, 23, 0.14), 0 2px 8px rgba(68, 50, 23, 0.1);--shadow-lg:0 28px 80px rgba(34, 29, 22, 0.32), 0 6px 18px rgba(34, 29, 22, 0.2);--scrim:rgba(34, 29, 22, 0.42);--body-background:var(--canvas-layers), var(--surface-canvas);--body-background-base:var(--surface-canvas);--body-background-wash:var(--canvas-layers), var(--surface-canvas);--body-background-glow:none;--body-color:var(--text-default);--body-color-accent:var(--text-strong);--body-color-muted:var(--text-muted);--body-title-color:var(--text-strong);--body-sub-title-color:var(--text-soft);--body-accent-color:var(--tone-accent-text);--body-danger-color:var(--tone-danger-text);--backdrop-color:var(--scrim);--box-shadow:var(--shadow-color);--text-shadow:var(--shadow-color);--border-color:var(--border-strong);--delimiter-color:var(--border-subtle);--links-color:var(--text-link);--links-hover-color:var(--text-link-hover);--font-family:var(--font-body);--font-family-sans:var(--font-body);--font-family-display:var(--font-display);--font-family-mono:var(--font-mono);--header-background-color:var(--surface-raised);--header-border-bottom-color:var(--border-subtle);--header-color:var(--text-strong);--header-font-weight:var(--header-weight);--button-default-background-color:var(--surface-raised);--button-default-border-color:var(--border-default);--button-default-color:var(--text-default);--button-default-hover-background-color:var(--control-hover);--button-default-hover-border-color:var(--field-border-hover);--button-default-hover-color:var(--text-strong);--button-ghost-background-color:transparent;--button-ghost-border-color:transparent;--button-ghost-color:var(--text-soft);--button-ghost-hover-background-color:var(--control-hover);--button-ghost-hover-border-color:transparent;--button-ghost-hover-color:var(--text-strong);--button-plain-color:var(--text-soft);--button-plain-hover-color:var(--text-strong);--button-info-background-color:var(--tone-accent-solid);--button-info-border-color:var(--tone-accent-solid);--button-info-color:var(--tone-accent-on-solid);--button-info-hover-background-color:var(--tone-accent-solid-hover);--button-info-hover-border-color:var(--tone-accent-solid-hover);--button-info-hover-color:var(--tone-accent-on-solid);--toast-info-background-color:#c66f22;--toast-info-border-color:color-mix(in oklab, #c66f22 75%, #fff8e9);--toast-info-color:#fff8e9;--progress-info-bar-border-color:var(--tone-accent-solid);--progress-info-bar-fill-color:var(--tone-accent-solid);--rating-color-info:var(--tone-accent-solid);--card-tint-info-background:var(--tone-accent-soft);--button-success-background-color:var(--tone-success-solid);--button-success-border-color:var(--tone-success-solid);--button-success-color:var(--tone-success-on-solid);--button-success-hover-background-color:var(--tone-success-solid-hover);--button-success-hover-border-color:var(--tone-success-solid-hover);--button-success-hover-color:var(--tone-success-on-solid);--toast-success-background-color:#3f7d45;--toast-success-border-color:color-mix(in oklab, #3f7d45 75%, #fff8e9);--toast-success-color:#fff8e9;--progress-success-bar-border-color:var(--tone-success-solid);--progress-success-bar-fill-color:var(--tone-success-solid);--rating-color-success:var(--tone-success-solid);--card-tint-success-background:var(--tone-success-soft);--button-warning-background-color:var(--tone-warning-solid);--button-warning-border-color:var(--tone-warning-solid);--button-warning-color:var(--tone-warning-on-solid);--button-warning-hover-background-color:var(--tone-warning-solid-hover);--button-warning-hover-border-color:var(--tone-warning-solid-hover);--button-warning-hover-color:var(--tone-warning-on-solid);--toast-warning-background-color:#b68432;--toast-warning-border-color:color-mix(in oklab, #b68432 75%, #fff8e9);--toast-warning-color:#fff8e9;--progress-warning-bar-border-color:var(--tone-warning-solid);--progress-warning-bar-fill-color:var(--tone-warning-solid);--rating-color-warning:var(--tone-warning-solid);--card-tint-warning-background:var(--tone-warning-soft);--button-danger-background-color:var(--tone-danger-solid);--button-danger-border-color:var(--tone-danger-solid);--button-danger-color:var(--tone-danger-on-solid);--button-danger-hover-background-color:var(--tone-danger-solid-hover);--button-danger-hover-border-color:var(--tone-danger-solid-hover);--button-danger-hover-color:var(--tone-danger-on-solid);--toast-danger-background-color:#9f2f2f;--toast-danger-border-color:color-mix(in oklab, #9f2f2f 75%, #fff8e9);--toast-danger-color:#fff8e9;--progress-danger-bar-border-color:var(--tone-danger-solid);--progress-danger-bar-fill-color:var(--tone-danger-solid);--rating-color-danger:var(--tone-danger-solid);--card-tint-danger-background:var(--tone-danger-soft);--progress-bar-background-color:var(--surface-sunken);--progress-bar-color:var(--text-default);--progress-default-bar-border-color:var(--border-strong);--progress-default-bar-fill-color:var(--tone-neutral-solid);--rating-empty-color:var(--rating-empty);--rating-empty-label-color:var(--text-muted);--rating-half-rate-empty-color:var(--rating-empty);--card-tint-default-background:var(--surface-raised-alt);--card-accent-color:var(--tone-accent-text);--card-backdrop-filter:var(--surface-blur);--card-background-accent-color:var(--surface-raised-alt);--card-background-color:var(--surface-card);--card-border-accent-color:var(--tone-accent-solid);--card-border-color:var(--border-card);--card-box-shadow:var(--shadow-md);--card-color:var(--text-default);--card-footer-background-color:var(--surface-raised-alt);--card-footer-color:var(--text-soft);--card-hover-border-color:var(--border-card-hover);--card-surface-box-shadow:var(--shadow-sm);--card-title-color:var(--text-strong);--card-title-font-family:var(--font-display);--card-title-font-size:var(--display-size);--card-title-font-style:var(--display-style);--card-title-font-weight:var(--display-weight);--card-title-letter-spacing:var(--display-tracking);--card-title-text-transform:var(--display-transform);--modal-backdrop-filter:var(--surface-blur);--modal-background-color:var(--surface-overlay-card);--modal-body-color:var(--text-default);--modal-border-color:var(--border-card);--modal-box-shadow:var(--shadow-lg);--modal-box-shadow-hover:var(--shadow-lg);--modal-color:var(--text-default);--modal-footer-background-color:var(--surface-raised-alt);--modal-header-background-color:var(--surface-raised-alt);--modal-header-color:var(--text-strong);--modal-surface-box-shadow:var(--shadow-lg);--modal-title-color:var(--text-strong);--modal-title-font-family:var(--font-body);--modal-title-font-size:var(--font-size-sm);--modal-title-font-style:normal;--modal-title-font-weight:500;--modal-title-letter-spacing:0.18em;--modal-title-text-transform:uppercase;--drawer-background-color:var(--surface-overlay-card);--drawer-header-background-color:var(--surface-raised-alt);--drawer-border-color:var(--border-card);--drawer-shadow:var(--shadow-lg);--form-control-background-color:var(--field-bg);--form-control-border-color:var(--field-border);--form-control-color:var(--field-fg);--form-control-focus-background-color:var(--field-bg-focus);--form-control-focus-border-color:var(--field-border-focus);--form-control-focus-color:var(--field-fg);--form-control-focus-ring:var(--field-ring);--form-control-error-background-color:color-mix(in oklab, var(--tone-danger-solid) 6%, var(--field-bg));--form-control-error-border-color:var(--tone-danger-solid);--form-control-error-color:var(--tone-danger-text);--form-control-success-background-color:color-mix(in oklab, var(--tone-success-solid) 7%, var(--field-bg));--form-control-success-border-color:var(--tone-success-solid);--form-control-success-color:var(--tone-success-text);--form-control-font-family:var(--font-body);--form-control-label-color:var(--field-label);--form-control-label-font-size:var(--font-size-xs);--form-control-label-font-weight:var(--label-weight);--form-control-label-letter-spacing:var(--label-tracking);--form-control-label-text-transform:var(--label-transform);--form-control-placeholder-color:var(--field-placeholder);--form-control-selection-background-color:var(--selected-solid);--form-control-selection-border-color:var(--selected-solid);--form-control-selection-color:var(--selected-solid-fg);--form-control-selection-label-color:var(--text-default);--datepicker-input-background-color:var(--field-bg);--dropdown-border-color:var(--field-border);--dropdown-header-background-color:var(--field-bg);--dropdown-header-border-focus-color:var(--field-border-focus);--dropdown-header-color:var(--field-fg);--dropdown-options-background-color:var(--surface-overlay);--dropdown-options-color:var(--text-default);--dropdown-options-hover-background-color:var(--surface-hover);--dropdown-options-hover-color:var(--text-strong);--dropdown-options-selected-background-color:var(--surface-selected);--dropdown-options-selected-color:var(--text-strong);--dropdown-action-background-color:var(--surface-raised-alt);--dropdown-action-color:var(--text-link);--dropdown-action-hover-background-color:var(--surface-hover);--dropdown-action-hover-color:var(--text-link-hover);--dropdown-chips-background-color:var(--selected-bg);--dropdown-chips-border-color:var(--selected-border);--dropdown-chips-color:var(--selected-fg);--dropdown-chips-hover-background-color:var(--selected-bg-hover);--slider-track-background-color:var(--surface-sunken);--slider-track-border-color:var(--field-border);--slider-track-hover-background-color:var(--control-hover);--slider-track-hover-border-color:var(--field-border-hover);--slider-thumb-background-color:var(--tone-accent-solid);--slider-thumb-border-color:var(--tone-accent-solid);--slider-thumb-hover-background-color:var(--tone-accent-solid-hover);--slider-thumb-hover-border-color:var(--tone-accent-solid-hover);--calendar-background-color:var(--surface-overlay);--calendar-border-color:var(--border-default);--calendar-day-color:var(--text-soft);--calendar-day-disabled-color:var(--text-subtle);--calendar-day-hover-background-color:var(--control-hover);--calendar-day-selected-background-color:var(--tone-accent-solid);--calendar-day-selected-color:var(--tone-accent-on-solid);--calendar-day-today-border-color:var(--tone-accent-solid);--calendar-day-weekend-color:var(--text-muted);--calendar-header-background-color:var(--surface-raised-alt);--calendar-header-color:var(--text-strong);--chip-hover-background-color:var(--surface-hover);--chip-hover-border-color:var(--border-strong);--chip-hover-color:var(--text-strong);--chip-selected-background-color:var(--selected-bg);--chip-selected-border-color:var(--selected-border);--chip-selected-color:var(--selected-fg);--chip-selected-count-color:color-mix(in oklab, var(--selected-fg) 72%, transparent);--list-alternate-background-color:var(--surface-stripe);--list-hover-background-color:var(--surface-hover);--tabs-active-background-color:var(--selected-bg);--tabs-active-color:var(--selected-fg);--tabs-inactive-background-color:transparent;--tabs-inactive-color:var(--text-muted);--tooltip-background-color:var(--tone-neutral-solid);--tooltip-border-color:var(--tone-neutral-solid);--tooltip-color:var(--tone-neutral-on-solid);--popover-background-color:var(--surface-overlay);--popover-border-color:var(--border-default);--popover-color:var(--text-default);--popover-arrow-color:var(--border-default);--loader-border-color:var(--tone-accent-soft);--loader-border-top-color:var(--tone-accent-solid);--tour-hud-accent-color:var(--tone-accent-solid);--note-container-effect-background-color:var(--tone-accent-soft);--note-container-effect-color:var(--tone-accent-on-soft);--note-container-effect-border-left-color:var(--tone-accent-solid);--glow-box-shadow-color:0 0 16px color-mix(in oklab, var(--tone-accent-solid) 45%, transparent);--glow-hover-border-color:var(--tone-accent-border);--infuse-effect-before-background:linear-gradient(90deg, var(--tone-accent-solid), var(--accent-glow));--infuse-effect-hover-border-color:var(--tone-accent-solid);--infuse-effect-hover-box-shadow-color:color-mix(in oklab, var(--tone-accent-solid) 35%, transparent);--up-lift-effect-before-background:linear-gradient(135deg, var(--tone-accent-solid), var(--accent-glow));--up-lift-effect-box-shadow-color:var(--shadow-color-strong);--up-lift-effect-hover-border-color:var(--tone-accent-solid);--up-lift-effect-hover-box-shadow-color:color-mix(in oklab, var(--tone-accent-solid) 35%, transparent)}
2
+ /*
3
+ * Component recipes for the authored themes. Badge and Chip take a tone and one shared set
4
+ * of roles (soft background, ink on soft, border), so a "success" badge, a selected
5
+ * "success" chip and a success toast carry the same three colours.
6
+ *
7
+ * These rules sit here rather than in @memobit/libs while the classic themes still drive
8
+ * the same components. Once the classic themes are retired they move into the lib.
9
+ */
10
+
11
+ :root[data-theme-engine='authored'][data-theme='sandy-parchment'] .badge-variant--default {
12
+ --recipe-soft: var(--tone-neutral-soft);
13
+ --recipe-soft-hover: var(--tone-neutral-soft-hover);
14
+ --recipe-on-soft: var(--tone-neutral-on-soft);
15
+ --recipe-border: var(--tone-neutral-border);
16
+ }
17
+
18
+ :root[data-theme-engine='authored'][data-theme='sandy-parchment'] :is(.badge-variant--info, .chip--info) {
19
+ --recipe-soft: var(--tone-accent-soft);
20
+ --recipe-soft-hover: var(--tone-accent-soft-hover);
21
+ --recipe-on-soft: var(--tone-accent-on-soft);
22
+ --recipe-border: var(--tone-accent-border);
23
+ }
24
+
25
+ :root[data-theme-engine='authored'][data-theme='sandy-parchment'] :is(.badge-variant--success, .chip--success) {
26
+ --recipe-soft: var(--tone-success-soft);
27
+ --recipe-soft-hover: var(--tone-success-soft-hover);
28
+ --recipe-on-soft: var(--tone-success-on-soft);
29
+ --recipe-border: var(--tone-success-border);
30
+ }
31
+
32
+ :root[data-theme-engine='authored'][data-theme='sandy-parchment'] :is(.badge-variant--warning, .chip--warning) {
33
+ --recipe-soft: var(--tone-warning-soft);
34
+ --recipe-soft-hover: var(--tone-warning-soft-hover);
35
+ --recipe-on-soft: var(--tone-warning-on-soft);
36
+ --recipe-border: var(--tone-warning-border);
37
+ }
38
+
39
+ :root[data-theme-engine='authored'][data-theme='sandy-parchment'] :is(.badge-variant--danger, .chip--danger) {
40
+ --recipe-soft: var(--tone-danger-soft);
41
+ --recipe-soft-hover: var(--tone-danger-soft-hover);
42
+ --recipe-on-soft: var(--tone-danger-on-soft);
43
+ --recipe-border: var(--tone-danger-border);
44
+ }
45
+
46
+ :root[data-theme-engine='authored'][data-theme='sandy-parchment']
47
+ .badge:is(.badge-variant--default, .badge-variant--info, .badge-variant--success, .badge-variant--warning, .badge-variant--danger) {
48
+ border-color: var(--recipe-border);
49
+ background-color: var(--recipe-soft);
50
+ color: var(--recipe-on-soft);
51
+ }
52
+
53
+ :root[data-theme-engine='authored'][data-theme='sandy-parchment'] .chip:is(.chip--default, .chip--info, .chip--success, .chip--warning, .chip--danger) {
54
+ border-color: var(--border-default);
55
+ background: transparent;
56
+ color: var(--text-default);
57
+ }
58
+
59
+ :root[data-theme-engine='authored'][data-theme='sandy-parchment'] .chip:is(.chip--default, .chip--info, .chip--success, .chip--warning, .chip--danger):hover:not(:disabled) {
60
+ border-color: var(--recipe-border);
61
+ background: var(--surface-hover);
62
+ color: var(--text-strong);
63
+ }
64
+
65
+ :root[data-theme-engine='authored'][data-theme='sandy-parchment'] .chip:is(.chip--default, .chip--info, .chip--success, .chip--warning, .chip--danger).chip--selected {
66
+ border-color: var(--recipe-border);
67
+ background: var(--recipe-soft);
68
+ color: var(--recipe-on-soft);
69
+ }
70
+
71
+ :root[data-theme-engine='authored'][data-theme='sandy-parchment'] .chip:is(.chip--default, .chip--info, .chip--success, .chip--warning, .chip--danger).chip--selected:hover:not(:disabled) {
72
+ border-color: var(--recipe-border);
73
+ background: var(--recipe-soft-hover);
74
+ color: var(--recipe-on-soft);
75
+ }
76
+
77
+ /* A default chip carries no tone, so its selected state is the theme's selection style. */
78
+ :root[data-theme-engine='authored'][data-theme='sandy-parchment'] .chip.chip--default {
79
+ --recipe-soft: var(--selected-bg);
80
+ --recipe-soft-hover: var(--selected-bg-hover);
81
+ --recipe-on-soft: var(--selected-fg);
82
+ --recipe-border: var(--selected-border);
83
+ }
@@ -0,0 +1,83 @@
1
+ :root[data-theme-engine='authored'][data-theme='sandy-parchment']{color-scheme:light;--font-body:'Figtree', 'Avenir Next', sans-serif;--font-display:'Newsreader', Georgia, serif;--font-mono:ui-monospace, SFMono-Regular, 'JetBrains Mono', Menlo, Consolas, monospace;--display-style:italic;--display-weight:500;--display-size:var(--font-size-xl);--display-transform:none;--display-tracking:normal;--label-weight:500;--label-transform:uppercase;--label-tracking:0.18em;--header-weight:500;--canvas-layers:radial-gradient(120% 100% at 0% 0%, #f8ecd0 0%, #e8d7af 45%, #cbb383 100%);--surface-canvas:#f4ecdc;--surface-card:rgba(255, 248, 230, 0.95);--surface-raised:#f4ead2;--surface-raised-alt:rgba(255, 241, 207, 0.42);--surface-overlay:#f4ead2;--surface-overlay-card:rgba(255, 248, 230, 0.72);--surface-sunken:#e4d4a7;--control-hover:#ead8ae;--surface-hover:color-mix(in oklab, #c66f22 8%, transparent);--surface-stripe:#efe0bd;--rating-empty:color-mix(in oklab, #e4d4a7 85%, #20160d);--surface-selected:color-mix(in oklab, #c66f22 18%, transparent);--surface-blur:blur(22px) saturate(1.4);--text-strong:#20160d;--text-default:#423929;--text-soft:#635847;--text-muted:#7e725f;--text-subtle:#817664;--text-link:#a85b1c;--text-link-hover:#cf792c;--border-subtle:rgba(90, 68, 34, 0.18);--border-default:rgba(88, 67, 34, 0.22);--border-strong:rgba(88, 67, 34, 0.22);--border-card:rgba(255, 252, 240, 0.8);--border-card-hover:rgba(255, 252, 240, 0.8);--field-bg:#f4ead2;--field-bg-focus:#f8efd8;--field-bg-disabled:color-mix(in oklab, #f4ead2 94%, #20160d);--field-fg:#423929;--field-border:rgba(88, 67, 34, 0.28);--field-border-hover:#b7884d;--field-border-focus:#c66f22;--field-placeholder:#817664;--field-label:#7e725f;--field-ring:color-mix(in oklab, #c66f22 24%, transparent);--tone-neutral-solid:#20160d;--tone-neutral-solid-hover:color-mix(in oklab, #20160d 70%, #423929);--tone-neutral-on-solid:#fff8e9;--tone-neutral-soft:#ead8ae;--tone-neutral-soft-hover:color-mix(in oklab, #ead8ae 92%, #20160d);--tone-neutral-on-soft:#20160d;--tone-neutral-border:rgba(88, 67, 34, 0.22);--tone-neutral-text:#635847;--tone-accent-solid:#c66f22;--tone-accent-solid-hover:#a85618;--tone-accent-on-solid:#fff8e9;--tone-accent-soft:color-mix(in oklab, #c66f22 16%, transparent);--tone-accent-soft-hover:color-mix(in oklab, #c66f22 24%, transparent);--tone-accent-on-soft:color-mix(in oklab, #c66f22 80%, #20160d);--tone-accent-border:color-mix(in oklab, #c66f22 40%, transparent);--tone-accent-text:#c66f22;--tone-success-solid:#3f7d45;--tone-success-solid-hover:#326738;--tone-success-on-solid:#fff8e9;--tone-success-soft:color-mix(in oklab, #3f7d45 16%, transparent);--tone-success-soft-hover:color-mix(in oklab, #3f7d45 24%, transparent);--tone-success-on-soft:color-mix(in oklab, #3f7d45 80%, #20160d);--tone-success-border:color-mix(in oklab, #3f7d45 40%, transparent);--tone-success-text:#3f7d45;--tone-warning-solid:#b68432;--tone-warning-solid-hover:#9a6a25;--tone-warning-on-solid:#fff8e9;--tone-warning-soft:color-mix(in oklab, #b68432 16%, transparent);--tone-warning-soft-hover:color-mix(in oklab, #b68432 24%, transparent);--tone-warning-on-soft:#8a5f1e;--tone-warning-border:color-mix(in oklab, #b68432 40%, transparent);--tone-warning-text:#8a5f1e;--tone-danger-solid:#9f2f2f;--tone-danger-solid-hover:#842525;--tone-danger-on-solid:#fff8e9;--tone-danger-soft:color-mix(in oklab, #9f2f2f 16%, transparent);--tone-danger-soft-hover:color-mix(in oklab, #9f2f2f 24%, transparent);--tone-danger-on-soft:color-mix(in oklab, #9f2f2f 80%, #20160d);--tone-danger-border:color-mix(in oklab, #9f2f2f 40%, transparent);--tone-danger-text:#9f2f2f;--accent-glow:#df9048;--selected-bg:var(--tone-neutral-solid);--selected-bg-hover:var(--tone-neutral-solid-hover);--selected-fg:var(--tone-neutral-on-solid);--selected-border:var(--tone-neutral-solid);--selected-solid:var(--tone-neutral-solid);--selected-solid-fg:var(--tone-neutral-on-solid);--shadow-color:color-mix(in oklab, #20160d 18%, transparent);--shadow-color-strong:color-mix(in oklab, #20160d 28%, transparent);--shadow-sm:0 1px 0 rgba(255, 252, 240, 0.9) inset, 0 0 0 1px rgba(31, 24, 17, 0.08), 0 18px 40px -20px rgba(60, 40, 20, 0.45);--shadow-md:0 18px 40px rgba(68, 50, 23, 0.14), 0 2px 8px rgba(68, 50, 23, 0.1);--shadow-lg:0 28px 80px rgba(34, 29, 22, 0.32), 0 6px 18px rgba(34, 29, 22, 0.2);--scrim:rgba(34, 29, 22, 0.42);--body-background:var(--canvas-layers), var(--surface-canvas);--body-background-base:var(--surface-canvas);--body-background-wash:var(--canvas-layers), var(--surface-canvas);--body-background-glow:none;--body-color:var(--text-default);--body-color-accent:var(--text-strong);--body-color-muted:var(--text-muted);--body-title-color:var(--text-strong);--body-sub-title-color:var(--text-soft);--body-accent-color:var(--tone-accent-text);--body-danger-color:var(--tone-danger-text);--backdrop-color:var(--scrim);--box-shadow:var(--shadow-color);--text-shadow:var(--shadow-color);--border-color:var(--border-strong);--delimiter-color:var(--border-subtle);--links-color:var(--text-link);--links-hover-color:var(--text-link-hover);--font-family:var(--font-body);--font-family-sans:var(--font-body);--font-family-display:var(--font-display);--font-family-mono:var(--font-mono);--header-background-color:var(--surface-raised);--header-border-bottom-color:var(--border-subtle);--header-color:var(--text-strong);--header-font-weight:var(--header-weight);--button-default-background-color:var(--surface-raised);--button-default-border-color:var(--border-default);--button-default-color:var(--text-default);--button-default-hover-background-color:var(--control-hover);--button-default-hover-border-color:var(--field-border-hover);--button-default-hover-color:var(--text-strong);--button-ghost-background-color:transparent;--button-ghost-border-color:transparent;--button-ghost-color:var(--text-soft);--button-ghost-hover-background-color:var(--control-hover);--button-ghost-hover-border-color:transparent;--button-ghost-hover-color:var(--text-strong);--button-plain-color:var(--text-soft);--button-plain-hover-color:var(--text-strong);--button-info-background-color:var(--tone-accent-solid);--button-info-border-color:var(--tone-accent-solid);--button-info-color:var(--tone-accent-on-solid);--button-info-hover-background-color:var(--tone-accent-solid-hover);--button-info-hover-border-color:var(--tone-accent-solid-hover);--button-info-hover-color:var(--tone-accent-on-solid);--toast-info-background-color:#c66f22;--toast-info-border-color:color-mix(in oklab, #c66f22 75%, #fff8e9);--toast-info-color:#fff8e9;--progress-info-bar-border-color:var(--tone-accent-solid);--progress-info-bar-fill-color:var(--tone-accent-solid);--rating-color-info:var(--tone-accent-solid);--card-tint-info-background:var(--tone-accent-soft);--button-success-background-color:var(--tone-success-solid);--button-success-border-color:var(--tone-success-solid);--button-success-color:var(--tone-success-on-solid);--button-success-hover-background-color:var(--tone-success-solid-hover);--button-success-hover-border-color:var(--tone-success-solid-hover);--button-success-hover-color:var(--tone-success-on-solid);--toast-success-background-color:#3f7d45;--toast-success-border-color:color-mix(in oklab, #3f7d45 75%, #fff8e9);--toast-success-color:#fff8e9;--progress-success-bar-border-color:var(--tone-success-solid);--progress-success-bar-fill-color:var(--tone-success-solid);--rating-color-success:var(--tone-success-solid);--card-tint-success-background:var(--tone-success-soft);--button-warning-background-color:var(--tone-warning-solid);--button-warning-border-color:var(--tone-warning-solid);--button-warning-color:var(--tone-warning-on-solid);--button-warning-hover-background-color:var(--tone-warning-solid-hover);--button-warning-hover-border-color:var(--tone-warning-solid-hover);--button-warning-hover-color:var(--tone-warning-on-solid);--toast-warning-background-color:#b68432;--toast-warning-border-color:color-mix(in oklab, #b68432 75%, #fff8e9);--toast-warning-color:#fff8e9;--progress-warning-bar-border-color:var(--tone-warning-solid);--progress-warning-bar-fill-color:var(--tone-warning-solid);--rating-color-warning:var(--tone-warning-solid);--card-tint-warning-background:var(--tone-warning-soft);--button-danger-background-color:var(--tone-danger-solid);--button-danger-border-color:var(--tone-danger-solid);--button-danger-color:var(--tone-danger-on-solid);--button-danger-hover-background-color:var(--tone-danger-solid-hover);--button-danger-hover-border-color:var(--tone-danger-solid-hover);--button-danger-hover-color:var(--tone-danger-on-solid);--toast-danger-background-color:#9f2f2f;--toast-danger-border-color:color-mix(in oklab, #9f2f2f 75%, #fff8e9);--toast-danger-color:#fff8e9;--progress-danger-bar-border-color:var(--tone-danger-solid);--progress-danger-bar-fill-color:var(--tone-danger-solid);--rating-color-danger:var(--tone-danger-solid);--card-tint-danger-background:var(--tone-danger-soft);--progress-bar-background-color:var(--surface-sunken);--progress-bar-color:var(--text-default);--progress-default-bar-border-color:var(--border-strong);--progress-default-bar-fill-color:var(--tone-neutral-solid);--rating-empty-color:var(--rating-empty);--rating-empty-label-color:var(--text-muted);--rating-half-rate-empty-color:var(--rating-empty);--card-tint-default-background:var(--surface-raised-alt);--card-accent-color:var(--tone-accent-text);--card-backdrop-filter:var(--surface-blur);--card-background-accent-color:var(--surface-raised-alt);--card-background-color:var(--surface-card);--card-border-accent-color:var(--tone-accent-solid);--card-border-color:var(--border-card);--card-box-shadow:var(--shadow-md);--card-color:var(--text-default);--card-footer-background-color:var(--surface-raised-alt);--card-footer-color:var(--text-soft);--card-hover-border-color:var(--border-card-hover);--card-surface-box-shadow:var(--shadow-sm);--card-title-color:var(--text-strong);--card-title-font-family:var(--font-display);--card-title-font-size:var(--display-size);--card-title-font-style:var(--display-style);--card-title-font-weight:var(--display-weight);--card-title-letter-spacing:var(--display-tracking);--card-title-text-transform:var(--display-transform);--modal-backdrop-filter:var(--surface-blur);--modal-background-color:var(--surface-overlay-card);--modal-body-color:var(--text-default);--modal-border-color:var(--border-card);--modal-box-shadow:var(--shadow-lg);--modal-box-shadow-hover:var(--shadow-lg);--modal-color:var(--text-default);--modal-footer-background-color:var(--surface-raised-alt);--modal-header-background-color:var(--surface-raised-alt);--modal-header-color:var(--text-strong);--modal-surface-box-shadow:var(--shadow-lg);--modal-title-color:var(--text-strong);--modal-title-font-family:var(--font-body);--modal-title-font-size:var(--font-size-sm);--modal-title-font-style:normal;--modal-title-font-weight:500;--modal-title-letter-spacing:0.18em;--modal-title-text-transform:uppercase;--drawer-background-color:var(--surface-overlay-card);--drawer-header-background-color:var(--surface-raised-alt);--drawer-border-color:var(--border-card);--drawer-shadow:var(--shadow-lg);--form-control-background-color:var(--field-bg);--form-control-border-color:var(--field-border);--form-control-color:var(--field-fg);--form-control-focus-background-color:var(--field-bg-focus);--form-control-focus-border-color:var(--field-border-focus);--form-control-focus-color:var(--field-fg);--form-control-focus-ring:var(--field-ring);--form-control-error-background-color:color-mix(in oklab, var(--tone-danger-solid) 6%, var(--field-bg));--form-control-error-border-color:var(--tone-danger-solid);--form-control-error-color:var(--tone-danger-text);--form-control-success-background-color:color-mix(in oklab, var(--tone-success-solid) 7%, var(--field-bg));--form-control-success-border-color:var(--tone-success-solid);--form-control-success-color:var(--tone-success-text);--form-control-font-family:var(--font-body);--form-control-label-color:var(--field-label);--form-control-label-font-size:var(--font-size-xs);--form-control-label-font-weight:var(--label-weight);--form-control-label-letter-spacing:var(--label-tracking);--form-control-label-text-transform:var(--label-transform);--form-control-placeholder-color:var(--field-placeholder);--form-control-selection-background-color:var(--selected-solid);--form-control-selection-border-color:var(--selected-solid);--form-control-selection-color:var(--selected-solid-fg);--form-control-selection-label-color:var(--text-default);--datepicker-input-background-color:var(--field-bg);--dropdown-border-color:var(--field-border);--dropdown-header-background-color:var(--field-bg);--dropdown-header-border-focus-color:var(--field-border-focus);--dropdown-header-color:var(--field-fg);--dropdown-options-background-color:var(--surface-overlay);--dropdown-options-color:var(--text-default);--dropdown-options-hover-background-color:var(--surface-hover);--dropdown-options-hover-color:var(--text-strong);--dropdown-options-selected-background-color:var(--surface-selected);--dropdown-options-selected-color:var(--text-strong);--dropdown-action-background-color:var(--surface-raised-alt);--dropdown-action-color:var(--text-link);--dropdown-action-hover-background-color:var(--surface-hover);--dropdown-action-hover-color:var(--text-link-hover);--dropdown-chips-background-color:var(--selected-bg);--dropdown-chips-border-color:var(--selected-border);--dropdown-chips-color:var(--selected-fg);--dropdown-chips-hover-background-color:var(--selected-bg-hover);--slider-track-background-color:var(--surface-sunken);--slider-track-border-color:var(--field-border);--slider-track-hover-background-color:var(--control-hover);--slider-track-hover-border-color:var(--field-border-hover);--slider-thumb-background-color:var(--tone-accent-solid);--slider-thumb-border-color:var(--tone-accent-solid);--slider-thumb-hover-background-color:var(--tone-accent-solid-hover);--slider-thumb-hover-border-color:var(--tone-accent-solid-hover);--calendar-background-color:var(--surface-overlay);--calendar-border-color:var(--border-default);--calendar-day-color:var(--text-soft);--calendar-day-disabled-color:var(--text-subtle);--calendar-day-hover-background-color:var(--control-hover);--calendar-day-selected-background-color:var(--tone-accent-solid);--calendar-day-selected-color:var(--tone-accent-on-solid);--calendar-day-today-border-color:var(--tone-accent-solid);--calendar-day-weekend-color:var(--text-muted);--calendar-header-background-color:var(--surface-raised-alt);--calendar-header-color:var(--text-strong);--chip-hover-background-color:var(--surface-hover);--chip-hover-border-color:var(--border-strong);--chip-hover-color:var(--text-strong);--chip-selected-background-color:var(--selected-bg);--chip-selected-border-color:var(--selected-border);--chip-selected-color:var(--selected-fg);--chip-selected-count-color:color-mix(in oklab, var(--selected-fg) 72%, transparent);--list-alternate-background-color:var(--surface-stripe);--list-hover-background-color:var(--surface-hover);--tabs-active-background-color:var(--selected-bg);--tabs-active-color:var(--selected-fg);--tabs-inactive-background-color:transparent;--tabs-inactive-color:var(--text-muted);--tooltip-background-color:var(--tone-neutral-solid);--tooltip-border-color:var(--tone-neutral-solid);--tooltip-color:var(--tone-neutral-on-solid);--popover-background-color:var(--surface-overlay);--popover-border-color:var(--border-default);--popover-color:var(--text-default);--popover-arrow-color:var(--border-default);--loader-border-color:var(--tone-accent-soft);--loader-border-top-color:var(--tone-accent-solid);--tour-hud-accent-color:var(--tone-accent-solid);--note-container-effect-background-color:var(--tone-accent-soft);--note-container-effect-color:var(--tone-accent-on-soft);--note-container-effect-border-left-color:var(--tone-accent-solid);--glow-box-shadow-color:0 0 16px color-mix(in oklab, var(--tone-accent-solid) 45%, transparent);--glow-hover-border-color:var(--tone-accent-border);--infuse-effect-before-background:linear-gradient(90deg, var(--tone-accent-solid), var(--accent-glow));--infuse-effect-hover-border-color:var(--tone-accent-solid);--infuse-effect-hover-box-shadow-color:color-mix(in oklab, var(--tone-accent-solid) 35%, transparent);--up-lift-effect-before-background:linear-gradient(135deg, var(--tone-accent-solid), var(--accent-glow));--up-lift-effect-box-shadow-color:var(--shadow-color-strong);--up-lift-effect-hover-border-color:var(--tone-accent-solid);--up-lift-effect-hover-box-shadow-color:color-mix(in oklab, var(--tone-accent-solid) 35%, transparent)}
2
+ /*
3
+ * Component recipes for the authored themes. Badge and Chip take a tone and one shared set
4
+ * of roles (soft background, ink on soft, border), so a "success" badge, a selected
5
+ * "success" chip and a success toast carry the same three colours.
6
+ *
7
+ * These rules sit here rather than in @memobit/libs while the classic themes still drive
8
+ * the same components. Once the classic themes are retired they move into the lib.
9
+ */
10
+
11
+ :root[data-theme-engine='authored'][data-theme='sandy-parchment'] .badge-variant--default {
12
+ --recipe-soft: var(--tone-neutral-soft);
13
+ --recipe-soft-hover: var(--tone-neutral-soft-hover);
14
+ --recipe-on-soft: var(--tone-neutral-on-soft);
15
+ --recipe-border: var(--tone-neutral-border);
16
+ }
17
+
18
+ :root[data-theme-engine='authored'][data-theme='sandy-parchment'] :is(.badge-variant--info, .chip--info) {
19
+ --recipe-soft: var(--tone-accent-soft);
20
+ --recipe-soft-hover: var(--tone-accent-soft-hover);
21
+ --recipe-on-soft: var(--tone-accent-on-soft);
22
+ --recipe-border: var(--tone-accent-border);
23
+ }
24
+
25
+ :root[data-theme-engine='authored'][data-theme='sandy-parchment'] :is(.badge-variant--success, .chip--success) {
26
+ --recipe-soft: var(--tone-success-soft);
27
+ --recipe-soft-hover: var(--tone-success-soft-hover);
28
+ --recipe-on-soft: var(--tone-success-on-soft);
29
+ --recipe-border: var(--tone-success-border);
30
+ }
31
+
32
+ :root[data-theme-engine='authored'][data-theme='sandy-parchment'] :is(.badge-variant--warning, .chip--warning) {
33
+ --recipe-soft: var(--tone-warning-soft);
34
+ --recipe-soft-hover: var(--tone-warning-soft-hover);
35
+ --recipe-on-soft: var(--tone-warning-on-soft);
36
+ --recipe-border: var(--tone-warning-border);
37
+ }
38
+
39
+ :root[data-theme-engine='authored'][data-theme='sandy-parchment'] :is(.badge-variant--danger, .chip--danger) {
40
+ --recipe-soft: var(--tone-danger-soft);
41
+ --recipe-soft-hover: var(--tone-danger-soft-hover);
42
+ --recipe-on-soft: var(--tone-danger-on-soft);
43
+ --recipe-border: var(--tone-danger-border);
44
+ }
45
+
46
+ :root[data-theme-engine='authored'][data-theme='sandy-parchment']
47
+ .badge:is(.badge-variant--default, .badge-variant--info, .badge-variant--success, .badge-variant--warning, .badge-variant--danger) {
48
+ border-color: var(--recipe-border);
49
+ background-color: var(--recipe-soft);
50
+ color: var(--recipe-on-soft);
51
+ }
52
+
53
+ :root[data-theme-engine='authored'][data-theme='sandy-parchment'] .chip:is(.chip--default, .chip--info, .chip--success, .chip--warning, .chip--danger) {
54
+ border-color: var(--border-default);
55
+ background: transparent;
56
+ color: var(--text-default);
57
+ }
58
+
59
+ :root[data-theme-engine='authored'][data-theme='sandy-parchment'] .chip:is(.chip--default, .chip--info, .chip--success, .chip--warning, .chip--danger):hover:not(:disabled) {
60
+ border-color: var(--recipe-border);
61
+ background: var(--surface-hover);
62
+ color: var(--text-strong);
63
+ }
64
+
65
+ :root[data-theme-engine='authored'][data-theme='sandy-parchment'] .chip:is(.chip--default, .chip--info, .chip--success, .chip--warning, .chip--danger).chip--selected {
66
+ border-color: var(--recipe-border);
67
+ background: var(--recipe-soft);
68
+ color: var(--recipe-on-soft);
69
+ }
70
+
71
+ :root[data-theme-engine='authored'][data-theme='sandy-parchment'] .chip:is(.chip--default, .chip--info, .chip--success, .chip--warning, .chip--danger).chip--selected:hover:not(:disabled) {
72
+ border-color: var(--recipe-border);
73
+ background: var(--recipe-soft-hover);
74
+ color: var(--recipe-on-soft);
75
+ }
76
+
77
+ /* A default chip carries no tone, so its selected state is the theme's selection style. */
78
+ :root[data-theme-engine='authored'][data-theme='sandy-parchment'] .chip.chip--default {
79
+ --recipe-soft: var(--selected-bg);
80
+ --recipe-soft-hover: var(--selected-bg-hover);
81
+ --recipe-on-soft: var(--selected-fg);
82
+ --recipe-border: var(--selected-border);
83
+ }
@@ -0,0 +1,11 @@
1
+ /** Present on the root while the authored themes are on. Every authored rule is scoped to it. */
2
+ export declare const THEME_ENGINE_ATTRIBUTE = "data-theme-engine";
3
+ export declare const AUTHORED_ENGINE_VALUE = "authored";
4
+ /**
5
+ * Switches `root` to the hand-made themes (`@memobit/themes/authored.css`). The theme itself
6
+ * stays whatever `data-theme` names; the authored version applies wherever one exists, and
7
+ * the classic theme shows through where it does not.
8
+ */
9
+ export declare const applyAuthoredEngine: (root?: HTMLElement) => void;
10
+ /** Hands `root` back to the classic themes. */
11
+ export declare const clearAuthoredEngine: (root?: HTMLElement) => void;
@@ -0,0 +1,17 @@
1
+ // src/authoredEngine.ts
2
+ /** Present on the root while the authored themes are on. Every authored rule is scoped to it. */
3
+ var THEME_ENGINE_ATTRIBUTE = "data-theme-engine";
4
+ var AUTHORED_ENGINE_VALUE = "authored";
5
+ /**
6
+ * Switches `root` to the hand-made themes (`@memobit/themes/authored.css`). The theme itself
7
+ * stays whatever `data-theme` names; the authored version applies wherever one exists, and
8
+ * the classic theme shows through where it does not.
9
+ */
10
+ var applyAuthoredEngine = (root = document.documentElement) => {
11
+ root.setAttribute(THEME_ENGINE_ATTRIBUTE, AUTHORED_ENGINE_VALUE);
12
+ };
13
+ /** Hands `root` back to the classic themes. */
14
+ var clearAuthoredEngine = (root = document.documentElement) => {
15
+ root.removeAttribute(THEME_ENGINE_ATTRIBUTE);
16
+ };
17
+ export { AUTHORED_ENGINE_VALUE, THEME_ENGINE_ATTRIBUTE, applyAuthoredEngine, clearAuthoredEngine };
@@ -0,0 +1,4 @@
1
+ export declare const AUTHORED_THEMES: readonly [{
2
+ readonly id: "sandy-parchment";
3
+ readonly label: "Sandy Parchment";
4
+ }];
@@ -0,0 +1,6 @@
1
+ // src/authoredThemes.ts
2
+ var AUTHORED_THEMES = [{
3
+ id: "sandy-parchment",
4
+ label: "Sandy Parchment"
5
+ }];
6
+ export { AUTHORED_THEMES };
package/dist/index.d.ts CHANGED
@@ -1,3 +1,5 @@
1
+ export { applyAuthoredEngine, AUTHORED_ENGINE_VALUE, clearAuthoredEngine, THEME_ENGINE_ATTRIBUTE } from './authoredEngine';
2
+ export { AUTHORED_THEMES } from './authoredThemes';
1
3
  export { previewPalettes, type PreviewToken } from './previewPalettes';
2
4
  export { FAVORITE_THEMES, getThemeAppearance, getThemeConfig, LIGHT_THEMES, THEME_CONFIGS, type ThemeAppearance, type ThemeConfig } from './themeConfig';
3
5
  /** Where the Vite plugin writes each theme's stylesheet, relative to the app's base URL. */
package/dist/index.js CHANGED
@@ -1,7 +1,8 @@
1
+ import { AUTHORED_ENGINE_VALUE, THEME_ENGINE_ATTRIBUTE, applyAuthoredEngine, clearAuthoredEngine } from "./authoredEngine.js";
2
+ import { AUTHORED_THEMES } from "./authoredThemes.js";
1
3
  import { previewPalettes } from "./previewPalettes.js";
2
4
  import { FAVORITE_THEMES, LIGHT_THEMES, THEME_CONFIGS, getThemeAppearance, getThemeConfig } from "./themeConfig.js";
3
- //#region src/index.ts
5
+ // src/index.ts
4
6
  /** Where the Vite plugin writes each theme's stylesheet, relative to the app's base URL. */
5
7
  var THEME_ASSET_DIR = "memobit-themes";
6
- //#endregion
7
- export { FAVORITE_THEMES, LIGHT_THEMES, THEME_ASSET_DIR, THEME_CONFIGS, getThemeAppearance, getThemeConfig, previewPalettes };
8
+ export { AUTHORED_ENGINE_VALUE, AUTHORED_THEMES, FAVORITE_THEMES, LIGHT_THEMES, THEME_ASSET_DIR, THEME_CONFIGS, THEME_ENGINE_ATTRIBUTE, applyAuthoredEngine, clearAuthoredEngine, getThemeAppearance, getThemeConfig, previewPalettes };