@trimble-oss/moduswebcomponents
Version:
Modus Web Components is a modern, accessible UI library built with Stencil JS that provides reusable web components following Trimble's Modus design system. This updated version focuses on improved flexibility, enhanced theming options, comprehensive cust
49 lines (48 loc) • 1.96 kB
JavaScript
import { createStore } from "@stencil/store";
// eslint-disable-next-line @typescript-eslint/unbound-method
const { state, onChange, reset, dispose } = createStore({
mode: 'light',
theme: 'modus-modern',
});
export const themeStore = {
state,
onChange,
setTheme: (theme) => (state.theme = theme),
setMode: (mode) => (state.mode = mode),
reset,
dispose,
};
const getStoredMode = () => {
try {
const stored = localStorage.getItem('modus-theme-config');
return stored ? JSON.parse(stored).mode : null;
}
catch (error) {
console.warn('Failed to parse theme config from localStorage:', error);
return null;
}
};
const getSystemPreferredMode = () => {
const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
return prefersDark ? 'dark' : 'light';
};
// Initialize theme store with system preferences and stored values
export const initializeThemeStore = (initialConfig) => {
var _a, _b, _c;
// Set theme with default fallback
state.theme = (_a = initialConfig === null || initialConfig === void 0 ? void 0 : initialConfig.theme) !== null && _a !== void 0 ? _a : 'modus-modern';
// Mode resolution with priority: explicit config > stored preference > system preference
state.mode =
(_c = (_b = initialConfig === null || initialConfig === void 0 ? void 0 : initialConfig.mode) !== null && _b !== void 0 ? _b : getStoredMode()) !== null && _c !== void 0 ? _c : getSystemPreferredMode();
};
// Watch for system theme changes
export const watchSystemTheme = () => {
const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
const handleChange = (e) => {
if (!localStorage.getItem('preferred-mode')) {
state.mode = e.matches ? 'dark' : 'light';
}
};
mediaQuery.addEventListener('change', handleChange);
return () => mediaQuery.removeEventListener('change', handleChange);
};