@bunnyland/ui-web 0.2.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -3
- package/assets/bunnyland-ui.css +9 -2
- package/assets/bunnyland-ui.js +7 -4
- package/dist/theme.d.ts +1 -1
- package/dist/theme.d.ts.map +1 -1
- package/dist/theme.js +10 -7
- package/dist/theme.js.map +1 -1
- package/package.json +1 -1
- package/src/theme.ts +7 -4
package/README.md
CHANGED
|
@@ -99,7 +99,7 @@ source directory or a checked-in tarball.
|
|
|
99
99
|
The package owns the shared `--bl-*` CSS variables and theme selector helpers. Built-in
|
|
100
100
|
palette names are:
|
|
101
101
|
|
|
102
|
-
- `
|
|
102
|
+
- `midnight`
|
|
103
103
|
- `candy`
|
|
104
104
|
- `earth`
|
|
105
105
|
- `ocean`
|
|
@@ -110,8 +110,9 @@ Each palette follows `prefers-color-scheme` by default. The shared client menu c
|
|
|
110
110
|
Dark or Light appearance, or return to Auto (System). Use `bindThemeSelect(select)` for
|
|
111
111
|
palette selectors, `bindColorSchemeSelect(select)` for appearance selectors, and
|
|
112
112
|
`setTheme(theme)` or `setColorScheme(scheme)` for direct changes. Old paired values such as
|
|
113
|
-
`anime-light` continue to load as migration aliases (`candy` with Light forced)
|
|
114
|
-
should be added as CSS variables before
|
|
113
|
+
`anime-light` continue to load as migration aliases (`candy` with Light forced), as do the
|
|
114
|
+
former `purple-blue` values (`midnight`). New colors should be added as CSS variables before
|
|
115
|
+
clients depend on them.
|
|
115
116
|
|
|
116
117
|
Deployments can add their own theme choices without changing this package:
|
|
117
118
|
|
package/assets/bunnyland-ui.css
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
:root,
|
|
2
2
|
:root.bl-theme-dark,
|
|
3
3
|
:root.bl-theme-purple-blue-dark,
|
|
4
|
-
:root.bl-theme-
|
|
4
|
+
:root.bl-theme-midnight-dark,
|
|
5
|
+
:root.bl-theme-purple-blue,
|
|
6
|
+
:root.bl-theme-midnight {
|
|
5
7
|
color-scheme: dark;
|
|
6
8
|
|
|
7
9
|
--bl-font-mono: 'Courier New', monospace;
|
|
@@ -50,7 +52,9 @@
|
|
|
50
52
|
:root,
|
|
51
53
|
:root.bl-theme-light,
|
|
52
54
|
:root.bl-theme-purple-blue-light,
|
|
53
|
-
:root.bl-theme-
|
|
55
|
+
:root.bl-theme-midnight-light,
|
|
56
|
+
:root.bl-theme-purple-blue,
|
|
57
|
+
:root.bl-theme-midnight {
|
|
54
58
|
|
|
55
59
|
--bl-light-bg: #f4f1ea;
|
|
56
60
|
--bl-light-bg-strong: #ebe6dc;
|
|
@@ -487,6 +491,7 @@
|
|
|
487
491
|
|
|
488
492
|
@media (prefers-color-scheme: light) {
|
|
489
493
|
:root:not([class*="bl-theme-"]):not(.bl-color-scheme-dark),
|
|
494
|
+
:root.bl-theme-midnight:not(.bl-color-scheme-dark),
|
|
490
495
|
:root.bl-theme-purple-blue:not(.bl-color-scheme-dark),
|
|
491
496
|
:root.bl-theme-candy:not(.bl-color-scheme-dark),
|
|
492
497
|
:root.bl-theme-earth:not(.bl-color-scheme-dark),
|
|
@@ -530,6 +535,7 @@
|
|
|
530
535
|
}
|
|
531
536
|
}
|
|
532
537
|
|
|
538
|
+
:root.bl-theme-midnight.bl-color-scheme-light,
|
|
533
539
|
:root.bl-theme-purple-blue.bl-color-scheme-light,
|
|
534
540
|
:root.bl-theme-candy.bl-color-scheme-light,
|
|
535
541
|
:root.bl-theme-earth.bl-color-scheme-light,
|
|
@@ -537,6 +543,7 @@
|
|
|
537
543
|
:root.bl-theme-sunset.bl-color-scheme-light,
|
|
538
544
|
:root.bl-theme-high-contrast.bl-color-scheme-light,
|
|
539
545
|
:root.bl-theme-light,
|
|
546
|
+
:root.bl-theme-midnight-light,
|
|
540
547
|
:root.bl-theme-purple-blue-light,
|
|
541
548
|
:root.bl-theme-anime-light,
|
|
542
549
|
:root.bl-theme-candy-light,
|
package/assets/bunnyland-ui.js
CHANGED
|
@@ -5,16 +5,19 @@
|
|
|
5
5
|
const THEME_CLASS_PREFIX = 'bl-theme-';
|
|
6
6
|
const COLOR_SCHEME_KEY = 'bunnyland.color-scheme';
|
|
7
7
|
const COLOR_SCHEME_CLASS_PREFIX = 'bl-color-scheme-';
|
|
8
|
-
const DEFAULT_THEME = '
|
|
8
|
+
const DEFAULT_THEME = 'midnight';
|
|
9
9
|
const THEME_ALIASES = {
|
|
10
10
|
anime: 'candy',
|
|
11
11
|
'anime-dark': 'candy-dark',
|
|
12
12
|
'anime-light': 'candy-light',
|
|
13
|
-
dark: '
|
|
14
|
-
light: '
|
|
13
|
+
dark: 'midnight-dark',
|
|
14
|
+
light: 'midnight-light',
|
|
15
|
+
'purple-blue': 'midnight',
|
|
16
|
+
'purple-blue-dark': 'midnight-dark',
|
|
17
|
+
'purple-blue-light': 'midnight-light',
|
|
15
18
|
};
|
|
16
19
|
const DEFAULT_THEME_OPTIONS = [
|
|
17
|
-
{ value: '
|
|
20
|
+
{ value: 'midnight', label: 'Midnight Blue / Lavender' },
|
|
18
21
|
{ value: 'candy', label: 'Candy Pink / Cyan' },
|
|
19
22
|
{ value: 'earth', label: 'Earth Green / Gold' },
|
|
20
23
|
{ value: 'ocean', label: 'Ocean Teal / Coral' },
|
package/dist/theme.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ export declare const THEME_KEY = "bunnyland.theme";
|
|
|
2
2
|
export declare const THEME_CLASS_PREFIX = "bl-theme-";
|
|
3
3
|
export declare const COLOR_SCHEME_KEY = "bunnyland.color-scheme";
|
|
4
4
|
export declare const COLOR_SCHEME_CLASS_PREFIX = "bl-color-scheme-";
|
|
5
|
-
export declare const DEFAULT_THEME = "
|
|
5
|
+
export declare const DEFAULT_THEME = "midnight";
|
|
6
6
|
export declare const THEME_CHANGE_EVENT = "bunnyland:themechange";
|
|
7
7
|
export interface ThemeOption {
|
|
8
8
|
value: string;
|
package/dist/theme.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../src/theme.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,SAAS,oBAAoB,CAAC;AAC3C,eAAO,MAAM,kBAAkB,cAAc,CAAC;AAC9C,eAAO,MAAM,gBAAgB,2BAA2B,CAAC;AACzD,eAAO,MAAM,yBAAyB,qBAAqB,CAAC;AAC5D,eAAO,MAAM,aAAa,
|
|
1
|
+
{"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../src/theme.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,SAAS,oBAAoB,CAAC;AAC3C,eAAO,MAAM,kBAAkB,cAAc,CAAC;AAC9C,eAAO,MAAM,gBAAgB,2BAA2B,CAAC;AACzD,eAAO,MAAM,yBAAyB,qBAAqB,CAAC;AAC5D,eAAO,MAAM,aAAa,aAAa,CAAC;AACxC,eAAO,MAAM,kBAAkB,0BAA0B,CAAC;AAE1D,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAEpD,eAAO,MAAM,qBAAqB,EAAE,WAAW,EAO9C,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,WAAW,EAAyD,CAAC;AAyEjG,wBAAgB,eAAe,CAAC,MAAM,SAAoC,GAAG,MAAM,GAAG,IAAI,CAKzF;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAGtE;AAED,wBAAgB,YAAY,CAAC,IAAI,GAAE,WAAsC,GAAG,MAAM,CAEjF;AAED,wBAAgB,kBAAkB,CAAC,IAAI,GAAE,WAAsC,GAAG,WAAW,CAE5F;AAkCD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,WAAsC,GAAG,WAAW,CAEtG;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,WAAsC,GAAG,MAAM,CAK3F;AAED,wBAAgB,SAAS,CACvB,IAAI,GAAE,WAAsC,EAC5C,YAAY,SAAgB,EAC5B,MAAM,SAAoC,GACzC,MAAM,CAUR;AAED,wBAAgB,YAAY,IAAI,WAAW,EAAE,CAE5C;AAED,wBAAgB,kBAAkB,IAAI,WAAW,EAAE,CAElD;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,WAAW,GAAG,WAAW,GAAG,IAAI,CAQ3E;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,IAAI,GAAG,SAAS,GAAG,WAAW,EAAE,CAK7F;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI,GAAG;IAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;CAAE,GAAG,IAAI,CAY9G;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI,GAAG;IAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;CAAE,GAAG,IAAI,CAWpH"}
|
package/dist/theme.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { escapeHtml as e, storageGet as t, storageSet as n } from "./widgets.js";
|
|
2
2
|
//#region src/theme.ts
|
|
3
|
-
var r = "bunnyland.theme", i = "bl-theme-", a = "bunnyland.color-scheme", o = "bl-color-scheme-", s = "
|
|
3
|
+
var r = "bunnyland.theme", i = "bl-theme-", a = "bunnyland.color-scheme", o = "bl-color-scheme-", s = "midnight", c = "bunnyland:themechange", l = [
|
|
4
4
|
{
|
|
5
|
-
value: "
|
|
6
|
-
label: "
|
|
5
|
+
value: "midnight",
|
|
6
|
+
label: "Midnight Blue / Lavender"
|
|
7
7
|
},
|
|
8
8
|
{
|
|
9
9
|
value: "candy",
|
|
@@ -29,8 +29,11 @@ var r = "bunnyland.theme", i = "bl-theme-", a = "bunnyland.color-scheme", o = "b
|
|
|
29
29
|
anime: "candy",
|
|
30
30
|
"anime-dark": "candy-dark",
|
|
31
31
|
"anime-light": "candy-light",
|
|
32
|
-
dark: "
|
|
33
|
-
light: "
|
|
32
|
+
dark: "midnight-dark",
|
|
33
|
+
light: "midnight-light",
|
|
34
|
+
"purple-blue": "midnight",
|
|
35
|
+
"purple-blue-dark": "midnight-dark",
|
|
36
|
+
"purple-blue-light": "midnight-light"
|
|
34
37
|
}, f = [
|
|
35
38
|
{
|
|
36
39
|
value: "auto",
|
|
@@ -46,7 +49,7 @@ var r = "bunnyland.theme", i = "bl-theme-", a = "bunnyland.color-scheme", o = "b
|
|
|
46
49
|
}
|
|
47
50
|
], p = /^[a-z0-9][a-z0-9-]*$/, m = /* @__PURE__ */ new Set(), h = /* @__PURE__ */ new Set();
|
|
48
51
|
function g(e) {
|
|
49
|
-
let t = d[String(e || "
|
|
52
|
+
let t = d[String(e || "midnight").trim()] || String(e || "midnight").trim();
|
|
50
53
|
if (v(t)) return {
|
|
51
54
|
theme: t,
|
|
52
55
|
scheme: null
|
|
@@ -131,7 +134,7 @@ function N(e, t = document.documentElement) {
|
|
|
131
134
|
return n.scheme && j(n.scheme, t, !0), A(E(n.theme), t, !0);
|
|
132
135
|
}
|
|
133
136
|
function P(e = document.documentElement, n = s, i = globalThis.location?.search || "") {
|
|
134
|
-
let o = new URLSearchParams(i).get("theme"), c = T(i), l = t(r), u = g(c && o || l || n || "
|
|
137
|
+
let o = new URLSearchParams(i).get("theme"), c = T(i), l = t(r), u = g(c && o || l || n || "midnight"), d = t(a);
|
|
135
138
|
return j(u.scheme || S(d), e, !!(u.scheme || d)), A(E(u.theme), e, !!(c || l && v(u.theme)));
|
|
136
139
|
}
|
|
137
140
|
function F() {
|
package/dist/theme.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"theme.js","names":[],"sources":["../src/theme.ts"],"sourcesContent":["import { escapeHtml, storageGet, storageSet } from './widgets';\n\nexport const THEME_KEY = 'bunnyland.theme';\nexport const THEME_CLASS_PREFIX = 'bl-theme-';\nexport const COLOR_SCHEME_KEY = 'bunnyland.color-scheme';\nexport const COLOR_SCHEME_CLASS_PREFIX = 'bl-color-scheme-';\nexport const DEFAULT_THEME = 'purple-blue';\nexport const THEME_CHANGE_EVENT = 'bunnyland:themechange';\n\nexport interface ThemeOption {\n value: string;\n label: string;\n}\n\nexport type ColorScheme = 'auto' | 'dark' | 'light';\n\nexport const DEFAULT_THEME_OPTIONS: ThemeOption[] = [\n { value: 'purple-blue', label: 'Purple / Blue' },\n { value: 'candy', label: 'Candy Pink / Cyan' },\n { value: 'earth', label: 'Earth Green / Gold' },\n { value: 'ocean', label: 'Ocean Teal / Coral' },\n { value: 'sunset', label: 'Sunset Orange / Plum' },\n { value: 'high-contrast', label: 'High Contrast' },\n];\n\nexport const THEME_OPTIONS: ThemeOption[] = DEFAULT_THEME_OPTIONS.map(option => ({ ...option }));\n\nconst THEME_ALIASES: Record<string, string> = {\n anime: 'candy',\n 'anime-dark': 'candy-dark',\n 'anime-light': 'candy-light',\n dark: 'purple-blue-dark',\n light: 'purple-blue-light',\n};\n\nconst COLOR_SCHEME_OPTIONS: ThemeOption[] = [\n { value: 'auto', label: 'Auto (System)' },\n { value: 'dark', label: 'Dark' },\n { value: 'light', label: 'Light' },\n];\n\nconst THEME_VALUE_PATTERN = /^[a-z0-9][a-z0-9-]*$/;\nconst boundThemeSelects = new Set<HTMLSelectElement>();\nconst boundColorSchemeSelects = new Set<HTMLSelectElement>();\n\nfunction parseThemeSelection(name: string | null | undefined): { scheme: ColorScheme | null; theme: string } {\n const raw = THEME_ALIASES[String(name || DEFAULT_THEME).trim()] || String(name || DEFAULT_THEME).trim();\n if (isKnownTheme(raw)) return { theme: raw, scheme: null };\n const match = raw.match(/^(.*)-(dark|light)$/);\n if (match && isKnownTheme(match[1])) return { theme: match[1], scheme: match[2] as ColorScheme };\n return { theme: raw, scheme: null };\n}\n\nfunction normalizeThemeValue(name: string | null | undefined): string {\n return parseThemeSelection(name).theme;\n}\n\nfunction isKnownTheme(name: string): boolean {\n return THEME_OPTIONS.some(option => option.value === name);\n}\n\nfunction sanitizeThemeOption(option: ThemeOption): ThemeOption | null {\n const value = String(option?.value || '').trim();\n if (!THEME_VALUE_PATTERN.test(value)) return null;\n const label = String(option?.label || value).trim() || value;\n return { value, label };\n}\n\nfunction renderThemeSelect(select: HTMLSelectElement): void {\n const theme = currentTheme();\n select.innerHTML = themeOptions().map(option => `\n <option value=\"${escapeHtml(option.value)}\">${escapeHtml(option.label)}</option>\n `).join('');\n select.value = theme;\n}\n\nfunction refreshThemeSelects(): void {\n for (const select of boundThemeSelects) renderThemeSelect(select);\n}\n\nfunction normalizeColorSchemeValue(name: string | null | undefined): ColorScheme {\n return name === 'dark' || name === 'light' ? name : 'auto';\n}\n\nfunction renderColorSchemeSelect(select: HTMLSelectElement): void {\n select.innerHTML = COLOR_SCHEME_OPTIONS.map(option => `\n <option value=\"${option.value}\">${option.label}</option>\n `).join('');\n select.value = currentColorScheme();\n}\n\nfunction refreshColorSchemeSelects(): void {\n for (const select of boundColorSchemeSelects) renderColorSchemeSelect(select);\n}\n\nexport function themeFromSearch(search = globalThis.location?.search || ''): string | null {\n const requested = new URLSearchParams(search).get('theme');\n if (!requested) return null;\n const theme = normalizeThemeValue(requested);\n return isKnownTheme(theme) ? theme : null;\n}\n\nexport function normalizeTheme(name: string | null | undefined): string {\n const theme = normalizeThemeValue(name);\n return isKnownTheme(theme) ? theme : DEFAULT_THEME;\n}\n\nexport function currentTheme(root: HTMLElement = document.documentElement): string {\n return normalizeTheme(root.dataset.theme);\n}\n\nexport function currentColorScheme(root: HTMLElement = document.documentElement): ColorScheme {\n return normalizeColorSchemeValue(root.dataset.colorScheme);\n}\n\nfunction dispatchThemeChange(root: HTMLElement): void {\n if (typeof root.dispatchEvent === 'function' && typeof CustomEvent === 'function') {\n root.dispatchEvent(new CustomEvent(THEME_CHANGE_EVENT, {\n detail: { colorScheme: currentColorScheme(root), theme: currentTheme(root) },\n }));\n }\n}\n\nfunction applyTheme(theme: string, root: HTMLElement, persist: boolean): string {\n for (const className of [...root.classList]) {\n if (className.startsWith(THEME_CLASS_PREFIX)) root.classList.remove(className);\n }\n root.classList.add(`${THEME_CLASS_PREFIX}${theme}`);\n root.dataset.theme = theme;\n if (persist) storageSet(THEME_KEY, theme);\n refreshThemeSelects();\n dispatchThemeChange(root);\n return theme;\n}\n\nfunction applyColorScheme(scheme: ColorScheme, root: HTMLElement, persist: boolean): ColorScheme {\n for (const className of [...root.classList]) {\n if (className.startsWith(COLOR_SCHEME_CLASS_PREFIX)) root.classList.remove(className);\n }\n if (scheme !== 'auto') root.classList.add(`${COLOR_SCHEME_CLASS_PREFIX}${scheme}`);\n root.dataset.colorScheme = scheme;\n if (persist) storageSet(COLOR_SCHEME_KEY, scheme);\n refreshColorSchemeSelects();\n dispatchThemeChange(root);\n return scheme;\n}\n\nexport function setColorScheme(name: string, root: HTMLElement = document.documentElement): ColorScheme {\n return applyColorScheme(normalizeColorSchemeValue(name), root, true);\n}\n\nexport function setTheme(name: string, root: HTMLElement = document.documentElement): string {\n const selection = parseThemeSelection(name);\n if (selection.scheme) applyColorScheme(selection.scheme, root, true);\n const theme = normalizeTheme(selection.theme);\n return applyTheme(theme, root, true);\n}\n\nexport function initTheme(\n root: HTMLElement = document.documentElement,\n defaultTheme = DEFAULT_THEME,\n search = globalThis.location?.search || '',\n): string {\n const linkedValue = new URLSearchParams(search).get('theme');\n const linkedTheme = themeFromSearch(search);\n const stored = storageGet(THEME_KEY);\n const selection = parseThemeSelection((linkedTheme && linkedValue) || stored || defaultTheme || DEFAULT_THEME);\n const storedScheme = storageGet(COLOR_SCHEME_KEY);\n const scheme = selection.scheme || normalizeColorSchemeValue(storedScheme);\n applyColorScheme(scheme, root, Boolean(selection.scheme || storedScheme));\n const theme = normalizeTheme(selection.theme);\n return applyTheme(theme, root, Boolean(linkedTheme || (stored && isKnownTheme(selection.theme))));\n}\n\nexport function themeOptions(): ThemeOption[] {\n return THEME_OPTIONS.map(option => ({ ...option }));\n}\n\nexport function colorSchemeOptions(): ThemeOption[] {\n return COLOR_SCHEME_OPTIONS.map(option => ({ ...option }));\n}\n\nexport function registerThemeOption(option: ThemeOption): ThemeOption | null {\n const theme = sanitizeThemeOption(option);\n if (!theme) return null;\n const index = THEME_OPTIONS.findIndex(existing => existing.value === theme.value);\n if (index === -1) THEME_OPTIONS.push(theme);\n else THEME_OPTIONS[index] = theme;\n refreshThemeSelects();\n return { ...theme };\n}\n\nexport function registerThemeOptions(options: ThemeOption[] | null | undefined): ThemeOption[] {\n if (!Array.isArray(options)) return [];\n return options\n .map(option => registerThemeOption(option))\n .filter((option): option is ThemeOption => option !== null);\n}\n\nexport function bindThemeSelect(select: HTMLSelectElement | null): { setValue: (value: string) => void } | null {\n if (!select) return null;\n boundThemeSelects.add(select);\n renderThemeSelect(select);\n select.value = initTheme();\n select.addEventListener('change', () => setTheme(select.value));\n return {\n setValue(value: string): void {\n select.value = normalizeTheme(value);\n setTheme(select.value);\n },\n };\n}\n\nexport function bindColorSchemeSelect(select: HTMLSelectElement | null): { setValue: (value: string) => void } | null {\n if (!select) return null;\n boundColorSchemeSelects.add(select);\n renderColorSchemeSelect(select);\n select.addEventListener('change', () => setColorScheme(select.value));\n return {\n setValue(value: string): void {\n select.value = normalizeColorSchemeValue(value);\n setColorScheme(select.value);\n },\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"theme.js","names":[],"sources":["../src/theme.ts"],"sourcesContent":["import { escapeHtml, storageGet, storageSet } from './widgets';\n\nexport const THEME_KEY = 'bunnyland.theme';\nexport const THEME_CLASS_PREFIX = 'bl-theme-';\nexport const COLOR_SCHEME_KEY = 'bunnyland.color-scheme';\nexport const COLOR_SCHEME_CLASS_PREFIX = 'bl-color-scheme-';\nexport const DEFAULT_THEME = 'midnight';\nexport const THEME_CHANGE_EVENT = 'bunnyland:themechange';\n\nexport interface ThemeOption {\n value: string;\n label: string;\n}\n\nexport type ColorScheme = 'auto' | 'dark' | 'light';\n\nexport const DEFAULT_THEME_OPTIONS: ThemeOption[] = [\n { value: 'midnight', label: 'Midnight Blue / Lavender' },\n { value: 'candy', label: 'Candy Pink / Cyan' },\n { value: 'earth', label: 'Earth Green / Gold' },\n { value: 'ocean', label: 'Ocean Teal / Coral' },\n { value: 'sunset', label: 'Sunset Orange / Plum' },\n { value: 'high-contrast', label: 'High Contrast' },\n];\n\nexport const THEME_OPTIONS: ThemeOption[] = DEFAULT_THEME_OPTIONS.map(option => ({ ...option }));\n\nconst THEME_ALIASES: Record<string, string> = {\n anime: 'candy',\n 'anime-dark': 'candy-dark',\n 'anime-light': 'candy-light',\n dark: 'midnight-dark',\n light: 'midnight-light',\n 'purple-blue': 'midnight',\n 'purple-blue-dark': 'midnight-dark',\n 'purple-blue-light': 'midnight-light',\n};\n\nconst COLOR_SCHEME_OPTIONS: ThemeOption[] = [\n { value: 'auto', label: 'Auto (System)' },\n { value: 'dark', label: 'Dark' },\n { value: 'light', label: 'Light' },\n];\n\nconst THEME_VALUE_PATTERN = /^[a-z0-9][a-z0-9-]*$/;\nconst boundThemeSelects = new Set<HTMLSelectElement>();\nconst boundColorSchemeSelects = new Set<HTMLSelectElement>();\n\nfunction parseThemeSelection(name: string | null | undefined): { scheme: ColorScheme | null; theme: string } {\n const raw = THEME_ALIASES[String(name || DEFAULT_THEME).trim()] || String(name || DEFAULT_THEME).trim();\n if (isKnownTheme(raw)) return { theme: raw, scheme: null };\n const match = raw.match(/^(.*)-(dark|light)$/);\n if (match && isKnownTheme(match[1])) return { theme: match[1], scheme: match[2] as ColorScheme };\n return { theme: raw, scheme: null };\n}\n\nfunction normalizeThemeValue(name: string | null | undefined): string {\n return parseThemeSelection(name).theme;\n}\n\nfunction isKnownTheme(name: string): boolean {\n return THEME_OPTIONS.some(option => option.value === name);\n}\n\nfunction sanitizeThemeOption(option: ThemeOption): ThemeOption | null {\n const value = String(option?.value || '').trim();\n if (!THEME_VALUE_PATTERN.test(value)) return null;\n const label = String(option?.label || value).trim() || value;\n return { value, label };\n}\n\nfunction renderThemeSelect(select: HTMLSelectElement): void {\n const theme = currentTheme();\n select.innerHTML = themeOptions().map(option => `\n <option value=\"${escapeHtml(option.value)}\">${escapeHtml(option.label)}</option>\n `).join('');\n select.value = theme;\n}\n\nfunction refreshThemeSelects(): void {\n for (const select of boundThemeSelects) renderThemeSelect(select);\n}\n\nfunction normalizeColorSchemeValue(name: string | null | undefined): ColorScheme {\n return name === 'dark' || name === 'light' ? name : 'auto';\n}\n\nfunction renderColorSchemeSelect(select: HTMLSelectElement): void {\n select.innerHTML = COLOR_SCHEME_OPTIONS.map(option => `\n <option value=\"${option.value}\">${option.label}</option>\n `).join('');\n select.value = currentColorScheme();\n}\n\nfunction refreshColorSchemeSelects(): void {\n for (const select of boundColorSchemeSelects) renderColorSchemeSelect(select);\n}\n\nexport function themeFromSearch(search = globalThis.location?.search || ''): string | null {\n const requested = new URLSearchParams(search).get('theme');\n if (!requested) return null;\n const theme = normalizeThemeValue(requested);\n return isKnownTheme(theme) ? theme : null;\n}\n\nexport function normalizeTheme(name: string | null | undefined): string {\n const theme = normalizeThemeValue(name);\n return isKnownTheme(theme) ? theme : DEFAULT_THEME;\n}\n\nexport function currentTheme(root: HTMLElement = document.documentElement): string {\n return normalizeTheme(root.dataset.theme);\n}\n\nexport function currentColorScheme(root: HTMLElement = document.documentElement): ColorScheme {\n return normalizeColorSchemeValue(root.dataset.colorScheme);\n}\n\nfunction dispatchThemeChange(root: HTMLElement): void {\n if (typeof root.dispatchEvent === 'function' && typeof CustomEvent === 'function') {\n root.dispatchEvent(new CustomEvent(THEME_CHANGE_EVENT, {\n detail: { colorScheme: currentColorScheme(root), theme: currentTheme(root) },\n }));\n }\n}\n\nfunction applyTheme(theme: string, root: HTMLElement, persist: boolean): string {\n for (const className of [...root.classList]) {\n if (className.startsWith(THEME_CLASS_PREFIX)) root.classList.remove(className);\n }\n root.classList.add(`${THEME_CLASS_PREFIX}${theme}`);\n root.dataset.theme = theme;\n if (persist) storageSet(THEME_KEY, theme);\n refreshThemeSelects();\n dispatchThemeChange(root);\n return theme;\n}\n\nfunction applyColorScheme(scheme: ColorScheme, root: HTMLElement, persist: boolean): ColorScheme {\n for (const className of [...root.classList]) {\n if (className.startsWith(COLOR_SCHEME_CLASS_PREFIX)) root.classList.remove(className);\n }\n if (scheme !== 'auto') root.classList.add(`${COLOR_SCHEME_CLASS_PREFIX}${scheme}`);\n root.dataset.colorScheme = scheme;\n if (persist) storageSet(COLOR_SCHEME_KEY, scheme);\n refreshColorSchemeSelects();\n dispatchThemeChange(root);\n return scheme;\n}\n\nexport function setColorScheme(name: string, root: HTMLElement = document.documentElement): ColorScheme {\n return applyColorScheme(normalizeColorSchemeValue(name), root, true);\n}\n\nexport function setTheme(name: string, root: HTMLElement = document.documentElement): string {\n const selection = parseThemeSelection(name);\n if (selection.scheme) applyColorScheme(selection.scheme, root, true);\n const theme = normalizeTheme(selection.theme);\n return applyTheme(theme, root, true);\n}\n\nexport function initTheme(\n root: HTMLElement = document.documentElement,\n defaultTheme = DEFAULT_THEME,\n search = globalThis.location?.search || '',\n): string {\n const linkedValue = new URLSearchParams(search).get('theme');\n const linkedTheme = themeFromSearch(search);\n const stored = storageGet(THEME_KEY);\n const selection = parseThemeSelection((linkedTheme && linkedValue) || stored || defaultTheme || DEFAULT_THEME);\n const storedScheme = storageGet(COLOR_SCHEME_KEY);\n const scheme = selection.scheme || normalizeColorSchemeValue(storedScheme);\n applyColorScheme(scheme, root, Boolean(selection.scheme || storedScheme));\n const theme = normalizeTheme(selection.theme);\n return applyTheme(theme, root, Boolean(linkedTheme || (stored && isKnownTheme(selection.theme))));\n}\n\nexport function themeOptions(): ThemeOption[] {\n return THEME_OPTIONS.map(option => ({ ...option }));\n}\n\nexport function colorSchemeOptions(): ThemeOption[] {\n return COLOR_SCHEME_OPTIONS.map(option => ({ ...option }));\n}\n\nexport function registerThemeOption(option: ThemeOption): ThemeOption | null {\n const theme = sanitizeThemeOption(option);\n if (!theme) return null;\n const index = THEME_OPTIONS.findIndex(existing => existing.value === theme.value);\n if (index === -1) THEME_OPTIONS.push(theme);\n else THEME_OPTIONS[index] = theme;\n refreshThemeSelects();\n return { ...theme };\n}\n\nexport function registerThemeOptions(options: ThemeOption[] | null | undefined): ThemeOption[] {\n if (!Array.isArray(options)) return [];\n return options\n .map(option => registerThemeOption(option))\n .filter((option): option is ThemeOption => option !== null);\n}\n\nexport function bindThemeSelect(select: HTMLSelectElement | null): { setValue: (value: string) => void } | null {\n if (!select) return null;\n boundThemeSelects.add(select);\n renderThemeSelect(select);\n select.value = initTheme();\n select.addEventListener('change', () => setTheme(select.value));\n return {\n setValue(value: string): void {\n select.value = normalizeTheme(value);\n setTheme(select.value);\n },\n };\n}\n\nexport function bindColorSchemeSelect(select: HTMLSelectElement | null): { setValue: (value: string) => void } | null {\n if (!select) return null;\n boundColorSchemeSelects.add(select);\n renderColorSchemeSelect(select);\n select.addEventListener('change', () => setColorScheme(select.value));\n return {\n setValue(value: string): void {\n select.value = normalizeColorSchemeValue(value);\n setColorScheme(select.value);\n },\n };\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
package/src/theme.ts
CHANGED
|
@@ -4,7 +4,7 @@ export const THEME_KEY = 'bunnyland.theme';
|
|
|
4
4
|
export const THEME_CLASS_PREFIX = 'bl-theme-';
|
|
5
5
|
export const COLOR_SCHEME_KEY = 'bunnyland.color-scheme';
|
|
6
6
|
export const COLOR_SCHEME_CLASS_PREFIX = 'bl-color-scheme-';
|
|
7
|
-
export const DEFAULT_THEME = '
|
|
7
|
+
export const DEFAULT_THEME = 'midnight';
|
|
8
8
|
export const THEME_CHANGE_EVENT = 'bunnyland:themechange';
|
|
9
9
|
|
|
10
10
|
export interface ThemeOption {
|
|
@@ -15,7 +15,7 @@ export interface ThemeOption {
|
|
|
15
15
|
export type ColorScheme = 'auto' | 'dark' | 'light';
|
|
16
16
|
|
|
17
17
|
export const DEFAULT_THEME_OPTIONS: ThemeOption[] = [
|
|
18
|
-
{ value: '
|
|
18
|
+
{ value: 'midnight', label: 'Midnight Blue / Lavender' },
|
|
19
19
|
{ value: 'candy', label: 'Candy Pink / Cyan' },
|
|
20
20
|
{ value: 'earth', label: 'Earth Green / Gold' },
|
|
21
21
|
{ value: 'ocean', label: 'Ocean Teal / Coral' },
|
|
@@ -29,8 +29,11 @@ const THEME_ALIASES: Record<string, string> = {
|
|
|
29
29
|
anime: 'candy',
|
|
30
30
|
'anime-dark': 'candy-dark',
|
|
31
31
|
'anime-light': 'candy-light',
|
|
32
|
-
dark: '
|
|
33
|
-
light: '
|
|
32
|
+
dark: 'midnight-dark',
|
|
33
|
+
light: 'midnight-light',
|
|
34
|
+
'purple-blue': 'midnight',
|
|
35
|
+
'purple-blue-dark': 'midnight-dark',
|
|
36
|
+
'purple-blue-light': 'midnight-light',
|
|
34
37
|
};
|
|
35
38
|
|
|
36
39
|
const COLOR_SCHEME_OPTIONS: ThemeOption[] = [
|