@ds-mo/ui 16.1.0 → 16.1.1
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/dist/.package-ready.json +1 -1
- package/dist/agent-patterns.json +1 -1
- package/dist/agent.json +1 -1
- package/dist/components/ds-agent-questionnaire.js +1 -1
- package/dist/components/ds-agent-response.js +1 -1
- package/dist/components/ds-banner.js +1 -1
- package/dist/components/ds-bar-nav.js +1 -1
- package/dist/components/ds-bar-page-title.js +1 -1
- package/dist/components/ds-bar-title.js +1 -1
- package/dist/components/ds-bar-workflow.js +1 -1
- package/dist/components/ds-button-unfilled.js +1 -1
- package/dist/components/ds-calendar.js +1 -1
- package/dist/components/ds-card-chart.js +1 -1
- package/dist/components/ds-card-overview.js +1 -1
- package/dist/components/ds-card-setting.js +1 -1
- package/dist/components/ds-code-block.js +1 -1
- package/dist/components/ds-data-customize.js +1 -1
- package/dist/components/ds-data-filter.js +1 -1
- package/dist/components/ds-data-group.js +1 -1
- package/dist/components/ds-data-preferences.js +1 -1
- package/dist/components/ds-data-saved-views.js +1 -1
- package/dist/components/ds-data-search.js +1 -1
- package/dist/components/ds-data-sort.js +1 -1
- package/dist/components/ds-filter-menu.js +1 -1
- package/dist/components/ds-input-date.js +1 -1
- package/dist/components/ds-input-time.js +1 -1
- package/dist/components/ds-input.js +1 -1
- package/dist/components/ds-markdown.js +1 -1
- package/dist/components/ds-menu.js +1 -1
- package/dist/components/ds-message-actions.js +1 -1
- package/dist/components/ds-message-composer.js +1 -1
- package/dist/components/ds-message-scroller.js +1 -1
- package/dist/components/ds-mobile-header.js +1 -1
- package/dist/components/ds-mobile-section-switcher.js +1 -1
- package/dist/components/ds-mobile-sheet-nav.js +1 -1
- package/dist/components/ds-modal.js +1 -1
- package/dist/components/ds-pagination.js +1 -1
- package/dist/components/ds-panel-nav.js +1 -1
- package/dist/components/ds-panel-tool-header.js +1 -1
- package/dist/components/ds-panel-tool-search.js +1 -1
- package/dist/components/ds-panel-tools.js +1 -1
- package/dist/components/ds-select.js +1 -1
- package/dist/components/ds-shell-app.js +1 -1
- package/dist/components/ds-shell-tools.js +1 -1
- package/dist/components/ds-table.js +1 -1
- package/dist/components/ds-table.js.map +1 -1
- package/dist/components/ds-toast.js +1 -1
- package/dist/components/ds-toast.js.map +1 -1
- package/dist/components/ds-tooltip.js +1 -1
- package/dist/components/{p-BufAjyCA.js → p-9zDZcSc0.js} +2 -2
- package/dist/components/{p-SuM1Dske.js → p-B8jrUwL-.js} +2 -2
- package/dist/components/{p-DbBRCHst.js → p-BJB6kfA2.js} +2 -2
- package/dist/components/{p-a_-GSwE_.js → p-BK_SriZN.js} +2 -2
- package/dist/components/{p-DwiHy7ws.js → p-BKd0e8k8.js} +2 -2
- package/dist/components/{p-FsosWHV6.js → p-BNySDuzx.js} +2 -2
- package/dist/components/{p-DGznD-OD.js → p-BdJqRDKY.js} +2 -2
- package/dist/components/{p-CtBlyEwu.js → p-BgMeLCj3.js} +2 -2
- package/dist/components/{p-B6kIiHGc.js → p-BknNUjWh.js} +2 -2
- package/dist/components/{p-D1D_nwPJ.js → p-Bn-tsogb.js} +2 -2
- package/dist/components/{p-C9R-Yn0N.js → p-C3nUi5Lo.js} +2 -2
- package/dist/components/{p-DACIe-66.js → p-CcWT4SzP.js} +2 -2
- package/dist/components/{p-BL98zGOI.js → p-Ckar-ZZa.js} +2 -2
- package/dist/components/{p-D4wFhnby.js → p-CvK-Gy-b.js} +2 -2
- package/dist/components/{p-8XJLNIKj.js → p-D9MqUHig.js} +2 -2
- package/dist/components/{p-BNimvRZy.js → p-DI5GEmid.js} +2 -2
- package/dist/components/p-DTlNtCX1.js +2 -0
- package/dist/components/p-DTlNtCX1.js.map +1 -0
- package/dist/components/p-D_kOVT6i.js +2 -0
- package/dist/components/{p-S6vTfjOk.js.map → p-D_kOVT6i.js.map} +1 -1
- package/dist/components/{p-DC_yjqdf.js → p-Ddkyu_wE.js} +2 -2
- package/dist/components/{p-CeaXdjwl.js → p-ZcZ0N7Ok.js} +2 -2
- package/dist/components/{p-BO0Tb3LT.js → p-ZumxIz-2.js} +2 -2
- package/dist/components/{p-BLPr2sCi.js → p-qnp-yeXl.js} +2 -2
- package/dist/components/{p-02bODFpT.js → p-txmcXZdy.js} +2 -2
- package/dist/components/{p-BiB2qjNS.js → p-xouEdChm.js} +2 -2
- package/dist/components/{p-Dp90dvw8.js → p-zdiRX3Sf.js} +2 -2
- package/dist/docs/components.json +1 -1
- package/dist/lib/toast/index.js +61 -20
- package/dist/lib/toast/index.js.map +2 -2
- package/dist/lib/toast/toast-types.d.ts +1 -0
- package/dist/mcp-data/registry/table.json +7 -2
- package/dist/react/react-runtime.js +44 -1
- package/dist/types/components/Table/table-group-load-controller.d.ts +1 -1
- package/dist/types/components/Table/table-load-controller.d.ts +1 -2
- package/dist/types/components/Table/table-load-observer.d.ts +13 -0
- package/dist/types/toast/toast-types.d.ts +1 -0
- package/dist/types/utils/anchored-position-controller.d.ts +3 -2
- package/dist/vue/vue-runtime.js +13 -1
- package/package.json +15 -12
- package/dist/components/p-BMI0F08u.js +0 -2
- package/dist/components/p-BMI0F08u.js.map +0 -1
- package/dist/components/p-S6vTfjOk.js +0 -2
- /package/dist/components/{p-BufAjyCA.js.map → p-9zDZcSc0.js.map} +0 -0
- /package/dist/components/{p-SuM1Dske.js.map → p-B8jrUwL-.js.map} +0 -0
- /package/dist/components/{p-DbBRCHst.js.map → p-BJB6kfA2.js.map} +0 -0
- /package/dist/components/{p-a_-GSwE_.js.map → p-BK_SriZN.js.map} +0 -0
- /package/dist/components/{p-DwiHy7ws.js.map → p-BKd0e8k8.js.map} +0 -0
- /package/dist/components/{p-FsosWHV6.js.map → p-BNySDuzx.js.map} +0 -0
- /package/dist/components/{p-DGznD-OD.js.map → p-BdJqRDKY.js.map} +0 -0
- /package/dist/components/{p-CtBlyEwu.js.map → p-BgMeLCj3.js.map} +0 -0
- /package/dist/components/{p-B6kIiHGc.js.map → p-BknNUjWh.js.map} +0 -0
- /package/dist/components/{p-D1D_nwPJ.js.map → p-Bn-tsogb.js.map} +0 -0
- /package/dist/components/{p-C9R-Yn0N.js.map → p-C3nUi5Lo.js.map} +0 -0
- /package/dist/components/{p-DACIe-66.js.map → p-CcWT4SzP.js.map} +0 -0
- /package/dist/components/{p-BL98zGOI.js.map → p-Ckar-ZZa.js.map} +0 -0
- /package/dist/components/{p-D4wFhnby.js.map → p-CvK-Gy-b.js.map} +0 -0
- /package/dist/components/{p-8XJLNIKj.js.map → p-D9MqUHig.js.map} +0 -0
- /package/dist/components/{p-BNimvRZy.js.map → p-DI5GEmid.js.map} +0 -0
- /package/dist/components/{p-DC_yjqdf.js.map → p-Ddkyu_wE.js.map} +0 -0
- /package/dist/components/{p-CeaXdjwl.js.map → p-ZcZ0N7Ok.js.map} +0 -0
- /package/dist/components/{p-BO0Tb3LT.js.map → p-ZumxIz-2.js.map} +0 -0
- /package/dist/components/{p-BLPr2sCi.js.map → p-qnp-yeXl.js.map} +0 -0
- /package/dist/components/{p-02bODFpT.js.map → p-txmcXZdy.js.map} +0 -0
- /package/dist/components/{p-BiB2qjNS.js.map → p-xouEdChm.js.map} +0 -0
- /package/dist/components/{p-Dp90dvw8.js.map → p-zdiRX3Sf.js.map} +0 -0
package/dist/lib/toast/index.js
CHANGED
|
@@ -8,9 +8,22 @@ var ToastManagerImpl = class {
|
|
|
8
8
|
this.records = [];
|
|
9
9
|
this.listeners = /* @__PURE__ */ new Set();
|
|
10
10
|
this.nextId = 0;
|
|
11
|
+
this.promiseOwners = /* @__PURE__ */ new Map();
|
|
12
|
+
this.emitting = false;
|
|
13
|
+
this.emissionPending = false;
|
|
11
14
|
}
|
|
12
15
|
add(options) {
|
|
13
|
-
|
|
16
|
+
return this.addRecord(options);
|
|
17
|
+
}
|
|
18
|
+
addRecord(options, promiseOwner) {
|
|
19
|
+
let id = options.id;
|
|
20
|
+
if (!id) {
|
|
21
|
+
do {
|
|
22
|
+
id = `ds-toast-${++this.nextId}`;
|
|
23
|
+
} while (this.records.some((record2) => record2.id === id));
|
|
24
|
+
}
|
|
25
|
+
if (promiseOwner) this.promiseOwners.set(id, promiseOwner);
|
|
26
|
+
else this.promiseOwners.delete(id);
|
|
14
27
|
const existingIndex = this.records.findIndex((record2) => record2.id === id);
|
|
15
28
|
if (!options.title?.trim() && !options.description?.trim()) {
|
|
16
29
|
console.warn(`[ds-toast] Toast "${id}" should provide a title or description.`);
|
|
@@ -47,6 +60,7 @@ var ToastManagerImpl = class {
|
|
|
47
60
|
const index = this.records.findIndex((record) => record.id === id);
|
|
48
61
|
if (index < 0) return;
|
|
49
62
|
const current = this.records[index];
|
|
63
|
+
if (updates.type !== void 0 && updates.type !== current.type) this.promiseOwners.delete(id);
|
|
50
64
|
const restartsTimer = Object.prototype.hasOwnProperty.call(updates, "timeout") || current.type === "loading" && updates.type !== void 0 && updates.type !== "loading";
|
|
51
65
|
const updated = {
|
|
52
66
|
...current,
|
|
@@ -64,6 +78,7 @@ var ToastManagerImpl = class {
|
|
|
64
78
|
close(id, reason = "programmatic") {
|
|
65
79
|
const index = this.records.findIndex((record) => record.id === id);
|
|
66
80
|
if (index < 0 || this.records[index].transitionStatus === "ending") return;
|
|
81
|
+
this.promiseOwners.delete(id);
|
|
67
82
|
const closing = {
|
|
68
83
|
...this.records[index],
|
|
69
84
|
transitionStatus: "ending",
|
|
@@ -80,28 +95,41 @@ var ToastManagerImpl = class {
|
|
|
80
95
|
}
|
|
81
96
|
async promise(promiseValue, options) {
|
|
82
97
|
const loading = resolvePromiseValue(options.loading, void 0);
|
|
83
|
-
const
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
98
|
+
const owner = /* @__PURE__ */ Symbol();
|
|
99
|
+
const id = this.addRecord(
|
|
100
|
+
{
|
|
101
|
+
...loading,
|
|
102
|
+
type: loading.type ?? "loading",
|
|
103
|
+
timeout: 0
|
|
104
|
+
},
|
|
105
|
+
owner
|
|
106
|
+
);
|
|
107
|
+
const current = () => this.promiseOwners.get(id) === owner;
|
|
88
108
|
try {
|
|
89
109
|
const value = await promiseValue;
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
110
|
+
if (current()) {
|
|
111
|
+
const success = resolvePromiseValue(options.success, value);
|
|
112
|
+
if (current())
|
|
113
|
+
this.update(id, {
|
|
114
|
+
...success,
|
|
115
|
+
type: success.type ?? "success",
|
|
116
|
+
timeout: success.timeout
|
|
117
|
+
});
|
|
118
|
+
}
|
|
96
119
|
return value;
|
|
97
120
|
} catch (error) {
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
121
|
+
if (current()) {
|
|
122
|
+
const failure = resolvePromiseValue(options.error, error);
|
|
123
|
+
if (current())
|
|
124
|
+
this.update(id, {
|
|
125
|
+
...failure,
|
|
126
|
+
type: failure.type ?? "error",
|
|
127
|
+
timeout: failure.timeout
|
|
128
|
+
});
|
|
129
|
+
}
|
|
104
130
|
throw error;
|
|
131
|
+
} finally {
|
|
132
|
+
if (current()) this.promiseOwners.delete(id);
|
|
105
133
|
}
|
|
106
134
|
}
|
|
107
135
|
subscribe(listener) {
|
|
@@ -126,6 +154,7 @@ var ToastManagerImpl = class {
|
|
|
126
154
|
const record = this.records.find((candidate) => candidate.id === id);
|
|
127
155
|
if (!record || record.transitionStatus !== "ending") return null;
|
|
128
156
|
const reason = record.closeReason ?? "programmatic";
|
|
157
|
+
this.promiseOwners.delete(id);
|
|
129
158
|
this.records = this.records.filter((candidate) => candidate.id !== id);
|
|
130
159
|
this.emit();
|
|
131
160
|
const context = { id, reason, toast: record };
|
|
@@ -136,8 +165,20 @@ var ToastManagerImpl = class {
|
|
|
136
165
|
toast.onRemove?.(context);
|
|
137
166
|
}
|
|
138
167
|
emit() {
|
|
139
|
-
|
|
140
|
-
|
|
168
|
+
this.emissionPending = true;
|
|
169
|
+
if (this.emitting) return;
|
|
170
|
+
this.emitting = true;
|
|
171
|
+
try {
|
|
172
|
+
do {
|
|
173
|
+
this.emissionPending = false;
|
|
174
|
+
const snapshot = this.getSnapshot();
|
|
175
|
+
for (const listener of [...this.listeners]) {
|
|
176
|
+
if (this.listeners.has(listener)) listener(snapshot);
|
|
177
|
+
}
|
|
178
|
+
} while (this.emissionPending);
|
|
179
|
+
} finally {
|
|
180
|
+
this.emitting = false;
|
|
181
|
+
}
|
|
141
182
|
}
|
|
142
183
|
};
|
|
143
184
|
function createToastManager() {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/wc/toast/toast-manager.ts"],
|
|
4
|
-
"sourcesContent": ["import type {\n ToastCloseContext,\n ToastCloseReason,\n ToastListener,\n ToastManager,\n ToastOptions,\n ToastPromiseOptions,\n ToastPromiseValue,\n ToastRecord,\n} from './toast-types';\n\nfunction resolvePromiseValue<Value, Data>(\n value: ToastPromiseValue<Data> | ((input: Value) => ToastPromiseValue<Data>),\n input: Value\n): ToastOptions<Data> {\n const resolved = typeof value === 'function' ? value(input) : value;\n return typeof resolved === 'string' ? { description: resolved } : resolved;\n}\n\nclass ToastManagerImpl<Data = unknown> implements ToastManager<Data> {\n private records: ToastRecord<Data>[] = [];\n private listeners = new Set<ToastListener<Data>>();\n private nextId = 0;\n\n add(options: ToastOptions<Data>): string {\n
|
|
5
|
-
"mappings": ";AAWA,SAAS,oBACP,OACA,OACoB;AACpB,QAAM,WAAW,OAAO,UAAU,aAAa,MAAM,KAAK,IAAI;AAC9D,SAAO,OAAO,aAAa,WAAW,EAAE,aAAa,SAAS,IAAI;AACpE;AAEA,IAAM,mBAAN,MAAqE;AAAA,EAArE;AACE,SAAQ,UAA+B,CAAC;AACxC,SAAQ,YAAY,oBAAI,IAAyB;AACjD,SAAQ,SAAS;AAAA;AAAA,
|
|
4
|
+
"sourcesContent": ["import type {\n ToastCloseContext,\n ToastCloseReason,\n ToastListener,\n ToastManager,\n ToastOptions,\n ToastPromiseOptions,\n ToastPromiseValue,\n ToastRecord,\n} from './toast-types';\n\nfunction resolvePromiseValue<Value, Data>(\n value: ToastPromiseValue<Data> | ((input: Value) => ToastPromiseValue<Data>),\n input: Value\n): ToastOptions<Data> {\n const resolved = typeof value === 'function' ? value(input) : value;\n return typeof resolved === 'string' ? { description: resolved } : resolved;\n}\n\nclass ToastManagerImpl<Data = unknown> implements ToastManager<Data> {\n private records: ToastRecord<Data>[] = [];\n private listeners = new Set<ToastListener<Data>>();\n private nextId = 0;\n private promiseOwners = new Map<string, symbol>();\n private emitting = false;\n private emissionPending = false;\n\n add(options: ToastOptions<Data>): string {\n return this.addRecord(options);\n }\n\n private addRecord(options: ToastOptions<Data>, promiseOwner?: symbol): string {\n let id = options.id;\n if (!id) {\n do {\n id = `ds-toast-${++this.nextId}`;\n } while (this.records.some(record => record.id === id));\n }\n // Install ownership before notifying: a subscriber may replace or dismiss it.\n if (promiseOwner) this.promiseOwners.set(id, promiseOwner);\n else this.promiseOwners.delete(id);\n const existingIndex = this.records.findIndex(record => record.id === id);\n\n if (!options.title?.trim() && !options.description?.trim()) {\n console.warn(`[ds-toast] Toast \"${id}\" should provide a title or description.`);\n }\n\n if (existingIndex >= 0) {\n const current = this.records[existingIndex];\n const updated: ToastRecord<Data> = {\n ...current,\n ...options,\n id,\n priority: options.priority ?? current.priority,\n transitionStatus: 'active',\n closeReason: undefined,\n updateKey: current.updateKey + 1,\n timerKey: current.timerKey + 1,\n };\n this.records = [updated, ...this.records.filter((_, index) => index !== existingIndex)];\n this.emit();\n return id;\n }\n\n const record: ToastRecord<Data> = {\n ...options,\n id,\n priority: options.priority ?? 'low',\n transitionStatus: 'starting',\n updateKey: 0,\n timerKey: 0,\n };\n this.records = [record, ...this.records];\n this.emit();\n return id;\n }\n\n update(id: string, updates: Partial<ToastOptions<Data>>): void {\n const index = this.records.findIndex(record => record.id === id);\n if (index < 0) return;\n const current = this.records[index];\n // Progress copy can change while the same operation is pending. A type\n // transition explicitly takes ownership of its presentation instead.\n if (updates.type !== undefined && updates.type !== current.type) this.promiseOwners.delete(id);\n const restartsTimer =\n Object.prototype.hasOwnProperty.call(updates, 'timeout') ||\n (current.type === 'loading' && updates.type !== undefined && updates.type !== 'loading');\n const updated: ToastRecord<Data> = {\n ...current,\n ...updates,\n id,\n priority: updates.priority ?? current.priority,\n updateKey: current.updateKey + 1,\n timerKey: restartsTimer ? current.timerKey + 1 : current.timerKey,\n };\n this.records = this.records.map((record, recordIndex) =>\n recordIndex === index ? updated : record\n );\n this.emit();\n }\n\n close(id: string, reason: ToastCloseReason = 'programmatic'): void {\n const index = this.records.findIndex(record => record.id === id);\n if (index < 0 || this.records[index].transitionStatus === 'ending') return;\n this.promiseOwners.delete(id);\n\n const closing: ToastRecord<Data> = {\n ...this.records[index],\n transitionStatus: 'ending',\n closeReason: reason,\n };\n this.records = this.records.map((record, recordIndex) =>\n recordIndex === index ? closing : record\n );\n this.emit();\n closing.onClose?.({ id, reason, toast: closing });\n }\n\n closeAll(reason: ToastCloseReason = 'programmatic'): void {\n for (const record of [...this.records]) this.close(record.id, reason);\n }\n\n async promise<Value>(\n promiseValue: PromiseLike<Value>,\n options: ToastPromiseOptions<Value, Data>\n ): Promise<Value> {\n const loading = resolvePromiseValue(options.loading, undefined as Value);\n const owner = Symbol();\n const id = this.addRecord(\n {\n ...loading,\n type: loading.type ?? 'loading',\n timeout: 0,\n },\n owner\n );\n const current = () => this.promiseOwners.get(id) === owner;\n\n try {\n const value = await promiseValue;\n if (current()) {\n const success = resolvePromiseValue(options.success, value);\n if (current())\n this.update(id, {\n ...success,\n type: success.type ?? 'success',\n timeout: success.timeout,\n });\n }\n return value;\n } catch (error) {\n if (current()) {\n const failure = resolvePromiseValue(options.error, error);\n if (current())\n this.update(id, {\n ...failure,\n type: failure.type ?? 'error',\n timeout: failure.timeout,\n });\n }\n throw error;\n } finally {\n if (current()) this.promiseOwners.delete(id);\n }\n }\n\n subscribe(listener: ToastListener<Data>): () => void {\n this.listeners.add(listener);\n listener(this.getSnapshot());\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n getSnapshot(): readonly ToastRecord<Data>[] {\n return this.records.map(record => ({ ...record }));\n }\n\n activate(id: string): void {\n const record = this.records.find(candidate => candidate.id === id);\n if (!record || record.transitionStatus !== 'starting') return;\n this.records = this.records.map(candidate =>\n candidate.id === id ? { ...candidate, transitionStatus: 'active' } : candidate\n );\n this.emit();\n }\n\n remove(id: string): ToastCloseContext<Data> | null {\n const record = this.records.find(candidate => candidate.id === id);\n if (!record || record.transitionStatus !== 'ending') return null;\n const reason = record.closeReason ?? 'programmatic';\n this.promiseOwners.delete(id);\n this.records = this.records.filter(candidate => candidate.id !== id);\n this.emit();\n const context: ToastCloseContext<Data> = { id, reason, toast: record };\n return context;\n }\n\n notifyRemove(context: ToastCloseContext<Data>): void {\n const { toast } = context;\n toast.onRemove?.(context);\n }\n\n private emit(): void {\n this.emissionPending = true;\n if (this.emitting) return;\n this.emitting = true;\n try {\n do {\n this.emissionPending = false;\n const snapshot = this.getSnapshot();\n for (const listener of [...this.listeners]) {\n if (this.listeners.has(listener)) listener(snapshot);\n }\n } while (this.emissionPending);\n } finally {\n this.emitting = false;\n }\n }\n}\n\nexport function createToastManager<Data = unknown>(): ToastManager<Data> {\n return new ToastManagerImpl<Data>();\n}\n\nconst defaultManagerKey = Symbol.for('@ds-mo/ui/default-toast-manager');\nconst globalScope = globalThis as typeof globalThis & Record<PropertyKey, unknown>;\nconst existingManager = globalScope[defaultManagerKey] as ToastManager | undefined;\n\nexport const toastManager: ToastManager = existingManager ?? createToastManager();\n\nif (!existingManager) globalScope[defaultManagerKey] = toastManager;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["record"]
|
|
7
7
|
}
|
|
@@ -63,6 +63,7 @@ export interface ToastManager<Data = unknown> {
|
|
|
63
63
|
update(id: string, updates: Partial<ToastOptions<Data>>): void;
|
|
64
64
|
close(id: string, reason?: ToastCloseReason): void;
|
|
65
65
|
closeAll(reason?: ToastCloseReason): void;
|
|
66
|
+
/** A replaced, retyped, or dismissed loading toast ignores its old promise's presentation result; progress copy may still update. */
|
|
66
67
|
promise<Value>(promiseValue: PromiseLike<Value>, options: ToastPromiseOptions<Value, Data>): Promise<Value>;
|
|
67
68
|
subscribe(listener: ToastListener<Data>): () => void;
|
|
68
69
|
getSnapshot(): readonly ToastRecord<Data>[];
|
|
@@ -1775,7 +1775,7 @@
|
|
|
1775
1775
|
},
|
|
1776
1776
|
{
|
|
1777
1777
|
"path": "src/wc/components/Table/table-group-load-controller.ts",
|
|
1778
|
-
"content": "import type {\n DataGroup,\n TableGroupLoadMoreDetail,\n TableLoadMoreMode,\n TableLoadMoreReason,\n} from './table-types';\n\nexport interface TableGroupLoadControllerState {\n enabled: boolean;\n loadMoreMode: TableLoadMoreMode;\n loadMoreThreshold: number;\n containedScroll: boolean;\n groups: DataGroup[];\n viewport: HTMLElement | null;\n sentinels: ReadonlyMap<string, HTMLElement>;\n loadingMoreLabel: string;\n endOfResultsLabel: string;\n rowsLoadedLabel: string;\n}\n\nexport interface TableGroupLoadControllerOptions {\n state: () => TableGroupLoadControllerState;\n announce: (message: string) => void;\n request: (detail: TableGroupLoadMoreDetail) => void;\n}\n\ninterface GroupSnapshot {\n count: number;\n hasMore: boolean;\n loading: boolean;\n error: string;\n identity: string | number;\n}\n\nfunction groupIdentity(group: DataGroup): string | number {\n return group.loadIdentity ?? group.id;\n}\n\nfunction formatGroupLabel(template: string, group: DataGroup, count?: number): string {\n return template\n .split('{group}')\n .join(group.label)\n .split('{count}')\n .join(String(count ?? group.rows.length))\n .split('{loaded}')\n .join(String(group.rows.length))\n .split('{total}')\n .join(String(group.totalCount ?? group.rows.length));\n}\n\n/** Owns request guards, announcements, and observation for independently loaded groups. */\nexport class TableGroupLoadController {\n readonly intersectionSupported = typeof IntersectionObserver !== 'undefined';\n\n private connected = false;\n private
|
|
1778
|
+
"content": "import type {\n DataGroup,\n TableGroupLoadMoreDetail,\n TableLoadMoreMode,\n TableLoadMoreReason,\n} from './table-types';\nimport { TableLoadObserver } from './table-load-observer';\n\nexport interface TableGroupLoadControllerState {\n enabled: boolean;\n loadMoreMode: TableLoadMoreMode;\n loadMoreThreshold: number;\n containedScroll: boolean;\n groups: DataGroup[];\n viewport: HTMLElement | null;\n sentinels: ReadonlyMap<string, HTMLElement>;\n loadingMoreLabel: string;\n endOfResultsLabel: string;\n rowsLoadedLabel: string;\n}\n\nexport interface TableGroupLoadControllerOptions {\n state: () => TableGroupLoadControllerState;\n announce: (message: string) => void;\n request: (detail: TableGroupLoadMoreDetail) => void;\n}\n\ninterface GroupSnapshot {\n count: number;\n hasMore: boolean;\n loading: boolean;\n error: string;\n identity: string | number;\n}\n\nfunction groupIdentity(group: DataGroup): string | number {\n return group.loadIdentity ?? group.id;\n}\n\nfunction formatGroupLabel(template: string, group: DataGroup, count?: number): string {\n return template\n .split('{group}')\n .join(group.label)\n .split('{count}')\n .join(String(count ?? group.rows.length))\n .split('{loaded}')\n .join(String(group.rows.length))\n .split('{total}')\n .join(String(group.totalCount ?? group.rows.length));\n}\n\n/** Owns request guards, announcements, and observation for independently loaded groups. */\nexport class TableGroupLoadController {\n readonly intersectionSupported = typeof IntersectionObserver !== 'undefined';\n\n private connected = false;\n private readonly observer = new TableLoadObserver(groupId => this.request(groupId, 'auto'));\n private snapshots = new Map<string, GroupSnapshot>();\n private pending = new Map<string, { identity: string | number; count: number }>();\n\n constructor(private readonly options: TableGroupLoadControllerOptions) {}\n\n initialize(): void {\n this.snapshots = this.createSnapshots();\n }\n\n connect(): void {\n this.connected = true;\n this.refresh();\n }\n\n disconnect(): void {\n this.connected = false;\n this.disconnectObserver();\n }\n\n refresh(): void {\n if (!this.connected) return;\n const state = this.options.state();\n if (\n !state.enabled ||\n state.loadMoreMode !== 'auto' ||\n !this.intersectionSupported ||\n !state.viewport\n ) {\n this.disconnectObserver();\n return;\n }\n\n const groups = new Map(state.groups.map(group => [group.id, group]));\n const targets = new Map<HTMLElement, string>();\n for (const [groupId, sentinel] of state.sentinels) {\n const group = groups.get(groupId);\n if (!group?.hasMore || group.loadingMore || group.loadMoreError?.trim()) continue;\n targets.set(sentinel, groupId);\n }\n this.observer.refresh(\n targets,\n state.containedScroll ? state.viewport : null,\n state.loadMoreThreshold\n );\n }\n\n structureChanged(): void {\n this.pending.clear();\n this.snapshots = this.createSnapshots();\n this.disconnectObserver();\n }\n\n dataChanged(): void {\n const state = this.options.state();\n const nextSnapshots = new Map<string, GroupSnapshot>();\n\n for (const group of state.groups) {\n const next = this.snapshot(group);\n const previous = this.snapshots.get(group.id);\n const pending = this.pending.get(group.id);\n\n if (!previous || previous.identity !== next.identity) {\n this.pending.delete(group.id);\n } else {\n if (next.count > previous.count) {\n this.options.announce(\n formatGroupLabel(state.rowsLoadedLabel, group, next.count - previous.count)\n );\n }\n if (!previous.error && next.error) {\n this.pending.delete(group.id);\n this.options.announce(next.error);\n }\n if (previous.hasMore && !next.hasMore) {\n this.pending.delete(group.id);\n this.options.announce(formatGroupLabel(state.endOfResultsLabel, group));\n }\n if (pending && next.count > pending.count) this.pending.delete(group.id);\n if (\n state.loadMoreMode === 'manual' &&\n pending &&\n previous.loading &&\n !next.loading &&\n next.count === pending.count\n ) {\n // Empty automatic responses must not cause an endless request loop.\n this.pending.delete(group.id);\n }\n }\n\n nextSnapshots.set(group.id, next);\n }\n\n this.snapshots = nextSnapshots;\n for (const groupId of this.pending.keys()) {\n if (!nextSnapshots.has(groupId)) this.pending.delete(groupId);\n }\n this.disconnectObserver();\n }\n\n configurationChanged(): void {\n this.disconnectObserver();\n }\n\n request(groupId: string, reason: TableLoadMoreReason): void {\n const state = this.options.state();\n const group = state.groups.find(item => item.id === groupId);\n if (\n !state.enabled ||\n (reason === 'auto' && (!this.connected || state.loadMoreMode !== 'auto')) ||\n !group?.hasMore ||\n group.loadingMore ||\n (reason !== 'retry' && !!group.loadMoreError?.trim()) ||\n this.pending.has(groupId)\n )\n return;\n\n const identity = groupIdentity(group);\n this.pending.set(groupId, { identity, count: group.rows.length });\n this.options.announce(formatGroupLabel(state.loadingMoreLabel, group));\n this.options.request({\n groupId,\n reason,\n loadIdentity: identity,\n loadedRowCount: group.rows.length,\n });\n }\n\n private createSnapshots(): Map<string, GroupSnapshot> {\n return new Map(this.options.state().groups.map(group => [group.id, this.snapshot(group)]));\n }\n\n private snapshot(group: DataGroup): GroupSnapshot {\n return {\n count: group.rows.length,\n hasMore: !!group.hasMore,\n loading: !!group.loadingMore,\n error: group.loadMoreError?.trim() ?? '',\n identity: groupIdentity(group),\n };\n }\n\n private disconnectObserver(): void {\n this.observer.disconnect();\n }\n}\n",
|
|
1779
1779
|
"type": "registry:ui"
|
|
1780
1780
|
},
|
|
1781
1781
|
{
|
|
@@ -1790,7 +1790,12 @@
|
|
|
1790
1790
|
},
|
|
1791
1791
|
{
|
|
1792
1792
|
"path": "src/wc/components/Table/table-load-controller.ts",
|
|
1793
|
-
"content": "import type { TableLoadMoreDetail, TableLoadMoreMode, TableLoadMoreReason } from './table-types';\n\nexport interface TableLoadControllerState {\n lazyLoading: boolean;\n loadMoreMode: TableLoadMoreMode;\n hasMore: boolean;\n loadingMore: boolean;\n loadMoreError: string | undefined;\n loadIdentity: string | number;\n loadMoreThreshold: number;\n containedScroll: boolean;\n loadingMoreLabel: string;\n endOfResultsLabel: string;\n rowsLoadedLabel: string;\n loadedRowCount: number;\n viewport: HTMLElement | null;\n sentinel: HTMLElement | null;\n}\n\nexport interface TableLoadControllerOptions {\n state: () => TableLoadControllerState;\n announce: (message: string) => void;\n request: (detail: TableLoadMoreDetail) => void;\n}\n\n/** Owns incremental-loading request guards, announcements, and observation. */\nexport class TableLoadController {\n readonly intersectionSupported = typeof IntersectionObserver !== 'undefined';\n\n private connected = false;\n private
|
|
1793
|
+
"content": "import type { TableLoadMoreDetail, TableLoadMoreMode, TableLoadMoreReason } from './table-types';\nimport { TableLoadObserver } from './table-load-observer';\n\nexport interface TableLoadControllerState {\n lazyLoading: boolean;\n loadMoreMode: TableLoadMoreMode;\n hasMore: boolean;\n loadingMore: boolean;\n loadMoreError: string | undefined;\n loadIdentity: string | number;\n loadMoreThreshold: number;\n containedScroll: boolean;\n loadingMoreLabel: string;\n endOfResultsLabel: string;\n rowsLoadedLabel: string;\n loadedRowCount: number;\n viewport: HTMLElement | null;\n sentinel: HTMLElement | null;\n}\n\nexport interface TableLoadControllerOptions {\n state: () => TableLoadControllerState;\n announce: (message: string) => void;\n request: (detail: TableLoadMoreDetail) => void;\n}\n\n/** Owns incremental-loading request guards, announcements, and observation. */\nexport class TableLoadController {\n readonly intersectionSupported = typeof IntersectionObserver !== 'undefined';\n\n private connected = false;\n private readonly observer = new TableLoadObserver(() => this.request('auto'));\n private requestPending = false;\n private requestedRowCount = 0;\n private previousLoadedRowCount = 0;\n\n constructor(private readonly options: TableLoadControllerOptions) {}\n\n initialize(): void {\n this.previousLoadedRowCount = this.options.state().loadedRowCount;\n }\n\n connect(): void {\n this.connected = true;\n this.refresh();\n }\n\n disconnect(): void {\n this.connected = false;\n this.disconnectObserver();\n }\n\n refresh(): void {\n if (!this.connected) return;\n const state = this.options.state();\n if (\n !state.lazyLoading ||\n state.loadMoreMode !== 'auto' ||\n !state.hasMore ||\n !!state.loadMoreError?.trim() ||\n !this.intersectionSupported ||\n !state.viewport ||\n !state.sentinel\n ) {\n this.disconnectObserver();\n return;\n }\n\n this.observer.refresh(\n new Map([[state.sentinel, 'rows']]),\n state.containedScroll ? state.viewport : null,\n state.loadMoreThreshold\n );\n }\n\n structureChanged(): void {\n this.resetRequest();\n }\n\n dataChanged(): void {\n const state = this.options.state();\n const nextCount = state.loadedRowCount;\n if (!state.lazyLoading) {\n this.previousLoadedRowCount = nextCount;\n this.resetRequest();\n return;\n }\n if (nextCount > this.previousLoadedRowCount) {\n const added = nextCount - this.previousLoadedRowCount;\n this.options.announce(\n state.rowsLoadedLabel\n .replace('{count}', String(added))\n .replace('{total}', String(nextCount))\n );\n }\n if (nextCount > this.requestedRowCount) this.requestPending = false;\n this.previousLoadedRowCount = nextCount;\n this.disconnectObserver();\n }\n\n identityChanged(): void {\n this.previousLoadedRowCount = this.options.state().loadedRowCount;\n this.resetRequest();\n }\n\n configurationChanged(): void {\n this.disconnectObserver();\n }\n\n loadingChanged(loading: boolean): void {\n const state = this.options.state();\n if (!state.lazyLoading) {\n this.resetRequest();\n return;\n }\n if (loading) {\n this.requestPending = true;\n this.options.announce(state.loadingMoreLabel);\n } else if (state.loadMoreMode === 'manual') {\n // A completed manual request may append no rows; permit another explicit activation.\n this.requestPending = false;\n }\n this.disconnectObserver();\n }\n\n errorChanged(error: string | undefined): void {\n if (!this.options.state().lazyLoading) {\n this.resetRequest();\n return;\n }\n if (error?.trim()) {\n this.requestPending = false;\n this.options.announce(error);\n }\n this.disconnectObserver();\n }\n\n hasMoreChanged(hasMore: boolean, hadMore: boolean): void {\n if (!this.options.state().lazyLoading) {\n this.resetRequest();\n return;\n }\n if (!hasMore) {\n this.requestPending = false;\n if (hadMore) this.options.announce(this.options.state().endOfResultsLabel);\n }\n this.disconnectObserver();\n }\n\n request(reason: TableLoadMoreReason): void {\n const state = this.options.state();\n if (\n !state.lazyLoading ||\n (reason === 'auto' && (!this.connected || state.loadMoreMode !== 'auto')) ||\n !state.hasMore ||\n state.loadingMore ||\n (reason !== 'retry' && !!state.loadMoreError?.trim()) ||\n this.requestPending\n )\n return;\n\n this.requestPending = true;\n this.requestedRowCount = state.loadedRowCount;\n this.options.announce(state.loadingMoreLabel);\n this.options.request({\n reason,\n loadIdentity: state.loadIdentity,\n loadedRowCount: this.requestedRowCount,\n });\n }\n\n private resetRequest(): void {\n this.requestPending = false;\n this.requestedRowCount = this.options.state().loadedRowCount;\n this.disconnectObserver();\n }\n\n private disconnectObserver(): void {\n this.observer.disconnect();\n }\n}\n",
|
|
1794
|
+
"type": "registry:ui"
|
|
1795
|
+
},
|
|
1796
|
+
{
|
|
1797
|
+
"path": "src/wc/components/Table/table-load-observer.ts",
|
|
1798
|
+
"content": "/** Reconciles loading sentinels without rebuilding an observer on every render. */\nexport class TableLoadObserver {\n private observer: IntersectionObserver | null = null;\n private targets = new Map<HTMLElement, string>();\n private root: HTMLElement | null = null;\n private margin = '';\n private revision = 0;\n\n constructor(private readonly intersect: (id: string, target: HTMLElement) => void) {}\n\n refresh(\n targets: ReadonlyMap<HTMLElement, string>,\n root: HTMLElement | null,\n threshold: number\n ): void {\n if (!targets.size) {\n this.disconnect();\n return;\n }\n const margin = `0px 0px ${Number.isFinite(threshold) ? Math.max(0, threshold) : 0}px 0px`;\n const reassigned = [...targets].some(\n ([target, id]) => this.targets.has(target) && this.targets.get(target) !== id\n );\n if (this.root !== root || this.margin !== margin || reassigned) this.disconnect();\n if (!this.observer) {\n const observer = new IntersectionObserver(\n entries => {\n const revision = this.revision;\n for (const entry of entries) {\n // Disconnect does not revoke a callback already queued by the browser.\n // Application callbacks can also invalidate the rest of this delivery.\n if (this.observer !== observer || revision !== this.revision) return;\n const target = entry.target as HTMLElement;\n const id = this.targets.get(target);\n if (entry.isIntersecting && id !== undefined) this.intersect(id, target);\n }\n },\n { root, rootMargin: margin }\n );\n this.observer = observer;\n this.root = root;\n this.margin = margin;\n }\n const previous = this.targets;\n let changed = previous.size !== targets.size;\n for (const [target, id] of previous) {\n if (targets.get(target) !== id) changed = true;\n if (!targets.has(target)) this.observer.unobserve(target);\n }\n if (changed) this.revision++;\n this.targets = new Map(targets);\n for (const target of targets.keys()) {\n if (!previous.has(target)) this.observer.observe(target);\n }\n }\n\n disconnect(): void {\n const observer = this.observer;\n this.observer = null;\n this.targets.clear();\n this.root = null;\n this.margin = '';\n this.revision++;\n observer?.disconnect();\n }\n}\n",
|
|
1794
1799
|
"type": "registry:ui"
|
|
1795
1800
|
},
|
|
1796
1801
|
{
|
|
@@ -6,8 +6,51 @@ import { createComponent as createLitComponent } from '@lit/react';
|
|
|
6
6
|
export function createComponent({ defineCustomElement, tagName, transformTag, ...options }) {
|
|
7
7
|
defineCustomElement?.();
|
|
8
8
|
const resolvedTagName = transformTag ? transformTag(tagName) : tagName;
|
|
9
|
-
|
|
9
|
+
const events = Object.entries(options.events ?? {});
|
|
10
|
+
const Bridge = createLitComponent({
|
|
10
11
|
...options,
|
|
12
|
+
// Own subscriptions so unmount releases application callbacks. Lit retains
|
|
13
|
+
// ownership of custom-element properties and native React props.
|
|
14
|
+
events: {},
|
|
11
15
|
tagName: resolvedTagName,
|
|
12
16
|
});
|
|
17
|
+
if (events.length === 0)
|
|
18
|
+
return Bridge;
|
|
19
|
+
const React = options.react;
|
|
20
|
+
const useBrowserLayoutEffect = typeof window === 'undefined' ? React.useEffect : React.useLayoutEffect;
|
|
21
|
+
const Component = React.forwardRef((props, ref) => {
|
|
22
|
+
const element = React.useRef(null);
|
|
23
|
+
const elementProps = { ...props };
|
|
24
|
+
for (const [prop] of events)
|
|
25
|
+
delete elementProps[prop];
|
|
26
|
+
useBrowserLayoutEffect(() => {
|
|
27
|
+
const node = element.current;
|
|
28
|
+
if (!node)
|
|
29
|
+
return;
|
|
30
|
+
const subscriptions = [];
|
|
31
|
+
for (const [prop, name] of events) {
|
|
32
|
+
const handler = props[prop];
|
|
33
|
+
if (typeof handler !== 'function')
|
|
34
|
+
continue;
|
|
35
|
+
const listener = event => handler(event);
|
|
36
|
+
node.addEventListener(name, listener);
|
|
37
|
+
subscriptions.push([name, listener]);
|
|
38
|
+
}
|
|
39
|
+
return () => {
|
|
40
|
+
for (const [name, listener] of subscriptions)
|
|
41
|
+
node.removeEventListener(name, listener);
|
|
42
|
+
};
|
|
43
|
+
});
|
|
44
|
+
const setRef = React.useCallback((node) => {
|
|
45
|
+
element.current = node;
|
|
46
|
+
if (typeof ref === 'function')
|
|
47
|
+
ref(node);
|
|
48
|
+
else if (ref)
|
|
49
|
+
ref.current = node;
|
|
50
|
+
}, [ref]);
|
|
51
|
+
const bridgeProps = { ...elementProps, ref: setRef };
|
|
52
|
+
return React.createElement(Bridge, bridgeProps);
|
|
53
|
+
});
|
|
54
|
+
Component.displayName = options.displayName ?? resolvedTagName;
|
|
55
|
+
return Component;
|
|
13
56
|
}
|
|
@@ -21,7 +21,7 @@ export declare class TableGroupLoadController {
|
|
|
21
21
|
private readonly options;
|
|
22
22
|
readonly intersectionSupported: boolean;
|
|
23
23
|
private connected;
|
|
24
|
-
private
|
|
24
|
+
private readonly observer;
|
|
25
25
|
private snapshots;
|
|
26
26
|
private pending;
|
|
27
27
|
constructor(options: TableGroupLoadControllerOptions);
|
|
@@ -25,8 +25,7 @@ export declare class TableLoadController {
|
|
|
25
25
|
private readonly options;
|
|
26
26
|
readonly intersectionSupported: boolean;
|
|
27
27
|
private connected;
|
|
28
|
-
private
|
|
29
|
-
private observedSentinel;
|
|
28
|
+
private readonly observer;
|
|
30
29
|
private requestPending;
|
|
31
30
|
private requestedRowCount;
|
|
32
31
|
private previousLoadedRowCount;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** Reconciles loading sentinels without rebuilding an observer on every render. */
|
|
2
|
+
export declare class TableLoadObserver {
|
|
3
|
+
private readonly intersect;
|
|
4
|
+
private observer;
|
|
5
|
+
private targets;
|
|
6
|
+
private root;
|
|
7
|
+
private margin;
|
|
8
|
+
private revision;
|
|
9
|
+
constructor(intersect: (id: string, target: HTMLElement) => void);
|
|
10
|
+
refresh(targets: ReadonlyMap<HTMLElement, string>, root: HTMLElement | null, threshold: number): void;
|
|
11
|
+
disconnect(): void;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=table-load-observer.d.ts.map
|
|
@@ -63,6 +63,7 @@ export interface ToastManager<Data = unknown> {
|
|
|
63
63
|
update(id: string, updates: Partial<ToastOptions<Data>>): void;
|
|
64
64
|
close(id: string, reason?: ToastCloseReason): void;
|
|
65
65
|
closeAll(reason?: ToastCloseReason): void;
|
|
66
|
+
/** A replaced, retyped, or dismissed loading toast ignores its old promise's presentation result; progress copy may still update. */
|
|
66
67
|
promise<Value>(promiseValue: PromiseLike<Value>, options: ToastPromiseOptions<Value, Data>): Promise<Value>;
|
|
67
68
|
subscribe(listener: ToastListener<Data>): () => void;
|
|
68
69
|
getSnapshot(): readonly ToastRecord<Data>[];
|
|
@@ -72,6 +72,7 @@ export declare class AnchoredPositionController {
|
|
|
72
72
|
private readonly options;
|
|
73
73
|
private scrollResizeHandler;
|
|
74
74
|
private resizeObserver;
|
|
75
|
+
private resizeTargets;
|
|
75
76
|
private retryRaf;
|
|
76
77
|
private liveRaf;
|
|
77
78
|
private anchorMotionRaf;
|
|
@@ -113,8 +114,8 @@ export declare class AnchoredPositionController {
|
|
|
113
114
|
private eventCanMoveAnchor;
|
|
114
115
|
private scheduleAnchorMotionUpdate;
|
|
115
116
|
/**
|
|
116
|
-
*
|
|
117
|
-
*
|
|
117
|
+
* Keep only the current connected anchor and popup observed. Replaced or
|
|
118
|
+
* detached elements must not remain retained until the overlay closes.
|
|
118
119
|
*/
|
|
119
120
|
observeResizeTargets(): void;
|
|
120
121
|
}
|
package/dist/vue/vue-runtime.js
CHANGED
|
@@ -212,7 +212,19 @@ var defineContainer = (name, defineCustomElement, componentProps = [], emitProps
|
|
|
212
212
|
emits
|
|
213
213
|
});
|
|
214
214
|
};
|
|
215
|
+
|
|
216
|
+
// src/framework/vue-runtime.ts
|
|
217
|
+
function defineContainer2(...args) {
|
|
218
|
+
const component = defineContainer(...args);
|
|
219
|
+
const { props } = component;
|
|
220
|
+
for (const name of args[2] ?? []) {
|
|
221
|
+
if (name.startsWith("aria") && typeof props[name]?.default === "symbol") {
|
|
222
|
+
props[name] = { ...props[name], default: void 0 };
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
return component;
|
|
226
|
+
}
|
|
215
227
|
export {
|
|
216
|
-
defineContainer,
|
|
228
|
+
defineContainer2 as defineContainer,
|
|
217
229
|
defineStencilSSRComponent
|
|
218
230
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ds-mo/ui",
|
|
3
|
-
"version": "16.1.
|
|
3
|
+
"version": "16.1.1",
|
|
4
4
|
"description": "CompoMo — composable web components styled with TokoMo design tokens",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"web-components",
|
|
@@ -95,8 +95,9 @@
|
|
|
95
95
|
"pretest": "node scripts/generate-icon-catalog.mjs",
|
|
96
96
|
"build": "stencil build && node scripts/finalize-package.mjs",
|
|
97
97
|
"verify:pack": "node scripts/verify-framework-proxies.mjs && node scripts/verify-npm-pack.mjs && node scripts/verify-package-imports.mjs",
|
|
98
|
-
"verify:local": "npm run format:check && npm run typecheck && npm run typecheck:storybook && npm run lint && npm test && npm run build && npm run agent:validate && npm run verify:pack",
|
|
99
|
-
"verify:local:full": "npm run verify:local && npm run test:e2e:chromium",
|
|
98
|
+
"verify:local": "npm run format:check && npm run verify:storybook-compatibility && npm run typecheck && npm run typecheck:storybook && npm run lint && npm test && npm run build && npm run agent:validate && npm run verify:pack",
|
|
99
|
+
"verify:local:full": "npm run verify:local && npm run test:e2e:chromium && npm run test:framework-consumers",
|
|
100
|
+
"test:framework-consumers": "node scripts/verify-package-imports.mjs --browser",
|
|
100
101
|
"perf:measure": "node --import tsx/esm scripts/measure-performance.mjs && node scripts/measure-bundles.mjs",
|
|
101
102
|
"test": "node --import tsx/esm --test tests/*.test.ts",
|
|
102
103
|
"test:e2e": "npm run build && playwright test",
|
|
@@ -128,7 +129,9 @@
|
|
|
128
129
|
"registry:build": "node scripts/build-registry.mjs",
|
|
129
130
|
"agent:validate": "node scripts/validate-agent-contract.mjs",
|
|
130
131
|
"agent:validate:trilogy": "node scripts/validate-trilogy-manifests.mjs",
|
|
131
|
-
"mcp": "node scripts/mcp-server.mjs"
|
|
132
|
+
"mcp": "node scripts/mcp-server.mjs",
|
|
133
|
+
"test:visual": "playwright test --config playwright.visual.config.ts",
|
|
134
|
+
"verify:storybook-compatibility": "npm ls storybook @storybook/addon-vitest vitest @vitest/browser-playwright"
|
|
132
135
|
},
|
|
133
136
|
"peerDependencies": {
|
|
134
137
|
"@angular/core": ">=19 <23",
|
|
@@ -192,11 +195,11 @@
|
|
|
192
195
|
"@stencil/core": "^4.43.5",
|
|
193
196
|
"@stencil/react-output-target": "^1.6.0",
|
|
194
197
|
"@stencil/vue-output-target": "^0.14.1",
|
|
195
|
-
"@storybook/addon-a11y": "^10.
|
|
196
|
-
"@storybook/addon-docs": "^10.
|
|
197
|
-
"@storybook/addon-vitest": "^10.
|
|
198
|
-
"@storybook/web-components": "^10.
|
|
199
|
-
"@storybook/web-components-vite": "^10.
|
|
198
|
+
"@storybook/addon-a11y": "^10.6.1",
|
|
199
|
+
"@storybook/addon-docs": "^10.6.1",
|
|
200
|
+
"@storybook/addon-vitest": "^10.6.1",
|
|
201
|
+
"@storybook/web-components": "^10.6.1",
|
|
202
|
+
"@storybook/web-components-vite": "^10.6.1",
|
|
200
203
|
"@types/d3-array": "^3.2.2",
|
|
201
204
|
"@types/d3-scale": "^4.0.9",
|
|
202
205
|
"@types/d3-shape": "^3.1.8",
|
|
@@ -204,7 +207,7 @@
|
|
|
204
207
|
"@types/react": "^19.2.17",
|
|
205
208
|
"@types/react-dom": "^19.2.3",
|
|
206
209
|
"@types/sax": "^1.2.7",
|
|
207
|
-
"@vitest/browser-playwright": "^5.0.
|
|
210
|
+
"@vitest/browser-playwright": "^5.0.3",
|
|
208
211
|
"ajv": "^8.20.0",
|
|
209
212
|
"axe-core": "^4.12.1",
|
|
210
213
|
"colord": "^2.9.4",
|
|
@@ -223,13 +226,13 @@
|
|
|
223
226
|
"prettier": "3.8.3",
|
|
224
227
|
"react": "^19.2.7",
|
|
225
228
|
"react-dom": "^19.2.7",
|
|
226
|
-
"storybook": "^10.
|
|
229
|
+
"storybook": "^10.6.1",
|
|
227
230
|
"svg-tags": "^1.0.0",
|
|
228
231
|
"tsx": "^4.23.0",
|
|
229
232
|
"typescript": "~6.0.3",
|
|
230
233
|
"typescript-eslint": "^8.63.0",
|
|
231
234
|
"vite": "^8.1.4",
|
|
232
|
-
"vitest": "^5.0.
|
|
235
|
+
"vitest": "^5.0.3",
|
|
233
236
|
"vue": "^3.5.41",
|
|
234
237
|
"vue-router": "^5.2.0",
|
|
235
238
|
"zod": "^4.4.3"
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{p as t,H as i,h as s,a as o,t as n}from"./index.js";import{d as e}from"./p-DMPn_dt7.js";import{b as r,T as h,a,r as l}from"./p-mSCnWLhL.js";import{r as d}from"./p-CVYjLzYI.js";import{C as c}from"./p-CuwopElg.js";const p=new Set(["⌘","⇧","⌥","⌃"]);const u={alt:"⌥",cmd:"⌘",command:"⌘",control:"⌃",ctrl:"⌃",option:"⌥",shift:"⇧"};function f(t){return u[t.toLowerCase()]??t}function m(t){const i=t.trim();if(!i)return[];if(i.includes("+")){return i.split("+").map((t=>t.trim())).filter(Boolean).map(f)}if(/\s/.test(i)){return i.split(/\s+/).filter(Boolean).map(f)}const s=Array.from(i);const o=[];while(s.length>1&&p.has(s[0])){o.push(s.shift())}o.push(s.join(""));return o}const g={top:"bottom",right:"left",bottom:"top",left:"right"};function v(t,i){const{anchorRect:s,popupWidth:o,popupHeight:n,align:e,sideOffsetPx:r,alignOffsetPx:h}=t;if(i==="top"||i==="bottom"){return{x:e==="start"?s.left+h:e==="end"?s.right-o+h:s.left+s.width/2-o/2+h,y:i==="top"?s.top-n-r:s.bottom+r}}return{x:i==="left"?s.left-o-r:s.right+r,y:e==="start"?s.top+h:e==="end"?s.bottom-n+h:s.top+s.height/2-n/2+h}}function y(t){const i=t.collisionRect??{top:0,left:0,right:t.viewportWidth,bottom:t.viewportHeight};return{top:i.top+t.viewportPadPx,left:i.left+t.viewportPadPx,right:i.right-t.viewportPadPx,bottom:i.bottom-t.viewportPadPx}}function b(t,i,s){const{popupWidth:o,popupHeight:n}=t;const e=y(t);if(i==="top"||i==="bottom"){return Math.max(e.top-s.y,0)+Math.max(s.y+n-e.bottom,0)}return Math.max(e.left-s.x,0)+Math.max(s.x+o-e.right,0)}function w(t,i,s,o){const n=Math.max(s,o-i);return Math.min(Math.max(t,s),n)}function x(t){const i=y(t);const s=v(t,t.side);const o=g[t.side];const n=v(t,o);const e=b(t,t.side,s);const r=b(t,o,n);const h=e>0&&r<e;const a=h?o:t.side;const l=h?n:s;const d=a==="top"?t.anchorRect.top-i.top-t.sideOffsetPx:a==="bottom"?i.bottom-t.anchorRect.bottom-t.sideOffsetPx:i.bottom-i.top;return{x:w(l.x,t.popupWidth,i.left,i.right),y:w(l.y,t.popupHeight,i.top,i.bottom),resolvedSide:a,availableHeight:Math.max(0,d)}}const C=8;class O{constructor(t){this.scrollResizeHandler=null;this.resizeObserver=null;this.retryRaf=null;this.liveRaf=null;this.anchorMotionRaf=null;this.activeAnchorMotions=0;this.ownerDocument=null;this.last=null;this.isReady=false;this.generation=0;this.retryGeneration=0;this.anchorMotionStartHandler=t=>{if(!this.eventCanMoveAnchor(t))return;this.activeAnchorMotions+=1;this.scheduleAnchorMotionUpdate()};this.anchorMotionEndHandler=t=>{if(!this.eventCanMoveAnchor(t))return;this.activeAnchorMotions=Math.max(0,this.activeAnchorMotions-1);this.scheduleAnchorMotionUpdate()};this.options=t}get ready(){return this.isReady}observe(){this.bindListeners()}unobserve(){this.unbindListeners();this.cancel();this.last=null;this.isReady=false}schedule(t){this.cancelRetry();this.isReady=false;const i=this.generation;const s=this.retryGeneration;const o=()=>i===this.generation&&s===this.retryGeneration;let n=this.options.retryBudget??C;const e=()=>{if(!o())return;this.retryRaf=null;const i=this.update();if(!o())return;if(i){this.isReady=true;this.options.onReady?.();if(o())t?.();return}if(n>0){n-=1;this.retryRaf=requestAnimationFrame(e)}};this.retryRaf=requestAnimationFrame(e)}update(){const t=this.options.getAnchor();if(!t?.isConnected)return false;const i=this.options.getPopup();if(!i?.isConnected)return false;this.observeResizeTargets();if(this.options.topLayer&&typeof i.showPopover==="function"&&!i.matches(":popover-open")){try{i.showPopover()}catch{return false}}const s=this.options.measure(t,i);if(!s)return false;const o=x(s);if(!this.last||this.last.x!==o.x||this.last.y!==o.y||this.last.resolvedSide!==o.resolvedSide||this.last.availableHeight!==o.availableHeight){this.last=o;this.options.apply(o)}return true}scheduleLiveUpdate(){const t=this.generation;const i=this.options.liveUpdate??"sync";if(i==="sync"){this.update();return}if(this.liveRaf!==null)return;if(i==="frame"){this.liveRaf=requestAnimationFrame((()=>{if(t!==this.generation)return;this.liveRaf=null;this.update()}));return}this.liveRaf=requestAnimationFrame((()=>{if(t!==this.generation)return;this.update();if(t!==this.generation)return;this.liveRaf=requestAnimationFrame((()=>{if(t!==this.generation)return;this.liveRaf=null;this.update()}))}))}cancel(){this.generation+=1;this.cancelRetry();if(this.liveRaf!==null){cancelAnimationFrame(this.liveRaf);this.liveRaf=null}if(this.anchorMotionRaf!==null){cancelAnimationFrame(this.anchorMotionRaf);this.anchorMotionRaf=null}}cancelRetry(){this.retryGeneration+=1;if(this.retryRaf===null)return;cancelAnimationFrame(this.retryRaf);this.retryRaf=null}bindListeners(){this.unbindListeners();this.scrollResizeHandler=()=>this.scheduleLiveUpdate();window.addEventListener("scroll",this.scrollResizeHandler,true);window.addEventListener("resize",this.scrollResizeHandler);if(this.options.observeResize&&typeof ResizeObserver!=="undefined"){const t=new ResizeObserver((()=>{if(this.resizeObserver===t)this.scheduleLiveUpdate()}));this.resizeObserver=t;this.observeResizeTargets()}if(this.options.observeAnchorMotion){this.ownerDocument=this.options.getAnchor()?.ownerDocument??this.options.getOwnerDocument?.()??null;this.ownerDocument?.addEventListener("transitionrun",this.anchorMotionStartHandler,true);this.ownerDocument?.addEventListener("transitionend",this.anchorMotionEndHandler,true);this.ownerDocument?.addEventListener("transitioncancel",this.anchorMotionEndHandler,true);this.ownerDocument?.addEventListener("animationstart",this.anchorMotionStartHandler,true);this.ownerDocument?.addEventListener("animationend",this.anchorMotionEndHandler,true);this.ownerDocument?.addEventListener("animationcancel",this.anchorMotionEndHandler,true)}}unbindListeners(){if(this.scrollResizeHandler){window.removeEventListener("scroll",this.scrollResizeHandler,true);window.removeEventListener("resize",this.scrollResizeHandler);this.scrollResizeHandler=null}this.resizeObserver?.disconnect();this.resizeObserver=null;this.ownerDocument?.removeEventListener("transitionrun",this.anchorMotionStartHandler,true);this.ownerDocument?.removeEventListener("transitionend",this.anchorMotionEndHandler,true);this.ownerDocument?.removeEventListener("transitioncancel",this.anchorMotionEndHandler,true);this.ownerDocument?.removeEventListener("animationstart",this.anchorMotionStartHandler,true);this.ownerDocument?.removeEventListener("animationend",this.anchorMotionEndHandler,true);this.ownerDocument?.removeEventListener("animationcancel",this.anchorMotionEndHandler,true);this.ownerDocument=null;this.activeAnchorMotions=0}eventCanMoveAnchor(t){const i=this.options.getAnchor();const s=t.target;if(!i||!(s instanceof Element))return false;return s===i||s.contains(i)}scheduleAnchorMotionUpdate(){if(this.anchorMotionRaf!==null)return;const t=this.generation;const i=()=>{if(t!==this.generation)return;this.anchorMotionRaf=null;this.update();if(t!==this.generation)return;if(this.activeAnchorMotions<=0||!this.options.getAnchor()?.isConnected){this.activeAnchorMotions=0;return}this.anchorMotionRaf=requestAnimationFrame(i)};this.anchorMotionRaf=requestAnimationFrame(i)}observeResizeTargets(){if(!this.resizeObserver)return;const t=this.options.getPopup();if(t)this.resizeObserver.observe(t);const i=this.options.getAnchor();if(i)this.resizeObserver.observe(i)}}const P="data-ds-overlay-boundary";function k(t){if(t.assignedSlot)return t.assignedSlot;if(t.parentElement)return t.parentElement;const i=t.getRootNode();return i instanceof ShadowRoot?i.host:null}function z(t){let i=t;while(i){if(i instanceof HTMLElement&&i.hasAttribute(P)){return i}i=k(i)}return null}function A(t,i){if(i==="viewport")return undefined;return(i??z(t))?.getBoundingClientRect()}const F=()=>`.sc-ds-tooltip-h,.sc-ds-tooltip:where(.ds-table),.sc-ds-tooltip:where(.tooltip-popup),.sc-ds-tooltip:where(.ds-radius){--ds-radius-control:var(--dimension-radius-025);--ds-radius-card:var(--dimension-radius-050);--ds-radius-modal:var(--dimension-radius-050);--ds-radius-menu:var(--dimension-radius-075);--ds-radius-tooltip-control:var(--dimension-radius-025);--ds-radius-tooltip-menu:var(--dimension-radius-075);--ds-radius-table:var(--dimension-radius-050)}.ds-control--lg.sc-ds-tooltip,.ds-control--lg.sc-ds-tooltip-h,.ds-control--md.sc-ds-tooltip-h,.ds-control--md.sc-ds-tooltip,.ds-control--sm.sc-ds-tooltip-h,.ds-control--sm.sc-ds-tooltip,.ds-control--xs.sc-ds-tooltip-h,.ds-control--xs.sc-ds-tooltip{--ds-control-radius:var(--ds-radius-control)}.ds-control--lg.sc-ds-tooltip-h,.ds-control--lg.sc-ds-tooltip{--ds-control-height:var(--dimension-size-500);--ds-control-icon:var(--dimension-iconography-lg);--ds-control-padding-inline:var(--dimension-space-100);--ds-control-label-inset:var(--dimension-space-050);--ds-control-gap:var(--dimension-space-050)}.ds-control--md.sc-ds-tooltip-h,.ds-control--md.sc-ds-tooltip{--ds-control-height:var(--dimension-size-400);--ds-control-icon:var(--dimension-iconography-md);--ds-control-padding-inline:var(--dimension-space-075);--ds-control-label-inset:var(--dimension-space-025);--ds-control-gap:var(--dimension-space-050)}.ds-control--sm.sc-ds-tooltip-h,.ds-control--sm.sc-ds-tooltip{--ds-control-height:var(--dimension-size-300);--ds-control-icon:var(--dimension-iconography-sm);--ds-control-padding-inline:var(--dimension-space-050);--ds-control-label-inset:var(--dimension-space-025);--ds-control-gap:var(--dimension-space-025)}.ds-control--xs.sc-ds-tooltip-h,.ds-control--xs.sc-ds-tooltip{--ds-control-height:var(--dimension-size-200);--ds-control-icon:var(--dimension-iconography-xs);--ds-control-padding-inline:var(--dimension-space-025);--ds-control-label-inset:var(--dimension-space-025);--ds-control-gap:0}.ds-control--lg.sc-ds-tooltip,.ds-control--lg.sc-ds-tooltip-h,.ds-control--md.sc-ds-tooltip-h,.ds-control--md.sc-ds-tooltip,.ds-control--sm.sc-ds-tooltip-h,.ds-control--sm.sc-ds-tooltip,.ds-control--xs.sc-ds-tooltip-h,.ds-control--xs.sc-ds-tooltip{--ds-control-radius:var(--ds-radius-control)}.ds-control--lg.sc-ds-tooltip-h,.ds-control--lg.sc-ds-tooltip{--ds-control-height:var(--dimension-size-500);--ds-control-icon:var(--dimension-iconography-lg);--ds-control-padding-inline:var(--dimension-space-100);--ds-control-label-inset:var(--dimension-space-050);--ds-control-gap:var(--dimension-space-050)}.ds-control--md.sc-ds-tooltip-h,.ds-control--md.sc-ds-tooltip{--ds-control-height:var(--dimension-size-400);--ds-control-icon:var(--dimension-iconography-md);--ds-control-padding-inline:var(--dimension-space-075);--ds-control-label-inset:var(--dimension-space-025);--ds-control-gap:var(--dimension-space-050)}.ds-control--sm.sc-ds-tooltip-h,.ds-control--sm.sc-ds-tooltip{--ds-control-height:var(--dimension-size-300);--ds-control-icon:var(--dimension-iconography-sm);--ds-control-padding-inline:var(--dimension-space-050);--ds-control-label-inset:var(--dimension-space-025);--ds-control-gap:var(--dimension-space-025)}.ds-control--xs.sc-ds-tooltip-h,.ds-control--xs.sc-ds-tooltip{--ds-control-height:var(--dimension-size-200);--ds-control-icon:var(--dimension-iconography-xs);--ds-control-padding-inline:var(--dimension-space-025);--ds-control-label-inset:var(--dimension-space-025);--ds-control-gap:0}.key-hint-group.sc-ds-tooltip{display:inline-flex;align-items:center;gap:var(--dimension-stroke-width-012);width:max-content;flex-shrink:0}.key-hint.sc-ds-tooltip{box-sizing:border-box;min-width:var(--ds-control-icon, var(--dimension-iconography-md));width:var(--ds-control-icon, var(--dimension-iconography-md));height:var(--ds-control-icon, var(--dimension-iconography-md));padding-inline:0;flex-shrink:0;display:inline-flex;align-items:center;justify-content:center;background-color:var(--color-background-secondary);border:var(--dimension-stroke-width-015) solid var(--color-border-tertiary);border-bottom-width:var(--dimension-stroke-width-025);border-radius:var(--dimension-radius-025);color:var(--color-foreground-secondary)}.key-hint--wide.sc-ds-tooltip{width:calc(var(--ds-control-icon, var(--dimension-iconography-md)) * 1.5)}.key-hint__label.sc-ds-tooltip{display:inline-flex;width:max-content;min-width:max-content;font-family:var(--typography-font-family-ui);font-size:var(--typography-fontsize-xs);line-height:1;font-weight:var(--typography-weight-regular);letter-spacing:0;text-transform:uppercase;color:inherit}.ds-control--xs.sc-ds-tooltip .key-hint__label.sc-ds-tooltip{font-size:calc(var(--typography-fontsize-xs) * 0.78)}@media (forced-colors: active){.sc-ds-tooltip:root,.sc-ds-tooltip-h,.ds-forced-colors-scope.sc-ds-tooltip{--ds-forced-color-surface:Canvas;--ds-forced-color-content:CanvasText;--ds-forced-color-control-boundary:ButtonText;--ds-forced-color-selected:Highlight;--ds-forced-color-on-selected:HighlightText;--ds-forced-color-disabled:GrayText}}.tooltip-popup.sc-ds-tooltip{box-sizing:border-box;background-color:var(--color-background-primary);border-radius:var(--ds-radius-tooltip-control, var(--dimension-radius-025));box-shadow:var(--effect-elevation-elevated-floating);white-space:nowrap;pointer-events:none;animation:tooltipFadeIn var(--effect-motion-short-2) forwards;will-change:transform;backface-visibility:hidden}.tooltip-popup--instant.sc-ds-tooltip{animation:none;opacity:1}.tooltip-popup--closing.sc-ds-tooltip{animation:tooltipFadeOut var(--effect-motion-short-3) forwards}.tooltip-inner.sc-ds-tooltip{box-sizing:border-box;height:var(--ds-control-height, var(--dimension-size-400));display:flex;align-items:center;gap:var(--ds-control-gap, var(--dimension-space-050));padding:0 var(--ds-control-padding-inline, var(--dimension-space-075))}.tooltip-inner.sc-ds-tooltip>ds-text.sc-ds-tooltip{flex-shrink:0;min-width:max-content;max-width:none;padding:0 var(--ds-control-label-inset, var(--dimension-space-025));color:var(--color-foreground-primary)}.tooltip-popup--wrap.sc-ds-tooltip{white-space:normal;max-inline-size:var(--dimension-panel-width-xs)}.tooltip-popup--wrap.sc-ds-tooltip .tooltip-inner.sc-ds-tooltip{height:auto;min-height:var(--ds-control-height, var(--dimension-size-400));padding-block:var(--dimension-space-050);align-items:flex-start}.tooltip-popup--wrap.sc-ds-tooltip .tooltip-inner.sc-ds-tooltip>ds-text.sc-ds-tooltip{flex:1 1 auto;min-width:0;max-width:100%;white-space:pre-line}@keyframes tooltipFadeIn{from{opacity:0}to{opacity:1}}@keyframes tooltipFadeOut{from{opacity:1}to{opacity:0}}@media (prefers-reduced-motion: reduce){.tooltip-popup.sc-ds-tooltip,.tooltip-popup--instant.sc-ds-tooltip{animation:none;opacity:1}.tooltip-popup--closing.sc-ds-tooltip{animation:none;opacity:0}}@media (forced-colors: active){.tooltip-popup.sc-ds-tooltip{box-shadow:none;outline:var(--dimension-stroke-width-012) solid var(--ds-forced-color-content);outline-offset:calc(-1 * var(--dimension-stroke-width-012))}}`;const M={md:h.size400,sm:h.size300,xs:h.size200};let L=0;let T=0;let R=null;function q(t){const i=document.createElement("ds-text");i.as="span";i.variant=t.variant;i.emphasis=t.emphasis??false;i.color=t.color??"inherit";if(t.wrap)i.wrap=t.wrap;i.textContent=t.text;return i}function D(t,i=false){t.style.flexShrink=i?"1":"0";t.style.minWidth=i?"0":"max-content";t.style.maxWidth=i?"100%":"none";t.style.whiteSpace=i?"pre-line":"";t.style.padding="0 var(--ds-control-label-inset, var(--dimension-space-025))";t.style.color="var(--color-foreground-primary)"}const E=t(class t extends i{constructor(t){super();if(t!==false){this.__registerHost()}this.size="md";this.side="top";this.align="center";this.sideOffset=r.space050;this.alignOffset=0;this.delay=h.animationDelayMedium3;this.shortcutKeyPosition="end";this.describedBy=true;this.wrapLabel=false;this.tooltipId=`ds-tooltip-${++T}`;this.delayTimer=null;this.closeTimer=null;this.anchor=null;this.popupEl=null;this.anchorObserver=null;this.didLoad=false;this.position=new O({getAnchor:()=>this.anchor,getPopup:()=>this.popupEl,getOwnerDocument:()=>this.el.ownerDocument,measure:(t,i)=>({anchorRect:t.getBoundingClientRect(),popupWidth:i.offsetWidth||this.tooltipFallbackWidthPx,popupHeight:i.offsetHeight||this.tooltipFallbackHeightPx,side:this.side,align:this.align,sideOffsetPx:this.sideOffsetPx,alignOffsetPx:this.alignOffsetPx,viewportPadPx:this.viewportPadPx,viewportWidth:window.innerWidth,viewportHeight:window.innerHeight,collisionRect:A(t,this.boundary)}),apply:({x:t,y:i,resolvedSide:s})=>{if(!this.popupEl)return;this.popupEl.dataset.side=s;this.popupEl.style.transform=`translate(${Math.round(t)}px, ${Math.round(i)}px)`},liveUpdate:"frame",observeResize:true});this.skipEnterAnimation=false;this.isOpen=false;this.programmaticAnchor=false;this.lastInteractionWasKeyboard=false;this.pointerEnterHandler=t=>{if(t.pointerType==="touch")return;this.show()};this.pointerLeaveHandler=t=>{if(t.pointerType==="touch")return;this.hide()};this.pointerDownHandler=t=>{this.lastInteractionWasKeyboard=false;if(t.pointerType==="touch"&&(this.isOpen||this.popupEl))this.hideInstant()};this.keyDownHandler=()=>{this.lastInteractionWasKeyboard=true};this.focusHandler=()=>{if(this.lastInteractionWasKeyboard||this.anchor?.matches(":focus-visible"))this.show()};this.blurHandler=t=>{const i=t.relatedTarget;if(i&&this.anchor?.contains(i))return;this.hide()};this.escapeHandler=t=>{if(t.key!=="Escape"||!this.isOpen)return;t.preventDefault();this.hide()};this.handleSlotChange=()=>{if(this.programmaticAnchor)return;const t=this.el.querySelector("slot");const i=t?.assignedElements?.()[0]??this.el.firstElementChild;if(i===this.anchor||i?.tagName==="SLOT")return;if(this.isOpen||this.popupEl)this.hideInstant();this.unbindAnchor();this.bindAnchor()}}connectedCallback(){if(!this.didLoad)return;this.connectAnchor()}componentDidLoad(){this.didLoad=true;this.connectAnchor()}connectAnchor(){this.bindAnchor();if(this.anchorObserver)return;this.anchorObserver=new MutationObserver((()=>this.handleSlotChange()));this.anchorObserver.observe(this.el,{childList:true})}disconnectedCallback(){if(R===this)R=null;this.anchorObserver?.disconnect();this.anchorObserver=null;this.unbindAnchor();this.clearTimers();this.destroyPopup()}onContentOrPositionChange(){if(!this.label?.trim()){if(this.isOpen||this.popupEl)this.hideInstant();return}if(!this.popupEl||!this.isOpen)return;this.renderPopupContent();this.schedulePosition()}get viewportPadPx(){return d(h.space050,h.space050)}get sideOffsetPx(){return d(this.sideOffset,h.space050)}get alignOffsetPx(){return d(this.alignOffset,0)}get hoverDelayMs(){return a(this.delay,h.animationDelayMedium3)}get instantReopenMs(){return a(h.animationDurationMedium1,h.animationDurationMedium1)}get fadeOutMs(){return l(h.motionShort3,h.animationDurationShort3)}get tooltipFallbackWidthPx(){return d(h.tooltipFallbackWidth,h.tooltipFallbackWidth)}get tooltipFallbackHeightPx(){const t=M[this.size];return d(t,t)}async presentFrom(t,i){if(i!=null)this.label=i;if(!this.label?.trim()){this.hide();return}const s=this.anchor===t;if(!s){this.unbindAnchor();this.anchor=t;this.programmaticAnchor=true;if(this.popupEl&&this.describedBy)this.linkDescribedBy()}if(this.popupEl){this.renderPopupContent();this.schedulePosition();return}if(this.delayTimer&&s)return;this.show()}async dismiss(){this.hide()}bindAnchor(){if(this.programmaticAnchor)return;const t=this.el.querySelector("slot");const i=t?.assignedElements?.()??[];const s=i[0]??this.el.firstElementChild;if(!s||s.tagName==="SLOT"||s===this.anchor)return;this.anchor=s;s.addEventListener("pointerenter",this.pointerEnterHandler);s.addEventListener("pointerleave",this.pointerLeaveHandler);s.addEventListener("pointerdown",this.pointerDownHandler);s.addEventListener("keydown",this.keyDownHandler);s.addEventListener("focusin",this.focusHandler);s.addEventListener("focusout",this.blurHandler)}unbindAnchor(){if(!this.anchor)return;this.unlinkDescribedBy();if(!this.programmaticAnchor){this.anchor.removeEventListener("pointerenter",this.pointerEnterHandler);this.anchor.removeEventListener("pointerleave",this.pointerLeaveHandler);this.anchor.removeEventListener("pointerdown",this.pointerDownHandler);this.anchor.removeEventListener("keydown",this.keyDownHandler);this.anchor.removeEventListener("focusin",this.focusHandler);this.anchor.removeEventListener("focusout",this.blurHandler)}this.anchor=null;this.programmaticAnchor=false}linkDescribedBy(){if(!this.describedBy||!this.anchor||!this.popupEl)return;const t=new Set((this.anchor.getAttribute("aria-describedby")??"").split(/\s+/).filter(Boolean));t.add(this.tooltipId);this.anchor.setAttribute("aria-describedby",Array.from(t).join(" "))}unlinkDescribedBy(){if(!this.anchor)return;const t=(this.anchor.getAttribute("aria-describedby")??"").split(/\s+/).filter((t=>t&&t!==this.tooltipId));if(t.length)this.anchor.setAttribute("aria-describedby",t.join(" "));else this.anchor.removeAttribute("aria-describedby")}clearTimers(){if(this.delayTimer){clearTimeout(this.delayTimer);this.delayTimer=null}if(this.closeTimer){clearTimeout(this.closeTimer);this.closeTimer=null}}setupOpenListeners(){this.position.observe();document.addEventListener("keydown",this.escapeHandler)}teardownOpenListeners(){this.position.unobserve();document.removeEventListener("keydown",this.escapeHandler)}destroyPopup(){this.teardownOpenListeners();this.unlinkDescribedBy();if(!this.popupEl)return;this.popupEl.remove();this.popupEl=null}schedulePosition(){if(!this.popupEl)return;const t=()=>{const t=this.popupEl?.querySelector(":scope > .tooltip-inner > ds-text");if(t instanceof i)D(t,this.wrapLabel)};requestAnimationFrame((()=>{t();this.position.update();requestAnimationFrame((()=>{t();this.position.update()}))}));this.position.observeResizeTargets()}hideInstant(){this.clearTimers();L=Date.now();if(R===this)R=null;this.destroyPopup();this.isOpen=false;this.skipEnterAnimation=false}show(){if(!this.label?.trim())return;this.clearTimers();let t=Date.now()-L<this.instantReopenMs;if(R&&R!==this){R.hideInstant();t=true}R=this;this.skipEnterAnimation=t;if(t){this.mountPopup();return}this.delayTimer=setTimeout((()=>{this.delayTimer=null;if(!this.label?.trim())return;this.mountPopup()}),this.hoverDelayMs)}hide(){this.clearTimers();if(!this.popupEl&&!this.isOpen)return;L=Date.now();if(!this.popupEl){this.isOpen=false;return}this.popupEl.classList.remove("tooltip-popup--instant");this.popupEl.classList.add("tooltip-popup--closing");if(this.fadeOutMs===0){if(R===this)R=null;this.destroyPopup();this.isOpen=false;this.skipEnterAnimation=false;return}this.closeTimer=setTimeout((()=>{this.closeTimer=null;if(R===this)R=null;this.destroyPopup();this.isOpen=false;this.skipEnterAnimation=false}),this.fadeOutMs)}mountPopup(){if(!this.popupEl){const t=document.createElement("div");t.id=this.tooltipId;t.setAttribute("role","tooltip");t.className="tooltip-popup ds-forced-colors-scope sc-ds-tooltip";Object.assign(t.style,{position:"fixed",left:"0",top:"0",zIndex:"var(--dimension-z-index-tooltip)",pointerEvents:"none"});document.body.appendChild(t);this.popupEl=t}this.setupOpenListeners();this.linkDescribedBy();this.popupEl.classList.toggle("tooltip-popup--instant",this.skipEnterAnimation);this.popupEl.classList.toggle("tooltip-popup--wrap",this.wrapLabel);this.popupEl.classList.remove("tooltip-popup--closing");this.renderPopupContent();this.schedulePosition();this.isOpen=true}renderPopupContent(){if(!this.popupEl)return;this.popupEl.classList.toggle("tooltip-popup--wrap",this.wrapLabel);const t=c[this.size];const i=this.size==="md"?"ds-control--md":this.size==="sm"?"ds-control--sm":"ds-control--xs";const s="sc-ds-tooltip";const o=document.createElement("div");o.className=`tooltip-inner ${i} ${s}`;const n=t=>{if(!this.shortcutKey||this.shortcutKeyPosition!==t)return;const i=document.createElement("span");i.className=`key-hint-group ${s}`;i.setAttribute("aria-hidden","true");for(const t of m(this.shortcutKey)){const o=document.createElement("span");const n=Array.from(t).length>1?" key-hint--wide":"";o.className=`key-hint${n} ${s}`;const e=document.createElement("span");e.className=`key-hint__label ${s}`;e.textContent=t;o.appendChild(e);i.appendChild(o)}o.appendChild(i)};n("start");const e=q({variant:t,wrap:this.wrapLabel?"wrap":"nowrap",text:this.label});D(e,this.wrapLabel);o.appendChild(e);n("end");this.popupEl.replaceChildren(o)}render(){return s(o,{key:"a91ea35cad4d388682b562745b5079553b1cfd4f",style:{display:"contents"}},s("slot",{key:"2ecadc1cd67d800114e42cc7f66c2d2566a475d2",onSlotchange:this.handleSlotChange}))}get el(){return this}static get watchers(){return{label:[{onContentOrPositionChange:0}],size:[{onContentOrPositionChange:0}],side:[{onContentOrPositionChange:0}],align:[{onContentOrPositionChange:0}],sideOffset:[{onContentOrPositionChange:0}],alignOffset:[{onContentOrPositionChange:0}],boundary:[{onContentOrPositionChange:0}],shortcutKey:[{onContentOrPositionChange:0}],shortcutKeyPosition:[{onContentOrPositionChange:0}],wrapLabel:[{onContentOrPositionChange:0}]}}static get style(){return F()}},[262,"ds-tooltip",{label:[1],size:[1],side:[1],align:[1],sideOffset:[8,"side-offset"],alignOffset:[8,"align-offset"],boundary:[1],delay:[8],shortcutKey:[1,"shortcut-key"],shortcutKeyPosition:[1,"shortcut-key-position"],describedBy:[4,"described-by"],wrapLabel:[4,"wrap-label"],presentFrom:[64],dismiss:[64]},undefined,{label:[{onContentOrPositionChange:0}],size:[{onContentOrPositionChange:0}],side:[{onContentOrPositionChange:0}],align:[{onContentOrPositionChange:0}],sideOffset:[{onContentOrPositionChange:0}],alignOffset:[{onContentOrPositionChange:0}],boundary:[{onContentOrPositionChange:0}],shortcutKey:[{onContentOrPositionChange:0}],shortcutKeyPosition:[{onContentOrPositionChange:0}],wrapLabel:[{onContentOrPositionChange:0}]}]);function H(){if(typeof customElements==="undefined"){return}const t=["ds-tooltip","ds-text"];t.forEach((t=>{switch(t){case"ds-tooltip":if(!customElements.get(n(t))){customElements.define(n(t),E)}break;case"ds-text":if(!customElements.get(n(t))){e()}break}}))}H();export{O as A,E as T,P as a,x as c,H as d,A as r};
|
|
2
|
-
//# sourceMappingURL=p-BMI0F08u.js.map
|