@lgtm-hq/turbo-themes 0.12.16
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/LICENSE +21 -0
- package/README.md +231 -0
- package/assets/css/adapters/bulma.css +26 -0
- package/assets/css/themes/bulma-dark.css +90 -0
- package/assets/css/themes/bulma-light.css +90 -0
- package/assets/css/themes/catppuccin-frappe.css +58 -0
- package/assets/css/themes/catppuccin-latte.css +58 -0
- package/assets/css/themes/catppuccin-macchiato.css +58 -0
- package/assets/css/themes/catppuccin-mocha.css +58 -0
- package/assets/css/themes/dracula.css +90 -0
- package/assets/css/themes/github-dark.css +58 -0
- package/assets/css/themes/github-light.css +58 -0
- package/assets/css/turbo-core.css +92 -0
- package/dist/adapters/bootstrap/_utilities.scss +178 -0
- package/dist/adapters/bootstrap/_variables.scss +99 -0
- package/dist/adapters/tailwind/colors.js +133 -0
- package/dist/adapters/tailwind/preset.js +136 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/themes/bulma.d.ts +31 -0
- package/dist/themes/bulma.d.ts.map +1 -0
- package/dist/themes/bulma.js +160 -0
- package/dist/themes/bulma.js.map +1 -0
- package/dist/themes/css.d.ts +4 -0
- package/dist/themes/css.d.ts.map +1 -0
- package/dist/themes/css.js +617 -0
- package/dist/themes/css.js.map +1 -0
- package/dist/themes/packs/bulma.d.ts +12 -0
- package/dist/themes/packs/bulma.d.ts.map +1 -0
- package/dist/themes/packs/bulma.js +285 -0
- package/dist/themes/packs/bulma.js.map +1 -0
- package/dist/themes/packs/catppuccin.synced.d.ts +3 -0
- package/dist/themes/packs/catppuccin.synced.d.ts.map +1 -0
- package/dist/themes/packs/catppuccin.synced.js +340 -0
- package/dist/themes/packs/catppuccin.synced.js.map +1 -0
- package/dist/themes/packs/dracula.d.ts +8 -0
- package/dist/themes/packs/dracula.d.ts.map +1 -0
- package/dist/themes/packs/dracula.js +145 -0
- package/dist/themes/packs/dracula.js.map +1 -0
- package/dist/themes/packs/github.synced.d.ts +10 -0
- package/dist/themes/packs/github.synced.d.ts.map +1 -0
- package/dist/themes/packs/github.synced.js +281 -0
- package/dist/themes/packs/github.synced.js.map +1 -0
- package/dist/themes/registry.d.ts +3 -0
- package/dist/themes/registry.d.ts.map +1 -0
- package/dist/themes/registry.js +16 -0
- package/dist/themes/registry.js.map +1 -0
- package/dist/themes/types.d.ts +172 -0
- package/dist/themes/types.d.ts.map +1 -0
- package/dist/themes/types.js +4 -0
- package/dist/themes/types.js.map +1 -0
- package/dist/tokens/index.d.ts +8 -0
- package/dist/tokens/index.d.ts.map +1 -0
- package/dist/tokens/index.js +9 -0
- package/dist/tokens/index.js.map +1 -0
- package/dist/tokens/style-dictionary/bulma-dark.json +410 -0
- package/dist/tokens/style-dictionary/bulma-light.json +410 -0
- package/dist/tokens/style-dictionary/catppuccin-frappe.json +264 -0
- package/dist/tokens/style-dictionary/catppuccin-latte.json +264 -0
- package/dist/tokens/style-dictionary/catppuccin-macchiato.json +264 -0
- package/dist/tokens/style-dictionary/catppuccin-mocha.json +264 -0
- package/dist/tokens/style-dictionary/dracula.json +409 -0
- package/dist/tokens/style-dictionary/github-dark.json +264 -0
- package/dist/tokens/style-dictionary/github-light.json +264 -0
- package/dist/tokens/style-dictionary/themes.json +2526 -0
- package/dist/tokens/style-dictionary/tokens.json +1050 -0
- package/dist/tokens/tokens-typed.json +218 -0
- package/package.json +180 -0
- package/packages/adapters/bulma/dist/bulma-adapter.css +153 -0
- package/packages/adapters/bulma/dist/index.d.ts +60 -0
- package/packages/adapters/bulma/dist/index.d.ts.map +1 -0
- package/packages/adapters/bulma/dist/index.js +343 -0
- package/packages/adapters/bulma/dist/index.js.map +1 -0
- package/packages/adapters/tailwind/dist/colors.d.ts +32 -0
- package/packages/adapters/tailwind/dist/colors.d.ts.map +1 -0
- package/packages/adapters/tailwind/dist/colors.js +133 -0
- package/packages/adapters/tailwind/dist/colors.js.map +1 -0
- package/packages/adapters/tailwind/dist/preset.d.ts +117 -0
- package/packages/adapters/tailwind/dist/preset.d.ts.map +1 -0
- package/packages/adapters/tailwind/dist/preset.js +136 -0
- package/packages/adapters/tailwind/dist/preset.js.map +1 -0
- package/packages/adapters/tailwind/dist/tsconfig.tsbuildinfo +1 -0
- package/packages/css/dist/base.d.ts +27 -0
- package/packages/css/dist/base.d.ts.map +1 -0
- package/packages/css/dist/base.js +277 -0
- package/packages/css/dist/base.js.map +1 -0
- package/packages/css/dist/components/buttons.css +141 -0
- package/packages/css/dist/components/cards.css +157 -0
- package/packages/css/dist/components/forms.css +109 -0
- package/packages/css/dist/components/navigation.css +175 -0
- package/packages/css/dist/components/notifications.css +192 -0
- package/packages/css/dist/components/progress.css +113 -0
- package/packages/css/dist/components/sidebar.css +537 -0
- package/packages/css/dist/components/tables.css +157 -0
- package/packages/css/dist/components/tabs.css +106 -0
- package/packages/css/dist/components/tags.css +121 -0
- package/packages/css/dist/generator.d.ts +60 -0
- package/packages/css/dist/generator.d.ts.map +1 -0
- package/packages/css/dist/generator.js +267 -0
- package/packages/css/dist/generator.js.map +1 -0
- package/packages/css/dist/index.d.ts +13 -0
- package/packages/css/dist/index.d.ts.map +1 -0
- package/packages/css/dist/index.js +16 -0
- package/packages/css/dist/index.js.map +1 -0
- package/packages/css/dist/syntax.d.ts +29 -0
- package/packages/css/dist/syntax.d.ts.map +1 -0
- package/packages/css/dist/syntax.js +341 -0
- package/packages/css/dist/syntax.js.map +1 -0
- package/packages/css/dist/themes/bulma-dark.css +86 -0
- package/packages/css/dist/themes/bulma-light.css +86 -0
- package/packages/css/dist/themes/catppuccin-frappe.css +61 -0
- package/packages/css/dist/themes/catppuccin-latte.css +61 -0
- package/packages/css/dist/themes/catppuccin-macchiato.css +61 -0
- package/packages/css/dist/themes/catppuccin-mocha.css +61 -0
- package/packages/css/dist/themes/dracula.css +85 -0
- package/packages/css/dist/themes/github-dark.css +61 -0
- package/packages/css/dist/themes/github-light.css +61 -0
- package/packages/css/dist/turbo-base.css +246 -0
- package/packages/css/dist/turbo-components.css +1833 -0
- package/packages/css/dist/turbo-core.css +92 -0
- package/packages/css/dist/turbo-syntax.css +242 -0
- package/packages/css/dist/turbo.css +727 -0
- package/packages/theme-selector/dist/accessibility.d.ts +8 -0
- package/packages/theme-selector/dist/accessibility.d.ts.map +1 -0
- package/packages/theme-selector/dist/accessibility.js +19 -0
- package/packages/theme-selector/dist/accessibility.js.map +1 -0
- package/packages/theme-selector/dist/apply-theme.d.ts +12 -0
- package/packages/theme-selector/dist/apply-theme.d.ts.map +1 -0
- package/packages/theme-selector/dist/apply-theme.js +60 -0
- package/packages/theme-selector/dist/apply-theme.js.map +1 -0
- package/packages/theme-selector/dist/constants.d.ts +28 -0
- package/packages/theme-selector/dist/constants.d.ts.map +1 -0
- package/packages/theme-selector/dist/constants.js +29 -0
- package/packages/theme-selector/dist/constants.js.map +1 -0
- package/packages/theme-selector/dist/dropdown/events.d.ts +9 -0
- package/packages/theme-selector/dist/dropdown/events.d.ts.map +1 -0
- package/packages/theme-selector/dist/dropdown/events.js +120 -0
- package/packages/theme-selector/dist/dropdown/events.js.map +1 -0
- package/packages/theme-selector/dist/dropdown/helpers.d.ts +12 -0
- package/packages/theme-selector/dist/dropdown/helpers.d.ts.map +1 -0
- package/packages/theme-selector/dist/dropdown/helpers.js +25 -0
- package/packages/theme-selector/dist/dropdown/helpers.js.map +1 -0
- package/packages/theme-selector/dist/dropdown/state.d.ts +26 -0
- package/packages/theme-selector/dist/dropdown/state.d.ts.map +1 -0
- package/packages/theme-selector/dist/dropdown/state.js +50 -0
- package/packages/theme-selector/dist/dropdown/state.js.map +1 -0
- package/packages/theme-selector/dist/dropdown/ui.d.ts +46 -0
- package/packages/theme-selector/dist/dropdown/ui.d.ts.map +1 -0
- package/packages/theme-selector/dist/dropdown/ui.js +179 -0
- package/packages/theme-selector/dist/dropdown/ui.js.map +1 -0
- package/packages/theme-selector/dist/errors.d.ts +59 -0
- package/packages/theme-selector/dist/errors.d.ts.map +1 -0
- package/packages/theme-selector/dist/errors.js +127 -0
- package/packages/theme-selector/dist/errors.js.map +1 -0
- package/packages/theme-selector/dist/index.d.ts +25 -0
- package/packages/theme-selector/dist/index.d.ts.map +1 -0
- package/packages/theme-selector/dist/index.js +114 -0
- package/packages/theme-selector/dist/index.js.map +1 -0
- package/packages/theme-selector/dist/navbar.d.ts +13 -0
- package/packages/theme-selector/dist/navbar.d.ts.map +1 -0
- package/packages/theme-selector/dist/navbar.js +75 -0
- package/packages/theme-selector/dist/navbar.js.map +1 -0
- package/packages/theme-selector/dist/storage.d.ts +32 -0
- package/packages/theme-selector/dist/storage.d.ts.map +1 -0
- package/packages/theme-selector/dist/storage.js +100 -0
- package/packages/theme-selector/dist/storage.js.map +1 -0
- package/packages/theme-selector/dist/theme-loader.d.ts +37 -0
- package/packages/theme-selector/dist/theme-loader.d.ts.map +1 -0
- package/packages/theme-selector/dist/theme-loader.js +142 -0
- package/packages/theme-selector/dist/theme-loader.js.map +1 -0
- package/packages/theme-selector/dist/theme-mapper.d.ts +25 -0
- package/packages/theme-selector/dist/theme-mapper.d.ts.map +1 -0
- package/packages/theme-selector/dist/theme-mapper.js +99 -0
- package/packages/theme-selector/dist/theme-mapper.js.map +1 -0
- package/packages/theme-selector/dist/theme-resolver.d.ts +50 -0
- package/packages/theme-selector/dist/theme-resolver.d.ts.map +1 -0
- package/packages/theme-selector/dist/theme-resolver.js +84 -0
- package/packages/theme-selector/dist/theme-resolver.js.map +1 -0
- package/packages/theme-selector/dist/types.d.ts +7 -0
- package/packages/theme-selector/dist/types.d.ts.map +1 -0
- package/packages/theme-selector/dist/types.js +6 -0
- package/packages/theme-selector/dist/types.js.map +1 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accessibility.d.ts","sourceRoot":"","sources":["../src/accessibility.ts"],"names":[],"mappings":"AACA;;GAEG;AAIH;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,QAAQ,GAAG,IAAI,CAMhE"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
/**
|
|
3
|
+
* Accessibility enhancements
|
|
4
|
+
*/
|
|
5
|
+
import { DOM_SELECTORS } from './constants.js';
|
|
6
|
+
/**
|
|
7
|
+
* Enhances accessibility for code blocks
|
|
8
|
+
*/
|
|
9
|
+
export function enhanceAccessibility(documentObj) {
|
|
10
|
+
documentObj.querySelectorAll(DOM_SELECTORS.HIGHLIGHT_PRE).forEach((pre) => {
|
|
11
|
+
if (!pre.hasAttribute('tabindex'))
|
|
12
|
+
pre.setAttribute('tabindex', '0');
|
|
13
|
+
if (!pre.hasAttribute('role'))
|
|
14
|
+
pre.setAttribute('role', 'region');
|
|
15
|
+
if (!pre.hasAttribute('aria-label'))
|
|
16
|
+
pre.setAttribute('aria-label', 'Code block');
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=accessibility.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accessibility.js","sourceRoot":"","sources":["../src/accessibility.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,WAAqB;IACxD,WAAW,CAAC,gBAAgB,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;QACxE,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,UAAU,CAAC;YAAE,GAAG,CAAC,YAAY,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;QACrE,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC;YAAE,GAAG,CAAC,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAClE,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,YAAY,CAAC;YAAE,GAAG,CAAC,YAAY,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;IACpF,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Theme application logic
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Applies a theme to the document
|
|
6
|
+
*/
|
|
7
|
+
export declare function applyTheme(doc: Document, themeId: string): Promise<void>;
|
|
8
|
+
/**
|
|
9
|
+
* Gets the current theme from classes or returns default
|
|
10
|
+
*/
|
|
11
|
+
export declare function getCurrentTheme(doc: Document, defaultTheme: string): string;
|
|
12
|
+
//# sourceMappingURL=apply-theme.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apply-theme.d.ts","sourceRoot":"","sources":["../src/apply-theme.ts"],"names":[],"mappings":"AACA;;GAEG;AAQH;;GAEG;AACH,wBAAsB,UAAU,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA8C9E;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAE3E"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
/**
|
|
3
|
+
* Theme application logic
|
|
4
|
+
*/
|
|
5
|
+
import { DOM_IDS, DOM_SELECTORS, THEME_FAMILIES } from './constants.js';
|
|
6
|
+
import { getBaseUrl, applyThemeClass, loadThemeCSS, resolveAssetPath, getCurrentThemeFromClasses } from './theme-loader.js';
|
|
7
|
+
import { setItemActiveState } from './dropdown/helpers.js';
|
|
8
|
+
import { ThemeErrors, logThemeError } from './errors.js';
|
|
9
|
+
import { resolveTheme } from './theme-resolver.js';
|
|
10
|
+
/**
|
|
11
|
+
* Applies a theme to the document
|
|
12
|
+
*/
|
|
13
|
+
export async function applyTheme(doc, themeId) {
|
|
14
|
+
const theme = resolveTheme(themeId);
|
|
15
|
+
if (!theme) {
|
|
16
|
+
logThemeError(ThemeErrors.NO_THEMES_AVAILABLE());
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
const baseUrl = getBaseUrl(doc);
|
|
20
|
+
// Add loading state to trigger button
|
|
21
|
+
const trigger = doc.getElementById(DOM_IDS.THEME_FLAVOR_TRIGGER);
|
|
22
|
+
if (trigger) {
|
|
23
|
+
trigger.classList.add('is-loading');
|
|
24
|
+
}
|
|
25
|
+
try {
|
|
26
|
+
// Apply theme class immediately (before CSS loading)
|
|
27
|
+
applyThemeClass(doc, theme.id);
|
|
28
|
+
// Load theme CSS
|
|
29
|
+
await loadThemeCSS(doc, theme, baseUrl);
|
|
30
|
+
// Update trigger button icon
|
|
31
|
+
const triggerIcon = doc.getElementById(DOM_IDS.THEME_FLAVOR_TRIGGER_ICON);
|
|
32
|
+
if (triggerIcon && theme.icon) {
|
|
33
|
+
try {
|
|
34
|
+
triggerIcon.src = resolveAssetPath(theme.icon, baseUrl);
|
|
35
|
+
const familyName = THEME_FAMILIES[theme.family].name;
|
|
36
|
+
triggerIcon.alt = `${familyName} ${theme.name}`;
|
|
37
|
+
triggerIcon.title = `${familyName} ${theme.name}`;
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
logThemeError(ThemeErrors.INVALID_ICON_PATH(theme.id));
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
// Update active state in dropdown
|
|
44
|
+
doc.querySelectorAll(DOM_SELECTORS.DROPDOWN_ITEMS).forEach((item) => {
|
|
45
|
+
setItemActiveState(item, item.getAttribute('data-theme-id') === theme.id);
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
finally {
|
|
49
|
+
if (trigger) {
|
|
50
|
+
trigger.classList.remove('is-loading');
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Gets the current theme from classes or returns default
|
|
56
|
+
*/
|
|
57
|
+
export function getCurrentTheme(doc, defaultTheme) {
|
|
58
|
+
return getCurrentThemeFromClasses(doc.documentElement) || defaultTheme;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=apply-theme.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apply-theme.js","sourceRoot":"","sources":["../src/apply-theme.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,YAAY,EAAE,gBAAgB,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AAC5H,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAa,EAAE,OAAe;IAC7D,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACpC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,aAAa,CAAC,WAAW,CAAC,mBAAmB,EAAE,CAAC,CAAC;QACjD,OAAO;IACT,CAAC;IACD,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IAEhC,sCAAsC;IACtC,MAAM,OAAO,GAAG,GAAG,CAAC,cAAc,CAAC,OAAO,CAAC,oBAAoB,CAA6B,CAAC;IAC7F,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IACtC,CAAC;IAED,IAAI,CAAC;QACH,qDAAqD;QACrD,eAAe,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;QAE/B,iBAAiB;QACjB,MAAM,YAAY,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QAExC,6BAA6B;QAC7B,MAAM,WAAW,GAAG,GAAG,CAAC,cAAc,CACpC,OAAO,CAAC,yBAAyB,CACP,CAAC;QAE7B,IAAI,WAAW,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YAC9B,IAAI,CAAC;gBACH,WAAW,CAAC,GAAG,GAAG,gBAAgB,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;gBACxD,MAAM,UAAU,GAAG,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC;gBACrD,WAAW,CAAC,GAAG,GAAG,GAAG,UAAU,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;gBAChD,WAAW,CAAC,KAAK,GAAG,GAAG,UAAU,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YACpD,CAAC;YAAC,MAAM,CAAC;gBACP,aAAa,CAAC,WAAW,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;YACzD,CAAC;QACH,CAAC;QAED,kCAAkC;QAClC,GAAG,CAAC,gBAAgB,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YAClE,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC,CAAC;QAC5E,CAAC,CAAC,CAAC;IACL,CAAC;YAAS,CAAC;QACT,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,GAAa,EAAE,YAAoB;IACjE,OAAO,0BAA0B,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,YAAY,CAAC;AACzE,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Constants for theme selector component
|
|
3
|
+
*/
|
|
4
|
+
import type { ThemeFamily } from './types.js';
|
|
5
|
+
export type { ThemeFamily } from './types.js';
|
|
6
|
+
export declare const STORAGE_KEY = "turbo-theme";
|
|
7
|
+
export declare const LEGACY_STORAGE_KEYS: string[];
|
|
8
|
+
export declare const DEFAULT_THEME = "catppuccin-mocha";
|
|
9
|
+
export declare const DOM_IDS: {
|
|
10
|
+
readonly THEME_FLAVOR_TRIGGER: "theme-flavor-trigger";
|
|
11
|
+
readonly THEME_FLAVOR_TRIGGER_ICON: "theme-flavor-trigger-icon";
|
|
12
|
+
readonly THEME_FLAVOR_MENU: "theme-flavor-menu";
|
|
13
|
+
readonly THEME_FLAVOR_SELECT: "theme-flavor-select";
|
|
14
|
+
};
|
|
15
|
+
export declare const DOM_SELECTORS: {
|
|
16
|
+
readonly DROPDOWN_ITEMS: "#theme-flavor-menu .dropdown-item.theme-item";
|
|
17
|
+
readonly NAVBAR_DROPDOWN: ".navbar-item.has-dropdown";
|
|
18
|
+
readonly NAV_REPORTS: "[data-testid=\"nav-reports\"]";
|
|
19
|
+
readonly NAVBAR_ITEM: ".navbar-item";
|
|
20
|
+
readonly HIGHLIGHT_PRE: ".highlight > pre";
|
|
21
|
+
readonly THEME_CSS_LINKS: "link[id^=\"theme-\"][id$=\"-css\"]";
|
|
22
|
+
};
|
|
23
|
+
export interface ThemeFamilyMeta {
|
|
24
|
+
name: string;
|
|
25
|
+
description: string;
|
|
26
|
+
}
|
|
27
|
+
export declare const THEME_FAMILIES: Record<ThemeFamily, ThemeFamilyMeta>;
|
|
28
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AACA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG9C,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,eAAO,MAAM,WAAW,gBAAgB,CAAC;AACzC,eAAO,MAAM,mBAAmB,UAAyB,CAAC;AAC1D,eAAO,MAAM,aAAa,qBAAqB,CAAC;AAGhD,eAAO,MAAM,OAAO;;;;;CAKV,CAAC;AAEX,eAAO,MAAM,aAAa;;;;;;;CAOhB,CAAC;AAEX,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,WAAW,EAAE,eAAe,CAK/D,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
/**
|
|
3
|
+
* Constants for theme selector component
|
|
4
|
+
*/
|
|
5
|
+
export const STORAGE_KEY = 'turbo-theme';
|
|
6
|
+
export const LEGACY_STORAGE_KEYS = ['bulma-theme-flavor'];
|
|
7
|
+
export const DEFAULT_THEME = 'catppuccin-mocha';
|
|
8
|
+
// DOM element IDs and selectors - centralized to avoid magic strings
|
|
9
|
+
export const DOM_IDS = {
|
|
10
|
+
THEME_FLAVOR_TRIGGER: 'theme-flavor-trigger',
|
|
11
|
+
THEME_FLAVOR_TRIGGER_ICON: 'theme-flavor-trigger-icon',
|
|
12
|
+
THEME_FLAVOR_MENU: 'theme-flavor-menu',
|
|
13
|
+
THEME_FLAVOR_SELECT: 'theme-flavor-select',
|
|
14
|
+
};
|
|
15
|
+
export const DOM_SELECTORS = {
|
|
16
|
+
DROPDOWN_ITEMS: `#${DOM_IDS.THEME_FLAVOR_MENU} .dropdown-item.theme-item`,
|
|
17
|
+
NAVBAR_DROPDOWN: '.navbar-item.has-dropdown',
|
|
18
|
+
NAV_REPORTS: '[data-testid="nav-reports"]',
|
|
19
|
+
NAVBAR_ITEM: '.navbar-item',
|
|
20
|
+
HIGHLIGHT_PRE: '.highlight > pre',
|
|
21
|
+
THEME_CSS_LINKS: 'link[id^="theme-"][id$="-css"]',
|
|
22
|
+
};
|
|
23
|
+
export const THEME_FAMILIES = {
|
|
24
|
+
bulma: { name: 'Bulma', description: 'Classic Bulma themes' },
|
|
25
|
+
catppuccin: { name: 'Catppuccin', description: 'Soothing pastel themes' },
|
|
26
|
+
github: { name: 'GitHub', description: 'GitHub-inspired themes' },
|
|
27
|
+
dracula: { name: 'Dracula', description: 'Dark vampire aesthetic' },
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B;;GAEG;AAOH,MAAM,CAAC,MAAM,WAAW,GAAG,aAAa,CAAC;AACzC,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,oBAAoB,CAAC,CAAC;AAC1D,MAAM,CAAC,MAAM,aAAa,GAAG,kBAAkB,CAAC;AAEhD,qEAAqE;AACrE,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,oBAAoB,EAAE,sBAAsB;IAC5C,yBAAyB,EAAE,2BAA2B;IACtD,iBAAiB,EAAE,mBAAmB;IACtC,mBAAmB,EAAE,qBAAqB;CAClC,CAAC;AAEX,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,cAAc,EAAE,IAAI,OAAO,CAAC,iBAAiB,4BAA4B;IACzE,eAAe,EAAE,2BAA2B;IAC5C,WAAW,EAAE,6BAA6B;IAC1C,WAAW,EAAE,cAAc;IAC3B,aAAa,EAAE,kBAAkB;IACjC,eAAe,EAAE,gCAAgC;CACzC,CAAC;AAOX,MAAM,CAAC,MAAM,cAAc,GAAyC;IAClE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,sBAAsB,EAAE;IAC7D,UAAU,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,wBAAwB,EAAE;IACzE,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,wBAAwB,EAAE;IACjE,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,wBAAwB,EAAE;CACpE,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dropdown event handlers
|
|
3
|
+
*/
|
|
4
|
+
import type { DropdownElements, DropdownState, DropdownStateManager } from './state.js';
|
|
5
|
+
/**
|
|
6
|
+
* Wires up all event handlers for the dropdown.
|
|
7
|
+
*/
|
|
8
|
+
export declare function wireDropdownEventHandlers(documentObj: Document, elements: DropdownElements, state: DropdownState, stateManager: DropdownStateManager, abortController: AbortController): void;
|
|
9
|
+
//# sourceMappingURL=events.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/dropdown/events.ts"],"names":[],"mappings":"AACA;;GAEG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AA4GxF;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,WAAW,EAAE,QAAQ,EACrB,QAAQ,EAAE,gBAAgB,EAC1B,KAAK,EAAE,aAAa,EACpB,YAAY,EAAE,oBAAoB,EAClC,eAAe,EAAE,eAAe,GAC/B,IAAI,CAoDN"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
/**
|
|
3
|
+
* Dropdown event handlers
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Calculates the next index when navigating down through menu items.
|
|
7
|
+
*/
|
|
8
|
+
function getNextIndex(currentIndex, totalItems) {
|
|
9
|
+
return currentIndex < totalItems - 1 ? currentIndex + 1 : 0;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Calculates the previous index when navigating up through menu items.
|
|
13
|
+
*/
|
|
14
|
+
function getPrevIndex(currentIndex, totalItems) {
|
|
15
|
+
return currentIndex > 0 ? currentIndex - 1 : totalItems - 1;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Handles keyboard navigation on the trigger button.
|
|
19
|
+
*/
|
|
20
|
+
function handleTriggerKeydown(e, dropdown, state, stateManager) {
|
|
21
|
+
const { focusMenuItem, toggleDropdown, updateAriaExpanded } = stateManager;
|
|
22
|
+
const totalItems = state.menuItems.length;
|
|
23
|
+
switch (e.key) {
|
|
24
|
+
case 'Enter':
|
|
25
|
+
case ' ':
|
|
26
|
+
e.preventDefault();
|
|
27
|
+
toggleDropdown(!dropdown.classList.contains('is-active'));
|
|
28
|
+
break;
|
|
29
|
+
case 'ArrowDown':
|
|
30
|
+
e.preventDefault();
|
|
31
|
+
if (!dropdown.classList.contains('is-active')) {
|
|
32
|
+
dropdown.classList.add('is-active');
|
|
33
|
+
updateAriaExpanded(true);
|
|
34
|
+
focusMenuItem(0);
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
const nextIndex = state.currentIndex < 0 ? 0 : getNextIndex(state.currentIndex, totalItems);
|
|
38
|
+
focusMenuItem(nextIndex);
|
|
39
|
+
}
|
|
40
|
+
break;
|
|
41
|
+
case 'ArrowUp':
|
|
42
|
+
e.preventDefault();
|
|
43
|
+
if (!dropdown.classList.contains('is-active')) {
|
|
44
|
+
dropdown.classList.add('is-active');
|
|
45
|
+
updateAriaExpanded(true);
|
|
46
|
+
focusMenuItem(totalItems - 1);
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
const startIndex = state.currentIndex < 0 ? totalItems - 1 : state.currentIndex;
|
|
50
|
+
focusMenuItem(getPrevIndex(startIndex, totalItems));
|
|
51
|
+
}
|
|
52
|
+
break;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Handles keyboard navigation on menu items.
|
|
57
|
+
*/
|
|
58
|
+
function handleMenuItemKeydown(e, index, item, state, stateManager) {
|
|
59
|
+
const { focusMenuItem, closeDropdown } = stateManager;
|
|
60
|
+
const totalItems = state.menuItems.length;
|
|
61
|
+
switch (e.key) {
|
|
62
|
+
case 'ArrowDown':
|
|
63
|
+
e.preventDefault();
|
|
64
|
+
focusMenuItem(getNextIndex(index, totalItems));
|
|
65
|
+
break;
|
|
66
|
+
case 'ArrowUp':
|
|
67
|
+
e.preventDefault();
|
|
68
|
+
focusMenuItem(getPrevIndex(index, totalItems));
|
|
69
|
+
break;
|
|
70
|
+
case 'Escape':
|
|
71
|
+
e.preventDefault();
|
|
72
|
+
closeDropdown();
|
|
73
|
+
break;
|
|
74
|
+
case 'Enter':
|
|
75
|
+
case ' ':
|
|
76
|
+
e.preventDefault();
|
|
77
|
+
item.click();
|
|
78
|
+
break;
|
|
79
|
+
case 'Home':
|
|
80
|
+
e.preventDefault();
|
|
81
|
+
focusMenuItem(0);
|
|
82
|
+
break;
|
|
83
|
+
case 'End':
|
|
84
|
+
e.preventDefault();
|
|
85
|
+
focusMenuItem(totalItems - 1);
|
|
86
|
+
break;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Wires up all event handlers for the dropdown.
|
|
91
|
+
*/
|
|
92
|
+
export function wireDropdownEventHandlers(documentObj, elements, state, stateManager, abortController) {
|
|
93
|
+
const { trigger, dropdown } = elements;
|
|
94
|
+
const { closeDropdown, toggleDropdown } = stateManager;
|
|
95
|
+
const signal = abortController.signal;
|
|
96
|
+
// Trigger click
|
|
97
|
+
trigger.addEventListener('click', (e) => {
|
|
98
|
+
e.preventDefault();
|
|
99
|
+
toggleDropdown();
|
|
100
|
+
}, { signal });
|
|
101
|
+
// Outside click
|
|
102
|
+
documentObj.addEventListener('click', (e) => {
|
|
103
|
+
if (!dropdown.contains(e.target)) {
|
|
104
|
+
closeDropdown({ restoreFocus: false });
|
|
105
|
+
}
|
|
106
|
+
}, { signal });
|
|
107
|
+
// Escape key (document-level)
|
|
108
|
+
documentObj.addEventListener('keydown', (e) => {
|
|
109
|
+
if (e.key === 'Escape' && dropdown.classList.contains('is-active')) {
|
|
110
|
+
closeDropdown({ restoreFocus: true });
|
|
111
|
+
}
|
|
112
|
+
}, { signal });
|
|
113
|
+
// Trigger keyboard navigation
|
|
114
|
+
trigger.addEventListener('keydown', (e) => handleTriggerKeydown(e, dropdown, state, stateManager), { signal });
|
|
115
|
+
// Menu item keyboard navigation
|
|
116
|
+
for (const [index, item] of state.menuItems.entries()) {
|
|
117
|
+
item.addEventListener('keydown', (e) => handleMenuItemKeydown(e, index, item, state, stateManager), { signal });
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/dropdown/events.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dropdown helper functions
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Sets the active state (is-active class and aria-checked) on a theme item element.
|
|
6
|
+
*/
|
|
7
|
+
export declare function setItemActiveState(item: Element, isActive: boolean): void;
|
|
8
|
+
/**
|
|
9
|
+
* Sets tabindex attribute on all items in a collection.
|
|
10
|
+
*/
|
|
11
|
+
export declare function setTabindexBatch(items: HTMLElement[], value: string): void;
|
|
12
|
+
//# sourceMappingURL=helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/dropdown/helpers.ts"],"names":[],"mappings":"AACA;;GAEG;AAEH;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI,CAOzE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAI1E"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
/**
|
|
3
|
+
* Dropdown helper functions
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Sets the active state (is-active class and aria-checked) on a theme item element.
|
|
7
|
+
*/
|
|
8
|
+
export function setItemActiveState(item, isActive) {
|
|
9
|
+
if (isActive) {
|
|
10
|
+
item.classList.add('is-active');
|
|
11
|
+
}
|
|
12
|
+
else {
|
|
13
|
+
item.classList.remove('is-active');
|
|
14
|
+
}
|
|
15
|
+
item.setAttribute('aria-checked', String(isActive));
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Sets tabindex attribute on all items in a collection.
|
|
19
|
+
*/
|
|
20
|
+
export function setTabindexBatch(items, value) {
|
|
21
|
+
for (const item of items) {
|
|
22
|
+
item.setAttribute('tabindex', value);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/dropdown/helpers.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B;;GAEG;AAEH;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAa,EAAE,QAAiB;IACjE,IAAI,QAAQ,EAAE,CAAC;QACb,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAClC,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IACrC,CAAC;IACD,IAAI,CAAC,YAAY,CAAC,cAAc,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;AACtD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAoB,EAAE,KAAa;IAClE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IACvC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dropdown state management
|
|
3
|
+
*/
|
|
4
|
+
export interface DropdownElements {
|
|
5
|
+
dropdownMenu: HTMLElement;
|
|
6
|
+
trigger: HTMLButtonElement;
|
|
7
|
+
dropdown: HTMLElement;
|
|
8
|
+
selectEl: HTMLSelectElement | null;
|
|
9
|
+
}
|
|
10
|
+
export interface DropdownState {
|
|
11
|
+
currentIndex: number;
|
|
12
|
+
menuItems: HTMLElement[];
|
|
13
|
+
}
|
|
14
|
+
export interface DropdownStateManager {
|
|
15
|
+
updateAriaExpanded: (expanded: boolean) => void;
|
|
16
|
+
focusMenuItem: (index: number) => void;
|
|
17
|
+
closeDropdown: (options?: {
|
|
18
|
+
restoreFocus?: boolean;
|
|
19
|
+
}) => void;
|
|
20
|
+
toggleDropdown: (focusFirst?: boolean) => void;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Creates dropdown state management functions.
|
|
24
|
+
*/
|
|
25
|
+
export declare function createDropdownStateManager(elements: DropdownElements, state: DropdownState): DropdownStateManager;
|
|
26
|
+
//# sourceMappingURL=state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/dropdown/state.ts"],"names":[],"mappings":"AACA;;GAEG;AAIH,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,WAAW,CAAC;IAC1B,OAAO,EAAE,iBAAiB,CAAC;IAC3B,QAAQ,EAAE,WAAW,CAAC;IACtB,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAAC;CACpC;AAED,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,WAAW,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,oBAAoB;IACnC,kBAAkB,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;IAChD,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,aAAa,EAAE,CAAC,OAAO,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,CAAC;IAC9D,cAAc,EAAE,CAAC,UAAU,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;CAChD;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,gBAAgB,EAC1B,KAAK,EAAE,aAAa,GACnB,oBAAoB,CA6CtB"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
/**
|
|
3
|
+
* Dropdown state management
|
|
4
|
+
*/
|
|
5
|
+
import { setItemActiveState, setTabindexBatch } from './helpers.js';
|
|
6
|
+
/**
|
|
7
|
+
* Creates dropdown state management functions.
|
|
8
|
+
*/
|
|
9
|
+
export function createDropdownStateManager(elements, state) {
|
|
10
|
+
const { trigger, dropdown } = elements;
|
|
11
|
+
const updateAriaExpanded = (expanded) => {
|
|
12
|
+
trigger.setAttribute('aria-expanded', String(expanded));
|
|
13
|
+
};
|
|
14
|
+
const focusMenuItem = (index) => {
|
|
15
|
+
if (index < 0 || index >= state.menuItems.length)
|
|
16
|
+
return;
|
|
17
|
+
const item = state.menuItems[index];
|
|
18
|
+
setTabindexBatch(state.menuItems, '-1');
|
|
19
|
+
item.setAttribute('tabindex', '0');
|
|
20
|
+
item.focus();
|
|
21
|
+
state.currentIndex = index;
|
|
22
|
+
};
|
|
23
|
+
const closeDropdown = (options = {}) => {
|
|
24
|
+
const { restoreFocus = true } = options;
|
|
25
|
+
dropdown.classList.remove('is-active');
|
|
26
|
+
updateAriaExpanded(false);
|
|
27
|
+
setTabindexBatch(state.menuItems, '-1');
|
|
28
|
+
state.currentIndex = -1;
|
|
29
|
+
if (restoreFocus) {
|
|
30
|
+
trigger.focus();
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
const toggleDropdown = (focusFirst = false) => {
|
|
34
|
+
const isActive = dropdown.classList.toggle('is-active');
|
|
35
|
+
updateAriaExpanded(isActive);
|
|
36
|
+
if (!isActive) {
|
|
37
|
+
state.currentIndex = -1;
|
|
38
|
+
setTabindexBatch(state.menuItems, '-1');
|
|
39
|
+
for (const menuItem of state.menuItems) {
|
|
40
|
+
const isActiveItem = menuItem.classList.contains('is-active');
|
|
41
|
+
setItemActiveState(menuItem, isActiveItem);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
else if (focusFirst && state.menuItems.length > 0) {
|
|
45
|
+
focusMenuItem(0);
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
return { updateAriaExpanded, focusMenuItem, closeDropdown, toggleDropdown };
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/dropdown/state.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B;;GAEG;AAEH,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAqBpE;;GAEG;AACH,MAAM,UAAU,0BAA0B,CACxC,QAA0B,EAC1B,KAAoB;IAEpB,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,QAAQ,CAAC;IAEvC,MAAM,kBAAkB,GAAG,CAAC,QAAiB,EAAQ,EAAE;QACrD,OAAO,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC1D,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG,CAAC,KAAa,EAAQ,EAAE;QAC5C,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,IAAI,KAAK,CAAC,SAAS,CAAC,MAAM;YAAE,OAAO;QAEzD,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,CAAE,CAAC;QACrC,gBAAgB,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QACxC,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;QACnC,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,KAAK,CAAC,YAAY,GAAG,KAAK,CAAC;IAC7B,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG,CAAC,UAAsC,EAAE,EAAQ,EAAE;QACvE,MAAM,EAAE,YAAY,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;QACxC,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QACvC,kBAAkB,CAAC,KAAK,CAAC,CAAC;QAC1B,gBAAgB,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QACxC,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;QACxB,IAAI,YAAY,EAAE,CAAC;YACjB,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,cAAc,GAAG,CAAC,UAAU,GAAG,KAAK,EAAQ,EAAE;QAClD,MAAM,QAAQ,GAAG,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QACxD,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QAE7B,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;YACxB,gBAAgB,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YACxC,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;gBACvC,MAAM,YAAY,GAAG,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;gBAC9D,kBAAkB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;aAAM,IAAI,UAAU,IAAI,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpD,aAAa,CAAC,CAAC,CAAC,CAAC;QACnB,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,CAAC;AAC9E,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dropdown UI element creation
|
|
3
|
+
*/
|
|
4
|
+
import type { ThemeFlavor } from '../theme-mapper.js';
|
|
5
|
+
import type { ThemeFamilyMeta } from '../constants.js';
|
|
6
|
+
import type { DropdownElements } from './state.js';
|
|
7
|
+
export interface DropdownContext {
|
|
8
|
+
documentObj: Document;
|
|
9
|
+
windowObj: Window;
|
|
10
|
+
baseUrl: string;
|
|
11
|
+
currentThemeId: string;
|
|
12
|
+
selectEl: HTMLSelectElement | null;
|
|
13
|
+
menuItems: HTMLElement[];
|
|
14
|
+
closeDropdown: (options?: {
|
|
15
|
+
restoreFocus?: boolean;
|
|
16
|
+
}) => void;
|
|
17
|
+
onThemeSelect: (themeId: string) => void;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Creates a checkmark SVG icon for the active theme indicator.
|
|
21
|
+
*/
|
|
22
|
+
export declare function createCheckmarkIcon(doc: Document): SVGSVGElement;
|
|
23
|
+
/**
|
|
24
|
+
* Creates a single theme item button element.
|
|
25
|
+
*/
|
|
26
|
+
export declare function createThemeItemElement(ctx: DropdownContext, theme: ThemeFlavor, familyMeta: ThemeFamilyMeta): HTMLButtonElement;
|
|
27
|
+
/**
|
|
28
|
+
* Creates a family group container with header and theme items.
|
|
29
|
+
*/
|
|
30
|
+
export declare function createFamilyGroup(ctx: DropdownContext, familyKey: string, themes: ThemeFlavor[], familyMeta: ThemeFamilyMeta, animationDelay: number): {
|
|
31
|
+
group: HTMLDivElement;
|
|
32
|
+
items: HTMLElement[];
|
|
33
|
+
} | null;
|
|
34
|
+
/**
|
|
35
|
+
* Populates the dropdown menu with all theme family groups.
|
|
36
|
+
*/
|
|
37
|
+
export declare function populateDropdownMenu(ctx: DropdownContext, dropdownMenu: HTMLElement, themes: ThemeFlavor[], themeFamilies: Record<string, ThemeFamilyMeta>): void;
|
|
38
|
+
/**
|
|
39
|
+
* Wires up the native select element for theme selection.
|
|
40
|
+
*/
|
|
41
|
+
export declare function wireNativeSelect(ctx: DropdownContext, selectEl: HTMLSelectElement, themes: ThemeFlavor[], defaultTheme: string): void;
|
|
42
|
+
/**
|
|
43
|
+
* Gets DOM elements required for the dropdown, returning null if any are missing.
|
|
44
|
+
*/
|
|
45
|
+
export declare function getDropdownElements(documentObj: Document): DropdownElements | null;
|
|
46
|
+
//# sourceMappingURL=ui.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../../src/dropdown/ui.ts"],"names":[],"mappings":"AACA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAGvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,QAAQ,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACnC,SAAS,EAAE,WAAW,EAAE,CAAC;IACzB,aAAa,EAAE,CAAC,OAAO,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,CAAC;IAC9D,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAC1C;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,QAAQ,GAAG,aAAa,CAgBhE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,eAAe,EACpB,KAAK,EAAE,WAAW,EAClB,UAAU,EAAE,eAAe,GAC1B,iBAAiB,CAqEnB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,eAAe,EACpB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,WAAW,EAAE,EACrB,UAAU,EAAE,eAAe,EAC3B,cAAc,EAAE,MAAM,GACrB;IAAE,KAAK,EAAE,cAAc,CAAC;IAAC,KAAK,EAAE,WAAW,EAAE,CAAA;CAAE,GAAG,IAAI,CAuCxD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,eAAe,EACpB,YAAY,EAAE,WAAW,EACzB,MAAM,EAAE,WAAW,EAAE,EACrB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GAC7C,IAAI,CAgBN;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,eAAe,EACpB,QAAQ,EAAE,iBAAiB,EAC3B,MAAM,EAAE,WAAW,EAAE,EACrB,YAAY,EAAE,MAAM,GACnB,IAAI,CAyBN;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,QAAQ,GAAG,gBAAgB,GAAG,IAAI,CAelF"}
|