material-shadcn 0.0.1-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/apply.d.ts +22 -0
- package/dist/apply.d.ts.map +1 -0
- package/dist/apply.js +49 -0
- package/dist/apply.js.map +1 -0
- package/dist/convert.d.ts +6 -0
- package/dist/convert.d.ts.map +1 -0
- package/dist/convert.js +42 -0
- package/dist/convert.js.map +1 -0
- package/dist/generate.d.ts +32 -0
- package/dist/generate.d.ts.map +1 -0
- package/dist/generate.js +50 -0
- package/dist/generate.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/mapping.d.ts +11 -0
- package/dist/mapping.d.ts.map +1 -0
- package/dist/mapping.js +54 -0
- package/dist/mapping.js.map +1 -0
- package/package.json +49 -0
package/dist/apply.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { ThemeTokens, GeneratedTheme } from "./generate.js";
|
|
2
|
+
export type ColorMode = "light" | "dark" | "system";
|
|
3
|
+
/**
|
|
4
|
+
* Convert ThemeTokens to a CSS custom property map for use with inline styles.
|
|
5
|
+
* e.g. { background: "oklch(...)" } → { "--background": "oklch(...)" }
|
|
6
|
+
*/
|
|
7
|
+
export declare function tokensToCssVars(tokens: ThemeTokens): Record<string, string>;
|
|
8
|
+
/**
|
|
9
|
+
* Apply a generated theme to a DOM element by setting CSS custom properties.
|
|
10
|
+
* Also toggles the `dark` class on the element.
|
|
11
|
+
*/
|
|
12
|
+
export declare function applyTheme(element: HTMLElement, theme: GeneratedTheme, dark: boolean): void;
|
|
13
|
+
/**
|
|
14
|
+
* Remove all theme CSS custom properties from an element.
|
|
15
|
+
*/
|
|
16
|
+
export declare function removeTheme(element: HTMLElement, theme: GeneratedTheme): void;
|
|
17
|
+
/**
|
|
18
|
+
* Resolve a ColorMode to a boolean indicating dark mode.
|
|
19
|
+
* Returns false on the server (no `window`).
|
|
20
|
+
*/
|
|
21
|
+
export declare function resolveColorMode(mode: ColorMode): boolean;
|
|
22
|
+
//# sourceMappingURL=apply.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apply.d.ts","sourceRoot":"","sources":["../src/apply.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEjE,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEpD;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,WAAW,GAClB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAMxB;AAED;;;GAGG;AACH,wBAAgB,UAAU,CACxB,OAAO,EAAE,WAAW,EACpB,KAAK,EAAE,cAAc,EACrB,IAAI,EAAE,OAAO,GACZ,IAAI,CAYN;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,WAAW,EACpB,KAAK,EAAE,cAAc,GACpB,IAAI,CAKN;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAOzD"}
|
package/dist/apply.js
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Convert ThemeTokens to a CSS custom property map for use with inline styles.
|
|
3
|
+
* e.g. { background: "oklch(...)" } → { "--background": "oklch(...)" }
|
|
4
|
+
*/
|
|
5
|
+
export function tokensToCssVars(tokens) {
|
|
6
|
+
const vars = {};
|
|
7
|
+
for (const [key, value] of Object.entries(tokens)) {
|
|
8
|
+
vars[`--${key}`] = value;
|
|
9
|
+
}
|
|
10
|
+
return vars;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Apply a generated theme to a DOM element by setting CSS custom properties.
|
|
14
|
+
* Also toggles the `dark` class on the element.
|
|
15
|
+
*/
|
|
16
|
+
export function applyTheme(element, theme, dark) {
|
|
17
|
+
const tokens = dark ? theme.dark : theme.light;
|
|
18
|
+
if (dark) {
|
|
19
|
+
element.classList.add("dark");
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
element.classList.remove("dark");
|
|
23
|
+
}
|
|
24
|
+
for (const [key, value] of Object.entries(tokens)) {
|
|
25
|
+
element.style.setProperty(`--${key}`, value);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Remove all theme CSS custom properties from an element.
|
|
30
|
+
*/
|
|
31
|
+
export function removeTheme(element, theme) {
|
|
32
|
+
for (const key of Object.keys(theme.light)) {
|
|
33
|
+
element.style.removeProperty(`--${key}`);
|
|
34
|
+
}
|
|
35
|
+
element.classList.remove("dark");
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Resolve a ColorMode to a boolean indicating dark mode.
|
|
39
|
+
* Returns false on the server (no `window`).
|
|
40
|
+
*/
|
|
41
|
+
export function resolveColorMode(mode) {
|
|
42
|
+
if (mode === "system") {
|
|
43
|
+
return typeof window !== "undefined"
|
|
44
|
+
? window.matchMedia("(prefers-color-scheme: dark)").matches
|
|
45
|
+
: false;
|
|
46
|
+
}
|
|
47
|
+
return mode === "dark";
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=apply.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apply.js","sourceRoot":"","sources":["../src/apply.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,MAAM,UAAU,eAAe,CAC7B,MAAmB;IAEnB,MAAM,IAAI,GAA2B,EAAE,CAAC;IACxC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC,GAAG,KAAK,CAAC;IAC3B,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CACxB,OAAoB,EACpB,KAAqB,EACrB,IAAa;IAEb,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC;IAE/C,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC;IAC/C,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CACzB,OAAoB,EACpB,KAAqB;IAErB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3C,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AACnC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAe;IAC9C,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtB,OAAO,OAAO,MAAM,KAAK,WAAW;YAClC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,8BAA8B,CAAC,CAAC,OAAO;YAC3D,CAAC,CAAC,KAAK,CAAC;IACZ,CAAC;IACD,OAAO,IAAI,KAAK,MAAM,CAAC;AACzB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"convert.d.ts","sourceRoot":"","sources":["../src/convert.ts"],"names":[],"mappings":"AAMA;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAiChD"}
|
package/dist/convert.js
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { redFromArgb, greenFromArgb, blueFromArgb, } from "@material/material-color-utilities";
|
|
2
|
+
/**
|
|
3
|
+
* Convert an ARGB integer (from material-color-utilities) to an OKLCH CSS string.
|
|
4
|
+
* e.g. 0xFF6750A4 → "oklch(0.448 0.141 291.3)"
|
|
5
|
+
*/
|
|
6
|
+
export function argbToOklch(argb) {
|
|
7
|
+
const r = redFromArgb(argb) / 255;
|
|
8
|
+
const g = greenFromArgb(argb) / 255;
|
|
9
|
+
const b = blueFromArgb(argb) / 255;
|
|
10
|
+
// sRGB → linear RGB
|
|
11
|
+
const lr = linearize(r);
|
|
12
|
+
const lg = linearize(g);
|
|
13
|
+
const lb = linearize(b);
|
|
14
|
+
// Linear RGB → OKLab (via LMS)
|
|
15
|
+
const l_ = 0.4122214708 * lr + 0.5363325363 * lg + 0.0514459929 * lb;
|
|
16
|
+
const m_ = 0.2119034982 * lr + 0.6806995451 * lg + 0.1073969566 * lb;
|
|
17
|
+
const s_ = 0.0883024619 * lr + 0.2817188376 * lg + 0.6299787005 * lb;
|
|
18
|
+
const l_3 = Math.cbrt(l_);
|
|
19
|
+
const m_3 = Math.cbrt(m_);
|
|
20
|
+
const s_3 = Math.cbrt(s_);
|
|
21
|
+
const L = 0.2104542553 * l_3 + 0.793617785 * m_3 - 0.0040720468 * s_3;
|
|
22
|
+
const a = 1.9779984951 * l_3 - 2.428592205 * m_3 + 0.4505937099 * s_3;
|
|
23
|
+
const bOk = 0.0259040371 * l_3 + 0.7827717662 * m_3 - 0.808675766 * s_3;
|
|
24
|
+
// OKLab → OKLCH
|
|
25
|
+
const C = Math.sqrt(a * a + bOk * bOk);
|
|
26
|
+
let h = (Math.atan2(bOk, a) * 180) / Math.PI;
|
|
27
|
+
if (h < 0)
|
|
28
|
+
h += 360;
|
|
29
|
+
const lRound = round(L, 3);
|
|
30
|
+
const cRound = round(C, 3);
|
|
31
|
+
const hRound = round(h, 1);
|
|
32
|
+
return `oklch(${lRound} ${cRound} ${hRound})`;
|
|
33
|
+
}
|
|
34
|
+
/** sRGB gamma → linear */
|
|
35
|
+
function linearize(c) {
|
|
36
|
+
return c <= 0.04045 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
|
|
37
|
+
}
|
|
38
|
+
function round(value, decimals) {
|
|
39
|
+
const factor = 10 ** decimals;
|
|
40
|
+
return Math.round(value * factor) / factor;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=convert.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"convert.js","sourceRoot":"","sources":["../src/convert.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,aAAa,EACb,YAAY,GACb,MAAM,oCAAoC,CAAC;AAE5C;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,MAAM,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC;IAClC,MAAM,CAAC,GAAG,aAAa,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC;IACpC,MAAM,CAAC,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC;IAEnC,oBAAoB;IACpB,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;IACxB,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;IACxB,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;IAExB,+BAA+B;IAC/B,MAAM,EAAE,GAAG,YAAY,GAAG,EAAE,GAAG,YAAY,GAAG,EAAE,GAAG,YAAY,GAAG,EAAE,CAAC;IACrE,MAAM,EAAE,GAAG,YAAY,GAAG,EAAE,GAAG,YAAY,GAAG,EAAE,GAAG,YAAY,GAAG,EAAE,CAAC;IACrE,MAAM,EAAE,GAAG,YAAY,GAAG,EAAE,GAAG,YAAY,GAAG,EAAE,GAAG,YAAY,GAAG,EAAE,CAAC;IAErE,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAE1B,MAAM,CAAC,GAAG,YAAY,GAAG,GAAG,GAAG,WAAW,GAAG,GAAG,GAAG,YAAY,GAAG,GAAG,CAAC;IACtE,MAAM,CAAC,GAAG,YAAY,GAAG,GAAG,GAAG,WAAW,GAAG,GAAG,GAAG,YAAY,GAAG,GAAG,CAAC;IACtE,MAAM,GAAG,GAAG,YAAY,GAAG,GAAG,GAAG,YAAY,GAAG,GAAG,GAAG,WAAW,GAAG,GAAG,CAAC;IAExE,gBAAgB;IAChB,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;IACvC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC;IAC7C,IAAI,CAAC,GAAG,CAAC;QAAE,CAAC,IAAI,GAAG,CAAC;IAEpB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3B,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3B,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAE3B,OAAO,SAAS,MAAM,IAAI,MAAM,IAAI,MAAM,GAAG,CAAC;AAChD,CAAC;AAED,0BAA0B;AAC1B,SAAS,SAAS,CAAC,CAAS;IAC1B,OAAO,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,EAAE,GAAG,CAAC,CAAC;AACvE,CAAC;AAED,SAAS,KAAK,CAAC,KAAa,EAAE,QAAgB;IAC5C,MAAM,MAAM,GAAG,EAAE,IAAI,QAAQ,CAAC;IAC9B,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,GAAG,MAAM,CAAC;AAC7C,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { Variant } from "@material/material-color-utilities";
|
|
2
|
+
export interface GenerateOptions {
|
|
3
|
+
/** Seed color as hex string (e.g. "#6750A4") */
|
|
4
|
+
seed: string;
|
|
5
|
+
/** M3 variant style. Default: TONAL_SPOT */
|
|
6
|
+
variant?: Variant;
|
|
7
|
+
/** Contrast level from -1 to 1. Default: 0 */
|
|
8
|
+
contrast?: number;
|
|
9
|
+
}
|
|
10
|
+
export interface ThemeTokens {
|
|
11
|
+
[key: string]: string;
|
|
12
|
+
}
|
|
13
|
+
export interface GeneratedTheme {
|
|
14
|
+
light: ThemeTokens;
|
|
15
|
+
dark: ThemeTokens;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Generate a complete shadcn-compatible theme from a seed color using Material 3.
|
|
19
|
+
*/
|
|
20
|
+
export declare function generateTheme(options: GenerateOptions): GeneratedTheme;
|
|
21
|
+
/**
|
|
22
|
+
* Generate a shadcn registry:theme JSON object for use with `npx shadcn add`.
|
|
23
|
+
*/
|
|
24
|
+
export declare function generateRegistryTheme(options: GenerateOptions): {
|
|
25
|
+
name: string;
|
|
26
|
+
type: string;
|
|
27
|
+
cssVars: {
|
|
28
|
+
light: ThemeTokens;
|
|
29
|
+
dark: ThemeTokens;
|
|
30
|
+
};
|
|
31
|
+
};
|
|
32
|
+
//# sourceMappingURL=generate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../src/generate.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,OAAO,EACR,MAAM,oCAAoC,CAAC;AAI5C,MAAM,WAAW,eAAe;IAC9B,gDAAgD;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,4CAA4C;IAC5C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,WAAW,CAAC;IACnB,IAAI,EAAE,WAAW,CAAC;CACnB;AA8BD;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,eAAe,GAAG,cAAc,CAatE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,eAAe;;;;;;;EAW7D"}
|
package/dist/generate.js
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { argbFromHex, DynamicScheme, Hct, Variant, } from "@material/material-color-utilities";
|
|
2
|
+
import { argbToOklch } from "./convert.js";
|
|
3
|
+
import { TOKEN_MAP, CHART_MAP } from "./mapping.js";
|
|
4
|
+
function createScheme(sourceHct, isDark, variant, contrast) {
|
|
5
|
+
return new DynamicScheme({
|
|
6
|
+
sourceColorHct: sourceHct,
|
|
7
|
+
variant,
|
|
8
|
+
contrastLevel: contrast,
|
|
9
|
+
isDark,
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
function schemeToTokens(scheme) {
|
|
13
|
+
const tokens = {};
|
|
14
|
+
for (const [name, accessor] of TOKEN_MAP) {
|
|
15
|
+
tokens[name] = argbToOklch(accessor(scheme));
|
|
16
|
+
}
|
|
17
|
+
for (const [name, accessor] of CHART_MAP) {
|
|
18
|
+
tokens[name] = argbToOklch(accessor(scheme));
|
|
19
|
+
}
|
|
20
|
+
return tokens;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Generate a complete shadcn-compatible theme from a seed color using Material 3.
|
|
24
|
+
*/
|
|
25
|
+
export function generateTheme(options) {
|
|
26
|
+
const { seed, variant = Variant.TONAL_SPOT, contrast = 0 } = options;
|
|
27
|
+
const argb = argbFromHex(seed);
|
|
28
|
+
const sourceHct = Hct.fromInt(argb);
|
|
29
|
+
const lightScheme = createScheme(sourceHct, false, variant, contrast);
|
|
30
|
+
const darkScheme = createScheme(sourceHct, true, variant, contrast);
|
|
31
|
+
return {
|
|
32
|
+
light: schemeToTokens(lightScheme),
|
|
33
|
+
dark: schemeToTokens(darkScheme),
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Generate a shadcn registry:theme JSON object for use with `npx shadcn add`.
|
|
38
|
+
*/
|
|
39
|
+
export function generateRegistryTheme(options) {
|
|
40
|
+
const theme = generateTheme(options);
|
|
41
|
+
return {
|
|
42
|
+
name: "material-theme",
|
|
43
|
+
type: "registry:theme",
|
|
44
|
+
cssVars: {
|
|
45
|
+
light: theme.light,
|
|
46
|
+
dark: theme.dark,
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=generate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../src/generate.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,aAAa,EACb,GAAG,EACH,OAAO,GACR,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAoBpD,SAAS,YAAY,CACnB,SAAc,EACd,MAAe,EACf,OAAgB,EAChB,QAAgB;IAEhB,OAAO,IAAI,aAAa,CAAC;QACvB,cAAc,EAAE,SAAS;QACzB,OAAO;QACP,aAAa,EAAE,QAAQ;QACvB,MAAM;KACP,CAAC,CAAC;AACL,CAAC;AAED,SAAS,cAAc,CAAC,MAAqB;IAC3C,MAAM,MAAM,GAAgB,EAAE,CAAC;IAE/B,KAAK,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,SAAS,EAAE,CAAC;QACzC,MAAM,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,SAAS,EAAE,CAAC;QACzC,MAAM,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IAC/C,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,OAAwB;IACpD,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,EAAE,QAAQ,GAAG,CAAC,EAAE,GAAG,OAAO,CAAC;IAErE,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAEpC,MAAM,WAAW,GAAG,YAAY,CAAC,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IACtE,MAAM,UAAU,GAAG,YAAY,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IAEpE,OAAO;QACL,KAAK,EAAE,cAAc,CAAC,WAAW,CAAC;QAClC,IAAI,EAAE,cAAc,CAAC,UAAU,CAAC;KACjC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAAwB;IAC5D,MAAM,KAAK,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IAErC,OAAO;QACL,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE;YACP,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,IAAI,EAAE,KAAK,CAAC,IAAI;SACjB;KACF,CAAC;AACJ,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export { generateTheme, generateRegistryTheme } from "./generate.js";
|
|
2
|
+
export type { GenerateOptions, GeneratedTheme, ThemeTokens, } from "./generate.js";
|
|
3
|
+
export { TOKEN_MAP, CHART_MAP } from "./mapping.js";
|
|
4
|
+
export { argbToOklch } from "./convert.js";
|
|
5
|
+
export { tokensToCssVars, applyTheme, removeTheme, resolveColorMode, } from "./apply.js";
|
|
6
|
+
export type { ColorMode } from "./apply.js";
|
|
7
|
+
export { Variant } from "@material/material-color-utilities";
|
|
8
|
+
export { sourceColorFromImage } from "@material/material-color-utilities";
|
|
9
|
+
export { hexFromArgb } from "@material/material-color-utilities";
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACrE,YAAY,EACV,eAAe,EACf,cAAc,EACd,WAAW,GACZ,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EACL,eAAe,EACf,UAAU,EACV,WAAW,EACX,gBAAgB,GACjB,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,oCAAoC,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAC1E,OAAO,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { generateTheme, generateRegistryTheme } from "./generate.js";
|
|
2
|
+
export { TOKEN_MAP, CHART_MAP } from "./mapping.js";
|
|
3
|
+
export { argbToOklch } from "./convert.js";
|
|
4
|
+
export { tokensToCssVars, applyTheme, removeTheme, resolveColorMode, } from "./apply.js";
|
|
5
|
+
export { Variant } from "@material/material-color-utilities";
|
|
6
|
+
export { sourceColorFromImage } from "@material/material-color-utilities";
|
|
7
|
+
export { hexFromArgb } from "@material/material-color-utilities";
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAMrE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EACL,eAAe,EACf,UAAU,EACV,WAAW,EACX,gBAAgB,GACjB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,OAAO,EAAE,MAAM,oCAAoC,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAC1E,OAAO,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { DynamicScheme } from "@material/material-color-utilities";
|
|
2
|
+
/**
|
|
3
|
+
* Maps shadcn CSS variable names to Material 3 DynamicScheme property accessors.
|
|
4
|
+
* Each entry: [shadcn-token-name, (scheme) => argb-integer]
|
|
5
|
+
*/
|
|
6
|
+
export declare const TOKEN_MAP: Array<[string, (scheme: DynamicScheme) => number]>;
|
|
7
|
+
/**
|
|
8
|
+
* Chart colors use different M3 roles at varied tones for visual distinction.
|
|
9
|
+
*/
|
|
10
|
+
export declare const CHART_MAP: Array<[string, (scheme: DynamicScheme) => number]>;
|
|
11
|
+
//# sourceMappingURL=mapping.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mapping.d.ts","sourceRoot":"","sources":["../src/mapping.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AAExE;;;GAGG;AACH,eAAO,MAAM,SAAS,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,MAAM,CAAC,CA+CxE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,SAAS,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,MAAM,CAAC,CAMxE,CAAC"}
|
package/dist/mapping.js
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Maps shadcn CSS variable names to Material 3 DynamicScheme property accessors.
|
|
3
|
+
* Each entry: [shadcn-token-name, (scheme) => argb-integer]
|
|
4
|
+
*/
|
|
5
|
+
export const TOKEN_MAP = [
|
|
6
|
+
// Background & foreground
|
|
7
|
+
["background", (s) => s.surface],
|
|
8
|
+
["foreground", (s) => s.onSurface],
|
|
9
|
+
// Card
|
|
10
|
+
["card", (s) => s.surfaceContainerLow],
|
|
11
|
+
["card-foreground", (s) => s.onSurface],
|
|
12
|
+
// Popover
|
|
13
|
+
["popover", (s) => s.surfaceContainerLow],
|
|
14
|
+
["popover-foreground", (s) => s.onSurface],
|
|
15
|
+
// Primary
|
|
16
|
+
["primary", (s) => s.primary],
|
|
17
|
+
["primary-foreground", (s) => s.onPrimary],
|
|
18
|
+
// Secondary
|
|
19
|
+
["secondary", (s) => s.secondaryContainer],
|
|
20
|
+
["secondary-foreground", (s) => s.onSecondaryContainer],
|
|
21
|
+
// Muted
|
|
22
|
+
["muted", (s) => s.surfaceVariant],
|
|
23
|
+
["muted-foreground", (s) => s.onSurfaceVariant],
|
|
24
|
+
// Accent – use custom tones from the tertiary palette for consistency across variants
|
|
25
|
+
["accent", (s) => s.tertiaryPalette.tone(s.isDark ? 15 : 95)],
|
|
26
|
+
["accent-foreground", (s) => s.tertiaryPalette.tone(s.isDark ? 90 : 10)],
|
|
27
|
+
// Destructive
|
|
28
|
+
["destructive", (s) => s.error],
|
|
29
|
+
["destructive-foreground", (s) => s.onError],
|
|
30
|
+
// Border / Input / Ring
|
|
31
|
+
["border", (s) => s.outlineVariant],
|
|
32
|
+
["input", (s) => s.outlineVariant],
|
|
33
|
+
["ring", (s) => s.primary],
|
|
34
|
+
// Sidebar
|
|
35
|
+
["sidebar-background", (s) => s.surfaceContainer],
|
|
36
|
+
["sidebar-foreground", (s) => s.onSurface],
|
|
37
|
+
["sidebar-primary", (s) => s.primary],
|
|
38
|
+
["sidebar-primary-foreground", (s) => s.onPrimary],
|
|
39
|
+
["sidebar-accent", (s) => s.tertiaryPalette.tone(s.isDark ? 20 : 90)],
|
|
40
|
+
["sidebar-accent-foreground", (s) => s.tertiaryPalette.tone(s.isDark ? 90 : 10)],
|
|
41
|
+
["sidebar-border", (s) => s.outlineVariant],
|
|
42
|
+
["sidebar-ring", (s) => s.primary],
|
|
43
|
+
];
|
|
44
|
+
/**
|
|
45
|
+
* Chart colors use different M3 roles at varied tones for visual distinction.
|
|
46
|
+
*/
|
|
47
|
+
export const CHART_MAP = [
|
|
48
|
+
["chart-1", (s) => s.primaryPalette.tone(48)],
|
|
49
|
+
["chart-2", (s) => s.primaryPalette.tone(60)],
|
|
50
|
+
["chart-3", (s) => s.primaryPalette.tone(72)],
|
|
51
|
+
["chart-4", (s) => s.primaryPalette.tone(36)],
|
|
52
|
+
["chart-5", (s) => s.primaryPalette.tone(84)],
|
|
53
|
+
];
|
|
54
|
+
//# sourceMappingURL=mapping.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mapping.js","sourceRoot":"","sources":["../src/mapping.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "material-shadcn",
|
|
3
|
+
"version": "0.0.1-alpha.1",
|
|
4
|
+
"description": "Material Design 3 color system for shadcn/ui — generate themes from a single seed color",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "https://github.com/sazzad-sat/material-shadcn",
|
|
10
|
+
"directory": "packages/core"
|
|
11
|
+
},
|
|
12
|
+
"keywords": [
|
|
13
|
+
"material-design",
|
|
14
|
+
"material-3",
|
|
15
|
+
"shadcn",
|
|
16
|
+
"shadcn-ui",
|
|
17
|
+
"theme",
|
|
18
|
+
"color",
|
|
19
|
+
"oklch",
|
|
20
|
+
"tailwind"
|
|
21
|
+
],
|
|
22
|
+
"main": "./dist/index.js",
|
|
23
|
+
"types": "./dist/index.d.ts",
|
|
24
|
+
"exports": {
|
|
25
|
+
".": {
|
|
26
|
+
"import": "./dist/index.js",
|
|
27
|
+
"types": "./dist/index.d.ts"
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
"files": [
|
|
31
|
+
"dist"
|
|
32
|
+
],
|
|
33
|
+
"publishConfig": {
|
|
34
|
+
"access": "public"
|
|
35
|
+
},
|
|
36
|
+
"scripts": {
|
|
37
|
+
"build": "tsc",
|
|
38
|
+
"dev": "tsc --watch",
|
|
39
|
+
"test": "vitest run",
|
|
40
|
+
"prepublishOnly": "tsc"
|
|
41
|
+
},
|
|
42
|
+
"dependencies": {
|
|
43
|
+
"@material/material-color-utilities": "^0.4.0"
|
|
44
|
+
},
|
|
45
|
+
"devDependencies": {
|
|
46
|
+
"typescript": "^5.8",
|
|
47
|
+
"vitest": "^3.1"
|
|
48
|
+
}
|
|
49
|
+
}
|