@orbit-work/ui 0.1.2 → 0.1.3

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 (37) hide show
  1. package/dist/appearance.cjs +4 -2
  2. package/dist/appearance.cjs.map +1 -1
  3. package/dist/appearance.d.cts +7 -1
  4. package/dist/appearance.d.ts +7 -1
  5. package/dist/appearance.js +5 -3
  6. package/dist/brand-preview.cjs +14 -0
  7. package/dist/brand-preview.cjs.map +1 -0
  8. package/dist/brand-preview.d.cts +13 -0
  9. package/dist/brand-preview.d.ts +13 -0
  10. package/dist/brand-preview.js +14 -0
  11. package/dist/brand-preview.js.map +1 -0
  12. package/dist/{chunk-KRP43SUA.cjs → chunk-JC7BHKS4.cjs} +2 -398
  13. package/dist/chunk-JC7BHKS4.cjs.map +1 -0
  14. package/dist/chunk-K7ONUTLA.cjs +240 -0
  15. package/dist/chunk-K7ONUTLA.cjs.map +1 -0
  16. package/dist/chunk-KTNWR3H5.js +399 -0
  17. package/dist/chunk-KTNWR3H5.js.map +1 -0
  18. package/dist/{chunk-S3R5QFO4.js → chunk-LSGO6AQR.js} +2 -398
  19. package/dist/chunk-LSGO6AQR.js.map +1 -0
  20. package/dist/chunk-Q7B4M5GC.cjs +399 -0
  21. package/dist/chunk-Q7B4M5GC.cjs.map +1 -0
  22. package/dist/chunk-ZXMHCL6D.js +240 -0
  23. package/dist/chunk-ZXMHCL6D.js.map +1 -0
  24. package/dist/core.css +12 -3
  25. package/dist/core.scoped.css +7888 -0
  26. package/dist/index.cjs +212 -377
  27. package/dist/index.cjs.map +1 -1
  28. package/dist/index.d.cts +37 -4
  29. package/dist/index.d.ts +37 -4
  30. package/dist/index.js +191 -356
  31. package/dist/index.js.map +1 -1
  32. package/dist/{appearance-D7uh_ZTy.d.cts → unifiedTheme-DQ-sETKO.d.cts} +13 -4
  33. package/dist/{appearance-D7uh_ZTy.d.ts → unifiedTheme-DQ-sETKO.d.ts} +13 -4
  34. package/dist/workbench.css +12 -3
  35. package/package.json +16 -2
  36. package/dist/chunk-KRP43SUA.cjs.map +0 -1
  37. package/dist/chunk-S3R5QFO4.js.map +0 -1
@@ -0,0 +1,240 @@
1
+ import {
2
+ ORBITWORK_SKIN_CSS_VARIABLES,
3
+ fontScaleTokens,
4
+ normalizeOrbitworkSkinPublicPartStyles,
5
+ orbitworkSkinImageCssValue,
6
+ resolveOrbitworkFontScale,
7
+ resolveOrbitworkSkinChatBackgroundMask
8
+ } from "./chunk-LSGO6AQR.js";
9
+
10
+ // src/theme/core/unifiedTheme.ts
11
+ var TENANT_TOKEN_MAP = {
12
+ bg: "--ow-bg",
13
+ surface: "--ow-surface",
14
+ surface2: "--ow-surface-2",
15
+ text: "--ow-text",
16
+ text2: "--ow-text-2",
17
+ text3: "--ow-text-3",
18
+ border: "--ow-border",
19
+ borderStrong: "--ow-border-strong"
20
+ };
21
+ function tenantTokens(theme, mode) {
22
+ const colors = theme?.modes[mode];
23
+ if (!colors) return {};
24
+ return Object.fromEntries(
25
+ Object.entries(TENANT_TOKEN_MAP).map(([key, token]) => [token, colors[key]])
26
+ );
27
+ }
28
+ function skinTokens(skin, mode) {
29
+ const values = skin?.modes[mode];
30
+ if (!values) return {};
31
+ const tokens = {};
32
+ for (const [rawKey, value] of Object.entries(values)) {
33
+ const key = rawKey;
34
+ const property = ORBITWORK_SKIN_CSS_VARIABLES[key];
35
+ if (!property || !value) continue;
36
+ if (key === "chatBackgroundImage") {
37
+ const image = orbitworkSkinImageCssValue(value);
38
+ if (image) tokens[property] = image;
39
+ continue;
40
+ }
41
+ if (key === "chatBackgroundMaskColor") {
42
+ const mask = resolveOrbitworkSkinChatBackgroundMask(value);
43
+ tokens[property] = mask.color;
44
+ tokens["--ow-chat-bg-mask-start-opacity"] = `${mask.startOpacity}%`;
45
+ tokens["--ow-chat-bg-mask-end-opacity"] = `${mask.endOpacity}%`;
46
+ continue;
47
+ }
48
+ if (key === "chatBackgroundOverlay" && values.chatBackgroundMaskColor) continue;
49
+ tokens[property] = value;
50
+ }
51
+ return tokens;
52
+ }
53
+ function localeCandidates(locale) {
54
+ let canonical = "en-US";
55
+ try {
56
+ canonical = Intl.getCanonicalLocales(locale)[0] ?? "en-US";
57
+ } catch {
58
+ }
59
+ const language = canonical.split("-")[0] ?? "en";
60
+ return [.../* @__PURE__ */ new Set([canonical, language, "en-US"])];
61
+ }
62
+ function localizedCopy(source, locale) {
63
+ if (!source) return void 0;
64
+ for (const candidate of localeCandidates(locale)) {
65
+ if (source[candidate]) return source[candidate];
66
+ }
67
+ return void 0;
68
+ }
69
+ function mergeUnifiedTheme(brand, tenant, userSkin, mode, locale = "en-US", appearanceOverlaySkin = null, fontScalePreference = null) {
70
+ const chatBackgroundImage = appearanceOverlaySkin?.modes[mode]?.chatBackgroundImage ?? userSkin?.modes[mode]?.chatBackgroundImage;
71
+ const tokens = {
72
+ ...brand?.modes[mode] ?? {},
73
+ ...tenantTokens(tenant, mode),
74
+ ...skinTokens(userSkin, mode),
75
+ ...skinTokens(appearanceOverlaySkin, mode),
76
+ ...fontScaleTokens(resolveOrbitworkFontScale(fontScalePreference, userSkin?.fontScale ?? brand?.fontScale))
77
+ };
78
+ const typography = tenant?.typography ?? brand?.typography;
79
+ if (typography) {
80
+ tokens["--ow-font-sans"] = typography.fontSans;
81
+ tokens["--ow-font-mono"] = typography.fontMono;
82
+ }
83
+ const brandCopy = localizedCopy(brand?.branding, locale);
84
+ const tenantCopy = localizedCopy(tenant?.branding, locale);
85
+ const copy = tenantCopy ? { ...brandCopy ?? {}, ...tenantCopy } : brandCopy ?? null;
86
+ const logo = tenant?.logo || brand?.logo;
87
+ const loginKV = tenant?.loginKV || brand?.loginKV;
88
+ const favicon = tenant?.favicon || brand?.favicon;
89
+ const branding = copy ? {
90
+ ...copy,
91
+ ...logo ? { logo } : {},
92
+ ...loginKV ? { loginKV } : {},
93
+ ...favicon ? { favicon } : {}
94
+ } : null;
95
+ return {
96
+ mode,
97
+ tokens,
98
+ branding,
99
+ skin: userSkin?.modes[mode] || appearanceOverlaySkin?.modes[mode] ? {
100
+ id: userSkin?.id ?? appearanceOverlaySkin?.id ?? "default",
101
+ ...userSkin?.contributes?.publicPartStyles ? { publicPartStyles: userSkin.contributes.publicPartStyles } : {},
102
+ ...chatBackgroundImage ? { chatBackgroundImage } : {},
103
+ hasChatBackgroundImage: Boolean(chatBackgroundImage),
104
+ hasUserBubbleStyle: Boolean(
105
+ userSkin?.modes[mode]?.userBubbleBackground || userSkin?.modes[mode]?.userBubbleForeground || userSkin?.modes[mode]?.userBubbleBorder
106
+ )
107
+ } : null,
108
+ sources: {
109
+ brand: brand?.id ?? null,
110
+ tenant: tenant?.name ?? null,
111
+ user: userSkin?.id ?? null
112
+ }
113
+ };
114
+ }
115
+
116
+ // src/theme/utils/themeApplier.ts
117
+ var managedProperties = /* @__PURE__ */ new WeakMap();
118
+ var managedPublicPartStyles = /* @__PURE__ */ new WeakMap();
119
+ var managedPublicPartScopes = /* @__PURE__ */ new WeakMap();
120
+ var managedChatBackgroundImages = /* @__PURE__ */ new WeakMap();
121
+ var nextPublicPartScope = 0;
122
+ var CHAT_BACKGROUND_IMAGE_PROPERTY = "--ow-chat-bg-image";
123
+ function applyUnifiedTheme(theme, target = document.documentElement) {
124
+ const previous = managedProperties.get(target) ?? /* @__PURE__ */ new Set();
125
+ const next = new Set(Object.keys(theme.tokens));
126
+ for (const property of previous) {
127
+ if (!next.has(property)) target.style.removeProperty(property);
128
+ }
129
+ for (const [property, value] of Object.entries(theme.tokens)) {
130
+ if (value === void 0) continue;
131
+ const appliedValue = property === CHAT_BACKGROUND_IMAGE_PROPERTY && theme.skin?.chatBackgroundImage ? chatBackgroundImageCssValue(target, theme.skin.chatBackgroundImage, value) : value;
132
+ target.style.setProperty(property, appliedValue);
133
+ }
134
+ if (!next.has(CHAT_BACKGROUND_IMAGE_PROPERTY) || !theme.skin?.chatBackgroundImage) {
135
+ releaseChatBackgroundImage(target);
136
+ }
137
+ managedProperties.set(target, next);
138
+ setOptionalAttribute(target, "data-ow-brand-theme", theme.sources.brand);
139
+ setOptionalAttribute(target, "data-tenant-theme", theme.sources.tenant);
140
+ setOptionalAttribute(target, "data-ow-skin", theme.skin?.id ?? null);
141
+ if (theme.skin?.hasChatBackgroundImage) target.setAttribute("data-desktop-background-image", "");
142
+ else target.removeAttribute("data-desktop-background-image");
143
+ if (theme.skin?.hasUserBubbleStyle) target.setAttribute("data-chat-user-bubble-skin", "");
144
+ else target.removeAttribute("data-chat-user-bubble-skin");
145
+ const targetDocument = target.ownerDocument ?? (typeof document === "undefined" ? null : document);
146
+ if (targetDocument) applyPublicPartStyles(target, targetDocument, theme.skin);
147
+ }
148
+ function removeUnifiedTheme(target = document.documentElement) {
149
+ for (const property of managedProperties.get(target) ?? []) target.style.removeProperty(property);
150
+ managedProperties.delete(target);
151
+ releaseChatBackgroundImage(target);
152
+ target.removeAttribute("data-ow-brand-theme");
153
+ target.removeAttribute("data-tenant-theme");
154
+ target.removeAttribute("data-ow-skin");
155
+ target.removeAttribute("data-desktop-background-image");
156
+ target.removeAttribute("data-chat-user-bubble-skin");
157
+ removePublicPartStyles(target);
158
+ }
159
+ function chatBackgroundImageCssValue(target, dataUrl, fallback) {
160
+ const current = managedChatBackgroundImages.get(target);
161
+ if (current?.dataUrl === dataUrl) return `url("${current.objectUrl}")`;
162
+ const separator = dataUrl.indexOf(",");
163
+ const header = separator >= 0 ? dataUrl.slice(0, separator) : "";
164
+ if (!/^data:image\/(?:png|jpeg|webp);base64$/i.test(header)) {
165
+ releaseChatBackgroundImage(target);
166
+ return fallback;
167
+ }
168
+ try {
169
+ const binary = globalThis.atob(dataUrl.slice(separator + 1));
170
+ const bytes = new Uint8Array(binary.length);
171
+ for (let index = 0; index < binary.length; index += 1) bytes[index] = binary.charCodeAt(index);
172
+ const objectUrl = globalThis.URL.createObjectURL(new Blob([bytes], { type: header.slice(5, -7) }));
173
+ releaseChatBackgroundImage(target);
174
+ managedChatBackgroundImages.set(target, { dataUrl, objectUrl });
175
+ return `url("${objectUrl}")`;
176
+ } catch {
177
+ releaseChatBackgroundImage(target);
178
+ return fallback;
179
+ }
180
+ }
181
+ function releaseChatBackgroundImage(target) {
182
+ const current = managedChatBackgroundImages.get(target);
183
+ if (!current) return;
184
+ globalThis.URL.revokeObjectURL(current.objectUrl);
185
+ managedChatBackgroundImages.delete(target);
186
+ }
187
+ function getCurrentThemeName(target = document.documentElement) {
188
+ return target.getAttribute("data-tenant-theme");
189
+ }
190
+ function setOptionalAttribute(target, name, value) {
191
+ if (value) target.setAttribute(name, value);
192
+ else target.removeAttribute(name);
193
+ }
194
+ function removePublicPartStyles(target) {
195
+ managedPublicPartStyles.get(target)?.remove();
196
+ managedPublicPartStyles.delete(target);
197
+ target.removeAttribute("data-ow-skin-scope");
198
+ }
199
+ function applyPublicPartStyles(target, document2, skin) {
200
+ const previous = managedPublicPartStyles.get(target);
201
+ if (!skin?.publicPartStyles) {
202
+ removePublicPartStyles(target);
203
+ return;
204
+ }
205
+ let normalized;
206
+ try {
207
+ normalized = normalizeOrbitworkSkinPublicPartStyles(skin.publicPartStyles);
208
+ } catch (error) {
209
+ console.error("[theme] rejected invalid public-part styles at apply time:", error);
210
+ removePublicPartStyles(target);
211
+ return;
212
+ }
213
+ let scopeId = managedPublicPartScopes.get(target);
214
+ if (!scopeId) {
215
+ scopeId = `ow-skin-${++nextPublicPartScope}`;
216
+ managedPublicPartScopes.set(target, scopeId);
217
+ }
218
+ target.setAttribute("data-ow-skin-scope", scopeId);
219
+ const scope = `[data-ow-skin-scope="${scopeId}"]`;
220
+ const scopedCss = normalized.replace(/([^{}]+)\{/g, (_match, selector) => {
221
+ const selectors = selector.split(",").map((item) => `${scope} ${item.trim()}`).join(", ");
222
+ return `${selectors} {`;
223
+ });
224
+ const style = previous ?? document2.createElement("style");
225
+ style.setAttribute("data-ow-skin-style", scopeId);
226
+ style.textContent = scopedCss;
227
+ if (!previous) {
228
+ managedPublicPartStyles.set(target, style);
229
+ document2.head.appendChild(style);
230
+ }
231
+ }
232
+
233
+ export {
234
+ localizedCopy,
235
+ mergeUnifiedTheme,
236
+ applyUnifiedTheme,
237
+ removeUnifiedTheme,
238
+ getCurrentThemeName
239
+ };
240
+ //# sourceMappingURL=chunk-ZXMHCL6D.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/theme/core/unifiedTheme.ts","../src/theme/utils/themeApplier.ts"],"sourcesContent":["import { type OrbitworkFontScale, fontScaleTokens, resolveOrbitworkFontScale } from \"./fontScale.ts\"\nimport {\n ORBITWORK_SKIN_CSS_VARIABLES,\n type OrbitworkSkin,\n type OrbitworkSkinTokens,\n type ResolvedTheme,\n orbitworkSkinImageCssValue,\n resolveOrbitworkSkinChatBackgroundMask,\n} from \"./skin.ts\"\nimport type {\n BrandTheme,\n LocalizedBranding,\n TenantBranding,\n TenantTheme,\n TenantThemeColors,\n UnifiedThemeToken,\n} from \"./types.ts\"\n\nexport type UnifiedBranding = TenantBranding & {\n logo?: string\n loginKV?: string\n favicon?: string\n}\n\nexport type UnifiedTheme = {\n mode: ResolvedTheme\n /** Partial overrides only. DS2 CSS remains the sole source of defaults. */\n tokens: Readonly<Partial<Record<AppliedThemeToken, string>>>\n branding: UnifiedBranding | null\n skin: {\n id: string\n publicPartStyles?: string\n /** Validated embedded image retained outside CSSOM so the applier can use a short blob URL. */\n chatBackgroundImage?: string\n hasChatBackgroundImage: boolean\n hasUserBubbleStyle: boolean\n } | null\n sources: {\n brand: string | null\n tenant: string | null\n user: string | null\n }\n}\n\ntype SkinThemeToken =\n | (typeof ORBITWORK_SKIN_CSS_VARIABLES)[keyof typeof ORBITWORK_SKIN_CSS_VARIABLES]\n | \"--ow-chat-bg-mask-start-opacity\"\n | \"--ow-chat-bg-mask-end-opacity\"\n\nexport type AppliedThemeToken = UnifiedThemeToken | SkinThemeToken\n\nconst TENANT_TOKEN_MAP = {\n bg: \"--ow-bg\",\n surface: \"--ow-surface\",\n surface2: \"--ow-surface-2\",\n text: \"--ow-text\",\n text2: \"--ow-text-2\",\n text3: \"--ow-text-3\",\n border: \"--ow-border\",\n borderStrong: \"--ow-border-strong\",\n} as const satisfies Record<keyof TenantThemeColors, UnifiedThemeToken>\n\nfunction tenantTokens(theme: TenantTheme | null, mode: ResolvedTheme): Partial<Record<UnifiedThemeToken, string>> {\n const colors = theme?.modes[mode]\n if (!colors) return {}\n return Object.fromEntries(\n Object.entries(TENANT_TOKEN_MAP).map(([key, token]) => [token, colors[key as keyof TenantThemeColors]]),\n )\n}\n\nfunction skinTokens(skin: OrbitworkSkin | null, mode: ResolvedTheme): Partial<Record<AppliedThemeToken, string>> {\n const values = skin?.modes[mode]\n if (!values) return {}\n const tokens: Partial<Record<AppliedThemeToken, string>> = {}\n\n for (const [rawKey, value] of Object.entries(values)) {\n const key = rawKey as keyof OrbitworkSkinTokens\n const property = ORBITWORK_SKIN_CSS_VARIABLES[key]\n if (!property || !value) continue\n\n if (key === \"chatBackgroundImage\") {\n const image = orbitworkSkinImageCssValue(value)\n if (image) tokens[property] = image\n continue\n }\n if (key === \"chatBackgroundMaskColor\") {\n const mask = resolveOrbitworkSkinChatBackgroundMask(value)\n tokens[property] = mask.color\n tokens[\"--ow-chat-bg-mask-start-opacity\"] = `${mask.startOpacity}%`\n tokens[\"--ow-chat-bg-mask-end-opacity\"] = `${mask.endOpacity}%`\n continue\n }\n // The explicit readability mask supersedes the legacy uniform overlay so the image is not veiled twice.\n if (key === \"chatBackgroundOverlay\" && values.chatBackgroundMaskColor) continue\n tokens[property] = value\n }\n\n return tokens\n}\n\nfunction localeCandidates(locale: string): string[] {\n let canonical = \"en-US\"\n try {\n canonical = Intl.getCanonicalLocales(locale)[0] ?? \"en-US\"\n } catch {\n // Invalid runtime preference falls through to the contract baseline.\n }\n const language = canonical.split(\"-\")[0] ?? \"en\"\n return [...new Set([canonical, language, \"en-US\"])]\n}\n\n/** Pick the best localized copy for a locale: canonical, then language, then en-US. */\nexport function localizedCopy(source: LocalizedBranding | undefined, locale: string): TenantBranding | undefined {\n if (!source) return undefined\n for (const candidate of localeCandidates(locale)) {\n if (source[candidate]) return source[candidate]\n }\n return undefined\n}\n\n/**\n * Merge already-validated layers for one resolved color mode.\n * Priority: personal skin > tenant > OEM brand > DS2 CSS defaults.\n */\nexport function mergeUnifiedTheme(\n brand: BrandTheme | null,\n tenant: TenantTheme | null,\n userSkin: OrbitworkSkin | null,\n mode: ResolvedTheme,\n locale = \"en-US\",\n appearanceOverlaySkin: OrbitworkSkin | null = null,\n fontScalePreference: OrbitworkFontScale | null = null,\n): UnifiedTheme {\n const chatBackgroundImage =\n appearanceOverlaySkin?.modes[mode]?.chatBackgroundImage ?? userSkin?.modes[mode]?.chatBackgroundImage\n const tokens: Partial<Record<AppliedThemeToken, string>> = {\n ...(brand?.modes[mode] ?? {}),\n ...tenantTokens(tenant, mode),\n ...skinTokens(userSkin, mode),\n ...skinTokens(appearanceOverlaySkin, mode),\n ...fontScaleTokens(resolveOrbitworkFontScale(fontScalePreference, userSkin?.fontScale ?? brand?.fontScale)),\n }\n\n const typography = tenant?.typography ?? brand?.typography\n if (typography) {\n tokens[\"--ow-font-sans\"] = typography.fontSans\n tokens[\"--ow-font-mono\"] = typography.fontMono\n }\n\n const brandCopy = localizedCopy(brand?.branding, locale)\n const tenantCopy = localizedCopy(tenant?.branding, locale)\n const copy: TenantBranding | null = tenantCopy ? { ...(brandCopy ?? {}), ...tenantCopy } : (brandCopy ?? null)\n const logo = tenant?.logo || brand?.logo\n const loginKV = tenant?.loginKV || brand?.loginKV\n const favicon = tenant?.favicon || brand?.favicon\n const branding = copy\n ? {\n ...copy,\n ...(logo ? { logo } : {}),\n ...(loginKV ? { loginKV } : {}),\n ...(favicon ? { favicon } : {}),\n }\n : null\n\n return {\n mode,\n tokens,\n branding,\n skin:\n userSkin?.modes[mode] || appearanceOverlaySkin?.modes[mode]\n ? {\n id: userSkin?.id ?? appearanceOverlaySkin?.id ?? \"default\",\n ...(userSkin?.contributes?.publicPartStyles\n ? { publicPartStyles: userSkin.contributes.publicPartStyles }\n : {}),\n ...(chatBackgroundImage ? { chatBackgroundImage } : {}),\n hasChatBackgroundImage: Boolean(chatBackgroundImage),\n hasUserBubbleStyle: Boolean(\n userSkin?.modes[mode]?.userBubbleBackground ||\n userSkin?.modes[mode]?.userBubbleForeground ||\n userSkin?.modes[mode]?.userBubbleBorder,\n ),\n }\n : null,\n sources: {\n brand: brand?.id ?? null,\n tenant: tenant?.name ?? null,\n user: userSkin?.id ?? null,\n },\n }\n}\n","import { normalizeOrbitworkSkinPublicPartStyles } from \"../core/skin.ts\"\nimport type { UnifiedTheme } from \"../core/unifiedTheme.ts\"\n\nconst managedProperties = new WeakMap<HTMLElement, Set<string>>()\nconst managedPublicPartStyles = new WeakMap<HTMLElement, HTMLStyleElement>()\nconst managedPublicPartScopes = new WeakMap<HTMLElement, string>()\nconst managedChatBackgroundImages = new WeakMap<HTMLElement, { dataUrl: string; objectUrl: string }>()\nlet nextPublicPartScope = 0\nconst CHAT_BACKGROUND_IMAGE_PROPERTY = \"--ow-chat-bg-image\"\n\n/**\n * Atomically replace the variables owned by the unified theme pipeline.\n * Missing values are removed so DS2 CSS remains the only default source.\n */\nexport function applyUnifiedTheme(theme: UnifiedTheme, target: HTMLElement = document.documentElement): void {\n const previous = managedProperties.get(target) ?? new Set<string>()\n const next = new Set(Object.keys(theme.tokens))\n\n for (const property of previous) {\n if (!next.has(property)) target.style.removeProperty(property)\n }\n for (const [property, value] of Object.entries(theme.tokens)) {\n if (value === undefined) continue\n const appliedValue =\n property === CHAT_BACKGROUND_IMAGE_PROPERTY && theme.skin?.chatBackgroundImage\n ? chatBackgroundImageCssValue(target, theme.skin.chatBackgroundImage, value)\n : value\n target.style.setProperty(property, appliedValue)\n }\n if (!next.has(CHAT_BACKGROUND_IMAGE_PROPERTY) || !theme.skin?.chatBackgroundImage) {\n releaseChatBackgroundImage(target)\n }\n\n managedProperties.set(target, next)\n setOptionalAttribute(target, \"data-ow-brand-theme\", theme.sources.brand)\n setOptionalAttribute(target, \"data-tenant-theme\", theme.sources.tenant)\n setOptionalAttribute(target, \"data-ow-skin\", theme.skin?.id ?? null)\n if (theme.skin?.hasChatBackgroundImage) target.setAttribute(\"data-desktop-background-image\", \"\")\n else target.removeAttribute(\"data-desktop-background-image\")\n if (theme.skin?.hasUserBubbleStyle) target.setAttribute(\"data-chat-user-bubble-skin\", \"\")\n else target.removeAttribute(\"data-chat-user-bubble-skin\")\n\n const targetDocument = target.ownerDocument ?? (typeof document === \"undefined\" ? null : document)\n if (targetDocument) applyPublicPartStyles(target, targetDocument, theme.skin)\n}\n\n/** Remove only values owned by applyUnifiedTheme; unrelated inline styles survive. */\nexport function removeUnifiedTheme(target: HTMLElement = document.documentElement): void {\n for (const property of managedProperties.get(target) ?? []) target.style.removeProperty(property)\n managedProperties.delete(target)\n releaseChatBackgroundImage(target)\n target.removeAttribute(\"data-ow-brand-theme\")\n target.removeAttribute(\"data-tenant-theme\")\n target.removeAttribute(\"data-ow-skin\")\n target.removeAttribute(\"data-desktop-background-image\")\n target.removeAttribute(\"data-chat-user-bubble-skin\")\n removePublicPartStyles(target)\n}\n\nfunction chatBackgroundImageCssValue(target: HTMLElement, dataUrl: string, fallback: string): string {\n const current = managedChatBackgroundImages.get(target)\n if (current?.dataUrl === dataUrl) return `url(\"${current.objectUrl}\")`\n\n const separator = dataUrl.indexOf(\",\")\n const header = separator >= 0 ? dataUrl.slice(0, separator) : \"\"\n if (!/^data:image\\/(?:png|jpeg|webp);base64$/i.test(header)) {\n releaseChatBackgroundImage(target)\n return fallback\n }\n\n try {\n const binary = globalThis.atob(dataUrl.slice(separator + 1))\n const bytes = new Uint8Array(binary.length)\n for (let index = 0; index < binary.length; index += 1) bytes[index] = binary.charCodeAt(index)\n const objectUrl = globalThis.URL.createObjectURL(new Blob([bytes], { type: header.slice(5, -7) }))\n releaseChatBackgroundImage(target)\n managedChatBackgroundImages.set(target, { dataUrl, objectUrl })\n return `url(\"${objectUrl}\")`\n } catch {\n releaseChatBackgroundImage(target)\n return fallback\n }\n}\n\nfunction releaseChatBackgroundImage(target: HTMLElement): void {\n const current = managedChatBackgroundImages.get(target)\n if (!current) return\n globalThis.URL.revokeObjectURL(current.objectUrl)\n managedChatBackgroundImages.delete(target)\n}\n\nexport function getCurrentThemeName(target: HTMLElement = document.documentElement): string | null {\n return target.getAttribute(\"data-tenant-theme\")\n}\n\nfunction setOptionalAttribute(target: HTMLElement, name: string, value: string | null): void {\n if (value) target.setAttribute(name, value)\n else target.removeAttribute(name)\n}\n\nfunction removePublicPartStyles(target: HTMLElement): void {\n managedPublicPartStyles.get(target)?.remove()\n managedPublicPartStyles.delete(target)\n target.removeAttribute(\"data-ow-skin-scope\")\n}\n\nfunction applyPublicPartStyles(target: HTMLElement, document: Document, skin: UnifiedTheme[\"skin\"]): void {\n const previous = managedPublicPartStyles.get(target)\n if (!skin?.publicPartStyles) {\n removePublicPartStyles(target)\n return\n }\n\n let normalized: string\n try {\n normalized = normalizeOrbitworkSkinPublicPartStyles(skin.publicPartStyles)\n } catch (error) {\n console.error(\"[theme] rejected invalid public-part styles at apply time:\", error)\n removePublicPartStyles(target)\n return\n }\n let scopeId = managedPublicPartScopes.get(target)\n if (!scopeId) {\n scopeId = `ow-skin-${++nextPublicPartScope}`\n managedPublicPartScopes.set(target, scopeId)\n }\n target.setAttribute(\"data-ow-skin-scope\", scopeId)\n const scope = `[data-ow-skin-scope=\"${scopeId}\"]`\n const scopedCss = normalized.replace(/([^{}]+)\\{/g, (_match, selector: string) => {\n const selectors = selector\n .split(\",\")\n .map((item) => `${scope} ${item.trim()}`)\n .join(\", \")\n return `${selectors} {`\n })\n const style = previous ?? document.createElement(\"style\")\n style.setAttribute(\"data-ow-skin-style\", scopeId)\n style.textContent = scopedCss\n if (!previous) {\n managedPublicPartStyles.set(target, style)\n document.head.appendChild(style)\n }\n}\n"],"mappings":"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","names":["document"]}
package/dist/core.css CHANGED
@@ -2387,9 +2387,6 @@ input:where([type='button'], [type='reset'], [type='submit']),
2387
2387
  .table {
2388
2388
  display: table;
2389
2389
  }
2390
- .\[aspect-ratio\:73\.4\/45\.3\] {
2391
- aspect-ratio: 73.4/45.3;
2392
- }
2393
2390
  .aspect-\[16\/10\] {
2394
2391
  aspect-ratio: 16/10;
2395
2392
  }
@@ -2582,6 +2579,9 @@ input:where([type='button'], [type='reset'], [type='submit']),
2582
2579
  .h-\[38px\] {
2583
2580
  height: 38px;
2584
2581
  }
2582
+ .h-\[46px\] {
2583
+ height: 46px;
2584
+ }
2585
2585
  .h-\[52px\] {
2586
2586
  height: 52px;
2587
2587
  }
@@ -2882,6 +2882,9 @@ input:where([type='button'], [type='reset'], [type='submit']),
2882
2882
  .w-\[26px\] {
2883
2883
  width: 26px;
2884
2884
  }
2885
+ .w-\[34px\] {
2886
+ width: 34px;
2887
+ }
2885
2888
  .w-\[38px\] {
2886
2889
  width: 38px;
2887
2890
  }
@@ -4637,6 +4640,9 @@ input:where([type='button'], [type='reset'], [type='submit']),
4637
4640
  .font-\[family-name\:var\(--ow-font-display\)\] {
4638
4641
  font-family: var(--ow-font-display);
4639
4642
  }
4643
+ .font-\[family-name\:var\(--ow-font-display\,\'Space_Grotesk\'\,sans-serif\)\] {
4644
+ font-family: var(--ow-font-display,'Space Grotesk',sans-serif);
4645
+ }
4640
4646
  .font-\[family-name\:var\(--ow-font-mono\)\] {
4641
4647
  font-family: var(--ow-font-mono);
4642
4648
  }
@@ -4660,6 +4666,9 @@ input:where([type='button'], [type='reset'], [type='submit']),
4660
4666
  font-size: var(--text-xs);
4661
4667
  line-height: var(--tw-leading, var(--text-xs--line-height));
4662
4668
  }
4669
+ .text-\[20px\] {
4670
+ font-size: 20px;
4671
+ }
4663
4672
  .text-\[length\:calc\(var\(--ow-fs-ui\)_\*_11\.5_\/_13\)\] {
4664
4673
  font-size: calc(var(--ow-fs-ui) * 11.5 / 13);
4665
4674
  }