@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.
Files changed (115) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/README.md +61 -1
  3. package/dist/config/index.d.ts +6 -45
  4. package/dist/config/index.d.ts.map +1 -1
  5. package/dist/config/index.js +19 -252
  6. package/dist/config/index.js.map +1 -1
  7. package/dist/config/module.d.ts +5 -0
  8. package/dist/config/module.d.ts.map +1 -0
  9. package/dist/config/module.js +124 -0
  10. package/dist/config/module.js.map +1 -0
  11. package/dist/config/normalize.d.ts +10 -0
  12. package/dist/config/normalize.d.ts.map +1 -0
  13. package/dist/config/normalize.js +105 -0
  14. package/dist/config/normalize.js.map +1 -0
  15. package/dist/config/scss.d.ts +4 -0
  16. package/dist/config/scss.d.ts.map +1 -0
  17. package/dist/config/scss.js +84 -0
  18. package/dist/config/scss.js.map +1 -0
  19. package/dist/config/shared.d.ts +9 -0
  20. package/dist/config/shared.d.ts.map +1 -0
  21. package/dist/config/shared.js +27 -0
  22. package/dist/config/shared.js.map +1 -0
  23. package/dist/config/theme.d.ts +6 -0
  24. package/dist/config/theme.d.ts.map +1 -0
  25. package/dist/config/theme.js +133 -0
  26. package/dist/config/theme.js.map +1 -0
  27. package/dist/config/types.d.ts +62 -0
  28. package/dist/config/types.d.ts.map +1 -0
  29. package/dist/config/types.js +2 -0
  30. package/dist/config/types.js.map +1 -0
  31. package/dist/src/config/index.d.ts +6 -45
  32. package/dist/src/config/index.d.ts.map +1 -1
  33. package/dist/src/config/index.js +19 -252
  34. package/dist/src/config/index.js.map +1 -1
  35. package/dist/src/config/module.d.ts +5 -0
  36. package/dist/src/config/module.d.ts.map +1 -0
  37. package/dist/src/config/module.js +124 -0
  38. package/dist/src/config/module.js.map +1 -0
  39. package/dist/src/config/normalize.d.ts +10 -0
  40. package/dist/src/config/normalize.d.ts.map +1 -0
  41. package/dist/src/config/normalize.js +105 -0
  42. package/dist/src/config/normalize.js.map +1 -0
  43. package/dist/src/config/scss.d.ts +4 -0
  44. package/dist/src/config/scss.d.ts.map +1 -0
  45. package/dist/src/config/scss.js +84 -0
  46. package/dist/src/config/scss.js.map +1 -0
  47. package/dist/src/config/shared.d.ts +9 -0
  48. package/dist/src/config/shared.d.ts.map +1 -0
  49. package/dist/src/config/shared.js +27 -0
  50. package/dist/src/config/shared.js.map +1 -0
  51. package/dist/src/config/theme.d.ts +6 -0
  52. package/dist/src/config/theme.d.ts.map +1 -0
  53. package/dist/src/config/theme.js +133 -0
  54. package/dist/src/config/theme.js.map +1 -0
  55. package/dist/src/config/types.d.ts +62 -0
  56. package/dist/src/config/types.d.ts.map +1 -0
  57. package/dist/src/config/types.js +2 -0
  58. package/dist/src/config/types.js.map +1 -0
  59. package/dist/src/theme/apply.d.ts +26 -0
  60. package/dist/src/theme/apply.d.ts.map +1 -0
  61. package/dist/src/theme/apply.js +85 -0
  62. package/dist/src/theme/apply.js.map +1 -0
  63. package/dist/src/theme/boot.d.ts +4 -0
  64. package/dist/src/theme/boot.d.ts.map +1 -0
  65. package/dist/src/theme/boot.js +23 -0
  66. package/dist/src/theme/boot.js.map +1 -0
  67. package/dist/src/theme/components/index.d.ts +13 -5
  68. package/dist/src/theme/components/index.d.ts.map +1 -1
  69. package/dist/src/theme/components/index.js +22 -6
  70. package/dist/src/theme/components/index.js.map +1 -1
  71. package/dist/src/theme/constants.d.ts +12 -0
  72. package/dist/src/theme/constants.d.ts.map +1 -0
  73. package/dist/src/theme/constants.js +12 -0
  74. package/dist/src/theme/constants.js.map +1 -0
  75. package/dist/src/theme/controls.d.ts +15 -0
  76. package/dist/src/theme/controls.d.ts.map +1 -0
  77. package/dist/src/theme/controls.js +128 -0
  78. package/dist/src/theme/controls.js.map +1 -0
  79. package/dist/src/theme/index.d.ts +10 -24
  80. package/dist/src/theme/index.d.ts.map +1 -1
  81. package/dist/src/theme/index.js +15 -117
  82. package/dist/src/theme/index.js.map +1 -1
  83. package/dist/src/theme/modes.d.ts +36 -0
  84. package/dist/src/theme/modes.d.ts.map +1 -0
  85. package/dist/src/theme/modes.js +107 -0
  86. package/dist/src/theme/modes.js.map +1 -0
  87. package/dist/theme/apply.d.ts +26 -0
  88. package/dist/theme/apply.d.ts.map +1 -0
  89. package/dist/theme/apply.js +85 -0
  90. package/dist/theme/apply.js.map +1 -0
  91. package/dist/theme/boot.d.ts +4 -0
  92. package/dist/theme/boot.d.ts.map +1 -0
  93. package/dist/theme/boot.js +23 -0
  94. package/dist/theme/boot.js.map +1 -0
  95. package/dist/theme/components/index.d.ts +13 -5
  96. package/dist/theme/components/index.d.ts.map +1 -1
  97. package/dist/theme/components/index.js +22 -6
  98. package/dist/theme/components/index.js.map +1 -1
  99. package/dist/theme/constants.d.ts +12 -0
  100. package/dist/theme/constants.d.ts.map +1 -0
  101. package/dist/theme/constants.js +12 -0
  102. package/dist/theme/constants.js.map +1 -0
  103. package/dist/theme/controls.d.ts +15 -0
  104. package/dist/theme/controls.d.ts.map +1 -0
  105. package/dist/theme/controls.js +128 -0
  106. package/dist/theme/controls.js.map +1 -0
  107. package/dist/theme/index.d.ts +10 -24
  108. package/dist/theme/index.d.ts.map +1 -1
  109. package/dist/theme/index.js +15 -117
  110. package/dist/theme/index.js.map +1 -1
  111. package/dist/theme/modes.d.ts +36 -0
  112. package/dist/theme/modes.d.ts.map +1 -0
  113. package/dist/theme/modes.js +107 -0
  114. package/dist/theme/modes.js.map +1 -0
  115. 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":"AAAA,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAQhG,MAAM,iBAAiB,GAAG,yBAAyB,CAAC;AACpD,MAAM,kBAAkB,GAAG,iBAAiB,CAAC;AAC7C,MAAM,iBAAiB,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;AACxD,MAAM,WAAW,GAAG,wBAAwB,CAAC;AAE7C,SAAS,oBAAoB,CAAC,KAAc,EAAE,SAAS,GAAG,cAAc;IACtE,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IACnC,MAAM,MAAM,GAAG,iBAAiB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IACnD,MAAM,GAAG,GAAgC,EAAE,CAAC;IAC5C,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACxF,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAClC,MAAM,aAAa,CAAC,GAAG,SAAS,IAAI,GAAG,2BAA2B,CAAC,CAAC;QACtE,CAAC;QACD,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,GAAG,CAAC,GAAG,CAAC,GAAG,oBAAoB,CAAC,IAAI,EAAE,GAAG,SAAS,IAAI,GAAG,EAAE,CAAC,CAAC;YAC7D,SAAS;QACX,CAAC;QACD,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YACzD,MAAM,aAAa,CAAC,GAAG,SAAS,IAAI,GAAG,4CAA4C,CAAC,CAAC;QACvF,CAAC;QACD,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;IAClB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,qBAAqB,CAAC,GAAW;IACxC,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC1D,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QACxC,MAAM,aAAa,CAAC,eAAe,GAAG,gGAAgG,CAAC,CAAC;IAC1I,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,wBAAwB,CAAC,KAAc,EAAE,GAAW;IAC3D,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;IACzE,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;QAC1C,MAAM,aAAa,CAAC,eAAe,GAAG,mCAAmC,CAAC,CAAC;IAC7E,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,uBAAuB,CAAC,KAAc,EAAE,GAAW;IAC1D,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QAC1C,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACxD,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QAC/C,MAAM,aAAa,CAAC,eAAe,GAAG,mCAAmC,CAAC,CAAC;IAC7E,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;AACtB,CAAC;AAED,SAAS,kBAAkB,CAAC,MAAc,EAAE,MAA+B;IACzE,MAAM,GAAG,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAC1C,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACxC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACvC,MAAM,aAAa,CAAC,eAAe,GAAG,IAAI,KAAK,kEAAkE,GAAG,SAAS,CAAC,CAAC;QACjI,CAAC;IACH,CAAC;IACD,OAAO;QACL,GAAG;QACH,KAAK,EAAE,uBAAuB,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC;QACjD,MAAM,EAAE,wBAAwB,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;QACpD,MAAM,EAAE,oBAAoB,CAAC,MAAM,CAAC,MAAM,EAAE,eAAe,GAAG,SAAS,CAAC;KACzE,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc;IACtC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE;YACjF,OAAO,CAAC,GAAG,EAAE,iBAAiB,CAAC,IAAI,EAAE,eAAe,GAAG,EAAE,CAAC,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QAC/B,MAAM,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,iBAAiB,CAAC,IAAI,EAAE,eAAe,KAAK,GAAG,CAAC,CAAC;QAC1E,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;YAC3C,MAAM,aAAa,CAAC,eAAe,KAAK,kCAAkC,CAAC,CAAC;QAC9E,CAAC;QACD,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACrB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAc;IACzC,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IACnC,MAAM,KAAK,GAA0C,EAAE,CAAC;IACxD,KAAK,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,GAAG,kBAAkB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC7C,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACxD,MAAM,aAAa,CAAC,eAAe,IAAI,CAAC,GAAG,6BAA6B,CAAC,CAAC;QAC5E,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,mBAAmB,CAC1B,KAA4C,EAC5C,KAAc,EACd,SAAiB;IAEjB,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE;QAAE,OAAO,EAAE,CAAC;IACnD,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC/C,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC;QAC5C,MAAM,aAAa,CAAC,GAAG,SAAS,2CAA2C,CAAC,CAAC;IAC/E,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,iBAAiB,CACxB,KAA4C,EAC5C,KAAc,EACd,MAAuC,EACvC,SAAiB;IAEjB,MAAM,QAAQ,GAAG,mBAAmB,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;IAC9D,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9B,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC;AACjE,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAc;IAC1C,MAAM,MAAM,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,iBAAiB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC5E,MAAM,KAAK,GAAG,mBAAmB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAChD,OAAO;QACL,YAAY,EAAE,gBAAgB,CAAC,MAAM,CAAC,YAAY,EAAE,IAAI,EAAE,oBAAoB,CAAC;QAC/E,IAAI,EAAE,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC;QACjE,WAAW,EAAE,mBAAmB,CAAC,KAAK,EAAE,MAAM,CAAC,WAAW,EAAE,mBAAmB,CAAC;QAChF,KAAK,EAAE,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,aAAa,CAAC;QACrE,KAAK;QACL,MAAM,EAAE,oBAAoB,CAAC,MAAM,CAAC,MAAM,CAAC;KAC5C,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CACzB,MAAmC,EACnC,SAAmB,EAAE;IAErB,MAAM,GAAG,GAAqC,EAAE,CAAC;IACjD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACzF,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,GAAG,CAAC,IAAI,CAAC,GAAG,kBAAkB,CAAC,KAAK,EAAE,CAAC,GAAG,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;YACzD,SAAS;QACX,CAAC;QACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC3D,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,CAAC"}
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -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":"AACA,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAiB1E,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAqB,CAAC;AAExD,SAAS,iBAAiB,CAAC,QAA2B;IACpD,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AACnC,CAAC;AAED,SAAS,YAAY,CAAC,OAAiB,QAAQ;IAC7C,kBAAkB,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,cAAc,CAAC,KAAc,EAAE,UAA+B,EAAE;IACvE,MAAM,GAAG,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IAClC,OAAO,GAAG,IAAI,aAAa,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;AACvD,CAAC;AAED,SAAS,kBAAkB;IACzB,IAAI,CAAC;QACH,OAAO,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,+BAA+B,CAAC,CAAC,OAAO,CAAC,CAAC;IAC/E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,UAA+B,EAAE;IACvD,MAAM,QAAQ,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IACxC,OAAO,kBAAkB,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;AAC/D,CAAC;AAED,SAAS,eAAe,CAAC,UAA+B,EAAE;IACxD,IAAI,OAAO,QAAQ,KAAK,WAAW;QAAE,OAAO,EAAE,CAAC;IAC/C,OAAO,cAAc,CAAC,QAAQ,CAAC,eAAe,CAAC,YAAY,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC,CAAC;AACpF,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAe,EAAE,UAA+B,EAAE;IAC3E,OAAO,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,eAAe,CAAC,OAAO,CAAC,IAAI,cAAc,CAAC,OAAO,CAAC,CAAC;AAC/F,CAAC;AAED,SAAS,WAAW,CAAC,GAAY,EAAE,UAA+B,EAAE;IAClE,OAAO,aAAa,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,MAAM,IAAI,OAAO,CAAC;AACxD,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAiB,EAAE,QAAoB;IAClE,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO;IAC1C,MAAM,CAAC,aAAa,CAClB,IAAI,WAAW,CAAC,kBAAkB,EAAE;QAClC,MAAM,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE;KAC5B,CAAC,CACH,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,KAAiB,EAAE,UAA+B,EAAE;IACtE,IAAI,OAAO,QAAQ,KAAK,WAAW;QAAE,OAAO,iBAAiB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC9E,MAAM,UAAU,GAAG,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAClD,MAAM,IAAI,GAAG,UAAU,IAAI,cAAc,CAAC,OAAO,CAAC,CAAC;IACnD,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IAC1C,QAAQ,CAAC,eAAe,CAAC,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IACxD,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,WAAW,GAAG,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACxE,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IAC9C,IAAI,QAAQ,KAAK,IAAI;QAAE,mBAAmB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IAC7D,YAAY,CAAC,QAAQ,CAAC,CAAC;IACvB,OAAO,IAAI,CAAC;AACd,CAAC;AAED,KAAK,UAAU,kBAAkB,CAC/B,OAAiC,EACjC,UAA+B,EAAE;IAEjC,IAAI,CAAC,OAAO,EAAE,GAAG;QAAE,OAAO,EAAE,CAAC;IAC7B,IAAI,CAAC;QACH,OAAO,cAAc,CAAC,MAAM,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,KAAiB,EAAE,UAA+B,EAAE;IAC1E,MAAM,UAAU,GAAG,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAClD,UAAU,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAChC,IAAI,OAAO,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC5C,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACZ,CAAC;IACD,OAAO,iBAAiB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,SAAS,CAAC,UAA+B,EAAE;IAClD,MAAM,IAAI,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClE,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;IAClE,OAAO,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;AACpD,CAAC;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"}
@@ -0,0 +1,4 @@
1
+ import type { ThemeModeOptions } from "./modes.js";
2
+ declare function createThemeBootScript(theme?: string, options?: ThemeModeOptions): string;
3
+ export { createThemeBootScript };
4
+ //# sourceMappingURL=boot.d.ts.map
@@ -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;AAExE,OAAO,EAAyB,KAAK,UAAU,EAAE,MAAM,eAAe,CAAC;AAEvE,KAAK,gBAAgB,GAAG,oBAAoB,CAAC,iBAAiB,CAAC,GAAG;IAChE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,KAAK,oBAAoB,GAAG,oBAAoB,CAAC,iBAAiB,CAAC,GAAG;IACpE,KAAK,CAAC,EAAE,UAAU,CAAC;CACpB,CAAC;AAEF,iBAAS,WAAW,CAAC,KAAK,EAAE,gBAAgB,+BAqB3C;AAED,iBAAS,eAAe,CAAC,KAAK,EAAE,oBAAoB,+BAQnD;AAED,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,CAAC;AACxC,YAAY,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,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,EAAE,qBAAqB,EAAmB,MAAM,eAAe,CAAC;AAWvE,SAAS,WAAW,CAAC,KAAuB;IAC1C,MAAM,EACJ,QAAQ,EACR,SAAS,EACT,SAAS,GAAG,MAAM,EAClB,UAAU,GAAG,OAAO,EACpB,IAAI,GAAG,QAAQ,EACf,GAAG,IAAI,EACR,GAAG,KAAK,CAAC;IACV,OAAO,CACL,oBACM,IAAI,EACR,SAAS,EAAE,UAAU,CAAC,kBAAkB,EAAE,SAAS,CAAC,2BAC9B,EAAE,+BACG,SAAS,gCACR,UAAU,EACtC,IAAI,EAAE,IAAI,YAET,QAAQ,IAAI,uCAA2B,EAAE,YAAE,UAAU,GAAQ,GACvD,CACV,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,KAA2B;IAClD,MAAM,EAAE,KAAK,GAAG,EAAE,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC;IACtC,OAAO,CACL,oBACM,IAAI,EACR,uBAAuB,EAAE,EAAE,MAAM,EAAE,qBAAqB,CAAC,KAAK,CAAC,EAAE,GACjE,CACH,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,CAAC"}
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,EACL,qBAAqB,EACrB,aAAa,EACb,cAAc,GAGf,MAAM,eAAe,CAAC;AAmBvB,SAAS,oBAAoB,CAAC,MAA0C;IACtE,MAAM,UAAU,GAA2B,EAAE,CAAC;IAC9C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,CAAC;QACxD,UAAU,CAAC,kBAAkB,GAAG,QAAQ,CAAC,GAAG,KAAK,CAAC;IACpD,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,WAAW,CAAC,KAAuB;IAC1C,MAAM,EACJ,QAAQ,EACR,SAAS,EACT,SAAS,GAAG,MAAM,EAClB,MAAM,EACN,UAAU,GAAG,OAAO,EACpB,IAAI,GAAG,QAAQ,EACf,GAAG,IAAI,EACR,GAAG,KAAK,CAAC;IACV,OAAO,CACL,oBACM,IAAI,KACJ,oBAAoB,CAAC,MAAM,CAAC,EAChC,SAAS,EAAE,UAAU,CAAC,kBAAkB,EAAE,SAAS,CAAC,2BAC9B,EAAE,+BACG,SAAS,gCACR,UAAU,EACtC,IAAI,EAAE,IAAI,YAET,QAAQ,IAAI,uCAA2B,EAAE,YAAE,UAAU,GAAQ,GACvD,CACV,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,KAAuB;IAC1C,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,GAAG,QAAQ,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC;IACjG,MAAM,QAAQ,GAAG,aAAa,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IACvD,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAC9D,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,OAAO,CACL,iBACM,IAAI,gBACI,KAAK,EACjB,SAAS,EAAE,UAAU,CAAC,kBAAkB,EAAE,SAAS,CAAC,2BAC9B,EAAE,EACxB,IAAI,EAAC,YAAY,YAEhB,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAC5B,iCACgB,IAAI,CAAC,GAAG,KAAK,OAAO,EAClC,SAAS,EAAC,0BAA0B,2BACb,IAAI,CAAC,GAAG,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,0BACxC,IAAI,CAAC,GAAG,EAE9B,IAAI,EAAC,OAAO,EACZ,IAAI,EAAC,QAAQ,YAEZ,IAAI,CAAC,KAAK,IAJN,IAAI,CAAC,GAAG,CAKN,CACV,CAAC,GACE,CACP,CAAC;IACJ,CAAC;IACD,OAAO,CACL,oBACM,IAAI,gBACI,KAAK,EACjB,SAAS,EAAE,UAAU,CAAC,kBAAkB,EAAE,SAAS,CAAC,2BAC9B,EAAE,EACxB,YAAY,EAAE,OAAO,IAAI,SAAS,EAClC,IAAI,EAAE,IAAI,YAET,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAC5B,iBAAuB,KAAK,EAAE,IAAI,CAAC,GAAG,YAAG,IAAI,CAAC,KAAK,IAAtC,IAAI,CAAC,GAAG,CAAwC,CAC9D,CAAC,GACK,CACV,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,KAA2B;IAClD,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,GAAG,EAAE,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC;IAC1D,OAAO,CACL,oBACM,IAAI,EACR,uBAAuB,EAAE,EAAE,MAAM,EAAE,qBAAqB,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,GACzF,CACH,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC"}