@ptengine/widgets 0.0.0-stage → 0.1.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 (70) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +38 -2
  3. package/dist/cjs/app-globals-V2Kpy_OQ.js +8 -0
  4. package/dist/cjs/app-globals-V2Kpy_OQ.js.map +1 -0
  5. package/dist/cjs/index-DRCOne2Q.js +1583 -0
  6. package/dist/cjs/index-DRCOne2Q.js.map +1 -0
  7. package/dist/cjs/index.cjs.js +107 -0
  8. package/dist/cjs/index.cjs.js.map +1 -0
  9. package/dist/cjs/loader.cjs.js +16 -0
  10. package/dist/cjs/loader.cjs.js.map +1 -0
  11. package/dist/cjs/pt-provider.cjs.entry.js +85 -0
  12. package/dist/cjs/pt-provider.cjs.entry.js.map +1 -0
  13. package/dist/cjs/ptengine-widgets.cjs.js +28 -0
  14. package/dist/cjs/ptengine-widgets.cjs.js.map +1 -0
  15. package/dist/collection/collection-manifest.json +13 -0
  16. package/dist/collection/components/pt-provider/pt-provider.js +136 -0
  17. package/dist/collection/components/pt-provider/pt-provider.js.map +1 -0
  18. package/dist/collection/index.js +9 -0
  19. package/dist/collection/index.js.map +1 -0
  20. package/dist/collection/utils/context.js +98 -0
  21. package/dist/collection/utils/context.js.map +1 -0
  22. package/dist/components/index.d.ts +35 -0
  23. package/dist/components/index.js +2 -0
  24. package/dist/components/index.js.map +1 -0
  25. package/dist/components/pt-provider.d.ts +11 -0
  26. package/dist/components/pt-provider.js +2 -0
  27. package/dist/components/pt-provider.js.map +1 -0
  28. package/dist/define/pt-provider.d.ts +1 -0
  29. package/dist/define/pt-provider.js +5 -0
  30. package/dist/esm/app-globals-DQuL1Twl.js +6 -0
  31. package/dist/esm/app-globals-DQuL1Twl.js.map +1 -0
  32. package/dist/esm/index-CZKQmozD.js +1559 -0
  33. package/dist/esm/index-CZKQmozD.js.map +1 -0
  34. package/dist/esm/index.js +102 -0
  35. package/dist/esm/index.js.map +1 -0
  36. package/dist/esm/loader.js +14 -0
  37. package/dist/esm/loader.js.map +1 -0
  38. package/dist/esm/pt-provider.entry.js +83 -0
  39. package/dist/esm/pt-provider.entry.js.map +1 -0
  40. package/dist/esm/ptengine-widgets.js +24 -0
  41. package/dist/esm/ptengine-widgets.js.map +1 -0
  42. package/dist/index.cjs.js +1 -0
  43. package/dist/index.js +1 -0
  44. package/dist/ptengine-widgets/index.esm.js +2 -0
  45. package/dist/ptengine-widgets/index.esm.js.map +1 -0
  46. package/dist/ptengine-widgets/p-8a0ee9f5.entry.js +2 -0
  47. package/dist/ptengine-widgets/p-8a0ee9f5.entry.js.map +1 -0
  48. package/dist/ptengine-widgets/p-CZKQmozD.js +3 -0
  49. package/dist/ptengine-widgets/p-CZKQmozD.js.map +1 -0
  50. package/dist/ptengine-widgets/p-DQuL1Twl.js +2 -0
  51. package/dist/ptengine-widgets/p-DQuL1Twl.js.map +1 -0
  52. package/dist/ptengine-widgets/ptengine-widgets.css +1 -0
  53. package/dist/ptengine-widgets/ptengine-widgets.esm.js +2 -0
  54. package/dist/ptengine-widgets/ptengine-widgets.esm.js.map +1 -0
  55. package/dist/types/components/pt-provider/pt-provider.d.ts +59 -0
  56. package/dist/types/components.d.ts +107 -0
  57. package/dist/types/index.d.ts +9 -0
  58. package/dist/types/stencil-public-runtime.d.ts +1879 -0
  59. package/dist/types/utils/context.d.ts +45 -0
  60. package/docs.json +86 -0
  61. package/hydrate/index.d.ts +287 -0
  62. package/hydrate/index.js +22214 -0
  63. package/hydrate/index.mjs +22204 -0
  64. package/hydrate/package.json +12 -0
  65. package/loader/cdn.js +1 -0
  66. package/loader/index.cjs.js +1 -0
  67. package/loader/index.d.ts +24 -0
  68. package/loader/index.es2017.js +1 -0
  69. package/loader/index.js +2 -0
  70. package/package.json +93 -3
@@ -0,0 +1,102 @@
1
+ /**
2
+ * 依赖注入:Web Components 社区的 Context Protocol。
3
+ *
4
+ * 业务组件不自己创建 client,也不读全局变量,而是在挂载时向上冒泡一个
5
+ * `context-request` 事件,由最近的 `<pt-provider>` 回调返回 client。
6
+ *
7
+ * 选它而不是各框架自己的 context 机制,是因为它走的是 DOM 事件:
8
+ * React、Vue、Angular、原生 HTML 里行为完全一致,也能穿透 Shadow DOM
9
+ * (事件带 composed: true)。两层因此可以独立发版、独立测试。
10
+ *
11
+ * 协议出处:https://github.com/webcomponents-cg/community-protocols
12
+ */
13
+ /**
14
+ * context 的标识。
15
+ *
16
+ * 用字符串而不是 Symbol:页面上同时存在两份打包产物时(比如宿主应用装了一份、
17
+ * 某个微前端子应用又装了一份),两个 Symbol 不相等,注入会静默失败;
18
+ * 字符串永远相等。代价是理论上可能与别人撞名,所以带上包名前缀。
19
+ */
20
+ const PT_CLIENT_CONTEXT = '@ptengine/client';
21
+ /** provider 挂到文档上时广播的事件名(协议里的 context-provider):未得到应答的消费者据此再问一次 */
22
+ const CONTEXT_PROVIDER_EVENT = 'context-provider';
23
+ class ContextRequestEvent extends Event {
24
+ constructor(context, callback, subscribe = false) {
25
+ super('context-request', { bubbles: true, composed: true, cancelable: true });
26
+ this.context = context;
27
+ this.callback = callback;
28
+ this.subscribe = subscribe;
29
+ }
30
+ }
31
+ /**
32
+ * 向上请求一个 client。
33
+ *
34
+ * `subscribe: true` 时,provider 换了 client 会再次回调(例如切换账号),
35
+ * 返回值是退订函数 —— 组件在 disconnectedCallback 里调用它。
36
+ *
37
+ * 找不到 provider 时回调不会被触发,组件应当据此降级(显示「未接入」而不是报错)。
38
+ */
39
+ function requestClient(element, callback, subscribe = true) {
40
+ let unsubscribe;
41
+ let answered = false;
42
+ let released = false;
43
+ /** 发出去的请求编号与被接受的那一个:同一个消费者只能持有一份订阅 */
44
+ let latest = 0;
45
+ let accepted = 0;
46
+ const fire = () => {
47
+ const id = ++latest;
48
+ element.dispatchEvent(new ContextRequestEvent(PT_CLIENT_CONTEXT, (value, dispose) => {
49
+ /* 组件已经退订(卸载)后才姗姗来迟的应答,直接丢掉。
50
+ * 另一种迟到:兜底重试发了第二个请求,而第一个其实被 provider 排队了
51
+ * (Stencil 在实例就绪前会把 @Listen 收到的事件先攒着、就绪后重放),
52
+ * 两个都被应答就成了两份订阅 —— 只认第一份,其余的当场退订。 */
53
+ if (released || (answered && id !== accepted)) {
54
+ dispose?.();
55
+ return;
56
+ }
57
+ answered = true;
58
+ accepted = id;
59
+ /* 只记住最新的退订函数,**不要**调用旧的:provider 每次通知都会给一个新的
60
+ * dispose,而它们删除的是同一个订阅。调旧的等于把自己退订 ——
61
+ * 消费者从此只能收到两次值,第二次换 client 之后永久停更。 */
62
+ if (dispose)
63
+ unsubscribe = dispose;
64
+ callback(value);
65
+ }, subscribe));
66
+ };
67
+ fire();
68
+ /**
69
+ * 没人应答时不能就此放弃:上层的 <pt-provider> 未必比子组件先就绪。
70
+ *
71
+ * 两种情况,两条兜底:
72
+ * 1. provider 的类还没注册(懒加载,Vue / Nuxt 里实测子组件先 upgrade):
73
+ * 等 whenDefined 兑现后再要一次;
74
+ * 2. provider 后插入文档、或在 DOM 里被移动(keep-alive、列表重排):
75
+ * 它 connected 时会广播 context-provider,听到就再要一次。
76
+ * 此刻 provider 的 client 可能仍是 undefined(框架还没把 prop 写进来),没关系:
77
+ * subscribe 已经挂上,等 prop 写进来时 @Watch 会再通知一次。
78
+ */
79
+ const retry = () => {
80
+ if (!answered && !released && element.isConnected)
81
+ fire();
82
+ };
83
+ if (!answered && typeof customElements !== 'undefined') {
84
+ void customElements.whenDefined('pt-provider').then(retry);
85
+ }
86
+ /* 挂在 document 上:provider 的广播带 composed,从任何影子树里都能冒到这里 */
87
+ const onProviderAvailable = () => retry();
88
+ if (!answered && typeof document !== 'undefined') {
89
+ document.addEventListener(CONTEXT_PROVIDER_EVENT, onProviderAvailable);
90
+ }
91
+ return () => {
92
+ released = true;
93
+ if (typeof document !== 'undefined')
94
+ document.removeEventListener(CONTEXT_PROVIDER_EVENT, onProviderAvailable);
95
+ unsubscribe?.();
96
+ };
97
+ }
98
+
99
+ export { CONTEXT_PROVIDER_EVENT, ContextRequestEvent, PT_CLIENT_CONTEXT, requestClient };
100
+ //# sourceMappingURL=index.js.map
101
+
102
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["src/utils/context.ts"],"sourcesContent":["/**\n * 依赖注入:Web Components 社区的 Context Protocol。\n *\n * 业务组件不自己创建 client,也不读全局变量,而是在挂载时向上冒泡一个\n * `context-request` 事件,由最近的 `<pt-provider>` 回调返回 client。\n *\n * 选它而不是各框架自己的 context 机制,是因为它走的是 DOM 事件:\n * React、Vue、Angular、原生 HTML 里行为完全一致,也能穿透 Shadow DOM\n * (事件带 composed: true)。两层因此可以独立发版、独立测试。\n *\n * 协议出处:https://github.com/webcomponents-cg/community-protocols\n */\n\n/**\n * 注入给子树的 client。\n *\n * 能力层 SDK 暂时移除,这里是它的占位:provider 只做引用传递,不关心 client 长什么样。\n * 将来 SDK 加回来时换成 `@ptengine/sdk` 的 `Client`。\n */\nexport type Client = object;\n\n/**\n * context 的标识。\n *\n * 用字符串而不是 Symbol:页面上同时存在两份打包产物时(比如宿主应用装了一份、\n * 某个微前端子应用又装了一份),两个 Symbol 不相等,注入会静默失败;\n * 字符串永远相等。代价是理论上可能与别人撞名,所以带上包名前缀。\n */\nexport const PT_CLIENT_CONTEXT = '@ptengine/client' as const;\n\n/** provider 挂到文档上时广播的事件名(协议里的 context-provider):未得到应答的消费者据此再问一次 */\nexport const CONTEXT_PROVIDER_EVENT = 'context-provider' as const;\n\nexport type ContextCallback<T> = (value: T, unsubscribe?: () => void) => void;\n\nexport class ContextRequestEvent<T> extends Event {\n readonly context: string;\n readonly callback: ContextCallback<T>;\n readonly subscribe: boolean;\n\n constructor(context: string, callback: ContextCallback<T>, subscribe = false) {\n super('context-request', { bubbles: true, composed: true, cancelable: true });\n this.context = context;\n this.callback = callback;\n this.subscribe = subscribe;\n }\n}\n\n/**\n * 向上请求一个 client。\n *\n * `subscribe: true` 时,provider 换了 client 会再次回调(例如切换账号),\n * 返回值是退订函数 —— 组件在 disconnectedCallback 里调用它。\n *\n * 找不到 provider 时回调不会被触发,组件应当据此降级(显示「未接入」而不是报错)。\n */\nexport function requestClient(\n element: HTMLElement,\n callback: ContextCallback<Client | undefined>,\n subscribe = true\n): () => void {\n let unsubscribe: (() => void) | undefined;\n let answered = false;\n let released = false;\n /** 发出去的请求编号与被接受的那一个:同一个消费者只能持有一份订阅 */\n let latest = 0;\n let accepted = 0;\n\n const fire = () => {\n const id = ++latest;\n element.dispatchEvent(\n new ContextRequestEvent<Client | undefined>(\n PT_CLIENT_CONTEXT,\n (value, dispose) => {\n /* 组件已经退订(卸载)后才姗姗来迟的应答,直接丢掉。\n * 另一种迟到:兜底重试发了第二个请求,而第一个其实被 provider 排队了\n * (Stencil 在实例就绪前会把 @Listen 收到的事件先攒着、就绪后重放),\n * 两个都被应答就成了两份订阅 —— 只认第一份,其余的当场退订。 */\n if (released || (answered && id !== accepted)) {\n dispose?.();\n return;\n }\n answered = true;\n accepted = id;\n /* 只记住最新的退订函数,**不要**调用旧的:provider 每次通知都会给一个新的\n * dispose,而它们删除的是同一个订阅。调旧的等于把自己退订 ——\n * 消费者从此只能收到两次值,第二次换 client 之后永久停更。 */\n if (dispose) unsubscribe = dispose;\n callback(value);\n },\n subscribe\n )\n );\n };\n\n fire();\n\n /**\n * 没人应答时不能就此放弃:上层的 <pt-provider> 未必比子组件先就绪。\n *\n * 两种情况,两条兜底:\n * 1. provider 的类还没注册(懒加载,Vue / Nuxt 里实测子组件先 upgrade):\n * 等 whenDefined 兑现后再要一次;\n * 2. provider 后插入文档、或在 DOM 里被移动(keep-alive、列表重排):\n * 它 connected 时会广播 context-provider,听到就再要一次。\n * 此刻 provider 的 client 可能仍是 undefined(框架还没把 prop 写进来),没关系:\n * subscribe 已经挂上,等 prop 写进来时 @Watch 会再通知一次。\n */\n const retry = () => {\n if (!answered && !released && element.isConnected) fire();\n };\n\n if (!answered && typeof customElements !== 'undefined') {\n void customElements.whenDefined('pt-provider').then(retry);\n }\n\n /* 挂在 document 上:provider 的广播带 composed,从任何影子树里都能冒到这里 */\n const onProviderAvailable = () => retry();\n if (!answered && typeof document !== 'undefined') {\n document.addEventListener(CONTEXT_PROVIDER_EVENT, onProviderAvailable);\n }\n\n return () => {\n released = true;\n if (typeof document !== 'undefined')\n document.removeEventListener(CONTEXT_PROVIDER_EVENT, onProviderAvailable);\n unsubscribe?.();\n };\n}\n"],"names":[],"mappings":"AAAA;;;;;;;;;;;AAWG;AAUH;;;;;;AAMG;AACI,MAAM,iBAAiB,GAAG;AAEjC;AACO,MAAM,sBAAsB,GAAG;AAIhC,MAAO,mBAAuB,SAAQ,KAAK,CAAA;AAK/C,IAAA,WAAA,CAAY,OAAe,EAAE,QAA4B,EAAE,SAAS,GAAG,KAAK,EAAA;AAC1E,QAAA,KAAK,CAAC,iBAAiB,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;AAC7E,QAAA,IAAI,CAAC,OAAO,GAAG,OAAO;AACtB,QAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ;AACxB,QAAA,IAAI,CAAC,SAAS,GAAG,SAAS;;AAE7B;AAED;;;;;;;AAOG;AACG,SAAU,aAAa,CAC3B,OAAoB,EACpB,QAA6C,EAC7C,SAAS,GAAG,IAAI,EAAA;AAEhB,IAAA,IAAI,WAAqC;IACzC,IAAI,QAAQ,GAAG,KAAK;IACpB,IAAI,QAAQ,GAAG,KAAK;;IAEpB,IAAI,MAAM,GAAG,CAAC;IACd,IAAI,QAAQ,GAAG,CAAC;IAEhB,MAAM,IAAI,GAAG,MAAK;AAChB,QAAA,MAAM,EAAE,GAAG,EAAE,MAAM;AACnB,QAAA,OAAO,CAAC,aAAa,CACnB,IAAI,mBAAmB,CACrB,iBAAiB,EACjB,CAAC,KAAK,EAAE,OAAO,KAAI;AACjB;;;AAGqC;YACrC,IAAI,QAAQ,KAAK,QAAQ,IAAI,EAAE,KAAK,QAAQ,CAAC,EAAE;gBAC7C,OAAO,IAAI;gBACX;;YAEF,QAAQ,GAAG,IAAI;YACf,QAAQ,GAAG,EAAE;AACb;;AAEsC;AACtC,YAAA,IAAI,OAAO;gBAAE,WAAW,GAAG,OAAO;YAClC,QAAQ,CAAC,KAAK,CAAC;AACjB,SAAC,EACD,SAAS,CACV,CACF;AACH,KAAC;AAED,IAAA,IAAI,EAAE;AAEN;;;;;;;;;;AAUG;IACH,MAAM,KAAK,GAAG,MAAK;QACjB,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,WAAW;AAAE,YAAA,IAAI,EAAE;AAC3D,KAAC;IAED,IAAI,CAAC,QAAQ,IAAI,OAAO,cAAc,KAAK,WAAW,EAAE;QACtD,KAAK,cAAc,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;;;AAI5D,IAAA,MAAM,mBAAmB,GAAG,MAAM,KAAK,EAAE;IACzC,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE;AAChD,QAAA,QAAQ,CAAC,gBAAgB,CAAC,sBAAsB,EAAE,mBAAmB,CAAC;;AAGxE,IAAA,OAAO,MAAK;QACV,QAAQ,GAAG,IAAI;QACf,IAAI,OAAO,QAAQ,KAAK,WAAW;AACjC,YAAA,QAAQ,CAAC,mBAAmB,CAAC,sBAAsB,EAAE,mBAAmB,CAAC;QAC3E,WAAW,IAAI;AACjB,KAAC;AACH;;;;"}
@@ -0,0 +1,14 @@
1
+ import { b as bootstrapLazy } from './index-CZKQmozD.js';
2
+ export { s as setNonce } from './index-CZKQmozD.js';
3
+ import { g as globalScripts } from './app-globals-DQuL1Twl.js';
4
+
5
+ const defineCustomElements = async (win, options) => {
6
+ if (typeof window === 'undefined') return undefined;
7
+ await globalScripts();
8
+ return bootstrapLazy([["pt-provider",[[0,"pt-provider",{"client":[16]},[[0,"context-request","handleContextRequest"]],{"client":[{"onClientChange":0}]}]]]], options);
9
+ };
10
+
11
+ export { defineCustomElements };
12
+ //# sourceMappingURL=loader.js.map
13
+
14
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sources":["@lazy-external-entrypoint?app-data=conditional"],"sourcesContent":["export { setNonce } from '@stencil/core';\nimport { bootstrapLazy } from '@stencil/core';\nimport { globalScripts } from '@stencil/core/internal/app-globals';\nexport const defineCustomElements = async (win, options) => {\n if (typeof window === 'undefined') return undefined;\n await globalScripts();\n return bootstrapLazy([/*!__STENCIL_LAZY_DATA__*/], options);\n};\n"],"names":[],"mappings":";;;;AAGY,MAAC,oBAAoB,GAAG,OAAO,GAAG,EAAE,OAAO,KAAK;AAC5D,EAAE,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,OAAO,SAAS;AACrD,EAAE,MAAM,aAAa,EAAE;AACvB,EAAE,OAAO,aAAa,CAAC,4BAA4B,EAAE,OAAO,CAAC;AAC7D;;;;"}
@@ -0,0 +1,83 @@
1
+ import { r as registerInstance, g as getElement } from './index-CZKQmozD.js';
2
+ import { CONTEXT_PROVIDER_EVENT, PT_CLIENT_CONTEXT } from './index.js';
3
+
4
+ const PtProvider = class {
5
+ constructor(hostRef) {
6
+ registerInstance(this, hostRef);
7
+ /**
8
+ * 订阅者 → 最近一次交给它的值。
9
+ *
10
+ * client 变了要逐个通知,而不是让它们自己轮询;记住上次的值是为了不重复通知:
11
+ * 同一个 client 发两遍只是多一次无意义的重渲染。
12
+ */
13
+ this.subscribers = new Map();
14
+ }
15
+ onClientChange(next) {
16
+ for (const [callback, last] of this.subscribers) {
17
+ if (last === next)
18
+ continue;
19
+ this.subscribers.set(callback, next);
20
+ callback(next, () => this.subscribers.delete(callback));
21
+ }
22
+ }
23
+ /**
24
+ * 挂到文档上就广播一声(协议里的 context-provider)。
25
+ *
26
+ * 子组件先于 provider 就绪、或 provider 后来才插进文档 / 在 DOM 里被移动时,
27
+ * 它们之前的请求都没人接;听到这一声会再请求一次。
28
+ */
29
+ connectedCallback() {
30
+ this.host.dispatchEvent(new Event(CONTEXT_PROVIDER_EVENT, { bubbles: true, composed: true }));
31
+ }
32
+ /**
33
+ * 首次渲染完成后补一次通知。
34
+ *
35
+ * @Watch 只在组件进入 watch-ready 之后才触发;在那之前写进来的 client
36
+ * 会被 Stencil 静默当成初始值。Angular 正好落在这个窗口里:它先把元素接进
37
+ * 文档(子组件随即发出 context 请求,拿到 undefined 并订阅),再在第一轮变更
38
+ * 检测里写 [client] —— 没有这一次补发,订阅者会永远停在「没有 client」。
39
+ * 已经拿到这个 client 的订阅者不会被重复通知(见 onClientChange)。
40
+ */
41
+ componentDidLoad() {
42
+ if (this.client)
43
+ this.onClientChange(this.client);
44
+ }
45
+ /*
46
+ * 断开时**不**清空订阅者。
47
+ *
48
+ * 消费者各自持有退订函数并在自己卸载时调用;provider 只是在 DOM 里被移动
49
+ * (框架 keep-alive、列表重排)时,订阅要原样保留 —— 清掉的话子组件永远停在旧 client 上,
50
+ * 而它们自己没断连,不会重新请求。provider 真的被丢弃时,这个 Set 随它一起被回收。
51
+ */
52
+ /**
53
+ * 拦下子树冒泡上来的 context 请求。
54
+ *
55
+ * `stopPropagation()` 是必须的:不拦住的话,嵌套 provider 时外层也会响应,
56
+ * 子组件会先后收到两个 client,最后一个赢 —— 恰好与「就近取用」的直觉相反。
57
+ */
58
+ handleContextRequest(event) {
59
+ const request = event;
60
+ if (request.context !== PT_CLIENT_CONTEXT || typeof request.callback !== 'function')
61
+ return;
62
+ event.stopPropagation();
63
+ if (request.subscribe) {
64
+ const callback = request.callback;
65
+ this.subscribers.set(callback, this.client);
66
+ callback(this.client, () => this.subscribers.delete(callback));
67
+ }
68
+ else {
69
+ request.callback(this.client);
70
+ }
71
+ }
72
+ get host() { return getElement(this); }
73
+ static get watchers() { return {
74
+ "client": [{
75
+ "onClientChange": 0
76
+ }]
77
+ }; }
78
+ };
79
+
80
+ export { PtProvider as pt_provider };
81
+ //# sourceMappingURL=pt-provider.entry.js.map
82
+
83
+ //# sourceMappingURL=pt-provider.entry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pt-provider.entry.js","sources":["src/components/pt-provider/pt-provider.tsx"],"sourcesContent":["import { Component, Element, Listen, Prop, Watch } from '@stencil/core';\n\nimport {\n CONTEXT_PROVIDER_EVENT,\n PT_CLIENT_CONTEXT,\n type Client,\n type ContextCallback\n} from '../../utils/context';\n\n/**\n * 向子树提供一个 client。\n *\n * 业务组件暂时都移除了,这个元素是 widgets 层的占位:注入机制先留着,业务组件以后再加。\n *\n * ```html\n * <pt-provider id=\"root\">\n * <!-- 使用 client 的业务组件 -->\n * </pt-provider>\n * <script type=\"module\">\n * document.querySelector('#root').client = client;\n * </script>\n * ```\n *\n * `client` 是对象,只能走 property,不能走 attribute —— 原生 HTML 下\n * attribute 只能传字符串(docs/component-api.md §2 的属性约定)。\n *\n * 可以嵌套:内层 provider 会拦下请求,子树因此可以对接不同的账号或环境。\n *\n * @slot - 使用这个 client 的子树\n */\n@Component({\n tag: 'pt-provider',\n /**\n * 不用 Shadow DOM,而且**故意不实现 render()**。\n *\n * 这个组件的职责是纯运行时的依赖注入,不该在 DOM 上留下任何痕迹。\n * 另外两种写法都试过,都有实际代价:\n *\n * · `shadow: false` + `render() { return <slot /> }`\n * SSR 时 Stencil 会在 slot 位置写入标记节点,客户端渲染没有它们,\n * React 报 hydration #418 并把整棵子树重渲一遍(首屏闪烁)。\n * · `shadow: true` + `<slot />`\n * Nuxt / Vue 的 SSR 会把子树序列化进 Declarative Shadow DOM 模板里,\n * 客户端接管后又在 light DOM 建了一份 —— 页面上出现两个子组件。\n *\n * 不写 render() 时 Stencil 完全不碰宿主的子节点:SSR 输出就是原样的\n * `<pt-provider>…children…</pt-provider>`,两个框架都没有任何可错配的东西。\n */\n shadow: false\n})\nexport class PtProvider {\n @Element() host!: HTMLPtProviderElement;\n\n /** 注入给子树的 client。用 property 赋值 */\n @Prop() client?: Client;\n\n /**\n * 订阅者 → 最近一次交给它的值。\n *\n * client 变了要逐个通知,而不是让它们自己轮询;记住上次的值是为了不重复通知:\n * 同一个 client 发两遍只是多一次无意义的重渲染。\n */\n private subscribers = new Map<ContextCallback<Client | undefined>, Client | undefined>();\n\n @Watch('client')\n onClientChange(next: Client | undefined) {\n for (const [callback, last] of this.subscribers) {\n if (last === next) continue;\n this.subscribers.set(callback, next);\n callback(next, () => this.subscribers.delete(callback));\n }\n }\n\n /**\n * 挂到文档上就广播一声(协议里的 context-provider)。\n *\n * 子组件先于 provider 就绪、或 provider 后来才插进文档 / 在 DOM 里被移动时,\n * 它们之前的请求都没人接;听到这一声会再请求一次。\n */\n connectedCallback() {\n this.host.dispatchEvent(new Event(CONTEXT_PROVIDER_EVENT, { bubbles: true, composed: true }));\n }\n\n /**\n * 首次渲染完成后补一次通知。\n *\n * @Watch 只在组件进入 watch-ready 之后才触发;在那之前写进来的 client\n * 会被 Stencil 静默当成初始值。Angular 正好落在这个窗口里:它先把元素接进\n * 文档(子组件随即发出 context 请求,拿到 undefined 并订阅),再在第一轮变更\n * 检测里写 [client] —— 没有这一次补发,订阅者会永远停在「没有 client」。\n * 已经拿到这个 client 的订阅者不会被重复通知(见 onClientChange)。\n */\n componentDidLoad() {\n if (this.client) this.onClientChange(this.client);\n }\n\n /*\n * 断开时**不**清空订阅者。\n *\n * 消费者各自持有退订函数并在自己卸载时调用;provider 只是在 DOM 里被移动\n * (框架 keep-alive、列表重排)时,订阅要原样保留 —— 清掉的话子组件永远停在旧 client 上,\n * 而它们自己没断连,不会重新请求。provider 真的被丢弃时,这个 Set 随它一起被回收。\n */\n\n /**\n * 拦下子树冒泡上来的 context 请求。\n *\n * `stopPropagation()` 是必须的:不拦住的话,嵌套 provider 时外层也会响应,\n * 子组件会先后收到两个 client,最后一个赢 —— 恰好与「就近取用」的直觉相反。\n */\n @Listen('context-request')\n handleContextRequest(event: Event) {\n const request = event as Event & {\n context?: string;\n callback?: ContextCallback<Client | undefined>;\n subscribe?: boolean;\n };\n if (request.context !== PT_CLIENT_CONTEXT || typeof request.callback !== 'function') return;\n\n event.stopPropagation();\n\n if (request.subscribe) {\n const callback = request.callback;\n this.subscribers.set(callback, this.client);\n callback(this.client, () => this.subscribers.delete(callback));\n } else {\n request.callback(this.client);\n }\n }\n}\n"],"names":[],"mappings":";;;MAkDa,UAAU,GAAA,MAAA;AApBvB,IAAA,WAAA,CAAA,OAAA,EAAA;;AA0BE;;;;;AAKG;AACK,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,GAAG,EAA2D;AAmEzF;AAhEC,IAAA,cAAc,CAAC,IAAwB,EAAA;QACrC,KAAK,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE;YAC/C,IAAI,IAAI,KAAK,IAAI;gBAAE;YACnB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC;AACpC,YAAA,QAAQ,CAAC,IAAI,EAAE,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;;;AAI3D;;;;;AAKG;IACH,iBAAiB,GAAA;QACf,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,sBAAsB,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;;AAG/F;;;;;;;;AAQG;IACH,gBAAgB,GAAA;QACd,IAAI,IAAI,CAAC,MAAM;AAAE,YAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC;;AAGnD;;;;;;AAMG;AAEH;;;;;AAKG;AAEH,IAAA,oBAAoB,CAAC,KAAY,EAAA;QAC/B,MAAM,OAAO,GAAG,KAIf;QACD,IAAI,OAAO,CAAC,OAAO,KAAK,iBAAiB,IAAI,OAAO,OAAO,CAAC,QAAQ,KAAK,UAAU;YAAE;QAErF,KAAK,CAAC,eAAe,EAAE;AAEvB,QAAA,IAAI,OAAO,CAAC,SAAS,EAAE;AACrB,YAAA,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ;YACjC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC;AAC3C,YAAA,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;;aACzD;AACL,YAAA,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;;;;;;;;;;;;;"}
@@ -0,0 +1,24 @@
1
+ import { p as promiseResolve, b as bootstrapLazy } from './index-CZKQmozD.js';
2
+ export { s as setNonce } from './index-CZKQmozD.js';
3
+ import { g as globalScripts } from './app-globals-DQuL1Twl.js';
4
+
5
+ /*
6
+ Stencil Client Patch Browser v4.45.0 | MIT Licensed | https://stenciljs.com
7
+ */
8
+
9
+ var patchBrowser = () => {
10
+ const importMeta = import.meta.url;
11
+ const opts = {};
12
+ if (importMeta !== "") {
13
+ opts.resourcesUrl = new URL(".", importMeta).href;
14
+ }
15
+ return promiseResolve(opts);
16
+ };
17
+
18
+ patchBrowser().then(async (options) => {
19
+ await globalScripts();
20
+ return bootstrapLazy([["pt-provider",[[0,"pt-provider",{"client":[16]},[[0,"context-request","handleContextRequest"]],{"client":[{"onClientChange":0}]}]]]], options);
21
+ });
22
+ //# sourceMappingURL=ptengine-widgets.js.map
23
+
24
+ //# sourceMappingURL=ptengine-widgets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ptengine-widgets.js","sources":["../../node_modules/.pnpm/@stencil+core@4.45.0/node_modules/@stencil/core/internal/client/patch-browser.js","@lazy-browser-entrypoint?app-data=conditional"],"sourcesContent":["/*\n Stencil Client Patch Browser v4.45.0 | MIT Licensed | https://stenciljs.com\n */\n\n// src/client/client-patch-browser.ts\nimport { BUILD, NAMESPACE } from \"@stencil/core/internal/app-data\";\nimport { consoleDevInfo, H, promiseResolve, win } from \"@stencil/core\";\nvar patchBrowser = () => {\n if (BUILD.isDev && !BUILD.isTesting) {\n consoleDevInfo(\"Running in development mode.\");\n }\n if (BUILD.cloneNodeFix) {\n patchCloneNodeFix(H.prototype);\n }\n const scriptElm = BUILD.scriptDataOpts ? win.document && Array.from(win.document.querySelectorAll(\"script\")).find(\n (s) => new RegExp(`/${NAMESPACE}(\\\\.esm)?\\\\.js($|\\\\?|#)`).test(s.src) || s.getAttribute(\"data-stencil-namespace\") === NAMESPACE\n ) : null;\n const importMeta = import.meta.url;\n const opts = BUILD.scriptDataOpts ? (scriptElm || {})[\"data-opts\"] || {} : {};\n if (importMeta !== \"\") {\n opts.resourcesUrl = new URL(\".\", importMeta).href;\n }\n return promiseResolve(opts);\n};\nvar patchCloneNodeFix = (HTMLElementPrototype) => {\n const nativeCloneNodeFn = HTMLElementPrototype.cloneNode;\n HTMLElementPrototype.cloneNode = function(deep) {\n if (this.nodeName === \"TEMPLATE\") {\n return nativeCloneNodeFn.call(this, deep);\n }\n const clonedNode = nativeCloneNodeFn.call(this, false);\n const srcChildNodes = this.childNodes;\n if (deep) {\n for (let i = 0; i < srcChildNodes.length; i++) {\n if (srcChildNodes[i].nodeType !== 2) {\n clonedNode.appendChild(srcChildNodes[i].cloneNode(true));\n }\n }\n }\n return clonedNode;\n };\n};\nexport {\n patchBrowser\n};\n","export { setNonce } from '@stencil/core';\nimport { bootstrapLazy } from '@stencil/core';\nimport { patchBrowser } from '@stencil/core/internal/client/patch-browser';\nimport { globalScripts } from '@stencil/core/internal/app-globals';\npatchBrowser().then(async (options) => {\n await globalScripts();\n return bootstrapLazy([/*!__STENCIL_LAZY_DATA__*/], options);\n});\n"],"names":[],"mappings":";;;;AAAA;AACA;AACA;;AAKA,IAAI,YAAY,GAAG,MAAM;AAUzB,EAAE,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG;AACpC,EAAE,MAAM,IAAI,GAAiE,EAAE;AAC/E,EAAE,IAAI,UAAU,KAAK,EAAE,EAAE;AACzB,IAAI,IAAI,CAAC,YAAY,GAAG,IAAI,GAAG,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC,IAAI;AACrD;AACA,EAAE,OAAO,cAAc,CAAC,IAAI,CAAC;AAC7B,CAAC;;ACnBD,YAAY,EAAE,CAAC,IAAI,CAAC,OAAO,OAAO,KAAK;AACvC,EAAE,MAAM,aAAa,EAAE;AACvB,EAAE,OAAO,aAAa,CAAC,4BAA4B,EAAE,OAAO,CAAC;AAC7D,CAAC,CAAC","x_google_ignoreList":[0]}
@@ -0,0 +1 @@
1
+ module.exports = require('./cjs/index.cjs.js');
package/dist/index.js ADDED
@@ -0,0 +1 @@
1
+ export * from './esm/index.js';
@@ -0,0 +1,2 @@
1
+ const e="@ptengine/client";const t="context-provider";class n extends Event{constructor(e,t,n=false){super("context-request",{bubbles:true,composed:true,cancelable:true});this.context=e;this.callback=t;this.subscribe=n}}function o(o,s,c=true){let u;let r=false;let i=false;let f=0;let d=0;const l=()=>{const t=++f;o.dispatchEvent(new n(e,((e,n)=>{if(i||r&&t!==d){n?.();return}r=true;d=t;if(n)u=n;s(e)}),c))};l();const p=()=>{if(!r&&!i&&o.isConnected)l()};if(!r&&typeof customElements!=="undefined"){void customElements.whenDefined("pt-provider").then(p)}const m=()=>p();if(!r&&typeof document!=="undefined"){document.addEventListener(t,m)}return()=>{i=true;if(typeof document!=="undefined")document.removeEventListener(t,m);u?.()}}export{t as CONTEXT_PROVIDER_EVENT,n as ContextRequestEvent,e as PT_CLIENT_CONTEXT,o as requestClient};
2
+ //# sourceMappingURL=index.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.esm.js","sources":["src/utils/context.ts"],"sourcesContent":["/**\n * 依赖注入:Web Components 社区的 Context Protocol。\n *\n * 业务组件不自己创建 client,也不读全局变量,而是在挂载时向上冒泡一个\n * `context-request` 事件,由最近的 `<pt-provider>` 回调返回 client。\n *\n * 选它而不是各框架自己的 context 机制,是因为它走的是 DOM 事件:\n * React、Vue、Angular、原生 HTML 里行为完全一致,也能穿透 Shadow DOM\n * (事件带 composed: true)。两层因此可以独立发版、独立测试。\n *\n * 协议出处:https://github.com/webcomponents-cg/community-protocols\n */\n\n/**\n * 注入给子树的 client。\n *\n * 能力层 SDK 暂时移除,这里是它的占位:provider 只做引用传递,不关心 client 长什么样。\n * 将来 SDK 加回来时换成 `@ptengine/sdk` 的 `Client`。\n */\nexport type Client = object;\n\n/**\n * context 的标识。\n *\n * 用字符串而不是 Symbol:页面上同时存在两份打包产物时(比如宿主应用装了一份、\n * 某个微前端子应用又装了一份),两个 Symbol 不相等,注入会静默失败;\n * 字符串永远相等。代价是理论上可能与别人撞名,所以带上包名前缀。\n */\nexport const PT_CLIENT_CONTEXT = '@ptengine/client' as const;\n\n/** provider 挂到文档上时广播的事件名(协议里的 context-provider):未得到应答的消费者据此再问一次 */\nexport const CONTEXT_PROVIDER_EVENT = 'context-provider' as const;\n\nexport type ContextCallback<T> = (value: T, unsubscribe?: () => void) => void;\n\nexport class ContextRequestEvent<T> extends Event {\n readonly context: string;\n readonly callback: ContextCallback<T>;\n readonly subscribe: boolean;\n\n constructor(context: string, callback: ContextCallback<T>, subscribe = false) {\n super('context-request', { bubbles: true, composed: true, cancelable: true });\n this.context = context;\n this.callback = callback;\n this.subscribe = subscribe;\n }\n}\n\n/**\n * 向上请求一个 client。\n *\n * `subscribe: true` 时,provider 换了 client 会再次回调(例如切换账号),\n * 返回值是退订函数 —— 组件在 disconnectedCallback 里调用它。\n *\n * 找不到 provider 时回调不会被触发,组件应当据此降级(显示「未接入」而不是报错)。\n */\nexport function requestClient(\n element: HTMLElement,\n callback: ContextCallback<Client | undefined>,\n subscribe = true\n): () => void {\n let unsubscribe: (() => void) | undefined;\n let answered = false;\n let released = false;\n /** 发出去的请求编号与被接受的那一个:同一个消费者只能持有一份订阅 */\n let latest = 0;\n let accepted = 0;\n\n const fire = () => {\n const id = ++latest;\n element.dispatchEvent(\n new ContextRequestEvent<Client | undefined>(\n PT_CLIENT_CONTEXT,\n (value, dispose) => {\n /* 组件已经退订(卸载)后才姗姗来迟的应答,直接丢掉。\n * 另一种迟到:兜底重试发了第二个请求,而第一个其实被 provider 排队了\n * (Stencil 在实例就绪前会把 @Listen 收到的事件先攒着、就绪后重放),\n * 两个都被应答就成了两份订阅 —— 只认第一份,其余的当场退订。 */\n if (released || (answered && id !== accepted)) {\n dispose?.();\n return;\n }\n answered = true;\n accepted = id;\n /* 只记住最新的退订函数,**不要**调用旧的:provider 每次通知都会给一个新的\n * dispose,而它们删除的是同一个订阅。调旧的等于把自己退订 ——\n * 消费者从此只能收到两次值,第二次换 client 之后永久停更。 */\n if (dispose) unsubscribe = dispose;\n callback(value);\n },\n subscribe\n )\n );\n };\n\n fire();\n\n /**\n * 没人应答时不能就此放弃:上层的 <pt-provider> 未必比子组件先就绪。\n *\n * 两种情况,两条兜底:\n * 1. provider 的类还没注册(懒加载,Vue / Nuxt 里实测子组件先 upgrade):\n * 等 whenDefined 兑现后再要一次;\n * 2. provider 后插入文档、或在 DOM 里被移动(keep-alive、列表重排):\n * 它 connected 时会广播 context-provider,听到就再要一次。\n * 此刻 provider 的 client 可能仍是 undefined(框架还没把 prop 写进来),没关系:\n * subscribe 已经挂上,等 prop 写进来时 @Watch 会再通知一次。\n */\n const retry = () => {\n if (!answered && !released && element.isConnected) fire();\n };\n\n if (!answered && typeof customElements !== 'undefined') {\n void customElements.whenDefined('pt-provider').then(retry);\n }\n\n /* 挂在 document 上:provider 的广播带 composed,从任何影子树里都能冒到这里 */\n const onProviderAvailable = () => retry();\n if (!answered && typeof document !== 'undefined') {\n document.addEventListener(CONTEXT_PROVIDER_EVENT, onProviderAvailable);\n }\n\n return () => {\n released = true;\n if (typeof document !== 'undefined')\n document.removeEventListener(CONTEXT_PROVIDER_EVENT, onProviderAvailable);\n unsubscribe?.();\n };\n}\n"],"names":[],"mappings":"AAAA;;;;;;;;;;;AAWG;AAUH;;;;;;AAMG;AACI,MAAM,iBAAiB,GAAG;AAEjC;AACO,MAAM,sBAAsB,GAAG;AAIhC,MAAO,mBAAuB,SAAQ,KAAK,CAAA;AAK/C,IAAA,WAAA,CAAY,OAAe,EAAE,QAA4B,EAAE,SAAS,GAAG,KAAK,EAAA;AAC1E,QAAA,KAAK,CAAC,iBAAiB,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;AAC7E,QAAA,IAAI,CAAC,OAAO,GAAG,OAAO;AACtB,QAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ;AACxB,QAAA,IAAI,CAAC,SAAS,GAAG,SAAS;;AAE7B;AAED;;;;;;;AAOG;AACG,SAAU,aAAa,CAC3B,OAAoB,EACpB,QAA6C,EAC7C,SAAS,GAAG,IAAI,EAAA;AAEhB,IAAA,IAAI,WAAqC;IACzC,IAAI,QAAQ,GAAG,KAAK;IACpB,IAAI,QAAQ,GAAG,KAAK;;IAEpB,IAAI,MAAM,GAAG,CAAC;IACd,IAAI,QAAQ,GAAG,CAAC;IAEhB,MAAM,IAAI,GAAG,MAAK;AAChB,QAAA,MAAM,EAAE,GAAG,EAAE,MAAM;AACnB,QAAA,OAAO,CAAC,aAAa,CACnB,IAAI,mBAAmB,CACrB,iBAAiB,EACjB,CAAC,KAAK,EAAE,OAAO,KAAI;AACjB;;;AAGqC;YACrC,IAAI,QAAQ,KAAK,QAAQ,IAAI,EAAE,KAAK,QAAQ,CAAC,EAAE;gBAC7C,OAAO,IAAI;gBACX;;YAEF,QAAQ,GAAG,IAAI;YACf,QAAQ,GAAG,EAAE;AACb;;AAEsC;AACtC,YAAA,IAAI,OAAO;gBAAE,WAAW,GAAG,OAAO;YAClC,QAAQ,CAAC,KAAK,CAAC;AACjB,SAAC,EACD,SAAS,CACV,CACF;AACH,KAAC;AAED,IAAA,IAAI,EAAE;AAEN;;;;;;;;;;AAUG;IACH,MAAM,KAAK,GAAG,MAAK;QACjB,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,WAAW;AAAE,YAAA,IAAI,EAAE;AAC3D,KAAC;IAED,IAAI,CAAC,QAAQ,IAAI,OAAO,cAAc,KAAK,WAAW,EAAE;QACtD,KAAK,cAAc,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;;;AAI5D,IAAA,MAAM,mBAAmB,GAAG,MAAM,KAAK,EAAE;IACzC,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE;AAChD,QAAA,QAAQ,CAAC,gBAAgB,CAAC,sBAAsB,EAAE,mBAAmB,CAAC;;AAGxE,IAAA,OAAO,MAAK;QACV,QAAQ,GAAG,IAAI;QACf,IAAI,OAAO,QAAQ,KAAK,WAAW;AACjC,YAAA,QAAQ,CAAC,mBAAmB,CAAC,sBAAsB,EAAE,mBAAmB,CAAC;QAC3E,WAAW,IAAI;AACjB,KAAC;AACH;;;;"}
@@ -0,0 +1,2 @@
1
+ import{r as t,g as s}from"./p-CZKQmozD.js";import{CONTEXT_PROVIDER_EVENT as e,PT_CLIENT_CONTEXT as i}from"./index.esm.js";const n=class{constructor(s){t(this,s);this.subscribers=new Map}onClientChange(t){for(const[s,e]of this.subscribers){if(e===t)continue;this.subscribers.set(s,t);s(t,(()=>this.subscribers.delete(s)))}}connectedCallback(){this.host.dispatchEvent(new Event(e,{bubbles:true,composed:true}))}componentDidLoad(){if(this.client)this.onClientChange(this.client)}handleContextRequest(t){const s=t;if(s.context!==i||typeof s.callback!=="function")return;t.stopPropagation();if(s.subscribe){const t=s.callback;this.subscribers.set(t,this.client);t(this.client,(()=>this.subscribers.delete(t)))}else{s.callback(this.client)}}get host(){return s(this)}static get watchers(){return{client:[{onClientChange:0}]}}};export{n as pt_provider};
2
+ //# sourceMappingURL=p-8a0ee9f5.entry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["PtProvider","constructor","hostRef","this","subscribers","Map","onClientChange","next","callback","last","set","delete","connectedCallback","host","dispatchEvent","Event","CONTEXT_PROVIDER_EVENT","bubbles","composed","componentDidLoad","client","handleContextRequest","event","request","context","PT_CLIENT_CONTEXT","stopPropagation","subscribe"],"sources":["src/components/pt-provider/pt-provider.tsx"],"sourcesContent":["import { Component, Element, Listen, Prop, Watch } from '@stencil/core';\n\nimport {\n CONTEXT_PROVIDER_EVENT,\n PT_CLIENT_CONTEXT,\n type Client,\n type ContextCallback\n} from '../../utils/context';\n\n/**\n * 向子树提供一个 client。\n *\n * 业务组件暂时都移除了,这个元素是 widgets 层的占位:注入机制先留着,业务组件以后再加。\n *\n * ```html\n * <pt-provider id=\"root\">\n * <!-- 使用 client 的业务组件 -->\n * </pt-provider>\n * <script type=\"module\">\n * document.querySelector('#root').client = client;\n * </script>\n * ```\n *\n * `client` 是对象,只能走 property,不能走 attribute —— 原生 HTML 下\n * attribute 只能传字符串(docs/component-api.md §2 的属性约定)。\n *\n * 可以嵌套:内层 provider 会拦下请求,子树因此可以对接不同的账号或环境。\n *\n * @slot - 使用这个 client 的子树\n */\n@Component({\n tag: 'pt-provider',\n /**\n * 不用 Shadow DOM,而且**故意不实现 render()**。\n *\n * 这个组件的职责是纯运行时的依赖注入,不该在 DOM 上留下任何痕迹。\n * 另外两种写法都试过,都有实际代价:\n *\n * · `shadow: false` + `render() { return <slot /> }`\n * SSR 时 Stencil 会在 slot 位置写入标记节点,客户端渲染没有它们,\n * React 报 hydration #418 并把整棵子树重渲一遍(首屏闪烁)。\n * · `shadow: true` + `<slot />`\n * Nuxt / Vue 的 SSR 会把子树序列化进 Declarative Shadow DOM 模板里,\n * 客户端接管后又在 light DOM 建了一份 —— 页面上出现两个子组件。\n *\n * 不写 render() 时 Stencil 完全不碰宿主的子节点:SSR 输出就是原样的\n * `<pt-provider>…children…</pt-provider>`,两个框架都没有任何可错配的东西。\n */\n shadow: false\n})\nexport class PtProvider {\n @Element() host!: HTMLPtProviderElement;\n\n /** 注入给子树的 client。用 property 赋值 */\n @Prop() client?: Client;\n\n /**\n * 订阅者 → 最近一次交给它的值。\n *\n * client 变了要逐个通知,而不是让它们自己轮询;记住上次的值是为了不重复通知:\n * 同一个 client 发两遍只是多一次无意义的重渲染。\n */\n private subscribers = new Map<ContextCallback<Client | undefined>, Client | undefined>();\n\n @Watch('client')\n onClientChange(next: Client | undefined) {\n for (const [callback, last] of this.subscribers) {\n if (last === next) continue;\n this.subscribers.set(callback, next);\n callback(next, () => this.subscribers.delete(callback));\n }\n }\n\n /**\n * 挂到文档上就广播一声(协议里的 context-provider)。\n *\n * 子组件先于 provider 就绪、或 provider 后来才插进文档 / 在 DOM 里被移动时,\n * 它们之前的请求都没人接;听到这一声会再请求一次。\n */\n connectedCallback() {\n this.host.dispatchEvent(new Event(CONTEXT_PROVIDER_EVENT, { bubbles: true, composed: true }));\n }\n\n /**\n * 首次渲染完成后补一次通知。\n *\n * @Watch 只在组件进入 watch-ready 之后才触发;在那之前写进来的 client\n * 会被 Stencil 静默当成初始值。Angular 正好落在这个窗口里:它先把元素接进\n * 文档(子组件随即发出 context 请求,拿到 undefined 并订阅),再在第一轮变更\n * 检测里写 [client] —— 没有这一次补发,订阅者会永远停在「没有 client」。\n * 已经拿到这个 client 的订阅者不会被重复通知(见 onClientChange)。\n */\n componentDidLoad() {\n if (this.client) this.onClientChange(this.client);\n }\n\n /*\n * 断开时**不**清空订阅者。\n *\n * 消费者各自持有退订函数并在自己卸载时调用;provider 只是在 DOM 里被移动\n * (框架 keep-alive、列表重排)时,订阅要原样保留 —— 清掉的话子组件永远停在旧 client 上,\n * 而它们自己没断连,不会重新请求。provider 真的被丢弃时,这个 Set 随它一起被回收。\n */\n\n /**\n * 拦下子树冒泡上来的 context 请求。\n *\n * `stopPropagation()` 是必须的:不拦住的话,嵌套 provider 时外层也会响应,\n * 子组件会先后收到两个 client,最后一个赢 —— 恰好与「就近取用」的直觉相反。\n */\n @Listen('context-request')\n handleContextRequest(event: Event) {\n const request = event as Event & {\n context?: string;\n callback?: ContextCallback<Client | undefined>;\n subscribe?: boolean;\n };\n if (request.context !== PT_CLIENT_CONTEXT || typeof request.callback !== 'function') return;\n\n event.stopPropagation();\n\n if (request.subscribe) {\n const callback = request.callback;\n this.subscribers.set(callback, this.client);\n callback(this.client, () => this.subscribers.delete(callback));\n } else {\n request.callback(this.client);\n }\n }\n}\n"],"mappings":"gIAkDaA,EAAU,MApBvB,WAAAC,CAAAC,G,UAgCUC,KAAAC,YAAc,IAAIC,GAmE3B,CAhEC,cAAAC,CAAeC,GACb,IAAK,MAAOC,EAAUC,KAASN,KAAKC,YAAa,CAC/C,GAAIK,IAASF,EAAM,SACnBJ,KAAKC,YAAYM,IAAIF,EAAUD,GAC/BC,EAASD,GAAM,IAAMJ,KAAKC,YAAYO,OAAOH,I,EAUjD,iBAAAI,GACET,KAAKU,KAAKC,cAAc,IAAIC,MAAMC,EAAwB,CAAEC,QAAS,KAAMC,SAAU,O,CAYvF,gBAAAC,GACE,GAAIhB,KAAKiB,OAAQjB,KAAKG,eAAeH,KAAKiB,O,CAkB5C,oBAAAC,CAAqBC,GACnB,MAAMC,EAAUD,EAKhB,GAAIC,EAAQC,UAAYC,UAA4BF,EAAQf,WAAa,WAAY,OAErFc,EAAMI,kBAEN,GAAIH,EAAQI,UAAW,CACrB,MAAMnB,EAAWe,EAAQf,SACzBL,KAAKC,YAAYM,IAAIF,EAAUL,KAAKiB,QACpCZ,EAASL,KAAKiB,QAAQ,IAAMjB,KAAKC,YAAYO,OAAOH,I,KAC/C,CACLe,EAAQf,SAASL,KAAKiB,O","ignoreList":[]}
@@ -0,0 +1,3 @@
1
+ const t="ptengine-widgets";const e={hydratedSelectorName:"hydrated",lazyLoad:true,prop:true,propChangeCallback:true};var n=(t=>{t["Undefined"]="undefined";t["Null"]="null";t["String"]="string";t["Number"]="number";t["SpecialNumber"]="number";t["Boolean"]="boolean";t["BigInt"]="bigint";return t})(n||{});var r=(t=>{t["Array"]="array";t["Date"]="date";t["Map"]="map";t["Object"]="object";t["RegularExpression"]="regexp";t["Set"]="set";t["Channel"]="channel";t["Symbol"]="symbol";return t})(r||{});var o="type";var i="value";var s="serialized:";function l(t,e,n){const r=typeof HTMLElement!=="undefined"?HTMLElement.prototype:null;while(t&&t!==r){const r=Object.getOwnPropertyDescriptor(t,e);if(r&&(!n||r.get))return r;t=Object.getPrototypeOf(t)}return void 0}var c=(t,e)=>{var n;const r=e.t;const o=Object.entries((n=r.o)!=null?n:{});o.map((([n,[r]])=>{if(r&31||r&32){const r=t[n];const o=l(Object.getPrototypeOf(t),n,true)||Object.getOwnPropertyDescriptor(t,n);if(o){Object.defineProperty(t,n,{get(){return o.get.call(this)},set(t){o.set.call(this,t)},configurable:true,enumerable:true})}if(e.i.has(n)){t[n]=e.i.get(n)}else if(r!==void 0){t[n]=r}}}))};var a=t=>{if(t.__stencil__getHostRef){return t.__stencil__getHostRef()}return void 0};var f=(t,n)=>{if(!n)return;t.__stencil__getHostRef=()=>n;n.l=t;if(n.t.u&512&&e.prop){c(t,n)}};var u=(t,e)=>{const n={u:0,$hostElement$:t,t:e,i:new Map,v:new Map};{n.p=new Promise((t=>n.$=t));t["s-p"]=[];t["s-rc"]=[]}{n.h=[]}const r=n;t.__stencil__getHostRef=()=>r;return r};var d=(t,e)=>(0,console.error)(t,e);var v=new Map;var p=new Map;var $=(t,e,n)=>{var r;const o=t.m.replace(/-/g,"_");const i=t.j;if(!i){return void 0}const s=v.get(i);if(s){return s[o]}const l=(r=p.get(i))!=null?r:0;const c=[l>0?`s-retry=${l}`:"",""].filter(Boolean).join("&");
2
+ /*!__STENCIL_STATIC_IMPORT_SWITCH__*/return import(`./${i}.entry.js${c?"?"+c:""}`).then((t=>{{p.delete(i);v.set(i,t)}return t[o]}),(t=>{p.set(i,l+1);d(t,e.$hostElement$)}))};var h="o";var m="s";var y="t";var b="c";var g="s-id";var w="c-id";var j="{visibility:hidden}[hydrated]{visibility:inherit}";var O=3;var k=1e3;var I=typeof window!=="undefined"?window:{};var S={u:0,O:"",jmp:t=>t(),raf:t=>requestAnimationFrame(t),ael:(t,e,n,r)=>t.addEventListener(e,n,r),rel:(t,e,n,r)=>t.removeEventListener(e,n,r),ce:(t,e)=>new CustomEvent(t,e)};var x=(()=>{var t;let e=false;try{(t=I.document)==null?void 0:t.addEventListener("e",null,Object.defineProperty({},"passive",{get(){e=true}}))}catch(t){}return e})();var M=t=>Promise.resolve(t);var C=false;var N=[];var E=[];var L=()=>{var t;return((t=I.document)==null?void 0:t.hidden)?D(R):S.raf(R)};var T=(t,e)=>n=>{t.push(n);if(!C){C=true;if(e&&S.u&4){D(R)}else{L()}}};var U=t=>{for(let e=0;e<t.length;e++){try{t[e](performance.now())}catch(t){d(t)}}t.length=0};var R=()=>{U(N);{U(E);if(C=N.length>0){L()}}};var D=t=>M().then(t);var P=T(E,true);var V=t=>{const e=[];for(let n=0;n<t.length;n++){const r=t[n]["s-nr"]||void 0;if(r&&r.isConnected){e.push(r)}}return e};var _=(t,e,n,r)=>{if(t["s-ol"]&&t["s-ol"].isConnected){return}const o=document.createTextNode("");o["s-nr"]=t;if(!e["s-cr"]||!e["s-cr"].parentNode)return;const i=e["s-cr"].parentNode;const s=H(i,"appendChild");if(typeof r!=="undefined"){o["s-oo"]=r;const t=H(i,"childNodes");const e=[o];t.forEach((t=>{if(t["s-nr"])e.push(t)}));e.sort(((t,e)=>{if(!t["s-oo"]||t["s-oo"]<(e["s-oo"]||0))return-1;else if(!e["s-oo"]||e["s-oo"]<t["s-oo"])return 1;return 0}));e.forEach((t=>s.call(i,t)))}else{s.call(i,o)}t["s-ol"]=o;t["s-sh"]=e["s-hn"]};var z=t=>typeof t["s-sn"]==="string"?t["s-sn"]:t.nodeType===1&&t.getAttribute("slot")||void 0;function A(t){if(t.assignedElements||t.assignedNodes||!t["s-sr"])return;const e=e=>function(t){const n=[];const r=this["s-sn"];if(t==null?void 0:t.flatten){console.error(`\n Flattening is not supported for Stencil non-shadow slots.\n You can use \`.childNodes\` to nested slot fallback content.\n If you have a particular use case, please open an issue on the Stencil repo.\n `)}const o=this["s-cr"].parentElement;const i=o.__childNodes?o.childNodes:V(o.childNodes);i.forEach((t=>{if(r===z(t)){n.push(t)}}));if(e){return n.filter((t=>t.nodeType===1))}return n}.bind(t);t.assignedElements=e(true);t.assignedNodes=e(false)}function H(t,e){if("__"+e in t){const n=t["__"+e];if(typeof n!=="function")return n;return n.bind(t)}else{if(typeof t[e]!=="function")return t[e];return t[e].bind(t)}}var W=(t,e="")=>{{return()=>{}}};var F=(t,e)=>{{return()=>{}}};function q(t){var e,n,r;return(r=(n=(e=t.head)==null?void 0:e.querySelector('meta[name="csp-nonce"]'))==null?void 0:n.getAttribute("content"))!=null?r:void 0}var B=new WeakMap;var G=(t,e)=>"sc-"+t.m;var J=t=>{t=typeof t;return t==="object"||t==="function"};var Y=(t,e)=>{const n={u:0,k:t,I:e!=null?e:null,S:null,M:null};return n};var K=(t,e,n,r)=>{var o,i,s,l;const c=W("hydrateClient",e);const f=t.shadowRoot;const u=[];const d=[];const v=[];const p=null;const $=Y(e,null);$.S=t;if(I.document&&(!S.C||!S.C.size)){X(I.document.body,S.C=new Map)}t[g]=n;t.removeAttribute(g);r.N=Q($,u,d,p,t,t,n,v);let h=0;const m=u.length;let y;for(h;h<m;h++){y=u[h];const n=y.L+"."+y.T;const r=S.C.get(n);const i=y.S;if(!f){i["s-hn"]=Ut(e).toUpperCase();if(y.k==="slot"){i["s-cr"]=t["s-cr"]}}else if(((o=y.k)==null?void 0:o.toString().includes("-"))&&y.k!=="slot-fb"&&!y.S.shadowRoot){const t=a(y.S);if(t){const e=G(t.t);const n=I.document.querySelector(`style[sty-id="${e}"]`);if(n){p.unshift(n.cloneNode(true))}}}if(y.k==="slot"){y.U=y.S["s-sn"]||y.S["name"]||null;if(y.M){y.u|=2;if(!y.S.childNodes.length){y.M.forEach((t=>{y.S.appendChild(t.S)}))}}else{y.u|=1}}if(r&&r.isConnected){if(r.parentElement.shadowRoot&&r["s-en"]===""){r.parentNode.insertBefore(i,r.nextSibling)}r.parentNode.removeChild(r);if(!f){i["s-oo"]=parseInt(y.T)}}if(r&&!r["s-id"]){S.C.delete(n)}}const b=[];const w=v.length;let j=0;let O;let k;let x;let M;let C=0;for(j;j<w;j++){O=v[j];if(!O||!O.length)continue;x=O.length;k=0;for(k;k<x;k++){M=O[k];if(!b[M.hostId]){b[M.hostId]=S.C.get(M.hostId)}if(!b[M.hostId])continue;const t=b[M.hostId];if(t.shadowRoot&&M.node.parentElement!==t){t.insertBefore(M.node,(s=(i=O[k-1])==null?void 0:i.node)==null?void 0:s.nextSibling)}if(!t.shadowRoot||!f){if(!M.slot["s-cr"]){M.slot["s-cr"]=t["s-cr"];if(!M.slot["s-cr"]&&t.shadowRoot){M.slot["s-cr"]=t}else{M.slot["s-cr"]=(t.__childNodes||t.childNodes)[0]}}_(M.node,M.slot,false,M.node["s-oo"]||C);if(((l=M.node.parentElement)==null?void 0:l.shadowRoot)&&M.node["getAttribute"]&&M.node.getAttribute("slot")){M.node.removeAttribute("slot")}}C=(M.node["s-oo"]||C)+1}}r.$hostElement$=t;c()};var Q=(t,e,n,r,o,i,s,l=[])=>{let c;let a;let f;let u;if(i.nodeType===1){c=i.getAttribute(w);if(c){a=c.split(".");if(a[0]===s||a[0]==="0"){f=Z({u:0,L:a[0],T:a[1],R:a[2],D:a[3],k:i.tagName.toLowerCase(),S:i,P:{class:i.className||""}});e.push(f);i.removeAttribute(w);if(!t.M){t.M=[]}const o=f.S.getAttribute("s-sn");if(typeof o==="string"){if(f.k==="slot-fb"){tt(o,a[2],f,i,t,e,n,r,l)}f.S["s-sn"]=o;f.S.removeAttribute("s-sn")}if(f.D!==void 0){t.M[f.D]=f}t=f}}if(i.shadowRoot){for(u=i.shadowRoot.childNodes.length-1;u>=0;u--){Q(t,e,n,r,o,i.shadowRoot.childNodes[u],s,l)}}const d=i.__childNodes||i.childNodes;for(u=d.length-1;u>=0;u--){Q(t,e,n,r,o,d[u],s,l)}}else if(i.nodeType===8){a=i.nodeValue.split(".");if(a[1]===s||a[1]==="0"){c=a[0];f=Z({L:a[1],T:a[2],R:a[3],D:a[4]||"0",S:i,P:null,M:null,V:null,U:null,k:null,I:null});if(c===y){f.S=nt(i,3);if(f.S&&f.S.nodeType===3){f.I=f.S.textContent;e.push(f);i.remove();if(s===f.L){if(!t.M){t.M=[]}t.M[f.D]=f}}}else if(c===b){f.S=nt(i,8);if(f.S&&f.S.nodeType===8){e.push(f);i.remove()}}else if(f.L===s){if(c===m){const o=i["s-sn"]=a[5]||"";tt(o,a[2],f,i,t,e,n,r,l)}}}}else if(t&&t.k==="style"){const e=Y(null,i.textContent);e.S=i;e.D="0";t.M=[e]}return t};var X=(t,e)=>{if(t.nodeType===1){const n=t[g]||t.getAttribute(g);if(n){e.set(n,t)}let r=0;if(t.shadowRoot){for(;r<t.shadowRoot.childNodes.length;r++){X(t.shadowRoot.childNodes[r],e)}}const o=t.__childNodes||t.childNodes;for(r=0;r<o.length;r++){X(o[r],e)}}else if(t.nodeType===8){const n=t.nodeValue.split(".");if(n[0]===h){e.set(n[1]+"."+n[2],t);t.nodeValue="";t["s-en"]=n[3]}}};var Z=t=>{const e={u:0,L:null,T:null,R:null,D:"0",S:null,P:null,M:null,V:null,U:null,k:null,I:null};return{...e,...t}};function tt(t,e,n,r,o,i,s,l,c){r["s-sr"]=true;n.U=t||null;n.k="slot";const a=(o==null?void 0:o.S)?o.S["s-id"]||o.S.getAttribute("s-id"):"";{const i=n.S;const s=a&&a!==n.L&&o.S.shadowRoot;et(c,e,t,r,s?a:n.L);A(r);if(s){o.S.insertBefore(i,o.S.children[0])}}i.push(n);s.push(n);if(!o.M){o.M=[]}o.M[n.D]=n}var et=(t,e,n,r,o)=>{var i,s;let l=r.nextSibling;t[e]=t[e]||[];if(!l||((i=l.nodeValue)==null?void 0:i.startsWith(m+".")))return;do{if(l&&((l["getAttribute"]&&l.getAttribute("slot")||l["s-sn"])===n||n===""&&!l["s-sn"]&&(!l["getAttribute"]||!l.getAttribute("slot"))&&(l.nodeType===8||l.nodeType===3))){l["s-sn"]=n;t[e].push({slot:r,node:l,hostId:o})}l=l==null?void 0:l.nextSibling}while(l&&!((s=l.nodeValue)==null?void 0:s.startsWith(m+".")))};var nt=(t,e)=>{let n=t;do{n=n.nextSibling}while(n&&(n.nodeType!==e||!n.nodeValue));return n};var rt=t=>{if(!t)return void 0;const e=Object.keys(t);if(e.length===0)return void 0;let n=false;for(const r of e){if(n)break;for(const e of t[r]){if(typeof e==="string"){n=true;break}}}if(!n)return t;const r={};for(const n of e){r[n]=t[n].map((t=>typeof t==="string"?{[t]:0}:t))}return r};var ot=class t{static fromLocalValue(e){const n=e[o];const r=i in e?e[i]:void 0;switch(n){case"string":return r;case"boolean":return r;case"bigint":return BigInt(r);case"undefined":return void 0;case"null":return null;case"number":if(r==="NaN")return NaN;if(r==="-0")return-0;if(r==="Infinity")return Infinity;if(r==="-Infinity")return-Infinity;return r;case"array":return r.map((e=>t.fromLocalValue(e)));case"date":return new Date(r);case"map":const e=new Map;for(const[n,o]of r){const r=typeof n==="object"&&n!==null?t.fromLocalValue(n):n;const i=t.fromLocalValue(o);e.set(r,i)}return e;case"object":const o={};for(const[e,n]of r){o[e]=t.fromLocalValue(n)}return o;case"regexp":const{pattern:i,flags:s}=r;return new RegExp(i,s);case"set":const l=new Set;for(const e of r){l.add(t.fromLocalValue(e))}return l;case"symbol":return Symbol(r);default:throw new Error(`Unsupported type: ${n}`)}}static fromLocalValueArray(e){return e.map((e=>t.fromLocalValue(e)))}static isLocalValueObject(t){if(typeof t!=="object"||t===null){return false}if(!t.hasOwnProperty(o)){return false}const e=t[o];const s=Object.values({...n,...r}).includes(e);if(!s){return false}if(e!=="null"&&e!=="undefined"){return t.hasOwnProperty(i)}return true}};function it(t){const e=atob(t);const n=new Uint8Array(e.length);for(let t=0;t<e.length;t++){n[t]=e.charCodeAt(t)}return(new TextDecoder).decode(n)}function st(t){if(typeof t!=="string"||!t.startsWith(s)){return t}return ot.fromLocalValue(JSON.parse(it(t.slice(s.length))))}var lt=(t,e,n)=>{if(typeof t==="string"&&t.startsWith(s)){t=st(t);return t}if(t!=null&&!J(t)){return t}return t};var ct=t=>{var e;return(e=a(t))==null?void 0:e.$hostElement$};var at=(t,e,n)=>{const r=S.ce(e,n);t.dispatchEvent(r);return r};var ft=(t,e)=>{if(e&&!t._&&e["s-p"]){const n=e["s-p"].push(new Promise((r=>t._=()=>{e["s-p"].splice(n-1,1);r()})))}};var ut=(t,e)=>{{t.u|=16}if(t.u&4){t.u|=512;return}ft(t,t.A);const n=()=>dt(t,e);if(e){queueMicrotask((()=>{n()}));return}return P(n)};var dt=(t,e)=>{const n=t.$hostElement$;const r=W("scheduleUpdate",t.t.m);const o=t.l;if(!o){throw new Error(`Can't render component <${n.tagName.toLowerCase()} /> with invalid Stencil runtime! Make sure this imported component is compiled with a \`externalRuntime: true\` flag. For more information, please refer to https://stenciljs.com/docs/custom-elements#externalruntime`)}let i;if(e){{{t.u|=256;if(t.H){t.H.map((([t,e])=>bt(o,t,e,n)));t.H=void 0}}if(t.h.length){t.h.forEach((t=>t(n)))}}i=bt(o,"componentWillLoad",void 0,n)}else{i=bt(o,"componentWillUpdate",void 0,n)}i=vt(i,(()=>bt(o,"componentWillRender",void 0,n)));r();return vt(i,(()=>$t(t,o)))};var vt=(t,e)=>pt(t)?t.then(e).catch((t=>{console.error(t);e()})):e();var pt=t=>t instanceof Promise||t&&t.then&&typeof t.then==="function";var $t=async(t,e,n)=>{var r;const o=t.$hostElement$;const i=W("update",t.t.m);const s=o["s-rc"];const l=W("render",t.t.m);{ht(t,e)}if(s){s.map((t=>t()));o["s-rc"]=void 0}l();i();{const e=(r=o["s-p"])!=null?r:[];const n=()=>mt(t);if(e.length===0){n()}else{Promise.all(e).then(n).catch(n);t.u|=4;e.length=0}}};var ht=(t,e,n,r)=>{try{e=e.render&&e.render();{t.u&=-17}{t.u|=2}}catch(e){d(e,t.$hostElement$)}return null};var mt=t=>{const e=t.t.m;const n=t.$hostElement$;const r=W("postUpdate",e);const o=t.l;const i=t.A;bt(o,"componentDidRender",void 0,n);if(!(t.u&64)){t.u|=64;{gt(n)}bt(o,"componentDidLoad",void 0,n);r();{t.$(n);if(!i){yt()}}}else{bt(o,"componentDidUpdate",void 0,n);r()}{if(t._){t._();t._=void 0}if(t.u&512){D((()=>ut(t,false)))}t.u&=-517}};var yt=e=>{var n;D((()=>at(I,"appload",{detail:{namespace:t}})));{if((n=S.C)==null?void 0:n.size){S.C.clear()}}};var bt=(t,e,n,r)=>{if(t&&t[e]){try{return t[e](n)}catch(t){d(t,r)}}return void 0};var gt=t=>{var n;return t.setAttribute((n=e.hydratedSelectorName)!=null?n:"hydrated","")};var wt=(t,e)=>a(t).i.get(e);var jt=(t,e,n,r)=>{const o=a(t);if(!o){return}if(!o){throw new Error(`Couldn't find host element for "${r.m}" as it is unknown to this Stencil runtime. This usually happens when integrating a 3rd party Stencil component with another Stencil component or application. Please reach out to the maintainers of the 3rd party Stencil component or report this on the Stencil Discord server (https://chat.stenciljs.com) or comment on this similar [GitHub issue](https://github.com/stenciljs/core/issues/5457).`)}const i=o.$hostElement$;const s=o.i.get(e);const l=o.u;const c=o.l;n=lt(n);const f=Number.isNaN(s)&&Number.isNaN(n);const u=n!==s&&!f;if((!(l&8)||s===void 0)&&u){o.i.set(e,n);if(r.W){const t=r.W[e];if(t){t.map((t=>{try{const[[r,i]]=Object.entries(t);if(l&128||i&1){if(!c){o.h.push((()=>{o.l[r](n,s,e)}))}else{c[r](n,s,e)}}}catch(t){d(t,i)}}))}}if(l&2){if(c.componentShouldUpdate){const t=c.componentShouldUpdate(n,s,e);if(t===false&&!(l&16)){return}}if(!(l&16)){ut(o,false)}}}};var Ot=(t,n,r)=>{var o,i;const s=t.prototype;if(n.o||e.propChangeCallback){{if(t.watchers&&!n.W){n.W=rt(t.watchers)}if(t.deserializers&&!n.F){n.F=t.deserializers}if(t.serializers&&!n.q){n.q=t.serializers}}const c=Object.entries((o=n.o)!=null?o:{});c.map((([t,[e]])=>{if(e&31||r&2&&e&32){const{get:o,set:i}=l(s,t)||{};if(o)n.o[t][0]|=2048;if(i)n.o[t][0]|=4096;if(r&1||!o){Object.defineProperty(s,t,{get(){{if((n.o[t][0]&2048)===0){return wt(this,t)}const e=a(this);const r=e?e.l:s;if(!r)return;return r[t]}},configurable:true,enumerable:true})}Object.defineProperty(s,t,{set(o){const s=a(this);if(!s){return}if(i){const r=e&32?this[t]:s.$hostElement$[t];if(typeof r==="undefined"&&s.i.get(t)){o=s.i.get(t)}i.apply(this,[lt(o)]);o=e&32?this[t]:s.$hostElement$[t];jt(this,t,o,n);return}{if((r&1)===0||(n.o[t][0]&4096)===0){jt(this,t,o,n);if(r&1&&!s.l){s.h.push((()=>{if(n.o[t][0]&4096&&s.l[t]!==s.i.get(t)){s.l[t]=o}}))}return}const e=lt(o);const i=e=>{const r=s.l[t];if(!s.i.get(t)&&r){s.i.set(t,r)}s.l[t]=e;jt(this,t,s.l[t],n)};if(s.l){i(e)}else{s.i.set(t,e);s.h.push((()=>{const e=s.i.get(t);if(s.l[t]!==e){i(e)}}))}}}})}}));if(r&1){const r=new Map;s.attributeChangedCallback=function(t,o,i){S.jmp((()=>{var l;const f=r.get(t);const u=a(this);if(this.hasOwnProperty(f)&&e.lazyLoad){i=this[f];delete this[f]}if(s.hasOwnProperty(f)&&typeof this[f]==="number"&&this[f]==i){return}else if(f==null){const e=u==null?void 0:u.u;if(u&&e&&!(e&8)&&i!==o){const r=u.l;const s=(l=n.W)==null?void 0:l[t];s==null?void 0:s.forEach((n=>{const[[s,l]]=Object.entries(n);if(r[s]!=null&&(e&128||l&1)){r[s].call(r,i,o,t)}}))}return}const d=c.find((([t])=>t===f));const v=d?d[1][0]:0;const p=v&4;const $=p&&i===null&&this[f]===void 0;if(p){i=i===null||i==="false"?false:true}const h=Object.getOwnPropertyDescriptor(s,f);if(!$&&i!=this[f]&&(!h.get||!!h.set)){this[f]=i}}))};t.observedAttributes=Array.from(new Set([...Object.keys((i=n.W)!=null?i:{}),...c.filter((([t,e])=>e[0]&31)).map((([t,e])=>{const n=e[1]||t;r.set(n,t);return n}))]))}}return t};var kt=async(t,e,n,r)=>{var o;let i;try{if((e.u&32)===0){e.u|=32;e.u&=-1025;const r=n.j;if(r){const r=$(n,e);if(r&&"then"in r){const t=F();i=await r;t()}else{i=r}if(!i){e.u&=-33;e.B=((o=e.B)!=null?o:0)+1;if(e.B<O){e.u|=1024}throw new Error(`Constructor for "${n.m}#${e.G}" was not found`)}if(!i.isProxied){{n.W=rt(i.watchers);n.q=i.serializers;n.F=i.deserializers}Ot(i,n,2);i.isProxied=true}const s=W("createInstance",n.m);{e.u|=8}try{new i(e)}catch(e){d(e,t)}{e.u&=-9}{e.u|=128}s();{It(e.l,t)}}else{i=t.constructor;const n=t.localName;customElements.whenDefined(n).then((()=>e.u|=128))}}const r=e.A;const s=()=>ut(e,true);if(r&&r["s-rc"]){r["s-rc"].push(s)}else{s()}}catch(n){d(n,t);if(e._){e._();e._=void 0}if(e.$&&!(e.u&1024)){e.$(t)}}};var It=(t,e)=>{{bt(t,"connectedCallback",void 0,e)}};var St=t=>{if((S.u&1)===0){const e=a(t);if(!e){return}const n=e.t;const r=W("connectedCallback",n.m);if(!(e.u&1)){e.u|=1;let r;{r=t.getAttribute(g);if(r){K(t,n.m,r,e)}}{let n=t;while(n=n.parentNode||n.host){if(n.nodeType===1&&n.hasAttribute("s-id")&&n["s-p"]||n["s-p"]){ft(e,e.A=n);break}}}if(n.o){Object.entries(n.o).map((([e,[n]])=>{if(n&31&&Object.prototype.hasOwnProperty.call(t,e)){const n=t[e];delete t[e];t[e]=n}}))}{kt(t,e,n)}}else{Nt(t,e,n.J);if(e==null?void 0:e.l){It(e.l,t)}else if(e.u&1024){setTimeout((()=>kt(t,e,n)),k)}else if(e==null?void 0:e.p){e.p.then((()=>It(e.l,t)))}}r()}};var xt=(t,e)=>{{bt(t,"disconnectedCallback",void 0,e||t)}};var Mt=async t=>{if((S.u&1)===0){const e=a(t);{if(e==null?void 0:e.Y){e.Y.map((t=>t()));e.Y=void 0}}if(e==null?void 0:e.l){xt(e.l,t)}else if(e==null?void 0:e.p){e.p.then((()=>xt(e.l,t)))}}if(B.has(t)){B.delete(t)}if(t.shadowRoot&&B.has(t.shadowRoot)){B.delete(t.shadowRoot)}};var Ct=(t,e={})=>{var n;if(!I.document){console.warn("Stencil: No document found. Skipping bootstrapping lazy components.");return}const r=W();const o=[];const i=e.exclude||[];const s=I.customElements;const l=I.document.head;const c=l.querySelector("meta[charset]");const f=I.document.createElement("style");const d=[];let v;let p=true;Object.assign(S,e);S.O=new URL(e.resourcesUrl||"./",I.document.baseURI).href;{S.u|=2}t.map((t=>{t[1].map((e=>{var n,r;const l={u:e[0],m:e[1],o:e[2],J:e[3]};{l.o=e[2]}{l.J=e[3]}{l.W=rt(e[4]);l.q=(n=e[5])!=null?n:{};l.F=(r=e[6])!=null?r:{}}const c=Ut(l.m);const f=class extends HTMLElement{["s-p"];["s-rc"];hasRegisteredEventListeners=false;constructor(t){super(t);t=this;u(t,l)}connectedCallback(){const t=a(this);if(!t){return}if(!this.hasRegisteredEventListeners){this.hasRegisteredEventListeners=true;Nt(this,t,l.J)}if(v){clearTimeout(v);v=null}if(p){d.push(this)}else{S.jmp((()=>St(this)))}}disconnectedCallback(){S.jmp((()=>Mt(this)));D((()=>{var t;const e=a(this);if(!e){return}const n=d.findIndex((t=>t===this));if(n>-1){d.splice(n,1)}if(((t=e==null?void 0:e.N)==null?void 0:t.S)instanceof Node&&!e.N.S.isConnected){delete e.N.S}}))}componentOnReady(){var t;return(t=a(this))==null?void 0:t.p}};l.j=t[0];if(!i.includes(c)&&!s.get(c)){o.push(c);s.define(c,Ot(f,l,1))}}))}));if(o.length>0){{f.textContent+=o.sort()+j}if(f.innerHTML.length){f.setAttribute("data-styles","");const t=(n=S.K)!=null?n:q(I.document);if(t!=null){f.setAttribute("nonce",t)}l.insertBefore(f,c?c.nextSibling:l.firstChild)}}p=false;if(d.length){d.map((t=>t.connectedCallback()))}else{{S.jmp((()=>v=setTimeout(yt,30)))}}r()};var Nt=(t,e,n,r)=>{if(n&&I.document){n.map((([n,r,o])=>{const i=t;const s=Et(e,o);const l=Lt(n);S.ael(i,r,s,l);(e.Y=e.Y||[]).push((()=>S.rel(i,r,s,l)))}))}};var Et=(t,e)=>n=>{var r;try{{if(t.u&256){(r=t.l)==null?void 0:r[e](n)}else{(t.H=t.H||[]).push([e,n])}}}catch(e){d(e,t.$hostElement$)}};var Lt=t=>x?{passive:(t&1)!==0,capture:(t&2)!==0}:(t&2)!==0;var Tt=t=>S.K=t;function Ut(t){return t}export{Ct as b,ct as g,M as p,f as r,Tt as s};
3
+ //# sourceMappingURL=p-CZKQmozD.js.map