@memobit/themes 1.4.0 → 2.1.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 (65) hide show
  1. package/README.md +87 -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 +39 -0
  7. package/dist/authoredThemes.js +199 -0
  8. package/dist/index.d.ts +5 -2
  9. package/dist/index.js +5 -3
  10. package/dist/previewPalettes.js +0 -160
  11. package/dist/registry.d.ts +7 -0
  12. package/dist/registry.js +13 -0
  13. package/dist/themeConfig.js +2 -147
  14. package/dist/themes/ascend-contour-night.css +83 -0
  15. package/dist/themes/ascend-contour.css +83 -0
  16. package/dist/themes/pocket-chip.css +83 -0
  17. package/dist/themes/pocket-receipt.css +83 -0
  18. package/dist/themes/readout-highlighter.css +83 -0
  19. package/dist/themes/readout-night-reader.css +83 -0
  20. package/dist/themes/recall-calling-card.css +83 -0
  21. package/dist/themes/recall-stage-light.css +83 -0
  22. package/dist/themes/tasks-deep-work.css +83 -0
  23. package/dist/themes/tasks-legal-pad.css +83 -0
  24. package/dist/themes.css +840 -1
  25. package/package.json +11 -4
  26. package/dist/themes/amber-meridian.css +0 -1
  27. package/dist/themes/archive-indigo.css +0 -1
  28. package/dist/themes/blush-market.css +0 -1
  29. package/dist/themes/brass-chronicle.css +0 -1
  30. package/dist/themes/clinical-aqua.css +0 -1
  31. package/dist/themes/command-slate.css +0 -1
  32. package/dist/themes/ember-night.css +0 -1
  33. package/dist/themes/frost-petal.css +0 -1
  34. package/dist/themes/gilded-bear.css +0 -1
  35. package/dist/themes/horizon-drift.css +0 -1
  36. package/dist/themes/lavender-mist.css +0 -1
  37. package/dist/themes/light-blue.css +0 -1
  38. package/dist/themes/midnight-folio.css +0 -1
  39. package/dist/themes/mint-meadow.css +0 -1
  40. package/dist/themes/mintone.css +0 -1
  41. package/dist/themes/neon-tokyo.css +0 -1
  42. package/dist/themes/spectrum-vault.css +0 -1
  43. package/dist/themes/twilight-pulse.css +0 -1
  44. package/dist/themes/velvet-reel.css +0 -1
  45. package/dist/themes/velvet-tome.css +0 -1
  46. package/src/theming/amber-meridian.scss +0 -271
  47. package/src/theming/archive-indigo.scss +0 -270
  48. package/src/theming/blush-market.scss +0 -271
  49. package/src/theming/brass-chronicle.scss +0 -271
  50. package/src/theming/clinical-aqua.scss +0 -270
  51. package/src/theming/command-slate.scss +0 -34
  52. package/src/theming/ember-night.scss +0 -268
  53. package/src/theming/frost-petal.scss +0 -268
  54. package/src/theming/gilded-bear.scss +0 -271
  55. package/src/theming/horizon-drift.scss +0 -271
  56. package/src/theming/lavender-mist.scss +0 -268
  57. package/src/theming/light-blue.scss +0 -268
  58. package/src/theming/midnight-folio.scss +0 -34
  59. package/src/theming/mint-meadow.scss +0 -268
  60. package/src/theming/mintone.scss +0 -268
  61. package/src/theming/neon-tokyo.scss +0 -268
  62. package/src/theming/spectrum-vault.scss +0 -271
  63. package/src/theming/twilight-pulse.scss +0 -268
  64. package/src/theming/velvet-reel.scss +0 -272
  65. package/src/theming/velvet-tome.scss +0 -271
package/README.md CHANGED
@@ -1,24 +1,104 @@
1
1
  # @memobit/themes
2
2
 
3
- 69 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,
56
+ - a role the bridge or recipes read is not produced by a theme,
57
+ - a theme names a font that neither its `fonts.url` nor its classic entry loads, or
58
+ - a new theme has a text/background pair below its contrast target (4.5:1, 3:1 for
59
+ placeholders).
60
+
61
+ An authored version of a classic theme only reports contrast below target, since it
62
+ reproduces the classic theme as it was.
63
+
64
+ ### Two kinds of authored theme
65
+
66
+ - **A new theme** (an id with no classic entry) is a theme in its own right: the build gives
67
+ it a stylesheet at `dist/themes/<id>.css`, served and loaded on demand like the classic
68
+ ones, a registry entry (with `apps` as its recommended apps) and a picker swatch, all in
69
+ the generated `src/authoredThemes.ts`. New themes come first in `THEME_CONFIGS`, so an app
70
+ listed in a theme's `apps` starts on it, light before dark. Apps pick them up by bumping
71
+ this package; nothing changes in the app.
72
+ - **An authored version of a classic theme** (same id, e.g. `sandy-parchment`) applies under
73
+ that classic theme while `data-theme-engine="authored"` is set, for side-by-side
74
+ comparison in the theme lab (`@memobit/libs/theme-lab`).
75
+
76
+ ### Adding a theme
77
+
78
+ 1. Draft it in `src/authored/concepts/<id>.ts` (an `AuthoredTheme` with `apps` and a
79
+ `description`) and run `npm run preview:concepts`. It writes `dist/concepts.html`: every
80
+ app theme and draft drawn as a small screen of its app, with its contrast report. Sample
81
+ content per app lives in `scripts/authored/samples.ts`.
82
+ 2. Once chosen, move it to `src/authored/<id>.ts` and run `npm run build`.
83
+
84
+ To start from a classic theme instead, `npm run port:classic -- <id>` drafts
85
+ `src/authored/<id>.ts` from its stylesheet.
86
+
87
+ ## Classic themes
88
+
89
+ ### Why
10
90
 
11
91
  Themes used to ship as a single aggregate stylesheet that every app imported wholesale —
12
92
  ~618 KB of which exactly one theme is ever active. Splitting them took one app's CSS from
13
93
  866 KB to 295 KB.
14
94
 
15
- ## Install
95
+ ### Install
16
96
 
17
97
  ```bash
18
98
  npm install @memobit/themes
19
99
  ```
20
100
 
21
- ## Usage
101
+ ### Usage
22
102
 
23
103
  Add the Vite plugin. It emits each theme as a separate asset and tells `@memobit/libs`
24
104
  where to find them, so `ThemeProvider` fetches the selected theme and nothing else.
@@ -46,7 +126,7 @@ import '@memobit/libs/dist/styles/base.scss';
46
126
  import '@memobit/libs/dist/styles/scrollbars.scss';
47
127
  ```
48
128
 
49
- ## Exports
129
+ ### Exports
50
130
 
51
131
  ```ts
52
132
  import {
@@ -63,7 +143,7 @@ import {
63
143
  whose stylesheet is not loaded. It is generated from the compiled CSS, because ten themes
64
144
  build their tokens through the `_profile-theme` mixin rather than declaring them literally.
65
145
 
66
- ## Adding a theme
146
+ ### Adding a theme
67
147
 
68
148
  1. Add `src/theming/<name>.scss`, scoped to `[data-theme='<name>']`.
69
149
  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;--button-fill:#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-mark:#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-mark:#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-mark:#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-mark:#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, color-mix(in oklab, #20160d 40%, transparent) 45%, transparent);--shadow-color-strong:color-mix(in oklab, color-mix(in oklab, #20160d 40%, transparent) 62%, 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(--button-fill);--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-mark);--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-mark);--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-mark);--progress-info-bar-fill-color:var(--tone-accent-mark);--rating-color-info:var(--tone-accent-mark);--card-tint-info-background:var(--tone-accent-soft);--button-success-background-color:var(--tone-success-solid);--button-success-border-color:var(--tone-success-mark);--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-mark);--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-mark);--progress-success-bar-fill-color:var(--tone-success-mark);--rating-color-success:var(--tone-success-mark);--card-tint-success-background:var(--tone-success-soft);--button-warning-background-color:var(--tone-warning-solid);--button-warning-border-color:var(--tone-warning-mark);--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-mark);--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-mark);--progress-warning-bar-fill-color:var(--tone-warning-mark);--rating-color-warning:var(--tone-warning-mark);--card-tint-warning-background:var(--tone-warning-soft);--button-danger-background-color:var(--tone-danger-solid);--button-danger-border-color:var(--tone-danger-mark);--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-mark);--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-mark);--progress-danger-bar-fill-color:var(--tone-danger-mark);--rating-color-danger:var(--tone-danger-mark);--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(--text-muted);--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-mark);--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-mark);--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-mark);--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-mark);--slider-thumb-border-color:var(--tone-accent-mark);--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-mark);--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-mark);--tour-hud-accent-color:var(--tone-accent-mark);--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-mark);--glow-box-shadow-color:0 0 16px color-mix(in oklab, var(--tone-accent-mark) 45%, transparent);--glow-hover-border-color:var(--tone-accent-border);--infuse-effect-before-background:linear-gradient(90deg, var(--tone-accent-mark), var(--accent-glow));--infuse-effect-hover-border-color:var(--tone-accent-mark);--infuse-effect-hover-box-shadow-color:color-mix(in oklab, var(--tone-accent-mark) 35%, transparent);--up-lift-effect-before-background:linear-gradient(135deg, var(--tone-accent-mark), var(--accent-glow));--up-lift-effect-box-shadow-color:var(--shadow-color-strong);--up-lift-effect-hover-border-color:var(--tone-accent-mark);--up-lift-effect-hover-box-shadow-color:color-mix(in oklab, var(--tone-accent-mark) 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;--button-fill:#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-mark:#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-mark:#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-mark:#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-mark:#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, color-mix(in oklab, #20160d 40%, transparent) 45%, transparent);--shadow-color-strong:color-mix(in oklab, color-mix(in oklab, #20160d 40%, transparent) 62%, 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(--button-fill);--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-mark);--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-mark);--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-mark);--progress-info-bar-fill-color:var(--tone-accent-mark);--rating-color-info:var(--tone-accent-mark);--card-tint-info-background:var(--tone-accent-soft);--button-success-background-color:var(--tone-success-solid);--button-success-border-color:var(--tone-success-mark);--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-mark);--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-mark);--progress-success-bar-fill-color:var(--tone-success-mark);--rating-color-success:var(--tone-success-mark);--card-tint-success-background:var(--tone-success-soft);--button-warning-background-color:var(--tone-warning-solid);--button-warning-border-color:var(--tone-warning-mark);--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-mark);--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-mark);--progress-warning-bar-fill-color:var(--tone-warning-mark);--rating-color-warning:var(--tone-warning-mark);--card-tint-warning-background:var(--tone-warning-soft);--button-danger-background-color:var(--tone-danger-solid);--button-danger-border-color:var(--tone-danger-mark);--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-mark);--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-mark);--progress-danger-bar-fill-color:var(--tone-danger-mark);--rating-color-danger:var(--tone-danger-mark);--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(--text-muted);--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-mark);--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-mark);--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-mark);--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-mark);--slider-thumb-border-color:var(--tone-accent-mark);--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-mark);--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-mark);--tour-hud-accent-color:var(--tone-accent-mark);--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-mark);--glow-box-shadow-color:0 0 16px color-mix(in oklab, var(--tone-accent-mark) 45%, transparent);--glow-hover-border-color:var(--tone-accent-border);--infuse-effect-before-background:linear-gradient(90deg, var(--tone-accent-mark), var(--accent-glow));--infuse-effect-hover-border-color:var(--tone-accent-mark);--infuse-effect-hover-box-shadow-color:color-mix(in oklab, var(--tone-accent-mark) 35%, transparent);--up-lift-effect-before-background:linear-gradient(135deg, var(--tone-accent-mark), var(--accent-glow));--up-lift-effect-box-shadow-color:var(--shadow-color-strong);--up-lift-effect-hover-border-color:var(--tone-accent-mark);--up-lift-effect-hover-box-shadow-color:color-mix(in oklab, var(--tone-accent-mark) 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,39 @@
1
+ import { PreviewToken } from './previewPalettes';
2
+ import { ThemeConfig } from './themeConfig';
3
+ export declare const AUTHORED_THEMES: readonly [{
4
+ readonly id: "ascend-contour-night";
5
+ readonly label: "Contour Night";
6
+ }, {
7
+ readonly id: "ascend-contour";
8
+ readonly label: "Contour";
9
+ }, {
10
+ readonly id: "pocket-chip";
11
+ readonly label: "Chip";
12
+ }, {
13
+ readonly id: "pocket-receipt";
14
+ readonly label: "Receipt";
15
+ }, {
16
+ readonly id: "readout-highlighter";
17
+ readonly label: "Highlighter";
18
+ }, {
19
+ readonly id: "readout-night-reader";
20
+ readonly label: "Night Reader";
21
+ }, {
22
+ readonly id: "recall-calling-card";
23
+ readonly label: "Calling Card";
24
+ }, {
25
+ readonly id: "recall-stage-light";
26
+ readonly label: "Stage Light";
27
+ }, {
28
+ readonly id: "sandy-parchment";
29
+ readonly label: "Sandy Parchment";
30
+ }, {
31
+ readonly id: "tasks-deep-work";
32
+ readonly label: "Deep Work";
33
+ }, {
34
+ readonly id: "tasks-legal-pad";
35
+ readonly label: "Legal Pad";
36
+ }];
37
+ export declare const AUTHORED_THEME_CONFIGS: ThemeConfig[];
38
+ export declare const AUTHORED_LIGHT_THEMES: readonly string[];
39
+ export declare const AUTHORED_PREVIEW_PALETTES: Readonly<Record<string, Readonly<Record<PreviewToken, string>>>>;
@@ -0,0 +1,199 @@
1
+ // src/authoredThemes.ts
2
+ var AUTHORED_THEMES = [
3
+ {
4
+ id: "ascend-contour-night",
5
+ label: "Contour Night"
6
+ },
7
+ {
8
+ id: "ascend-contour",
9
+ label: "Contour"
10
+ },
11
+ {
12
+ id: "pocket-chip",
13
+ label: "Chip"
14
+ },
15
+ {
16
+ id: "pocket-receipt",
17
+ label: "Receipt"
18
+ },
19
+ {
20
+ id: "readout-highlighter",
21
+ label: "Highlighter"
22
+ },
23
+ {
24
+ id: "readout-night-reader",
25
+ label: "Night Reader"
26
+ },
27
+ {
28
+ id: "recall-calling-card",
29
+ label: "Calling Card"
30
+ },
31
+ {
32
+ id: "recall-stage-light",
33
+ label: "Stage Light"
34
+ },
35
+ {
36
+ id: "sandy-parchment",
37
+ label: "Sandy Parchment"
38
+ },
39
+ {
40
+ id: "tasks-deep-work",
41
+ label: "Deep Work"
42
+ },
43
+ {
44
+ id: "tasks-legal-pad",
45
+ label: "Legal Pad"
46
+ }
47
+ ];
48
+ var AUTHORED_THEME_CONFIGS = [
49
+ {
50
+ value: "ascend-contour",
51
+ label: "Contour",
52
+ fontUrl: "https://fonts.googleapis.com/css2?family=Bricolage+Grotesque:opsz,wght@12..96,500..700&family=Public+Sans:wght@400;500;600;700&display=swap",
53
+ recommendedApps: ["Ascend"]
54
+ },
55
+ {
56
+ value: "ascend-contour-night",
57
+ label: "Contour Night",
58
+ fontUrl: "https://fonts.googleapis.com/css2?family=Bricolage+Grotesque:opsz,wght@12..96,500..700&family=Public+Sans:wght@400;500;600;700&display=swap",
59
+ recommendedApps: ["Ascend"]
60
+ },
61
+ {
62
+ value: "pocket-receipt",
63
+ label: "Receipt",
64
+ fontUrl: "https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@500;600&family=IBM+Plex+Sans:wght@400;500;600;700&display=swap",
65
+ recommendedApps: ["Pocket"]
66
+ },
67
+ {
68
+ value: "pocket-chip",
69
+ label: "Chip",
70
+ fontUrl: "https://fonts.googleapis.com/css2?family=Manrope:wght@400;500;600;700&family=Sora:wght@500;600;700&display=swap",
71
+ recommendedApps: ["Pocket"]
72
+ },
73
+ {
74
+ value: "readout-highlighter",
75
+ label: "Highlighter",
76
+ fontUrl: "https://fonts.googleapis.com/css2?family=Literata:ital,opsz,wght@0,7..72,400..700;1,7..72,400&family=Source+Sans+3:wght@400;500;600;700&display=swap",
77
+ recommendedApps: ["Readout"]
78
+ },
79
+ {
80
+ value: "readout-night-reader",
81
+ label: "Night Reader",
82
+ fontUrl: "https://fonts.googleapis.com/css2?family=Atkinson+Hyperlegible:wght@400;700&family=Newsreader:ital,opsz,wght@0,6..72,400..700;1,6..72,400&display=swap",
83
+ recommendedApps: ["Readout"]
84
+ },
85
+ {
86
+ value: "recall-calling-card",
87
+ label: "Calling Card",
88
+ fontUrl: "https://fonts.googleapis.com/css2?family=DM+Serif+Display:ital@0;1&family=Plus+Jakarta+Sans:wght@400;500;600;700&display=swap",
89
+ recommendedApps: ["Recall"]
90
+ },
91
+ {
92
+ value: "recall-stage-light",
93
+ label: "Stage Light",
94
+ fontUrl: "https://fonts.googleapis.com/css2?family=Cormorant+Garamond:ital,wght@0,500;0,600;0,700;1,500;1,600&family=Mulish:wght@400;500;600;700&display=swap",
95
+ recommendedApps: ["Recall"]
96
+ },
97
+ {
98
+ value: "tasks-legal-pad",
99
+ label: "Legal Pad",
100
+ fontUrl: "https://fonts.googleapis.com/css2?family=Libre+Franklin:wght@400;500;600;700;800&display=swap",
101
+ recommendedApps: ["Tasks"]
102
+ },
103
+ {
104
+ value: "tasks-deep-work",
105
+ label: "Deep Work",
106
+ fontUrl: "https://fonts.googleapis.com/css2?family=Onest:wght@400;500;600;700&display=swap",
107
+ recommendedApps: ["Tasks"]
108
+ }
109
+ ];
110
+ var AUTHORED_LIGHT_THEMES = [
111
+ "ascend-contour",
112
+ "pocket-receipt",
113
+ "readout-highlighter",
114
+ "recall-calling-card",
115
+ "tasks-legal-pad"
116
+ ];
117
+ var AUTHORED_PREVIEW_PALETTES = {
118
+ "ascend-contour": {
119
+ "--body-background": "#eef1ed",
120
+ "--body-accent-color": "#1c5893",
121
+ "--body-color-muted": "#55635b",
122
+ "--card-background-color": "rgba(252, 253, 251, 0.95)",
123
+ "--header-background-color": "#ffffff",
124
+ "--header-border-bottom-color": "rgba(22, 35, 29, 0.09)"
125
+ },
126
+ "ascend-contour-night": {
127
+ "--body-background": "#111816",
128
+ "--body-accent-color": "#8cc0f0",
129
+ "--body-color-muted": "#93a39a",
130
+ "--card-background-color": "rgba(23, 33, 30, 0.96)",
131
+ "--header-background-color": "#121a17",
132
+ "--header-border-bottom-color": "rgba(214, 224, 218, 0.08)"
133
+ },
134
+ "pocket-receipt": {
135
+ "--body-background": "#efefeb",
136
+ "--body-accent-color": "#0a6464",
137
+ "--body-color-muted": "#5a5a5a",
138
+ "--card-background-color": "#fbfbf8",
139
+ "--header-background-color": "#ffffff",
140
+ "--header-border-bottom-color": "rgba(18, 18, 18, 0.1)"
141
+ },
142
+ "pocket-chip": {
143
+ "--body-background": "#121417",
144
+ "--body-accent-color": "#e0b25a",
145
+ "--body-color-muted": "#9a968d",
146
+ "--card-background-color": "#1a1d22",
147
+ "--header-background-color": "#15171b",
148
+ "--header-border-bottom-color": "rgba(243, 241, 236, 0.08)"
149
+ },
150
+ "readout-highlighter": {
151
+ "--body-background": "#f4f4f1",
152
+ "--body-accent-color": "#24357f",
153
+ "--body-color-muted": "#5d626a",
154
+ "--card-background-color": "#fdfdfb",
155
+ "--header-background-color": "#ffffff",
156
+ "--header-border-bottom-color": "rgba(27, 29, 33, 0.08)"
157
+ },
158
+ "readout-night-reader": {
159
+ "--body-background": "#0f1216",
160
+ "--body-accent-color": "#62cbc3",
161
+ "--body-color-muted": "#939da7",
162
+ "--card-background-color": "#161b21",
163
+ "--header-background-color": "#12161b",
164
+ "--header-border-bottom-color": "rgba(212, 219, 225, 0.08)"
165
+ },
166
+ "recall-calling-card": {
167
+ "--body-background": "#eef0f4",
168
+ "--body-accent-color": "#7a570e",
169
+ "--body-color-muted": "#5a6380",
170
+ "--card-background-color": "#ffffff",
171
+ "--header-background-color": "#ffffff",
172
+ "--header-border-bottom-color": "rgba(20, 27, 46, 0.09)"
173
+ },
174
+ "recall-stage-light": {
175
+ "--body-background": "#0e0f1c",
176
+ "--body-accent-color": "#e8c46a",
177
+ "--body-color-muted": "#a39c90",
178
+ "--card-background-color": "#171828",
179
+ "--header-background-color": "#121322",
180
+ "--header-border-bottom-color": "rgba(246, 241, 230, 0.08)"
181
+ },
182
+ "tasks-legal-pad": {
183
+ "--body-background": "#f7f3dc",
184
+ "--body-accent-color": "#24499a",
185
+ "--body-color-muted": "#525c76",
186
+ "--card-background-color": "#fffef6",
187
+ "--header-background-color": "#ffffff",
188
+ "--header-border-bottom-color": "rgba(24, 33, 58, 0.1)"
189
+ },
190
+ "tasks-deep-work": {
191
+ "--body-background": "#101317",
192
+ "--body-accent-color": "#8fb0ff",
193
+ "--body-color-muted": "#98a1ad",
194
+ "--card-background-color": "#171b21",
195
+ "--header-background-color": "#13161b",
196
+ "--header-border-bottom-color": "rgba(220, 225, 232, 0.08)"
197
+ }
198
+ };
199
+ export { AUTHORED_LIGHT_THEMES, AUTHORED_PREVIEW_PALETTES, AUTHORED_THEMES, AUTHORED_THEME_CONFIGS };
package/dist/index.d.ts CHANGED
@@ -1,4 +1,7 @@
1
- export { previewPalettes, type PreviewToken } from './previewPalettes';
2
- export { FAVORITE_THEMES, getThemeAppearance, getThemeConfig, LIGHT_THEMES, THEME_CONFIGS, type ThemeAppearance, type ThemeConfig } from './themeConfig';
1
+ export { applyAuthoredEngine, AUTHORED_ENGINE_VALUE, clearAuthoredEngine, THEME_ENGINE_ATTRIBUTE } from './authoredEngine';
2
+ export { AUTHORED_THEMES } from './authoredThemes';
3
+ export { type PreviewToken } from './previewPalettes';
4
+ export { getThemeAppearance, getThemeConfig, LIGHT_THEMES, previewPalettes, THEME_CONFIGS } from './registry';
5
+ export { FAVORITE_THEMES, type ThemeAppearance, type ThemeConfig } from './themeConfig';
3
6
  /** Where the Vite plugin writes each theme's stylesheet, relative to the app's base URL. */
4
7
  export declare const THEME_ASSET_DIR = "memobit-themes";
package/dist/index.js CHANGED
@@ -1,6 +1,8 @@
1
- import { previewPalettes } from "./previewPalettes.js";
2
- import { FAVORITE_THEMES, LIGHT_THEMES, THEME_CONFIGS, getThemeAppearance, getThemeConfig } from "./themeConfig.js";
1
+ import { AUTHORED_ENGINE_VALUE, THEME_ENGINE_ATTRIBUTE, applyAuthoredEngine, clearAuthoredEngine } from "./authoredEngine.js";
2
+ import { AUTHORED_THEMES } from "./authoredThemes.js";
3
+ import { FAVORITE_THEMES } from "./themeConfig.js";
4
+ import { LIGHT_THEMES, THEME_CONFIGS, getThemeAppearance, getThemeConfig, previewPalettes } from "./registry.js";
3
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
- 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 };