@motion-proto/live-tokens 0.67.0 → 0.68.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +54 -0
- package/README.md +67 -9
- package/bin/generate-theme.mjs +5 -4
- package/dist-plugin/adjust/index.d.cts +1 -1
- package/dist-plugin/adjust/index.d.ts +1 -1
- package/dist-plugin/{chunk-T4PMCFJN.js → chunk-2UX6EVVA.js} +30 -30
- package/dist-plugin/{dataPaths-DZUzVv8H.d.cts → dataPaths-bJTCEO4H.d.cts} +1 -1
- package/dist-plugin/{dataPaths-DZUzVv8H.d.ts → dataPaths-bJTCEO4H.d.ts} +1 -1
- package/dist-plugin/fontPairing/index.d.cts +1 -1
- package/dist-plugin/fontPairing/index.d.ts +1 -1
- package/dist-plugin/generateColorsAndType/index.d.cts +1 -1
- package/dist-plugin/generateColorsAndType/index.d.ts +1 -1
- package/dist-plugin/index.cjs +32 -32
- package/dist-plugin/index.d.cts +1 -1
- package/dist-plugin/index.d.ts +1 -1
- package/dist-plugin/index.js +5 -5
- package/dist-plugin/migrateData/index.cjs +30 -30
- package/dist-plugin/migrateData/index.d.cts +1 -1
- package/dist-plugin/migrateData/index.d.ts +1 -1
- package/dist-plugin/migrateData/index.js +1 -1
- package/dist-plugin/tokensCssMigrations/index.d.cts +1 -1
- package/dist-plugin/tokensCssMigrations/index.d.ts +1 -1
- package/package.json +4 -4
- package/src/editor/bootstrap.ts +6 -6
- package/src/editor/component-editor/ImageLightboxEditor.svelte +1 -1
- package/src/editor/component-editor/scaffolding/ComponentFileManager.svelte +4 -4
- package/src/editor/core/fonts/fontLoader.ts +2 -2
- package/src/editor/core/preview/{lookPreview.ts → themePreview.ts} +27 -27
- package/src/editor/core/productionPulse.ts +3 -3
- package/src/editor/core/sketch/index.ts +52 -44
- package/src/editor/core/sketch/maskField.ts +9 -9
- package/src/editor/core/sketch/sketchLayer.ts +9 -9
- package/src/editor/core/sketch/sketchRegistry.ts +34 -34
- package/src/editor/core/sketch/sketchStore.ts +98 -83
- package/src/editor/core/sketch/sketchStyleService.ts +4 -4
- package/src/editor/core/sketch/sketchStyles.ts +28 -28
- package/src/editor/core/themes/colorsAndTypeService.ts +1 -1
- package/src/editor/core/themes/loadRows.ts +8 -8
- package/src/editor/core/themes/themeDocumentSync.ts +2 -2
- package/src/editor/core/themes/themeInit.ts +2 -2
- package/src/editor/core/themes/themeService.ts +17 -17
- package/src/editor/core/themes/{lookSummary.ts → themeSummary.ts} +9 -9
- package/src/editor/core/themes/themeTypes.ts +10 -6
- package/src/editor/docs/content/getting-started.md +1 -1
- package/src/editor/docs/content/sketch-mode.md +22 -17
- package/src/editor/docs/content/themes-workflow.md +11 -11
- package/src/editor/docs/content/where-themes-live.md +6 -6
- package/src/editor/docs/content.generated.ts +4 -4
- package/src/editor/index.ts +2 -2
- package/src/editor/ui/ThemePanel.svelte +52 -52
- package/src/editor/ui/sketch/SketchPreview.svelte +2 -2
- package/src/editor/ui/sketch/SketchTab.svelte +64 -38
- package/src/live-tokens/data/sketch-styles/dry.json +5 -5
- package/src/live-tokens/data/sketch-styles/hatched.json +9 -9
- package/src/live-tokens/data/sketch-styles/napkin.json +4 -4
- package/src/live-tokens/data/sketch-styles/pencil.json +2 -2
- package/src/live-tokens/data/themes/autumn.json +1 -1
- package/src/live-tokens/data/themes/halloween.json +1 -1
- package/src/live-tokens/data/themes/midnight-study.json +1 -1
- package/src/live-tokens/data/themes/ocean.json +1 -1
- package/src/live-tokens/data/themes/royal-velvet.json +1 -1
- package/src/live-tokens/data/themes/sketchy.json +1 -1
- package/src/live-tokens/data/themes/spring-meadow.json +1 -1
- package/src/live-tokens/data/themes/sunset.json +1 -1
- package/src/system/backdrop/backdrop.ts +1 -1
- package/src/system/components/SectionDivider.svelte +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,59 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.68.1 — A look is a Theme, or it's a sketch style
|
|
4
|
+
|
|
5
|
+
### Changed
|
|
6
|
+
|
|
7
|
+
- **"Look" is gone from the public surface.** The word covered two different
|
|
8
|
+
things, a whole design identity and the hand-drawn sketch effect, and every
|
|
9
|
+
export now names the one it means. `adoptLook` is `adoptTheme`,
|
|
10
|
+
`AdoptLookResult` is `AdoptThemeResult`. From `@motion-proto/live-tokens/sketch`,
|
|
11
|
+
`registerSketchLook` is `registerSketchStyle`, `SketchLook` is `SketchStyle`,
|
|
12
|
+
`SketchLookSource` is `SketchStyleSource`, `RegisterSketchLookInput` is
|
|
13
|
+
`RegisterSketchStyleInput`, the `sketchLooks` store is `sketchStyles`, and
|
|
14
|
+
`themeSketchLook` is `unsavedSketchStyle`. `bootLiveTokens`'s `sketchLooks`
|
|
15
|
+
option is `sketchStyles`.
|
|
16
|
+
|
|
17
|
+
- **A theme's embedded sketch settings moved from `sketchStyle` to
|
|
18
|
+
`sketchSettings`.** The field holds a sketchstyle's settings, not a
|
|
19
|
+
sketchstyle, so it is named for what it holds. Reading a theme accepts
|
|
20
|
+
either key, so nothing breaks on upgrade; the boot migration rewrites the
|
|
21
|
+
file to the new key the next time it saves. Schema version 5.
|
|
22
|
+
|
|
23
|
+
### Fixed
|
|
24
|
+
|
|
25
|
+
- **Picking a sketchstyle in the Sketchstyle view now updates a page's own
|
|
26
|
+
picker.** Selection went through `selectSketchStyle`/`selectUnsavedSketchStyle`,
|
|
27
|
+
separate from the door a page picker calls, so the two could disagree about
|
|
28
|
+
what was on screen. Both go through `setSketch` now: one call applies the
|
|
29
|
+
style, turns the effect on, and keeps every picker in step.
|
|
30
|
+
|
|
31
|
+
- **The mask's Rotation dial appears whenever its two axes differ**, not only
|
|
32
|
+
when they were never linked. Un-linking the axes and moving just one used to
|
|
33
|
+
leave Rotation hidden even though the mask was no longer round.
|
|
34
|
+
|
|
35
|
+
## 0.67.1 — The Napkin you tuned is the Napkin that ships
|
|
36
|
+
|
|
37
|
+
### Changed
|
|
38
|
+
|
|
39
|
+
- **Napkin's shipped dials match the look it was tuned to.** Four dials moved on
|
|
40
|
+
a theme's own copy of the sketchstyle and never reached the file the package
|
|
41
|
+
ships, so a project loading Napkin from the shipped set got a paler, softer
|
|
42
|
+
ballpoint than the one on screen. The ink floor lifts to 0.62 over a harder
|
|
43
|
+
mask edge, coverage runs to full, and instances vary a little less in size.
|
|
44
|
+
|
|
45
|
+
- **Pencil's blurb says what the grain does.** It is drawn long and on the
|
|
46
|
+
diagonal, the way a pencil shades, which the old sentence left out.
|
|
47
|
+
|
|
48
|
+
### Documentation
|
|
49
|
+
|
|
50
|
+
- **The README covers sketch mode.** What the layer is, the seven shipped looks
|
|
51
|
+
with the blurb each one carries, seeding a built site from a theme, registering
|
|
52
|
+
your own sketchstyles at boot, building a picker, and the four classes the
|
|
53
|
+
layer reserves for elements you draw yourself. A test pins each blurb to the
|
|
54
|
+
README, so a look renamed or reworded here fails the suite until the page
|
|
55
|
+
catches up.
|
|
56
|
+
|
|
3
57
|
## 0.67.0 — Every sketchstyle is a file
|
|
4
58
|
|
|
5
59
|
### 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
|
-
##
|
|
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
|
-
- **
|
|
19
|
-
- **
|
|
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
|
|
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
|
-
##
|
|
135
|
+
## The data directory
|
|
135
136
|
|
|
136
|
-
The plugin reads and writes under one folder, `src/live-tokens/data/`, which holds
|
|
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
|
-
##
|
|
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
|
|
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.
|
package/bin/generate-theme.mjs
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// Reads a seed brief (JSON), builds a full validated colors-and-type layer via
|
|
4
4
|
// the compiled engine (dist-plugin/generateColorsAndType — the CLI never imports
|
|
5
5
|
// TS sources), enforces the AA contrast gate, and saves the result as a theme:
|
|
6
|
-
// <themesDir>/<slug>.json, the document that carries the whole
|
|
6
|
+
// <themesDir>/<slug>.json, the document that carries the whole theme by value.
|
|
7
7
|
// Unless --no-activate it then opens that theme the way the dev server's apply
|
|
8
8
|
// door does — existing `_working` buffers are cleared and
|
|
9
9
|
// `themes/_active.json` names it. Nothing else moves, so generating a theme
|
|
@@ -21,9 +21,10 @@ import { fileURLToPath } from 'node:url';
|
|
|
21
21
|
const pkgRoot = resolve(dirname(fileURLToPath(import.meta.url)), '..');
|
|
22
22
|
const ENGINE = resolve(pkgRoot, 'dist-plugin/generateColorsAndType/index.js');
|
|
23
23
|
const packageDataDir = join(pkgRoot, 'src/live-tokens/data');
|
|
24
|
-
// Source of truth:
|
|
25
|
-
//
|
|
26
|
-
|
|
24
|
+
// Source of truth: src/editor/core/themes/themeTypes.ts, which
|
|
25
|
+
// normalizeTheme.ts re-exports. This copy cannot import TS, so
|
|
26
|
+
// `check:preset-themes` and generate-theme.test.ts are what catch a drift.
|
|
27
|
+
const THEME_SCHEMA_VERSION = 5;
|
|
27
28
|
|
|
28
29
|
async function loadEngine() {
|
|
29
30
|
if (!existsSync(ENGINE)) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { A as AliasDiskValue, a as ComponentConfig } from '../themeTypes-DSV3Zisf.cjs';
|
|
2
|
-
export { r as readLiveTokensConfig, a as resolveDataDirs } from '../dataPaths-
|
|
2
|
+
export { r as readLiveTokensConfig, a as resolveDataDirs } from '../dataPaths-bJTCEO4H.cjs';
|
|
3
3
|
export { C as CURRENT_COMPONENT_SCHEMA_VERSION } from '../index-4N-Orzzi.cjs';
|
|
4
4
|
|
|
5
5
|
type AdjustKind = 'radius' | 'padding' | 'gap' | 'border-width';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { A as AliasDiskValue, a as ComponentConfig } from '../themeTypes-DSV3Zisf.js';
|
|
2
|
-
export { r as readLiveTokensConfig, a as resolveDataDirs } from '../dataPaths-
|
|
2
|
+
export { r as readLiveTokensConfig, a as resolveDataDirs } from '../dataPaths-bJTCEO4H.js';
|
|
3
3
|
export { C as CURRENT_COMPONENT_SCHEMA_VERSION } from '../index-4N-Orzzi.js';
|
|
4
4
|
|
|
5
5
|
type AdjustKind = 'radius' | 'padding' | 'gap' | 'border-width';
|
|
@@ -135,7 +135,7 @@ function versionedFileResourceServer(opts) {
|
|
|
135
135
|
}
|
|
136
136
|
|
|
137
137
|
// src/editor/core/themes/themeTypes.ts
|
|
138
|
-
var THEME_SCHEMA_VERSION =
|
|
138
|
+
var THEME_SCHEMA_VERSION = 5;
|
|
139
139
|
|
|
140
140
|
// src/editor/core/themes/migrateComponentConfig.ts
|
|
141
141
|
function migrateComponentConfig(component, aliasesIn, rawConfig, fileVersion) {
|
|
@@ -273,7 +273,7 @@ var pencil_default = {
|
|
|
273
273
|
name: "Pencil",
|
|
274
274
|
settings: {
|
|
275
275
|
label: "Pencil",
|
|
276
|
-
blurb: "Two graphite passes on their own seeds, so the outline disagrees with itself the way a hand coming back round does.
|
|
276
|
+
blurb: "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.",
|
|
277
277
|
fillTravel: 0.75,
|
|
278
278
|
strokeTravel: 1.25,
|
|
279
279
|
wobble: 30,
|
|
@@ -438,15 +438,15 @@ var hatched_default = {
|
|
|
438
438
|
pressureMod: 0.45,
|
|
439
439
|
pooling: 0.8,
|
|
440
440
|
strokeInk: 1,
|
|
441
|
-
maskOn:
|
|
442
|
-
maskBlobX:
|
|
443
|
-
maskBlobY:
|
|
444
|
-
maskBlobLinked:
|
|
445
|
-
maskAngle:
|
|
446
|
-
maskOutputMin: 0.
|
|
441
|
+
maskOn: true,
|
|
442
|
+
maskBlobX: 10,
|
|
443
|
+
maskBlobY: 600,
|
|
444
|
+
maskBlobLinked: false,
|
|
445
|
+
maskAngle: 150,
|
|
446
|
+
maskOutputMin: 0.35,
|
|
447
447
|
maskOutputMax: 1,
|
|
448
448
|
maskOctaves: 2,
|
|
449
|
-
maskGrain: "
|
|
449
|
+
maskGrain: "turbulence",
|
|
450
450
|
maskPosterize: 1,
|
|
451
451
|
maskSoftness: 1.5,
|
|
452
452
|
jitterX: 1.5,
|
|
@@ -460,7 +460,7 @@ var hatched_default = {
|
|
|
460
460
|
iconMaskOn: false,
|
|
461
461
|
iconMaskScale: 1
|
|
462
462
|
},
|
|
463
|
-
updatedAt: "2026-08-
|
|
463
|
+
updatedAt: "2026-08-28T21:17:18.232Z",
|
|
464
464
|
createdAt: "2026-08-28T15:47:36.934Z"
|
|
465
465
|
};
|
|
466
466
|
|
|
@@ -541,16 +541,16 @@ var napkin_default = {
|
|
|
541
541
|
maskBlobY: 150,
|
|
542
542
|
maskBlobLinked: true,
|
|
543
543
|
maskAngle: 0,
|
|
544
|
-
maskOutputMin: 0.
|
|
545
|
-
maskOutputMax:
|
|
544
|
+
maskOutputMin: 0.62,
|
|
545
|
+
maskOutputMax: 1,
|
|
546
546
|
maskOctaves: 2,
|
|
547
547
|
maskGrain: "fractal",
|
|
548
548
|
maskPosterize: 2,
|
|
549
|
-
maskSoftness:
|
|
549
|
+
maskSoftness: 5,
|
|
550
550
|
jitterX: 6,
|
|
551
551
|
jitterY: 6,
|
|
552
552
|
jitterRot: 1.8,
|
|
553
|
-
jitterScale: 0.
|
|
553
|
+
jitterScale: 0.075,
|
|
554
554
|
cornerSpread: 20,
|
|
555
555
|
cornerTravel: 17,
|
|
556
556
|
iconTravel: 2.25,
|
|
@@ -586,11 +586,11 @@ var dry_default = {
|
|
|
586
586
|
pooling: 1.5,
|
|
587
587
|
strokeInk: 0.4,
|
|
588
588
|
maskOn: true,
|
|
589
|
-
maskBlobX:
|
|
590
|
-
maskBlobY:
|
|
589
|
+
maskBlobX: 170,
|
|
590
|
+
maskBlobY: 170,
|
|
591
591
|
maskBlobLinked: true,
|
|
592
592
|
maskAngle: 0,
|
|
593
|
-
maskOutputMin: 0.
|
|
593
|
+
maskOutputMin: 0.57,
|
|
594
594
|
maskOutputMax: 0.91,
|
|
595
595
|
maskOctaves: 2,
|
|
596
596
|
maskGrain: "fractal",
|
|
@@ -607,18 +607,18 @@ var dry_default = {
|
|
|
607
607
|
iconMaskOn: true,
|
|
608
608
|
iconMaskScale: 3.8
|
|
609
609
|
},
|
|
610
|
-
updatedAt: "2026-08-
|
|
610
|
+
updatedAt: "2026-08-28T21:19:51.383Z",
|
|
611
611
|
createdAt: "2026-08-28T15:47:36.934Z"
|
|
612
612
|
};
|
|
613
613
|
|
|
614
614
|
// src/editor/core/sketch/sketchStyles.ts
|
|
615
615
|
var SHIPPED_FILES = { pencil: pencil_default, marker: marker_default, whiteboard: whiteboard_default, hatched: hatched_default, dashed: dashed_default, napkin: napkin_default, dry: dry_default };
|
|
616
|
-
var
|
|
616
|
+
var SHIPPED_SKETCH_SETTINGS = Object.fromEntries(
|
|
617
617
|
Object.entries(SHIPPED_FILES).map(([id, file]) => [id, file.settings])
|
|
618
618
|
);
|
|
619
619
|
var DEFAULT_SKETCH_STYLE = "marker";
|
|
620
|
-
function
|
|
621
|
-
const base =
|
|
620
|
+
function hydrateSketchSettings(raw) {
|
|
621
|
+
const base = SHIPPED_SKETCH_SETTINGS[DEFAULT_SKETCH_STYLE];
|
|
622
622
|
const stored = raw ?? {};
|
|
623
623
|
const out = { ...base };
|
|
624
624
|
for (const key of Object.keys(base)) {
|
|
@@ -782,10 +782,10 @@ function normalizeTheme(raw, resolvers) {
|
|
|
782
782
|
}
|
|
783
783
|
const componentConfigs = {};
|
|
784
784
|
for (const [comp, value] of Object.entries(asObject(src.componentConfigs) ?? {})) {
|
|
785
|
-
const
|
|
785
|
+
const embedded2 = asObject(value);
|
|
786
786
|
let resolvedConfig;
|
|
787
|
-
if (
|
|
788
|
-
resolvedConfig = stripFileMarker(
|
|
787
|
+
if (embedded2) {
|
|
788
|
+
resolvedConfig = stripFileMarker(embedded2);
|
|
789
789
|
} else {
|
|
790
790
|
const configName = asString(value, "default");
|
|
791
791
|
const resolved = asObject(resolvers.readComponentConfig(comp, configName));
|
|
@@ -820,8 +820,8 @@ function normalizeTheme(raw, resolvers) {
|
|
|
820
820
|
if (!(key in baseAliases)) filled.orphans++;
|
|
821
821
|
}
|
|
822
822
|
}
|
|
823
|
-
const
|
|
824
|
-
const
|
|
823
|
+
const embedded = asObject(src.sketchSettings) ?? asObject(src.sketchStyle);
|
|
824
|
+
const sketchSettings = embedded ? hydrateSketchSettings(embedded) : void 0;
|
|
825
825
|
return {
|
|
826
826
|
theme: {
|
|
827
827
|
name: asString(src.name, "Untitled"),
|
|
@@ -831,7 +831,7 @@ function normalizeTheme(raw, resolvers) {
|
|
|
831
831
|
colorsAndType,
|
|
832
832
|
componentConfigs,
|
|
833
833
|
componentSchemaVersion: CURRENT_COMPONENT_SCHEMA_VERSION,
|
|
834
|
-
...
|
|
834
|
+
...sketchSettings ? { sketchSettings } : {}
|
|
835
835
|
},
|
|
836
836
|
dropped,
|
|
837
837
|
migrated,
|
|
@@ -886,7 +886,7 @@ function detectLegacyLayout(input) {
|
|
|
886
886
|
const manifestsDir = input.configuredManifestsDir ?? path2.join(input.dataDir, "manifests");
|
|
887
887
|
const themesHoldAThemeFile = holdsATheme(input.themesDir);
|
|
888
888
|
if (isDirectory(manifestsDir) && !themesHoldAThemeFile) {
|
|
889
|
-
return { manifestsDir, evidence: `${manifestsDir} is the pre-0.48 whole-
|
|
889
|
+
return { manifestsDir, evidence: `${manifestsDir} is the pre-0.48 whole-theme directory` };
|
|
890
890
|
}
|
|
891
891
|
if (jsonFiles(input.colorsAndTypeDir).length > 0) return null;
|
|
892
892
|
for (const file of jsonFiles(input.themesDir)) {
|
|
@@ -909,12 +909,12 @@ function planLegacyRenames(layout, input) {
|
|
|
909
909
|
const defaultThemes = path2.join(input.dataDir, "themes");
|
|
910
910
|
if (input.configuredManifestsDir && path2.resolve(input.configuredManifestsDir) !== path2.join(input.dataDir, "manifests")) {
|
|
911
911
|
throw new Error(
|
|
912
|
-
`This project uses the pre-0.48 data layout (${layout.evidence}), and live-tokens.config.json sets the retired "manifestsDir" key to ${input.configuredManifestsDir}. That directory holds the whole
|
|
912
|
+
`This project uses the pre-0.48 data layout (${layout.evidence}), and live-tokens.config.json sets the retired "manifestsDir" key to ${input.configuredManifestsDir}. That directory holds the whole themes, which now belong in ${input.themesDir}. Move it there by hand, drop the "manifestsDir" key, then run the migration again.`
|
|
913
913
|
);
|
|
914
914
|
}
|
|
915
915
|
if (path2.resolve(input.colorsAndTypeDir) !== path2.resolve(defaultColorsAndType) || path2.resolve(input.themesDir) !== path2.resolve(defaultThemes)) {
|
|
916
916
|
throw new Error(
|
|
917
|
-
`This project uses the pre-0.48 data layout (${layout.evidence}), and its data directories are configured to custom paths (colorsAndTypeDir=${input.colorsAndTypeDir}, themesDir=${input.themesDir}). The migration cannot tell which directory holds what. Move the old colors-and-type directory to ${input.colorsAndTypeDir} and the old whole-
|
|
917
|
+
`This project uses the pre-0.48 data layout (${layout.evidence}), and its data directories are configured to custom paths (colorsAndTypeDir=${input.colorsAndTypeDir}, themesDir=${input.themesDir}). The migration cannot tell which directory holds what. Move the old colors-and-type directory to ${input.colorsAndTypeDir} and the old whole-theme directory to ${input.themesDir} by hand, then run the migration again.`
|
|
918
918
|
);
|
|
919
919
|
}
|
|
920
920
|
const renames = [];
|
|
@@ -6,7 +6,7 @@ interface LiveTokensFileConfig {
|
|
|
6
6
|
/**
|
|
7
7
|
* Retired in 0.48, where `themesDir` took over the meaning. Still recognised
|
|
8
8
|
* so an unmigrated project is not told its key is a typo, and so the
|
|
9
|
-
* migration can find (or refuse to guess at) a whole-
|
|
9
|
+
* migration can find (or refuse to guess at) a whole-theme directory the
|
|
10
10
|
* consumer moved.
|
|
11
11
|
*/
|
|
12
12
|
manifestsDir?: string;
|
|
@@ -6,7 +6,7 @@ interface LiveTokensFileConfig {
|
|
|
6
6
|
/**
|
|
7
7
|
* Retired in 0.48, where `themesDir` took over the meaning. Still recognised
|
|
8
8
|
* so an unmigrated project is not told its key is a typo, and so the
|
|
9
|
-
* migration can find (or refuse to guess at) a whole-
|
|
9
|
+
* migration can find (or refuse to guess at) a whole-theme directory the
|
|
10
10
|
* consumer moved.
|
|
11
11
|
*/
|
|
12
12
|
manifestsDir?: string;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { c as FontStackVariable, C as ColorsAndType, b as FontStack, F as FontSource } from '../themeTypes-DSV3Zisf.cjs';
|
|
2
|
-
export { r as readLiveTokensConfig, a as resolveDataDirs } from '../dataPaths-
|
|
2
|
+
export { r as readLiveTokensConfig, a as resolveDataDirs } from '../dataPaths-bJTCEO4H.cjs';
|
|
3
3
|
|
|
4
4
|
type PairingSlot = 'display' | 'body' | 'serif' | 'mono' | 'editorial';
|
|
5
5
|
interface PairingFace {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { c as FontStackVariable, C as ColorsAndType, b as FontStack, F as FontSource } from '../themeTypes-DSV3Zisf.js';
|
|
2
|
-
export { r as readLiveTokensConfig, a as resolveDataDirs } from '../dataPaths-
|
|
2
|
+
export { r as readLiveTokensConfig, a as resolveDataDirs } from '../dataPaths-bJTCEO4H.js';
|
|
3
3
|
|
|
4
4
|
type PairingSlot = 'display' | 'body' | 'serif' | 'mono' | 'editorial';
|
|
5
5
|
interface PairingFace {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { F as FontSource, b as FontStack, G as GradientDiskToken, O as Oklch, H as HarmonyMode, C as ColorsAndType } from '../themeTypes-DSV3Zisf.cjs';
|
|
2
|
-
export { r as readLiveTokensConfig, a as resolveDataDirs } from '../dataPaths-
|
|
2
|
+
export { r as readLiveTokensConfig, a as resolveDataDirs } from '../dataPaths-bJTCEO4H.cjs';
|
|
3
3
|
export { C as CURRENT_COMPONENT_SCHEMA_VERSION } from '../index-4N-Orzzi.cjs';
|
|
4
4
|
|
|
5
5
|
/**
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { F as FontSource, b as FontStack, G as GradientDiskToken, O as Oklch, H as HarmonyMode, C as ColorsAndType } from '../themeTypes-DSV3Zisf.js';
|
|
2
|
-
export { r as readLiveTokensConfig, a as resolveDataDirs } from '../dataPaths-
|
|
2
|
+
export { r as readLiveTokensConfig, a as resolveDataDirs } from '../dataPaths-bJTCEO4H.js';
|
|
3
3
|
export { C as CURRENT_COMPONENT_SCHEMA_VERSION } from '../index-4N-Orzzi.js';
|
|
4
4
|
|
|
5
5
|
/**
|
package/dist-plugin/index.cjs
CHANGED
|
@@ -1888,7 +1888,7 @@ function synthesizeSectionDividerGradients(stringPart, objectPart) {
|
|
|
1888
1888
|
}
|
|
1889
1889
|
|
|
1890
1890
|
// src/editor/core/themes/themeTypes.ts
|
|
1891
|
-
var THEME_SCHEMA_VERSION =
|
|
1891
|
+
var THEME_SCHEMA_VERSION = 5;
|
|
1892
1892
|
|
|
1893
1893
|
// src/editor/core/components/componentConfigKeys.ts
|
|
1894
1894
|
var KNOWN_COMPONENT_CONFIG_KEYS = /* @__PURE__ */ new Set([
|
|
@@ -1909,7 +1909,7 @@ var pencil_default = {
|
|
|
1909
1909
|
name: "Pencil",
|
|
1910
1910
|
settings: {
|
|
1911
1911
|
label: "Pencil",
|
|
1912
|
-
blurb: "Two graphite passes on their own seeds, so the outline disagrees with itself the way a hand coming back round does.
|
|
1912
|
+
blurb: "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.",
|
|
1913
1913
|
fillTravel: 0.75,
|
|
1914
1914
|
strokeTravel: 1.25,
|
|
1915
1915
|
wobble: 30,
|
|
@@ -2074,15 +2074,15 @@ var hatched_default = {
|
|
|
2074
2074
|
pressureMod: 0.45,
|
|
2075
2075
|
pooling: 0.8,
|
|
2076
2076
|
strokeInk: 1,
|
|
2077
|
-
maskOn:
|
|
2078
|
-
maskBlobX:
|
|
2079
|
-
maskBlobY:
|
|
2080
|
-
maskBlobLinked:
|
|
2081
|
-
maskAngle:
|
|
2082
|
-
maskOutputMin: 0.
|
|
2077
|
+
maskOn: true,
|
|
2078
|
+
maskBlobX: 10,
|
|
2079
|
+
maskBlobY: 600,
|
|
2080
|
+
maskBlobLinked: false,
|
|
2081
|
+
maskAngle: 150,
|
|
2082
|
+
maskOutputMin: 0.35,
|
|
2083
2083
|
maskOutputMax: 1,
|
|
2084
2084
|
maskOctaves: 2,
|
|
2085
|
-
maskGrain: "
|
|
2085
|
+
maskGrain: "turbulence",
|
|
2086
2086
|
maskPosterize: 1,
|
|
2087
2087
|
maskSoftness: 1.5,
|
|
2088
2088
|
jitterX: 1.5,
|
|
@@ -2096,7 +2096,7 @@ var hatched_default = {
|
|
|
2096
2096
|
iconMaskOn: false,
|
|
2097
2097
|
iconMaskScale: 1
|
|
2098
2098
|
},
|
|
2099
|
-
updatedAt: "2026-08-
|
|
2099
|
+
updatedAt: "2026-08-28T21:17:18.232Z",
|
|
2100
2100
|
createdAt: "2026-08-28T15:47:36.934Z"
|
|
2101
2101
|
};
|
|
2102
2102
|
|
|
@@ -2177,16 +2177,16 @@ var napkin_default = {
|
|
|
2177
2177
|
maskBlobY: 150,
|
|
2178
2178
|
maskBlobLinked: true,
|
|
2179
2179
|
maskAngle: 0,
|
|
2180
|
-
maskOutputMin: 0.
|
|
2181
|
-
maskOutputMax:
|
|
2180
|
+
maskOutputMin: 0.62,
|
|
2181
|
+
maskOutputMax: 1,
|
|
2182
2182
|
maskOctaves: 2,
|
|
2183
2183
|
maskGrain: "fractal",
|
|
2184
2184
|
maskPosterize: 2,
|
|
2185
|
-
maskSoftness:
|
|
2185
|
+
maskSoftness: 5,
|
|
2186
2186
|
jitterX: 6,
|
|
2187
2187
|
jitterY: 6,
|
|
2188
2188
|
jitterRot: 1.8,
|
|
2189
|
-
jitterScale: 0.
|
|
2189
|
+
jitterScale: 0.075,
|
|
2190
2190
|
cornerSpread: 20,
|
|
2191
2191
|
cornerTravel: 17,
|
|
2192
2192
|
iconTravel: 2.25,
|
|
@@ -2222,11 +2222,11 @@ var dry_default = {
|
|
|
2222
2222
|
pooling: 1.5,
|
|
2223
2223
|
strokeInk: 0.4,
|
|
2224
2224
|
maskOn: true,
|
|
2225
|
-
maskBlobX:
|
|
2226
|
-
maskBlobY:
|
|
2225
|
+
maskBlobX: 170,
|
|
2226
|
+
maskBlobY: 170,
|
|
2227
2227
|
maskBlobLinked: true,
|
|
2228
2228
|
maskAngle: 0,
|
|
2229
|
-
maskOutputMin: 0.
|
|
2229
|
+
maskOutputMin: 0.57,
|
|
2230
2230
|
maskOutputMax: 0.91,
|
|
2231
2231
|
maskOctaves: 2,
|
|
2232
2232
|
maskGrain: "fractal",
|
|
@@ -2243,18 +2243,18 @@ var dry_default = {
|
|
|
2243
2243
|
iconMaskOn: true,
|
|
2244
2244
|
iconMaskScale: 3.8
|
|
2245
2245
|
},
|
|
2246
|
-
updatedAt: "2026-08-
|
|
2246
|
+
updatedAt: "2026-08-28T21:19:51.383Z",
|
|
2247
2247
|
createdAt: "2026-08-28T15:47:36.934Z"
|
|
2248
2248
|
};
|
|
2249
2249
|
|
|
2250
2250
|
// src/editor/core/sketch/sketchStyles.ts
|
|
2251
2251
|
var SHIPPED_FILES = { pencil: pencil_default, marker: marker_default, whiteboard: whiteboard_default, hatched: hatched_default, dashed: dashed_default, napkin: napkin_default, dry: dry_default };
|
|
2252
|
-
var
|
|
2252
|
+
var SHIPPED_SKETCH_SETTINGS = Object.fromEntries(
|
|
2253
2253
|
Object.entries(SHIPPED_FILES).map(([id, file]) => [id, file.settings])
|
|
2254
2254
|
);
|
|
2255
2255
|
var DEFAULT_SKETCH_STYLE = "marker";
|
|
2256
|
-
function
|
|
2257
|
-
const base =
|
|
2256
|
+
function hydrateSketchSettings(raw) {
|
|
2257
|
+
const base = SHIPPED_SKETCH_SETTINGS[DEFAULT_SKETCH_STYLE];
|
|
2258
2258
|
const stored = raw ?? {};
|
|
2259
2259
|
const out = { ...base };
|
|
2260
2260
|
for (const key of Object.keys(base)) {
|
|
@@ -2418,10 +2418,10 @@ function normalizeTheme(raw, resolvers) {
|
|
|
2418
2418
|
}
|
|
2419
2419
|
const componentConfigs = {};
|
|
2420
2420
|
for (const [comp, value] of Object.entries(asObject(src.componentConfigs) ?? {})) {
|
|
2421
|
-
const
|
|
2421
|
+
const embedded2 = asObject(value);
|
|
2422
2422
|
let resolvedConfig;
|
|
2423
|
-
if (
|
|
2424
|
-
resolvedConfig = stripFileMarker(
|
|
2423
|
+
if (embedded2) {
|
|
2424
|
+
resolvedConfig = stripFileMarker(embedded2);
|
|
2425
2425
|
} else {
|
|
2426
2426
|
const configName = asString(value, "default");
|
|
2427
2427
|
const resolved = asObject(resolvers.readComponentConfig(comp, configName));
|
|
@@ -2456,8 +2456,8 @@ function normalizeTheme(raw, resolvers) {
|
|
|
2456
2456
|
if (!(key in baseAliases)) filled.orphans++;
|
|
2457
2457
|
}
|
|
2458
2458
|
}
|
|
2459
|
-
const
|
|
2460
|
-
const
|
|
2459
|
+
const embedded = asObject(src.sketchSettings) ?? asObject(src.sketchStyle);
|
|
2460
|
+
const sketchSettings = embedded ? hydrateSketchSettings(embedded) : void 0;
|
|
2461
2461
|
return {
|
|
2462
2462
|
theme: {
|
|
2463
2463
|
name: asString(src.name, "Untitled"),
|
|
@@ -2467,7 +2467,7 @@ function normalizeTheme(raw, resolvers) {
|
|
|
2467
2467
|
colorsAndType,
|
|
2468
2468
|
componentConfigs,
|
|
2469
2469
|
componentSchemaVersion: CURRENT_COMPONENT_SCHEMA_VERSION,
|
|
2470
|
-
...
|
|
2470
|
+
...sketchSettings ? { sketchSettings } : {}
|
|
2471
2471
|
},
|
|
2472
2472
|
dropped,
|
|
2473
2473
|
migrated,
|
|
@@ -2571,7 +2571,7 @@ function detectLegacyLayout(input) {
|
|
|
2571
2571
|
const manifestsDir = input.configuredManifestsDir ?? import_path3.default.join(input.dataDir, "manifests");
|
|
2572
2572
|
const themesHoldAThemeFile = holdsATheme(input.themesDir);
|
|
2573
2573
|
if (isDirectory(manifestsDir) && !themesHoldAThemeFile) {
|
|
2574
|
-
return { manifestsDir, evidence: `${manifestsDir} is the pre-0.48 whole-
|
|
2574
|
+
return { manifestsDir, evidence: `${manifestsDir} is the pre-0.48 whole-theme directory` };
|
|
2575
2575
|
}
|
|
2576
2576
|
if (jsonFiles(input.colorsAndTypeDir).length > 0) return null;
|
|
2577
2577
|
for (const file of jsonFiles(input.themesDir)) {
|
|
@@ -3607,7 +3607,7 @@ ${lines.join("\n")}
|
|
|
3607
3607
|
}
|
|
3608
3608
|
function warnOnLegacyLayout(evidence, warn) {
|
|
3609
3609
|
warn(
|
|
3610
|
-
`[live-tokens] This project still uses the data layout from 0.47 and earlier: ${evidence}. Since 0.48 the whole-
|
|
3610
|
+
`[live-tokens] This project still uses the data layout from 0.47 and earlier: ${evidence}. Since 0.48 the whole-theme theme files live in \`themes/\` and the colors and type live in \`colors-and-type/\`. Nothing in the data directory was written, the editor cannot save, and ${import_path4.default.basename(GENERATED_CSS_PATH)} is left exactly as it is. Run \`npx live-tokens migrate\` to move the directories and heal the tree, then restart the dev server.`
|
|
3611
3611
|
);
|
|
3612
3612
|
}
|
|
3613
3613
|
function warnOnUnmigratedSketchStyles(warn) {
|
|
@@ -4364,7 +4364,7 @@ ${lines.join("\n")}
|
|
|
4364
4364
|
filled
|
|
4365
4365
|
});
|
|
4366
4366
|
}
|
|
4367
|
-
async function
|
|
4367
|
+
async function handleAdoptTheme({ res }) {
|
|
4368
4368
|
const activeName = themesResource.getActiveName();
|
|
4369
4369
|
if (activeName === "default") {
|
|
4370
4370
|
jsonResponse(res, 409, {
|
|
@@ -4529,7 +4529,7 @@ ${lines.join("\n")}
|
|
|
4529
4529
|
{ method: "GET", pattern: THEME_BY_NAME_REGEX, handler: handleThemeByName },
|
|
4530
4530
|
{ method: "PUT", pattern: THEME_BY_NAME_REGEX, handler: handleThemeByName },
|
|
4531
4531
|
{ method: "DELETE", pattern: THEME_BY_NAME_REGEX, handler: handleThemeByName },
|
|
4532
|
-
// Production — the whole-
|
|
4532
|
+
// Production — the whole-theme adopt door
|
|
4533
4533
|
{ method: "GET", pattern: SKETCH_STYLES_ROUTE, handler: handleListSketchStyles },
|
|
4534
4534
|
{ method: "PUT", pattern: SKETCH_STYLES_ROUTE, handler: methodNotAllowed },
|
|
4535
4535
|
{ method: "POST", pattern: SKETCH_STYLES_ROUTE, handler: methodNotAllowed },
|
|
@@ -4538,7 +4538,7 @@ ${lines.join("\n")}
|
|
|
4538
4538
|
{ method: "PUT", pattern: SKETCH_STYLE_BY_NAME_REGEX, handler: handleSketchStyleByName },
|
|
4539
4539
|
{ method: "DELETE", pattern: SKETCH_STYLE_BY_NAME_REGEX, handler: handleSketchStyleByName },
|
|
4540
4540
|
{ method: "POST", pattern: SKETCH_STYLE_BY_NAME_REGEX, handler: methodNotAllowed },
|
|
4541
|
-
{ method: "PUT", pattern: PRODUCTION_ROUTE, handler:
|
|
4541
|
+
{ method: "PUT", pattern: PRODUCTION_ROUTE, handler: handleAdoptTheme },
|
|
4542
4542
|
{ method: "GET", pattern: PRODUCTION_ROUTE, handler: methodNotAllowed },
|
|
4543
4543
|
{ method: "POST", pattern: PRODUCTION_ROUTE, handler: methodNotAllowed },
|
|
4544
4544
|
{ method: "DELETE", pattern: PRODUCTION_ROUTE, handler: methodNotAllowed }
|