@pie-players/pie-players-shared 0.3.29 → 0.3.31

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 (197) hide show
  1. package/{src → dist}/components/PieItemPlayer.svelte +156 -88
  2. package/dist/i18n/translations/en/tools.json +1 -1
  3. package/{src → dist}/i18n/use-i18n-standalone.svelte.ts +1 -0
  4. package/{src → dist}/i18n/use-i18n.svelte.ts +1 -0
  5. package/dist/index.d.ts +2 -0
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +6 -0
  8. package/dist/index.js.map +1 -1
  9. package/dist/loader-config.d.ts +25 -0
  10. package/dist/loader-config.d.ts.map +1 -1
  11. package/dist/loader-config.js +5 -0
  12. package/dist/loader-config.js.map +1 -1
  13. package/dist/loaders/ElementLoader.d.ts +6 -34
  14. package/dist/loaders/ElementLoader.d.ts.map +1 -1
  15. package/dist/loaders/ElementLoader.js +21 -9
  16. package/dist/loaders/ElementLoader.js.map +1 -1
  17. package/dist/loaders/element-loader-types.d.ts +91 -0
  18. package/dist/loaders/element-loader-types.d.ts.map +1 -0
  19. package/dist/loaders/element-loader-types.js +26 -0
  20. package/dist/loaders/element-loader-types.js.map +1 -0
  21. package/dist/loaders/element-loader.d.ts +92 -0
  22. package/dist/loaders/element-loader.d.ts.map +1 -0
  23. package/dist/loaders/element-loader.js +391 -0
  24. package/dist/loaders/element-loader.js.map +1 -0
  25. package/dist/loaders/esm-adapter.d.ts +40 -0
  26. package/dist/loaders/esm-adapter.d.ts.map +1 -0
  27. package/dist/loaders/esm-adapter.js +274 -0
  28. package/dist/loaders/esm-adapter.js.map +1 -0
  29. package/dist/loaders/iife-adapter.d.ts +86 -0
  30. package/dist/loaders/iife-adapter.d.ts.map +1 -0
  31. package/dist/loaders/iife-adapter.js +365 -0
  32. package/dist/loaders/iife-adapter.js.map +1 -0
  33. package/dist/loaders/index.d.ts +30 -17
  34. package/dist/loaders/index.d.ts.map +1 -1
  35. package/dist/loaders/index.js +26 -14
  36. package/dist/loaders/index.js.map +1 -1
  37. package/dist/pie/config.d.ts.map +1 -1
  38. package/dist/pie/config.js +12 -5
  39. package/dist/pie/config.js.map +1 -1
  40. package/dist/pie/index.d.ts +6 -4
  41. package/dist/pie/index.d.ts.map +1 -1
  42. package/dist/pie/index.js +8 -2
  43. package/dist/pie/index.js.map +1 -1
  44. package/dist/pie/initialization.d.ts +26 -1
  45. package/dist/pie/initialization.d.ts.map +1 -1
  46. package/dist/pie/initialization.js +72 -15
  47. package/dist/pie/initialization.js.map +1 -1
  48. package/dist/pie/instrumentation-event-map.d.ts.map +1 -1
  49. package/dist/pie/instrumentation-event-map.js +27 -16
  50. package/dist/pie/instrumentation-event-map.js.map +1 -1
  51. package/dist/pie/overrides.d.ts +9 -0
  52. package/dist/pie/overrides.d.ts.map +1 -1
  53. package/dist/pie/overrides.js +36 -0
  54. package/dist/pie/overrides.js.map +1 -1
  55. package/dist/pie/resource-monitor.d.ts +17 -0
  56. package/dist/pie/resource-monitor.d.ts.map +1 -1
  57. package/dist/pie/resource-monitor.js +284 -81
  58. package/dist/pie/resource-monitor.js.map +1 -1
  59. package/dist/pie/stage-tracker.d.ts +51 -0
  60. package/dist/pie/stage-tracker.d.ts.map +1 -0
  61. package/dist/pie/stage-tracker.js +106 -0
  62. package/dist/pie/stage-tracker.js.map +1 -0
  63. package/dist/pie/stages.d.ts +75 -0
  64. package/dist/pie/stages.d.ts.map +1 -0
  65. package/dist/pie/stages.js +58 -0
  66. package/dist/pie/stages.js.map +1 -0
  67. package/dist/pie/updates.d.ts.map +1 -1
  68. package/dist/pie/updates.js +65 -2
  69. package/dist/pie/updates.js.map +1 -1
  70. package/dist/pie/use-resource-monitor.svelte.d.ts.map +1 -1
  71. package/dist/pie/use-resource-monitor.svelte.js +88 -75
  72. package/dist/pie/use-resource-monitor.svelte.js.map +1 -1
  73. package/dist/security/index.d.ts +5 -0
  74. package/dist/security/index.d.ts.map +1 -0
  75. package/dist/security/index.js +5 -0
  76. package/dist/security/index.js.map +1 -0
  77. package/dist/security/sanitize-item-markup.d.ts +46 -0
  78. package/dist/security/sanitize-item-markup.d.ts.map +1 -0
  79. package/dist/security/sanitize-item-markup.js +174 -0
  80. package/dist/security/sanitize-item-markup.js.map +1 -0
  81. package/dist/security/sanitize-svg-icon.d.ts +15 -0
  82. package/dist/security/sanitize-svg-icon.d.ts.map +1 -0
  83. package/dist/security/sanitize-svg-icon.js +89 -0
  84. package/dist/security/sanitize-svg-icon.js.map +1 -0
  85. package/dist/security/validate-style-url.d.ts +28 -0
  86. package/dist/security/validate-style-url.d.ts.map +1 -0
  87. package/dist/security/validate-style-url.js +58 -0
  88. package/dist/security/validate-style-url.js.map +1 -0
  89. package/dist/security/wrap-overwide-images.d.ts +31 -0
  90. package/dist/security/wrap-overwide-images.d.ts.map +1 -0
  91. package/dist/security/wrap-overwide-images.js +92 -0
  92. package/dist/security/wrap-overwide-images.js.map +1 -0
  93. package/dist/server/npm-registry.d.ts +8 -0
  94. package/dist/server/npm-registry.d.ts.map +1 -0
  95. package/dist/server/npm-registry.js +60 -0
  96. package/dist/server/npm-registry.js.map +1 -0
  97. package/dist/types/index.d.ts +10 -0
  98. package/dist/types/index.d.ts.map +1 -1
  99. package/dist/types/index.js.map +1 -1
  100. package/dist/ui/first-focusable.d.ts +21 -0
  101. package/dist/ui/first-focusable.d.ts.map +1 -0
  102. package/dist/ui/first-focusable.js +73 -0
  103. package/dist/ui/first-focusable.js.map +1 -0
  104. package/dist/ui/focus-trap.d.ts.map +1 -1
  105. package/dist/ui/focus-trap.js +2 -13
  106. package/dist/ui/focus-trap.js.map +1 -1
  107. package/dist/ui/use-promise.svelte.ts +109 -0
  108. package/package.json +49 -34
  109. package/dist/i18n/scripts/check-coverage.d.ts +0 -16
  110. package/dist/i18n/scripts/check-coverage.d.ts.map +0 -1
  111. package/dist/i18n/scripts/check-coverage.js +0 -262
  112. package/dist/i18n/scripts/check-coverage.js.map +0 -1
  113. package/dist/i18n/scripts/scan-hardcoded.d.ts +0 -16
  114. package/dist/i18n/scripts/scan-hardcoded.d.ts.map +0 -1
  115. package/dist/i18n/scripts/scan-hardcoded.js +0 -266
  116. package/dist/i18n/scripts/scan-hardcoded.js.map +0 -1
  117. package/dist/i18n/use-i18n-standalone.svelte.d.ts +0 -87
  118. package/dist/i18n/use-i18n-standalone.svelte.d.ts.map +0 -1
  119. package/dist/i18n/use-i18n-standalone.svelte.js +0 -151
  120. package/dist/i18n/use-i18n-standalone.svelte.js.map +0 -1
  121. package/dist/i18n/use-i18n.svelte.d.ts +0 -67
  122. package/dist/i18n/use-i18n.svelte.d.ts.map +0 -1
  123. package/dist/i18n/use-i18n.svelte.js +0 -144
  124. package/dist/i18n/use-i18n.svelte.js.map +0 -1
  125. package/dist/instrumentation/providers/DataDogInstrumentationProvider.d.ts +0 -170
  126. package/dist/instrumentation/providers/DataDogInstrumentationProvider.d.ts.map +0 -1
  127. package/dist/instrumentation/providers/DataDogInstrumentationProvider.js +0 -183
  128. package/dist/instrumentation/providers/DataDogInstrumentationProvider.js.map +0 -1
  129. package/dist/loaders/EsmElementLoader.d.ts +0 -69
  130. package/dist/loaders/EsmElementLoader.d.ts.map +0 -1
  131. package/dist/loaders/EsmElementLoader.js +0 -72
  132. package/dist/loaders/EsmElementLoader.js.map +0 -1
  133. package/dist/loaders/IifeElementLoader.d.ts +0 -61
  134. package/dist/loaders/IifeElementLoader.d.ts.map +0 -1
  135. package/dist/loaders/IifeElementLoader.js +0 -63
  136. package/dist/loaders/IifeElementLoader.js.map +0 -1
  137. package/dist/pie/esm-loader.d.ts +0 -104
  138. package/dist/pie/esm-loader.d.ts.map +0 -1
  139. package/dist/pie/esm-loader.js +0 -358
  140. package/dist/pie/esm-loader.js.map +0 -1
  141. package/dist/pie/iife-loader.d.ts +0 -81
  142. package/dist/pie/iife-loader.d.ts.map +0 -1
  143. package/dist/pie/iife-loader.js +0 -425
  144. package/dist/pie/iife-loader.js.map +0 -1
  145. package/dist/theming/css-variables.d.ts +0 -7
  146. package/dist/theming/css-variables.d.ts.map +0 -1
  147. package/dist/theming/css-variables.js +0 -43
  148. package/dist/theming/css-variables.js.map +0 -1
  149. package/dist/theming/index.d.ts +0 -4
  150. package/dist/theming/index.d.ts.map +0 -1
  151. package/dist/theming/index.js +0 -3
  152. package/dist/theming/index.js.map +0 -1
  153. package/dist/theming/presets.d.ts +0 -7
  154. package/dist/theming/presets.d.ts.map +0 -1
  155. package/dist/theming/presets.js +0 -146
  156. package/dist/theming/presets.js.map +0 -1
  157. package/dist/theming/types.d.ts +0 -5
  158. package/dist/theming/types.d.ts.map +0 -1
  159. package/dist/theming/types.js +0 -2
  160. package/dist/theming/types.js.map +0 -1
  161. package/dist/types/custom-elements.d.ts +0 -158
  162. package/dist/types/custom-elements.d.ts.map +0 -1
  163. package/dist/types/custom-elements.js +0 -8
  164. package/dist/types/custom-elements.js.map +0 -1
  165. package/dist/types/search.d.ts +0 -105
  166. package/dist/types/search.d.ts.map +0 -1
  167. package/dist/types/search.js +0 -12
  168. package/dist/types/search.js.map +0 -1
  169. package/dist/types/transform.d.ts +0 -48
  170. package/dist/types/transform.d.ts.map +0 -1
  171. package/dist/types/transform.js +0 -21
  172. package/dist/types/transform.js.map +0 -1
  173. package/src/i18n/README.md +0 -223
  174. package/src/i18n/index.ts +0 -26
  175. package/src/i18n/loader.ts +0 -156
  176. package/src/i18n/scripts/check-coverage.ts +0 -345
  177. package/src/i18n/scripts/scan-hardcoded.ts +0 -342
  178. package/src/i18n/simple-i18n.ts +0 -236
  179. package/src/i18n/translations/ar/common.json +0 -36
  180. package/src/i18n/translations/ar/toolkit.json +0 -48
  181. package/src/i18n/translations/ar/tools.json +0 -103
  182. package/src/i18n/translations/en/common.json +0 -36
  183. package/src/i18n/translations/en/toolkit.json +0 -48
  184. package/src/i18n/translations/en/tools.json +0 -103
  185. package/src/i18n/translations/es/common.json +0 -36
  186. package/src/i18n/translations/es/toolkit.json +0 -48
  187. package/src/i18n/translations/es/tools.json +0 -103
  188. package/src/i18n/translations/zh/common.json +0 -36
  189. package/src/i18n/translations/zh/toolkit.json +0 -48
  190. package/src/i18n/translations/zh/tools.json +0 -103
  191. package/src/i18n/types.ts +0 -66
  192. /package/{src → dist}/components/PiePreviewLayout.svelte +0 -0
  193. /package/{src → dist}/components/PiePreviewToggle.svelte +0 -0
  194. /package/{src → dist}/components/PieSpinner.svelte +0 -0
  195. /package/{src → dist}/components/ToolSettingsButton.svelte +0 -0
  196. /package/{src → dist}/components/ToolSettingsPanel.svelte +0 -0
  197. /package/{src → dist}/components/index.ts +0 -0
@@ -8,8 +8,14 @@
8
8
  -->
9
9
  <script lang="ts">
10
10
  import { onDestroy, tick, untrack } from "svelte";
11
+ import { isInstrumentationProvider } from "../instrumentation/provider-guards.js";
11
12
  import type { LoaderConfig } from "../loader-config.js";
12
13
  import { DEFAULT_LOADER_CONFIG } from "../loader-config.js";
14
+ import {
15
+ buildAuthoringAllowList,
16
+ createDefaultItemMarkupSanitizer,
17
+ type ItemMarkupSanitizer,
18
+ } from "../security/index.js";
13
19
  import {
14
20
  AssetEventManager,
15
21
  createDefaultImageDeleteHandler,
@@ -24,6 +30,7 @@
24
30
  } from "../pie/correct-response-env.js";
25
31
  import { initializePiesFromLoadedBundle } from "../pie/initialization.js";
26
32
  import { createPieLogger, isGlobalDebugEnabled } from "../pie/logger.js";
33
+ import { resolveInstrumentationProvider } from "../pie/instrumentation-provider-resolution.js";
27
34
  import { findPieController } from "../pie/scoring.js";
28
35
  import type { AuthoringEnv } from "../pie/types.js";
29
36
  import { BundleType } from "../pie/types.js";
@@ -37,16 +44,6 @@
37
44
  SoundHandler,
38
45
  } from "../types/index.js";
39
46
 
40
- type RetrySuccessDetail = {
41
- url?: string;
42
- resourceType?: string;
43
- duration?: number;
44
- size?: number;
45
- retryCount?: number;
46
- maxRetries?: number;
47
- error?: string;
48
- };
49
-
50
47
  // Create logger (respects global debug flag - pass function for dynamic checking)
51
48
  const logger = createPieLogger("pie-item-player", () =>
52
49
  isGlobalDebugEnabled()
@@ -68,6 +65,9 @@
68
65
  mode = "view" as "view" | "author",
69
66
  configuration = {} as Record<string, any>,
70
67
  authoringBackend = "demo" as "demo" | "required",
68
+ // Security: sanitize markup before {@html} injection unless the host opts out.
69
+ trustMarkup = false,
70
+ sanitizeMarkup,
71
71
  // Asset handler callbacks
72
72
  onInsertImage,
73
73
  onDeleteImage,
@@ -93,6 +93,9 @@
93
93
  mode?: "view" | "author";
94
94
  configuration?: Record<string, any>;
95
95
  authoringBackend?: "demo" | "required";
96
+ // Markup-trust controls
97
+ trustMarkup?: boolean;
98
+ sanitizeMarkup?: ItemMarkupSanitizer;
96
99
  // Asset handlers
97
100
  onInsertImage?: (handler: ImageHandler) => void;
98
101
  onDeleteImage?: (src: string, done: (err?: Error) => void) => void;
@@ -112,6 +115,7 @@
112
115
  let assetEventManager: AssetEventManager | null = $state(null);
113
116
  let authoringBlockedError: string | null = $state(null);
114
117
  let lastReportedAuthoringError: string | null = $state(null);
118
+ let runtimePlayerError: string | null = $state(null);
115
119
 
116
120
  // Transform markup for authoring mode (append -config suffix)
117
121
  function transformMarkupForAuthoring(
@@ -130,29 +134,103 @@
130
134
  return result;
131
135
  }
132
136
 
137
+ // Custom-element allow-list derived from the item/passage `elements` maps.
138
+ // Includes both the raw tag names and their authoring-mode `-config`
139
+ // rewrites so `transformMarkupForAuthoring` output still passes the
140
+ // sanitizer.
141
+ const itemAllowList = $derived.by<string[]>(() => {
142
+ const elements = itemConfig?.elements ?? {};
143
+ return buildAuthoringAllowList(Object.keys(elements));
144
+ });
145
+
146
+ const passageAllowList = $derived.by<string[]>(() => {
147
+ const elements = passageConfig?.elements ?? {};
148
+ return buildAuthoringAllowList(Object.keys(elements));
149
+ });
150
+
151
+ function applySanitizer(markup: string, allowList: string[]): string {
152
+ if (!markup) return "";
153
+ if (trustMarkup) return markup;
154
+ if (sanitizeMarkup) return sanitizeMarkup(markup);
155
+ const sanitizer = createDefaultItemMarkupSanitizer({
156
+ allowedCustomElements: allowList,
157
+ });
158
+ return sanitizer(markup);
159
+ }
160
+
133
161
  // Get appropriate markup based on mode
134
162
  const itemMarkup = $derived.by(() => {
135
163
  if (!itemConfig?.markup) return "";
136
- if (mode === "author" && itemConfig.elements) {
137
- return transformMarkupForAuthoring(
138
- itemConfig.markup,
139
- itemConfig.elements
140
- );
141
- }
142
- return itemConfig.markup;
164
+ const raw =
165
+ mode === "author" && itemConfig.elements
166
+ ? transformMarkupForAuthoring(itemConfig.markup, itemConfig.elements)
167
+ : itemConfig.markup;
168
+ return applySanitizer(raw, itemAllowList);
143
169
  });
144
170
 
145
171
  const passageMarkup = $derived.by(() => {
146
172
  if (!passageConfig?.markup) return "";
147
- if (mode === "author" && passageConfig.elements) {
148
- return transformMarkupForAuthoring(
149
- passageConfig.markup,
150
- passageConfig.elements
151
- );
152
- }
153
- return passageConfig.markup;
173
+ const raw =
174
+ mode === "author" && passageConfig.elements
175
+ ? transformMarkupForAuthoring(
176
+ passageConfig.markup,
177
+ passageConfig.elements
178
+ )
179
+ : passageConfig.markup;
180
+ return applySanitizer(raw, passageAllowList);
154
181
  });
155
182
 
183
+ function normalizePlayerErrorDetail(
184
+ detail: unknown,
185
+ fallbackCode = "ITEM_PLAYER_RUNTIME_ERROR"
186
+ ) {
187
+ if (detail && typeof detail === "object") {
188
+ const detailObject = detail as Record<string, unknown>;
189
+ const message =
190
+ typeof detailObject.message === "string" && detailObject.message.trim().length > 0
191
+ ? detailObject.message
192
+ : "Unknown PIE runtime error";
193
+ const code =
194
+ typeof detailObject.code === "string" && detailObject.code.trim().length > 0
195
+ ? detailObject.code
196
+ : fallbackCode;
197
+ return { ...detailObject, message, code };
198
+ }
199
+ const message =
200
+ typeof detail === "string" && detail.trim().length > 0
201
+ ? detail
202
+ : "Unknown PIE runtime error";
203
+ return { code: fallbackCode, message };
204
+ }
205
+
206
+ function trackPlayerError(detail: Record<string, unknown>) {
207
+ const resolvedProvider = resolveInstrumentationProvider({
208
+ player: { loaderConfig },
209
+ component: "pie-item-player",
210
+ debug: isGlobalDebugEnabled(),
211
+ });
212
+ if (!isInstrumentationProvider(resolvedProvider) || !resolvedProvider.isReady()) return;
213
+ const message =
214
+ typeof detail.message === "string" ? detail.message : "Unknown PIE runtime error";
215
+ const code =
216
+ typeof detail.code === "string" && detail.code.length > 0
217
+ ? detail.code
218
+ : "ITEM_PLAYER_RUNTIME_ERROR";
219
+ resolvedProvider.trackError(new Error(message), {
220
+ component: "pie-item-player",
221
+ errorType: code,
222
+ ...detail,
223
+ });
224
+ }
225
+
226
+ function reportPlayerError(detail: unknown, fallbackCode = "ITEM_PLAYER_RUNTIME_ERROR") {
227
+ const normalizedDetail = normalizePlayerErrorDetail(detail, fallbackCode);
228
+ runtimePlayerError = normalizedDetail.message as string;
229
+ logger.error("[PieItemPlayer] Runtime error:", normalizedDetail);
230
+ trackPlayerError(normalizedDetail);
231
+ dispatch("player-error", normalizedDetail);
232
+ }
233
+
156
234
  // Dispatch events (will add more as needed)
157
235
  const dispatch = (type: string, detail?: any) => {
158
236
  // Call callback prop if provided (Svelte 5 pattern)
@@ -185,8 +263,7 @@
185
263
  function reportAuthoringErrorOnce(message: string) {
186
264
  if (lastReportedAuthoringError === message) return;
187
265
  lastReportedAuthoringError = message;
188
- logger.error(`[PieItemPlayer] ${message}`);
189
- dispatch("player-error", {
266
+ reportPlayerError({
190
267
  code: "AUTHORING_BACKEND_CONFIG_ERROR",
191
268
  message,
192
269
  });
@@ -381,46 +458,6 @@
381
458
  // Root element reference for resource monitor
382
459
  let rootElement: HTMLElement | null = $state(null);
383
460
 
384
- function normalizeResourceUrl(url: string): string {
385
- try {
386
- const parsed = new URL(url, window.location.href);
387
- parsed.searchParams.delete("retry");
388
- parsed.searchParams.delete("t");
389
- return parsed.toString();
390
- } catch {
391
- return url;
392
- }
393
- }
394
-
395
- function dispatchMediaRetryReady(detail: RetrySuccessDetail) {
396
- if (!rootElement) return;
397
- if (!detail || (detail.resourceType !== "audio" && detail.resourceType !== "video")) {
398
- return;
399
- }
400
- const url = typeof detail.url === "string" ? detail.url : "";
401
- if (!url) return;
402
- const normalizedTargetUrl = normalizeResourceUrl(url);
403
- const selector = detail.resourceType === "audio" ? "audio[src]" : "video[src]";
404
- const mediaElements = Array.from(
405
- rootElement.querySelectorAll<HTMLAudioElement | HTMLVideoElement>(selector)
406
- );
407
- for (const mediaEl of mediaElements) {
408
- const currentSrc = mediaEl.currentSrc || mediaEl.src;
409
- if (!currentSrc) continue;
410
- if (normalizeResourceUrl(currentSrc) !== normalizedTargetUrl) continue;
411
- mediaEl.dispatchEvent(
412
- new CustomEvent("pie-media-retry-ready", {
413
- detail: {
414
- ...detail,
415
- mediaTag: detail.resourceType,
416
- },
417
- bubbles: true,
418
- composed: true,
419
- })
420
- );
421
- }
422
- }
423
-
424
461
  // Resource monitor (handles initialization and cleanup automatically)
425
462
  useResourceMonitor(
426
463
  () => rootElement,
@@ -429,26 +466,6 @@
429
466
  "pie-item-player"
430
467
  );
431
468
 
432
- // Bridge resource-monitor retry success events to media-level recovery hooks so
433
- // item elements can clear local disabled/error UI without coupling to player internals.
434
- $effect(() => {
435
- if (!rootElement) return;
436
- const handleRetrySuccess = (event: Event) => {
437
- const customEvent = event as CustomEvent<RetrySuccessDetail>;
438
- dispatchMediaRetryReady(customEvent.detail ?? {});
439
- };
440
- rootElement.addEventListener(
441
- "pie-resource-retry-success",
442
- handleRetrySuccess as EventListener
443
- );
444
- return () => {
445
- rootElement?.removeEventListener(
446
- "pie-resource-retry-success",
447
- handleRetrySuccess as EventListener
448
- );
449
- };
450
- });
451
-
452
469
  // Initialize PIE elements AFTER markup is rendered (reactive pattern like PieItemPreview)
453
470
  $effect(() => {
454
471
  if (!itemConfig || initialized) return;
@@ -460,6 +477,7 @@
460
477
  // Wait for DOM to update (markup to render)
461
478
  tick().then(async () => {
462
479
  try {
480
+ runtimePlayerError = null;
463
481
  logger.debug("[PieItemPlayer] DOM ready, initializing PIE elements");
464
482
  logger.debug("[PieItemPlayer] Config:", {
465
483
  itemElements: Object.keys(itemConfig.elements || {}),
@@ -737,8 +755,14 @@
737
755
  );
738
756
  dispatch("load-complete");
739
757
  } catch (e: any) {
740
- logger.error("[PieItemPlayer] Error initializing:", e);
741
- dispatch("player-error", e.message);
758
+ reportPlayerError(
759
+ {
760
+ code: "ITEM_PLAYER_INITIALIZATION_ERROR",
761
+ message: e instanceof Error ? e.message : String(e),
762
+ cause: e instanceof Error ? e.stack || e.message : String(e),
763
+ },
764
+ "ITEM_PLAYER_INITIALIZATION_ERROR"
765
+ );
742
766
  }
743
767
  });
744
768
  });
@@ -797,16 +821,60 @@
797
821
  if (passageConfig) {
798
822
  updatePieElements(passageConfig, session, env, rootElement ?? undefined);
799
823
  }
824
+ } catch (e: any) {
825
+ reportPlayerError(
826
+ {
827
+ code: "ITEM_PLAYER_UPDATE_ERROR",
828
+ message: e instanceof Error ? e.message : String(e),
829
+ cause: e instanceof Error ? e.stack || e.message : String(e),
830
+ },
831
+ "ITEM_PLAYER_UPDATE_ERROR"
832
+ );
800
833
  } finally {
801
834
  isUpdating = false;
802
835
  }
803
836
  });
804
837
  });
805
838
 
839
+ $effect(() => {
840
+ if (!rootElement) return;
841
+ const handleControllerError = (event: Event) => {
842
+ const customEvent = event as CustomEvent;
843
+ reportPlayerError(customEvent.detail, "PIE_CONTROLLER_RUNTIME_ERROR");
844
+ };
845
+ rootElement.addEventListener(
846
+ "pie-controller-error",
847
+ handleControllerError as EventListener
848
+ );
849
+ return () => {
850
+ rootElement?.removeEventListener(
851
+ "pie-controller-error",
852
+ handleControllerError as EventListener
853
+ );
854
+ };
855
+ });
856
+
806
857
  // Note: Resource monitor cleanup is handled automatically by useResourceMonitor's onDestroy
807
858
  </script>
808
859
 
809
860
  <div class="pie-item-player" bind:this={rootElement}>
861
+ {#if runtimePlayerError}
862
+ <div
863
+ class="pie-player-error"
864
+ style="
865
+ padding: 20px;
866
+ margin: 20px 0;
867
+ border: 2px solid #d32f2f;
868
+ border-radius: 4px;
869
+ background-color: #ffebee;
870
+ color: #c62828;
871
+ font-family: sans-serif;
872
+ "
873
+ >
874
+ <h3 style="margin: 0 0 10px 0">Player Error</h3>
875
+ <p style="margin: 0">{runtimePlayerError}</p>
876
+ </div>
877
+ {/if}
810
878
  {#if authoringBlockedError}
811
879
  <div
812
880
  class="pie-player-error"
@@ -43,7 +43,7 @@
43
43
  },
44
44
  "calculator": {
45
45
  "title": "Calculator",
46
- "aria_label": "Calculator tool - Use Alt+Arrow keys to move, Escape to close",
46
+ "aria_label": "Calculator tool - Tab to reach title bar controls. On the title bar, Arrow keys move the window, Shift+Arrow resizes it, Home re-centers, and Escape closes.",
47
47
  "settings": "Calculator settings",
48
48
  "close": "Close calculator",
49
49
  "settings_title": "Calculator Settings",
@@ -25,6 +25,7 @@
25
25
  * ```
26
26
  */
27
27
 
28
+ /// <reference types="svelte" />
28
29
  import { BUNDLED_TRANSLATIONS, loadTranslations } from "./loader.js";
29
30
  import { SimpleI18n } from "./simple-i18n.js";
30
31
 
@@ -20,6 +20,7 @@
20
20
  * ```
21
21
  */
22
22
 
23
+ /// <reference types="svelte" />
23
24
  import type { I18nServiceApi } from "./types.js";
24
25
 
25
26
  /**
package/dist/index.d.ts CHANGED
@@ -2,12 +2,14 @@ export * from "./config/profile.js";
2
2
  export * from "./instrumentation/index.js";
3
3
  export * from "./loader-config.js";
4
4
  export * from "./player-strategy.js";
5
+ export * from "./security/index.js";
5
6
  export * from "./loaders/index.js";
6
7
  export * from "./object/index.js";
7
8
  export * from "./pie/index.js";
8
9
  export type { AssessmentEntity, AssessmentItemRef, AssessmentSection, ConfigEntity, Env, ItemConfig, ItemEntity, LegacyAssessmentSection, OutcomeResponse, PassageEntity, PieController, PieModel, QuestionEntity, RubricBlock, SectionQuestionRef, TestPart, } from "./types/index.js";
9
10
  export { editorPostFix } from "./types/index.js";
10
11
  export * from "./ui/focus-trap.js";
12
+ export * from "./ui/first-focusable.js";
11
13
  export * from "./ui/debug-panel-persistence.js";
12
14
  export * from "./ui/safe-storage.js";
13
15
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAElC,cAAc,gBAAgB,CAAC;AAC/B,YAAY,EACX,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,YAAY,EACZ,GAAG,EACH,UAAU,EACV,UAAU,EACV,uBAAuB,EACvB,eAAe,EACf,aAAa,EACb,aAAa,EACb,QAAQ,EACR,cAAc,EACd,WAAW,EACX,kBAAkB,EAClB,QAAQ,GACR,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,cAAc,oBAAoB,CAAC;AACnC,cAAc,iCAAiC,CAAC;AAChD,cAAc,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAElC,cAAc,gBAAgB,CAAC;AAC/B,YAAY,EACX,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,YAAY,EACZ,GAAG,EACH,UAAU,EACV,UAAU,EACV,uBAAuB,EACvB,eAAe,EACf,aAAa,EACb,aAAa,EACb,QAAQ,EACR,cAAc,EACd,WAAW,EACX,kBAAkB,EAClB,QAAQ,GACR,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,cAAc,oBAAoB,CAAC;AACnC,cAAc,yBAAyB,CAAC;AACxC,cAAc,iCAAiC,CAAC;AAChD,cAAc,sBAAsB,CAAC"}
package/dist/index.js CHANGED
@@ -2,12 +2,18 @@ export * from "./config/profile.js";
2
2
  export * from "./instrumentation/index.js";
3
3
  export * from "./loader-config.js";
4
4
  export * from "./player-strategy.js";
5
+ export * from "./security/index.js";
5
6
  export * from "./loaders/index.js";
6
7
  export * from "./object/index.js";
7
8
  // Barrel export for PIE runtime utilities
8
9
  export * from "./pie/index.js";
9
10
  export { editorPostFix } from "./types/index.js";
10
11
  export * from "./ui/focus-trap.js";
12
+ export * from "./ui/first-focusable.js";
11
13
  export * from "./ui/debug-panel-persistence.js";
12
14
  export * from "./ui/safe-storage.js";
15
+ // use-promise is a Svelte 5 runes module and is shipped as raw source via
16
+ // the `./ui/use-promise` subpath export. It is not re-exported here because
17
+ // tsc cannot compile `.svelte.ts` runes correctly; the consumer's Svelte
18
+ // plugin processes it at consume time.
13
19
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,0CAA0C;AAC1C,cAAc,gBAAgB,CAAC;AAmB/B,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,cAAc,oBAAoB,CAAC;AACnC,cAAc,iCAAiC,CAAC;AAChD,cAAc,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,0CAA0C;AAC1C,cAAc,gBAAgB,CAAC;AAmB/B,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,cAAc,oBAAoB,CAAC;AACnC,cAAc,yBAAyB,CAAC;AACxC,cAAc,iCAAiC,CAAC;AAChD,cAAc,sBAAsB,CAAC;AACrC,0EAA0E;AAC1E,4EAA4E;AAC5E,yEAAyE;AACzE,uCAAuC"}
@@ -4,6 +4,16 @@
4
4
  * Mirrors the `LoaderConfig` used by PIEOneer's custom element tags.
5
5
  */
6
6
  import type { InstrumentationProvider } from "./instrumentation/types.js";
7
+ export type IifeBundleRetryConfig = {
8
+ /**
9
+ * Delay in ms between IIFE bundle retry attempts.
10
+ */
11
+ retryDelayMs?: number;
12
+ /**
13
+ * Total timeout in ms before IIFE bundle load retries fail permanently.
14
+ */
15
+ timeoutMs?: number;
16
+ };
7
17
  export type LoaderConfig = {
8
18
  /**
9
19
  * Enable tracking page actions/events.
@@ -47,11 +57,26 @@ export type LoaderConfig = {
47
57
  * Initial delay in ms before first resource retry attempt (exponential backoff).
48
58
  */
49
59
  resourceRetryDelay?: number;
60
+ /**
61
+ * Retry policy for IIFE bundle loads.
62
+ *
63
+ * Kept separate from resource retry settings so bundle-build polling can be tuned
64
+ * independently from media/resource retries.
65
+ */
66
+ iifeBundleRetry?: IifeBundleRetryConfig;
67
+ };
68
+ export declare const DEFAULT_IIFE_BUNDLE_RETRY_CONFIG: {
69
+ readonly retryDelayMs: 3000;
70
+ readonly timeoutMs: 120000;
50
71
  };
51
72
  export declare const DEFAULT_LOADER_CONFIG: {
52
73
  readonly trackPageActions: false;
53
74
  readonly instrumentationProvider: undefined;
54
75
  readonly maxResourceRetries: 3;
55
76
  readonly resourceRetryDelay: 500;
77
+ readonly iifeBundleRetry: {
78
+ readonly retryDelayMs: 3000;
79
+ readonly timeoutMs: 120000;
80
+ };
56
81
  };
57
82
  //# sourceMappingURL=loader-config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"loader-config.d.ts","sourceRoot":"","sources":["../src/loader-config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAE1E,MAAM,MAAM,YAAY,GAAG;IAC1B;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B;;;;;;;;;;;;;;;;;;;;;;;;;;OA0BG;IACH,uBAAuB,CAAC,EAAE,uBAAuB,CAAC;IAElD;;OAEG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAE5B;;OAEG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF,eAAO,MAAM,qBAAqB;;;;;CAKxB,CAAC"}
1
+ {"version":3,"file":"loader-config.d.ts","sourceRoot":"","sources":["../src/loader-config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAE1E,MAAM,MAAM,qBAAqB,GAAG;IACnC;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IAC1B;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B;;;;;;;;;;;;;;;;;;;;;;;;;;OA0BG;IACH,uBAAuB,CAAC,EAAE,uBAAuB,CAAC;IAElD;;OAEG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAE5B;;OAEG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAE5B;;;;;OAKG;IACH,eAAe,CAAC,EAAE,qBAAqB,CAAC;CACxC,CAAC;AAEF,eAAO,MAAM,gCAAgC;;;CAGnC,CAAC;AAEX,eAAO,MAAM,qBAAqB;;;;;;;;;CAMxB,CAAC"}
@@ -3,10 +3,15 @@
3
3
  *
4
4
  * Mirrors the `LoaderConfig` used by PIEOneer's custom element tags.
5
5
  */
6
+ export const DEFAULT_IIFE_BUNDLE_RETRY_CONFIG = {
7
+ retryDelayMs: 3000,
8
+ timeoutMs: 120000,
9
+ };
6
10
  export const DEFAULT_LOADER_CONFIG = {
7
11
  trackPageActions: false,
8
12
  instrumentationProvider: undefined,
9
13
  maxResourceRetries: 3,
10
14
  resourceRetryDelay: 500,
15
+ iifeBundleRetry: DEFAULT_IIFE_BUNDLE_RETRY_CONFIG,
11
16
  };
12
17
  //# sourceMappingURL=loader-config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"loader-config.js","sourceRoot":"","sources":["../src/loader-config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAoDH,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACpC,gBAAgB,EAAE,KAAK;IACvB,uBAAuB,EAAE,SAAS;IAClC,kBAAkB,EAAE,CAAC;IACrB,kBAAkB,EAAE,GAAG;CACd,CAAC"}
1
+ {"version":3,"file":"loader-config.js","sourceRoot":"","sources":["../src/loader-config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAwEH,MAAM,CAAC,MAAM,gCAAgC,GAAG;IAC/C,YAAY,EAAE,IAAI;IAClB,SAAS,EAAE,MAAM;CACR,CAAC;AAEX,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACpC,gBAAgB,EAAE,KAAK;IACvB,uBAAuB,EAAE,SAAS;IAClC,kBAAkB,EAAE,CAAC;IACrB,kBAAkB,EAAE,GAAG;IACvB,eAAe,EAAE,gCAAgC;CACxC,CAAC"}
@@ -1,11 +1,12 @@
1
1
  /**
2
- * Element Loader - Core types and utilities for loading PIE elements
2
+ * Element Loader element aggregation utilities.
3
3
  *
4
- * This module provides element aggregation and loading abstractions for PIE players.
5
- * It enables loading multiple PIE elements in a single operation, eliminating duplicate
6
- * bundle requests when multiple items use the same elements.
4
+ * The deep `ElementLoader` primitive lives in `./element-loader.ts`. This
5
+ * module owns the shared `ElementMap` type and the `aggregateElements`
6
+ * helper that reduces many items' element declarations into a single
7
+ * deduplicated, version-aware map (used by the section-player to
8
+ * pre-warm in one shot).
7
9
  */
8
- import type { BundleType } from "../pie/types.js";
9
10
  import type { ItemEntity } from "../types/index.js";
10
11
  /**
11
12
  * Map of element tag names to their package versions
@@ -14,35 +15,6 @@ import type { ItemEntity } from "../types/index.js";
14
15
  export type ElementMap = {
15
16
  [tagName: string]: string;
16
17
  };
17
- /**
18
- * Options for loading PIE elements
19
- */
20
- export interface LoadOptions {
21
- /** Bundle type to load (player or clientPlayer) */
22
- bundleType?: BundleType;
23
- /** Whether to load controllers (for client-side processing) */
24
- needsControllers?: boolean;
25
- /** View mode (ESM only) - delivery, author, or print */
26
- view?: "delivery" | "author" | "print";
27
- }
28
- /**
29
- * Common interface for element loaders (IIFE and ESM)
30
- */
31
- export interface ElementLoaderInterface {
32
- /**
33
- * Load elements directly from an element map
34
- * @param elements - Map of element tag names to package versions
35
- * @param options - Loading options
36
- */
37
- loadElements(elements: ElementMap, options?: LoadOptions): Promise<void>;
38
- /**
39
- * Extract and load elements from items
40
- * Automatically aggregates unique elements from all items
41
- * @param items - Array of items to extract elements from
42
- * @param options - Loading options
43
- */
44
- loadFromItems(items: ItemEntity[], options?: LoadOptions): Promise<void>;
45
- }
46
18
  /**
47
19
  * Aggregate unique elements from multiple items
48
20
  *
@@ -1 +1 @@
1
- {"version":3,"file":"ElementLoader.d.ts","sourceRoot":"","sources":["../../src/loaders/ElementLoader.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD;;;GAGG;AACH,MAAM,MAAM,UAAU,GAAG;IAAE,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,CAAC;AAEvD;;GAEG;AACH,MAAM,WAAW,WAAW;IAC3B,mDAAmD;IACnD,UAAU,CAAC,EAAE,UAAU,CAAC;IAExB,+DAA+D;IAC/D,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B,wDAAwD;IACxD,IAAI,CAAC,EAAE,UAAU,GAAG,QAAQ,GAAG,OAAO,CAAC;CACvC;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACtC;;;;OAIG;IACH,YAAY,CAAC,QAAQ,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzE;;;;;OAKG;IACH,aAAa,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACzE;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,UAAU,CAmDjE"}
1
+ {"version":3,"file":"ElementLoader.d.ts","sourceRoot":"","sources":["../../src/loaders/ElementLoader.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD;;;GAGG;AACH,MAAM,MAAM,UAAU,GAAG;IAAE,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,CAAC;AAEvD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,UAAU,CAmEjE"}
@@ -1,9 +1,11 @@
1
1
  /**
2
- * Element Loader - Core types and utilities for loading PIE elements
2
+ * Element Loader element aggregation utilities.
3
3
  *
4
- * This module provides element aggregation and loading abstractions for PIE players.
5
- * It enables loading multiple PIE elements in a single operation, eliminating duplicate
6
- * bundle requests when multiple items use the same elements.
4
+ * The deep `ElementLoader` primitive lives in `./element-loader.ts`. This
5
+ * module owns the shared `ElementMap` type and the `aggregateElements`
6
+ * helper that reduces many items' element declarations into a single
7
+ * deduplicated, version-aware map (used by the section-player to
8
+ * pre-warm in one shot).
7
9
  */
8
10
  import { parsePackageName } from "../pie/utils.js";
9
11
  /**
@@ -35,21 +37,31 @@ export function aggregateElements(items) {
35
37
  const elementMap = {};
36
38
  const seenOriginalTags = {};
37
39
  const VERSION_DELIMITER = "--version-";
40
+ const TAG_VERSION_PATTERN = "[0-9A-Za-z-]+";
41
+ const encodeVersionForTag = (version) => version
42
+ .trim()
43
+ .replace(/[.+]/g, "-")
44
+ .replace(/[^0-9A-Za-z-]/g, "-")
45
+ .replace(/-{2,}/g, "-");
38
46
  const parseTagName = (tagName) => {
39
- const versionMatch = tagName.match(`${VERSION_DELIMITER}(\\d+-\\d+-\\d+)$`);
47
+ const versionMatch = tagName.match(new RegExp(`${VERSION_DELIMITER}(${TAG_VERSION_PATTERN})$`));
40
48
  return versionMatch
41
49
  ? {
42
50
  baseName: tagName.replace(`${VERSION_DELIMITER}${versionMatch[1]}`, ""),
43
- existingVersion: versionMatch[1].replace(/-/g, "."),
51
+ existingEncodedVersion: versionMatch[1],
44
52
  }
45
53
  : { baseName: tagName };
46
54
  };
47
55
  const normalizeElementTag = (tagName, packageSpec) => {
48
- const { baseName, existingVersion } = parseTagName(tagName);
56
+ const { baseName, existingEncodedVersion } = parseTagName(tagName);
49
57
  const { version } = parsePackageName(packageSpec);
50
- if (!version || existingVersion === version)
58
+ if (!version)
51
59
  return tagName;
52
- return `${baseName}${VERSION_DELIMITER}${version.replace(/\./g, "-")}`;
60
+ const targetEncodedVersion = encodeVersionForTag(version);
61
+ if (!targetEncodedVersion || existingEncodedVersion === targetEncodedVersion) {
62
+ return tagName;
63
+ }
64
+ return `${baseName}${VERSION_DELIMITER}${targetEncodedVersion}`;
53
65
  };
54
66
  items.forEach((item) => {
55
67
  const itemElements = item.config?.elements || {};
@@ -1 +1 @@
1
- {"version":3,"file":"ElementLoader.js","sourceRoot":"","sources":["../../src/loaders/ElementLoader.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AA2CnD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAmB;IACpD,MAAM,UAAU,GAA2B,EAAE,CAAC;IAC9C,MAAM,gBAAgB,GAA2B,EAAE,CAAC;IAEpD,MAAM,iBAAiB,GAAG,YAAY,CAAC;IACvC,MAAM,YAAY,GAAG,CACpB,OAAe,EACkC,EAAE;QACnD,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,iBAAiB,mBAAmB,CAAC,CAAC;QAC5E,OAAO,YAAY;YAClB,CAAC,CAAC;gBACA,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,iBAAiB,GAAG,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC;gBACvE,eAAe,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;aACnD;YACF,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;IAC1B,CAAC,CAAC;IACF,MAAM,mBAAmB,GAAG,CAAC,OAAe,EAAE,WAAmB,EAAU,EAAE;QAC5E,MAAM,EAAE,QAAQ,EAAE,eAAe,EAAE,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;QAC5D,MAAM,EAAE,OAAO,EAAE,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;QAClD,IAAI,CAAC,OAAO,IAAI,eAAe,KAAK,OAAO;YAAE,OAAO,OAAO,CAAC;QAC5D,OAAO,GAAG,QAAQ,GAAG,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC;IACxE,CAAC,CAAC;IAEF,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QACtB,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,EAAE,QAAQ,IAAI,EAAE,CAAC;QAEjD,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE;YACnD,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;YAChC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC5B,gBAAgB,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC;YACrC,CAAC;iBAAM,IAAI,gBAAgB,CAAC,GAAG,CAAC,KAAK,WAAW,EAAE,CAAC;gBAClD,kEAAkE;gBAClE,MAAM,IAAI,KAAK,CACd,6BAA6B,GAAG,kBAAkB,gBAAgB,CAAC,GAAG,CAAC,QAAQ,WAAW,IAAI;oBAC7F,mEAAmE,CACpE,CAAC;YACH,CAAC;YAED,MAAM,aAAa,GAAG,mBAAmB,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;YAC5D,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;gBAChC,UAAU,CAAC,aAAa,CAAC,GAAG,WAAW,CAAC;YACzC,CAAC;iBAAM,IAAI,UAAU,CAAC,aAAa,CAAC,KAAK,WAAW,EAAE,CAAC;gBACtD,MAAM,IAAI,KAAK,CACd,6BAA6B,aAAa,kBAAkB,UAAU,CAAC,aAAa,CAAC,QAAQ,WAAW,IAAI;oBAC3G,mEAAmE,CACpE,CAAC;YACH,CAAC;QACF,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO,UAAU,CAAC;AACnB,CAAC"}
1
+ {"version":3,"file":"ElementLoader.js","sourceRoot":"","sources":["../../src/loaders/ElementLoader.ts"],"names":[],"mappings":"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"}