@descope/sdk-mixins 0.16.1 → 0.17.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 (31) hide show
  1. package/dist/cjs/mixins/themeMixin/helpers.js +30 -0
  2. package/dist/cjs/mixins/themeMixin/helpers.js.map +1 -1
  3. package/dist/cjs/mixins/themeMixin/themeMixin.js +45 -2
  4. package/dist/cjs/mixins/themeMixin/themeMixin.js.map +1 -1
  5. package/dist/esm/mixins/themeMixin/helpers.js +28 -1
  6. package/dist/esm/mixins/themeMixin/helpers.js.map +1 -1
  7. package/dist/esm/mixins/themeMixin/themeMixin.js +46 -3
  8. package/dist/esm/mixins/themeMixin/themeMixin.js.map +1 -1
  9. package/dist/index.d.ts +171 -167
  10. package/dist/types/mixins/configMixin/configMixin.d.ts +14 -14
  11. package/dist/types/mixins/createStateManagementMixin.d.ts +2 -2
  12. package/dist/types/mixins/createValidateAttributesMixin/createValidateAttributesMixin.d.ts +5 -5
  13. package/dist/types/mixins/cspNonceMixin.d.ts +5 -5
  14. package/dist/types/mixins/debuggerMixin/debugger-wc.d.ts +5 -5
  15. package/dist/types/mixins/debuggerMixin/debuggerMixin.d.ts +8 -8
  16. package/dist/types/mixins/descopeUiMixin/descopeUiMixin.d.ts +19 -19
  17. package/dist/types/mixins/formMixin.d.ts +2 -2
  18. package/dist/types/mixins/initElementMixin.d.ts +5 -5
  19. package/dist/types/mixins/initLifecycleMixin.d.ts +1 -1
  20. package/dist/types/mixins/injectNpmLibMixin/injectNpmLibMixin.d.ts +2 -2
  21. package/dist/types/mixins/injectStyleMixin.d.ts +5 -5
  22. package/dist/types/mixins/loggerMixin/loggerMixin.d.ts +2 -2
  23. package/dist/types/mixins/modalMixin/modalMixin.d.ts +23 -23
  24. package/dist/types/mixins/notificationsMixin/notificationsMixin.d.ts +23 -23
  25. package/dist/types/mixins/observeAttributesMixin/observeAttributesMixin.d.ts +4 -4
  26. package/dist/types/mixins/projectIdMixin.d.ts +5 -5
  27. package/dist/types/mixins/resetMixin.d.ts +6 -6
  28. package/dist/types/mixins/staticResourcesMixin/staticResourcesMixin.d.ts +10 -10
  29. package/dist/types/mixins/themeMixin/helpers.d.ts +3 -0
  30. package/dist/types/mixins/themeMixin/themeMixin.d.ts +36 -32
  31. package/package.json +2 -2
@@ -2,6 +2,33 @@
2
2
 
3
3
  var constants = require('../descopeUiMixin/constants.js');
4
4
 
5
+ const isSafeCssVarSegment = (segment) => /^[a-zA-Z0-9-]+$/.test(segment);
6
+ const serializeOverrideCssValue = (value) => {
7
+ if (typeof value === 'number') {
8
+ return Number.isFinite(value) ? String(value) : null;
9
+ }
10
+ if (typeof value !== 'string')
11
+ return null;
12
+ if (/[;{}]/.test(value))
13
+ return null;
14
+ return value.trim();
15
+ };
16
+ const flattenToVars = (obj, onError, prefix = '') => Object.entries(obj).reduce((css, [key, value]) => {
17
+ if (!isSafeCssVarSegment(key)) {
18
+ onError('Ignoring invalid override-css token path segment');
19
+ return css;
20
+ }
21
+ const path = prefix ? `${prefix}-${key}` : key;
22
+ if (typeof value === 'object' && value !== null) {
23
+ return css + flattenToVars(value, onError, path);
24
+ }
25
+ const serializedValue = serializeOverrideCssValue(value);
26
+ if (serializedValue === null) {
27
+ onError('Ignoring invalid override-css token value');
28
+ return css;
29
+ }
30
+ return `${css}--descope-${path}:${serializedValue};`;
31
+ }, '');
5
32
  const loadFont = (url) => {
6
33
  const font = document.createElement('link');
7
34
  font.href = url;
@@ -29,6 +56,9 @@ const loadDevTheme = async () => {
29
56
  }
30
57
  };
31
58
 
59
+ exports.flattenToVars = flattenToVars;
60
+ exports.isSafeCssVarSegment = isSafeCssVarSegment;
32
61
  exports.loadDevTheme = loadDevTheme;
33
62
  exports.loadFont = loadFont;
63
+ exports.serializeOverrideCssValue = serializeOverrideCssValue;
34
64
  //# sourceMappingURL=helpers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.js","sources":["../../../../src/mixins/themeMixin/helpers.ts"],"sourcesContent":["import { UI_COMPONENTS_URL_KEY } from '../descopeUiMixin/constants';\n\nexport const loadFont = (url: string) => {\n const font = document.createElement('link');\n font.href = url;\n font.rel = 'stylesheet';\n document.head.appendChild(font);\n};\n\nexport const loadDevTheme = async () => {\n const componentsUrl = localStorage.getItem(UI_COMPONENTS_URL_KEY);\n const descopeDevUrl = componentsUrl?.replace(/[^\\/]+$/, 'DescopeDev.js');\n\n // eslint-disable-next-line no-console\n console.warn('Trying to load DescopeDev.js from', descopeDevUrl);\n const scriptEle = document.createElement('script');\n scriptEle.src = descopeDevUrl;\n document.body.appendChild(scriptEle);\n\n await new Promise((resolve, reject) => {\n scriptEle.onload = resolve;\n scriptEle.onerror = reject;\n });\n\n if (globalThis.DescopeDev) {\n const { themeToStyle, defaultTheme, darkTheme } = globalThis.DescopeDev;\n\n return {\n light: themeToStyle(defaultTheme),\n dark: themeToStyle(darkTheme),\n };\n }\n};\n"],"names":["UI_COMPONENTS_URL_KEY"],"mappings":";;;;AAEa,MAAA,QAAQ,GAAG,CAAC,GAAW,KAAI;IACtC,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;AAC5C,IAAA,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC;AAChB,IAAA,IAAI,CAAC,GAAG,GAAG,YAAY,CAAC;AACxB,IAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;AAClC,EAAE;AAEW,MAAA,YAAY,GAAG,YAAW;IACrC,MAAM,aAAa,GAAG,YAAY,CAAC,OAAO,CAACA,+BAAqB,CAAC,CAAC;AAClE,IAAA,MAAM,aAAa,GAAG,aAAa,KAAA,IAAA,IAAb,aAAa,KAAb,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,aAAa,CAAE,OAAO,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;;AAGzE,IAAA,OAAO,CAAC,IAAI,CAAC,mCAAmC,EAAE,aAAa,CAAC,CAAC;IACjE,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;AACnD,IAAA,SAAS,CAAC,GAAG,GAAG,aAAa,CAAC;AAC9B,IAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;IAErC,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAI;AACpC,QAAA,SAAS,CAAC,MAAM,GAAG,OAAO,CAAC;AAC3B,QAAA,SAAS,CAAC,OAAO,GAAG,MAAM,CAAC;AAC7B,KAAC,CAAC,CAAC;AAEH,IAAA,IAAI,UAAU,CAAC,UAAU,EAAE;QACzB,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,GAAG,UAAU,CAAC,UAAU,CAAC;QAExE,OAAO;AACL,YAAA,KAAK,EAAE,YAAY,CAAC,YAAY,CAAC;AACjC,YAAA,IAAI,EAAE,YAAY,CAAC,SAAS,CAAC;SAC9B,CAAC;KACH;AACH;;;;;"}
1
+ {"version":3,"file":"helpers.js","sources":["../../../../src/mixins/themeMixin/helpers.ts"],"sourcesContent":["import { UI_COMPONENTS_URL_KEY } from '../descopeUiMixin/constants';\n\nexport const isSafeCssVarSegment = (segment: string): boolean =>\n /^[a-zA-Z0-9-]+$/.test(segment);\n\nexport const serializeOverrideCssValue = (value: unknown): string | null => {\n if (typeof value === 'number') {\n return Number.isFinite(value) ? String(value) : null;\n }\n if (typeof value !== 'string') return null;\n if (/[;{}]/.test(value)) return null;\n return value.trim();\n};\n\nexport const flattenToVars = (\n obj: Record<string, any>,\n onError: (msg: string) => void,\n prefix = '',\n): string =>\n Object.entries(obj).reduce((css, [key, value]) => {\n if (!isSafeCssVarSegment(key)) {\n onError('Ignoring invalid override-css token path segment');\n return css;\n }\n const path = prefix ? `${prefix}-${key}` : key;\n if (typeof value === 'object' && value !== null) {\n return css + flattenToVars(value, onError, path);\n }\n const serializedValue = serializeOverrideCssValue(value);\n if (serializedValue === null) {\n onError('Ignoring invalid override-css token value');\n return css;\n }\n return `${css}--descope-${path}:${serializedValue};`;\n }, '');\n\nexport const loadFont = (url: string) => {\n const font = document.createElement('link');\n font.href = url;\n font.rel = 'stylesheet';\n document.head.appendChild(font);\n};\n\nexport const loadDevTheme = async () => {\n const componentsUrl = localStorage.getItem(UI_COMPONENTS_URL_KEY);\n const descopeDevUrl = componentsUrl?.replace(/[^\\/]+$/, 'DescopeDev.js');\n\n // eslint-disable-next-line no-console\n console.warn('Trying to load DescopeDev.js from', descopeDevUrl);\n const scriptEle = document.createElement('script');\n scriptEle.src = descopeDevUrl;\n document.body.appendChild(scriptEle);\n\n await new Promise((resolve, reject) => {\n scriptEle.onload = resolve;\n scriptEle.onerror = reject;\n });\n\n if (globalThis.DescopeDev) {\n const { themeToStyle, defaultTheme, darkTheme } = globalThis.DescopeDev;\n\n return {\n light: themeToStyle(defaultTheme),\n dark: themeToStyle(darkTheme),\n };\n }\n};\n"],"names":["UI_COMPONENTS_URL_KEY"],"mappings":";;;;AAEO,MAAM,mBAAmB,GAAG,CAAC,OAAe,KACjD,iBAAiB,CAAC,IAAI,CAAC,OAAO,EAAE;AAErB,MAAA,yBAAyB,GAAG,CAAC,KAAc,KAAmB;AACzE,IAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AAC7B,QAAA,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;KACtD;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ;AAAE,QAAA,OAAO,IAAI,CAAC;AAC3C,IAAA,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;AAAE,QAAA,OAAO,IAAI,CAAC;AACrC,IAAA,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;AACtB,EAAE;AAEK,MAAM,aAAa,GAAG,CAC3B,GAAwB,EACxB,OAA8B,EAC9B,MAAM,GAAG,EAAE,KAEX,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,KAAI;AAC/C,IAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,EAAE;QAC7B,OAAO,CAAC,kDAAkD,CAAC,CAAC;AAC5D,QAAA,OAAO,GAAG,CAAC;KACZ;AACD,IAAA,MAAM,IAAI,GAAG,MAAM,GAAG,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,GAAG,CAAE,CAAA,GAAG,GAAG,CAAC;IAC/C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE;QAC/C,OAAO,GAAG,GAAG,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;KAClD;AACD,IAAA,MAAM,eAAe,GAAG,yBAAyB,CAAC,KAAK,CAAC,CAAC;AACzD,IAAA,IAAI,eAAe,KAAK,IAAI,EAAE;QAC5B,OAAO,CAAC,2CAA2C,CAAC,CAAC;AACrD,QAAA,OAAO,GAAG,CAAC;KACZ;AACD,IAAA,OAAO,GAAG,GAAG,CAAA,UAAA,EAAa,IAAI,CAAI,CAAA,EAAA,eAAe,GAAG,CAAC;AACvD,CAAC,EAAE,EAAE,EAAE;AAEI,MAAA,QAAQ,GAAG,CAAC,GAAW,KAAI;IACtC,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;AAC5C,IAAA,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC;AAChB,IAAA,IAAI,CAAC,GAAG,GAAG,YAAY,CAAC;AACxB,IAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;AAClC,EAAE;AAEW,MAAA,YAAY,GAAG,YAAW;IACrC,MAAM,aAAa,GAAG,YAAY,CAAC,OAAO,CAACA,+BAAqB,CAAC,CAAC;AAClE,IAAA,MAAM,aAAa,GAAG,aAAa,KAAA,IAAA,IAAb,aAAa,KAAb,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,aAAa,CAAE,OAAO,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;;AAGzE,IAAA,OAAO,CAAC,IAAI,CAAC,mCAAmC,EAAE,aAAa,CAAC,CAAC;IACjE,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;AACnD,IAAA,SAAS,CAAC,GAAG,GAAG,aAAa,CAAC;AAC9B,IAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;IAErC,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAI;AACpC,QAAA,SAAS,CAAC,MAAM,GAAG,OAAO,CAAC;AAC3B,QAAA,SAAS,CAAC,OAAO,GAAG,MAAM,CAAC;AAC7B,KAAC,CAAC,CAAC;AAEH,IAAA,IAAI,UAAU,CAAC,UAAU,EAAE;QACzB,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,GAAG,UAAU,CAAC,UAAU,CAAC;QAExE,OAAO;AACL,YAAA,KAAK,EAAE,YAAY,CAAC,YAAY,CAAC;AACjC,YAAA,IAAI,EAAE,YAAY,CAAC,SAAS,CAAC;SAC9B,CAAC;KACH;AACH;;;;;;;;"}
@@ -19,13 +19,14 @@ const themeValidation = (_, theme) => (theme || false) &&
19
19
  theme !== 'dark' &&
20
20
  'Supported theme values are "light", "dark", or leave empty for using the OS theme';
21
21
  const themeMixin = sdkHelpers.createSingletonMixin((superclass) => {
22
- var _ThemeMixinClass_instances, _ThemeMixinClass_globalStyle, _ThemeMixinClass__themeResource, _ThemeMixinClass_fetchTheme, _ThemeMixinClass_themeResource_get, _ThemeMixinClass_loadGlobalStyle, _ThemeMixinClass_loadComponentsStyle, _ThemeMixinClass_getFontsConfig, _ThemeMixinClass_loadFonts, _ThemeMixinClass_applyTheme, _ThemeMixinClass_onThemeChange, _ThemeMixinClass_loadTheme, _ThemeMixinClass_toggleOsThemeChangeListener, _a;
22
+ var _ThemeMixinClass_instances, _ThemeMixinClass_globalStyle, _ThemeMixinClass_customStyle, _ThemeMixinClass_getThemeOverrideString, _ThemeMixinClass__themeResource, _ThemeMixinClass_fetchTheme, _ThemeMixinClass_themeResource_get, _ThemeMixinClass_loadGlobalStyle, _ThemeMixinClass_loadCustomStyle, _ThemeMixinClass_loadComponentsStyle, _ThemeMixinClass_getFontsConfig, _ThemeMixinClass_loadFonts, _ThemeMixinClass_applyTheme, _ThemeMixinClass_onThemeChange, _ThemeMixinClass_loadTheme, _ThemeMixinClass_toggleOsThemeChangeListener, _a;
23
23
  const BaseClass = sdkHelpers.compose(createValidateAttributesMixin.createValidateAttributesMixin({ theme: themeValidation }), staticResourcesMixin.staticResourcesMixin, initLifecycleMixin.initLifecycleMixin, descopeUiMixin.descopeUiMixin, configMixin.configMixin, initElementMixin.initElementMixin, observeAttributesMixin.observeAttributesMixin, injectStyleMixin.injectStyleMixin)(superclass);
24
24
  return _a = class ThemeMixinClass extends BaseClass {
25
25
  constructor() {
26
26
  super(...arguments);
27
27
  _ThemeMixinClass_instances.add(this);
28
28
  _ThemeMixinClass_globalStyle.set(this, void 0);
29
+ _ThemeMixinClass_customStyle.set(this, void 0);
29
30
  _ThemeMixinClass__themeResource.set(this, void 0);
30
31
  _ThemeMixinClass_onThemeChange.set(this, () => {
31
32
  tslib.__classPrivateFieldGet(this, _ThemeMixinClass_instances, "m", _ThemeMixinClass_loadTheme).call(this);
@@ -52,6 +53,18 @@ const themeMixin = sdkHelpers.createSingletonMixin((superclass) => {
52
53
  get styleId() {
53
54
  return this.getAttribute('style-id') || constants.DEFAULT_STYLE_ID;
54
55
  }
56
+ get themeOverride() {
57
+ const raw = this.getAttribute('theme-override');
58
+ if (!raw)
59
+ return null;
60
+ try {
61
+ return JSON.parse(raw);
62
+ }
63
+ catch (e) {
64
+ this.logger.error('Failed to parse theme-override attribute. error: ', e);
65
+ return null;
66
+ }
67
+ }
55
68
  async init() {
56
69
  var _b;
57
70
  await ((_b = super.init) === null || _b === void 0 ? void 0 : _b.call(this));
@@ -60,7 +73,9 @@ const themeMixin = sdkHelpers.createSingletonMixin((superclass) => {
60
73
  tslib.__classPrivateFieldGet(this, _ThemeMixinClass_instances, "m", _ThemeMixinClass_loadGlobalStyle).call(this),
61
74
  tslib.__classPrivateFieldGet(this, _ThemeMixinClass_instances, "m", _ThemeMixinClass_loadComponentsStyle).call(this),
62
75
  ]);
76
+ await tslib.__classPrivateFieldGet(this, _ThemeMixinClass_instances, "m", _ThemeMixinClass_loadCustomStyle).call(this);
63
77
  this.observeAttributes(['theme'], tslib.__classPrivateFieldGet(this, _ThemeMixinClass_onThemeChange, "f"));
78
+ this.observeAttributes(['theme-override'], () => tslib.__classPrivateFieldGet(this, _ThemeMixinClass_instances, "m", _ThemeMixinClass_loadCustomStyle).call(this));
64
79
  this.observeAttributes(['style-id'], () => {
65
80
  tslib.__classPrivateFieldSet(this, _ThemeMixinClass__themeResource, null, "f");
66
81
  tslib.__classPrivateFieldGet(this, _ThemeMixinClass_instances, "m", _ThemeMixinClass_loadFonts).call(this);
@@ -70,10 +85,26 @@ const themeMixin = sdkHelpers.createSingletonMixin((superclass) => {
70
85
  }
71
86
  },
72
87
  _ThemeMixinClass_globalStyle = new WeakMap(),
88
+ _ThemeMixinClass_customStyle = new WeakMap(),
73
89
  _ThemeMixinClass__themeResource = new WeakMap(),
74
90
  _ThemeMixinClass_onThemeChange = new WeakMap(),
75
91
  _ThemeMixinClass_toggleOsThemeChangeListener = new WeakMap(),
76
92
  _ThemeMixinClass_instances = new WeakSet(),
93
+ _ThemeMixinClass_getThemeOverrideString = function _ThemeMixinClass_getThemeOverrideString() {
94
+ const override = this.themeOverride;
95
+ if (!override)
96
+ return '';
97
+ return ['light', 'dark']
98
+ .map((theme) => {
99
+ var _b, _c, _d, _e, _f, _g;
100
+ const primary = (_d = (_c = (_b = override[theme]) === null || _b === void 0 ? void 0 : _b.globals) === null || _c === void 0 ? void 0 : _c.colors) === null || _d === void 0 ? void 0 : _d.primary;
101
+ const secondary = (_g = (_f = (_e = override[theme]) === null || _e === void 0 ? void 0 : _e.globals) === null || _f === void 0 ? void 0 : _f.colors) === null || _g === void 0 ? void 0 : _g.secondary;
102
+ if (!primary && !secondary)
103
+ return '';
104
+ return `[data-theme="${theme}"]{${helpers.flattenToVars({ colors: { primary, secondary } }, (msg) => this.logger.error(msg))}}`;
105
+ })
106
+ .join('');
107
+ },
77
108
  _ThemeMixinClass_fetchTheme = async function _ThemeMixinClass_fetchTheme() {
78
109
  try {
79
110
  const { body: fetchedTheme } = await this.fetchStaticResource(`${this.styleId}.json`, 'json');
@@ -115,13 +146,25 @@ const themeMixin = sdkHelpers.createSingletonMixin((superclass) => {
115
146
  _ThemeMixinClass_loadGlobalStyle = async function _ThemeMixinClass_loadGlobalStyle() {
116
147
  var _b, _c;
117
148
  const theme = await tslib.__classPrivateFieldGet(this, _ThemeMixinClass_instances, "a", _ThemeMixinClass_themeResource_get);
118
- if (!theme)
149
+ if (!theme) {
119
150
  return;
151
+ }
120
152
  if (!tslib.__classPrivateFieldGet(this, _ThemeMixinClass_globalStyle, "f")) {
121
153
  tslib.__classPrivateFieldSet(this, _ThemeMixinClass_globalStyle, this.injectStyle(''), "f");
122
154
  }
123
155
  tslib.__classPrivateFieldGet(this, _ThemeMixinClass_globalStyle, "f").replaceSync((((_b = theme === null || theme === void 0 ? void 0 : theme.light) === null || _b === void 0 ? void 0 : _b.globals) || '') + (((_c = theme === null || theme === void 0 ? void 0 : theme.dark) === null || _c === void 0 ? void 0 : _c.globals) || ''));
124
156
  },
157
+ _ThemeMixinClass_loadCustomStyle = async function _ThemeMixinClass_loadCustomStyle() {
158
+ var _b;
159
+ if (!this.themeOverride) {
160
+ (_b = tslib.__classPrivateFieldGet(this, _ThemeMixinClass_customStyle, "f")) === null || _b === void 0 ? void 0 : _b.replaceSync('');
161
+ return;
162
+ }
163
+ if (!tslib.__classPrivateFieldGet(this, _ThemeMixinClass_customStyle, "f")) {
164
+ tslib.__classPrivateFieldSet(this, _ThemeMixinClass_customStyle, this.injectStyle(''), "f");
165
+ }
166
+ tslib.__classPrivateFieldGet(this, _ThemeMixinClass_customStyle, "f").replaceSync(tslib.__classPrivateFieldGet(this, _ThemeMixinClass_instances, "m", _ThemeMixinClass_getThemeOverrideString).call(this));
167
+ },
125
168
  _ThemeMixinClass_loadComponentsStyle = async function _ThemeMixinClass_loadComponentsStyle() {
126
169
  var _b, _c;
127
170
  const theme = await tslib.__classPrivateFieldGet(this, _ThemeMixinClass_instances, "a", _ThemeMixinClass_themeResource_get);
@@ -1 +1 @@
1
- {"version":3,"file":"themeMixin.js","sources":["../../../../src/mixins/themeMixin/themeMixin.ts"],"sourcesContent":["/* eslint-disable no-underscore-dangle */\nimport { createSingletonMixin, compose } from '@descope/sdk-helpers';\nimport { configMixin } from '../configMixin';\nimport { createValidateAttributesMixin } from '../createValidateAttributesMixin';\nimport { descopeUiMixin } from '../descopeUiMixin';\nimport { initElementMixin } from '../initElementMixin';\nimport { initLifecycleMixin } from '../initLifecycleMixin';\nimport { staticResourcesMixin } from '../staticResourcesMixin';\nimport { DEFAULT_STYLE_ID } from './constants';\nimport { loadDevTheme, loadFont } from './helpers';\nimport { observeAttributesMixin } from '../observeAttributesMixin';\nimport { UI_COMPONENTS_URL_KEY } from '../descopeUiMixin/constants';\nimport { InjectedStyle, injectStyleMixin } from '../injectStyleMixin';\n\nconst themeValidation = (_: string, theme: string | null) =>\n (theme || false) &&\n theme !== 'light' &&\n theme !== 'dark' &&\n 'Supported theme values are \"light\", \"dark\", or leave empty for using the OS theme';\n\nexport type ThemeOptions = 'light' | 'dark' | 'os';\n\nexport const themeMixin = createSingletonMixin(\n <T extends CustomElementConstructor>(superclass: T) => {\n const BaseClass = compose(\n createValidateAttributesMixin({ theme: themeValidation }),\n staticResourcesMixin,\n initLifecycleMixin,\n descopeUiMixin,\n configMixin,\n initElementMixin,\n observeAttributesMixin,\n injectStyleMixin,\n )(superclass);\n\n return class ThemeMixinClass extends BaseClass {\n #globalStyle: InjectedStyle;\n\n get theme(): ThemeOptions {\n const theme = this.getAttribute('theme') as ThemeOptions | null;\n\n if (theme === 'os') {\n const isOsDark =\n window.matchMedia &&\n window.matchMedia?.('(prefers-color-scheme: dark)')?.matches;\n\n return isOsDark ? 'dark' : 'light';\n }\n\n return theme || 'light';\n }\n\n get styleId(): string {\n return this.getAttribute('style-id') || DEFAULT_STYLE_ID;\n }\n\n #_themeResource: Promise<void | Record<string, any>>;\n\n async #fetchTheme() {\n try {\n const { body: fetchedTheme } = await this.fetchStaticResource(\n `${this.styleId}.json`,\n 'json',\n );\n\n // In development mode, we sometimes want to override the UI components URL\n // The override components might have a different theme, so we need to merge it with the project theme in order to see the components correctly\n if (process.env.NODE_ENV === 'development') {\n if (localStorage?.getItem(UI_COMPONENTS_URL_KEY)) {\n try {\n this.logger.warn(\n 'You are in DEV mode, and UI components override URL was found\\ntrying to merge project theme with the default theme of the UI components',\n );\n const devTheme = await loadDevTheme();\n\n if (devTheme) {\n fetchedTheme.light.components = {\n ...fetchedTheme.light.components,\n ...devTheme.light.components,\n };\n fetchedTheme.dark.components = {\n ...fetchedTheme.dark.components,\n ...devTheme.dark.components,\n };\n\n this.logger.warn('Theme was merged successfully');\n\n // eslint-disable-next-line no-console\n console.log(\n '%cNOTICE! This is not the theme that will be used in production!\\n\\nMake sure to test it without the override UI components URL!',\n 'color: black; background-color:yellow; font-size: x-large',\n );\n }\n } catch (e) {\n this.logger.error('Failed to merge UI components theme\\n', e);\n }\n }\n }\n\n return fetchedTheme;\n } catch (e) {\n this.logger.error(\n 'Cannot fetch theme file',\n 'make sure that your projectId & flowId are correct',\n );\n }\n\n return undefined;\n }\n\n get #themeResource() {\n if (!this.#_themeResource) {\n this.#_themeResource = this.#fetchTheme();\n this.#_themeResource.then((theme) =>\n this.logger.debug('Fetched theme', theme),\n );\n }\n\n // eslint-disable-next-line no-underscore-dangle\n return this.#_themeResource;\n }\n\n async #loadGlobalStyle() {\n const theme = await this.#themeResource;\n if (!theme) return;\n\n if (!this.#globalStyle) {\n this.#globalStyle = this.injectStyle('');\n }\n\n this.#globalStyle.replaceSync(\n (theme?.light?.globals || '') + (theme?.dark?.globals || ''),\n );\n }\n\n async #loadComponentsStyle() {\n const theme = await this.#themeResource;\n if (!theme) return;\n\n const descopeUi = await this.descopeUi;\n if (descopeUi?.componentsThemeManager) {\n descopeUi.componentsThemeManager.themes = {\n light: theme?.light?.components,\n dark: theme?.dark?.components,\n };\n }\n }\n\n async #getFontsConfig() {\n const { projectConfig } = (await this.config) || {};\n\n const newConfig = projectConfig?.styles?.[this.styleId];\n const oldConfig = projectConfig?.cssTemplate;\n\n const config = newConfig || oldConfig;\n\n const fonts: Record<string, { url?: string }> | undefined =\n config?.[this.theme]?.fonts;\n\n return fonts;\n }\n\n async #loadFonts() {\n const fonts = await this.#getFontsConfig();\n if (fonts) {\n Object.values(fonts).forEach((font) => {\n if (font.url) {\n this.logger.debug(`Loading font from URL \"${font.url}\"`);\n loadFont(font.url);\n }\n });\n } else {\n this.logger.debug('No fonts to load');\n }\n }\n\n async #applyTheme() {\n this.rootElement.setAttribute('data-theme', this.theme);\n const descopeUi = await this.descopeUi;\n if (descopeUi?.componentsThemeManager) {\n descopeUi.componentsThemeManager.currentThemeName = this.theme;\n }\n }\n\n #onThemeChange = () => {\n this.#loadTheme();\n this.#toggleOsThemeChangeListener(this.getAttribute('theme') === 'os');\n };\n\n #loadTheme() {\n this.#loadFonts();\n this.#applyTheme();\n }\n\n // add or remove os theme change listener\n #toggleOsThemeChangeListener = (listen: boolean) => {\n const method = listen ? 'addEventListener' : 'removeEventListener';\n window\n .matchMedia?.('(prefers-color-scheme: dark)')\n ?.[method]?.('change', () => this.#loadTheme());\n };\n\n async init() {\n await super.init?.();\n\n this.#onThemeChange();\n await Promise.all([\n this.#loadGlobalStyle(),\n this.#loadComponentsStyle(),\n ]);\n\n this.observeAttributes(['theme'], this.#onThemeChange);\n\n this.observeAttributes(['style-id'], () => {\n this.#_themeResource = null;\n this.#loadFonts();\n this.#loadGlobalStyle();\n this.#loadComponentsStyle();\n });\n }\n };\n },\n);\n"],"names":["createSingletonMixin","compose","createValidateAttributesMixin","staticResourcesMixin","initLifecycleMixin","descopeUiMixin","configMixin","initElementMixin","observeAttributesMixin","injectStyleMixin","__classPrivateFieldGet","DEFAULT_STYLE_ID","__classPrivateFieldSet","UI_COMPONENTS_URL_KEY","loadDevTheme","loadFont"],"mappings":"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"}
1
+ {"version":3,"file":"themeMixin.js","sources":["../../../../src/mixins/themeMixin/themeMixin.ts"],"sourcesContent":["/* eslint-disable no-underscore-dangle */\nimport { createSingletonMixin, compose } from '@descope/sdk-helpers';\nimport { configMixin } from '../configMixin';\nimport { createValidateAttributesMixin } from '../createValidateAttributesMixin';\nimport { descopeUiMixin } from '../descopeUiMixin';\nimport { initElementMixin } from '../initElementMixin';\nimport { initLifecycleMixin } from '../initLifecycleMixin';\nimport { staticResourcesMixin } from '../staticResourcesMixin';\nimport { DEFAULT_STYLE_ID } from './constants';\nimport { flattenToVars, loadDevTheme, loadFont } from './helpers';\nimport { observeAttributesMixin } from '../observeAttributesMixin';\nimport { UI_COMPONENTS_URL_KEY } from '../descopeUiMixin/constants';\nimport { InjectedStyle, injectStyleMixin } from '../injectStyleMixin';\n\nconst themeValidation = (_: string, theme: string | null) =>\n (theme || false) &&\n theme !== 'light' &&\n theme !== 'dark' &&\n 'Supported theme values are \"light\", \"dark\", or leave empty for using the OS theme';\n\nexport type ThemeOptions = 'light' | 'dark' | 'os';\n\nexport const themeMixin = createSingletonMixin(\n <T extends CustomElementConstructor>(superclass: T) => {\n const BaseClass = compose(\n createValidateAttributesMixin({ theme: themeValidation }),\n staticResourcesMixin,\n initLifecycleMixin,\n descopeUiMixin,\n configMixin,\n initElementMixin,\n observeAttributesMixin,\n injectStyleMixin,\n )(superclass);\n\n return class ThemeMixinClass extends BaseClass {\n #globalStyle: InjectedStyle;\n #customStyle: InjectedStyle;\n\n get theme(): ThemeOptions {\n const theme = this.getAttribute('theme') as ThemeOptions | null;\n\n if (theme === 'os') {\n const isOsDark =\n window.matchMedia &&\n window.matchMedia?.('(prefers-color-scheme: dark)')?.matches;\n\n return isOsDark ? 'dark' : 'light';\n }\n\n return theme || 'light';\n }\n\n get styleId(): string {\n return this.getAttribute('style-id') || DEFAULT_STYLE_ID;\n }\n\n get themeOverride(): Record<string, any> | null {\n const raw = this.getAttribute('theme-override');\n if (!raw) return null;\n try {\n return JSON.parse(raw);\n } catch (e) {\n this.logger.error(\n 'Failed to parse theme-override attribute. error: ',\n e,\n );\n return null;\n }\n }\n\n #getThemeOverrideString(): string {\n const override = this.themeOverride;\n if (!override) return '';\n\n return (['light', 'dark'] as const)\n .map((theme) => {\n const primary = override[theme]?.globals?.colors?.primary;\n const secondary = override[theme]?.globals?.colors?.secondary;\n if (!primary && !secondary) return '';\n\n return `[data-theme=\"${theme}\"]{${flattenToVars(\n { colors: { primary, secondary } },\n (msg) => this.logger.error(msg),\n )}}`;\n })\n .join('');\n }\n\n #_themeResource: Promise<void | Record<string, any>>;\n\n async #fetchTheme() {\n try {\n const { body: fetchedTheme } = await this.fetchStaticResource(\n `${this.styleId}.json`,\n 'json',\n );\n\n // In development mode, we sometimes want to override the UI components URL\n // The override components might have a different theme, so we need to merge it with the project theme in order to see the components correctly\n if (process.env.NODE_ENV === 'development') {\n if (localStorage?.getItem(UI_COMPONENTS_URL_KEY)) {\n try {\n this.logger.warn(\n 'You are in DEV mode, and UI components override URL was found\\ntrying to merge project theme with the default theme of the UI components',\n );\n const devTheme = await loadDevTheme();\n\n if (devTheme) {\n fetchedTheme.light.components = {\n ...fetchedTheme.light.components,\n ...devTheme.light.components,\n };\n fetchedTheme.dark.components = {\n ...fetchedTheme.dark.components,\n ...devTheme.dark.components,\n };\n\n this.logger.warn('Theme was merged successfully');\n\n // eslint-disable-next-line no-console\n console.log(\n '%cNOTICE! This is not the theme that will be used in production!\\n\\nMake sure to test it without the override UI components URL!',\n 'color: black; background-color:yellow; font-size: x-large',\n );\n }\n } catch (e) {\n this.logger.error('Failed to merge UI components theme\\n', e);\n }\n }\n }\n\n return fetchedTheme;\n } catch (e) {\n this.logger.error(\n 'Cannot fetch theme file',\n 'make sure that your projectId & flowId are correct',\n );\n }\n\n return undefined;\n }\n\n get #themeResource() {\n if (!this.#_themeResource) {\n this.#_themeResource = this.#fetchTheme();\n this.#_themeResource.then((theme) =>\n this.logger.debug('Fetched theme', theme),\n );\n }\n\n // eslint-disable-next-line no-underscore-dangle\n return this.#_themeResource;\n }\n\n async #loadGlobalStyle() {\n const theme = await this.#themeResource;\n if (!theme) {\n return;\n }\n if (!this.#globalStyle) {\n this.#globalStyle = this.injectStyle('');\n }\n\n this.#globalStyle.replaceSync(\n (theme?.light?.globals || '') + (theme?.dark?.globals || ''),\n );\n }\n\n async #loadCustomStyle() {\n if (!this.themeOverride) {\n this.#customStyle?.replaceSync('');\n return;\n }\n if (!this.#customStyle) {\n this.#customStyle = this.injectStyle('');\n }\n this.#customStyle.replaceSync(this.#getThemeOverrideString());\n }\n\n async #loadComponentsStyle() {\n const theme = await this.#themeResource;\n if (!theme) return;\n\n const descopeUi = await this.descopeUi;\n if (descopeUi?.componentsThemeManager) {\n descopeUi.componentsThemeManager.themes = {\n light: theme?.light?.components,\n dark: theme?.dark?.components,\n };\n }\n }\n\n async #getFontsConfig() {\n const { projectConfig } = (await this.config) || {};\n\n const newConfig = projectConfig?.styles?.[this.styleId];\n const oldConfig = projectConfig?.cssTemplate;\n\n const config = newConfig || oldConfig;\n\n const fonts: Record<string, { url?: string }> | undefined =\n config?.[this.theme]?.fonts;\n\n return fonts;\n }\n\n async #loadFonts() {\n const fonts = await this.#getFontsConfig();\n if (fonts) {\n Object.values(fonts).forEach((font) => {\n if (font.url) {\n this.logger.debug(`Loading font from URL \"${font.url}\"`);\n loadFont(font.url);\n }\n });\n } else {\n this.logger.debug('No fonts to load');\n }\n }\n\n async #applyTheme() {\n this.rootElement.setAttribute('data-theme', this.theme);\n const descopeUi = await this.descopeUi;\n if (descopeUi?.componentsThemeManager) {\n descopeUi.componentsThemeManager.currentThemeName = this.theme;\n }\n }\n\n #onThemeChange = () => {\n this.#loadTheme();\n this.#toggleOsThemeChangeListener(this.getAttribute('theme') === 'os');\n };\n\n #loadTheme() {\n this.#loadFonts();\n this.#applyTheme();\n }\n\n // add or remove os theme change listener\n #toggleOsThemeChangeListener = (listen: boolean) => {\n const method = listen ? 'addEventListener' : 'removeEventListener';\n window\n .matchMedia?.('(prefers-color-scheme: dark)')\n ?.[method]?.('change', () => this.#loadTheme());\n };\n\n async init() {\n await super.init?.();\n\n this.#onThemeChange();\n await Promise.all([\n this.#loadGlobalStyle(),\n this.#loadComponentsStyle(),\n ]);\n await this.#loadCustomStyle();\n\n this.observeAttributes(['theme'], this.#onThemeChange);\n\n this.observeAttributes(['theme-override'], () => this.#loadCustomStyle());\n\n this.observeAttributes(['style-id'], () => {\n this.#_themeResource = null;\n this.#loadFonts();\n this.#loadGlobalStyle();\n this.#loadComponentsStyle();\n });\n }\n };\n },\n);\n"],"names":["createSingletonMixin","compose","createValidateAttributesMixin","staticResourcesMixin","initLifecycleMixin","descopeUiMixin","configMixin","initElementMixin","observeAttributesMixin","injectStyleMixin","__classPrivateFieldGet","DEFAULT_STYLE_ID","__classPrivateFieldSet","flattenToVars","UI_COMPONENTS_URL_KEY","loadDevTheme","loadFont"],"mappings":";;;;;;;;;;;;;;;;AAcA,MAAM,eAAe,GAAG,CAAC,CAAS,EAAE,KAAoB,KACtD,CAAC,KAAK,IAAI,KAAK;AACf,IAAA,KAAK,KAAK,OAAO;AACjB,IAAA,KAAK,KAAK,MAAM;AAChB,IAAA,mFAAmF,CAAC;MAIzE,UAAU,GAAGA,+BAAoB,CAC5C,CAAqC,UAAa,KAAI;;AACpD,IAAA,MAAM,SAAS,GAAGC,kBAAO,CACvBC,2DAA6B,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC,EACzDC,yCAAoB,EACpBC,qCAAkB,EAClBC,6BAAc,EACdC,uBAAW,EACXC,iCAAgB,EAChBC,6CAAsB,EACtBC,iCAAgB,CACjB,CAAC,UAAU,CAAC,CAAC;IAEd,OAAO,EAAA,GAAA,MAAM,eAAgB,SAAQ,SAAS,CAAA;AAAvC,YAAA,WAAA,GAAA;;;gBACL,4BAA4B,CAAA,GAAA,CAAA,IAAA,EAAA,KAAA,CAAA,CAAA,CAAA;gBAC5B,4BAA4B,CAAA,GAAA,CAAA,IAAA,EAAA,KAAA,CAAA,CAAA,CAAA;gBAoD5B,+BAAqD,CAAA,GAAA,CAAA,IAAA,EAAA,KAAA,CAAA,CAAA,CAAA;AA4IrD,gBAAA,8BAAA,CAAA,GAAA,CAAA,IAAA,EAAiB,MAAK;AACpB,oBAAAC,4BAAA,CAAA,IAAI,EAAA,0BAAA,EAAA,GAAA,EAAA,0BAAA,CAAW,CAAf,IAAA,CAAA,IAAI,CAAa,CAAC;AAClB,oBAAAA,4BAAA,CAAA,IAAI,EAAA,4CAAA,EAAA,GAAA,CAA6B,CAAjC,IAAA,CAAA,IAAI,EAA8B,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC;AACzE,iBAAC,CAAC,CAAA;;gBAQF,4CAA+B,CAAA,GAAA,CAAA,IAAA,EAAA,CAAC,MAAe,KAAI;;oBACjD,MAAM,MAAM,GAAG,MAAM,GAAG,kBAAkB,GAAG,qBAAqB,CAAC;oBACnE,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,MAAA,MAAM;AACH,yBAAA,UAAU,uDAAG,8BAA8B,CAAC,0CAC1C,MAAM,CAAC,mDAAG,QAAQ,EAAE,MAAMA,6BAAA,IAAI,EAAA,0BAAA,EAAA,GAAA,EAAA,0BAAA,CAAW,MAAf,IAAI,CAAa,CAAC,CAAC;AACpD,iBAAC,CAAC,CAAA;aAuBH;AArOC,YAAA,IAAI,KAAK,GAAA;;gBACP,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAwB,CAAC;AAEhE,gBAAA,IAAI,KAAK,KAAK,IAAI,EAAE;AAClB,oBAAA,MAAM,QAAQ,GACZ,MAAM,CAAC,UAAU;yBACjB,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,MAAM,CAAC,UAAU,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,CAAA,MAAA,EAAG,8BAA8B,CAAC,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,OAAO,CAAA,CAAC;oBAE/D,OAAO,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;iBACpC;gBAED,OAAO,KAAK,IAAI,OAAO,CAAC;aACzB;AAED,YAAA,IAAI,OAAO,GAAA;gBACT,OAAO,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,IAAIC,0BAAgB,CAAC;aAC1D;AAED,YAAA,IAAI,aAAa,GAAA;gBACf,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC;AAChD,gBAAA,IAAI,CAAC,GAAG;AAAE,oBAAA,OAAO,IAAI,CAAC;AACtB,gBAAA,IAAI;AACF,oBAAA,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;iBACxB;gBAAC,OAAO,CAAC,EAAE;oBACV,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,mDAAmD,EACnD,CAAC,CACF,CAAC;AACF,oBAAA,OAAO,IAAI,CAAC;iBACb;aACF;AAkLD,YAAA,MAAM,IAAI,GAAA;;AACR,gBAAA,OAAM,CAAA,EAAA,GAAA,KAAK,CAAC,IAAI,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,CAAA,IAAA,CAAI,CAAA,CAAC;AAErB,gBAAAD,4BAAA,CAAA,IAAI,EAAA,8BAAA,EAAA,GAAA,CAAe,CAAnB,IAAA,CAAA,IAAI,CAAiB,CAAC;gBACtB,MAAM,OAAO,CAAC,GAAG,CAAC;AAChB,oBAAAA,4BAAA,CAAA,IAAI,EAAA,0BAAA,EAAA,GAAA,EAAA,gCAAA,CAAiB,CAArB,IAAA,CAAA,IAAI,CAAmB;AACvB,oBAAAA,4BAAA,CAAA,IAAI,EAAA,0BAAA,EAAA,GAAA,EAAA,oCAAA,CAAqB,CAAzB,IAAA,CAAA,IAAI,CAAuB;AAC5B,iBAAA,CAAC,CAAC;AACH,gBAAA,MAAMA,6BAAA,IAAI,EAAA,0BAAA,EAAA,GAAA,EAAA,gCAAA,CAAiB,CAArB,IAAA,CAAA,IAAI,CAAmB,CAAC;gBAE9B,IAAI,CAAC,iBAAiB,CAAC,CAAC,OAAO,CAAC,EAAEA,4BAAA,CAAA,IAAI,EAAe,8BAAA,EAAA,GAAA,CAAA,CAAC,CAAC;AAEvD,gBAAA,IAAI,CAAC,iBAAiB,CAAC,CAAC,gBAAgB,CAAC,EAAE,MAAMA,6BAAA,IAAI,EAAA,0BAAA,EAAA,GAAA,EAAA,gCAAA,CAAiB,MAArB,IAAI,CAAmB,CAAC,CAAC;gBAE1E,IAAI,CAAC,iBAAiB,CAAC,CAAC,UAAU,CAAC,EAAE,MAAK;AACxC,oBAAAE,4BAAA,CAAA,IAAI,EAAA,+BAAA,EAAmB,IAAI,EAAA,GAAA,CAAA,CAAC;AAC5B,oBAAAF,4BAAA,CAAA,IAAI,EAAA,0BAAA,EAAA,GAAA,EAAA,0BAAA,CAAW,CAAf,IAAA,CAAA,IAAI,CAAa,CAAC;AAClB,oBAAAA,4BAAA,CAAA,IAAI,EAAA,0BAAA,EAAA,GAAA,EAAA,gCAAA,CAAiB,CAArB,IAAA,CAAA,IAAI,CAAmB,CAAC;AACxB,oBAAAA,4BAAA,CAAA,IAAI,EAAA,0BAAA,EAAA,GAAA,EAAA,oCAAA,CAAqB,CAAzB,IAAA,CAAA,IAAI,CAAuB,CAAC;AAC9B,iBAAC,CAAC,CAAC;aACJ;AACF,SAAA;;;;;;;;AApMG,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC;AACpC,YAAA,IAAI,CAAC,QAAQ;AAAE,gBAAA,OAAO,EAAE,CAAC;AAEzB,YAAA,OAAQ,CAAC,OAAO,EAAE,MAAM,CAAW;AAChC,iBAAA,GAAG,CAAC,CAAC,KAAK,KAAI;;AACb,gBAAA,MAAM,OAAO,GAAG,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,MAAA,QAAQ,CAAC,KAAK,CAAC,0CAAE,OAAO,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,MAAM,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,OAAO,CAAC;AAC1D,gBAAA,MAAM,SAAS,GAAG,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,MAAA,QAAQ,CAAC,KAAK,CAAC,0CAAE,OAAO,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,MAAM,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,SAAS,CAAC;AAC9D,gBAAA,IAAI,CAAC,OAAO,IAAI,CAAC,SAAS;AAAE,oBAAA,OAAO,EAAE,CAAC;AAEtC,gBAAA,OAAO,CAAgB,aAAA,EAAA,KAAK,CAAM,GAAA,EAAAG,qBAAa,CAC7C,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAClC,CAAC,GAAG,KAAK,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAChC,GAAG,CAAC;AACP,aAAC,CAAC;iBACD,IAAI,CAAC,EAAE,CAAC,CAAC;SACb;sCAID,eAAK,2BAAA,GAAA;AACH,YAAA,IAAI;AACF,gBAAA,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAC3D,CAAA,EAAG,IAAI,CAAC,OAAO,OAAO,EACtB,MAAM,CACP,CAAC;;;gBAIF,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa,EAAE;oBAC1C,IAAI,YAAY,KAAZ,IAAA,IAAA,YAAY,KAAZ,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,YAAY,CAAE,OAAO,CAACC,iCAAqB,CAAC,EAAE;AAChD,wBAAA,IAAI;AACF,4BAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,0IAA0I,CAC3I,CAAC;AACF,4BAAA,MAAM,QAAQ,GAAG,MAAMC,oBAAY,EAAE,CAAC;4BAEtC,IAAI,QAAQ,EAAE;AACZ,gCAAA,YAAY,CAAC,KAAK,CAAC,UAAU,GAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EACxB,YAAY,CAAC,KAAK,CAAC,UAAU,GAC7B,QAAQ,CAAC,KAAK,CAAC,UAAU,CAC7B,CAAC;AACF,gCAAA,YAAY,CAAC,IAAI,CAAC,UAAU,GAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EACvB,YAAY,CAAC,IAAI,CAAC,UAAU,GAC5B,QAAQ,CAAC,IAAI,CAAC,UAAU,CAC5B,CAAC;AAEF,gCAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;;AAGlD,gCAAA,OAAO,CAAC,GAAG,CACT,kIAAkI,EAClI,2DAA2D,CAC5D,CAAC;6BACH;yBACF;wBAAC,OAAO,CAAC,EAAE;4BACV,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,uCAAuC,EAAE,CAAC,CAAC,CAAC;yBAC/D;qBACF;iBACF;AAED,gBAAA,OAAO,YAAY,CAAC;aACrB;YAAC,OAAO,CAAC,EAAE;gBACV,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,yBAAyB,EACzB,oDAAoD,CACrD,CAAC;aACH;AAED,YAAA,OAAO,SAAS,CAAC;SAClB;;AAGC,YAAA,IAAI,CAACL,4BAAA,CAAA,IAAI,EAAA,+BAAA,EAAA,GAAA,CAAgB,EAAE;gBACzBE,4BAAA,CAAA,IAAI,mCAAmBF,4BAAA,CAAA,IAAI,+DAAY,CAAhB,IAAA,CAAA,IAAI,CAAc,EAAA,GAAA,CAAA,CAAC;gBAC1CA,4BAAA,CAAA,IAAI,uCAAgB,CAAC,IAAI,CAAC,CAAC,KAAK,KAC9B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,EAAE,KAAK,CAAC,CAC1C,CAAC;aACH;;YAGD,OAAOA,4BAAA,CAAA,IAAI,EAAA,+BAAA,EAAA,GAAA,CAAgB,CAAC;SAC7B;2CAED,eAAK,gCAAA,GAAA;;AACH,YAAA,MAAM,KAAK,GAAG,MAAMA,4BAAA,CAAA,IAAI,sEAAe,CAAC;YACxC,IAAI,CAAC,KAAK,EAAE;gBACV,OAAO;aACR;AACD,YAAA,IAAI,CAACA,4BAAA,CAAA,IAAI,EAAA,4BAAA,EAAA,GAAA,CAAa,EAAE;gBACtBE,4BAAA,CAAA,IAAI,gCAAgB,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,EAAA,GAAA,CAAA,CAAC;aAC1C;AAED,YAAAF,4BAAA,CAAA,IAAI,EAAa,4BAAA,EAAA,GAAA,CAAA,CAAC,WAAW,CAC3B,CAAC,CAAA,CAAA,EAAA,GAAA,KAAK,KAAA,IAAA,IAAL,KAAK,KAAL,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,KAAK,CAAE,KAAK,0CAAE,OAAO,KAAI,EAAE,KAAK,CAAA,CAAA,EAAA,GAAA,KAAK,aAAL,KAAK,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAL,KAAK,CAAE,IAAI,MAAE,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,OAAO,KAAI,EAAE,CAAC,CAC7D,CAAC;SACH;2CAED,eAAK,gCAAA,GAAA;;AACH,YAAA,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;gBACvB,CAAA,EAAA,GAAAA,4BAAA,CAAA,IAAI,EAAa,4BAAA,EAAA,GAAA,CAAA,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,WAAW,CAAC,EAAE,CAAC,CAAC;gBACnC,OAAO;aACR;AACD,YAAA,IAAI,CAACA,4BAAA,CAAA,IAAI,EAAA,4BAAA,EAAA,GAAA,CAAa,EAAE;gBACtBE,4BAAA,CAAA,IAAI,gCAAgB,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,EAAA,GAAA,CAAA,CAAC;aAC1C;AACD,YAAAF,4BAAA,CAAA,IAAI,EAAA,4BAAA,EAAA,GAAA,CAAa,CAAC,WAAW,CAACA,4BAAA,CAAA,IAAI,EAAA,0BAAA,EAAA,GAAA,EAAA,uCAAA,CAAwB,CAA5B,IAAA,CAAA,IAAI,CAA0B,CAAC,CAAC;SAC/D;+CAED,eAAK,oCAAA,GAAA;;AACH,YAAA,MAAM,KAAK,GAAG,MAAMA,4BAAA,CAAA,IAAI,sEAAe,CAAC;AACxC,YAAA,IAAI,CAAC,KAAK;gBAAE,OAAO;AAEnB,YAAA,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC;YACvC,IAAI,SAAS,aAAT,SAAS,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAT,SAAS,CAAE,sBAAsB,EAAE;AACrC,gBAAA,SAAS,CAAC,sBAAsB,CAAC,MAAM,GAAG;oBACxC,KAAK,EAAE,CAAA,EAAA,GAAA,KAAK,KAAL,IAAA,IAAA,KAAK,uBAAL,KAAK,CAAE,KAAK,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,UAAU;oBAC/B,IAAI,EAAE,CAAA,EAAA,GAAA,KAAK,KAAL,IAAA,IAAA,KAAK,uBAAL,KAAK,CAAE,IAAI,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,UAAU;iBAC9B,CAAC;aACH;SACF;0CAED,eAAK,+BAAA,GAAA;;AACH,YAAA,MAAM,EAAE,aAAa,EAAE,GAAG,CAAC,MAAM,IAAI,CAAC,MAAM,KAAK,EAAE,CAAC;AAEpD,YAAA,MAAM,SAAS,GAAG,CAAA,EAAA,GAAA,aAAa,aAAb,aAAa,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAb,aAAa,CAAE,MAAM,MAAG,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAI,CAAC,OAAO,CAAC,CAAC;YACxD,MAAM,SAAS,GAAG,aAAa,KAAA,IAAA,IAAb,aAAa,KAAb,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,aAAa,CAAE,WAAW,CAAC;AAE7C,YAAA,MAAM,MAAM,GAAG,SAAS,IAAI,SAAS,CAAC;AAEtC,YAAA,MAAM,KAAK,GACT,CAAA,EAAA,GAAA,MAAM,aAAN,MAAM,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAN,MAAM,CAAG,IAAI,CAAC,KAAK,CAAC,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,KAAK,CAAC;AAE9B,YAAA,OAAO,KAAK,CAAC;SACd;qCAED,eAAK,0BAAA,GAAA;YACH,MAAM,KAAK,GAAG,MAAMA,4BAAA,CAAA,IAAI,EAAgB,0BAAA,EAAA,GAAA,EAAA,+BAAA,CAAA,CAAA,IAAA,CAApB,IAAI,CAAkB,CAAC;YAC3C,IAAI,KAAK,EAAE;gBACT,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,KAAI;AACpC,oBAAA,IAAI,IAAI,CAAC,GAAG,EAAE;wBACZ,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAA0B,uBAAA,EAAA,IAAI,CAAC,GAAG,CAAG,CAAA,CAAA,CAAC,CAAC;AACzD,wBAAAM,gBAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;qBACpB;AACH,iBAAC,CAAC,CAAC;aACJ;iBAAM;AACL,gBAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;aACvC;SACF;sCAED,eAAK,2BAAA,GAAA;YACH,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;AACxD,YAAA,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC;YACvC,IAAI,SAAS,aAAT,SAAS,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAT,SAAS,CAAE,sBAAsB,EAAE;gBACrC,SAAS,CAAC,sBAAsB,CAAC,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC;aAChE;SACF;;AAQC,YAAAN,4BAAA,CAAA,IAAI,EAAA,0BAAA,EAAA,GAAA,EAAA,0BAAA,CAAW,CAAf,IAAA,CAAA,IAAI,CAAa,CAAC;AAClB,YAAAA,4BAAA,CAAA,IAAI,EAAA,0BAAA,EAAA,GAAA,EAAA,2BAAA,CAAY,CAAhB,IAAA,CAAA,IAAI,CAAc,CAAC;SACpB;AA+BD,QAAA,EAAA,CAAA;AACJ,CAAC;;;;"}
@@ -1,5 +1,32 @@
1
1
  import { UI_COMPONENTS_URL_KEY } from '../descopeUiMixin/constants.js';
2
2
 
3
+ const isSafeCssVarSegment = (segment) => /^[a-zA-Z0-9-]+$/.test(segment);
4
+ const serializeOverrideCssValue = (value) => {
5
+ if (typeof value === 'number') {
6
+ return Number.isFinite(value) ? String(value) : null;
7
+ }
8
+ if (typeof value !== 'string')
9
+ return null;
10
+ if (/[;{}]/.test(value))
11
+ return null;
12
+ return value.trim();
13
+ };
14
+ const flattenToVars = (obj, onError, prefix = '') => Object.entries(obj).reduce((css, [key, value]) => {
15
+ if (!isSafeCssVarSegment(key)) {
16
+ onError('Ignoring invalid override-css token path segment');
17
+ return css;
18
+ }
19
+ const path = prefix ? `${prefix}-${key}` : key;
20
+ if (typeof value === 'object' && value !== null) {
21
+ return css + flattenToVars(value, onError, path);
22
+ }
23
+ const serializedValue = serializeOverrideCssValue(value);
24
+ if (serializedValue === null) {
25
+ onError('Ignoring invalid override-css token value');
26
+ return css;
27
+ }
28
+ return `${css}--descope-${path}:${serializedValue};`;
29
+ }, '');
3
30
  const loadFont = (url) => {
4
31
  const font = document.createElement('link');
5
32
  font.href = url;
@@ -27,5 +54,5 @@ const loadDevTheme = async () => {
27
54
  }
28
55
  };
29
56
 
30
- export { loadDevTheme, loadFont };
57
+ export { flattenToVars, isSafeCssVarSegment, loadDevTheme, loadFont, serializeOverrideCssValue };
31
58
  //# sourceMappingURL=helpers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.js","sources":["../../../../src/mixins/themeMixin/helpers.ts"],"sourcesContent":["import { UI_COMPONENTS_URL_KEY } from '../descopeUiMixin/constants';\n\nexport const loadFont = (url: string) => {\n const font = document.createElement('link');\n font.href = url;\n font.rel = 'stylesheet';\n document.head.appendChild(font);\n};\n\nexport const loadDevTheme = async () => {\n const componentsUrl = localStorage.getItem(UI_COMPONENTS_URL_KEY);\n const descopeDevUrl = componentsUrl?.replace(/[^\\/]+$/, 'DescopeDev.js');\n\n // eslint-disable-next-line no-console\n console.warn('Trying to load DescopeDev.js from', descopeDevUrl);\n const scriptEle = document.createElement('script');\n scriptEle.src = descopeDevUrl;\n document.body.appendChild(scriptEle);\n\n await new Promise((resolve, reject) => {\n scriptEle.onload = resolve;\n scriptEle.onerror = reject;\n });\n\n if (globalThis.DescopeDev) {\n const { themeToStyle, defaultTheme, darkTheme } = globalThis.DescopeDev;\n\n return {\n light: themeToStyle(defaultTheme),\n dark: themeToStyle(darkTheme),\n };\n }\n};\n"],"names":[],"mappings":";;AAEa,MAAA,QAAQ,GAAG,CAAC,GAAW,KAAI;IACtC,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;AAC5C,IAAA,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC;AAChB,IAAA,IAAI,CAAC,GAAG,GAAG,YAAY,CAAC;AACxB,IAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;AAClC,EAAE;AAEW,MAAA,YAAY,GAAG,YAAW;IACrC,MAAM,aAAa,GAAG,YAAY,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;AAClE,IAAA,MAAM,aAAa,GAAG,aAAa,KAAA,IAAA,IAAb,aAAa,KAAb,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,aAAa,CAAE,OAAO,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;;AAGzE,IAAA,OAAO,CAAC,IAAI,CAAC,mCAAmC,EAAE,aAAa,CAAC,CAAC;IACjE,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;AACnD,IAAA,SAAS,CAAC,GAAG,GAAG,aAAa,CAAC;AAC9B,IAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;IAErC,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAI;AACpC,QAAA,SAAS,CAAC,MAAM,GAAG,OAAO,CAAC;AAC3B,QAAA,SAAS,CAAC,OAAO,GAAG,MAAM,CAAC;AAC7B,KAAC,CAAC,CAAC;AAEH,IAAA,IAAI,UAAU,CAAC,UAAU,EAAE;QACzB,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,GAAG,UAAU,CAAC,UAAU,CAAC;QAExE,OAAO;AACL,YAAA,KAAK,EAAE,YAAY,CAAC,YAAY,CAAC;AACjC,YAAA,IAAI,EAAE,YAAY,CAAC,SAAS,CAAC;SAC9B,CAAC;KACH;AACH;;;;"}
1
+ {"version":3,"file":"helpers.js","sources":["../../../../src/mixins/themeMixin/helpers.ts"],"sourcesContent":["import { UI_COMPONENTS_URL_KEY } from '../descopeUiMixin/constants';\n\nexport const isSafeCssVarSegment = (segment: string): boolean =>\n /^[a-zA-Z0-9-]+$/.test(segment);\n\nexport const serializeOverrideCssValue = (value: unknown): string | null => {\n if (typeof value === 'number') {\n return Number.isFinite(value) ? String(value) : null;\n }\n if (typeof value !== 'string') return null;\n if (/[;{}]/.test(value)) return null;\n return value.trim();\n};\n\nexport const flattenToVars = (\n obj: Record<string, any>,\n onError: (msg: string) => void,\n prefix = '',\n): string =>\n Object.entries(obj).reduce((css, [key, value]) => {\n if (!isSafeCssVarSegment(key)) {\n onError('Ignoring invalid override-css token path segment');\n return css;\n }\n const path = prefix ? `${prefix}-${key}` : key;\n if (typeof value === 'object' && value !== null) {\n return css + flattenToVars(value, onError, path);\n }\n const serializedValue = serializeOverrideCssValue(value);\n if (serializedValue === null) {\n onError('Ignoring invalid override-css token value');\n return css;\n }\n return `${css}--descope-${path}:${serializedValue};`;\n }, '');\n\nexport const loadFont = (url: string) => {\n const font = document.createElement('link');\n font.href = url;\n font.rel = 'stylesheet';\n document.head.appendChild(font);\n};\n\nexport const loadDevTheme = async () => {\n const componentsUrl = localStorage.getItem(UI_COMPONENTS_URL_KEY);\n const descopeDevUrl = componentsUrl?.replace(/[^\\/]+$/, 'DescopeDev.js');\n\n // eslint-disable-next-line no-console\n console.warn('Trying to load DescopeDev.js from', descopeDevUrl);\n const scriptEle = document.createElement('script');\n scriptEle.src = descopeDevUrl;\n document.body.appendChild(scriptEle);\n\n await new Promise((resolve, reject) => {\n scriptEle.onload = resolve;\n scriptEle.onerror = reject;\n });\n\n if (globalThis.DescopeDev) {\n const { themeToStyle, defaultTheme, darkTheme } = globalThis.DescopeDev;\n\n return {\n light: themeToStyle(defaultTheme),\n dark: themeToStyle(darkTheme),\n };\n }\n};\n"],"names":[],"mappings":"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"}
@@ -7,7 +7,7 @@ import { initElementMixin } from '../initElementMixin.js';
7
7
  import { initLifecycleMixin } from '../initLifecycleMixin.js';
8
8
  import { staticResourcesMixin } from '../staticResourcesMixin/staticResourcesMixin.js';
9
9
  import { DEFAULT_STYLE_ID } from './constants.js';
10
- import { loadFont, loadDevTheme } from './helpers.js';
10
+ import { loadFont, flattenToVars, loadDevTheme } from './helpers.js';
11
11
  import { observeAttributesMixin } from '../observeAttributesMixin/observeAttributesMixin.js';
12
12
  import { UI_COMPONENTS_URL_KEY } from '../descopeUiMixin/constants.js';
13
13
  import { injectStyleMixin } from '../injectStyleMixin.js';
@@ -17,13 +17,14 @@ const themeValidation = (_, theme) => (theme || false) &&
17
17
  theme !== 'dark' &&
18
18
  'Supported theme values are "light", "dark", or leave empty for using the OS theme';
19
19
  const themeMixin = createSingletonMixin((superclass) => {
20
- var _ThemeMixinClass_instances, _ThemeMixinClass_globalStyle, _ThemeMixinClass__themeResource, _ThemeMixinClass_fetchTheme, _ThemeMixinClass_themeResource_get, _ThemeMixinClass_loadGlobalStyle, _ThemeMixinClass_loadComponentsStyle, _ThemeMixinClass_getFontsConfig, _ThemeMixinClass_loadFonts, _ThemeMixinClass_applyTheme, _ThemeMixinClass_onThemeChange, _ThemeMixinClass_loadTheme, _ThemeMixinClass_toggleOsThemeChangeListener, _a;
20
+ var _ThemeMixinClass_instances, _ThemeMixinClass_globalStyle, _ThemeMixinClass_customStyle, _ThemeMixinClass_getThemeOverrideString, _ThemeMixinClass__themeResource, _ThemeMixinClass_fetchTheme, _ThemeMixinClass_themeResource_get, _ThemeMixinClass_loadGlobalStyle, _ThemeMixinClass_loadCustomStyle, _ThemeMixinClass_loadComponentsStyle, _ThemeMixinClass_getFontsConfig, _ThemeMixinClass_loadFonts, _ThemeMixinClass_applyTheme, _ThemeMixinClass_onThemeChange, _ThemeMixinClass_loadTheme, _ThemeMixinClass_toggleOsThemeChangeListener, _a;
21
21
  const BaseClass = compose(createValidateAttributesMixin({ theme: themeValidation }), staticResourcesMixin, initLifecycleMixin, descopeUiMixin, configMixin, initElementMixin, observeAttributesMixin, injectStyleMixin)(superclass);
22
22
  return _a = class ThemeMixinClass extends BaseClass {
23
23
  constructor() {
24
24
  super(...arguments);
25
25
  _ThemeMixinClass_instances.add(this);
26
26
  _ThemeMixinClass_globalStyle.set(this, void 0);
27
+ _ThemeMixinClass_customStyle.set(this, void 0);
27
28
  _ThemeMixinClass__themeResource.set(this, void 0);
28
29
  _ThemeMixinClass_onThemeChange.set(this, () => {
29
30
  __classPrivateFieldGet(this, _ThemeMixinClass_instances, "m", _ThemeMixinClass_loadTheme).call(this);
@@ -50,6 +51,18 @@ const themeMixin = createSingletonMixin((superclass) => {
50
51
  get styleId() {
51
52
  return this.getAttribute('style-id') || DEFAULT_STYLE_ID;
52
53
  }
54
+ get themeOverride() {
55
+ const raw = this.getAttribute('theme-override');
56
+ if (!raw)
57
+ return null;
58
+ try {
59
+ return JSON.parse(raw);
60
+ }
61
+ catch (e) {
62
+ this.logger.error('Failed to parse theme-override attribute. error: ', e);
63
+ return null;
64
+ }
65
+ }
53
66
  async init() {
54
67
  var _b;
55
68
  await ((_b = super.init) === null || _b === void 0 ? void 0 : _b.call(this));
@@ -58,7 +71,9 @@ const themeMixin = createSingletonMixin((superclass) => {
58
71
  __classPrivateFieldGet(this, _ThemeMixinClass_instances, "m", _ThemeMixinClass_loadGlobalStyle).call(this),
59
72
  __classPrivateFieldGet(this, _ThemeMixinClass_instances, "m", _ThemeMixinClass_loadComponentsStyle).call(this),
60
73
  ]);
74
+ await __classPrivateFieldGet(this, _ThemeMixinClass_instances, "m", _ThemeMixinClass_loadCustomStyle).call(this);
61
75
  this.observeAttributes(['theme'], __classPrivateFieldGet(this, _ThemeMixinClass_onThemeChange, "f"));
76
+ this.observeAttributes(['theme-override'], () => __classPrivateFieldGet(this, _ThemeMixinClass_instances, "m", _ThemeMixinClass_loadCustomStyle).call(this));
62
77
  this.observeAttributes(['style-id'], () => {
63
78
  __classPrivateFieldSet(this, _ThemeMixinClass__themeResource, null, "f");
64
79
  __classPrivateFieldGet(this, _ThemeMixinClass_instances, "m", _ThemeMixinClass_loadFonts).call(this);
@@ -68,10 +83,26 @@ const themeMixin = createSingletonMixin((superclass) => {
68
83
  }
69
84
  },
70
85
  _ThemeMixinClass_globalStyle = new WeakMap(),
86
+ _ThemeMixinClass_customStyle = new WeakMap(),
71
87
  _ThemeMixinClass__themeResource = new WeakMap(),
72
88
  _ThemeMixinClass_onThemeChange = new WeakMap(),
73
89
  _ThemeMixinClass_toggleOsThemeChangeListener = new WeakMap(),
74
90
  _ThemeMixinClass_instances = new WeakSet(),
91
+ _ThemeMixinClass_getThemeOverrideString = function _ThemeMixinClass_getThemeOverrideString() {
92
+ const override = this.themeOverride;
93
+ if (!override)
94
+ return '';
95
+ return ['light', 'dark']
96
+ .map((theme) => {
97
+ var _b, _c, _d, _e, _f, _g;
98
+ const primary = (_d = (_c = (_b = override[theme]) === null || _b === void 0 ? void 0 : _b.globals) === null || _c === void 0 ? void 0 : _c.colors) === null || _d === void 0 ? void 0 : _d.primary;
99
+ const secondary = (_g = (_f = (_e = override[theme]) === null || _e === void 0 ? void 0 : _e.globals) === null || _f === void 0 ? void 0 : _f.colors) === null || _g === void 0 ? void 0 : _g.secondary;
100
+ if (!primary && !secondary)
101
+ return '';
102
+ return `[data-theme="${theme}"]{${flattenToVars({ colors: { primary, secondary } }, (msg) => this.logger.error(msg))}}`;
103
+ })
104
+ .join('');
105
+ },
75
106
  _ThemeMixinClass_fetchTheme = async function _ThemeMixinClass_fetchTheme() {
76
107
  try {
77
108
  const { body: fetchedTheme } = await this.fetchStaticResource(`${this.styleId}.json`, 'json');
@@ -113,13 +144,25 @@ const themeMixin = createSingletonMixin((superclass) => {
113
144
  _ThemeMixinClass_loadGlobalStyle = async function _ThemeMixinClass_loadGlobalStyle() {
114
145
  var _b, _c;
115
146
  const theme = await __classPrivateFieldGet(this, _ThemeMixinClass_instances, "a", _ThemeMixinClass_themeResource_get);
116
- if (!theme)
147
+ if (!theme) {
117
148
  return;
149
+ }
118
150
  if (!__classPrivateFieldGet(this, _ThemeMixinClass_globalStyle, "f")) {
119
151
  __classPrivateFieldSet(this, _ThemeMixinClass_globalStyle, this.injectStyle(''), "f");
120
152
  }
121
153
  __classPrivateFieldGet(this, _ThemeMixinClass_globalStyle, "f").replaceSync((((_b = theme === null || theme === void 0 ? void 0 : theme.light) === null || _b === void 0 ? void 0 : _b.globals) || '') + (((_c = theme === null || theme === void 0 ? void 0 : theme.dark) === null || _c === void 0 ? void 0 : _c.globals) || ''));
122
154
  },
155
+ _ThemeMixinClass_loadCustomStyle = async function _ThemeMixinClass_loadCustomStyle() {
156
+ var _b;
157
+ if (!this.themeOverride) {
158
+ (_b = __classPrivateFieldGet(this, _ThemeMixinClass_customStyle, "f")) === null || _b === void 0 ? void 0 : _b.replaceSync('');
159
+ return;
160
+ }
161
+ if (!__classPrivateFieldGet(this, _ThemeMixinClass_customStyle, "f")) {
162
+ __classPrivateFieldSet(this, _ThemeMixinClass_customStyle, this.injectStyle(''), "f");
163
+ }
164
+ __classPrivateFieldGet(this, _ThemeMixinClass_customStyle, "f").replaceSync(__classPrivateFieldGet(this, _ThemeMixinClass_instances, "m", _ThemeMixinClass_getThemeOverrideString).call(this));
165
+ },
123
166
  _ThemeMixinClass_loadComponentsStyle = async function _ThemeMixinClass_loadComponentsStyle() {
124
167
  var _b, _c;
125
168
  const theme = await __classPrivateFieldGet(this, _ThemeMixinClass_instances, "a", _ThemeMixinClass_themeResource_get);
@@ -1 +1 @@
1
- {"version":3,"file":"themeMixin.js","sources":["../../../../src/mixins/themeMixin/themeMixin.ts"],"sourcesContent":["/* eslint-disable no-underscore-dangle */\nimport { createSingletonMixin, compose } from '@descope/sdk-helpers';\nimport { configMixin } from '../configMixin';\nimport { createValidateAttributesMixin } from '../createValidateAttributesMixin';\nimport { descopeUiMixin } from '../descopeUiMixin';\nimport { initElementMixin } from '../initElementMixin';\nimport { initLifecycleMixin } from '../initLifecycleMixin';\nimport { staticResourcesMixin } from '../staticResourcesMixin';\nimport { DEFAULT_STYLE_ID } from './constants';\nimport { loadDevTheme, loadFont } from './helpers';\nimport { observeAttributesMixin } from '../observeAttributesMixin';\nimport { UI_COMPONENTS_URL_KEY } from '../descopeUiMixin/constants';\nimport { InjectedStyle, injectStyleMixin } from '../injectStyleMixin';\n\nconst themeValidation = (_: string, theme: string | null) =>\n (theme || false) &&\n theme !== 'light' &&\n theme !== 'dark' &&\n 'Supported theme values are \"light\", \"dark\", or leave empty for using the OS theme';\n\nexport type ThemeOptions = 'light' | 'dark' | 'os';\n\nexport const themeMixin = createSingletonMixin(\n <T extends CustomElementConstructor>(superclass: T) => {\n const BaseClass = compose(\n createValidateAttributesMixin({ theme: themeValidation }),\n staticResourcesMixin,\n initLifecycleMixin,\n descopeUiMixin,\n configMixin,\n initElementMixin,\n observeAttributesMixin,\n injectStyleMixin,\n )(superclass);\n\n return class ThemeMixinClass extends BaseClass {\n #globalStyle: InjectedStyle;\n\n get theme(): ThemeOptions {\n const theme = this.getAttribute('theme') as ThemeOptions | null;\n\n if (theme === 'os') {\n const isOsDark =\n window.matchMedia &&\n window.matchMedia?.('(prefers-color-scheme: dark)')?.matches;\n\n return isOsDark ? 'dark' : 'light';\n }\n\n return theme || 'light';\n }\n\n get styleId(): string {\n return this.getAttribute('style-id') || DEFAULT_STYLE_ID;\n }\n\n #_themeResource: Promise<void | Record<string, any>>;\n\n async #fetchTheme() {\n try {\n const { body: fetchedTheme } = await this.fetchStaticResource(\n `${this.styleId}.json`,\n 'json',\n );\n\n // In development mode, we sometimes want to override the UI components URL\n // The override components might have a different theme, so we need to merge it with the project theme in order to see the components correctly\n if (process.env.NODE_ENV === 'development') {\n if (localStorage?.getItem(UI_COMPONENTS_URL_KEY)) {\n try {\n this.logger.warn(\n 'You are in DEV mode, and UI components override URL was found\\ntrying to merge project theme with the default theme of the UI components',\n );\n const devTheme = await loadDevTheme();\n\n if (devTheme) {\n fetchedTheme.light.components = {\n ...fetchedTheme.light.components,\n ...devTheme.light.components,\n };\n fetchedTheme.dark.components = {\n ...fetchedTheme.dark.components,\n ...devTheme.dark.components,\n };\n\n this.logger.warn('Theme was merged successfully');\n\n // eslint-disable-next-line no-console\n console.log(\n '%cNOTICE! This is not the theme that will be used in production!\\n\\nMake sure to test it without the override UI components URL!',\n 'color: black; background-color:yellow; font-size: x-large',\n );\n }\n } catch (e) {\n this.logger.error('Failed to merge UI components theme\\n', e);\n }\n }\n }\n\n return fetchedTheme;\n } catch (e) {\n this.logger.error(\n 'Cannot fetch theme file',\n 'make sure that your projectId & flowId are correct',\n );\n }\n\n return undefined;\n }\n\n get #themeResource() {\n if (!this.#_themeResource) {\n this.#_themeResource = this.#fetchTheme();\n this.#_themeResource.then((theme) =>\n this.logger.debug('Fetched theme', theme),\n );\n }\n\n // eslint-disable-next-line no-underscore-dangle\n return this.#_themeResource;\n }\n\n async #loadGlobalStyle() {\n const theme = await this.#themeResource;\n if (!theme) return;\n\n if (!this.#globalStyle) {\n this.#globalStyle = this.injectStyle('');\n }\n\n this.#globalStyle.replaceSync(\n (theme?.light?.globals || '') + (theme?.dark?.globals || ''),\n );\n }\n\n async #loadComponentsStyle() {\n const theme = await this.#themeResource;\n if (!theme) return;\n\n const descopeUi = await this.descopeUi;\n if (descopeUi?.componentsThemeManager) {\n descopeUi.componentsThemeManager.themes = {\n light: theme?.light?.components,\n dark: theme?.dark?.components,\n };\n }\n }\n\n async #getFontsConfig() {\n const { projectConfig } = (await this.config) || {};\n\n const newConfig = projectConfig?.styles?.[this.styleId];\n const oldConfig = projectConfig?.cssTemplate;\n\n const config = newConfig || oldConfig;\n\n const fonts: Record<string, { url?: string }> | undefined =\n config?.[this.theme]?.fonts;\n\n return fonts;\n }\n\n async #loadFonts() {\n const fonts = await this.#getFontsConfig();\n if (fonts) {\n Object.values(fonts).forEach((font) => {\n if (font.url) {\n this.logger.debug(`Loading font from URL \"${font.url}\"`);\n loadFont(font.url);\n }\n });\n } else {\n this.logger.debug('No fonts to load');\n }\n }\n\n async #applyTheme() {\n this.rootElement.setAttribute('data-theme', this.theme);\n const descopeUi = await this.descopeUi;\n if (descopeUi?.componentsThemeManager) {\n descopeUi.componentsThemeManager.currentThemeName = this.theme;\n }\n }\n\n #onThemeChange = () => {\n this.#loadTheme();\n this.#toggleOsThemeChangeListener(this.getAttribute('theme') === 'os');\n };\n\n #loadTheme() {\n this.#loadFonts();\n this.#applyTheme();\n }\n\n // add or remove os theme change listener\n #toggleOsThemeChangeListener = (listen: boolean) => {\n const method = listen ? 'addEventListener' : 'removeEventListener';\n window\n .matchMedia?.('(prefers-color-scheme: dark)')\n ?.[method]?.('change', () => this.#loadTheme());\n };\n\n async init() {\n await super.init?.();\n\n this.#onThemeChange();\n await Promise.all([\n this.#loadGlobalStyle(),\n this.#loadComponentsStyle(),\n ]);\n\n this.observeAttributes(['theme'], this.#onThemeChange);\n\n this.observeAttributes(['style-id'], () => {\n this.#_themeResource = null;\n this.#loadFonts();\n this.#loadGlobalStyle();\n this.#loadComponentsStyle();\n });\n }\n };\n },\n);\n"],"names":[],"mappings":";;;;;;;;;;;;;;AAcA,MAAM,eAAe,GAAG,CAAC,CAAS,EAAE,KAAoB,KACtD,CAAC,KAAK,IAAI,KAAK;AACf,IAAA,KAAK,KAAK,OAAO;AACjB,IAAA,KAAK,KAAK,MAAM;AAChB,IAAA,mFAAmF,CAAC;MAIzE,UAAU,GAAG,oBAAoB,CAC5C,CAAqC,UAAa,KAAI;;AACpD,IAAA,MAAM,SAAS,GAAG,OAAO,CACvB,6BAA6B,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC,EACzD,oBAAoB,EACpB,kBAAkB,EAClB,cAAc,EACd,WAAW,EACX,gBAAgB,EAChB,sBAAsB,EACtB,gBAAgB,CACjB,CAAC,UAAU,CAAC,CAAC;IAEd,OAAO,EAAA,GAAA,MAAM,eAAgB,SAAQ,SAAS,CAAA;AAAvC,YAAA,WAAA,GAAA;;;gBACL,4BAA4B,CAAA,GAAA,CAAA,IAAA,EAAA,KAAA,CAAA,CAAA,CAAA;gBAoB5B,+BAAqD,CAAA,GAAA,CAAA,IAAA,EAAA,KAAA,CAAA,CAAA,CAAA;AAgIrD,gBAAA,8BAAA,CAAA,GAAA,CAAA,IAAA,EAAiB,MAAK;AACpB,oBAAA,sBAAA,CAAA,IAAI,EAAA,0BAAA,EAAA,GAAA,EAAA,0BAAA,CAAW,CAAf,IAAA,CAAA,IAAI,CAAa,CAAC;AAClB,oBAAA,sBAAA,CAAA,IAAI,EAAA,4CAAA,EAAA,GAAA,CAA6B,CAAjC,IAAA,CAAA,IAAI,EAA8B,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC;AACzE,iBAAC,CAAC,CAAA;;gBAQF,4CAA+B,CAAA,GAAA,CAAA,IAAA,EAAA,CAAC,MAAe,KAAI;;oBACjD,MAAM,MAAM,GAAG,MAAM,GAAG,kBAAkB,GAAG,qBAAqB,CAAC;oBACnE,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,MAAA,MAAM;AACH,yBAAA,UAAU,uDAAG,8BAA8B,CAAC,0CAC1C,MAAM,CAAC,mDAAG,QAAQ,EAAE,MAAM,uBAAA,IAAI,EAAA,0BAAA,EAAA,GAAA,EAAA,0BAAA,CAAW,MAAf,IAAI,CAAa,CAAC,CAAC;AACpD,iBAAC,CAAC,CAAA;aAoBH;AAtLC,YAAA,IAAI,KAAK,GAAA;;gBACP,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAwB,CAAC;AAEhE,gBAAA,IAAI,KAAK,KAAK,IAAI,EAAE;AAClB,oBAAA,MAAM,QAAQ,GACZ,MAAM,CAAC,UAAU;yBACjB,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,MAAM,CAAC,UAAU,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,CAAA,MAAA,EAAG,8BAA8B,CAAC,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,OAAO,CAAA,CAAC;oBAE/D,OAAO,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;iBACpC;gBAED,OAAO,KAAK,IAAI,OAAO,CAAC;aACzB;AAED,YAAA,IAAI,OAAO,GAAA;gBACT,OAAO,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,gBAAgB,CAAC;aAC1D;AAoJD,YAAA,MAAM,IAAI,GAAA;;AACR,gBAAA,OAAM,CAAA,EAAA,GAAA,KAAK,CAAC,IAAI,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,CAAA,IAAA,CAAI,CAAA,CAAC;AAErB,gBAAA,sBAAA,CAAA,IAAI,EAAA,8BAAA,EAAA,GAAA,CAAe,CAAnB,IAAA,CAAA,IAAI,CAAiB,CAAC;gBACtB,MAAM,OAAO,CAAC,GAAG,CAAC;AAChB,oBAAA,sBAAA,CAAA,IAAI,EAAA,0BAAA,EAAA,GAAA,EAAA,gCAAA,CAAiB,CAArB,IAAA,CAAA,IAAI,CAAmB;AACvB,oBAAA,sBAAA,CAAA,IAAI,EAAA,0BAAA,EAAA,GAAA,EAAA,oCAAA,CAAqB,CAAzB,IAAA,CAAA,IAAI,CAAuB;AAC5B,iBAAA,CAAC,CAAC;gBAEH,IAAI,CAAC,iBAAiB,CAAC,CAAC,OAAO,CAAC,EAAE,sBAAA,CAAA,IAAI,EAAe,8BAAA,EAAA,GAAA,CAAA,CAAC,CAAC;gBAEvD,IAAI,CAAC,iBAAiB,CAAC,CAAC,UAAU,CAAC,EAAE,MAAK;AACxC,oBAAA,sBAAA,CAAA,IAAI,EAAA,+BAAA,EAAmB,IAAI,EAAA,GAAA,CAAA,CAAC;AAC5B,oBAAA,sBAAA,CAAA,IAAI,EAAA,0BAAA,EAAA,GAAA,EAAA,0BAAA,CAAW,CAAf,IAAA,CAAA,IAAI,CAAa,CAAC;AAClB,oBAAA,sBAAA,CAAA,IAAI,EAAA,0BAAA,EAAA,GAAA,EAAA,gCAAA,CAAiB,CAArB,IAAA,CAAA,IAAI,CAAmB,CAAC;AACxB,oBAAA,sBAAA,CAAA,IAAI,EAAA,0BAAA,EAAA,GAAA,EAAA,oCAAA,CAAqB,CAAzB,IAAA,CAAA,IAAI,CAAuB,CAAC;AAC9B,iBAAC,CAAC,CAAC;aACJ;AACF,SAAA;;;;;;sCAlKC,eAAK,2BAAA,GAAA;AACH,YAAA,IAAI;AACF,gBAAA,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAC3D,CAAA,EAAG,IAAI,CAAC,OAAO,OAAO,EACtB,MAAM,CACP,CAAC;;;gBAIF,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa,EAAE;oBAC1C,IAAI,YAAY,KAAZ,IAAA,IAAA,YAAY,KAAZ,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,YAAY,CAAE,OAAO,CAAC,qBAAqB,CAAC,EAAE;AAChD,wBAAA,IAAI;AACF,4BAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,0IAA0I,CAC3I,CAAC;AACF,4BAAA,MAAM,QAAQ,GAAG,MAAM,YAAY,EAAE,CAAC;4BAEtC,IAAI,QAAQ,EAAE;AACZ,gCAAA,YAAY,CAAC,KAAK,CAAC,UAAU,GAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EACxB,YAAY,CAAC,KAAK,CAAC,UAAU,GAC7B,QAAQ,CAAC,KAAK,CAAC,UAAU,CAC7B,CAAC;AACF,gCAAA,YAAY,CAAC,IAAI,CAAC,UAAU,GAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EACvB,YAAY,CAAC,IAAI,CAAC,UAAU,GAC5B,QAAQ,CAAC,IAAI,CAAC,UAAU,CAC5B,CAAC;AAEF,gCAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;;AAGlD,gCAAA,OAAO,CAAC,GAAG,CACT,kIAAkI,EAClI,2DAA2D,CAC5D,CAAC;6BACH;yBACF;wBAAC,OAAO,CAAC,EAAE;4BACV,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,uCAAuC,EAAE,CAAC,CAAC,CAAC;yBAC/D;qBACF;iBACF;AAED,gBAAA,OAAO,YAAY,CAAC;aACrB;YAAC,OAAO,CAAC,EAAE;gBACV,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,yBAAyB,EACzB,oDAAoD,CACrD,CAAC;aACH;AAED,YAAA,OAAO,SAAS,CAAC;SAClB;;AAGC,YAAA,IAAI,CAAC,sBAAA,CAAA,IAAI,EAAA,+BAAA,EAAA,GAAA,CAAgB,EAAE;gBACzB,sBAAA,CAAA,IAAI,mCAAmB,sBAAA,CAAA,IAAI,+DAAY,CAAhB,IAAA,CAAA,IAAI,CAAc,EAAA,GAAA,CAAA,CAAC;gBAC1C,sBAAA,CAAA,IAAI,uCAAgB,CAAC,IAAI,CAAC,CAAC,KAAK,KAC9B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,EAAE,KAAK,CAAC,CAC1C,CAAC;aACH;;YAGD,OAAO,sBAAA,CAAA,IAAI,EAAA,+BAAA,EAAA,GAAA,CAAgB,CAAC;SAC7B;2CAED,eAAK,gCAAA,GAAA;;AACH,YAAA,MAAM,KAAK,GAAG,MAAM,sBAAA,CAAA,IAAI,sEAAe,CAAC;AACxC,YAAA,IAAI,CAAC,KAAK;gBAAE,OAAO;AAEnB,YAAA,IAAI,CAAC,sBAAA,CAAA,IAAI,EAAA,4BAAA,EAAA,GAAA,CAAa,EAAE;gBACtB,sBAAA,CAAA,IAAI,gCAAgB,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,EAAA,GAAA,CAAA,CAAC;aAC1C;AAED,YAAA,sBAAA,CAAA,IAAI,EAAa,4BAAA,EAAA,GAAA,CAAA,CAAC,WAAW,CAC3B,CAAC,CAAA,CAAA,EAAA,GAAA,KAAK,KAAA,IAAA,IAAL,KAAK,KAAL,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,KAAK,CAAE,KAAK,0CAAE,OAAO,KAAI,EAAE,KAAK,CAAA,CAAA,EAAA,GAAA,KAAK,aAAL,KAAK,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAL,KAAK,CAAE,IAAI,MAAE,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,OAAO,KAAI,EAAE,CAAC,CAC7D,CAAC;SACH;+CAED,eAAK,oCAAA,GAAA;;AACH,YAAA,MAAM,KAAK,GAAG,MAAM,sBAAA,CAAA,IAAI,sEAAe,CAAC;AACxC,YAAA,IAAI,CAAC,KAAK;gBAAE,OAAO;AAEnB,YAAA,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC;YACvC,IAAI,SAAS,aAAT,SAAS,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAT,SAAS,CAAE,sBAAsB,EAAE;AACrC,gBAAA,SAAS,CAAC,sBAAsB,CAAC,MAAM,GAAG;oBACxC,KAAK,EAAE,CAAA,EAAA,GAAA,KAAK,KAAL,IAAA,IAAA,KAAK,uBAAL,KAAK,CAAE,KAAK,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,UAAU;oBAC/B,IAAI,EAAE,CAAA,EAAA,GAAA,KAAK,KAAL,IAAA,IAAA,KAAK,uBAAL,KAAK,CAAE,IAAI,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,UAAU;iBAC9B,CAAC;aACH;SACF;0CAED,eAAK,+BAAA,GAAA;;AACH,YAAA,MAAM,EAAE,aAAa,EAAE,GAAG,CAAC,MAAM,IAAI,CAAC,MAAM,KAAK,EAAE,CAAC;AAEpD,YAAA,MAAM,SAAS,GAAG,CAAA,EAAA,GAAA,aAAa,aAAb,aAAa,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAb,aAAa,CAAE,MAAM,MAAG,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAI,CAAC,OAAO,CAAC,CAAC;YACxD,MAAM,SAAS,GAAG,aAAa,KAAA,IAAA,IAAb,aAAa,KAAb,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,aAAa,CAAE,WAAW,CAAC;AAE7C,YAAA,MAAM,MAAM,GAAG,SAAS,IAAI,SAAS,CAAC;AAEtC,YAAA,MAAM,KAAK,GACT,CAAA,EAAA,GAAA,MAAM,aAAN,MAAM,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAN,MAAM,CAAG,IAAI,CAAC,KAAK,CAAC,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,KAAK,CAAC;AAE9B,YAAA,OAAO,KAAK,CAAC;SACd;qCAED,eAAK,0BAAA,GAAA;YACH,MAAM,KAAK,GAAG,MAAM,sBAAA,CAAA,IAAI,EAAgB,0BAAA,EAAA,GAAA,EAAA,+BAAA,CAAA,CAAA,IAAA,CAApB,IAAI,CAAkB,CAAC;YAC3C,IAAI,KAAK,EAAE;gBACT,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,KAAI;AACpC,oBAAA,IAAI,IAAI,CAAC,GAAG,EAAE;wBACZ,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAA0B,uBAAA,EAAA,IAAI,CAAC,GAAG,CAAG,CAAA,CAAA,CAAC,CAAC;AACzD,wBAAA,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;qBACpB;AACH,iBAAC,CAAC,CAAC;aACJ;iBAAM;AACL,gBAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;aACvC;SACF;sCAED,eAAK,2BAAA,GAAA;YACH,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;AACxD,YAAA,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC;YACvC,IAAI,SAAS,aAAT,SAAS,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAT,SAAS,CAAE,sBAAsB,EAAE;gBACrC,SAAS,CAAC,sBAAsB,CAAC,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC;aAChE;SACF;;AAQC,YAAA,sBAAA,CAAA,IAAI,EAAA,0BAAA,EAAA,GAAA,EAAA,0BAAA,CAAW,CAAf,IAAA,CAAA,IAAI,CAAa,CAAC;AAClB,YAAA,sBAAA,CAAA,IAAI,EAAA,0BAAA,EAAA,GAAA,EAAA,2BAAA,CAAY,CAAhB,IAAA,CAAA,IAAI,CAAc,CAAC;SACpB;AA4BD,QAAA,EAAA,CAAA;AACJ,CAAC;;;;"}
1
+ {"version":3,"file":"themeMixin.js","sources":["../../../../src/mixins/themeMixin/themeMixin.ts"],"sourcesContent":["/* eslint-disable no-underscore-dangle */\nimport { createSingletonMixin, compose } from '@descope/sdk-helpers';\nimport { configMixin } from '../configMixin';\nimport { createValidateAttributesMixin } from '../createValidateAttributesMixin';\nimport { descopeUiMixin } from '../descopeUiMixin';\nimport { initElementMixin } from '../initElementMixin';\nimport { initLifecycleMixin } from '../initLifecycleMixin';\nimport { staticResourcesMixin } from '../staticResourcesMixin';\nimport { DEFAULT_STYLE_ID } from './constants';\nimport { flattenToVars, loadDevTheme, loadFont } from './helpers';\nimport { observeAttributesMixin } from '../observeAttributesMixin';\nimport { UI_COMPONENTS_URL_KEY } from '../descopeUiMixin/constants';\nimport { InjectedStyle, injectStyleMixin } from '../injectStyleMixin';\n\nconst themeValidation = (_: string, theme: string | null) =>\n (theme || false) &&\n theme !== 'light' &&\n theme !== 'dark' &&\n 'Supported theme values are \"light\", \"dark\", or leave empty for using the OS theme';\n\nexport type ThemeOptions = 'light' | 'dark' | 'os';\n\nexport const themeMixin = createSingletonMixin(\n <T extends CustomElementConstructor>(superclass: T) => {\n const BaseClass = compose(\n createValidateAttributesMixin({ theme: themeValidation }),\n staticResourcesMixin,\n initLifecycleMixin,\n descopeUiMixin,\n configMixin,\n initElementMixin,\n observeAttributesMixin,\n injectStyleMixin,\n )(superclass);\n\n return class ThemeMixinClass extends BaseClass {\n #globalStyle: InjectedStyle;\n #customStyle: InjectedStyle;\n\n get theme(): ThemeOptions {\n const theme = this.getAttribute('theme') as ThemeOptions | null;\n\n if (theme === 'os') {\n const isOsDark =\n window.matchMedia &&\n window.matchMedia?.('(prefers-color-scheme: dark)')?.matches;\n\n return isOsDark ? 'dark' : 'light';\n }\n\n return theme || 'light';\n }\n\n get styleId(): string {\n return this.getAttribute('style-id') || DEFAULT_STYLE_ID;\n }\n\n get themeOverride(): Record<string, any> | null {\n const raw = this.getAttribute('theme-override');\n if (!raw) return null;\n try {\n return JSON.parse(raw);\n } catch (e) {\n this.logger.error(\n 'Failed to parse theme-override attribute. error: ',\n e,\n );\n return null;\n }\n }\n\n #getThemeOverrideString(): string {\n const override = this.themeOverride;\n if (!override) return '';\n\n return (['light', 'dark'] as const)\n .map((theme) => {\n const primary = override[theme]?.globals?.colors?.primary;\n const secondary = override[theme]?.globals?.colors?.secondary;\n if (!primary && !secondary) return '';\n\n return `[data-theme=\"${theme}\"]{${flattenToVars(\n { colors: { primary, secondary } },\n (msg) => this.logger.error(msg),\n )}}`;\n })\n .join('');\n }\n\n #_themeResource: Promise<void | Record<string, any>>;\n\n async #fetchTheme() {\n try {\n const { body: fetchedTheme } = await this.fetchStaticResource(\n `${this.styleId}.json`,\n 'json',\n );\n\n // In development mode, we sometimes want to override the UI components URL\n // The override components might have a different theme, so we need to merge it with the project theme in order to see the components correctly\n if (process.env.NODE_ENV === 'development') {\n if (localStorage?.getItem(UI_COMPONENTS_URL_KEY)) {\n try {\n this.logger.warn(\n 'You are in DEV mode, and UI components override URL was found\\ntrying to merge project theme with the default theme of the UI components',\n );\n const devTheme = await loadDevTheme();\n\n if (devTheme) {\n fetchedTheme.light.components = {\n ...fetchedTheme.light.components,\n ...devTheme.light.components,\n };\n fetchedTheme.dark.components = {\n ...fetchedTheme.dark.components,\n ...devTheme.dark.components,\n };\n\n this.logger.warn('Theme was merged successfully');\n\n // eslint-disable-next-line no-console\n console.log(\n '%cNOTICE! This is not the theme that will be used in production!\\n\\nMake sure to test it without the override UI components URL!',\n 'color: black; background-color:yellow; font-size: x-large',\n );\n }\n } catch (e) {\n this.logger.error('Failed to merge UI components theme\\n', e);\n }\n }\n }\n\n return fetchedTheme;\n } catch (e) {\n this.logger.error(\n 'Cannot fetch theme file',\n 'make sure that your projectId & flowId are correct',\n );\n }\n\n return undefined;\n }\n\n get #themeResource() {\n if (!this.#_themeResource) {\n this.#_themeResource = this.#fetchTheme();\n this.#_themeResource.then((theme) =>\n this.logger.debug('Fetched theme', theme),\n );\n }\n\n // eslint-disable-next-line no-underscore-dangle\n return this.#_themeResource;\n }\n\n async #loadGlobalStyle() {\n const theme = await this.#themeResource;\n if (!theme) {\n return;\n }\n if (!this.#globalStyle) {\n this.#globalStyle = this.injectStyle('');\n }\n\n this.#globalStyle.replaceSync(\n (theme?.light?.globals || '') + (theme?.dark?.globals || ''),\n );\n }\n\n async #loadCustomStyle() {\n if (!this.themeOverride) {\n this.#customStyle?.replaceSync('');\n return;\n }\n if (!this.#customStyle) {\n this.#customStyle = this.injectStyle('');\n }\n this.#customStyle.replaceSync(this.#getThemeOverrideString());\n }\n\n async #loadComponentsStyle() {\n const theme = await this.#themeResource;\n if (!theme) return;\n\n const descopeUi = await this.descopeUi;\n if (descopeUi?.componentsThemeManager) {\n descopeUi.componentsThemeManager.themes = {\n light: theme?.light?.components,\n dark: theme?.dark?.components,\n };\n }\n }\n\n async #getFontsConfig() {\n const { projectConfig } = (await this.config) || {};\n\n const newConfig = projectConfig?.styles?.[this.styleId];\n const oldConfig = projectConfig?.cssTemplate;\n\n const config = newConfig || oldConfig;\n\n const fonts: Record<string, { url?: string }> | undefined =\n config?.[this.theme]?.fonts;\n\n return fonts;\n }\n\n async #loadFonts() {\n const fonts = await this.#getFontsConfig();\n if (fonts) {\n Object.values(fonts).forEach((font) => {\n if (font.url) {\n this.logger.debug(`Loading font from URL \"${font.url}\"`);\n loadFont(font.url);\n }\n });\n } else {\n this.logger.debug('No fonts to load');\n }\n }\n\n async #applyTheme() {\n this.rootElement.setAttribute('data-theme', this.theme);\n const descopeUi = await this.descopeUi;\n if (descopeUi?.componentsThemeManager) {\n descopeUi.componentsThemeManager.currentThemeName = this.theme;\n }\n }\n\n #onThemeChange = () => {\n this.#loadTheme();\n this.#toggleOsThemeChangeListener(this.getAttribute('theme') === 'os');\n };\n\n #loadTheme() {\n this.#loadFonts();\n this.#applyTheme();\n }\n\n // add or remove os theme change listener\n #toggleOsThemeChangeListener = (listen: boolean) => {\n const method = listen ? 'addEventListener' : 'removeEventListener';\n window\n .matchMedia?.('(prefers-color-scheme: dark)')\n ?.[method]?.('change', () => this.#loadTheme());\n };\n\n async init() {\n await super.init?.();\n\n this.#onThemeChange();\n await Promise.all([\n this.#loadGlobalStyle(),\n this.#loadComponentsStyle(),\n ]);\n await this.#loadCustomStyle();\n\n this.observeAttributes(['theme'], this.#onThemeChange);\n\n this.observeAttributes(['theme-override'], () => this.#loadCustomStyle());\n\n this.observeAttributes(['style-id'], () => {\n this.#_themeResource = null;\n this.#loadFonts();\n this.#loadGlobalStyle();\n this.#loadComponentsStyle();\n });\n }\n };\n },\n);\n"],"names":[],"mappings":"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"}