@ds-mo/ui 16.0.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.
Files changed (121) hide show
  1. package/dist/.package-ready.json +1 -1
  2. package/dist/agent-patterns.json +1 -1
  3. package/dist/agent.json +5 -2
  4. package/dist/components/ds-agent-questionnaire.js +1 -1
  5. package/dist/components/ds-agent-response.js +1 -1
  6. package/dist/components/ds-banner.js +1 -1
  7. package/dist/components/ds-bar-nav.js +1 -1
  8. package/dist/components/ds-bar-page-title.js +1 -1
  9. package/dist/components/ds-bar-title.js +1 -1
  10. package/dist/components/ds-bar-workflow.js +1 -1
  11. package/dist/components/ds-button-unfilled.js +1 -1
  12. package/dist/components/ds-calendar.js +1 -1
  13. package/dist/components/ds-card-chart.js +1 -1
  14. package/dist/components/ds-card-overview.js +1 -1
  15. package/dist/components/ds-card-setting.js +1 -1
  16. package/dist/components/ds-code-block.js +1 -1
  17. package/dist/components/ds-data-customize.js +1 -1
  18. package/dist/components/ds-data-filter.js +1 -1
  19. package/dist/components/ds-data-group.js +1 -1
  20. package/dist/components/ds-data-preferences.js +1 -1
  21. package/dist/components/ds-data-saved-views.js +1 -1
  22. package/dist/components/ds-data-search.js +1 -1
  23. package/dist/components/ds-data-sort.js +1 -1
  24. package/dist/components/ds-filter-menu.js +1 -1
  25. package/dist/components/ds-input-date.js +1 -1
  26. package/dist/components/ds-input-time.js +1 -1
  27. package/dist/components/ds-input.js +1 -1
  28. package/dist/components/ds-markdown.js +1 -1
  29. package/dist/components/ds-menu.js +1 -1
  30. package/dist/components/ds-message-actions.js +1 -1
  31. package/dist/components/ds-message-composer.js +1 -1
  32. package/dist/components/ds-message-scroller.js +1 -1
  33. package/dist/components/ds-mobile-header.js +1 -1
  34. package/dist/components/ds-mobile-section-switcher.js +1 -1
  35. package/dist/components/ds-mobile-sheet-nav.js +1 -1
  36. package/dist/components/ds-modal.js +1 -1
  37. package/dist/components/ds-pagination.js +1 -1
  38. package/dist/components/ds-panel-nav.js +1 -1
  39. package/dist/components/ds-panel-tool-header.js +1 -1
  40. package/dist/components/ds-panel-tool-search.js +1 -1
  41. package/dist/components/ds-panel-tools.js +1 -1
  42. package/dist/components/ds-select.js +1 -1
  43. package/dist/components/ds-shell-app.js +1 -1
  44. package/dist/components/ds-shell-tools.js +1 -1
  45. package/dist/components/ds-table.js +1 -1
  46. package/dist/components/ds-table.js.map +1 -1
  47. package/dist/components/ds-time-picker.js +1 -1
  48. package/dist/components/ds-toast.js +1 -1
  49. package/dist/components/ds-toast.js.map +1 -1
  50. package/dist/components/ds-tooltip.js +1 -1
  51. package/dist/components/ds-typing-indicator.js +1 -1
  52. package/dist/components/{p-BufAjyCA.js → p-9zDZcSc0.js} +2 -2
  53. package/dist/components/{p-SuM1Dske.js → p-B8jrUwL-.js} +2 -2
  54. package/dist/components/{p-DbBRCHst.js → p-BJB6kfA2.js} +2 -2
  55. package/dist/components/{p-a_-GSwE_.js → p-BK_SriZN.js} +2 -2
  56. package/dist/components/{p-DwiHy7ws.js → p-BKd0e8k8.js} +2 -2
  57. package/dist/components/{p-FsosWHV6.js → p-BNySDuzx.js} +2 -2
  58. package/dist/components/{p-DGznD-OD.js → p-BdJqRDKY.js} +2 -2
  59. package/dist/components/{p-CtBlyEwu.js → p-BgMeLCj3.js} +2 -2
  60. package/dist/components/{p-B6kIiHGc.js → p-BknNUjWh.js} +2 -2
  61. package/dist/components/{p-D1D_nwPJ.js → p-Bn-tsogb.js} +2 -2
  62. package/dist/components/{p-C9R-Yn0N.js → p-C3nUi5Lo.js} +2 -2
  63. package/dist/components/{p-9u2WDF0J.js → p-CbJx9swS.js} +2 -2
  64. package/dist/components/{p-ibSI50wY.js → p-CcWT4SzP.js} +2 -2
  65. package/dist/components/{p-BL98zGOI.js → p-Ckar-ZZa.js} +2 -2
  66. package/dist/components/{p-D4wFhnby.js → p-CvK-Gy-b.js} +2 -2
  67. package/dist/components/{p-8XJLNIKj.js → p-D9MqUHig.js} +2 -2
  68. package/dist/components/{p-BNimvRZy.js → p-DI5GEmid.js} +2 -2
  69. package/dist/components/p-DTlNtCX1.js +2 -0
  70. package/dist/components/p-DTlNtCX1.js.map +1 -0
  71. package/dist/components/p-D_kOVT6i.js +2 -0
  72. package/dist/components/{p-S6vTfjOk.js.map → p-D_kOVT6i.js.map} +1 -1
  73. package/dist/components/{p-DC_yjqdf.js → p-Ddkyu_wE.js} +2 -2
  74. package/dist/components/{p-CeaXdjwl.js → p-ZcZ0N7Ok.js} +2 -2
  75. package/dist/components/{p-BO0Tb3LT.js → p-ZumxIz-2.js} +2 -2
  76. package/dist/components/{p-BLPr2sCi.js → p-qnp-yeXl.js} +2 -2
  77. package/dist/components/{p-02bODFpT.js → p-txmcXZdy.js} +2 -2
  78. package/dist/components/{p-BiB2qjNS.js → p-xouEdChm.js} +2 -2
  79. package/dist/components/{p-Dp90dvw8.js → p-zdiRX3Sf.js} +2 -2
  80. package/dist/docs/components.json +13 -3
  81. package/dist/lib/toast/index.js +61 -20
  82. package/dist/lib/toast/index.js.map +2 -2
  83. package/dist/lib/toast/toast-types.d.ts +1 -0
  84. package/dist/mcp-data/registry/registry.json +4 -1
  85. package/dist/mcp-data/registry/table.json +22 -6
  86. package/dist/react/react-runtime.js +44 -1
  87. package/dist/types/components/Table/Table.d.ts +7 -2
  88. package/dist/types/components/Table/table-group-load-controller.d.ts +1 -1
  89. package/dist/types/components/Table/table-load-controller.d.ts +1 -2
  90. package/dist/types/components/Table/table-load-observer.d.ts +13 -0
  91. package/dist/types/toast/toast-types.d.ts +1 -0
  92. package/dist/types/utils/anchored-position-controller.d.ts +3 -2
  93. package/dist/vue/vue-runtime.js +13 -1
  94. package/package.json +15 -12
  95. package/dist/components/p-BMI0F08u.js +0 -2
  96. package/dist/components/p-BMI0F08u.js.map +0 -1
  97. package/dist/components/p-S6vTfjOk.js +0 -2
  98. /package/dist/components/{p-BufAjyCA.js.map → p-9zDZcSc0.js.map} +0 -0
  99. /package/dist/components/{p-SuM1Dske.js.map → p-B8jrUwL-.js.map} +0 -0
  100. /package/dist/components/{p-DbBRCHst.js.map → p-BJB6kfA2.js.map} +0 -0
  101. /package/dist/components/{p-a_-GSwE_.js.map → p-BK_SriZN.js.map} +0 -0
  102. /package/dist/components/{p-DwiHy7ws.js.map → p-BKd0e8k8.js.map} +0 -0
  103. /package/dist/components/{p-FsosWHV6.js.map → p-BNySDuzx.js.map} +0 -0
  104. /package/dist/components/{p-DGznD-OD.js.map → p-BdJqRDKY.js.map} +0 -0
  105. /package/dist/components/{p-CtBlyEwu.js.map → p-BgMeLCj3.js.map} +0 -0
  106. /package/dist/components/{p-B6kIiHGc.js.map → p-BknNUjWh.js.map} +0 -0
  107. /package/dist/components/{p-D1D_nwPJ.js.map → p-Bn-tsogb.js.map} +0 -0
  108. /package/dist/components/{p-C9R-Yn0N.js.map → p-C3nUi5Lo.js.map} +0 -0
  109. /package/dist/components/{p-9u2WDF0J.js.map → p-CbJx9swS.js.map} +0 -0
  110. /package/dist/components/{p-ibSI50wY.js.map → p-CcWT4SzP.js.map} +0 -0
  111. /package/dist/components/{p-BL98zGOI.js.map → p-Ckar-ZZa.js.map} +0 -0
  112. /package/dist/components/{p-D4wFhnby.js.map → p-CvK-Gy-b.js.map} +0 -0
  113. /package/dist/components/{p-8XJLNIKj.js.map → p-D9MqUHig.js.map} +0 -0
  114. /package/dist/components/{p-BNimvRZy.js.map → p-DI5GEmid.js.map} +0 -0
  115. /package/dist/components/{p-DC_yjqdf.js.map → p-Ddkyu_wE.js.map} +0 -0
  116. /package/dist/components/{p-CeaXdjwl.js.map → p-ZcZ0N7Ok.js.map} +0 -0
  117. /package/dist/components/{p-BO0Tb3LT.js.map → p-ZumxIz-2.js.map} +0 -0
  118. /package/dist/components/{p-BLPr2sCi.js.map → p-qnp-yeXl.js.map} +0 -0
  119. /package/dist/components/{p-02bODFpT.js.map → p-txmcXZdy.js.map} +0 -0
  120. /package/dist/components/{p-BiB2qjNS.js.map → p-xouEdChm.js.map} +0 -0
  121. /package/dist/components/{p-Dp90dvw8.js.map → p-zdiRX3Sf.js.map} +0 -0
@@ -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
- const id = options.id || `ds-toast-${++this.nextId}`;
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 id = this.add({
84
- ...loading,
85
- type: loading.type ?? "loading",
86
- timeout: 0
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
- const success = resolvePromiseValue(options.success, value);
91
- this.update(id, {
92
- ...success,
93
- type: success.type ?? "success",
94
- timeout: success.timeout
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
- const failure = resolvePromiseValue(options.error, error);
99
- this.update(id, {
100
- ...failure,
101
- type: failure.type ?? "error",
102
- timeout: failure.timeout
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
- const snapshot = this.getSnapshot();
140
- for (const listener of this.listeners) listener(snapshot);
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 const id = options.id || `ds-toast-${++this.nextId}`;\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 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\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 id = this.add({\n ...loading,\n type: loading.type ?? 'loading',\n timeout: 0,\n });\n\n try {\n const value = await promiseValue;\n const success = resolvePromiseValue(options.success, value);\n this.update(id, {\n ...success,\n type: success.type ?? 'success',\n timeout: success.timeout,\n });\n return value;\n } catch (error) {\n const failure = resolvePromiseValue(options.error, error);\n this.update(id, {\n ...failure,\n type: failure.type ?? 'error',\n timeout: failure.timeout,\n });\n throw error;\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.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 const snapshot = this.getSnapshot();\n for (const listener of this.listeners) listener(snapshot);\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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",
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>[];
@@ -15966,6 +15966,7 @@
15966
15966
  "Static and infinite tables may show an optional result summary footer when displayedCount and totalCount are finite. Virtual mode shows a total-only summary and ignores displayedCount. Pagination mode instead renders a named Pagination control with a page-size picker, vertical divider, and page position; range changes are announced independently with complete phrasing. Unmodified Left and Right Arrow request the adjacent page while focus is inside a paginated table or on a containing page scroller that owns it; editable fields, choice controls, sliders, open menus, and modified key combinations retain their own keyboard behavior. A table-owned footer slot can replace summary copy, while footer-leading and footer-trailing remain available in the same compact-bar anatomy. Nested dialog footers are ignored."
15967
15967
  ],
15968
15968
  "states": [
15969
+ "Initial-error recovery actions are application-owned controls displayed below the error message. The application owns retry behavior, loading, result updates and focus after recovery; controls are not shown for empty, populated, loading, or invalid-viewport states.",
15969
15970
  "Column super-groups describe adjacent visible fields. Hidden and reordered fields recompute the bands; unrelated fields, selection, elastic space, and pin boundaries split them. Compound sort controls remain in the leaf headers.",
15970
15971
  "Cell presentation moves the complete content stack for deliberate middle or bottom alignment; the default remains first-track alignment. Semantic highlight borders require an accessible explanation, and flags require labels. Presentation metadata never changes the cell value or the shared text, icon, tag and action track anatomy.",
15971
15972
  "Report merges name ordered row and column identities. Only a complete contiguous non-overlapping rectangle is accepted, and invalid definitions leave original values visible. Selection checkboxes are never merged. Merges cannot cross pin or elastic-spacer boundaries, and grouped or editable grids do not merge. Cross-row merges require non-windowed reports; column-only merges can use virtual rows. Applications recompute spans with their final data order and retain covered values.",
@@ -16488,7 +16489,9 @@
16488
16489
  "detail": "DataSortChangeDetail"
16489
16490
  }
16490
16491
  ],
16491
- "slots": [],
16492
+ "slots": [
16493
+ "error-actions"
16494
+ ],
16492
16495
  "exports": {
16493
16496
  "customElement": "ds-table",
16494
16497
  "react": "DsTable",