@udixio/theme 2.1.18 → 2.1.19

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 (35) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/bin.cjs +1 -1
  3. package/dist/bin.js +1 -1
  4. package/dist/browser.cjs +10 -7
  5. package/dist/browser.js +12 -9
  6. package/dist/index.d.ts +1 -0
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/{load-from-path-CqNK9dVK.cjs → load-from-path-CuBpH2Cs.cjs} +2 -2
  9. package/dist/{load-from-path-CWtVz4o_.js → load-from-path-CvD4a_os.js} +1 -1
  10. package/dist/{loader-Bwk-gC1Q.cjs → loader-BN_VoxCd.cjs} +64 -4
  11. package/dist/{loader-CXjYZgR0.js → loader-J0nrh600.js} +71 -11
  12. package/dist/material-color-utilities/index.d.ts +1 -0
  13. package/dist/material-color-utilities/index.d.ts.map +1 -1
  14. package/dist/node.cjs +11 -8
  15. package/dist/node.js +14 -11
  16. package/dist/palette/palette.api.d.ts +6 -0
  17. package/dist/palette/palette.api.d.ts.map +1 -1
  18. package/dist/palette/palette.d.ts +1 -0
  19. package/dist/palette/palette.d.ts.map +1 -1
  20. package/dist/palette/palette.manager.d.ts +2 -0
  21. package/dist/palette/palette.manager.d.ts.map +1 -1
  22. package/dist/{font.plugin-CZBx3UOh.js → serialize-BlsUXsgT.js} +13 -2
  23. package/dist/{font.plugin-Dyfi_9m6.cjs → serialize-NWi8E_Ms.cjs} +12 -1
  24. package/dist/serialize.d.ts +17 -0
  25. package/dist/serialize.d.ts.map +1 -0
  26. package/dist/variant/variants/index.d.ts +1 -0
  27. package/dist/variant/variants/index.d.ts.map +1 -1
  28. package/package.json +1 -1
  29. package/src/index.ts +1 -0
  30. package/src/material-color-utilities/index.ts +1 -0
  31. package/src/palette/palette.api.ts +28 -0
  32. package/src/palette/palette.manager.ts +28 -4
  33. package/src/palette/palette.ts +9 -0
  34. package/src/serialize.ts +20 -0
  35. package/src/variant/variants/index.ts +8 -0
package/CHANGELOG.md CHANGED
@@ -1,3 +1,15 @@
1
+ ## 2.1.19 (2026-04-09)
2
+
3
+ ### 🚀 Features
4
+
5
+ - **theme:** add worker-based CSS generation and theme serialization ([14af45b](https://github.com/Udixio/UI/commit/14af45b))
6
+ - **theme:** export `htc` from material-color-utilities ([f100207](https://github.com/Udixio/UI/commit/f100207))
7
+ - **theme:** enhance palette management with callbacks, overrides, and synchronization ([d404896](https://github.com/Udixio/UI/commit/d404896))
8
+
9
+ ### ❤️ Thank You
10
+
11
+ - Joël VIGREUX
12
+
1
13
  ## 2.1.18 (2026-03-22)
2
14
 
3
15
  ### 🚀 Features
package/dist/bin.cjs CHANGED
@@ -2,7 +2,7 @@
2
2
  const commander = require("commander");
3
3
  const chokidar = require("chokidar");
4
4
  const chalk = require("chalk");
5
- const loadFromPath = require("./load-from-path-CqNK9dVK.cjs");
5
+ const loadFromPath = require("./load-from-path-CuBpH2Cs.cjs");
6
6
  const program = new commander.Command();
7
7
  async function runOnce(configPath) {
8
8
  try {
package/dist/bin.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { Command } from "commander";
2
2
  import chokidar from "chokidar";
3
3
  import chalk from "chalk";
4
- import { l as loadFromPath } from "./load-from-path-CWtVz4o_.js";
4
+ import { l as loadFromPath } from "./load-from-path-CvD4a_os.js";
5
5
  const program = new Command();
6
6
  async function runOnce(configPath) {
7
7
  try {
package/dist/browser.cjs CHANGED
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const loader = require("./loader-Bwk-gC1Q.cjs");
4
- const font_plugin = require("./font.plugin-Dyfi_9m6.cjs");
3
+ const loader = require("./loader-BN_VoxCd.cjs");
4
+ const serialize = require("./serialize-NWi8E_Ms.cjs");
5
5
  exports.API = loader.API;
6
6
  exports.AppContainer = loader.AppContainer;
7
7
  exports.AppModule = loader.AppModule;
@@ -16,6 +16,7 @@ exports.Context = loader.Context;
16
16
  exports.ContextModule = loader.ContextModule;
17
17
  exports.ContrastCurve = loader.ContrastCurve;
18
18
  exports.DynamicColor = loader.DynamicColor;
19
+ exports.Hct = loader.Hct;
19
20
  exports.Palette = loader.Palette;
20
21
  exports.PaletteApi = loader.PaletteApi;
21
22
  exports.PaletteModule = loader.PaletteModule;
@@ -30,6 +31,7 @@ exports.expressiveVariant = loader.expressiveVariant;
30
31
  exports.getInitialToneFromBackground = loader.getInitialToneFromBackground;
31
32
  exports.getPiecewiseHue = loader.getPiecewiseHue;
32
33
  exports.getRotatedHue = loader.getRotatedHue;
34
+ exports.getVariantByName = loader.getVariantByName;
33
35
  exports.highestSurface = loader.highestSurface;
34
36
  exports.loader = loader.loader;
35
37
  exports.neutralVariant = loader.neutralVariant;
@@ -37,8 +39,9 @@ exports.tonalSpotVariant = loader.tonalSpotVariant;
37
39
  exports.toneDeltaPair = loader.toneDeltaPair;
38
40
  exports.variant = loader.variant;
39
41
  exports.vibrantVariant = loader.vibrantVariant;
40
- exports.FontFamily = font_plugin.FontFamily;
41
- exports.FontPlugin = font_plugin.FontPlugin;
42
- exports.PluginAbstract = font_plugin.PluginAbstract;
43
- exports.PluginImplAbstract = font_plugin.PluginImplAbstract;
44
- exports.defineConfig = font_plugin.defineConfig;
42
+ exports.FontFamily = serialize.FontFamily;
43
+ exports.FontPlugin = serialize.FontPlugin;
44
+ exports.PluginAbstract = serialize.PluginAbstract;
45
+ exports.PluginImplAbstract = serialize.PluginImplAbstract;
46
+ exports.defineConfig = serialize.defineConfig;
47
+ exports.serializeThemeContext = serialize.serializeThemeContext;
package/dist/browser.js CHANGED
@@ -1,5 +1,5 @@
1
- import { A, a, b, C, c, d, e, f, g, h, i, j, k, D, P, l, m, n, o, V, p, q, r, s, t, u, v, w, x, y, z, B, E, F, G } from "./loader-CXjYZgR0.js";
2
- import { F as F2, a as a2, P as P2, b as b2, d as d2 } from "./font.plugin-CZBx3UOh.js";
1
+ import { A, a, b, C, c, d, e, f, g, h, i, j, k, D, H, P, l, m, n, o, V, p, q, r, s, t, u, v, w, x, y, z, B, E, F, G, I } from "./loader-J0nrh600.js";
2
+ import { F as F2, a as a2, P as P2, b as b2, d as d2, s as s2 } from "./serialize-BlsUXsgT.js";
3
3
  export {
4
4
  A as API,
5
5
  a as AppContainer,
@@ -17,6 +17,7 @@ export {
17
17
  D as DynamicColor,
18
18
  F2 as FontFamily,
19
19
  a2 as FontPlugin,
20
+ H as Hct,
20
21
  P as Palette,
21
22
  l as PaletteApi,
22
23
  m as PaletteModule,
@@ -34,11 +35,13 @@ export {
34
35
  u as getInitialToneFromBackground,
35
36
  v as getPiecewiseHue,
36
37
  w as getRotatedHue,
37
- x as highestSurface,
38
- y as loader,
39
- z as neutralVariant,
40
- B as tonalSpotVariant,
41
- E as toneDeltaPair,
42
- F as variant,
43
- G as vibrantVariant
38
+ x as getVariantByName,
39
+ y as highestSurface,
40
+ z as loader,
41
+ B as neutralVariant,
42
+ s2 as serializeThemeContext,
43
+ E as tonalSpotVariant,
44
+ F as toneDeltaPair,
45
+ G as variant,
46
+ I as vibrantVariant
44
47
  };
package/dist/index.d.ts CHANGED
@@ -11,4 +11,5 @@ export * from './palette';
11
11
  export * from './plugin';
12
12
  export * from './plugins';
13
13
  export * from './variant';
14
+ export * from './serialize';
14
15
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,OAAO,CAAC;AACtB,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,4BAA4B,CAAC;AAC3C,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,OAAO,CAAC;AACtB,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,4BAA4B,CAAC;AAC3C,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC"}
@@ -21,7 +21,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
21
21
  isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
22
22
  mod
23
23
  ));
24
- const loader = require("./loader-Bwk-gC1Q.cjs");
24
+ const loader = require("./loader-BN_VoxCd.cjs");
25
25
  const fs = require("node:fs");
26
26
  var _documentCurrentScript = typeof document !== "undefined" ? document.currentScript : null;
27
27
  function _interopNamespaceDefault(e) {
@@ -44,7 +44,7 @@ const fs__namespace = /* @__PURE__ */ _interopNamespaceDefault(fs);
44
44
  async function resolveConfig(configPath = "./theme.config") {
45
45
  const { createJiti } = await import("jiti");
46
46
  const { resolve } = await import("pathe");
47
- const jiti = createJiti(typeof document === "undefined" ? require("url").pathToFileURL(__filename).href : _documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === "SCRIPT" && _documentCurrentScript.src || new URL("load-from-path-CqNK9dVK.cjs", document.baseURI).href, {
47
+ const jiti = createJiti(typeof document === "undefined" ? require("url").pathToFileURL(__filename).href : _documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === "SCRIPT" && _documentCurrentScript.src || new URL("load-from-path-CuBpH2Cs.cjs", document.baseURI).href, {
48
48
  debug: process.env.NODE_ENV === "development",
49
49
  fsCache: true,
50
50
  interopDefault: true
@@ -1,4 +1,4 @@
1
- import { y as loader } from "./loader-CXjYZgR0.js";
1
+ import { z as loader } from "./loader-J0nrh600.js";
2
2
  import * as fs from "node:fs";
3
3
  async function resolveConfig(configPath = "./theme.config") {
4
4
  const { createJiti } = await import("jiti");
@@ -2663,6 +2663,14 @@ class Palette {
2663
2663
  this.chromaCache = result.chroma;
2664
2664
  }
2665
2665
  }
2666
+ setCallback(callback) {
2667
+ this.callback = callback;
2668
+ this.dependencies = null;
2669
+ this.cache.clear();
2670
+ this.hueCache = null;
2671
+ this.chromaCache = null;
2672
+ this.update([]);
2673
+ }
2666
2674
  clearCache() {
2667
2675
  this.cache.clear();
2668
2676
  this.hueCache = null;
@@ -2739,6 +2747,31 @@ class PaletteApi {
2739
2747
  }
2740
2748
  });
2741
2749
  }
2750
+ override(args) {
2751
+ Object.entries(args).forEach(([key, callback]) => {
2752
+ if (typeof callback === "string") {
2753
+ this.paletteManager.override(key, Hct.fromInt(materialColorUtilities.argbFromHex(callback)));
2754
+ } else {
2755
+ this.paletteManager.override(key, callback);
2756
+ }
2757
+ });
2758
+ }
2759
+ getSerializableState() {
2760
+ const result = {};
2761
+ for (const [key, palette] of Object.entries(this.paletteManager._palettes)) {
2762
+ result[key] = { hue: palette.hue, chroma: palette.chroma };
2763
+ }
2764
+ return result;
2765
+ }
2766
+ sync(args) {
2767
+ const incoming = new Set(Object.keys(args ?? {}));
2768
+ Object.keys(this.paletteManager._palettes).forEach((key) => {
2769
+ if (!incoming.has(key)) {
2770
+ this.paletteManager.remove(key);
2771
+ }
2772
+ });
2773
+ if (args) this.override(args);
2774
+ }
2742
2775
  get(key) {
2743
2776
  return this.paletteManager.get(key);
2744
2777
  }
@@ -2794,13 +2827,31 @@ class PaletteManager {
2794
2827
  this._palettes[key] = palette;
2795
2828
  }
2796
2829
  update(key, args) {
2797
- if (!this.palettes["key"]) {
2830
+ const existing = this._palettes[key];
2831
+ if (!existing) {
2798
2832
  throw new Error(`Palette with key ${key} not found`);
2799
2833
  }
2800
- if (!(args instanceof Palette)) {
2801
- args = new Palette(key, args, this.context);
2834
+ if (args instanceof Palette) {
2835
+ this.set(key, args);
2836
+ } else {
2837
+ existing.setCallback(args);
2838
+ }
2839
+ }
2840
+ remove(key) {
2841
+ delete this._palettes[key];
2842
+ }
2843
+ override(key, args) {
2844
+ const callback = args instanceof Hct ? (context) => context.variant.customPalettes(context, args) : args;
2845
+ if (this._palettes[key]) {
2846
+ this.update(key, callback);
2847
+ } else {
2848
+ const palette = new Palette(key, callback, this.context);
2849
+ this.set(key, palette);
2850
+ const isVariantPalette = !!this.context.variant.palettes[key];
2851
+ if (!isVariantPalette) {
2852
+ this.colorApi.addFromCustomPalette(key);
2853
+ }
2802
2854
  }
2803
- this.set(key, args);
2804
2855
  }
2805
2856
  }
2806
2857
  const PaletteModule = {
@@ -3842,6 +3893,13 @@ const Variants = {
3842
3893
  Vibrant: vibrantVariant,
3843
3894
  Udixio: udixioVariant
3844
3895
  };
3896
+ function getVariantByName(name) {
3897
+ const found = Object.values(Variants).find((v) => v.name === name);
3898
+ if (!found) {
3899
+ throw new Error(`Unknown variant: "${name}". Known: ${Object.values(Variants).map((v) => v.name).join(", ")}`);
3900
+ }
3901
+ return found;
3902
+ }
3845
3903
  const loader = async (config, load = true) => {
3846
3904
  const api = bootstrap();
3847
3905
  const init = () => {
@@ -3893,6 +3951,7 @@ exports.Context = Context;
3893
3951
  exports.ContextModule = ContextModule;
3894
3952
  exports.ContrastCurve = ContrastCurve;
3895
3953
  exports.DynamicColor = DynamicColor;
3954
+ exports.Hct = Hct;
3896
3955
  exports.Palette = Palette;
3897
3956
  exports.PaletteApi = PaletteApi;
3898
3957
  exports.PaletteModule = PaletteModule;
@@ -3907,6 +3966,7 @@ exports.expressiveVariant = expressiveVariant;
3907
3966
  exports.getInitialToneFromBackground = getInitialToneFromBackground;
3908
3967
  exports.getPiecewiseHue = getPiecewiseHue;
3909
3968
  exports.getRotatedHue = getRotatedHue;
3969
+ exports.getVariantByName = getVariantByName;
3910
3970
  exports.highestSurface = highestSurface$1;
3911
3971
  exports.loader = loader;
3912
3972
  exports.neutralVariant = neutralVariant;
@@ -2662,6 +2662,14 @@ class Palette {
2662
2662
  this.chromaCache = result.chroma;
2663
2663
  }
2664
2664
  }
2665
+ setCallback(callback) {
2666
+ this.callback = callback;
2667
+ this.dependencies = null;
2668
+ this.cache.clear();
2669
+ this.hueCache = null;
2670
+ this.chromaCache = null;
2671
+ this.update([]);
2672
+ }
2665
2673
  clearCache() {
2666
2674
  this.cache.clear();
2667
2675
  this.hueCache = null;
@@ -2738,6 +2746,31 @@ class PaletteApi {
2738
2746
  }
2739
2747
  });
2740
2748
  }
2749
+ override(args) {
2750
+ Object.entries(args).forEach(([key, callback]) => {
2751
+ if (typeof callback === "string") {
2752
+ this.paletteManager.override(key, Hct.fromInt(argbFromHex(callback)));
2753
+ } else {
2754
+ this.paletteManager.override(key, callback);
2755
+ }
2756
+ });
2757
+ }
2758
+ getSerializableState() {
2759
+ const result = {};
2760
+ for (const [key, palette] of Object.entries(this.paletteManager._palettes)) {
2761
+ result[key] = { hue: palette.hue, chroma: palette.chroma };
2762
+ }
2763
+ return result;
2764
+ }
2765
+ sync(args) {
2766
+ const incoming = new Set(Object.keys(args ?? {}));
2767
+ Object.keys(this.paletteManager._palettes).forEach((key) => {
2768
+ if (!incoming.has(key)) {
2769
+ this.paletteManager.remove(key);
2770
+ }
2771
+ });
2772
+ if (args) this.override(args);
2773
+ }
2741
2774
  get(key) {
2742
2775
  return this.paletteManager.get(key);
2743
2776
  }
@@ -2793,13 +2826,31 @@ class PaletteManager {
2793
2826
  this._palettes[key] = palette;
2794
2827
  }
2795
2828
  update(key, args) {
2796
- if (!this.palettes["key"]) {
2829
+ const existing = this._palettes[key];
2830
+ if (!existing) {
2797
2831
  throw new Error(`Palette with key ${key} not found`);
2798
2832
  }
2799
- if (!(args instanceof Palette)) {
2800
- args = new Palette(key, args, this.context);
2833
+ if (args instanceof Palette) {
2834
+ this.set(key, args);
2835
+ } else {
2836
+ existing.setCallback(args);
2837
+ }
2838
+ }
2839
+ remove(key) {
2840
+ delete this._palettes[key];
2841
+ }
2842
+ override(key, args) {
2843
+ const callback = args instanceof Hct ? (context) => context.variant.customPalettes(context, args) : args;
2844
+ if (this._palettes[key]) {
2845
+ this.update(key, callback);
2846
+ } else {
2847
+ const palette = new Palette(key, callback, this.context);
2848
+ this.set(key, palette);
2849
+ const isVariantPalette = !!this.context.variant.palettes[key];
2850
+ if (!isVariantPalette) {
2851
+ this.colorApi.addFromCustomPalette(key);
2852
+ }
2801
2853
  }
2802
- this.set(key, args);
2803
2854
  }
2804
2855
  }
2805
2856
  const PaletteModule = {
@@ -3841,6 +3892,13 @@ const Variants = {
3841
3892
  Vibrant: vibrantVariant,
3842
3893
  Udixio: udixioVariant
3843
3894
  };
3895
+ function getVariantByName(name) {
3896
+ const found = Object.values(Variants).find((v) => v.name === name);
3897
+ if (!found) {
3898
+ throw new Error(`Unknown variant: "${name}". Known: ${Object.values(Variants).map((v) => v.name).join(", ")}`);
3899
+ }
3900
+ return found;
3901
+ }
3844
3902
  const loader = async (config, load = true) => {
3845
3903
  const api = bootstrap();
3846
3904
  const init = () => {
@@ -3880,12 +3938,14 @@ const loader = async (config, load = true) => {
3880
3938
  };
3881
3939
  export {
3882
3940
  API as A,
3883
- tonalSpotVariant as B,
3941
+ neutralVariant as B,
3884
3942
  Color as C,
3885
3943
  DynamicColor as D,
3886
- toneDeltaPair as E,
3887
- variant as F,
3888
- vibrantVariant as G,
3944
+ tonalSpotVariant as E,
3945
+ toneDeltaPair as F,
3946
+ variant as G,
3947
+ Hct as H,
3948
+ vibrantVariant as I,
3889
3949
  Palette as P,
3890
3950
  Variant as V,
3891
3951
  AppContainer as a,
@@ -3911,7 +3971,7 @@ export {
3911
3971
  getInitialToneFromBackground as u,
3912
3972
  getPiecewiseHue as v,
3913
3973
  getRotatedHue as w,
3914
- highestSurface$1 as x,
3915
- loader as y,
3916
- neutralVariant as z
3974
+ getVariantByName as x,
3975
+ highestSurface$1 as y,
3976
+ loader as z
3917
3977
  };
@@ -1,4 +1,5 @@
1
1
  export * from './contrastCurve';
2
2
  export * from './dynamic_color';
3
3
  export * from './toneDeltaPair';
4
+ export * from './htc';
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/material-color-utilities/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/material-color-utilities/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,OAAO,CAAC"}
package/dist/node.cjs CHANGED
@@ -22,9 +22,9 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
22
22
  mod
23
23
  ));
24
24
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
25
- const loader = require("./loader-Bwk-gC1Q.cjs");
26
- const font_plugin = require("./font.plugin-Dyfi_9m6.cjs");
27
- const loadFromPath = require("./load-from-path-CqNK9dVK.cjs");
25
+ const loader = require("./loader-BN_VoxCd.cjs");
26
+ const serialize = require("./serialize-NWi8E_Ms.cjs");
27
+ const loadFromPath = require("./load-from-path-CuBpH2Cs.cjs");
28
28
  let unpluginInstance = null;
29
29
  const createUnpluginTheme = async () => {
30
30
  if (unpluginInstance) {
@@ -161,6 +161,7 @@ exports.Context = loader.Context;
161
161
  exports.ContextModule = loader.ContextModule;
162
162
  exports.ContrastCurve = loader.ContrastCurve;
163
163
  exports.DynamicColor = loader.DynamicColor;
164
+ exports.Hct = loader.Hct;
164
165
  exports.Palette = loader.Palette;
165
166
  exports.PaletteApi = loader.PaletteApi;
166
167
  exports.PaletteModule = loader.PaletteModule;
@@ -175,6 +176,7 @@ exports.expressiveVariant = loader.expressiveVariant;
175
176
  exports.getInitialToneFromBackground = loader.getInitialToneFromBackground;
176
177
  exports.getPiecewiseHue = loader.getPiecewiseHue;
177
178
  exports.getRotatedHue = loader.getRotatedHue;
179
+ exports.getVariantByName = loader.getVariantByName;
178
180
  exports.highestSurface = loader.highestSurface;
179
181
  exports.loader = loader.loader;
180
182
  exports.neutralVariant = loader.neutralVariant;
@@ -182,11 +184,12 @@ exports.tonalSpotVariant = loader.tonalSpotVariant;
182
184
  exports.toneDeltaPair = loader.toneDeltaPair;
183
185
  exports.variant = loader.variant;
184
186
  exports.vibrantVariant = loader.vibrantVariant;
185
- exports.FontFamily = font_plugin.FontFamily;
186
- exports.FontPlugin = font_plugin.FontPlugin;
187
- exports.PluginAbstract = font_plugin.PluginAbstract;
188
- exports.PluginImplAbstract = font_plugin.PluginImplAbstract;
189
- exports.defineConfig = font_plugin.defineConfig;
187
+ exports.FontFamily = serialize.FontFamily;
188
+ exports.FontPlugin = serialize.FontPlugin;
189
+ exports.PluginAbstract = serialize.PluginAbstract;
190
+ exports.PluginImplAbstract = serialize.PluginImplAbstract;
191
+ exports.defineConfig = serialize.defineConfig;
192
+ exports.serializeThemeContext = serialize.serializeThemeContext;
190
193
  exports.loadFromPath = loadFromPath.loadFromPath;
191
194
  exports.resolveConfig = loadFromPath.resolveConfig;
192
195
  exports.esbuildPlugin = esbuildPlugin;
package/dist/node.js CHANGED
@@ -1,7 +1,7 @@
1
- import { A, a, b, C, c, d, e, f, g, h, i, j, k, D, P, l, m, n, o, V, p, q, r, s, t, u, v, w, x, y, z, B, E, F, G } from "./loader-CXjYZgR0.js";
2
- import { F as F2, a as a2, P as P2, b as b2, d as d2 } from "./font.plugin-CZBx3UOh.js";
3
- import { l as loadFromPath } from "./load-from-path-CWtVz4o_.js";
4
- import { r as r2 } from "./load-from-path-CWtVz4o_.js";
1
+ import { A, a, b, C, c, d, e, f, g, h, i, j, k, D, H, P, l, m, n, o, V, p, q, r, s, t, u, v, w, x, y, z, B, E, F, G, I } from "./loader-J0nrh600.js";
2
+ import { F as F2, a as a2, P as P2, b as b2, d as d2, s as s2 } from "./serialize-BlsUXsgT.js";
3
+ import { l as loadFromPath } from "./load-from-path-CvD4a_os.js";
4
+ import { r as r2 } from "./load-from-path-CvD4a_os.js";
5
5
  let unpluginInstance = null;
6
6
  const createUnpluginTheme = async () => {
7
7
  if (unpluginInstance) {
@@ -141,6 +141,7 @@ export {
141
141
  D as DynamicColor,
142
142
  F2 as FontFamily,
143
143
  a2 as FontPlugin,
144
+ H as Hct,
144
145
  P as Palette,
145
146
  l as PaletteApi,
146
147
  m as PaletteModule,
@@ -159,17 +160,19 @@ export {
159
160
  u as getInitialToneFromBackground,
160
161
  v as getPiecewiseHue,
161
162
  w as getRotatedHue,
162
- x as highestSurface,
163
+ x as getVariantByName,
164
+ y as highestSurface,
163
165
  loadFromPath,
164
- y as loader,
165
- z as neutralVariant,
166
+ z as loader,
167
+ B as neutralVariant,
166
168
  r2 as resolveConfig,
167
169
  rollupPlugin,
168
- B as tonalSpotVariant,
169
- E as toneDeltaPair,
170
+ s2 as serializeThemeContext,
171
+ E as tonalSpotVariant,
172
+ F as toneDeltaPair,
170
173
  unpluginUdixioTheme,
171
- F as variant,
172
- G as vibrantVariant,
174
+ G as variant,
175
+ I as vibrantVariant,
173
176
  vitePlugin,
174
177
  webpackPlugin
175
178
  };
@@ -7,6 +7,12 @@ export declare class PaletteApi {
7
7
  paletteManager: PaletteManager;
8
8
  });
9
9
  add(args: Record<string, PaletteCallback | string>): void;
10
+ override(args: Record<string, PaletteCallback | string>): void;
11
+ getSerializableState(): Record<string, {
12
+ hue: number;
13
+ chroma: number;
14
+ }>;
15
+ sync(args: Record<string, PaletteCallback | string> | undefined): void;
10
16
  get(key: 'primary' | 'secondary' | 'tertiary' | 'neutral' | 'neutralVariant' | 'error' | string): Palette;
11
17
  getAll(): Readonly<Record<string, Palette>>;
12
18
  }
@@ -1 +1 @@
1
- {"version":3,"file":"palette.api.d.ts","sourceRoot":"","sources":["../../src/palette/palette.api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAIrD,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;AAEhE,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;gBACpC,EAAE,cAAc,EAAE,EAAE;QAAE,cAAc,EAAE,cAAc,CAAA;KAAE;IAIlE,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CAAC,GAAG,IAAI;IAazD,GAAG,CACD,GAAG,EACC,SAAS,GACT,WAAW,GACX,UAAU,GACV,SAAS,GACT,gBAAgB,GAChB,OAAO,GACP,MAAM,GACT,OAAO;IAIV,MAAM,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAG5C"}
1
+ {"version":3,"file":"palette.api.d.ts","sourceRoot":"","sources":["../../src/palette/palette.api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAIrD,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;AAEhE,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;gBACpC,EAAE,cAAc,EAAE,EAAE;QAAE,cAAc,EAAE,cAAc,CAAA;KAAE;IAIlE,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CAAC,GAAG,IAAI;IAazD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CAAC,GAAG,IAAI;IAU9D,oBAAoB,IAAI,MAAM,CAAC,MAAM,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAQvE,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CAAC,GAAG,SAAS,GAAG,IAAI;IAUtE,GAAG,CACD,GAAG,EACC,SAAS,GACT,WAAW,GACX,UAAU,GACV,SAAS,GACT,gBAAgB,GAChB,OAAO,GACP,MAAM,GACT,OAAO;IAIV,MAAM,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAG5C"}
@@ -15,6 +15,7 @@ export declare class Palette {
15
15
  constructor(name: string, callback: PaletteCallback, context: Context);
16
16
  static fromVariant(name: string, color: Hct, ctx: Context): Palette;
17
17
  update(change: Partial<keyof Context>[]): void;
18
+ setCallback(callback: PaletteCallback): void;
18
19
  private clearCache;
19
20
  /**
20
21
  * @param tone HCT tone, measured from 0 to 100.
@@ -1 +1 @@
1
- {"version":3,"file":"palette.d.ts","sourceRoot":"","sources":["../../src/palette/palette.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EAAE,GAAG,EAAE,MAAM,iCAAiC,CAAC;AAEtD,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,EAAE,OAAO,KAAK;IAClD,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,qBAAa,OAAO;IAQT,IAAI,EAAE,MAAM;IACZ,QAAQ,EAAE,eAAe;IACzB,OAAO,EAAE,OAAO;IATzB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA6B;IACnD,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,WAAW,CAAuB;IAE1C,OAAO,CAAC,YAAY,CAAkC;gBAG7C,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,eAAe,EACzB,OAAO,EAAE,OAAO;IAKzB,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO;IAOnE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,OAAO,CAAC,EAAE,GAAG,IAAI;IA6B9C,OAAO,CAAC,UAAU;IAMlB;;;OAGG;IACH,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAmB1B;;;OAGG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG;IAIzB,IAAI,GAAG,IAAI,MAAM,CAMhB;IACD,IAAI,MAAM,IAAI,MAAM,CAMnB;IAED,OAAO,CAAC,WAAW;CAkBpB"}
1
+ {"version":3,"file":"palette.d.ts","sourceRoot":"","sources":["../../src/palette/palette.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EAAE,GAAG,EAAE,MAAM,iCAAiC,CAAC;AAEtD,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,EAAE,OAAO,KAAK;IAClD,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,qBAAa,OAAO;IAQT,IAAI,EAAE,MAAM;IACZ,QAAQ,EAAE,eAAe;IACzB,OAAO,EAAE,OAAO;IATzB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA6B;IACnD,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,WAAW,CAAuB;IAE1C,OAAO,CAAC,YAAY,CAAkC;gBAG7C,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,eAAe,EACzB,OAAO,EAAE,OAAO;IAKzB,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO;IAOnE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,OAAO,CAAC,EAAE,GAAG,IAAI;IA6B9C,WAAW,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI;IAS5C,OAAO,CAAC,UAAU;IAMlB;;;OAGG;IACH,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAmB1B;;;OAGG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG;IAIzB,IAAI,GAAG,IAAI,MAAM,CAMhB;IACD,IAAI,MAAM,IAAI,MAAM,CAMnB;IAED,OAAO,CAAC,WAAW;CAkBpB"}
@@ -16,5 +16,7 @@ export declare class PaletteManager {
16
16
  get(key: 'primary' | 'secondary' | 'tertiary' | 'neutral' | 'neutralVariant' | 'error' | string): Palette;
17
17
  private set;
18
18
  update(key: string, args: PaletteCallback | Palette): void;
19
+ remove(key: string): void;
20
+ override(key: string, args: Hct | PaletteCallback): void;
19
21
  }
20
22
  //# sourceMappingURL=palette.manager.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"palette.manager.d.ts","sourceRoot":"","sources":["../../src/palette/palette.manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACrD,OAAO,EAAE,GAAG,EAAE,MAAM,iCAAiC,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEpC,qBAAa,cAAc;IACzB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAM;IACxC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,QAAQ,CAAC;IAEnB,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAKhD;gBAEW,IAAI,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,QAAQ,CAAA;KAAE;IAW1D,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,eAAe,GAAG,IAAI;IAWhE,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,GAAG,IAAI;IAS1D,GAAG,CACD,GAAG,EACC,SAAS,GACT,WAAW,GACX,UAAU,GACV,SAAS,GACT,gBAAgB,GAChB,OAAO,GACP,MAAM,GACT,OAAO;IAQV,OAAO,CAAC,GAAG;IAIX,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,GAAG,OAAO,GAAG,IAAI;CAS3D"}
1
+ {"version":3,"file":"palette.manager.d.ts","sourceRoot":"","sources":["../../src/palette/palette.manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACrD,OAAO,EAAE,GAAG,EAAE,MAAM,iCAAiC,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEpC,qBAAa,cAAc;IACzB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAM;IACxC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,QAAQ,CAAC;IAEnB,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAKhD;gBAEW,IAAI,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,QAAQ,CAAA;KAAE;IAW1D,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,eAAe,GAAG,IAAI;IAWhE,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,GAAG,IAAI;IAS1D,GAAG,CACD,GAAG,EACC,SAAS,GACT,WAAW,GACX,UAAU,GACV,SAAS,GACT,gBAAgB,GAChB,OAAO,GACP,MAAM,GACT,OAAO;IAQV,OAAO,CAAC,GAAG;IAIX,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,GAAG,OAAO,GAAG,IAAI;IAY1D,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAIzB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,eAAe,GAAG,IAAI;CAiBzD"}
@@ -1,7 +1,7 @@
1
1
  var __defProp = Object.defineProperty;
2
2
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
3
  var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
4
- import "./loader-CXjYZgR0.js";
4
+ import "./loader-J0nrh600.js";
5
5
  class PluginAbstract {
6
6
  constructor(options) {
7
7
  __publicField(this, "options");
@@ -219,10 +219,21 @@ class FontPluginImpl extends PluginImplAbstract {
219
219
  });
220
220
  }
221
221
  }
222
+ function serializeThemeContext(api) {
223
+ const sc = api.context.sourceColor;
224
+ return {
225
+ isDark: api.context.isDark,
226
+ contrastLevel: api.context.contrastLevel,
227
+ sourceColor: { hue: sc.hue, chroma: sc.chroma, tone: sc.tone },
228
+ variantName: api.context.variant.name,
229
+ palettes: api.palettes.getSerializableState()
230
+ };
231
+ }
222
232
  export {
223
233
  FontFamily as F,
224
234
  PluginAbstract as P,
225
235
  FontPlugin as a,
226
236
  PluginImplAbstract as b,
227
- defineConfig as d
237
+ defineConfig as d,
238
+ serializeThemeContext as s
228
239
  };
@@ -2,7 +2,7 @@
2
2
  var __defProp = Object.defineProperty;
3
3
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
4
4
  var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
5
- require("./loader-Bwk-gC1Q.cjs");
5
+ require("./loader-BN_VoxCd.cjs");
6
6
  class PluginAbstract {
7
7
  constructor(options) {
8
8
  __publicField(this, "options");
@@ -220,8 +220,19 @@ class FontPluginImpl extends PluginImplAbstract {
220
220
  });
221
221
  }
222
222
  }
223
+ function serializeThemeContext(api) {
224
+ const sc = api.context.sourceColor;
225
+ return {
226
+ isDark: api.context.isDark,
227
+ contrastLevel: api.context.contrastLevel,
228
+ sourceColor: { hue: sc.hue, chroma: sc.chroma, tone: sc.tone },
229
+ variantName: api.context.variant.name,
230
+ palettes: api.palettes.getSerializableState()
231
+ };
232
+ }
223
233
  exports.FontFamily = FontFamily;
224
234
  exports.FontPlugin = FontPlugin;
225
235
  exports.PluginAbstract = PluginAbstract;
226
236
  exports.PluginImplAbstract = PluginImplAbstract;
227
237
  exports.defineConfig = defineConfig;
238
+ exports.serializeThemeContext = serializeThemeContext;
@@ -0,0 +1,17 @@
1
+ import { API } from './API';
2
+ export interface ThemeContextSnapshot {
3
+ isDark: boolean;
4
+ contrastLevel: number;
5
+ sourceColor: {
6
+ hue: number;
7
+ chroma: number;
8
+ tone: number;
9
+ };
10
+ variantName: string;
11
+ palettes: Record<string, {
12
+ hue: number;
13
+ chroma: number;
14
+ }>;
15
+ }
16
+ export declare function serializeThemeContext(api: API): ThemeContextSnapshot;
17
+ //# sourceMappingURL=serialize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serialize.d.ts","sourceRoot":"","sources":["../src/serialize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAE5B,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,OAAO,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3D,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC3D;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,GAAG,GAAG,oBAAoB,CASpE"}
@@ -9,4 +9,5 @@ export declare const Variants: {
9
9
  Vibrant: import('..').Variant;
10
10
  Udixio: import('..').Variant;
11
11
  };
12
+ export declare function getVariantByName(name: string): (typeof Variants)[keyof typeof Variants];
12
13
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/variant/variants/index.ts"],"names":[],"mappings":"AAMA,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAElC,eAAO,MAAM,QAAQ;;;;;;CAMpB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/variant/variants/index.ts"],"names":[],"mappings":"AAMA,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAElC,eAAO,MAAM,QAAQ;;;;;;CAMpB,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,OAAO,QAAQ,CAAC,CAAC,MAAM,OAAO,QAAQ,CAAC,CAMvF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@udixio/theme",
3
- "version": "2.1.18",
3
+ "version": "2.1.19",
4
4
  "type": "module",
5
5
  "main": "./dist/node.js",
6
6
  "module": "./dist/node.js",
package/src/index.ts CHANGED
@@ -11,3 +11,4 @@ export * from './palette';
11
11
  export * from './plugin';
12
12
  export * from './plugins';
13
13
  export * from './variant';
14
+ export * from './serialize';
@@ -1,3 +1,4 @@
1
1
  export * from './contrastCurve';
2
2
  export * from './dynamic_color';
3
3
  export * from './toneDeltaPair';
4
+ export * from './htc';
@@ -24,6 +24,34 @@ export class PaletteApi {
24
24
  });
25
25
  }
26
26
 
27
+ override(args: Record<string, PaletteCallback | string>): void {
28
+ Object.entries(args).forEach(([key, callback]) => {
29
+ if (typeof callback === 'string') {
30
+ this.paletteManager.override(key, Hct.fromInt(argbFromHex(callback)));
31
+ } else {
32
+ this.paletteManager.override(key, callback);
33
+ }
34
+ });
35
+ }
36
+
37
+ getSerializableState(): Record<string, { hue: number; chroma: number }> {
38
+ const result: Record<string, { hue: number; chroma: number }> = {};
39
+ for (const [key, palette] of Object.entries(this.paletteManager._palettes)) {
40
+ result[key] = { hue: palette.hue, chroma: palette.chroma };
41
+ }
42
+ return result;
43
+ }
44
+
45
+ sync(args: Record<string, PaletteCallback | string> | undefined): void {
46
+ const incoming = new Set(Object.keys(args ?? {}));
47
+ Object.keys(this.paletteManager._palettes).forEach((key) => {
48
+ if (!incoming.has(key)) {
49
+ this.paletteManager.remove(key);
50
+ }
51
+ });
52
+ if (args) this.override(args);
53
+ }
54
+
27
55
  get(
28
56
  key:
29
57
  | 'primary'
@@ -68,12 +68,36 @@ export class PaletteManager {
68
68
  }
69
69
 
70
70
  update(key: string, args: PaletteCallback | Palette): void {
71
- if (!this.palettes['key']) {
71
+ const existing = this._palettes[key];
72
+ if (!existing) {
72
73
  throw new Error(`Palette with key ${key} not found`);
73
74
  }
74
- if (!(args instanceof Palette)) {
75
- args = new Palette(key, args, this.context);
75
+ if (args instanceof Palette) {
76
+ this.set(key, args);
77
+ } else {
78
+ existing.setCallback(args);
79
+ }
80
+ }
81
+
82
+ remove(key: string): void {
83
+ delete this._palettes[key];
84
+ }
85
+
86
+ override(key: string, args: Hct | PaletteCallback): void {
87
+ const callback: PaletteCallback =
88
+ args instanceof Hct
89
+ ? (context) => context.variant.customPalettes(context, args)
90
+ : args;
91
+
92
+ if (this._palettes[key]) {
93
+ this.update(key, callback);
94
+ } else {
95
+ const palette = new Palette(key, callback, this.context);
96
+ this.set(key, palette);
97
+ const isVariantPalette = !!this.context.variant.palettes[key];
98
+ if (!isVariantPalette) {
99
+ this.colorApi.addFromCustomPalette(key);
100
+ }
76
101
  }
77
- this.set(key, args);
78
102
  }
79
103
  }
@@ -57,6 +57,15 @@ export class Palette {
57
57
  }
58
58
  }
59
59
 
60
+ setCallback(callback: PaletteCallback): void {
61
+ this.callback = callback;
62
+ this.dependencies = null;
63
+ this.cache.clear();
64
+ this.hueCache = null;
65
+ this.chromaCache = null;
66
+ this.update([]);
67
+ }
68
+
60
69
  private clearCache() {
61
70
  this.cache.clear();
62
71
  this.hueCache = null;
@@ -0,0 +1,20 @@
1
+ import { API } from './API';
2
+
3
+ export interface ThemeContextSnapshot {
4
+ isDark: boolean;
5
+ contrastLevel: number;
6
+ sourceColor: { hue: number; chroma: number; tone: number };
7
+ variantName: string;
8
+ palettes: Record<string, { hue: number; chroma: number }>;
9
+ }
10
+
11
+ export function serializeThemeContext(api: API): ThemeContextSnapshot {
12
+ const sc = api.context.sourceColor;
13
+ return {
14
+ isDark: api.context.isDark,
15
+ contrastLevel: api.context.contrastLevel,
16
+ sourceColor: { hue: sc.hue, chroma: sc.chroma, tone: sc.tone },
17
+ variantName: api.context.variant.name,
18
+ palettes: api.palettes.getSerializableState(),
19
+ };
20
+ }
@@ -16,3 +16,11 @@ export const Variants = {
16
16
  Vibrant: vibrantVariant,
17
17
  Udixio: udixioVariant,
18
18
  };
19
+
20
+ export function getVariantByName(name: string): (typeof Variants)[keyof typeof Variants] {
21
+ const found = Object.values(Variants).find((v) => v.name === name);
22
+ if (!found) {
23
+ throw new Error(`Unknown variant: "${name}". Known: ${Object.values(Variants).map((v) => v.name).join(', ')}`);
24
+ }
25
+ return found;
26
+ }