@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
@@ -1 +1 @@
1
- {"version":3,"file":"use-resource-monitor.svelte.js","sourceRoot":"","sources":["../../src/pie/use-resource-monitor.svelte.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"use-resource-monitor.svelte.js","sourceRoot":"","sources":["../../src/pie/use-resource-monitor.svelte.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export { buildAuthoringAllowList, createDefaultItemMarkupSanitizer, resetPurifierForTesting, sanitizeItemMarkup, type ItemMarkupSanitizer, type SanitizeItemMarkupOptions, } from "./sanitize-item-markup.js";
2
+ export { parseAllowedStyleOrigins, validateExternalStyleUrl, type StyleUrlValidationError, type StyleUrlValidationOk, type StyleUrlValidationOptions, type StyleUrlValidationResult, } from "./validate-style-url.js";
3
+ export { resetSvgSanitizerForTesting, sanitizeSvgIcon, } from "./sanitize-svg-icon.js";
4
+ export { wrapOverwideImages } from "./wrap-overwide-images.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/security/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,uBAAuB,EACvB,gCAAgC,EAChC,uBAAuB,EACvB,kBAAkB,EAClB,KAAK,mBAAmB,EACxB,KAAK,yBAAyB,GAC9B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACN,wBAAwB,EACxB,wBAAwB,EACxB,KAAK,uBAAuB,EAC5B,KAAK,oBAAoB,EACzB,KAAK,yBAAyB,EAC9B,KAAK,wBAAwB,GAC7B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACN,2BAA2B,EAC3B,eAAe,GACf,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { buildAuthoringAllowList, createDefaultItemMarkupSanitizer, resetPurifierForTesting, sanitizeItemMarkup, } from "./sanitize-item-markup.js";
2
+ export { parseAllowedStyleOrigins, validateExternalStyleUrl, } from "./validate-style-url.js";
3
+ export { resetSvgSanitizerForTesting, sanitizeSvgIcon, } from "./sanitize-svg-icon.js";
4
+ export { wrapOverwideImages } from "./wrap-overwide-images.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/security/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,uBAAuB,EACvB,gCAAgC,EAChC,uBAAuB,EACvB,kBAAkB,GAGlB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACN,wBAAwB,EACxB,wBAAwB,GAKxB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACN,2BAA2B,EAC3B,eAAe,GACf,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Default sanitizer for PIE item / passage markup.
3
+ *
4
+ * Used by `PieItemPlayer.svelte` to strip scripts, event-handler attributes,
5
+ * and unknown tags before injecting authored markup via `{@html}`. Hosts can
6
+ * opt out with the `trust-markup` attribute on the `<pie-*-player>` element,
7
+ * or supply their own sanitizer function if they need a stricter / looser
8
+ * allow-list.
9
+ */
10
+ export type ItemMarkupSanitizer = (markup: string) => string;
11
+ export interface SanitizeItemMarkupOptions {
12
+ /**
13
+ * Extra custom-element tag names that should survive sanitization in
14
+ * addition to the default `pie-*` allow-list. Useful for authoring-mode
15
+ * tags that rewrite to `pie-*-config` or host-registered extensions.
16
+ */
17
+ allowedCustomElements?: string[];
18
+ }
19
+ /**
20
+ * Sanitize raw item/passage markup before it is injected into the DOM.
21
+ *
22
+ * - Strips `<script>`, event-handler attributes, unknown protocols and
23
+ * a standard set of dangerous tags (`iframe`, `object`, `embed`, `base`,
24
+ * `form`, `meta`, `link`).
25
+ * - Preserves PIE custom elements (`pie-*`) and any extra tags listed in
26
+ * `allowedCustomElements`.
27
+ * - During SSR (no `window`) returns an empty string so untrusted markup
28
+ * never reaches the prerender output; the live renderer will re-run the
29
+ * sanitizer on hydrate.
30
+ */
31
+ export declare function sanitizeItemMarkup(markup: string, options?: SanitizeItemMarkupOptions): string;
32
+ /**
33
+ * Build the default `ItemMarkupSanitizer` used by the players. The returned
34
+ * function is stable for a given set of allowed custom elements so callers
35
+ * can safely use reference equality when deciding whether to re-sanitize.
36
+ */
37
+ export declare function createDefaultItemMarkupSanitizer(options?: SanitizeItemMarkupOptions): ItemMarkupSanitizer;
38
+ /**
39
+ * Derive the authoring-mode allow-list (`pie-*-config`) from a set of PIE
40
+ * element tag names. Used by `transformMarkupForAuthoring` so the sanitizer
41
+ * keeps the rewritten `-config` tags instead of stripping them.
42
+ */
43
+ export declare function buildAuthoringAllowList(elementTagNames: Iterable<string>): string[];
44
+ /** Reset the memoised DOMPurify instance. Only intended for tests. */
45
+ export declare function resetPurifierForTesting(): void;
46
+ //# sourceMappingURL=sanitize-item-markup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanitize-item-markup.d.ts","sourceRoot":"","sources":["../../src/security/sanitize-item-markup.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,MAAM,MAAM,mBAAmB,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;AAE7D,MAAM,WAAW,yBAAyB;IACzC;;;;OAIG;IACH,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC;CACjC;AAgGD;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CACjC,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,yBAA8B,GACrC,MAAM,CAiDR;AAED;;;;GAIG;AACH,wBAAgB,gCAAgC,CAC/C,OAAO,GAAE,yBAA8B,GACrC,mBAAmB,CAIrB;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CACtC,eAAe,EAAE,QAAQ,CAAC,MAAM,CAAC,GAC/B,MAAM,EAAE,CASV;AAED,sEAAsE;AACtE,wBAAgB,uBAAuB,SAEtC"}
@@ -0,0 +1,174 @@
1
+ /**
2
+ * Default sanitizer for PIE item / passage markup.
3
+ *
4
+ * Used by `PieItemPlayer.svelte` to strip scripts, event-handler attributes,
5
+ * and unknown tags before injecting authored markup via `{@html}`. Hosts can
6
+ * opt out with the `trust-markup` attribute on the `<pie-*-player>` element,
7
+ * or supply their own sanitizer function if they need a stricter / looser
8
+ * allow-list.
9
+ */
10
+ import DOMPurify from "dompurify";
11
+ import { wrapOverwideImages } from "./wrap-overwide-images.js";
12
+ // Attributes every PIE element / wrapper is allowed to carry.
13
+ const BASE_ALLOWED_ATTRS = [
14
+ "slot",
15
+ "role",
16
+ "tabindex",
17
+ "id",
18
+ "class",
19
+ "style",
20
+ "href",
21
+ "src",
22
+ "alt",
23
+ "title",
24
+ "hidden",
25
+ "disabled",
26
+ "lang",
27
+ "dir",
28
+ ];
29
+ const BASE_URI_SAFE_ATTRS = ["pie-id"];
30
+ const FORBIDDEN_TAGS = [
31
+ "script",
32
+ "iframe",
33
+ "object",
34
+ "embed",
35
+ "base",
36
+ "form",
37
+ "meta",
38
+ "link",
39
+ // <foreignObject> inside an <svg> is a well-known escape hatch back
40
+ // into HTML context; match the SVG-icon sanitizer and forbid it here
41
+ // so both sanitizers agree on the surface.
42
+ "foreignobject",
43
+ ];
44
+ // DOMPurify already strips `on*` handlers via its default block-list;
45
+ // these entries guarantee they stay stripped even if a consumer tweaks
46
+ // defaults, and they cover the common SVG / math sinks.
47
+ const FORBIDDEN_ATTRS = [
48
+ "onerror",
49
+ "onload",
50
+ "onclick",
51
+ "onmouseover",
52
+ "onmouseout",
53
+ "onmouseenter",
54
+ "onmouseleave",
55
+ "onfocus",
56
+ "onblur",
57
+ "onkeydown",
58
+ "onkeyup",
59
+ "onkeypress",
60
+ "onsubmit",
61
+ "onchange",
62
+ "onbeforeunload",
63
+ "formaction",
64
+ "xlink:href",
65
+ ];
66
+ // Any tag that looks like a custom element (contains a hyphen) is permitted
67
+ // provided it starts with `pie-` or is explicitly named in
68
+ // `allowedCustomElements`. This intentionally keeps third-party unknown
69
+ // custom elements out unless the host opts in.
70
+ const PIE_CUSTOM_ELEMENT_REGEX = /^pie-[a-z0-9-]+$/i;
71
+ // Attribute names that custom elements are allowed to declare. We stay
72
+ // permissive for the PIE element contract (`model-*`, `session-*`, ...) and
73
+ // the standard `data-*` / `aria-*` families.
74
+ const CUSTOM_ELEMENT_ATTR_REGEX = /^(id|class|style|slot|role|tabindex|hidden|disabled|lang|dir|data-[\w-]+|aria-[\w-]+|pie-[\w-]+|model-[\w-]+|session-[\w-]+|config-[\w-]+|context-[\w-]+)$/i;
75
+ let purifierInstance = null;
76
+ function resolvePurifier() {
77
+ if (purifierInstance)
78
+ return purifierInstance;
79
+ if (typeof window === "undefined" || !window.document)
80
+ return null;
81
+ // DOMPurify's default export is both the instance and the factory.
82
+ // Calling it with a window binds the instance to that document.
83
+ const factory = DOMPurify;
84
+ purifierInstance =
85
+ typeof factory === "function"
86
+ ? factory(window)
87
+ : DOMPurify;
88
+ return purifierInstance;
89
+ }
90
+ /**
91
+ * Sanitize raw item/passage markup before it is injected into the DOM.
92
+ *
93
+ * - Strips `<script>`, event-handler attributes, unknown protocols and
94
+ * a standard set of dangerous tags (`iframe`, `object`, `embed`, `base`,
95
+ * `form`, `meta`, `link`).
96
+ * - Preserves PIE custom elements (`pie-*`) and any extra tags listed in
97
+ * `allowedCustomElements`.
98
+ * - During SSR (no `window`) returns an empty string so untrusted markup
99
+ * never reaches the prerender output; the live renderer will re-run the
100
+ * sanitizer on hydrate.
101
+ */
102
+ export function sanitizeItemMarkup(markup, options = {}) {
103
+ if (!markup)
104
+ return "";
105
+ const purifier = resolvePurifier();
106
+ if (!purifier)
107
+ return "";
108
+ const allowedCustomElements = (options.allowedCustomElements ?? []).map((name) => name.toLowerCase());
109
+ const explicitCustomElementSet = new Set(allowedCustomElements);
110
+ const result = purifier.sanitize(markup, {
111
+ ADD_TAGS: allowedCustomElements,
112
+ ADD_ATTR: BASE_ALLOWED_ATTRS,
113
+ ADD_URI_SAFE_ATTR: BASE_URI_SAFE_ATTRS,
114
+ FORBID_TAGS: FORBIDDEN_TAGS,
115
+ FORBID_ATTR: FORBIDDEN_ATTRS,
116
+ ALLOW_UNKNOWN_PROTOCOLS: false,
117
+ SANITIZE_DOM: true,
118
+ // pie-item contract compatibility: PIE models are matched to DOM
119
+ // elements via strict `id` equality (see `updateSinglePieElement`
120
+ // in players-shared/src/pie/updates.ts). `SANITIZE_NAMED_PROPS`
121
+ // would prefix every `id`/`name` with `user-content-`, which silently
122
+ // breaks model lookup for every item. `SANITIZE_DOM: true` above
123
+ // still provides the core DOM-clobbering defenses we rely on.
124
+ SANITIZE_NAMED_PROPS: false,
125
+ WHOLE_DOCUMENT: false,
126
+ ALLOW_DATA_ATTR: true,
127
+ ALLOW_ARIA_ATTR: true,
128
+ CUSTOM_ELEMENT_HANDLING: {
129
+ tagNameCheck: (tagName) => {
130
+ const lower = tagName.toLowerCase();
131
+ return (PIE_CUSTOM_ELEMENT_REGEX.test(lower) ||
132
+ explicitCustomElementSet.has(lower));
133
+ },
134
+ attributeNameCheck: (attrName) => CUSTOM_ELEMENT_ATTR_REGEX.test(attrName),
135
+ allowCustomizedBuiltInElements: false,
136
+ },
137
+ RETURN_TRUSTED_TYPE: false,
138
+ });
139
+ const sanitized = typeof result === "string" ? result : String(result ?? "");
140
+ // PIE-94: wrap overwide authored images in a horizontal-scroll container
141
+ // so they don't get clipped by ancestor `overflow-x: hidden` regions in
142
+ // the section player (and match WCAG 1.4.10 Reflow at 400% zoom).
143
+ return wrapOverwideImages(sanitized);
144
+ }
145
+ /**
146
+ * Build the default `ItemMarkupSanitizer` used by the players. The returned
147
+ * function is stable for a given set of allowed custom elements so callers
148
+ * can safely use reference equality when deciding whether to re-sanitize.
149
+ */
150
+ export function createDefaultItemMarkupSanitizer(options = {}) {
151
+ const { allowedCustomElements } = options;
152
+ return (markup) => sanitizeItemMarkup(markup, { allowedCustomElements });
153
+ }
154
+ /**
155
+ * Derive the authoring-mode allow-list (`pie-*-config`) from a set of PIE
156
+ * element tag names. Used by `transformMarkupForAuthoring` so the sanitizer
157
+ * keeps the rewritten `-config` tags instead of stripping them.
158
+ */
159
+ export function buildAuthoringAllowList(elementTagNames) {
160
+ const out = new Set();
161
+ for (const tag of elementTagNames) {
162
+ if (!tag)
163
+ continue;
164
+ const lower = tag.toLowerCase();
165
+ out.add(lower);
166
+ out.add(`${lower}-config`);
167
+ }
168
+ return [...out];
169
+ }
170
+ /** Reset the memoised DOMPurify instance. Only intended for tests. */
171
+ export function resetPurifierForTesting() {
172
+ purifierInstance = null;
173
+ }
174
+ //# sourceMappingURL=sanitize-item-markup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanitize-item-markup.js","sourceRoot":"","sources":["../../src/security/sanitize-item-markup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Sanitize an SVG string intended to be rendered as an icon.
3
+ *
4
+ * Used by toolbars and tool-button components when their icon prop is an
5
+ * inline SVG supplied by a tool configuration. Runs DOMPurify with the
6
+ * SVG profile, forbids `<script>` / `<foreignObject>` and strips
7
+ * event-handler attributes.
8
+ *
9
+ * Returns an empty string when `window` / `document` are unavailable (SSR)
10
+ * or the input is not a string.
11
+ */
12
+ export declare function sanitizeSvgIcon(icon: unknown): string;
13
+ /** Reset sanitizer state. Intended for tests. */
14
+ export declare function resetSvgSanitizerForTesting(): void;
15
+ //# sourceMappingURL=sanitize-svg-icon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanitize-svg-icon.d.ts","sourceRoot":"","sources":["../../src/security/sanitize-svg-icon.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAwDH,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CA2BrD;AAED,iDAAiD;AACjD,wBAAgB,2BAA2B,SAG1C"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Sanitize an SVG string intended to be rendered as an icon.
3
+ *
4
+ * Used by toolbars and tool-button components when their icon prop is an
5
+ * inline SVG supplied by a tool configuration. Runs DOMPurify with the
6
+ * SVG profile, forbids `<script>` / `<foreignObject>` and strips
7
+ * event-handler attributes.
8
+ *
9
+ * Returns an empty string when `window` / `document` are unavailable (SSR)
10
+ * or the input is not a string.
11
+ */
12
+ import DOMPurify from "dompurify";
13
+ let svgPurifierInstance = null;
14
+ function resolveSvgPurifier() {
15
+ if (svgPurifierInstance)
16
+ return svgPurifierInstance;
17
+ if (typeof window === "undefined" || !window.document)
18
+ return null;
19
+ const factory = DOMPurify;
20
+ svgPurifierInstance =
21
+ typeof factory === "function"
22
+ ? factory(window)
23
+ : DOMPurify;
24
+ return svgPurifierInstance;
25
+ }
26
+ const FORBIDDEN_TAGS = [
27
+ "script",
28
+ "foreignobject",
29
+ "iframe",
30
+ "object",
31
+ "embed",
32
+ "base",
33
+ "form",
34
+ ];
35
+ const FORBIDDEN_ATTRS = [
36
+ "onerror",
37
+ "onload",
38
+ "onclick",
39
+ "onmouseover",
40
+ "onmouseout",
41
+ "onmouseenter",
42
+ "onmouseleave",
43
+ "onfocus",
44
+ "onblur",
45
+ "onkeydown",
46
+ "onkeyup",
47
+ "onkeypress",
48
+ "formaction",
49
+ "xlink:href",
50
+ ];
51
+ const stringCache = new Map();
52
+ const STRING_CACHE_MAX = 64;
53
+ export function sanitizeSvgIcon(icon) {
54
+ if (typeof icon !== "string" || icon.length === 0)
55
+ return "";
56
+ const trimmed = icon.trimStart();
57
+ if (!trimmed.toLowerCase().startsWith("<svg"))
58
+ return "";
59
+ const cached = stringCache.get(icon);
60
+ if (cached !== undefined)
61
+ return cached;
62
+ const purifier = resolveSvgPurifier();
63
+ if (!purifier)
64
+ return "";
65
+ const result = purifier.sanitize(icon, {
66
+ USE_PROFILES: { svg: true, svgFilters: true },
67
+ FORBID_TAGS: FORBIDDEN_TAGS,
68
+ FORBID_ATTR: FORBIDDEN_ATTRS,
69
+ ALLOW_UNKNOWN_PROTOCOLS: false,
70
+ RETURN_TRUSTED_TYPE: false,
71
+ });
72
+ const str = typeof result === "string" ? result : String(result ?? "");
73
+ if (stringCache.size >= STRING_CACHE_MAX) {
74
+ // Naive LRU: clear oldest half when the cache fills up. Tool icons are
75
+ // a small fixed set per assessment so this is rarely hit.
76
+ const keys = [...stringCache.keys()];
77
+ for (let i = 0; i < keys.length / 2; i += 1) {
78
+ stringCache.delete(keys[i]);
79
+ }
80
+ }
81
+ stringCache.set(icon, str);
82
+ return str;
83
+ }
84
+ /** Reset sanitizer state. Intended for tests. */
85
+ export function resetSvgSanitizerForTesting() {
86
+ svgPurifierInstance = null;
87
+ stringCache.clear();
88
+ }
89
+ //# sourceMappingURL=sanitize-svg-icon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanitize-svg-icon.js","sourceRoot":"","sources":["../../src/security/sanitize-svg-icon.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,SAAS,MAAM,WAAW,CAAC;AASlC,IAAI,mBAAmB,GAA6B,IAAI,CAAC;AAEzD,SAAS,kBAAkB;IAC1B,IAAI,mBAAmB;QAAE,OAAO,mBAAmB,CAAC;IACpD,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,CAAC,MAAM,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IACnE,MAAM,OAAO,GAAG,SAEM,CAAC;IACvB,mBAAmB;QAClB,OAAO,OAAO,KAAK,UAAU;YAC5B,CAAC,CAAC,OAAO,CAAC,MAAoC,CAAC;YAC/C,CAAC,CAAE,SAA0C,CAAC;IAChD,OAAO,mBAAmB,CAAC;AAC5B,CAAC;AAED,MAAM,cAAc,GAAG;IACtB,QAAQ;IACR,eAAe;IACf,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,MAAM;IACN,MAAM;CACN,CAAC;AAEF,MAAM,eAAe,GAAG;IACvB,SAAS;IACT,QAAQ;IACR,SAAS;IACT,aAAa;IACb,YAAY;IACZ,cAAc;IACd,cAAc;IACd,SAAS;IACT,QAAQ;IACR,WAAW;IACX,SAAS;IACT,YAAY;IACZ,YAAY;IACZ,YAAY;CACZ,CAAC;AAEF,MAAM,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC;AAC9C,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAE5B,MAAM,UAAU,eAAe,CAAC,IAAa;IAC5C,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAC7D,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;IACjC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,CAAC;IACzD,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC;IAExC,MAAM,QAAQ,GAAG,kBAAkB,EAAE,CAAC;IACtC,IAAI,CAAC,QAAQ;QAAE,OAAO,EAAE,CAAC;IACzB,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE;QACtC,YAAY,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE;QAC7C,WAAW,EAAE,cAAc;QAC3B,WAAW,EAAE,eAAe;QAC5B,uBAAuB,EAAE,KAAK;QAC9B,mBAAmB,EAAE,KAAK;KAC1B,CAAC,CAAC;IACH,MAAM,GAAG,GAAG,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;IACvE,IAAI,WAAW,CAAC,IAAI,IAAI,gBAAgB,EAAE,CAAC;QAC1C,uEAAuE;QACvE,0DAA0D;QAC1D,MAAM,IAAI,GAAG,CAAC,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;QACrC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7C,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7B,CAAC;IACF,CAAC;IACD,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC3B,OAAO,GAAG,CAAC;AACZ,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,2BAA2B;IAC1C,mBAAmB,GAAG,IAAI,CAAC;IAC3B,WAAW,CAAC,KAAK,EAAE,CAAC;AACrB,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Validate that an external stylesheet URL supplied via
3
+ * `<pie-item-player external-style-urls="...">` (or the
4
+ * `itemConfig.resources.stylesheets[*].url` path) is safe to load.
5
+ *
6
+ * - Only `http:` / `https:` are allowed; `javascript:`, `data:`, `file:`
7
+ * and custom schemes are rejected.
8
+ * - When `allowedOrigins` is non-empty, the URL's origin must match one
9
+ * of the listed origins. This lets hosts restrict style loading to a
10
+ * known CDN allow-list.
11
+ */
12
+ export type StyleUrlValidationOk = {
13
+ ok: true;
14
+ resolvedUrl: URL;
15
+ };
16
+ export type StyleUrlValidationError = {
17
+ ok: false;
18
+ reason: "invalid-url" | "disallowed-protocol" | "disallowed-origin";
19
+ message: string;
20
+ };
21
+ export type StyleUrlValidationResult = StyleUrlValidationOk | StyleUrlValidationError;
22
+ export interface StyleUrlValidationOptions {
23
+ baseUrl?: string;
24
+ allowedOrigins?: string[];
25
+ }
26
+ export declare function validateExternalStyleUrl(url: unknown, options?: StyleUrlValidationOptions): StyleUrlValidationResult;
27
+ export declare function parseAllowedStyleOrigins(raw: unknown): string[];
28
+ //# sourceMappingURL=validate-style-url.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-style-url.d.ts","sourceRoot":"","sources":["../../src/security/validate-style-url.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,MAAM,oBAAoB,GAAG;IAClC,EAAE,EAAE,IAAI,CAAC;IACT,WAAW,EAAE,GAAG,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACrC,EAAE,EAAE,KAAK,CAAC;IACV,MAAM,EAAE,aAAa,GAAG,qBAAqB,GAAG,mBAAmB,CAAC;IACpE,OAAO,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,wBAAwB,GACjC,oBAAoB,GACpB,uBAAuB,CAAC;AAE3B,MAAM,WAAW,yBAAyB;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,wBAAgB,wBAAwB,CACvC,GAAG,EAAE,OAAO,EACZ,OAAO,GAAE,yBAA8B,GACrC,wBAAwB,CAoC1B;AAED,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,EAAE,CAM/D"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Validate that an external stylesheet URL supplied via
3
+ * `<pie-item-player external-style-urls="...">` (or the
4
+ * `itemConfig.resources.stylesheets[*].url` path) is safe to load.
5
+ *
6
+ * - Only `http:` / `https:` are allowed; `javascript:`, `data:`, `file:`
7
+ * and custom schemes are rejected.
8
+ * - When `allowedOrigins` is non-empty, the URL's origin must match one
9
+ * of the listed origins. This lets hosts restrict style loading to a
10
+ * known CDN allow-list.
11
+ */
12
+ export function validateExternalStyleUrl(url, options = {}) {
13
+ if (typeof url !== "string" || url.length === 0) {
14
+ return {
15
+ ok: false,
16
+ reason: "invalid-url",
17
+ message: "External stylesheet URL must be a non-empty string.",
18
+ };
19
+ }
20
+ let resolvedUrl;
21
+ try {
22
+ resolvedUrl = options.baseUrl
23
+ ? new URL(url, options.baseUrl)
24
+ : new URL(url);
25
+ }
26
+ catch (err) {
27
+ return {
28
+ ok: false,
29
+ reason: "invalid-url",
30
+ message: `External stylesheet URL could not be parsed: ${String(err)}`,
31
+ };
32
+ }
33
+ if (resolvedUrl.protocol !== "http:" && resolvedUrl.protocol !== "https:") {
34
+ return {
35
+ ok: false,
36
+ reason: "disallowed-protocol",
37
+ message: `External stylesheet protocol ${resolvedUrl.protocol} is not allowed (only http/https).`,
38
+ };
39
+ }
40
+ const allowed = options.allowedOrigins ?? [];
41
+ if (allowed.length > 0 && !allowed.includes(resolvedUrl.origin)) {
42
+ return {
43
+ ok: false,
44
+ reason: "disallowed-origin",
45
+ message: `External stylesheet origin ${resolvedUrl.origin} is not in the configured allow-list.`,
46
+ };
47
+ }
48
+ return { ok: true, resolvedUrl };
49
+ }
50
+ export function parseAllowedStyleOrigins(raw) {
51
+ if (typeof raw !== "string" || raw.length === 0)
52
+ return [];
53
+ return raw
54
+ .split(",")
55
+ .map((entry) => entry.trim())
56
+ .filter((entry) => entry.length > 0);
57
+ }
58
+ //# sourceMappingURL=validate-style-url.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-style-url.js","sourceRoot":"","sources":["../../src/security/validate-style-url.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAsBH,MAAM,UAAU,wBAAwB,CACvC,GAAY,EACZ,UAAqC,EAAE;IAEvC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjD,OAAO;YACN,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,aAAa;YACrB,OAAO,EAAE,qDAAqD;SAC9D,CAAC;IACH,CAAC;IACD,IAAI,WAAgB,CAAC;IACrB,IAAI,CAAC;QACJ,WAAW,GAAG,OAAO,CAAC,OAAO;YAC5B,CAAC,CAAC,IAAI,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,CAAC;YAC/B,CAAC,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IACjB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,OAAO;YACN,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,aAAa;YACrB,OAAO,EAAE,gDAAgD,MAAM,CAAC,GAAG,CAAC,EAAE;SACtE,CAAC;IACH,CAAC;IACD,IAAI,WAAW,CAAC,QAAQ,KAAK,OAAO,IAAI,WAAW,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC3E,OAAO;YACN,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,qBAAqB;YAC7B,OAAO,EAAE,gCAAgC,WAAW,CAAC,QAAQ,oCAAoC;SACjG,CAAC;IACH,CAAC;IACD,MAAM,OAAO,GAAG,OAAO,CAAC,cAAc,IAAI,EAAE,CAAC;IAC7C,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;QACjE,OAAO;YACN,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,mBAAmB;YAC3B,OAAO,EAAE,8BAA8B,WAAW,CAAC,MAAM,uCAAuC;SAChG,CAAC;IACH,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,GAAY;IACpD,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAC3D,OAAO,GAAG;SACR,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;SAC5B,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACvC,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Wraps authored `<img>` elements with a horizontally scrollable container so
3
+ * images that are wider than their column surface a scrollbar instead of being
4
+ * clipped by ancestor `overflow-x: hidden` regions (PIE-94).
5
+ *
6
+ * The wrapper is rendered as
7
+ * `<span class="pie-image-scroll" tabindex="0" role="region" aria-label="...">`
8
+ * and receives the accompanying CSS from `@pie-players/pie-theme`. The CSS uses
9
+ * `overflow-x: auto` so small images stay visually unchanged: a scrollbar only
10
+ * appears when the image's intrinsic width exceeds the wrapper's available
11
+ * space (including at higher browser-zoom levels, which is the original driver
12
+ * for this change — WCAG 1.4.10 Reflow at 400% zoom).
13
+ *
14
+ * This helper runs as a post-sanitization step inside `sanitizeItemMarkup`, so
15
+ * every host that renders authored markup through the shared
16
+ * `pie-item-player` (including the section player) benefits uniformly.
17
+ */
18
+ /**
19
+ * Wrap `<img>` elements in `markup` with a horizontal-scroll container.
20
+ *
21
+ * - No-ops on empty input.
22
+ * - No-ops during SSR (no `window` / `DOMParser`) — the markup is returned
23
+ * unchanged; the browser re-run on hydrate will perform the wrap.
24
+ * - Idempotent: images whose direct parent already carries the
25
+ * `pie-image-scroll` class are left alone.
26
+ * - Leaves images inside PIE custom elements (`<pie-*>`) alone. Those are
27
+ * rendered by the element's own template / shadow DOM and should not be
28
+ * restructured by the authored-markup pipeline.
29
+ */
30
+ export declare function wrapOverwideImages(markup: string): string;
31
+ //# sourceMappingURL=wrap-overwide-images.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wrap-overwide-images.d.ts","sourceRoot":"","sources":["../../src/security/wrap-overwide-images.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAyBH;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAqDzD"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Wraps authored `<img>` elements with a horizontally scrollable container so
3
+ * images that are wider than their column surface a scrollbar instead of being
4
+ * clipped by ancestor `overflow-x: hidden` regions (PIE-94).
5
+ *
6
+ * The wrapper is rendered as
7
+ * `<span class="pie-image-scroll" tabindex="0" role="region" aria-label="...">`
8
+ * and receives the accompanying CSS from `@pie-players/pie-theme`. The CSS uses
9
+ * `overflow-x: auto` so small images stay visually unchanged: a scrollbar only
10
+ * appears when the image's intrinsic width exceeds the wrapper's available
11
+ * space (including at higher browser-zoom levels, which is the original driver
12
+ * for this change — WCAG 1.4.10 Reflow at 400% zoom).
13
+ *
14
+ * This helper runs as a post-sanitization step inside `sanitizeItemMarkup`, so
15
+ * every host that renders authored markup through the shared
16
+ * `pie-item-player` (including the section player) benefits uniformly.
17
+ */
18
+ const PIE_CUSTOM_ELEMENT_TAG_REGEX = /^pie-/i;
19
+ const SCROLL_WRAPPER_CLASS = "pie-image-scroll";
20
+ function isInsidePieCustomElement(image, root) {
21
+ let ancestor = image.parentElement;
22
+ while (ancestor && ancestor !== root) {
23
+ if (PIE_CUSTOM_ELEMENT_TAG_REGEX.test(ancestor.tagName)) {
24
+ return true;
25
+ }
26
+ ancestor = ancestor.parentElement;
27
+ }
28
+ return false;
29
+ }
30
+ function buildAriaLabel(image) {
31
+ const alt = image.getAttribute("alt");
32
+ const trimmed = alt ? alt.trim() : "";
33
+ return trimmed ? `Scrollable image: ${trimmed}` : "Scrollable image";
34
+ }
35
+ /**
36
+ * Wrap `<img>` elements in `markup` with a horizontal-scroll container.
37
+ *
38
+ * - No-ops on empty input.
39
+ * - No-ops during SSR (no `window` / `DOMParser`) — the markup is returned
40
+ * unchanged; the browser re-run on hydrate will perform the wrap.
41
+ * - Idempotent: images whose direct parent already carries the
42
+ * `pie-image-scroll` class are left alone.
43
+ * - Leaves images inside PIE custom elements (`<pie-*>`) alone. Those are
44
+ * rendered by the element's own template / shadow DOM and should not be
45
+ * restructured by the authored-markup pipeline.
46
+ */
47
+ export function wrapOverwideImages(markup) {
48
+ if (!markup)
49
+ return "";
50
+ // Fast path: avoid the DOM round-trip entirely when the markup carries no
51
+ // images. Keeps the sanitize pipeline cheap for the common case.
52
+ if (!/<img\b/i.test(markup))
53
+ return markup;
54
+ if (typeof window === "undefined" || !window.document)
55
+ return markup;
56
+ const ParserCtor = typeof DOMParser !== "undefined"
57
+ ? DOMParser
58
+ : window.DOMParser;
59
+ if (!ParserCtor)
60
+ return markup;
61
+ const doc = new ParserCtor().parseFromString(`<!DOCTYPE html><html><body>${markup}</body></html>`, "text/html");
62
+ const body = doc.body;
63
+ if (!body)
64
+ return markup;
65
+ const images = Array.from(body.querySelectorAll("img"));
66
+ if (images.length === 0)
67
+ return markup;
68
+ let mutated = false;
69
+ for (const image of images) {
70
+ const parent = image.parentElement;
71
+ if (!parent)
72
+ continue;
73
+ // Idempotency — already wrapped.
74
+ if (parent.classList &&
75
+ parent.classList.contains(SCROLL_WRAPPER_CLASS)) {
76
+ continue;
77
+ }
78
+ // Leave PIE custom-element internals alone.
79
+ if (isInsidePieCustomElement(image, body))
80
+ continue;
81
+ const wrapper = doc.createElement("span");
82
+ wrapper.className = SCROLL_WRAPPER_CLASS;
83
+ wrapper.setAttribute("tabindex", "0");
84
+ wrapper.setAttribute("role", "region");
85
+ wrapper.setAttribute("aria-label", buildAriaLabel(image));
86
+ parent.insertBefore(wrapper, image);
87
+ wrapper.appendChild(image);
88
+ mutated = true;
89
+ }
90
+ return mutated ? body.innerHTML : markup;
91
+ }
92
+ //# sourceMappingURL=wrap-overwide-images.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wrap-overwide-images.js","sourceRoot":"","sources":["../../src/security/wrap-overwide-images.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ type NpmFetch = (input: RequestInfo | URL, init?: RequestInit) => Promise<Response>;
2
+ /**
3
+ * Server-only helper for npm package version lookups.
4
+ * Do not import this module from browser-executed code.
5
+ */
6
+ export declare const getNpmPackageVersions: (element: string, fetch: NpmFetch, filter?: (v: string) => boolean, limit?: number, searchTerm?: string) => Promise<string[]>;
7
+ export {};
8
+ //# sourceMappingURL=npm-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"npm-registry.d.ts","sourceRoot":"","sources":["../../src/server/npm-registry.ts"],"names":[],"mappings":"AAiBA,KAAK,QAAQ,GAAG,CACf,KAAK,EAAE,WAAW,GAAG,GAAG,EACxB,IAAI,CAAC,EAAE,WAAW,KACd,OAAO,CAAC,QAAQ,CAAC,CAAC;AAEvB;;;GAGG;AACH,eAAO,MAAM,qBAAqB,GACjC,SAAS,MAAM,EACf,OAAO,QAAQ,EACf,SAAQ,CAAC,CAAC,EAAE,MAAM,KAAK,OAAwB,EAC/C,QAAQ,MAAM,EACd,mBAAe,KACb,OAAO,CAAC,MAAM,EAAE,CA6DlB,CAAC"}