@spectrum-web-components/reactive-controllers 1.12.0-testing.20260223092154 → 2.0.0-next.20260512072922
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@spectrum-web-components/reactive-controllers",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0-next.20260512072922",
|
|
4
4
|
"description": "ReactiveControllers for powering common UI patterns",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"author": "Adobe",
|
|
@@ -78,7 +78,7 @@
|
|
|
78
78
|
],
|
|
79
79
|
"types": "./src/index.d.ts",
|
|
80
80
|
"dependencies": {
|
|
81
|
-
"@spectrum-web-components/progress-circle": "
|
|
81
|
+
"@spectrum-web-components/progress-circle": "2.0.0-next.20260512072922",
|
|
82
82
|
"colorjs.io": "0.5.2",
|
|
83
83
|
"lit": "^2.5.0 || ^3.1.3"
|
|
84
84
|
},
|
|
@@ -10,13 +10,43 @@
|
|
|
10
10
|
* governing permissions and limitations under the License.
|
|
11
11
|
*/
|
|
12
12
|
import type { ReactiveController, ReactiveElement } from 'lit';
|
|
13
|
+
/**
|
|
14
|
+
* Symbol used to track language resolver updates in reactive element lifecycle.
|
|
15
|
+
* When the language context changes, components use this symbol to trigger updates
|
|
16
|
+
* to locale-dependent content (e.g., formatted dates, numbers, currency).
|
|
17
|
+
*/
|
|
13
18
|
export declare const languageResolverUpdatedSymbol: unique symbol;
|
|
19
|
+
/**
|
|
20
|
+
* A reactive controller that manages language/locale resolution for components.
|
|
21
|
+
*/
|
|
14
22
|
export declare class LanguageResolutionController implements ReactiveController {
|
|
15
23
|
private host;
|
|
24
|
+
/**
|
|
25
|
+
* The currently resolved language/locale code (e.g., 'en-US', 'fr-FR').
|
|
26
|
+
* Defaults to document language, browser language, or 'en-US'.
|
|
27
|
+
*/
|
|
16
28
|
language: string;
|
|
29
|
+
/** Unsubscribe from the sp-language-context provider (if any). */
|
|
17
30
|
private unsubscribe?;
|
|
31
|
+
/** Unsubscribe from the shared <html lang> observer. */
|
|
32
|
+
private removeLangListener?;
|
|
18
33
|
constructor(host: ReactiveElement);
|
|
34
|
+
/**
|
|
35
|
+
* Reads language from document and validates. Used for initial value and
|
|
36
|
+
* when syncing from `<html lang>` changes.
|
|
37
|
+
*/
|
|
38
|
+
private getDocumentLanguage;
|
|
19
39
|
hostConnected(): void;
|
|
20
40
|
hostDisconnected(): void;
|
|
41
|
+
/**
|
|
42
|
+
* Called by the shared observer when `<html lang>` changes.
|
|
43
|
+
* Skipped when a provider (e.g. sp-theme) is the source of truth.
|
|
44
|
+
*/
|
|
45
|
+
private handleLangChange;
|
|
46
|
+
/**
|
|
47
|
+
* Resolves the language: syncs from document, then queries for a provider
|
|
48
|
+
* (e.g. sp-theme) via 'sp-language-context'. If a provider calls the
|
|
49
|
+
* callback, it becomes the source of truth until disconnected.
|
|
50
|
+
*/
|
|
21
51
|
private resolveLanguage;
|
|
22
52
|
}
|
|
@@ -2,25 +2,86 @@
|
|
|
2
2
|
export const languageResolverUpdatedSymbol = Symbol(
|
|
3
3
|
"language resolver updated"
|
|
4
4
|
);
|
|
5
|
+
const listeners = /* @__PURE__ */ new Set();
|
|
6
|
+
let sharedObserver;
|
|
7
|
+
function addLangListener(listener) {
|
|
8
|
+
listeners.add(listener);
|
|
9
|
+
if (!sharedObserver) {
|
|
10
|
+
sharedObserver = new MutationObserver(() => {
|
|
11
|
+
for (const cb of listeners) {
|
|
12
|
+
cb();
|
|
13
|
+
}
|
|
14
|
+
});
|
|
15
|
+
sharedObserver.observe(document.documentElement, {
|
|
16
|
+
attributes: true,
|
|
17
|
+
attributeFilter: ["lang"]
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
return () => {
|
|
21
|
+
listeners.delete(listener);
|
|
22
|
+
if (listeners.size === 0) {
|
|
23
|
+
sharedObserver == null ? void 0 : sharedObserver.disconnect();
|
|
24
|
+
sharedObserver = void 0;
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
}
|
|
5
28
|
export class LanguageResolutionController {
|
|
6
29
|
constructor(host) {
|
|
7
|
-
|
|
30
|
+
/**
|
|
31
|
+
* The currently resolved language/locale code (e.g., 'en-US', 'fr-FR').
|
|
32
|
+
* Defaults to document language, browser language, or 'en-US'.
|
|
33
|
+
*/
|
|
34
|
+
this.language = this.getDocumentLanguage();
|
|
8
35
|
this.host = host;
|
|
9
36
|
this.host.addController(this);
|
|
10
37
|
}
|
|
38
|
+
/**
|
|
39
|
+
* Reads language from document and validates. Used for initial value and
|
|
40
|
+
* when syncing from `<html lang>` changes.
|
|
41
|
+
*/
|
|
42
|
+
getDocumentLanguage() {
|
|
43
|
+
const raw = document.documentElement.lang || navigator.language || "en-US";
|
|
44
|
+
try {
|
|
45
|
+
Intl.DateTimeFormat.supportedLocalesOf([raw]);
|
|
46
|
+
return raw;
|
|
47
|
+
} catch (e) {
|
|
48
|
+
return "en-US";
|
|
49
|
+
}
|
|
50
|
+
}
|
|
11
51
|
hostConnected() {
|
|
12
52
|
this.resolveLanguage();
|
|
53
|
+
this.removeLangListener = addLangListener(this.handleLangChange.bind(this));
|
|
13
54
|
}
|
|
14
55
|
hostDisconnected() {
|
|
15
|
-
var _a;
|
|
56
|
+
var _a, _b;
|
|
16
57
|
(_a = this.unsubscribe) == null ? void 0 : _a.call(this);
|
|
58
|
+
this.unsubscribe = void 0;
|
|
59
|
+
(_b = this.removeLangListener) == null ? void 0 : _b.call(this);
|
|
60
|
+
this.removeLangListener = void 0;
|
|
17
61
|
}
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
62
|
+
/**
|
|
63
|
+
* Called by the shared observer when `<html lang>` changes.
|
|
64
|
+
* Skipped when a provider (e.g. sp-theme) is the source of truth.
|
|
65
|
+
*/
|
|
66
|
+
handleLangChange() {
|
|
67
|
+
if (this.unsubscribe) {
|
|
68
|
+
return;
|
|
23
69
|
}
|
|
70
|
+
const next = this.getDocumentLanguage();
|
|
71
|
+
if (next === this.language) {
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
const previous = this.language;
|
|
75
|
+
this.language = next;
|
|
76
|
+
this.host.requestUpdate(languageResolverUpdatedSymbol, previous);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Resolves the language: syncs from document, then queries for a provider
|
|
80
|
+
* (e.g. sp-theme) via 'sp-language-context'. If a provider calls the
|
|
81
|
+
* callback, it becomes the source of truth until disconnected.
|
|
82
|
+
*/
|
|
83
|
+
resolveLanguage() {
|
|
84
|
+
this.language = this.getDocumentLanguage();
|
|
24
85
|
const queryThemeEvent = new CustomEvent(
|
|
25
86
|
"sp-language-context",
|
|
26
87
|
{
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["LanguageResolution.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Copyright 2026 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport type { ReactiveController, ReactiveElement } from 'lit';\n\
|
|
5
|
-
"mappings": ";
|
|
4
|
+
"sourcesContent": ["/**\n * Copyright 2026 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport type { ReactiveController, ReactiveElement } from 'lit';\n\n// TODO: Update this when theme is migrated to 2nd-gen\ntype ProvideLang = {\n callback: (lang: string, unsubscribe: () => void) => void;\n};\n\n/**\n * Symbol used to track language resolver updates in reactive element lifecycle.\n * When the language context changes, components use this symbol to trigger updates\n * to locale-dependent content (e.g., formatted dates, numbers, currency).\n */\nexport const languageResolverUpdatedSymbol = Symbol(\n 'language resolver updated'\n);\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Shared <html lang> observer (singleton)\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ntype LangChangeListener = () => void;\n\nconst listeners = new Set<LangChangeListener>();\nlet sharedObserver: MutationObserver | undefined;\n\nfunction addLangListener(listener: LangChangeListener): () => void {\n listeners.add(listener);\n\n if (!sharedObserver) {\n sharedObserver = new MutationObserver(() => {\n for (const cb of listeners) {\n cb();\n }\n });\n sharedObserver.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['lang'],\n });\n }\n\n return () => {\n listeners.delete(listener);\n if (listeners.size === 0) {\n sharedObserver?.disconnect();\n sharedObserver = undefined;\n }\n };\n}\n\n/**\n * A reactive controller that manages language/locale resolution for components.\n */\nexport class LanguageResolutionController implements ReactiveController {\n private host: ReactiveElement;\n\n /**\n * The currently resolved language/locale code (e.g., 'en-US', 'fr-FR').\n * Defaults to document language, browser language, or 'en-US'.\n */\n language = this.getDocumentLanguage();\n\n /** Unsubscribe from the sp-language-context provider (if any). */\n private unsubscribe?: () => void;\n\n /** Unsubscribe from the shared <html lang> observer. */\n private removeLangListener?: () => void;\n\n constructor(host: ReactiveElement) {\n this.host = host;\n this.host.addController(this);\n }\n\n /**\n * Reads language from document and validates. Used for initial value and\n * when syncing from `<html lang>` changes.\n */\n private getDocumentLanguage(): string {\n const raw = document.documentElement.lang || navigator.language || 'en-US';\n try {\n Intl.DateTimeFormat.supportedLocalesOf([raw]);\n return raw;\n } catch {\n return 'en-US';\n }\n }\n\n public hostConnected(): void {\n this.resolveLanguage();\n this.removeLangListener = addLangListener(this.handleLangChange.bind(this));\n }\n\n public hostDisconnected(): void {\n this.unsubscribe?.();\n this.unsubscribe = undefined;\n this.removeLangListener?.();\n this.removeLangListener = undefined;\n }\n\n /**\n * Called by the shared observer when `<html lang>` changes.\n * Skipped when a provider (e.g. sp-theme) is the source of truth.\n */\n private handleLangChange(): void {\n if (this.unsubscribe) {\n return;\n }\n const next = this.getDocumentLanguage();\n if (next === this.language) {\n return;\n }\n const previous = this.language;\n this.language = next;\n this.host.requestUpdate(languageResolverUpdatedSymbol, previous);\n }\n\n /**\n * Resolves the language: syncs from document, then queries for a provider\n * (e.g. sp-theme) via 'sp-language-context'. If a provider calls the\n * callback, it becomes the source of truth until disconnected.\n */\n private resolveLanguage(): void {\n this.language = this.getDocumentLanguage();\n const queryThemeEvent = new CustomEvent<ProvideLang>(\n 'sp-language-context',\n {\n bubbles: true,\n composed: true,\n detail: {\n callback: (lang: string, unsubscribe: () => void) => {\n const previous = this.language;\n this.language = lang;\n this.unsubscribe = unsubscribe;\n this.host.requestUpdate(languageResolverUpdatedSymbol, previous);\n },\n },\n cancelable: true,\n }\n );\n this.host.dispatchEvent(queryThemeEvent);\n }\n}\n"],
|
|
5
|
+
"mappings": ";AAwBO,aAAM,gCAAgC;AAAA,EAC3C;AACF;AAQA,MAAM,YAAY,oBAAI,IAAwB;AAC9C,IAAI;AAEJ,SAAS,gBAAgB,UAA0C;AACjE,YAAU,IAAI,QAAQ;AAEtB,MAAI,CAAC,gBAAgB;AACnB,qBAAiB,IAAI,iBAAiB,MAAM;AAC1C,iBAAW,MAAM,WAAW;AAC1B,WAAG;AAAA,MACL;AAAA,IACF,CAAC;AACD,mBAAe,QAAQ,SAAS,iBAAiB;AAAA,MAC/C,YAAY;AAAA,MACZ,iBAAiB,CAAC,MAAM;AAAA,IAC1B,CAAC;AAAA,EACH;AAEA,SAAO,MAAM;AACX,cAAU,OAAO,QAAQ;AACzB,QAAI,UAAU,SAAS,GAAG;AACxB,uDAAgB;AAChB,uBAAiB;AAAA,IACnB;AAAA,EACF;AACF;AAKO,aAAM,6BAA2D;AAAA,EAetE,YAAY,MAAuB;AARnC;AAAA;AAAA;AAAA;AAAA,oBAAW,KAAK,oBAAoB;AASlC,SAAK,OAAO;AACZ,SAAK,KAAK,cAAc,IAAI;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,sBAA8B;AACpC,UAAM,MAAM,SAAS,gBAAgB,QAAQ,UAAU,YAAY;AACnE,QAAI;AACF,WAAK,eAAe,mBAAmB,CAAC,GAAG,CAAC;AAC5C,aAAO;AAAA,IACT,SAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEO,gBAAsB;AAC3B,SAAK,gBAAgB;AACrB,SAAK,qBAAqB,gBAAgB,KAAK,iBAAiB,KAAK,IAAI,CAAC;AAAA,EAC5E;AAAA,EAEO,mBAAyB;AAvGlC;AAwGI,eAAK,gBAAL;AACA,SAAK,cAAc;AACnB,eAAK,uBAAL;AACA,SAAK,qBAAqB;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,mBAAyB;AAC/B,QAAI,KAAK,aAAa;AACpB;AAAA,IACF;AACA,UAAM,OAAO,KAAK,oBAAoB;AACtC,QAAI,SAAS,KAAK,UAAU;AAC1B;AAAA,IACF;AACA,UAAM,WAAW,KAAK;AACtB,SAAK,WAAW;AAChB,SAAK,KAAK,cAAc,+BAA+B,QAAQ;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,kBAAwB;AAC9B,SAAK,WAAW,KAAK,oBAAoB;AACzC,UAAM,kBAAkB,IAAI;AAAA,MAC1B;AAAA,MACA;AAAA,QACE,SAAS;AAAA,QACT,UAAU;AAAA,QACV,QAAQ;AAAA,UACN,UAAU,CAAC,MAAc,gBAA4B;AACnD,kBAAM,WAAW,KAAK;AACtB,iBAAK,WAAW;AAChB,iBAAK,cAAc;AACnB,iBAAK,KAAK,cAAc,+BAA+B,QAAQ;AAAA,UACjE;AAAA,QACF;AAAA,QACA,YAAY;AAAA,MACd;AAAA,IACF;AACA,SAAK,KAAK,cAAc,eAAe;AAAA,EACzC;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";export const languageResolverUpdatedSymbol=Symbol("language resolver updated");export class LanguageResolutionController{constructor(e){this.language=document.documentElement.lang||navigator.language||"en-US";
|
|
1
|
+
"use strict";export const languageResolverUpdatedSymbol=Symbol("language resolver updated");const i=new Set;let n;function r(a){return i.add(a),n||(n=new MutationObserver(()=>{for(const e of i)e()}),n.observe(document.documentElement,{attributes:!0,attributeFilter:["lang"]})),()=>{i.delete(a),i.size===0&&(n==null||n.disconnect(),n=void 0)}}export class LanguageResolutionController{constructor(e){this.language=this.getDocumentLanguage();this.host=e,this.host.addController(this)}getDocumentLanguage(){const e=document.documentElement.lang||navigator.language||"en-US";try{return Intl.DateTimeFormat.supportedLocalesOf([e]),e}catch(t){return"en-US"}}hostConnected(){this.resolveLanguage(),this.removeLangListener=r(this.handleLangChange.bind(this))}hostDisconnected(){var e,t;(e=this.unsubscribe)==null||e.call(this),this.unsubscribe=void 0,(t=this.removeLangListener)==null||t.call(this),this.removeLangListener=void 0}handleLangChange(){if(this.unsubscribe)return;const e=this.getDocumentLanguage();if(e===this.language)return;const t=this.language;this.language=e,this.host.requestUpdate(languageResolverUpdatedSymbol,t)}resolveLanguage(){this.language=this.getDocumentLanguage();const e=new CustomEvent("sp-language-context",{bubbles:!0,composed:!0,detail:{callback:(t,s)=>{const o=this.language;this.language=t,this.unsubscribe=s,this.host.requestUpdate(languageResolverUpdatedSymbol,o)}},cancelable:!0});this.host.dispatchEvent(e)}}
|
|
2
2
|
//# sourceMappingURL=LanguageResolution.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["LanguageResolution.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Copyright 2026 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport type { ReactiveController, ReactiveElement } from 'lit';\n\
|
|
5
|
-
"mappings": "
|
|
6
|
-
"names": ["host", "
|
|
4
|
+
"sourcesContent": ["/**\n * Copyright 2026 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport type { ReactiveController, ReactiveElement } from 'lit';\n\n// TODO: Update this when theme is migrated to 2nd-gen\ntype ProvideLang = {\n callback: (lang: string, unsubscribe: () => void) => void;\n};\n\n/**\n * Symbol used to track language resolver updates in reactive element lifecycle.\n * When the language context changes, components use this symbol to trigger updates\n * to locale-dependent content (e.g., formatted dates, numbers, currency).\n */\nexport const languageResolverUpdatedSymbol = Symbol(\n 'language resolver updated'\n);\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Shared <html lang> observer (singleton)\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ntype LangChangeListener = () => void;\n\nconst listeners = new Set<LangChangeListener>();\nlet sharedObserver: MutationObserver | undefined;\n\nfunction addLangListener(listener: LangChangeListener): () => void {\n listeners.add(listener);\n\n if (!sharedObserver) {\n sharedObserver = new MutationObserver(() => {\n for (const cb of listeners) {\n cb();\n }\n });\n sharedObserver.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['lang'],\n });\n }\n\n return () => {\n listeners.delete(listener);\n if (listeners.size === 0) {\n sharedObserver?.disconnect();\n sharedObserver = undefined;\n }\n };\n}\n\n/**\n * A reactive controller that manages language/locale resolution for components.\n */\nexport class LanguageResolutionController implements ReactiveController {\n private host: ReactiveElement;\n\n /**\n * The currently resolved language/locale code (e.g., 'en-US', 'fr-FR').\n * Defaults to document language, browser language, or 'en-US'.\n */\n language = this.getDocumentLanguage();\n\n /** Unsubscribe from the sp-language-context provider (if any). */\n private unsubscribe?: () => void;\n\n /** Unsubscribe from the shared <html lang> observer. */\n private removeLangListener?: () => void;\n\n constructor(host: ReactiveElement) {\n this.host = host;\n this.host.addController(this);\n }\n\n /**\n * Reads language from document and validates. Used for initial value and\n * when syncing from `<html lang>` changes.\n */\n private getDocumentLanguage(): string {\n const raw = document.documentElement.lang || navigator.language || 'en-US';\n try {\n Intl.DateTimeFormat.supportedLocalesOf([raw]);\n return raw;\n } catch {\n return 'en-US';\n }\n }\n\n public hostConnected(): void {\n this.resolveLanguage();\n this.removeLangListener = addLangListener(this.handleLangChange.bind(this));\n }\n\n public hostDisconnected(): void {\n this.unsubscribe?.();\n this.unsubscribe = undefined;\n this.removeLangListener?.();\n this.removeLangListener = undefined;\n }\n\n /**\n * Called by the shared observer when `<html lang>` changes.\n * Skipped when a provider (e.g. sp-theme) is the source of truth.\n */\n private handleLangChange(): void {\n if (this.unsubscribe) {\n return;\n }\n const next = this.getDocumentLanguage();\n if (next === this.language) {\n return;\n }\n const previous = this.language;\n this.language = next;\n this.host.requestUpdate(languageResolverUpdatedSymbol, previous);\n }\n\n /**\n * Resolves the language: syncs from document, then queries for a provider\n * (e.g. sp-theme) via 'sp-language-context'. If a provider calls the\n * callback, it becomes the source of truth until disconnected.\n */\n private resolveLanguage(): void {\n this.language = this.getDocumentLanguage();\n const queryThemeEvent = new CustomEvent<ProvideLang>(\n 'sp-language-context',\n {\n bubbles: true,\n composed: true,\n detail: {\n callback: (lang: string, unsubscribe: () => void) => {\n const previous = this.language;\n this.language = lang;\n this.unsubscribe = unsubscribe;\n this.host.requestUpdate(languageResolverUpdatedSymbol, previous);\n },\n },\n cancelable: true,\n }\n );\n this.host.dispatchEvent(queryThemeEvent);\n }\n}\n"],
|
|
5
|
+
"mappings": "aAwBO,aAAM,8BAAgC,OAC3C,2BACF,EAQA,MAAMA,EAAY,IAAI,IACtB,IAAIC,EAEJ,SAASC,EAAgBC,EAA0C,CACjE,OAAAH,EAAU,IAAIG,CAAQ,EAEjBF,IACHA,EAAiB,IAAI,iBAAiB,IAAM,CAC1C,UAAWG,KAAMJ,EACfI,EAAG,CAEP,CAAC,EACDH,EAAe,QAAQ,SAAS,gBAAiB,CAC/C,WAAY,GACZ,gBAAiB,CAAC,MAAM,CAC1B,CAAC,GAGI,IAAM,CACXD,EAAU,OAAOG,CAAQ,EACrBH,EAAU,OAAS,IACrBC,GAAA,MAAAA,EAAgB,aAChBA,EAAiB,OAErB,CACF,CAKO,aAAM,4BAA2D,CAetE,YAAYI,EAAuB,CARnC,cAAW,KAAK,oBAAoB,EASlC,KAAK,KAAOA,EACZ,KAAK,KAAK,cAAc,IAAI,CAC9B,CAMQ,qBAA8B,CACpC,MAAMC,EAAM,SAAS,gBAAgB,MAAQ,UAAU,UAAY,QACnE,GAAI,CACF,YAAK,eAAe,mBAAmB,CAACA,CAAG,CAAC,EACrCA,CACT,OAAQC,EAAA,CACN,MAAO,OACT,CACF,CAEO,eAAsB,CAC3B,KAAK,gBAAgB,EACrB,KAAK,mBAAqBL,EAAgB,KAAK,iBAAiB,KAAK,IAAI,CAAC,CAC5E,CAEO,kBAAyB,CAvGlC,IAAAM,EAAAC,GAwGID,EAAA,KAAK,cAAL,MAAAA,EAAA,WACA,KAAK,YAAc,QACnBC,EAAA,KAAK,qBAAL,MAAAA,EAAA,WACA,KAAK,mBAAqB,MAC5B,CAMQ,kBAAyB,CAC/B,GAAI,KAAK,YACP,OAEF,MAAMC,EAAO,KAAK,oBAAoB,EACtC,GAAIA,IAAS,KAAK,SAChB,OAEF,MAAMC,EAAW,KAAK,SACtB,KAAK,SAAWD,EAChB,KAAK,KAAK,cAAc,8BAA+BC,CAAQ,CACjE,CAOQ,iBAAwB,CAC9B,KAAK,SAAW,KAAK,oBAAoB,EACzC,MAAMC,EAAkB,IAAI,YAC1B,sBACA,CACE,QAAS,GACT,SAAU,GACV,OAAQ,CACN,SAAU,CAACC,EAAcC,IAA4B,CACnD,MAAMH,EAAW,KAAK,SACtB,KAAK,SAAWE,EAChB,KAAK,YAAcC,EACnB,KAAK,KAAK,cAAc,8BAA+BH,CAAQ,CACjE,CACF,EACA,WAAY,EACd,CACF,EACA,KAAK,KAAK,cAAcC,CAAe,CACzC,CACF",
|
|
6
|
+
"names": ["listeners", "sharedObserver", "addLangListener", "listener", "cb", "host", "raw", "e", "_a", "_b", "next", "previous", "queryThemeEvent", "lang", "unsubscribe"]
|
|
7
7
|
}
|