@trebired/frontend 0.4.2 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +9 -0
- package/README.md +61 -1
- package/dist/config/index.d.ts +6 -45
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +19 -252
- package/dist/config/index.js.map +1 -1
- package/dist/config/module.d.ts +5 -0
- package/dist/config/module.d.ts.map +1 -0
- package/dist/config/module.js +124 -0
- package/dist/config/module.js.map +1 -0
- package/dist/config/normalize.d.ts +10 -0
- package/dist/config/normalize.d.ts.map +1 -0
- package/dist/config/normalize.js +105 -0
- package/dist/config/normalize.js.map +1 -0
- package/dist/config/scss.d.ts +4 -0
- package/dist/config/scss.d.ts.map +1 -0
- package/dist/config/scss.js +84 -0
- package/dist/config/scss.js.map +1 -0
- package/dist/config/shared.d.ts +9 -0
- package/dist/config/shared.d.ts.map +1 -0
- package/dist/config/shared.js +27 -0
- package/dist/config/shared.js.map +1 -0
- package/dist/config/theme.d.ts +6 -0
- package/dist/config/theme.d.ts.map +1 -0
- package/dist/config/theme.js +133 -0
- package/dist/config/theme.js.map +1 -0
- package/dist/config/types.d.ts +62 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +2 -0
- package/dist/config/types.js.map +1 -0
- package/dist/src/config/index.d.ts +6 -45
- package/dist/src/config/index.d.ts.map +1 -1
- package/dist/src/config/index.js +19 -252
- package/dist/src/config/index.js.map +1 -1
- package/dist/src/config/module.d.ts +5 -0
- package/dist/src/config/module.d.ts.map +1 -0
- package/dist/src/config/module.js +124 -0
- package/dist/src/config/module.js.map +1 -0
- package/dist/src/config/normalize.d.ts +10 -0
- package/dist/src/config/normalize.d.ts.map +1 -0
- package/dist/src/config/normalize.js +105 -0
- package/dist/src/config/normalize.js.map +1 -0
- package/dist/src/config/scss.d.ts +4 -0
- package/dist/src/config/scss.d.ts.map +1 -0
- package/dist/src/config/scss.js +84 -0
- package/dist/src/config/scss.js.map +1 -0
- package/dist/src/config/shared.d.ts +9 -0
- package/dist/src/config/shared.d.ts.map +1 -0
- package/dist/src/config/shared.js +27 -0
- package/dist/src/config/shared.js.map +1 -0
- package/dist/src/config/theme.d.ts +6 -0
- package/dist/src/config/theme.d.ts.map +1 -0
- package/dist/src/config/theme.js +133 -0
- package/dist/src/config/theme.js.map +1 -0
- package/dist/src/config/types.d.ts +62 -0
- package/dist/src/config/types.d.ts.map +1 -0
- package/dist/src/config/types.js +2 -0
- package/dist/src/config/types.js.map +1 -0
- package/dist/src/theme/apply.d.ts +26 -0
- package/dist/src/theme/apply.d.ts.map +1 -0
- package/dist/src/theme/apply.js +85 -0
- package/dist/src/theme/apply.js.map +1 -0
- package/dist/src/theme/boot.d.ts +4 -0
- package/dist/src/theme/boot.d.ts.map +1 -0
- package/dist/src/theme/boot.js +23 -0
- package/dist/src/theme/boot.js.map +1 -0
- package/dist/src/theme/components/index.d.ts +13 -5
- package/dist/src/theme/components/index.d.ts.map +1 -1
- package/dist/src/theme/components/index.js +22 -6
- package/dist/src/theme/components/index.js.map +1 -1
- package/dist/src/theme/constants.d.ts +12 -0
- package/dist/src/theme/constants.d.ts.map +1 -0
- package/dist/src/theme/constants.js +12 -0
- package/dist/src/theme/constants.js.map +1 -0
- package/dist/src/theme/controls.d.ts +15 -0
- package/dist/src/theme/controls.d.ts.map +1 -0
- package/dist/src/theme/controls.js +128 -0
- package/dist/src/theme/controls.js.map +1 -0
- package/dist/src/theme/index.d.ts +10 -24
- package/dist/src/theme/index.d.ts.map +1 -1
- package/dist/src/theme/index.js +15 -117
- package/dist/src/theme/index.js.map +1 -1
- package/dist/src/theme/modes.d.ts +36 -0
- package/dist/src/theme/modes.d.ts.map +1 -0
- package/dist/src/theme/modes.js +107 -0
- package/dist/src/theme/modes.js.map +1 -0
- package/dist/theme/apply.d.ts +26 -0
- package/dist/theme/apply.d.ts.map +1 -0
- package/dist/theme/apply.js +85 -0
- package/dist/theme/apply.js.map +1 -0
- package/dist/theme/boot.d.ts +4 -0
- package/dist/theme/boot.d.ts.map +1 -0
- package/dist/theme/boot.js +23 -0
- package/dist/theme/boot.js.map +1 -0
- package/dist/theme/components/index.d.ts +13 -5
- package/dist/theme/components/index.d.ts.map +1 -1
- package/dist/theme/components/index.js +22 -6
- package/dist/theme/components/index.js.map +1 -1
- package/dist/theme/constants.d.ts +12 -0
- package/dist/theme/constants.d.ts.map +1 -0
- package/dist/theme/constants.js +12 -0
- package/dist/theme/constants.js.map +1 -0
- package/dist/theme/controls.d.ts +15 -0
- package/dist/theme/controls.d.ts.map +1 -0
- package/dist/theme/controls.js +128 -0
- package/dist/theme/controls.js.map +1 -0
- package/dist/theme/index.d.ts +10 -24
- package/dist/theme/index.d.ts.map +1 -1
- package/dist/theme/index.js +15 -117
- package/dist/theme/index.js.map +1 -1
- package/dist/theme/modes.d.ts +36 -0
- package/dist/theme/modes.d.ts.map +1 -0
- package/dist/theme/modes.js +107 -0
- package/dist/theme/modes.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { cssComment, cssString } from "./shared.js";
|
|
2
|
+
import { SYSTEM_ORDER, SYSTEM_STYLE_IMPORTS, THEME_MODE_ATTRIBUTE, normalizeTrebiredFrontendConfig, } from "./normalize.js";
|
|
3
|
+
import { flattenThemeTokens } from "./theme.js";
|
|
4
|
+
function tokenDeclarations(prefix, tokens) {
|
|
5
|
+
return flattenThemeTokens(tokens).map(([key, value]) => ` --${prefix}-${key}: ${String(value)};`);
|
|
6
|
+
}
|
|
7
|
+
function rootDeclarations(config) {
|
|
8
|
+
const { modes, defaultMode } = config.theme;
|
|
9
|
+
return [
|
|
10
|
+
` --${config.prefix}-config-prefix: ${cssString(config.prefix)};`,
|
|
11
|
+
` --${config.prefix}-icon-endpoint: ${cssString(config.icons.endpoint)};`,
|
|
12
|
+
...(modes.length ? [` --${config.prefix}-theme-modes: ${cssString(modes.map((mode) => mode.key).join(" "))};`] : []),
|
|
13
|
+
...(defaultMode ? [` --${config.prefix}-theme-default: ${cssString(defaultMode)};`] : []),
|
|
14
|
+
...tokenDeclarations(config.prefix, config.theme.tokens),
|
|
15
|
+
];
|
|
16
|
+
}
|
|
17
|
+
function modeDeclarations(config, mode) {
|
|
18
|
+
return [
|
|
19
|
+
` color-scheme: ${mode.scheme};`,
|
|
20
|
+
...tokenDeclarations(config.prefix, mode.tokens),
|
|
21
|
+
];
|
|
22
|
+
}
|
|
23
|
+
function renderBlock(selector, declarations, indent = "") {
|
|
24
|
+
if (!declarations.length)
|
|
25
|
+
return [];
|
|
26
|
+
return [
|
|
27
|
+
`${indent}${selector} {`,
|
|
28
|
+
...declarations.map((line) => `${indent}${line}`),
|
|
29
|
+
`${indent}}`,
|
|
30
|
+
];
|
|
31
|
+
}
|
|
32
|
+
function renderModeBlocks(config) {
|
|
33
|
+
return config.theme.modes.flatMap((mode) => [
|
|
34
|
+
"",
|
|
35
|
+
`/* theme mode: ${cssComment(mode.key)} */`,
|
|
36
|
+
...renderBlock(`[${THEME_MODE_ATTRIBUTE}="${mode.key}"]`, modeDeclarations(config, mode)),
|
|
37
|
+
]);
|
|
38
|
+
}
|
|
39
|
+
function renderSystemPreferenceBlock(config, scheme) {
|
|
40
|
+
const key = scheme === "dark" ? config.theme.dark : config.theme.light;
|
|
41
|
+
const mode = config.theme.modes.find((item) => item.key === key);
|
|
42
|
+
if (!mode)
|
|
43
|
+
return [];
|
|
44
|
+
return [
|
|
45
|
+
"",
|
|
46
|
+
`@media (prefers-color-scheme: ${scheme}) {`,
|
|
47
|
+
...renderBlock(`:root:not([${THEME_MODE_ATTRIBUTE}])`, modeDeclarations(config, mode), " "),
|
|
48
|
+
"}",
|
|
49
|
+
];
|
|
50
|
+
}
|
|
51
|
+
function renderThemeCss(config) {
|
|
52
|
+
if (!config.theme.cssVariables)
|
|
53
|
+
return [];
|
|
54
|
+
return [
|
|
55
|
+
"",
|
|
56
|
+
...renderBlock(":root", rootDeclarations(config)),
|
|
57
|
+
...renderModeBlocks(config),
|
|
58
|
+
...renderSystemPreferenceBlock(config, "dark"),
|
|
59
|
+
...renderSystemPreferenceBlock(config, "light"),
|
|
60
|
+
];
|
|
61
|
+
}
|
|
62
|
+
function renderSystemImports(config) {
|
|
63
|
+
const lines = [];
|
|
64
|
+
for (const system of SYSTEM_ORDER) {
|
|
65
|
+
const importPath = SYSTEM_STYLE_IMPORTS[system];
|
|
66
|
+
if (importPath && config.systems[system])
|
|
67
|
+
lines.push(`@use ${cssString(importPath)} as *;`);
|
|
68
|
+
}
|
|
69
|
+
return lines;
|
|
70
|
+
}
|
|
71
|
+
function generateTrebiredFrontendScss(configInput) {
|
|
72
|
+
const config = normalizeTrebiredFrontendConfig(configInput);
|
|
73
|
+
const lines = [
|
|
74
|
+
"/* Generated by @trebired/frontend. Do not edit directly. */",
|
|
75
|
+
`/* prefix: ${cssComment(config.prefix)} */`,
|
|
76
|
+
'@use "@trebired/frontend/styles/tokens" as *;',
|
|
77
|
+
'@use "@trebired/frontend/styles/utils" as *;',
|
|
78
|
+
...renderSystemImports(config),
|
|
79
|
+
...renderThemeCss(config),
|
|
80
|
+
];
|
|
81
|
+
return `${lines.join("\n")}\n`;
|
|
82
|
+
}
|
|
83
|
+
export { generateTrebiredFrontendScss };
|
|
84
|
+
//# sourceMappingURL=scss.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scss.js","sourceRoot":"","sources":["../../../src/config/scss.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
declare const CONFIG_ERROR_PREFIX = "trebired-frontend-invalid-config";
|
|
2
|
+
declare function invalidConfig(message: string): Error;
|
|
3
|
+
declare function isPlainObject(value: unknown): value is Record<string, unknown>;
|
|
4
|
+
declare function assertPlainObject(value: unknown, pathLabel: string): Record<string, unknown>;
|
|
5
|
+
declare function normalizeBoolean(value: unknown, defaultValue: boolean, pathLabel: string): boolean;
|
|
6
|
+
declare function cssString(value: unknown): string;
|
|
7
|
+
declare function cssComment(value: unknown): string;
|
|
8
|
+
export { CONFIG_ERROR_PREFIX, assertPlainObject, cssComment, cssString, invalidConfig, isPlainObject, normalizeBoolean, };
|
|
9
|
+
//# sourceMappingURL=shared.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../src/config/shared.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,mBAAmB,qCAAqC,CAAC;AAE/D,iBAAS,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,CAE7C;AAED,iBAAS,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEvE;AAED,iBAAS,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAGrF;AAED,iBAAS,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAI3F;AAED,iBAAS,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEzC;AAED,iBAAS,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAE1C;AAED,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,UAAU,EACV,SAAS,EACT,aAAa,EACb,aAAa,EACb,gBAAgB,GACjB,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
const CONFIG_ERROR_PREFIX = "trebired-frontend-invalid-config";
|
|
2
|
+
function invalidConfig(message) {
|
|
3
|
+
return new Error(`${CONFIG_ERROR_PREFIX} :: ${message}`);
|
|
4
|
+
}
|
|
5
|
+
function isPlainObject(value) {
|
|
6
|
+
return Boolean(value && typeof value === "object" && !Array.isArray(value));
|
|
7
|
+
}
|
|
8
|
+
function assertPlainObject(value, pathLabel) {
|
|
9
|
+
if (!isPlainObject(value))
|
|
10
|
+
throw invalidConfig(`${pathLabel} must be an object`);
|
|
11
|
+
return value;
|
|
12
|
+
}
|
|
13
|
+
function normalizeBoolean(value, defaultValue, pathLabel) {
|
|
14
|
+
if (value === undefined)
|
|
15
|
+
return defaultValue;
|
|
16
|
+
if (typeof value !== "boolean")
|
|
17
|
+
throw invalidConfig(`${pathLabel} must be boolean`);
|
|
18
|
+
return value;
|
|
19
|
+
}
|
|
20
|
+
function cssString(value) {
|
|
21
|
+
return JSON.stringify(String(value ?? ""));
|
|
22
|
+
}
|
|
23
|
+
function cssComment(value) {
|
|
24
|
+
return String(value || "").replace(/\*\//gu, "* /");
|
|
25
|
+
}
|
|
26
|
+
export { CONFIG_ERROR_PREFIX, assertPlainObject, cssComment, cssString, invalidConfig, isPlainObject, normalizeBoolean, };
|
|
27
|
+
//# sourceMappingURL=shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../src/config/shared.ts"],"names":[],"mappings":"AAAA,MAAM,mBAAmB,GAAG,kCAAkC,CAAC;AAE/D,SAAS,aAAa,CAAC,OAAe;IACpC,OAAO,IAAI,KAAK,CAAC,GAAG,mBAAmB,OAAO,OAAO,EAAE,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,OAAO,OAAO,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAc,EAAE,SAAiB;IAC1D,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;QAAE,MAAM,aAAa,CAAC,GAAG,SAAS,oBAAoB,CAAC,CAAC;IACjF,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc,EAAE,YAAqB,EAAE,SAAiB;IAChF,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,YAAY,CAAC;IAC7C,IAAI,OAAO,KAAK,KAAK,SAAS;QAAE,MAAM,aAAa,CAAC,GAAG,SAAS,kBAAkB,CAAC,CAAC;IACpF,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,SAAS,CAAC,KAAc;IAC/B,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,SAAS,UAAU,CAAC,KAAc;IAChC,OAAO,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;AACtD,CAAC;AAED,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,UAAU,EACV,SAAS,EACT,aAAa,EACb,aAAa,EACb,gBAAgB,GACjB,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { NormalizedTrebiredFrontendThemeConfig, TrebiredFrontendThemeTokens } from "./types.js";
|
|
2
|
+
declare function normalizeThemeTokens(value: unknown, pathLabel?: string): TrebiredFrontendThemeTokens;
|
|
3
|
+
declare function normalizeThemeConfig(value: unknown): NormalizedTrebiredFrontendThemeConfig;
|
|
4
|
+
declare function flattenThemeTokens(tokens: TrebiredFrontendThemeTokens, prefix?: string[]): Array<[string, string | number]>;
|
|
5
|
+
export { flattenThemeTokens, normalizeThemeConfig, normalizeThemeTokens };
|
|
6
|
+
//# sourceMappingURL=theme.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../../src/config/theme.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,qCAAqC,EAGrC,2BAA2B,EAC5B,MAAM,YAAY,CAAC;AAOpB,iBAAS,oBAAoB,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,SAAiB,GAAG,2BAA2B,CAkBrG;AAgGD,iBAAS,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,qCAAqC,CAWnF;AAED,iBAAS,kBAAkB,CACzB,MAAM,EAAE,2BAA2B,EACnC,MAAM,GAAE,MAAM,EAAO,GACpB,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC,CAYlC;AAED,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,CAAC"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { assertPlainObject, invalidConfig, isPlainObject, normalizeBoolean } from "./shared.js";
|
|
2
|
+
const THEME_MODE_KEY_RE = /^[a-z0-9][a-z0-9_-]*$/iu;
|
|
3
|
+
const THEME_TOKEN_KEY_RE = /^[a-z0-9_-]+$/iu;
|
|
4
|
+
const THEME_MODE_FIELDS = ["label", "scheme", "tokens"];
|
|
5
|
+
const DARK_KEY_RE = /(^|[-_])dark([-_]|$)/iu;
|
|
6
|
+
function normalizeThemeTokens(value, pathLabel = "theme.tokens") {
|
|
7
|
+
if (value === undefined)
|
|
8
|
+
return {};
|
|
9
|
+
const source = assertPlainObject(value, pathLabel);
|
|
10
|
+
const out = {};
|
|
11
|
+
for (const [key, item] of Object.entries(source).sort(([a], [b]) => a.localeCompare(b))) {
|
|
12
|
+
if (!THEME_TOKEN_KEY_RE.test(key)) {
|
|
13
|
+
throw invalidConfig(`${pathLabel}.${key} has an invalid token key`);
|
|
14
|
+
}
|
|
15
|
+
if (isPlainObject(item)) {
|
|
16
|
+
out[key] = normalizeThemeTokens(item, `${pathLabel}.${key}`);
|
|
17
|
+
continue;
|
|
18
|
+
}
|
|
19
|
+
if (typeof item !== "string" && typeof item !== "number") {
|
|
20
|
+
throw invalidConfig(`${pathLabel}.${key} must be a string, number, or token object`);
|
|
21
|
+
}
|
|
22
|
+
out[key] = item;
|
|
23
|
+
}
|
|
24
|
+
return out;
|
|
25
|
+
}
|
|
26
|
+
function normalizeThemeModeKey(key) {
|
|
27
|
+
const normalized = String(key || "").trim().toLowerCase();
|
|
28
|
+
if (!THEME_MODE_KEY_RE.test(normalized)) {
|
|
29
|
+
throw invalidConfig(`theme.modes.${key} must start with a letter or number and contain only letters, numbers, underscores, or hyphens`);
|
|
30
|
+
}
|
|
31
|
+
return normalized;
|
|
32
|
+
}
|
|
33
|
+
function normalizeThemeModeScheme(value, key) {
|
|
34
|
+
if (value === undefined)
|
|
35
|
+
return DARK_KEY_RE.test(key) ? "dark" : "light";
|
|
36
|
+
if (value !== "dark" && value !== "light") {
|
|
37
|
+
throw invalidConfig(`theme.modes.${key}.scheme must be "dark" or "light"`);
|
|
38
|
+
}
|
|
39
|
+
return value;
|
|
40
|
+
}
|
|
41
|
+
function normalizeThemeModeLabel(value, key) {
|
|
42
|
+
if (value === undefined) {
|
|
43
|
+
const words = key.replace(/[-_]+/gu, " ");
|
|
44
|
+
return words.charAt(0).toUpperCase() + words.slice(1);
|
|
45
|
+
}
|
|
46
|
+
if (typeof value !== "string" || !value.trim()) {
|
|
47
|
+
throw invalidConfig(`theme.modes.${key}.label must be a non-empty string`);
|
|
48
|
+
}
|
|
49
|
+
return value.trim();
|
|
50
|
+
}
|
|
51
|
+
function normalizeThemeMode(rawKey, source) {
|
|
52
|
+
const key = normalizeThemeModeKey(rawKey);
|
|
53
|
+
for (const field of Object.keys(source)) {
|
|
54
|
+
if (!THEME_MODE_FIELDS.includes(field)) {
|
|
55
|
+
throw invalidConfig(`theme.modes.${key}.${field} is not supported; declare custom properties under theme.modes.${key}.tokens`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return {
|
|
59
|
+
key,
|
|
60
|
+
label: normalizeThemeModeLabel(source.label, key),
|
|
61
|
+
scheme: normalizeThemeModeScheme(source.scheme, key),
|
|
62
|
+
tokens: normalizeThemeTokens(source.tokens, `theme.modes.${key}.tokens`),
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
function themeModeEntries(value) {
|
|
66
|
+
if (!Array.isArray(value)) {
|
|
67
|
+
return Object.entries(assertPlainObject(value, "theme.modes")).map(([key, item]) => {
|
|
68
|
+
return [key, assertPlainObject(item, `theme.modes.${key}`)];
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
return value.map((item, index) => {
|
|
72
|
+
const { key, ...rest } = assertPlainObject(item, `theme.modes[${index}]`);
|
|
73
|
+
if (typeof key !== "string" || !key.trim()) {
|
|
74
|
+
throw invalidConfig(`theme.modes[${index}].key must be a non-empty string`);
|
|
75
|
+
}
|
|
76
|
+
return [key, rest];
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
function normalizeThemeModes(value) {
|
|
80
|
+
if (value === undefined)
|
|
81
|
+
return [];
|
|
82
|
+
const modes = [];
|
|
83
|
+
for (const [key, source] of themeModeEntries(value)) {
|
|
84
|
+
const mode = normalizeThemeMode(key, source);
|
|
85
|
+
if (modes.some((existing) => existing.key === mode.key)) {
|
|
86
|
+
throw invalidConfig(`theme.modes.${mode.key} is declared more than once`);
|
|
87
|
+
}
|
|
88
|
+
modes.push(mode);
|
|
89
|
+
}
|
|
90
|
+
return modes;
|
|
91
|
+
}
|
|
92
|
+
function resolveDeclaredMode(modes, value, pathLabel) {
|
|
93
|
+
if (value === undefined || value === "")
|
|
94
|
+
return "";
|
|
95
|
+
const key = String(value).trim().toLowerCase();
|
|
96
|
+
if (!modes.some((mode) => mode.key === key)) {
|
|
97
|
+
throw invalidConfig(`${pathLabel} must name a mode declared in theme.modes`);
|
|
98
|
+
}
|
|
99
|
+
return key;
|
|
100
|
+
}
|
|
101
|
+
function resolveSchemeMode(modes, value, scheme, pathLabel) {
|
|
102
|
+
const explicit = resolveDeclaredMode(modes, value, pathLabel);
|
|
103
|
+
if (explicit)
|
|
104
|
+
return explicit;
|
|
105
|
+
return modes.find((mode) => mode.scheme === scheme)?.key || "";
|
|
106
|
+
}
|
|
107
|
+
function normalizeThemeConfig(value) {
|
|
108
|
+
const source = value === undefined ? {} : assertPlainObject(value, "theme");
|
|
109
|
+
const modes = normalizeThemeModes(source.modes);
|
|
110
|
+
return {
|
|
111
|
+
cssVariables: normalizeBoolean(source.cssVariables, true, "theme.cssVariables"),
|
|
112
|
+
dark: resolveSchemeMode(modes, source.dark, "dark", "theme.dark"),
|
|
113
|
+
defaultMode: resolveDeclaredMode(modes, source.defaultMode, "theme.defaultMode"),
|
|
114
|
+
light: resolveSchemeMode(modes, source.light, "light", "theme.light"),
|
|
115
|
+
modes,
|
|
116
|
+
tokens: normalizeThemeTokens(source.tokens),
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
function flattenThemeTokens(tokens, prefix = []) {
|
|
120
|
+
const out = [];
|
|
121
|
+
for (const [key, value] of Object.entries(tokens).sort(([a], [b]) => a.localeCompare(b))) {
|
|
122
|
+
if (isPlainObject(value)) {
|
|
123
|
+
out.push(...flattenThemeTokens(value, [...prefix, key]));
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
if (typeof value === "string" || typeof value === "number") {
|
|
127
|
+
out.push([[...prefix, key].join("-"), value]);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return out;
|
|
131
|
+
}
|
|
132
|
+
export { flattenThemeTokens, normalizeThemeConfig, normalizeThemeTokens };
|
|
133
|
+
//# sourceMappingURL=theme.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme.js","sourceRoot":"","sources":["../../../src/config/theme.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
type TrebiredFrontendIconPack = "remixicon" | "simple-icons";
|
|
2
|
+
type TrebiredFrontendSystemKey = "actions" | "flash" | "fullscreen" | "icons" | "inputs" | "layer" | "modal" | "popover" | "progress" | "theme" | "tooltip";
|
|
3
|
+
type TrebiredFrontendThemeTokens = Record<string, unknown>;
|
|
4
|
+
type TrebiredFrontendThemeModeScheme = "dark" | "light";
|
|
5
|
+
type TrebiredFrontendThemeMode = {
|
|
6
|
+
label?: string;
|
|
7
|
+
scheme?: TrebiredFrontendThemeModeScheme;
|
|
8
|
+
tokens?: TrebiredFrontendThemeTokens;
|
|
9
|
+
};
|
|
10
|
+
type TrebiredFrontendThemeConfig = {
|
|
11
|
+
cssVariables?: boolean;
|
|
12
|
+
dark?: string;
|
|
13
|
+
defaultMode?: string;
|
|
14
|
+
light?: string;
|
|
15
|
+
modes?: Record<string, TrebiredFrontendThemeMode>;
|
|
16
|
+
tokens?: TrebiredFrontendThemeTokens;
|
|
17
|
+
};
|
|
18
|
+
type TrebiredFrontendConfig = {
|
|
19
|
+
prefix?: string;
|
|
20
|
+
icons?: {
|
|
21
|
+
endpoint?: string;
|
|
22
|
+
packs?: readonly TrebiredFrontendIconPack[];
|
|
23
|
+
};
|
|
24
|
+
systems?: Partial<Record<TrebiredFrontendSystemKey, boolean>>;
|
|
25
|
+
theme?: TrebiredFrontendThemeConfig;
|
|
26
|
+
};
|
|
27
|
+
type NormalizedTrebiredFrontendThemeMode = {
|
|
28
|
+
key: string;
|
|
29
|
+
label: string;
|
|
30
|
+
scheme: TrebiredFrontendThemeModeScheme;
|
|
31
|
+
tokens: TrebiredFrontendThemeTokens;
|
|
32
|
+
};
|
|
33
|
+
type NormalizedTrebiredFrontendThemeConfig = {
|
|
34
|
+
cssVariables: boolean;
|
|
35
|
+
dark: string;
|
|
36
|
+
defaultMode: string;
|
|
37
|
+
light: string;
|
|
38
|
+
modes: NormalizedTrebiredFrontendThemeMode[];
|
|
39
|
+
tokens: TrebiredFrontendThemeTokens;
|
|
40
|
+
};
|
|
41
|
+
type NormalizedTrebiredFrontendConfig = {
|
|
42
|
+
prefix: string;
|
|
43
|
+
icons: {
|
|
44
|
+
endpoint: string;
|
|
45
|
+
packs: TrebiredFrontendIconPack[];
|
|
46
|
+
};
|
|
47
|
+
systems: Record<TrebiredFrontendSystemKey, boolean>;
|
|
48
|
+
theme: NormalizedTrebiredFrontendThemeConfig;
|
|
49
|
+
};
|
|
50
|
+
type LoadedTrebiredFrontendConfig = {
|
|
51
|
+
config: NormalizedTrebiredFrontendConfig;
|
|
52
|
+
configPath: string | null;
|
|
53
|
+
dependencies: string[];
|
|
54
|
+
generatedScss: string;
|
|
55
|
+
};
|
|
56
|
+
type LoadTrebiredFrontendConfigOptions = {
|
|
57
|
+
configPath?: string;
|
|
58
|
+
defaultIfMissing?: boolean;
|
|
59
|
+
searchFrom?: string;
|
|
60
|
+
};
|
|
61
|
+
export type { LoadTrebiredFrontendConfigOptions, LoadedTrebiredFrontendConfig, NormalizedTrebiredFrontendConfig, NormalizedTrebiredFrontendThemeConfig, NormalizedTrebiredFrontendThemeMode, TrebiredFrontendConfig, TrebiredFrontendIconPack, TrebiredFrontendSystemKey, TrebiredFrontendThemeConfig, TrebiredFrontendThemeMode, TrebiredFrontendThemeModeScheme, TrebiredFrontendThemeTokens, };
|
|
62
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/config/types.ts"],"names":[],"mappings":"AAAA,KAAK,wBAAwB,GAAG,WAAW,GAAG,cAAc,CAAC;AAE7D,KAAK,yBAAyB,GAC1B,SAAS,GACT,OAAO,GACP,YAAY,GACZ,OAAO,GACP,QAAQ,GACR,OAAO,GACP,OAAO,GACP,SAAS,GACT,UAAU,GACV,OAAO,GACP,SAAS,CAAC;AAEd,KAAK,2BAA2B,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE3D,KAAK,+BAA+B,GAAG,MAAM,GAAG,OAAO,CAAC;AAExD,KAAK,yBAAyB,GAAG;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,+BAA+B,CAAC;IACzC,MAAM,CAAC,EAAE,2BAA2B,CAAC;CACtC,CAAC;AAEF,KAAK,2BAA2B,GAAG;IACjC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,yBAAyB,CAAC,CAAC;IAClD,MAAM,CAAC,EAAE,2BAA2B,CAAC;CACtC,CAAC;AAEF,KAAK,sBAAsB,GAAG;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE;QACN,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,KAAK,CAAC,EAAE,SAAS,wBAAwB,EAAE,CAAC;KAC7C,CAAC;IACF,OAAO,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,yBAAyB,EAAE,OAAO,CAAC,CAAC,CAAC;IAC9D,KAAK,CAAC,EAAE,2BAA2B,CAAC;CACrC,CAAC;AAEF,KAAK,mCAAmC,GAAG;IACzC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,+BAA+B,CAAC;IACxC,MAAM,EAAE,2BAA2B,CAAC;CACrC,CAAC;AAEF,KAAK,qCAAqC,GAAG;IAC3C,YAAY,EAAE,OAAO,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,mCAAmC,EAAE,CAAC;IAC7C,MAAM,EAAE,2BAA2B,CAAC;CACrC,CAAC;AAEF,KAAK,gCAAgC,GAAG;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE;QACL,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,wBAAwB,EAAE,CAAC;KACnC,CAAC;IACF,OAAO,EAAE,MAAM,CAAC,yBAAyB,EAAE,OAAO,CAAC,CAAC;IACpD,KAAK,EAAE,qCAAqC,CAAC;CAC9C,CAAC;AAEF,KAAK,4BAA4B,GAAG;IAClC,MAAM,EAAE,gCAAgC,CAAC;IACzC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,KAAK,iCAAiC,GAAG;IACvC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,YAAY,EACV,iCAAiC,EACjC,4BAA4B,EAC5B,gCAAgC,EAChC,qCAAqC,EACrC,mCAAmC,EACnC,sBAAsB,EACtB,wBAAwB,EACxB,yBAAyB,EACzB,2BAA2B,EAC3B,yBAAyB,EACzB,+BAA+B,EAC/B,2BAA2B,GAC5B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/config/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { BindRoot } from "../../dom/index.d.ts";
|
|
2
|
+
import type { ThemeModeOptions, ThemeModeScheme } from "./modes.js";
|
|
3
|
+
type ThemeValue = string;
|
|
4
|
+
type ThemePersistenceAdapter = {
|
|
5
|
+
get?: () => Promise<string | null | undefined> | string | null | undefined;
|
|
6
|
+
set?: (theme: ThemeValue) => Promise<unknown> | unknown;
|
|
7
|
+
};
|
|
8
|
+
type ThemeRuntimeOptions = ThemeModeOptions & {
|
|
9
|
+
defaultTheme?: ThemeValue;
|
|
10
|
+
persistence?: ThemePersistenceAdapter;
|
|
11
|
+
};
|
|
12
|
+
type ThemeSyncListener = (root: BindRoot) => void;
|
|
13
|
+
declare function registerThemeSync(listener: ThemeSyncListener): void;
|
|
14
|
+
declare function runThemeSync(root?: BindRoot): void;
|
|
15
|
+
declare function normalizeTheme(value: unknown, options?: ThemeRuntimeOptions): ThemeValue;
|
|
16
|
+
declare function systemThemeKey(options?: ThemeRuntimeOptions): ThemeValue;
|
|
17
|
+
declare function currentDomTheme(options?: ThemeRuntimeOptions): ThemeValue;
|
|
18
|
+
declare function getEffectiveTheme(value?: unknown, options?: ThemeRuntimeOptions): ThemeValue;
|
|
19
|
+
declare function themeScheme(key: unknown, options?: ThemeRuntimeOptions): ThemeModeScheme;
|
|
20
|
+
declare function applyTheme(theme: ThemeValue, options?: ThemeRuntimeOptions): ThemeValue;
|
|
21
|
+
declare function readPersistedTheme(adapter?: ThemePersistenceAdapter, options?: ThemeRuntimeOptions): Promise<ThemeValue>;
|
|
22
|
+
declare function setTheme(theme: ThemeValue, options?: ThemeRuntimeOptions): Promise<ThemeValue>;
|
|
23
|
+
declare function nextTheme(options?: ThemeRuntimeOptions): ThemeValue;
|
|
24
|
+
export { applyTheme, currentDomTheme, getEffectiveTheme, nextTheme, normalizeTheme, readPersistedTheme, registerThemeSync, runThemeSync, setTheme, systemThemeKey, themeScheme, };
|
|
25
|
+
export type { ThemePersistenceAdapter, ThemeRuntimeOptions, ThemeSyncListener, ThemeValue };
|
|
26
|
+
//# sourceMappingURL=apply.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apply.d.ts","sourceRoot":"","sources":["../../../src/theme/apply.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAG9C,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEpE,KAAK,UAAU,GAAG,MAAM,CAAC;AAEzB,KAAK,uBAAuB,GAAG;IAC7B,GAAG,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC3E,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;CACzD,CAAC;AAEF,KAAK,mBAAmB,GAAG,gBAAgB,GAAG;IAC5C,YAAY,CAAC,EAAE,UAAU,CAAC;IAC1B,WAAW,CAAC,EAAE,uBAAuB,CAAC;CACvC,CAAC;AAEF,KAAK,iBAAiB,GAAG,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC;AAIlD,iBAAS,iBAAiB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAE5D;AAED,iBAAS,YAAY,CAAC,IAAI,GAAE,QAAmB,GAAG,IAAI,CAErD;AAED,iBAAS,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,GAAE,mBAAwB,GAAG,UAAU,CAGrF;AAUD,iBAAS,cAAc,CAAC,OAAO,GAAE,mBAAwB,GAAG,UAAU,CAGrE;AAED,iBAAS,eAAe,CAAC,OAAO,GAAE,mBAAwB,GAAG,UAAU,CAGtE;AAED,iBAAS,iBAAiB,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,OAAO,GAAE,mBAAwB,GAAG,UAAU,CAEzF;AAED,iBAAS,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,GAAE,mBAAwB,GAAG,eAAe,CAErF;AAWD,iBAAS,UAAU,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,GAAE,mBAAwB,GAAG,UAAU,CAWpF;AAED,iBAAe,kBAAkB,CAC/B,OAAO,CAAC,EAAE,uBAAuB,EACjC,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,UAAU,CAAC,CAOrB;AAED,iBAAe,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,UAAU,CAAC,CASjG;AAED,iBAAS,SAAS,CAAC,OAAO,GAAE,mBAAwB,GAAG,UAAU,CAIhE;AAED,OAAO,EACL,UAAU,EACV,eAAe,EACf,iBAAiB,EACjB,SAAS,EACT,cAAc,EACd,kBAAkB,EAClB,iBAAiB,EACjB,YAAY,EACZ,QAAQ,EACR,cAAc,EACd,WAAW,GACZ,CAAC;AACF,YAAY,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,UAAU,EAAE,CAAC"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { THEME_ATTR, THEME_CHANGE_EVENT } from "./constants.js";
|
|
2
|
+
import { findThemeMode, getThemeModes, themeModeKeyOf } from "./modes.js";
|
|
3
|
+
const themeSyncListeners = new Set();
|
|
4
|
+
function registerThemeSync(listener) {
|
|
5
|
+
themeSyncListeners.add(listener);
|
|
6
|
+
}
|
|
7
|
+
function runThemeSync(root = document) {
|
|
8
|
+
themeSyncListeners.forEach((listener) => listener(root));
|
|
9
|
+
}
|
|
10
|
+
function normalizeTheme(value, options = {}) {
|
|
11
|
+
const key = themeModeKeyOf(value);
|
|
12
|
+
return key && findThemeMode(key, options) ? key : "";
|
|
13
|
+
}
|
|
14
|
+
function systemPrefersLight() {
|
|
15
|
+
try {
|
|
16
|
+
return Boolean(window.matchMedia?.("(prefers-color-scheme: light)").matches);
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
function systemThemeKey(options = {}) {
|
|
23
|
+
const registry = getThemeModes(options);
|
|
24
|
+
return systemPrefersLight() ? registry.light : registry.dark;
|
|
25
|
+
}
|
|
26
|
+
function currentDomTheme(options = {}) {
|
|
27
|
+
if (typeof document === "undefined")
|
|
28
|
+
return "";
|
|
29
|
+
return normalizeTheme(document.documentElement.getAttribute(THEME_ATTR), options);
|
|
30
|
+
}
|
|
31
|
+
function getEffectiveTheme(value, options = {}) {
|
|
32
|
+
return normalizeTheme(value, options) || currentDomTheme(options) || systemThemeKey(options);
|
|
33
|
+
}
|
|
34
|
+
function themeScheme(key, options = {}) {
|
|
35
|
+
return findThemeMode(key, options)?.scheme || "light";
|
|
36
|
+
}
|
|
37
|
+
function dispatchThemeChange(theme, themeKey) {
|
|
38
|
+
if (typeof window === "undefined")
|
|
39
|
+
return;
|
|
40
|
+
window.dispatchEvent(new CustomEvent(THEME_CHANGE_EVENT, {
|
|
41
|
+
detail: { theme, themeKey },
|
|
42
|
+
}));
|
|
43
|
+
}
|
|
44
|
+
function applyTheme(theme, options = {}) {
|
|
45
|
+
if (typeof document === "undefined")
|
|
46
|
+
return getEffectiveTheme(theme, options);
|
|
47
|
+
const normalized = normalizeTheme(theme, options);
|
|
48
|
+
const next = normalized || systemThemeKey(options);
|
|
49
|
+
const previous = currentDomTheme(options);
|
|
50
|
+
document.documentElement.setAttribute(THEME_ATTR, next);
|
|
51
|
+
document.documentElement.style.colorScheme = themeScheme(next, options);
|
|
52
|
+
document.body?.setAttribute(THEME_ATTR, next);
|
|
53
|
+
if (previous !== next)
|
|
54
|
+
dispatchThemeChange(normalized, next);
|
|
55
|
+
runThemeSync(document);
|
|
56
|
+
return next;
|
|
57
|
+
}
|
|
58
|
+
async function readPersistedTheme(adapter, options = {}) {
|
|
59
|
+
if (!adapter?.get)
|
|
60
|
+
return "";
|
|
61
|
+
try {
|
|
62
|
+
return normalizeTheme(await adapter.get(), options);
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
return "";
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
async function setTheme(theme, options = {}) {
|
|
69
|
+
const normalized = normalizeTheme(theme, options);
|
|
70
|
+
applyTheme(normalized, options);
|
|
71
|
+
if (options.persistence?.set) {
|
|
72
|
+
try {
|
|
73
|
+
await options.persistence.set(normalized);
|
|
74
|
+
}
|
|
75
|
+
catch { }
|
|
76
|
+
}
|
|
77
|
+
return getEffectiveTheme(normalized, options);
|
|
78
|
+
}
|
|
79
|
+
function nextTheme(options = {}) {
|
|
80
|
+
const keys = getThemeModes(options).modes.map((mode) => mode.key);
|
|
81
|
+
const index = keys.indexOf(getEffectiveTheme(undefined, options));
|
|
82
|
+
return keys[(index + 1) % keys.length] || keys[0];
|
|
83
|
+
}
|
|
84
|
+
export { applyTheme, currentDomTheme, getEffectiveTheme, nextTheme, normalizeTheme, readPersistedTheme, registerThemeSync, runThemeSync, setTheme, systemThemeKey, themeScheme, };
|
|
85
|
+
//# sourceMappingURL=apply.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apply.js","sourceRoot":"","sources":["../../../src/theme/apply.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boot.d.ts","sourceRoot":"","sources":["../../../src/theme/boot.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAMnD,iBAAS,qBAAqB,CAAC,KAAK,GAAE,MAAW,EAAE,OAAO,GAAE,gBAAqB,GAAG,MAAM,CAezF;AAED,OAAO,EAAE,qBAAqB,EAAE,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { THEME_ATTR, THEME_MODES_GLOBAL_KEY } from "./constants.js";
|
|
2
|
+
import { getThemeModes, themeModeKeyOf } from "./modes.js";
|
|
3
|
+
function scriptJson(value) {
|
|
4
|
+
return JSON.stringify(value ?? null).replace(/</gu, "\\u003c");
|
|
5
|
+
}
|
|
6
|
+
function createThemeBootScript(theme = "", options = {}) {
|
|
7
|
+
const registry = getThemeModes(options);
|
|
8
|
+
const schemes = Object.fromEntries(registry.modes.map((mode) => [mode.key, mode.scheme]));
|
|
9
|
+
return [
|
|
10
|
+
"(function(){",
|
|
11
|
+
`var r=${scriptJson(registry)},s=${scriptJson(schemes)};`,
|
|
12
|
+
`try{window[Symbol.for(${scriptJson(THEME_MODES_GLOBAL_KEY)})]=r}catch(e){}`,
|
|
13
|
+
`var t=${scriptJson(themeModeKeyOf(theme))};`,
|
|
14
|
+
"if(!s[t])t='';",
|
|
15
|
+
"var p=false;try{p=!!(window.matchMedia&&window.matchMedia('(prefers-color-scheme: light)').matches)}catch(e){}",
|
|
16
|
+
"var k=t||(p?r.light:r.dark);",
|
|
17
|
+
`document.documentElement.setAttribute(${scriptJson(THEME_ATTR)},k);`,
|
|
18
|
+
"document.documentElement.style.colorScheme=s[k]||'light';",
|
|
19
|
+
"})();",
|
|
20
|
+
].join("");
|
|
21
|
+
}
|
|
22
|
+
export { createThemeBootScript };
|
|
23
|
+
//# sourceMappingURL=boot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boot.js","sourceRoot":"","sources":["../../../src/theme/boot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAG3D,SAAS,UAAU,CAAC,KAAc;IAChC,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;AACjE,CAAC;AAED,SAAS,qBAAqB,CAAC,QAAgB,EAAE,EAAE,UAA4B,EAAE;IAC/E,MAAM,QAAQ,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC1F,OAAO;QACL,cAAc;QACd,SAAS,UAAU,CAAC,QAAQ,CAAC,MAAM,UAAU,CAAC,OAAO,CAAC,GAAG;QACzD,yBAAyB,UAAU,CAAC,sBAAsB,CAAC,iBAAiB;QAC5E,SAAS,UAAU,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,GAAG;QAC7C,gBAAgB;QAChB,gHAAgH;QAChH,8BAA8B;QAC9B,yCAAyC,UAAU,CAAC,UAAU,CAAC,MAAM;QACrE,2DAA2D;QAC3D,OAAO;KACR,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACb,CAAC;AAED,OAAO,EAAE,qBAAqB,EAAE,CAAC"}
|
|
@@ -1,14 +1,22 @@
|
|
|
1
|
-
import type { ButtonHTMLAttributes, ScriptHTMLAttributes } from "react";
|
|
2
|
-
import { type ThemeValue } from "../../../theme/index.d.ts";
|
|
1
|
+
import type { ButtonHTMLAttributes, HTMLAttributes, ScriptHTMLAttributes } from "react";
|
|
2
|
+
import { type ThemeModeOptions, type ThemeValue } from "../../../theme/index.d.ts";
|
|
3
3
|
type ThemeToggleProps = ButtonHTMLAttributes<HTMLButtonElement> & {
|
|
4
4
|
darkLabel?: string;
|
|
5
|
+
labels?: Record<string, string>;
|
|
5
6
|
lightLabel?: string;
|
|
6
7
|
};
|
|
7
|
-
type ThemeBootScriptProps = ScriptHTMLAttributes<HTMLScriptElement> & {
|
|
8
|
+
type ThemeBootScriptProps = ScriptHTMLAttributes<HTMLScriptElement> & ThemeModeOptions & {
|
|
8
9
|
theme?: ThemeValue;
|
|
9
10
|
};
|
|
11
|
+
type ThemeSelectProps = Omit<HTMLAttributes<HTMLElement>, "defaultValue"> & ThemeModeOptions & {
|
|
12
|
+
label?: string;
|
|
13
|
+
name?: string;
|
|
14
|
+
value?: ThemeValue;
|
|
15
|
+
variant?: "buttons" | "select";
|
|
16
|
+
};
|
|
10
17
|
declare function ThemeToggle(props: ThemeToggleProps): import("react").JSX.Element;
|
|
18
|
+
declare function ThemeSelect(props: ThemeSelectProps): import("react").JSX.Element;
|
|
11
19
|
declare function ThemeBootScript(props: ThemeBootScriptProps): import("react").JSX.Element;
|
|
12
|
-
export { ThemeBootScript, ThemeToggle };
|
|
13
|
-
export type { ThemeBootScriptProps, ThemeToggleProps };
|
|
20
|
+
export { ThemeBootScript, ThemeSelect, ThemeToggle };
|
|
21
|
+
export type { ThemeBootScriptProps, ThemeSelectProps, ThemeToggleProps };
|
|
14
22
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/theme/components/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/theme/components/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAExF,OAAO,EAIL,KAAK,gBAAgB,EACrB,KAAK,UAAU,EAChB,MAAM,eAAe,CAAC;AAEvB,KAAK,gBAAgB,GAAG,oBAAoB,CAAC,iBAAiB,CAAC,GAAG;IAChE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,KAAK,oBAAoB,GAAG,oBAAoB,CAAC,iBAAiB,CAAC,GAAG,gBAAgB,GAAG;IACvF,KAAK,CAAC,EAAE,UAAU,CAAC;CACpB,CAAC;AAEF,KAAK,gBAAgB,GAAG,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,cAAc,CAAC,GAAG,gBAAgB,GAAG;IAC7F,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,OAAO,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC;CAChC,CAAC;AAUF,iBAAS,WAAW,CAAC,KAAK,EAAE,gBAAgB,+BAuB3C;AAED,iBAAS,WAAW,CAAC,KAAK,EAAE,gBAAgB,+BA2C3C;AAED,iBAAS,eAAe,CAAC,KAAK,EAAE,oBAAoB,+BAQnD;AAED,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC;AACrD,YAAY,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,CAAC"}
|
|
@@ -1,13 +1,29 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
import { classNames } from "../../../components/index.js";
|
|
3
|
-
import { createThemeBootScript } from "../../../theme/index.js";
|
|
3
|
+
import { createThemeBootScript, getThemeModes, normalizeTheme, } from "../../../theme/index.js";
|
|
4
|
+
function themeLabelAttributes(labels) {
|
|
5
|
+
const attributes = {};
|
|
6
|
+
for (const [key, label] of Object.entries(labels || {})) {
|
|
7
|
+
attributes[`data-tbf-theme-${key}-label`] = label;
|
|
8
|
+
}
|
|
9
|
+
return attributes;
|
|
10
|
+
}
|
|
4
11
|
function ThemeToggle(props) {
|
|
5
|
-
const { children, className, darkLabel = "Dark", lightLabel = "Light", type = "button", ...rest } = props;
|
|
6
|
-
return (_jsx("button", { ...rest, className: classNames("tbf-theme-button", className), "data-tbf-theme-button": "", "data-tbf-theme-dark-label": darkLabel, "data-tbf-theme-light-label": lightLabel, type: type, children: children || _jsx("span", { "data-tbf-theme-label": "", children: lightLabel }) }));
|
|
12
|
+
const { children, className, darkLabel = "Dark", labels, lightLabel = "Light", type = "button", ...rest } = props;
|
|
13
|
+
return (_jsx("button", { ...rest, ...themeLabelAttributes(labels), className: classNames("tbf-theme-button", className), "data-tbf-theme-button": "", "data-tbf-theme-dark-label": darkLabel, "data-tbf-theme-light-label": lightLabel, type: type, children: children || _jsx("span", { "data-tbf-theme-label": "", children: lightLabel }) }));
|
|
14
|
+
}
|
|
15
|
+
function ThemeSelect(props) {
|
|
16
|
+
const { className, dark, label, light, modes, name, value, variant = "select", ...rest } = props;
|
|
17
|
+
const registry = getThemeModes({ dark, light, modes });
|
|
18
|
+
const current = normalizeTheme(value, { dark, light, modes });
|
|
19
|
+
if (variant === "buttons") {
|
|
20
|
+
return (_jsx("div", { ...rest, "aria-label": label, className: classNames("tbf-theme-select", className), "data-tbf-theme-select": "", role: "radiogroup", children: registry.modes.map((mode) => (_jsx("button", { "aria-checked": mode.key === current, className: "tbf-theme-select__option", "data-tbf-theme-active": mode.key === current ? "true" : "false", "data-tbf-theme-value": mode.key, role: "radio", type: "button", children: mode.label }, mode.key))) }));
|
|
21
|
+
}
|
|
22
|
+
return (_jsx("select", { ...rest, "aria-label": label, className: classNames("tbf-theme-select", className), "data-tbf-theme-select": "", defaultValue: current || undefined, name: name, children: registry.modes.map((mode) => (_jsx("option", { value: mode.key, children: mode.label }, mode.key))) }));
|
|
7
23
|
}
|
|
8
24
|
function ThemeBootScript(props) {
|
|
9
|
-
const { theme = "", ...rest } = props;
|
|
10
|
-
return (_jsx("script", { ...rest, dangerouslySetInnerHTML: { __html: createThemeBootScript(theme) } }));
|
|
25
|
+
const { dark, light, modes, theme = "", ...rest } = props;
|
|
26
|
+
return (_jsx("script", { ...rest, dangerouslySetInnerHTML: { __html: createThemeBootScript(theme, { dark, light, modes }) } }));
|
|
11
27
|
}
|
|
12
|
-
export { ThemeBootScript, ThemeToggle };
|
|
28
|
+
export { ThemeBootScript, ThemeSelect, ThemeToggle };
|
|
13
29
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/theme/components/index.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/theme/components/index.tsx"],"names":[],"mappings":"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"}
|