@motion-proto/live-tokens 0.67.1 → 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.
Files changed (63) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/bin/generate-theme.mjs +5 -4
  3. package/dist-plugin/adjust/index.d.cts +1 -1
  4. package/dist-plugin/adjust/index.d.ts +1 -1
  5. package/dist-plugin/{chunk-J2JT4UEA.js → chunk-2UX6EVVA.js} +25 -25
  6. package/dist-plugin/{dataPaths-DZUzVv8H.d.cts → dataPaths-bJTCEO4H.d.cts} +1 -1
  7. package/dist-plugin/{dataPaths-DZUzVv8H.d.ts → dataPaths-bJTCEO4H.d.ts} +1 -1
  8. package/dist-plugin/fontPairing/index.d.cts +1 -1
  9. package/dist-plugin/fontPairing/index.d.ts +1 -1
  10. package/dist-plugin/generateColorsAndType/index.d.cts +1 -1
  11. package/dist-plugin/generateColorsAndType/index.d.ts +1 -1
  12. package/dist-plugin/index.cjs +27 -27
  13. package/dist-plugin/index.d.cts +1 -1
  14. package/dist-plugin/index.d.ts +1 -1
  15. package/dist-plugin/index.js +5 -5
  16. package/dist-plugin/migrateData/index.cjs +25 -25
  17. package/dist-plugin/migrateData/index.d.cts +1 -1
  18. package/dist-plugin/migrateData/index.d.ts +1 -1
  19. package/dist-plugin/migrateData/index.js +1 -1
  20. package/dist-plugin/tokensCssMigrations/index.d.cts +1 -1
  21. package/dist-plugin/tokensCssMigrations/index.d.ts +1 -1
  22. package/package.json +4 -4
  23. package/src/editor/bootstrap.ts +6 -6
  24. package/src/editor/component-editor/ImageLightboxEditor.svelte +1 -1
  25. package/src/editor/component-editor/scaffolding/ComponentFileManager.svelte +4 -4
  26. package/src/editor/core/fonts/fontLoader.ts +2 -2
  27. package/src/editor/core/preview/{lookPreview.ts → themePreview.ts} +27 -27
  28. package/src/editor/core/productionPulse.ts +3 -3
  29. package/src/editor/core/sketch/index.ts +52 -44
  30. package/src/editor/core/sketch/maskField.ts +9 -9
  31. package/src/editor/core/sketch/sketchLayer.ts +9 -9
  32. package/src/editor/core/sketch/sketchRegistry.ts +34 -34
  33. package/src/editor/core/sketch/sketchStore.ts +98 -83
  34. package/src/editor/core/sketch/sketchStyleService.ts +4 -4
  35. package/src/editor/core/sketch/sketchStyles.ts +28 -28
  36. package/src/editor/core/themes/colorsAndTypeService.ts +1 -1
  37. package/src/editor/core/themes/loadRows.ts +8 -8
  38. package/src/editor/core/themes/themeDocumentSync.ts +2 -2
  39. package/src/editor/core/themes/themeInit.ts +2 -2
  40. package/src/editor/core/themes/themeService.ts +17 -17
  41. package/src/editor/core/themes/{lookSummary.ts → themeSummary.ts} +9 -9
  42. package/src/editor/core/themes/themeTypes.ts +10 -6
  43. package/src/editor/docs/content/getting-started.md +1 -1
  44. package/src/editor/docs/content/sketch-mode.md +22 -17
  45. package/src/editor/docs/content/themes-workflow.md +11 -11
  46. package/src/editor/docs/content/where-themes-live.md +6 -6
  47. package/src/editor/docs/content.generated.ts +4 -4
  48. package/src/editor/index.ts +2 -2
  49. package/src/editor/ui/ThemePanel.svelte +52 -52
  50. package/src/editor/ui/sketch/SketchPreview.svelte +2 -2
  51. package/src/editor/ui/sketch/SketchTab.svelte +64 -38
  52. package/src/live-tokens/data/sketch-styles/dry.json +5 -5
  53. package/src/live-tokens/data/sketch-styles/hatched.json +9 -9
  54. package/src/live-tokens/data/themes/autumn.json +1 -1
  55. package/src/live-tokens/data/themes/halloween.json +1 -1
  56. package/src/live-tokens/data/themes/midnight-study.json +1 -1
  57. package/src/live-tokens/data/themes/ocean.json +1 -1
  58. package/src/live-tokens/data/themes/royal-velvet.json +1 -1
  59. package/src/live-tokens/data/themes/sketchy.json +1 -1
  60. package/src/live-tokens/data/themes/spring-meadow.json +1 -1
  61. package/src/live-tokens/data/themes/sunset.json +1 -1
  62. package/src/system/backdrop/backdrop.ts +1 -1
  63. package/src/system/components/SectionDivider.svelte +1 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,37 @@
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
+
3
35
  ## 0.67.1 — The Napkin you tuned is the Napkin that ships
4
36
 
5
37
  ### 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 look by value.
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: vite-plugin/themes/normalizeTheme.ts. This copy cannot
25
- // import TS, so `check:preset-themes` (Wave 5) is what catches a drift.
26
- const THEME_SCHEMA_VERSION = 4;
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-DZUzVv8H.cjs';
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-DZUzVv8H.js';
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 = 4;
138
+ var THEME_SCHEMA_VERSION = 5;
139
139
 
140
140
  // src/editor/core/themes/migrateComponentConfig.ts
141
141
  function migrateComponentConfig(component, aliasesIn, rawConfig, fileVersion) {
@@ -438,15 +438,15 @@ var hatched_default = {
438
438
  pressureMod: 0.45,
439
439
  pooling: 0.8,
440
440
  strokeInk: 1,
441
- maskOn: false,
442
- maskBlobX: 100,
443
- maskBlobY: 100,
444
- maskBlobLinked: true,
445
- maskAngle: 0,
446
- maskOutputMin: 0.45,
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: "fractal",
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-28T15:47:36.934Z",
463
+ updatedAt: "2026-08-28T21:17:18.232Z",
464
464
  createdAt: "2026-08-28T15:47:36.934Z"
465
465
  };
466
466
 
@@ -586,11 +586,11 @@ var dry_default = {
586
586
  pooling: 1.5,
587
587
  strokeInk: 0.4,
588
588
  maskOn: true,
589
- maskBlobX: 150,
590
- maskBlobY: 150,
589
+ maskBlobX: 170,
590
+ maskBlobY: 170,
591
591
  maskBlobLinked: true,
592
592
  maskAngle: 0,
593
- maskOutputMin: 0.24,
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-28T15:47:36.934Z",
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 SKETCH_STYLES = Object.fromEntries(
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 hydrateSketchStyle(raw) {
621
- const base = SKETCH_STYLES[DEFAULT_SKETCH_STYLE];
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 embedded = asObject(value);
785
+ const embedded2 = asObject(value);
786
786
  let resolvedConfig;
787
- if (embedded) {
788
- resolvedConfig = stripFileMarker(embedded);
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 embeddedSketchStyle = asObject(src.sketchStyle);
824
- const sketchStyle = embeddedSketchStyle ? hydrateSketchStyle(embeddedSketchStyle) : void 0;
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
- ...sketchStyle ? { sketchStyle } : {}
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-look directory` };
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 looks, which now belong in ${input.themesDir}. Move it there by hand, drop the "manifestsDir" key, then run the migration again.`
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-look directory to ${input.themesDir} by hand, then run the migration again.`
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-look directory the
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-look directory the
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-DZUzVv8H.cjs';
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-DZUzVv8H.js';
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-DZUzVv8H.cjs';
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-DZUzVv8H.js';
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
  /**
@@ -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 = 4;
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([
@@ -2074,15 +2074,15 @@ var hatched_default = {
2074
2074
  pressureMod: 0.45,
2075
2075
  pooling: 0.8,
2076
2076
  strokeInk: 1,
2077
- maskOn: false,
2078
- maskBlobX: 100,
2079
- maskBlobY: 100,
2080
- maskBlobLinked: true,
2081
- maskAngle: 0,
2082
- maskOutputMin: 0.45,
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: "fractal",
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-28T15:47:36.934Z",
2099
+ updatedAt: "2026-08-28T21:17:18.232Z",
2100
2100
  createdAt: "2026-08-28T15:47:36.934Z"
2101
2101
  };
2102
2102
 
@@ -2222,11 +2222,11 @@ var dry_default = {
2222
2222
  pooling: 1.5,
2223
2223
  strokeInk: 0.4,
2224
2224
  maskOn: true,
2225
- maskBlobX: 150,
2226
- maskBlobY: 150,
2225
+ maskBlobX: 170,
2226
+ maskBlobY: 170,
2227
2227
  maskBlobLinked: true,
2228
2228
  maskAngle: 0,
2229
- maskOutputMin: 0.24,
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-28T15:47:36.934Z",
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 SKETCH_STYLES = Object.fromEntries(
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 hydrateSketchStyle(raw) {
2257
- const base = SKETCH_STYLES[DEFAULT_SKETCH_STYLE];
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 embedded = asObject(value);
2421
+ const embedded2 = asObject(value);
2422
2422
  let resolvedConfig;
2423
- if (embedded) {
2424
- resolvedConfig = stripFileMarker(embedded);
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 embeddedSketchStyle = asObject(src.sketchStyle);
2460
- const sketchStyle = embeddedSketchStyle ? hydrateSketchStyle(embeddedSketchStyle) : void 0;
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
- ...sketchStyle ? { sketchStyle } : {}
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-look directory` };
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-look 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.`
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 handleAdoptLook({ res }) {
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-look adopt door
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: handleAdoptLook },
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 }
@@ -1,6 +1,6 @@
1
1
  import { Plugin } from 'vite';
2
2
  export { ComponentSource, MissingToken, RunResult, TOKENS_CSS_MIGRATIONS, TokensCssMigration, ValidateInput, runTokensCssMigrations, validateTokensCss } from './tokensCssMigrations/index.cjs';
3
- import './dataPaths-DZUzVv8H.cjs';
3
+ import './dataPaths-bJTCEO4H.cjs';
4
4
 
5
5
  interface ThemeFileApiOptions {
6
6
  tokensCssPath: string;
@@ -1,6 +1,6 @@
1
1
  import { Plugin } from 'vite';
2
2
  export { ComponentSource, MissingToken, RunResult, TOKENS_CSS_MIGRATIONS, TokensCssMigration, ValidateInput, runTokensCssMigrations, validateTokensCss } from './tokensCssMigrations/index.js';
3
- import './dataPaths-DZUzVv8H.js';
3
+ import './dataPaths-bJTCEO4H.js';
4
4
 
5
5
  interface ThemeFileApiOptions {
6
6
  tokensCssPath: string;
@@ -13,7 +13,7 @@ import {
13
13
  nextAvailableName,
14
14
  normalizeTheme,
15
15
  versionedFileResourceServer
16
- } from "./chunk-J2JT4UEA.js";
16
+ } from "./chunk-2UX6EVVA.js";
17
17
  import {
18
18
  CURRENT_COMPONENT_SCHEMA_VERSION
19
19
  } from "./chunk-NE6N66EE.js";
@@ -620,7 +620,7 @@ ${lines.join("\n")}
620
620
  }
621
621
  function warnOnLegacyLayout(evidence, warn) {
622
622
  warn(
623
- `[live-tokens] This project still uses the data layout from 0.47 and earlier: ${evidence}. Since 0.48 the whole-look 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 ${path.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.`
623
+ `[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 ${path.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.`
624
624
  );
625
625
  }
626
626
  function warnOnUnmigratedSketchStyles(warn) {
@@ -1377,7 +1377,7 @@ ${lines.join("\n")}
1377
1377
  filled
1378
1378
  });
1379
1379
  }
1380
- async function handleAdoptLook({ res }) {
1380
+ async function handleAdoptTheme({ res }) {
1381
1381
  const activeName = themesResource.getActiveName();
1382
1382
  if (activeName === "default") {
1383
1383
  jsonResponse(res, 409, {
@@ -1542,7 +1542,7 @@ ${lines.join("\n")}
1542
1542
  { method: "GET", pattern: THEME_BY_NAME_REGEX, handler: handleThemeByName },
1543
1543
  { method: "PUT", pattern: THEME_BY_NAME_REGEX, handler: handleThemeByName },
1544
1544
  { method: "DELETE", pattern: THEME_BY_NAME_REGEX, handler: handleThemeByName },
1545
- // Production — the whole-look adopt door
1545
+ // Production — the whole-theme adopt door
1546
1546
  { method: "GET", pattern: SKETCH_STYLES_ROUTE, handler: handleListSketchStyles },
1547
1547
  { method: "PUT", pattern: SKETCH_STYLES_ROUTE, handler: methodNotAllowed },
1548
1548
  { method: "POST", pattern: SKETCH_STYLES_ROUTE, handler: methodNotAllowed },
@@ -1551,7 +1551,7 @@ ${lines.join("\n")}
1551
1551
  { method: "PUT", pattern: SKETCH_STYLE_BY_NAME_REGEX, handler: handleSketchStyleByName },
1552
1552
  { method: "DELETE", pattern: SKETCH_STYLE_BY_NAME_REGEX, handler: handleSketchStyleByName },
1553
1553
  { method: "POST", pattern: SKETCH_STYLE_BY_NAME_REGEX, handler: methodNotAllowed },
1554
- { method: "PUT", pattern: PRODUCTION_ROUTE, handler: handleAdoptLook },
1554
+ { method: "PUT", pattern: PRODUCTION_ROUTE, handler: handleAdoptTheme },
1555
1555
  { method: "GET", pattern: PRODUCTION_ROUTE, handler: methodNotAllowed },
1556
1556
  { method: "POST", pattern: PRODUCTION_ROUTE, handler: methodNotAllowed },
1557
1557
  { method: "DELETE", pattern: PRODUCTION_ROUTE, handler: methodNotAllowed }
@@ -1037,7 +1037,7 @@ function synthesizeSectionDividerGradients(stringPart, objectPart) {
1037
1037
  }
1038
1038
 
1039
1039
  // src/editor/core/themes/themeTypes.ts
1040
- var THEME_SCHEMA_VERSION = 4;
1040
+ var THEME_SCHEMA_VERSION = 5;
1041
1041
 
1042
1042
  // src/editor/core/components/componentConfigKeys.ts
1043
1043
  var KNOWN_COMPONENT_CONFIG_KEYS = /* @__PURE__ */ new Set([
@@ -1223,15 +1223,15 @@ var hatched_default = {
1223
1223
  pressureMod: 0.45,
1224
1224
  pooling: 0.8,
1225
1225
  strokeInk: 1,
1226
- maskOn: false,
1227
- maskBlobX: 100,
1228
- maskBlobY: 100,
1229
- maskBlobLinked: true,
1230
- maskAngle: 0,
1231
- maskOutputMin: 0.45,
1226
+ maskOn: true,
1227
+ maskBlobX: 10,
1228
+ maskBlobY: 600,
1229
+ maskBlobLinked: false,
1230
+ maskAngle: 150,
1231
+ maskOutputMin: 0.35,
1232
1232
  maskOutputMax: 1,
1233
1233
  maskOctaves: 2,
1234
- maskGrain: "fractal",
1234
+ maskGrain: "turbulence",
1235
1235
  maskPosterize: 1,
1236
1236
  maskSoftness: 1.5,
1237
1237
  jitterX: 1.5,
@@ -1245,7 +1245,7 @@ var hatched_default = {
1245
1245
  iconMaskOn: false,
1246
1246
  iconMaskScale: 1
1247
1247
  },
1248
- updatedAt: "2026-08-28T15:47:36.934Z",
1248
+ updatedAt: "2026-08-28T21:17:18.232Z",
1249
1249
  createdAt: "2026-08-28T15:47:36.934Z"
1250
1250
  };
1251
1251
 
@@ -1371,11 +1371,11 @@ var dry_default = {
1371
1371
  pooling: 1.5,
1372
1372
  strokeInk: 0.4,
1373
1373
  maskOn: true,
1374
- maskBlobX: 150,
1375
- maskBlobY: 150,
1374
+ maskBlobX: 170,
1375
+ maskBlobY: 170,
1376
1376
  maskBlobLinked: true,
1377
1377
  maskAngle: 0,
1378
- maskOutputMin: 0.24,
1378
+ maskOutputMin: 0.57,
1379
1379
  maskOutputMax: 0.91,
1380
1380
  maskOctaves: 2,
1381
1381
  maskGrain: "fractal",
@@ -1392,18 +1392,18 @@ var dry_default = {
1392
1392
  iconMaskOn: true,
1393
1393
  iconMaskScale: 3.8
1394
1394
  },
1395
- updatedAt: "2026-08-28T15:47:36.934Z",
1395
+ updatedAt: "2026-08-28T21:19:51.383Z",
1396
1396
  createdAt: "2026-08-28T15:47:36.934Z"
1397
1397
  };
1398
1398
 
1399
1399
  // src/editor/core/sketch/sketchStyles.ts
1400
1400
  var SHIPPED_FILES = { pencil: pencil_default, marker: marker_default, whiteboard: whiteboard_default, hatched: hatched_default, dashed: dashed_default, napkin: napkin_default, dry: dry_default };
1401
- var SKETCH_STYLES = Object.fromEntries(
1401
+ var SHIPPED_SKETCH_SETTINGS = Object.fromEntries(
1402
1402
  Object.entries(SHIPPED_FILES).map(([id, file]) => [id, file.settings])
1403
1403
  );
1404
1404
  var DEFAULT_SKETCH_STYLE = "marker";
1405
- function hydrateSketchStyle(raw) {
1406
- const base = SKETCH_STYLES[DEFAULT_SKETCH_STYLE];
1405
+ function hydrateSketchSettings(raw) {
1406
+ const base = SHIPPED_SKETCH_SETTINGS[DEFAULT_SKETCH_STYLE];
1407
1407
  const stored = raw ?? {};
1408
1408
  const out = { ...base };
1409
1409
  for (const key of Object.keys(base)) {
@@ -1567,10 +1567,10 @@ function normalizeTheme(raw, resolvers) {
1567
1567
  }
1568
1568
  const componentConfigs = {};
1569
1569
  for (const [comp, value] of Object.entries(asObject(src.componentConfigs) ?? {})) {
1570
- const embedded = asObject(value);
1570
+ const embedded2 = asObject(value);
1571
1571
  let resolvedConfig;
1572
- if (embedded) {
1573
- resolvedConfig = stripFileMarker(embedded);
1572
+ if (embedded2) {
1573
+ resolvedConfig = stripFileMarker(embedded2);
1574
1574
  } else {
1575
1575
  const configName = asString(value, "default");
1576
1576
  const resolved = asObject(resolvers.readComponentConfig(comp, configName));
@@ -1605,8 +1605,8 @@ function normalizeTheme(raw, resolvers) {
1605
1605
  if (!(key in baseAliases)) filled.orphans++;
1606
1606
  }
1607
1607
  }
1608
- const embeddedSketchStyle = asObject(src.sketchStyle);
1609
- const sketchStyle = embeddedSketchStyle ? hydrateSketchStyle(embeddedSketchStyle) : void 0;
1608
+ const embedded = asObject(src.sketchSettings) ?? asObject(src.sketchStyle);
1609
+ const sketchSettings = embedded ? hydrateSketchSettings(embedded) : void 0;
1610
1610
  return {
1611
1611
  theme: {
1612
1612
  name: asString(src.name, "Untitled"),
@@ -1616,7 +1616,7 @@ function normalizeTheme(raw, resolvers) {
1616
1616
  colorsAndType,
1617
1617
  componentConfigs,
1618
1618
  componentSchemaVersion: CURRENT_COMPONENT_SCHEMA_VERSION,
1619
- ...sketchStyle ? { sketchStyle } : {}
1619
+ ...sketchSettings ? { sketchSettings } : {}
1620
1620
  },
1621
1621
  dropped,
1622
1622
  migrated,
@@ -1671,7 +1671,7 @@ function detectLegacyLayout(input) {
1671
1671
  const manifestsDir = input.configuredManifestsDir ?? import_path2.default.join(input.dataDir, "manifests");
1672
1672
  const themesHoldAThemeFile = holdsATheme(input.themesDir);
1673
1673
  if (isDirectory(manifestsDir) && !themesHoldAThemeFile) {
1674
- return { manifestsDir, evidence: `${manifestsDir} is the pre-0.48 whole-look directory` };
1674
+ return { manifestsDir, evidence: `${manifestsDir} is the pre-0.48 whole-theme directory` };
1675
1675
  }
1676
1676
  if (jsonFiles(input.colorsAndTypeDir).length > 0) return null;
1677
1677
  for (const file of jsonFiles(input.themesDir)) {
@@ -1694,12 +1694,12 @@ function planLegacyRenames(layout, input) {
1694
1694
  const defaultThemes = import_path2.default.join(input.dataDir, "themes");
1695
1695
  if (input.configuredManifestsDir && import_path2.default.resolve(input.configuredManifestsDir) !== import_path2.default.join(input.dataDir, "manifests")) {
1696
1696
  throw new Error(
1697
- `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 looks, which now belong in ${input.themesDir}. Move it there by hand, drop the "manifestsDir" key, then run the migration again.`
1697
+ `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.`
1698
1698
  );
1699
1699
  }
1700
1700
  if (import_path2.default.resolve(input.colorsAndTypeDir) !== import_path2.default.resolve(defaultColorsAndType) || import_path2.default.resolve(input.themesDir) !== import_path2.default.resolve(defaultThemes)) {
1701
1701
  throw new Error(
1702
- `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-look directory to ${input.themesDir} by hand, then run the migration again.`
1702
+ `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.`
1703
1703
  );
1704
1704
  }
1705
1705
  const renames = [];
@@ -1,4 +1,4 @@
1
- export { r as readLiveTokensConfig, a as resolveDataDirs } from '../dataPaths-DZUzVv8H.cjs';
1
+ export { r as readLiveTokensConfig, a as resolveDataDirs } from '../dataPaths-bJTCEO4H.cjs';
2
2
 
3
3
  interface LegacyRename {
4
4
  from: string;
@@ -1,4 +1,4 @@
1
- export { r as readLiveTokensConfig, a as resolveDataDirs } from '../dataPaths-DZUzVv8H.js';
1
+ export { r as readLiveTokensConfig, a as resolveDataDirs } from '../dataPaths-bJTCEO4H.js';
2
2
 
3
3
  interface LegacyRename {
4
4
  from: string;
@@ -7,7 +7,7 @@ import {
7
7
  normalizeTheme,
8
8
  planLegacyRenames,
9
9
  versionedFileResourceServer
10
- } from "../chunk-J2JT4UEA.js";
10
+ } from "../chunk-2UX6EVVA.js";
11
11
  import {
12
12
  CURRENT_COMPONENT_SCHEMA_VERSION
13
13
  } from "../chunk-NE6N66EE.js";