@motion-proto/live-tokens 0.66.0 → 0.67.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/CHANGELOG.md +154 -0
  2. package/README.md +67 -9
  3. package/dist-plugin/{chunk-NRONZ3T5.js → chunk-J2JT4UEA.js} +225 -119
  4. package/dist-plugin/index.cjs +258 -134
  5. package/dist-plugin/index.js +27 -9
  6. package/dist-plugin/migrateData/index.cjs +225 -119
  7. package/dist-plugin/migrateData/index.js +1 -1
  8. package/package.json +8 -1
  9. package/src/editor/bootstrap.ts +12 -0
  10. package/src/editor/core/productionPulse.ts +1 -1
  11. package/src/editor/core/sketch/index.ts +23 -27
  12. package/src/editor/core/sketch/maskField.ts +200 -62
  13. package/src/editor/core/sketch/sketchLayer.ts +10 -4
  14. package/src/editor/core/sketch/sketchRegistry.ts +98 -0
  15. package/src/editor/core/sketch/sketchStore.ts +64 -33
  16. package/src/editor/core/sketch/sketchStyleService.ts +3 -0
  17. package/src/editor/core/sketch/sketchStyles.ts +57 -96
  18. package/src/editor/docs/content/sketch-mode.md +56 -14
  19. package/src/editor/docs/content.generated.ts +1 -1
  20. package/src/editor/ui/sketch/SketchTab.svelte +219 -74
  21. package/src/live-tokens/data/sketch-styles/dashed.json +47 -0
  22. package/src/live-tokens/data/sketch-styles/dry.json +47 -0
  23. package/src/live-tokens/data/sketch-styles/hatched.json +47 -0
  24. package/src/live-tokens/data/sketch-styles/marker.json +47 -0
  25. package/src/live-tokens/data/sketch-styles/napkin.json +47 -0
  26. package/src/live-tokens/data/sketch-styles/pencil.json +47 -0
  27. package/src/live-tokens/data/sketch-styles/whiteboard.json +47 -0
  28. package/src/live-tokens/data/themes/autumn.json +4 -4
  29. package/src/live-tokens/data/themes/halloween.json +4 -4
  30. package/src/live-tokens/data/themes/midnight-study.json +4 -4
  31. package/src/live-tokens/data/themes/ocean.json +4 -4
  32. package/src/live-tokens/data/themes/royal-velvet.json +4 -4
  33. package/src/live-tokens/data/themes/sketchy.json +4 -4
  34. package/src/live-tokens/data/themes/spring-meadow.json +4 -4
  35. package/src/live-tokens/data/themes/sunset.json +4 -4
  36. package/src/system/components/Button.svelte +2 -2
  37. package/src/system/components/IconButton.svelte +2 -2
  38. package/src/system/styles/fonts.css +6 -6
  39. package/template/src/main.ts +14 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,159 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.67.1 — The Napkin you tuned is the Napkin that ships
4
+
5
+ ### Changed
6
+
7
+ - **Napkin's shipped dials match the look it was tuned to.** Four dials moved on
8
+ a theme's own copy of the sketchstyle and never reached the file the package
9
+ ships, so a project loading Napkin from the shipped set got a paler, softer
10
+ ballpoint than the one on screen. The ink floor lifts to 0.62 over a harder
11
+ mask edge, coverage runs to full, and instances vary a little less in size.
12
+
13
+ - **Pencil's blurb says what the grain does.** It is drawn long and on the
14
+ diagonal, the way a pencil shades, which the old sentence left out.
15
+
16
+ ### Documentation
17
+
18
+ - **The README covers sketch mode.** What the layer is, the seven shipped looks
19
+ with the blurb each one carries, seeding a built site from a theme, registering
20
+ your own sketchstyles at boot, building a picker, and the four classes the
21
+ layer reserves for elements you draw yourself. A test pins each blurb to the
22
+ README, so a look renamed or reworded here fails the suite until the page
23
+ catches up.
24
+
25
+ ## 0.67.0 — Every sketchstyle is a file
26
+
27
+ ### Added
28
+
29
+ - **A saved sketchstyle ships with your site.** 0.66.0 carried the look a theme
30
+ holds into a build, which covers one look per theme. Everything else a project
31
+ saved in the Sketchstyle view stayed behind: the files live in
32
+ `src/live-tokens/data/sketch-styles/` and only the dev server could read them,
33
+ so a picker on a built site silently listed the shipped seven and nothing
34
+ else. Hand them to `bootLiveTokens` and they are real everywhere:
35
+
36
+ ```ts
37
+ const files = import.meta.glob('./live-tokens/data/sketch-styles/*.json', {
38
+ eager: true,
39
+ import: 'default',
40
+ });
41
+
42
+ await bootLiveTokens(App, '#app', {
43
+ sketchLooks: Object.entries(files).map(([path, file]) => {
44
+ const id = path.split('/').pop().replace('.json', '');
45
+ return { id, label: file.name || id, settings: file.settings };
46
+ }),
47
+ });
48
+ ```
49
+
50
+ Unlike `components`, these register in a build as well as in dev. Reaching a
51
+ published site is the whole point of them.
52
+
53
+ `create` writes this into `src/main.ts`, so a new project publishes what it
54
+ saves without wiring anything.
55
+
56
+ - **A Save pill in the Sketchstyle view**, which writes the dials back over the
57
+ sketchstyle you have selected. Updating a saved sketchstyle used to run
58
+ through the naming form: open it, accept the pre-filled label, submit, and
59
+ nothing on screen said a file had been replaced rather than created. Save
60
+ lights as soon as the dials leave the sketchstyle they name. On one of your
61
+ own it writes that file; on a shipped one it writes your project's own copy
62
+ under the same name, which takes its place in the list, and deleting that file
63
+ brings the shipped look back. **Save As** always creates, and starts its form
64
+ empty to say so.
65
+
66
+ ### Changed
67
+
68
+ - **Every sketchstyle ships as a file.** The seven looks were a constant in
69
+ `sketchStyles.ts`. The Sketchstyle view could save over one, but the thing it
70
+ saved over had no file to read, copy or compare against, so "restore the
71
+ shipped Pencil" meant trusting that a deleted file fell back to something
72
+ nobody could open. They now ship as JSON under
73
+ `src/live-tokens/data/sketch-styles/`, one per look, and the module reads
74
+ them: the file is the look.
75
+
76
+ A shipped sketchstyle behaves like a shipped colors-and-type. Save over one
77
+ and your project gets its own copy that shadows it; delete that copy and the
78
+ packaged file comes back. The listing marks which is which (`isPackage`), and
79
+ deleting a look that only the package ships answers 403 rather than reporting
80
+ success and leaving it on screen.
81
+
82
+ Pencil, Marker and Whiteboard ship with reworked ink coverage. Pencil's grain
83
+ is now stretched and turned rather than square (`maskBlobX` 40 to 525 at 67
84
+ degrees, on turbulence), Marker's blobs are twice the size over a much higher
85
+ floor with the softness off, and Whiteboard's streak is finer and harder with
86
+ more rotation on the jitter. The other four are unchanged.
87
+
88
+ - **Primary and secondary buttons rest one rung lower.**
89
+ `--button-primary-surface` moves from `--surface-brand-high` to
90
+ `--surface-brand` and `--button-secondary-surface` from
91
+ `--surface-neutral-high` to `--surface-neutral`, with `--iconbutton-*`
92
+ following. The border scale runs at the same lightness as the `-high` surface
93
+ rung, so a filled button was outlined in its own fill colour: the sketch
94
+ effect's hatch, which inks itself from the part's stroke, came out invisible
95
+ on exactly these two variants while Danger, Success, and Warning shaded
96
+ normally. Those three already rest on `-low`. This puts Primary and Secondary
97
+ on the rung Badge and CornerBadge already use, and lifts white text off the
98
+ surface by a further step. The eight preset themes carry the new value.
99
+
100
+ - **Ink coverage scales on two axes, and the px it states are the px it
101
+ paints.** The Scale dial fitted a whole number of blobs to a fixed 600px tile,
102
+ so it could only reach the sizes that divide 600: it read 250px at the top of
103
+ its travel and painted 300px, there was nothing above that at all, and every
104
+ reading in between was the nearest fit rather than the number on the dial. The
105
+ tile is now painted at whatever the dial says, which makes the px exact and
106
+ opens the travel to 8px speckle and 600px patches.
107
+
108
+ The dial is a pair, **Scale across** and **Scale down**, held together by a
109
+ chain. Click it and the two part company: blobs wider than they are tall read
110
+ as ink dragged sideways, taller than wide as a vertical grain, and the fill
111
+ keeps the same field underneath either way. Sketchstyles stored before the
112
+ split come back square and linked, which is the look they had.
113
+
114
+ Unlinked, a **Rotation** dial appears with them and points the stretch
115
+ wherever you like. It is offered only there because a field the same in every
116
+ direction is the same field turned. The tile still meets itself at every
117
+ setting: a turned pattern repeats seamlessly only at the angles that land the
118
+ page's own axes back on whole noise cells, so the dial takes the nearest of
119
+ those and reads back the turn it landed on, usually within a degree or two of
120
+ the one you asked for.
121
+
122
+ - **Shipped and saved sketchstyles are one list, in one id namespace.** A
123
+ sketchstyle named after a shipped one replaces it and keeps its place, so a
124
+ project that wants its own Pencil saves one. The Sketchstyle view shows a
125
+ single grid; the ✕ marks the rows your project owns.
126
+
127
+ ### Fixed
128
+
129
+ - **Saving no longer reloads the page.** A project registers its saved
130
+ sketchstyles with `import.meta.glob`, which is what `create` writes into
131
+ `main.ts`, so writing one invalidated the entry module and Vite answered with
132
+ a full reload. The Sketchstyle view the save came from was torn down and
133
+ rebuilt mid-edit, which read as the editor closing itself every time you
134
+ pressed Save. The dev server now keeps every JSON under the data directory off
135
+ its watcher: the editor reads that directory over its own API and re-lists
136
+ after each write, so the page already holds what the reload would fetch.
137
+ `tokens.generated.css` and `fonts.css` stay watched, since the page really
138
+ does import them and CSS updates without a reload. A data file changed from
139
+ outside the editor, by a CLI run or a branch switch, now needs the page
140
+ reloaded by hand.
141
+
142
+ ### Breaking
143
+
144
+ Pre-1.0, and the sketch API is days old. Every consumer we know of is in this
145
+ repo or in a site we own.
146
+
147
+ - `SKETCH_LOOKS` is now the `sketchLooks` store, since looks register after the
148
+ module is imported and a constant array would be stale. A picker reads
149
+ `$sketchLooks` the way it already reads `$themeSketchLook`.
150
+ - `USER_STYLE_PREFIX` and `selectSavedSketchStyle` are gone. A saved
151
+ sketchstyle's id is its file slug, so `setSketch(id)` and
152
+ `selectSketchStyle(id)` take it like any other.
153
+ - A `user:` id already in a browser's storage is stripped on read, so no
154
+ migration is needed and nobody loses their selection. Themes need nothing at
155
+ all: a theme has always stored its `sketchStyle` by value, never by id.
156
+
3
157
  ## 0.66.0 — A theme's sketchstyle reaches the built site
4
158
 
5
159
  ### Added
package/README.md CHANGED
@@ -8,15 +8,16 @@ npm install @motion-proto/live-tokens
8
8
 
9
9
  The editor is dev-only. Production builds get plain CSS variables and the components you used.
10
10
 
11
- ## What you get
11
+ ## Features
12
12
 
13
13
  - **Live token editing.** Colors, typography, spacing, radii, shadows, motion, palettes, and gradients. Every input writes a CSS variable, so the page repaints with no reload and no build step.
14
14
  - **Live component editing.** 25 shipped Svelte components (Button, IconButton, Input, Card, Dialog, Badge, Callout, Table, Tooltip, Toggle, TabBar, SegmentedControl, RadioButton, MenuSelect, ProgressBar, CornerBadge, SectionDivider, CollapsibleSection, Notification, Image, ImageLightbox, CodeSnippet, SideNavigation, Panel, InlineEditActions) declare their design-token aliases in a `:global(:root)` block. Rewire an alias from the component's editor and it updates everywhere that component is used, on your real pages.
15
15
  - **Four dev-only routes.** `/live-tokens/editor` for tokens, `/live-tokens/colors` for palettes, `/live-tokens/components` for per-component aliases, `/live-tokens/docs` for the user guide.
16
16
  - **Editor overlay.** Pins to the top right of every dev page and opens the editor in a side panel or floating window, so you edit on the page you are styling. Its "Page Source" button opens the current page's `.svelte` file in VS Code.
17
17
  - **Themes.** A theme is a whole look in one file: colors and type plus a config for every component, stored by value. Loading one changes a single pointer file, and nothing your site ships changes until you Adopt. Export a theme and import it into another project to restore the look in one step.
18
- - **Seven example looks.** Autumn, Halloween, Midnight Study, Ocean, Royal Velvet, Spring Meadow, and Sunset each ship as a full theme: colors, a Google Fonts pairing, and a shape personality of radius, padding, gap, and border-width aliases. They ship inside the package, so trying one needs no local files. Load Motion Proto to return to the default. Saving over a preset writes a local copy that shadows the shipped one; delete the copy and the shipped version returns.
19
- - **Vite plugin.** Hosts the `/api/live-tokens/{colors-and-type,component-configs,themes}/*` routes the editor reads and writes through. The single namespace keeps these routes clear of anything your app serves under `/api`.
18
+ - **Eight example looks.** Autumn, Halloween, Midnight Study, Ocean, Royal Velvet, Sketchy, Spring Meadow, and Sunset each ship as a full theme: colors, a Google Fonts pairing, and a shape personality of radius, padding, gap, and border-width aliases. They ship inside the package, so trying one needs no local files. Load Motion Proto to return to the default. Saving over a preset writes a local copy that shadows the shipped one; delete the copy and the shipped version returns.
19
+ - **Sketch mode.** Redraws the page as if it had been drawn by hand. Seven looks ship as files, and the effect is a layer over your tokens rather than a change to them. See [Sketch mode](#sketch-mode).
20
+ - **Vite plugin.** Hosts the `/api/live-tokens/{colors-and-type,component-configs,themes,sketch-styles}/*` routes the editor reads and writes through. The single namespace keeps these routes clear of anything your app serves under `/api`.
20
21
  - **Claude Code skills.** Six bundled skills that drive the package from plain English. See [Claude Code skills](#claude-code-skills).
21
22
 
22
23
  ## Install
@@ -84,7 +85,7 @@ bootLiveTokens(App, '#app');
84
85
 
85
86
  For routes you cannot enumerate ahead of time (a `/:id`, a path prefix, a page shown only under some condition), add a `resolve` function from the current path to a `RouteEntry` and return `null` to fall through. Resolution order is `pages[path]`, then `resolve(path)`, then the `pages['/']` fallback, so adding `resolve` never changes how existing entries match. A resolved entry can carry `props`, letting one component serve many paths, and its `source` gives the dynamic route a working "Page Source" button.
86
87
 
87
- Link-click interception follows the same route table. A left-click becomes an in-app `navigate()` only when the anchor asks for ordinary same-tab navigation no `target`, `download`, `rel="external"`, or modifier key and `pages` or `resolve` claims the path. Anything else keeps the browser's own handling, so a link to a PDF or an image under `public/`, to a download, or to a path no route declares loads for real. Note that the `pages['/']` fallback renders an unmatched path without claiming it: link to a path no route declares and you get a page load, not a client-side swap.
88
+ Link-click interception follows the same route table. A left-click becomes an in-app `navigate()` only when the anchor asks for ordinary same-tab navigation (no `target`, `download`, `rel="external"`, or modifier key) and `pages` or `resolve` claims the path. Anything else keeps the browser's own handling, so a link to a PDF or an image under `public/`, to a download, or to a path no route declares loads for real. Note that the `pages['/']` fallback renders an unmatched path without claiming it: link to a path no route declares and you get a page load, not a client-side swap.
88
89
 
89
90
  ```svelte
90
91
  <LiveTokensRouter
@@ -131,11 +132,11 @@ Or copy `node_modules/@motion-proto/live-tokens/src/system/styles/tokens.css` in
131
132
 
132
133
  `bootLiveTokens` and `<LiveTokensRouter>` are wrappers. The individual init functions (`initCssVarSync`, `initRouter`, `initColumnsOverlay`, `initEditorStore`, `initializeTheme`), `<LiveEditorOverlay>`, `<ColumnsOverlay>`, and the editor page exports (`@motion-proto/live-tokens/editor`, `@motion-proto/live-tokens/component-editor-page`) are all exported. Use them to build a custom shell: arbitrary markup per route, a foreign matcher, or your own overlay wiring. Dynamic and gated routes do not need this; use `resolve` above, which keeps the overlay, nav rail, and page source intact.
133
134
 
134
- ## Where data lands, and how to move it
135
+ ## The data directory
135
136
 
136
- The plugin reads and writes under one folder, `src/live-tokens/data/`, which holds three subdirectories it owns: `colors-and-type/`, `themes/`, and `component-configs/`.
137
+ The plugin reads and writes under one folder, `src/live-tokens/data/`, which holds four subdirectories it owns: `colors-and-type/`, `themes/`, `component-configs/`, and `sketch-styles/`.
137
138
 
138
- `themes/` holds one file per whole look, plus `_active.json` naming the one the editor has open and `_production.json` naming the one your site ships. `colors-and-type/` and `component-configs/{comp}/` hold each layer's `default.json` baseline, any preset you save by name, and the `_working.json` buffer for edits you have not saved into the active theme. A buffer is a delta from the open theme, so ordinary theme switching leaves none behind.
139
+ `themes/` holds one file per whole look, plus `_active.json` naming the one the editor has open and `_production.json` naming the one your site ships. `colors-and-type/` and `component-configs/{comp}/` hold each layer's `default.json` baseline, any preset you save by name, and the `_working.json` buffer for edits you have not saved into the active theme. A buffer is a delta from the open theme, so ordinary theme switching leaves none behind. `sketch-styles/` holds one file per look, shipped and your own alike.
139
140
 
140
141
  To move the data, create `live-tokens.config.json` at your project root:
141
142
 
@@ -256,6 +257,62 @@ bootLiveTokens(App, '#app', {
256
257
 
257
258
  The component appears on `/live-tokens/components` under a **CUSTOM** group. Token rows, linked-block sharing, per-component config persistence, and reset-to-default behave exactly as they do for the built-in set. Import only from `@motion-proto/live-tokens` or `@motion-proto/live-tokens/component-editor`; never deep-import from `src/`.
258
259
 
260
+ ## Sketch mode
261
+
262
+ Sketch mode redraws the page as if it had been drawn by hand. Every component keeps its own colors, spacing, and corners; what changes is the line it is drawn with. The effect is a layer over your tokens and never touches a value, so switching it off returns every component to exactly what its tokens say.
263
+
264
+ Seven looks ship with the package. Each is a full set of dials, and each ships as a file under `src/live-tokens/data/sketch-styles/`.
265
+
266
+ - **Pencil.** Two graphite passes on their own seeds, so the outline disagrees with itself the way a hand coming back round does. The grain is drawn long and on the diagonal, the way a pencil shades.
267
+ - **Marker.** Broad translucent nib gone round twice on the same line, so the overlap darkens and the ink pools where it slows.
268
+ - **Whiteboard.** The fattest nib on glass. One long smooth undulation, and a veined mask that streaks the fill like a half-wiped board.
269
+ - **Hatched.** An etching. The fill is angled shading, the outline a single hard-edged scratch that chatters along its length. No mask: the hatch is the texture.
270
+ - **Dashed.** A drafting outline. One slow drift along the ruler, broken into strokes, with jitter, mask and pressure all off. The clean pole.
271
+ - **Napkin.** Ballpoint in a hurry. Everything loose at once: a square wave sends every edge to full travel, and the second pass lands wherever it lands.
272
+ - **Dry marker.** Ink that ran out. One scratchy pass that breaks up along its length, over a fill the mask has worn nearly through in patches.
273
+
274
+ Open the Sketchstyle view in the editor, move whatever you like, and Save writes your dials to a file. Saving over a shipped look writes a local copy that shadows it; delete the copy and the shipped file returns, the same way presets work.
275
+
276
+ A theme carries a sketchstyle of its own, so a look travels with the theme that uses it.
277
+
278
+ ### Ship the layer with your site
279
+
280
+ The dev server reads the open theme and paints what it carries. A built site has no server to ask, so hand it the field before mounting:
281
+
282
+ ```ts
283
+ import { seedSketchFromTheme } from '@motion-proto/live-tokens/sketch';
284
+ import theme from './live-tokens/data/themes/sketchy.json';
285
+
286
+ seedSketchFromTheme(theme.sketchStyle);
287
+ await bootLiveTokens(App, '#app');
288
+ ```
289
+
290
+ Register your own sketchstyles at boot the way you register components:
291
+
292
+ ```ts
293
+ const files = import.meta.glob('./live-tokens/data/sketch-styles/*.json', {
294
+ eager: true,
295
+ import: 'default',
296
+ });
297
+
298
+ await bootLiveTokens(App, '#app', {
299
+ sketchLooks: Object.entries(files).map(([path, file]) => {
300
+ const id = path.split('/').pop().replace('.json', '');
301
+ return { id, label: file.name || id, settings: file.settings };
302
+ }),
303
+ });
304
+ ```
305
+
306
+ The file's slug is the look's id, so a sketchstyle picked in the editor keeps working once the site is built. `create` writes this into `main.ts` already.
307
+
308
+ ### Build a picker
309
+
310
+ `sketchLooks` is a store holding every look on offer, shipped and your own in one list. Give each row `setSketch(look.id)`, and add a None row yourself: off is a state of the effect rather than one of the looks. `themeSketchLook` carries the theme's own look as one more row, and reads null when the theme carries none.
311
+
312
+ ### Draw your own elements
313
+
314
+ The layer redraws the shipped components and four classes it reserves for you: `sketch-surface` for a box, `sketch-container` for a large one, `sketch-chip` for a small one, and `sketch-rule` for a line. Pick by size, not by kind. The class opts an element in but names no colors, so state them yourself with `--sketch-fill`, `--sketch-stroke`, and `--sketch-radius`. The in-app guide at `/live-tokens/docs` covers every dial and the rules for images and icons.
315
+
259
316
  ## CLI
260
317
 
261
318
  ```bash
@@ -348,13 +405,13 @@ npx @motion-proto/live-tokens check-component <id>
348
405
 
349
406
  The validator checks the file layout, the `:global(:root)` block, the token-suffix vocabulary, the state-before-property rule, the no-raw-color-defaults rule, the public-imports rule, and the `registerComponent({ id })` call. Exit code 0 means the static contract is met. Use it after Claude generates a component, and as a pre-commit guard on hand-authored ones.
350
407
 
351
- ## How the editor ships changes to production
408
+ ## From edit to production
352
409
 
353
410
  1. Edit on `/live-tokens/editor`, `/live-tokens/colors`, or `/live-tokens/components`. Edits sit in the working buffer (`_working.json`). **Save** in the Theme panel captures the buffer into the open theme at `<dataDir>/themes/{name}.json`.
354
411
  2. **Adopt** the theme. It becomes the production theme, and its variables are baked into `tokens.generated.css` next to your authored `tokens.css`. Nothing else writes that file, so trying a look never changes what you ship.
355
412
  3. `npm run build` bundles both as plain CSS. No editor code, no JSON lookups, no dev surfaces reach production.
356
413
 
357
- ## File ownership: what the plugin writes
414
+ ## File ownership
358
415
 
359
416
  Knowing which files the plugin touches matters when you upgrade the package or work in a repo you do not want overwritten. For how a saved look stays safe across upgrades while `tokens.css` holds the building blocks, see [TOKENS.md](./TOKENS.md).
360
417
 
@@ -377,6 +434,7 @@ Knowing which files the plugin touches matters when you upgrade the package or w
377
434
  - `<dataDir>/colors-and-type/_working.json` and `<dataDir>/component-configs/{comp}/_working.json`, the buffers, written as you edit and cleared when a theme you open does not carry them.
378
435
  - `<dataDir>/themes/{name}.json`, on every Save and Save As in the Theme panel.
379
436
  - `<dataDir>/colors-and-type/{name}.json` and `<dataDir>/component-configs/{comp}/{name}.json`, only when you save a preset by name.
437
+ - `<dataDir>/sketch-styles/{name}.json`, on every Save and Save As in the Sketchstyle view. Saving over a shipped look writes this project's own copy under the same name; deleting it restores the shipped file.
380
438
  - `tokens.generated.css` and `fonts.css`, regenerated from the production theme when you Adopt.
381
439
 
382
440
  The plugin never writes your authored `tokens.css`. It holds defaults you are free to hand-edit, and the editor's overrides land in `tokens.generated.css`, which the app imports immediately after it.