@udixio/theme 2.1.17 → 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 (42) hide show
  1. package/CHANGELOG.md +22 -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/config/config.interface.d.ts +3 -1
  7. package/dist/config/config.interface.d.ts.map +1 -1
  8. package/dist/context/context.d.ts +3 -1
  9. package/dist/context/context.d.ts.map +1 -1
  10. package/dist/index.d.ts +1 -0
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/{load-from-path-CuZeSC9R.cjs → load-from-path-CuBpH2Cs.cjs} +2 -2
  13. package/dist/{load-from-path-IJo3DMek.js → load-from-path-CvD4a_os.js} +1 -1
  14. package/dist/{loader-COk_13QK.cjs → loader-BN_VoxCd.cjs} +71 -5
  15. package/dist/{loader-DPnknsVo.js → loader-J0nrh600.js} +78 -12
  16. package/dist/material-color-utilities/index.d.ts +1 -0
  17. package/dist/material-color-utilities/index.d.ts.map +1 -1
  18. package/dist/node.cjs +11 -8
  19. package/dist/node.js +14 -11
  20. package/dist/palette/palette.api.d.ts +6 -0
  21. package/dist/palette/palette.api.d.ts.map +1 -1
  22. package/dist/palette/palette.d.ts +1 -0
  23. package/dist/palette/palette.d.ts.map +1 -1
  24. package/dist/palette/palette.manager.d.ts +2 -0
  25. package/dist/palette/palette.manager.d.ts.map +1 -1
  26. package/dist/{font.plugin-CE1jX3iF.js → serialize-BlsUXsgT.js} +13 -2
  27. package/dist/{font.plugin-DKvzB0yr.cjs → serialize-NWi8E_Ms.cjs} +12 -1
  28. package/dist/serialize.d.ts +17 -0
  29. package/dist/serialize.d.ts.map +1 -0
  30. package/dist/variant/variants/index.d.ts +1 -0
  31. package/dist/variant/variants/index.d.ts.map +1 -1
  32. package/package.json +1 -1
  33. package/src/config/config.interface.ts +3 -2
  34. package/src/context/context.ts +8 -1
  35. package/src/index.ts +1 -0
  36. package/src/material-color-utilities/index.ts +1 -0
  37. package/src/palette/palette.api.ts +28 -0
  38. package/src/palette/palette.manager.ts +28 -4
  39. package/src/palette/palette.ts +9 -0
  40. package/src/serialize.ts +20 -0
  41. package/src/variant/variants/index.ts +8 -0
  42. package/src/variant/variants/udixio.variant.ts +2 -2
package/CHANGELOG.md CHANGED
@@ -1,3 +1,25 @@
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
+
13
+ ## 2.1.18 (2026-03-22)
14
+
15
+ ### 🚀 Features
16
+
17
+ - **theme:** enhance `sourceColor` flexibility and improve context handling ([9bb6068](https://github.com/Udixio/UI/commit/9bb6068))
18
+
19
+ ### ❤️ Thank You
20
+
21
+ - Joël VIGREUX
22
+
1
23
  ## 2.1.17 (2026-03-20)
2
24
 
3
25
  ### 🩹 Fixes
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-CuZeSC9R.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-IJo3DMek.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-COk_13QK.cjs");
4
- const font_plugin = require("./font.plugin-DKvzB0yr.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-DPnknsVo.js";
2
- import { F as F2, a as a2, P as P2, b as b2, d as d2 } from "./font.plugin-CE1jX3iF.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
  };
@@ -1,9 +1,11 @@
1
1
  import { AddColorsOptions } from '../color';
2
+ import { Hct } from '../material-color-utilities/htc';
2
3
  import { PluginAbstract } from '../plugin';
3
4
  import { Variant } from '../variant/variant';
4
5
  import { PaletteCallback } from '../palette/palette';
6
+ import { Context } from '../context';
5
7
  export interface ConfigInterface {
6
- sourceColor: string;
8
+ sourceColor: string | Hct | ((context: Context) => string | Hct);
7
9
  contrastLevel?: number;
8
10
  isDark?: boolean;
9
11
  variant?: Variant;
@@ -1 +1 @@
1
- {"version":3,"file":"config.interface.d.ts","sourceRoot":"","sources":["../../src/config/config.interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE5C,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CAAC,CAAC;IACpD,OAAO,CAAC,EAAE,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;CACtC"}
1
+ {"version":3,"file":"config.interface.d.ts","sourceRoot":"","sources":["../../src/config/config.interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,GAAG,EAAE,MAAM,iCAAiC,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAErC,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,OAAO,EAAE,OAAO,KAAK,MAAM,GAAG,GAAG,CAAC,CAAC;IACjE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CAAC,CAAC;IACpD,OAAO,CAAC,EAAE,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;CACtC"}
@@ -1,7 +1,8 @@
1
1
  import { Hct } from '../material-color-utilities/htc';
2
2
  import { Variant } from '../variant/variant';
3
+ import { ConfigInterface } from '../config';
3
4
  export interface ContextOptions {
4
- sourceColor: string | Hct;
5
+ sourceColor: ConfigInterface['sourceColor'] | Hct;
5
6
  contrastLevel: number;
6
7
  isDark: boolean;
7
8
  variant: Variant;
@@ -33,6 +34,7 @@ export declare class Context {
33
34
  get contrastLevel(): number;
34
35
  set sourceColor(sourceColor: string);
35
36
  get sourceColor(): Hct;
37
+ get rawSourceColor(): ContextOptions['sourceColor'];
36
38
  set variant(variant: Variant);
37
39
  get variant(): Variant;
38
40
  temp<T>(args: Partial<ContextOptions>, callback: () => T): T;
@@ -1 +1 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/context/context.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,MAAM,iCAAiC,CAAC;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE7C,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,GAAG,GAAG,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,qBAAa,OAAO;IAClB,OAAO,CAAC,QAAQ,CAAC,CAAiB;IAClC,OAAO,CAAC,WAAW,CAA+B;IAClD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAEzB;;IAUP;;;;;;;;OAQG;IACH,MAAM,CAAC,iBAAiB,CAAC,CAAC,EACxB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,CAAC,GAC5B;QAAE,MAAM,EAAE,CAAC,CAAC;QAAC,YAAY,EAAE,CAAC,MAAM,OAAO,CAAC,EAAE,CAAA;KAAE;IAsBjD,GAAG,CAAC,OAAO,EAAE,cAAc;IAoBpB,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,cAAc,CAAC;IA4B3C,OAAO,CAAC,UAAU;IAalB,IAAI,QAAQ,CAAC,MAAM,EAAE,OAAO,EAE3B;IACD,IAAI,MAAM,YAET;IAED,IAAI,aAAa,CAAC,aAAa,EAAE,MAAM,EAEtC;IACD,IAAI,aAAa,IAHgB,MAAM,CAKtC;IAED,IAAI,WAAW,CAAC,WAAW,EAAE,MAAM,EAElC;IACD,IAAI,WAAW,IAAI,GAAG,CAMrB;IAED,IAAI,OAAO,CAAC,OAAO,EAAE,OAAO,EAE3B;IACD,IAAI,OAAO,IAHU,OAAO,CAK3B;IAED,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,cAAc,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC;IAW5D,QAAQ,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,CAAC,MAAM,OAAO,CAAC,EAAE,KAAK,IAAI,GAAG,IAAI;CAG/D"}
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/context/context.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,MAAM,iCAAiC,CAAC;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAE5C,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,eAAe,CAAC,aAAa,CAAC,GAAG,GAAG,CAAC;IAClD,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,qBAAa,OAAO;IAClB,OAAO,CAAC,QAAQ,CAAC,CAAiB;IAClC,OAAO,CAAC,WAAW,CAA+B;IAClD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAEzB;;IAUP;;;;;;;;OAQG;IACH,MAAM,CAAC,iBAAiB,CAAC,CAAC,EACxB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,CAAC,GAC5B;QAAE,MAAM,EAAE,CAAC,CAAC;QAAC,YAAY,EAAE,CAAC,MAAM,OAAO,CAAC,EAAE,CAAA;KAAE;IAsBjD,GAAG,CAAC,OAAO,EAAE,cAAc;IAoBpB,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,cAAc,CAAC;IA4B3C,OAAO,CAAC,UAAU;IAalB,IAAI,QAAQ,CAAC,MAAM,EAAE,OAAO,EAE3B;IACD,IAAI,MAAM,YAET;IAED,IAAI,aAAa,CAAC,aAAa,EAAE,MAAM,EAEtC;IACD,IAAI,aAAa,IAHgB,MAAM,CAKtC;IAED,IAAI,WAAW,CAAC,WAAW,EAAE,MAAM,EAElC;IACD,IAAI,WAAW,IAAI,GAAG,CASrB;IACD,IAAI,cAAc,IAAI,cAAc,CAAC,aAAa,CAAC,CAElD;IAED,IAAI,OAAO,CAAC,OAAO,EAAE,OAAO,EAE3B;IACD,IAAI,OAAO,IAHU,OAAO,CAK3B;IAED,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,cAAc,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC;IAW5D,QAAQ,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,CAAC,MAAM,OAAO,CAAC,EAAE,KAAK,IAAI,GAAG,IAAI;CAG/D"}
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-COk_13QK.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-CuZeSC9R.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-DPnknsVo.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");
@@ -2591,11 +2591,17 @@ class Context {
2591
2591
  }
2592
2592
  get sourceColor() {
2593
2593
  let sourceColor = this.getOptions().sourceColor;
2594
+ if (typeof sourceColor == "function") {
2595
+ sourceColor = sourceColor(this);
2596
+ }
2594
2597
  if (typeof sourceColor === "string") {
2595
2598
  sourceColor = Hct.fromInt(materialColorUtilities.argbFromHex(sourceColor));
2596
2599
  }
2597
2600
  return sourceColor;
2598
2601
  }
2602
+ get rawSourceColor() {
2603
+ return this.getOptions().sourceColor;
2604
+ }
2599
2605
  set variant(variant2) {
2600
2606
  this.update({ variant: variant2 });
2601
2607
  }
@@ -2657,6 +2663,14 @@ class Palette {
2657
2663
  this.chromaCache = result.chroma;
2658
2664
  }
2659
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
+ }
2660
2674
  clearCache() {
2661
2675
  this.cache.clear();
2662
2676
  this.hueCache = null;
@@ -2733,6 +2747,31 @@ class PaletteApi {
2733
2747
  }
2734
2748
  });
2735
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
+ }
2736
2775
  get(key) {
2737
2776
  return this.paletteManager.get(key);
2738
2777
  }
@@ -2788,13 +2827,31 @@ class PaletteManager {
2788
2827
  this._palettes[key] = palette;
2789
2828
  }
2790
2829
  update(key, args) {
2791
- if (!this.palettes["key"]) {
2830
+ const existing = this._palettes[key];
2831
+ if (!existing) {
2792
2832
  throw new Error(`Palette with key ${key} not found`);
2793
2833
  }
2794
- if (!(args instanceof Palette)) {
2795
- 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
+ }
2796
2854
  }
2797
- this.set(key, args);
2798
2855
  }
2799
2856
  }
2800
2857
  const PaletteModule = {
@@ -3101,7 +3158,7 @@ const highestSurface = (context, colorService) => {
3101
3158
  };
3102
3159
  const createMinContrastToneAdjuster = (ctx, colors, options) => {
3103
3160
  const { selfKey, referenceKey } = options;
3104
- const minContrast = ctx.contrastLevel >= 0 ? normalize(ctx.contrastLevel, [0, 1], [4.5, 7]) : normalize(ctx.contrastLevel, [-1, 0], [0, 4.5]);
3161
+ const minContrast = ctx.contrastLevel >= 0 ? normalize(ctx.contrastLevel, [0, 1], [3, 7]) : normalize(ctx.contrastLevel, [-1, 0], [0, 3]);
3105
3162
  const referenceTone = referenceKey ? colors.get(referenceKey).getTone() : highestSurface(ctx, colors).getTone();
3106
3163
  const baseTone = colors.get(selfKey).options.tone;
3107
3164
  let selfTone = baseTone;
@@ -3836,6 +3893,13 @@ const Variants = {
3836
3893
  Vibrant: vibrantVariant,
3837
3894
  Udixio: udixioVariant
3838
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
+ }
3839
3903
  const loader = async (config, load = true) => {
3840
3904
  const api = bootstrap();
3841
3905
  const init = () => {
@@ -3887,6 +3951,7 @@ exports.Context = Context;
3887
3951
  exports.ContextModule = ContextModule;
3888
3952
  exports.ContrastCurve = ContrastCurve;
3889
3953
  exports.DynamicColor = DynamicColor;
3954
+ exports.Hct = Hct;
3890
3955
  exports.Palette = Palette;
3891
3956
  exports.PaletteApi = PaletteApi;
3892
3957
  exports.PaletteModule = PaletteModule;
@@ -3901,6 +3966,7 @@ exports.expressiveVariant = expressiveVariant;
3901
3966
  exports.getInitialToneFromBackground = getInitialToneFromBackground;
3902
3967
  exports.getPiecewiseHue = getPiecewiseHue;
3903
3968
  exports.getRotatedHue = getRotatedHue;
3969
+ exports.getVariantByName = getVariantByName;
3904
3970
  exports.highestSurface = highestSurface$1;
3905
3971
  exports.loader = loader;
3906
3972
  exports.neutralVariant = neutralVariant;
@@ -2590,11 +2590,17 @@ class Context {
2590
2590
  }
2591
2591
  get sourceColor() {
2592
2592
  let sourceColor = this.getOptions().sourceColor;
2593
+ if (typeof sourceColor == "function") {
2594
+ sourceColor = sourceColor(this);
2595
+ }
2593
2596
  if (typeof sourceColor === "string") {
2594
2597
  sourceColor = Hct.fromInt(argbFromHex(sourceColor));
2595
2598
  }
2596
2599
  return sourceColor;
2597
2600
  }
2601
+ get rawSourceColor() {
2602
+ return this.getOptions().sourceColor;
2603
+ }
2598
2604
  set variant(variant2) {
2599
2605
  this.update({ variant: variant2 });
2600
2606
  }
@@ -2656,6 +2662,14 @@ class Palette {
2656
2662
  this.chromaCache = result.chroma;
2657
2663
  }
2658
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
+ }
2659
2673
  clearCache() {
2660
2674
  this.cache.clear();
2661
2675
  this.hueCache = null;
@@ -2732,6 +2746,31 @@ class PaletteApi {
2732
2746
  }
2733
2747
  });
2734
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
+ }
2735
2774
  get(key) {
2736
2775
  return this.paletteManager.get(key);
2737
2776
  }
@@ -2787,13 +2826,31 @@ class PaletteManager {
2787
2826
  this._palettes[key] = palette;
2788
2827
  }
2789
2828
  update(key, args) {
2790
- if (!this.palettes["key"]) {
2829
+ const existing = this._palettes[key];
2830
+ if (!existing) {
2791
2831
  throw new Error(`Palette with key ${key} not found`);
2792
2832
  }
2793
- if (!(args instanceof Palette)) {
2794
- 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
+ }
2795
2853
  }
2796
- this.set(key, args);
2797
2854
  }
2798
2855
  }
2799
2856
  const PaletteModule = {
@@ -3100,7 +3157,7 @@ const highestSurface = (context, colorService) => {
3100
3157
  };
3101
3158
  const createMinContrastToneAdjuster = (ctx, colors, options) => {
3102
3159
  const { selfKey, referenceKey } = options;
3103
- const minContrast = ctx.contrastLevel >= 0 ? normalize(ctx.contrastLevel, [0, 1], [4.5, 7]) : normalize(ctx.contrastLevel, [-1, 0], [0, 4.5]);
3160
+ const minContrast = ctx.contrastLevel >= 0 ? normalize(ctx.contrastLevel, [0, 1], [3, 7]) : normalize(ctx.contrastLevel, [-1, 0], [0, 3]);
3104
3161
  const referenceTone = referenceKey ? colors.get(referenceKey).getTone() : highestSurface(ctx, colors).getTone();
3105
3162
  const baseTone = colors.get(selfKey).options.tone;
3106
3163
  let selfTone = baseTone;
@@ -3835,6 +3892,13 @@ const Variants = {
3835
3892
  Vibrant: vibrantVariant,
3836
3893
  Udixio: udixioVariant
3837
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
+ }
3838
3902
  const loader = async (config, load = true) => {
3839
3903
  const api = bootstrap();
3840
3904
  const init = () => {
@@ -3874,12 +3938,14 @@ const loader = async (config, load = true) => {
3874
3938
  };
3875
3939
  export {
3876
3940
  API as A,
3877
- tonalSpotVariant as B,
3941
+ neutralVariant as B,
3878
3942
  Color as C,
3879
3943
  DynamicColor as D,
3880
- toneDeltaPair as E,
3881
- variant as F,
3882
- vibrantVariant as G,
3944
+ tonalSpotVariant as E,
3945
+ toneDeltaPair as F,
3946
+ variant as G,
3947
+ Hct as H,
3948
+ vibrantVariant as I,
3883
3949
  Palette as P,
3884
3950
  Variant as V,
3885
3951
  AppContainer as a,
@@ -3905,7 +3971,7 @@ export {
3905
3971
  getInitialToneFromBackground as u,
3906
3972
  getPiecewiseHue as v,
3907
3973
  getRotatedHue as w,
3908
- highestSurface$1 as x,
3909
- loader as y,
3910
- neutralVariant as z
3974
+ getVariantByName as x,
3975
+ highestSurface$1 as y,
3976
+ loader as z
3911
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-COk_13QK.cjs");
26
- const font_plugin = require("./font.plugin-DKvzB0yr.cjs");
27
- const loadFromPath = require("./load-from-path-CuZeSC9R.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-DPnknsVo.js";
2
- import { F as F2, a as a2, P as P2, b as b2, d as d2 } from "./font.plugin-CE1jX3iF.js";
3
- import { l as loadFromPath } from "./load-from-path-IJo3DMek.js";
4
- import { r as r2 } from "./load-from-path-IJo3DMek.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-DPnknsVo.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-COk_13QK.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.17",
3
+ "version": "2.1.19",
4
4
  "type": "module",
5
5
  "main": "./dist/node.js",
6
6
  "module": "./dist/node.js",
@@ -1,11 +1,12 @@
1
1
  import { AddColorsOptions } from '../color';
2
-
2
+ import { Hct } from '../material-color-utilities/htc';
3
3
  import { PluginAbstract } from '../plugin';
4
4
  import { Variant } from '../variant/variant';
5
5
  import { PaletteCallback } from '../palette/palette';
6
+ import { Context } from '../context';
6
7
 
7
8
  export interface ConfigInterface {
8
- sourceColor: string;
9
+ sourceColor: string | Hct | ((context: Context) => string | Hct);
9
10
  contrastLevel?: number;
10
11
  isDark?: boolean;
11
12
  variant?: Variant;
@@ -1,9 +1,10 @@
1
1
  import { argbFromHex } from '@material/material-color-utilities';
2
2
  import { Hct } from '../material-color-utilities/htc';
3
3
  import { Variant } from '../variant/variant';
4
+ import { ConfigInterface } from '../config';
4
5
 
5
6
  export interface ContextOptions {
6
- sourceColor: string | Hct;
7
+ sourceColor: ConfigInterface['sourceColor'] | Hct;
7
8
  contrastLevel: number;
8
9
  isDark: boolean;
9
10
  variant: Variant;
@@ -138,11 +139,17 @@ export class Context {
138
139
  }
139
140
  get sourceColor(): Hct {
140
141
  let sourceColor = this.getOptions().sourceColor;
142
+ if (typeof sourceColor == 'function') {
143
+ sourceColor = sourceColor(this);
144
+ }
141
145
  if (typeof sourceColor === 'string') {
142
146
  sourceColor = Hct.fromInt(argbFromHex(sourceColor));
143
147
  }
144
148
  return sourceColor;
145
149
  }
150
+ get rawSourceColor(): ContextOptions['sourceColor'] {
151
+ return this.getOptions().sourceColor;
152
+ }
146
153
 
147
154
  set variant(variant: Variant) {
148
155
  this.update({ variant });
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
+ }
@@ -85,8 +85,8 @@ export const createMinContrastToneAdjuster = (
85
85
  const { selfKey, referenceKey } = options;
86
86
  const minContrast =
87
87
  ctx.contrastLevel >= 0
88
- ? normalize(ctx.contrastLevel, [0, 1], [4.5, 7])
89
- : normalize(ctx.contrastLevel, [-1, 0], [0, 4.5]);
88
+ ? normalize(ctx.contrastLevel, [0, 1], [3, 7])
89
+ : normalize(ctx.contrastLevel, [-1, 0], [0, 3]);
90
90
 
91
91
  const referenceTone = referenceKey
92
92
  ? colors.get(referenceKey).getTone()