@datamoc/mw_games 0.38.0 → 0.40.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/CHANGELOG.md +75 -0
  2. package/api-surface.json +500 -2
  3. package/data/microgm-opt.PROVENANCE.md +20 -0
  4. package/data/microgm-opt.sf2 +0 -0
  5. package/dist/assets/SvgParts.d.ts +31 -0
  6. package/dist/assets/SvgParts.d.ts.map +1 -0
  7. package/dist/assets/SvgParts.js +54 -0
  8. package/dist/assets/SvgParts.js.map +1 -0
  9. package/dist/assets/SvgSource.d.ts +3 -0
  10. package/dist/assets/SvgSource.d.ts.map +1 -0
  11. package/dist/assets/SvgSource.js +22 -0
  12. package/dist/assets/SvgSource.js.map +1 -0
  13. package/dist/assets/index.d.ts +2 -0
  14. package/dist/assets/index.d.ts.map +1 -1
  15. package/dist/assets/index.js +1 -0
  16. package/dist/assets/index.js.map +1 -1
  17. package/dist/assets/svg.d.ts.map +1 -1
  18. package/dist/assets/svg.js +9 -5
  19. package/dist/assets/svg.js.map +1 -1
  20. package/dist/mw_games.global.js +110 -110
  21. package/dist/mwl/presentation.d.ts.map +1 -1
  22. package/dist/mwl/presentation.js +25 -18
  23. package/dist/mwl/presentation.js.map +1 -1
  24. package/dist/physics/PhysicsWorld.d.ts +49 -17
  25. package/dist/physics/PhysicsWorld.d.ts.map +1 -1
  26. package/dist/physics/PhysicsWorld.js +297 -59
  27. package/dist/physics/PhysicsWorld.js.map +1 -1
  28. package/dist/physics/XpbdWorld.d.ts +1 -1
  29. package/dist/physics/XpbdWorld.js +1 -1
  30. package/dist/physics/cloth/index.d.ts +98 -0
  31. package/dist/physics/cloth/index.d.ts.map +1 -0
  32. package/dist/physics/cloth/index.js +207 -0
  33. package/dist/physics/cloth/index.js.map +1 -0
  34. package/dist/physics/index.d.ts +4 -0
  35. package/dist/physics/index.d.ts.map +1 -1
  36. package/dist/physics/index.js +2 -0
  37. package/dist/physics/index.js.map +1 -1
  38. package/dist/physics/spring/index.d.ts +90 -0
  39. package/dist/physics/spring/index.d.ts.map +1 -0
  40. package/dist/physics/spring/index.js +97 -0
  41. package/dist/physics/spring/index.js.map +1 -0
  42. package/dist/skeleton/index.d.ts +94 -13
  43. package/dist/skeleton/index.d.ts.map +1 -1
  44. package/dist/skeleton/index.js +192 -73
  45. package/dist/skeleton/index.js.map +1 -1
  46. package/dist/two-d/presentation/MwlPresentation.d.ts +12 -0
  47. package/dist/two-d/presentation/MwlPresentation.d.ts.map +1 -1
  48. package/dist/two-d/presentation/MwlPresentation.js +204 -153
  49. package/dist/two-d/presentation/MwlPresentation.js.map +1 -1
  50. package/dist/two-d/render/ClothSprite.d.ts +83 -0
  51. package/dist/two-d/render/ClothSprite.d.ts.map +1 -0
  52. package/dist/two-d/render/ClothSprite.js +105 -0
  53. package/dist/two-d/render/ClothSprite.js.map +1 -0
  54. package/dist/two-d/render/HazeLayer.d.ts +112 -0
  55. package/dist/two-d/render/HazeLayer.d.ts.map +1 -0
  56. package/dist/two-d/render/HazeLayer.js +185 -0
  57. package/dist/two-d/render/HazeLayer.js.map +1 -0
  58. package/dist/two-d/render/NeonGlow.d.ts +100 -0
  59. package/dist/two-d/render/NeonGlow.d.ts.map +1 -0
  60. package/dist/two-d/render/NeonGlow.js +183 -0
  61. package/dist/two-d/render/NeonGlow.js.map +1 -0
  62. package/dist/two-d/render/SkeletalSprite.d.ts +5 -2
  63. package/dist/two-d/render/SkeletalSprite.d.ts.map +1 -1
  64. package/dist/two-d/render/SkeletalSprite.js +27 -3
  65. package/dist/two-d/render/SkeletalSprite.js.map +1 -1
  66. package/dist/two-d/render/SpringSprite.d.ts +40 -0
  67. package/dist/two-d/render/SpringSprite.d.ts.map +1 -0
  68. package/dist/two-d/render/SpringSprite.js +39 -0
  69. package/dist/two-d/render/SpringSprite.js.map +1 -0
  70. package/dist/two-d/render/SpriteDeform.d.ts +156 -0
  71. package/dist/two-d/render/SpriteDeform.d.ts.map +1 -0
  72. package/dist/two-d/render/SpriteDeform.js +278 -0
  73. package/dist/two-d/render/SpriteDeform.js.map +1 -0
  74. package/dist/two-d/render/SvgSkeleton.d.ts +54 -0
  75. package/dist/two-d/render/SvgSkeleton.d.ts.map +1 -0
  76. package/dist/two-d/render/SvgSkeleton.js +112 -0
  77. package/dist/two-d/render/SvgSkeleton.js.map +1 -0
  78. package/dist/two-d/render/index.d.ts +12 -0
  79. package/dist/two-d/render/index.d.ts.map +1 -1
  80. package/dist/two-d/render/index.js +6 -0
  81. package/dist/two-d/render/index.js.map +1 -1
  82. package/dist/version.d.ts +1 -1
  83. package/dist/version.js +1 -1
  84. package/package.json +11 -7
  85. package/sbom.cdx.json +6 -58
  86. package/tools/asset-report.d.mts +37 -0
  87. package/tools/asset-report.mjs +157 -0
  88. package/tools/compile-resources.d.mts +24 -0
  89. package/tools/compile-resources.mjs +138 -5
  90. package/tools/emit-page.d.mts +9 -1
  91. package/tools/emit-page.mjs +31 -3
  92. package/tools/vite.mjs +6 -1
@@ -0,0 +1,20 @@
1
+ # microgm-opt SoundFont provenance
2
+
3
+ `microgm-opt.sf2` is a small General MIDI SoundFont (2,629,640 bytes, 137 presets)
4
+ supplied for this repository as the smallest usable GM bank found so far. Its INFO
5
+ chunk names the bank `microgm-opt`, the engineer `michael`, the sound engine
6
+ `EMU8000`, the comment `gm soundfont for tiny devices`, and the tool `Polyphone`.
7
+
8
+ Licence: WTFPL (Do What The F*** You Want To Public License,
9
+ https://www.wtfpl.net/), confirmed by the project owner in October 2026. The
10
+ file's own INFO chunk states no licence, so this note is the record of that
11
+ confirmation. The bank keeps its WTFPL terms; it is not relicensed under this
12
+ project's MPL-2.0.
13
+
14
+ The bank ships in the published npm package (`package.json`'s `files` list), so
15
+ a game copies `data/microgm-opt.sf2` from the installed package into its own
16
+ asset folder and lets the build do the rest: `tools/compile-resources` embeds
17
+ only the programs the game's shipped MIDI files use, so a game that plays a
18
+ handful of instruments carries tens of kilobytes of the bank instead of the
19
+ whole file (see `tests/compile-resources.test.ts`, which subsets this bank
20
+ against a three-program MIDI file).
Binary file
@@ -0,0 +1,31 @@
1
+ import type { Texture2D } from '../two-d/render/Types2D.ts';
2
+ export interface SvgPartsOptions {
3
+ /** Rasterization multiple; logical texture dimensions remain in SVG units. */
4
+ resolution?: number;
5
+ /** Only these top-level named groups; unknown names are errors. */
6
+ groups?: readonly string[];
7
+ }
8
+ /**
9
+ * Slice named SVG groups into cached textures, without game-owned renderer calls.
10
+ * Accepts inert SVG source or an asset path (compiled data URIs work under file://).
11
+ * Shared definitions, styles, group attributes and the full viewBox are retained.
12
+ * The cache belongs to Pixi Assets: consumers borrow textures and release them with
13
+ * releaseSvgParts once no sprite uses them. Different resolutions have separate entries.
14
+ * @example
15
+ * ```ts
16
+ * import { loadSvgParts, releaseSvgParts } from '@datamoc/mw_games/assets';
17
+ * const parts = await loadSvgParts('<svg xmlns="http://www.w3.org/2000/svg" width="20" height="10"><g id="body"><rect width="20" height="10"/></g></svg>', { resolution: 2 });
18
+ * console.log(parts.body.width);
19
+ * await releaseSvgParts(parts);
20
+ * ```
21
+ */
22
+ export declare function loadSvgParts(source: string, options?: SvgPartsOptions): Promise<Readonly<Record<string, Texture2D>>>;
23
+ /** Release borrowed SVG part textures after their sprites have been destroyed.
24
+ * @example
25
+ * ```ts
26
+ * import { releaseSvgParts } from '@datamoc/mw_games/assets';
27
+ * await releaseSvgParts({});
28
+ * ```
29
+ */
30
+ export declare function releaseSvgParts(parts: Readonly<Record<string, Texture2D>>): Promise<void>;
31
+ //# sourceMappingURL=SvgParts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SvgParts.d.ts","sourceRoot":"","sources":["../../src/assets/SvgParts.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAM5D,MAAM,WAAW,eAAe;IAC/B,8EAA8E;IAC9E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mEAAmE;IACnE,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC3B;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,YAAY,CACjC,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,eAAoB,GAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,CAe9C;AAED;;;;;;GAMG;AACH,wBAAsB,eAAe,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ/F"}
@@ -0,0 +1,54 @@
1
+ import { Assets } from 'pixi.js';
2
+ import { readSvgSource } from './SvgSource.js';
3
+ import { splitSvgGroups, svgDataUri } from './svg.js';
4
+ const aliases = new WeakMap();
5
+ /**
6
+ * Slice named SVG groups into cached textures, without game-owned renderer calls.
7
+ * Accepts inert SVG source or an asset path (compiled data URIs work under file://).
8
+ * Shared definitions, styles, group attributes and the full viewBox are retained.
9
+ * The cache belongs to Pixi Assets: consumers borrow textures and release them with
10
+ * releaseSvgParts once no sprite uses them. Different resolutions have separate entries.
11
+ * @example
12
+ * ```ts
13
+ * import { loadSvgParts, releaseSvgParts } from '@datamoc/mw_games/assets';
14
+ * const parts = await loadSvgParts('<svg xmlns="http://www.w3.org/2000/svg" width="20" height="10"><g id="body"><rect width="20" height="10"/></g></svg>', { resolution: 2 });
15
+ * console.log(parts.body.width);
16
+ * await releaseSvgParts(parts);
17
+ * ```
18
+ */
19
+ export async function loadSvgParts(source, options = {}) {
20
+ const resolution = options.resolution ?? 1;
21
+ if (!Number.isFinite(resolution) || resolution <= 0)
22
+ throw new Error('SVG parts need a positive finite resolution');
23
+ const svg = await readSvgSource(source);
24
+ const groups = splitSvgGroups(svg);
25
+ const names = options.groups ?? Object.keys(groups);
26
+ for (const name of names)
27
+ if (!Object.hasOwn(groups, name))
28
+ throw new Error(`SVG parts unknown group ${name}`);
29
+ const parts = Object.create(null);
30
+ for (const name of names) {
31
+ const src = svgDataUri(groups[name].replace('</svg>', `<!-- mwg-resolution:${resolution} --></svg>`));
32
+ const alias = `mwg-svg-part:${resolution}:${src}`;
33
+ parts[name] = await Assets.load({ alias, src, format: 'svg', data: { resolution } });
34
+ aliases.set(parts[name], alias);
35
+ }
36
+ return Object.freeze(parts);
37
+ }
38
+ /** Release borrowed SVG part textures after their sprites have been destroyed.
39
+ * @example
40
+ * ```ts
41
+ * import { releaseSvgParts } from '@datamoc/mw_games/assets';
42
+ * await releaseSvgParts({});
43
+ * ```
44
+ */
45
+ export async function releaseSvgParts(parts) {
46
+ for (const texture of new Set(Object.values(parts))) {
47
+ const alias = aliases.get(texture);
48
+ if (alias) {
49
+ await Assets.unload(alias);
50
+ aliases.delete(texture);
51
+ }
52
+ }
53
+ }
54
+ //# sourceMappingURL=SvgParts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SvgParts.js","sourceRoot":"","sources":["../../src/assets/SvgParts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEjC,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEtD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAqB,CAAC;AASjD;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CACjC,MAAc,EACd,OAAO,GAAoB,EAAE;IAE7B,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,CAAC,CAAC;IAC3C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,UAAU,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACpH,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IACnC,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACpD,KAAK,MAAM,IAAI,IAAI,KAAK;QAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,IAAI,EAAE,CAAC,CAAC;IAC/G,MAAM,KAAK,GAA8B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC7D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,uBAAuB,UAAU,YAAY,CAAC,CAAC,CAAC;QACtG,MAAM,KAAK,GAAG,gBAAgB,UAAU,IAAI,GAAG,EAAE,CAAC;QAClD,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,MAAM,CAAC,IAAI,CAAY,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;QAChG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;IACjC,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC7B,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,KAA0C;IAC/E,KAAK,MAAM,OAAO,IAAI,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;QACrD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACnC,IAAI,KAAK,EAAE,CAAC;YACX,MAAM,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC3B,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACzB,CAAC;IACF,CAAC;AACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** Shared source loading for SVG parts and skeletal artwork, including compiled data URIs. */
2
+ export declare function readSvgSource(source: string): Promise<string>;
3
+ //# sourceMappingURL=SvgSource.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SvgSource.d.ts","sourceRoot":"","sources":["../../src/assets/SvgSource.ts"],"names":[],"mappings":"AAGA,8FAA8F;AAC9F,wBAAsB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAcnE"}
@@ -0,0 +1,22 @@
1
+ import { resolve } from './paths.js';
2
+ import { sanitizeSvg } from './svg.js';
3
+ /** Shared source loading for SVG parts and skeletal artwork, including compiled data URIs. */
4
+ export async function readSvgSource(source) {
5
+ if (source.trimStart().startsWith('<'))
6
+ return sanitizeSvg(source);
7
+ const url = resolve(source);
8
+ if (url.startsWith('data:')) {
9
+ const comma = url.indexOf(',');
10
+ if (comma < 0)
11
+ throw new Error(`invalid SVG data URI for ${source}`);
12
+ const text = /;base64/i.test(url.slice(0, comma))
13
+ ? new TextDecoder().decode(Uint8Array.from(atob(url.slice(comma + 1)), (c) => c.charCodeAt(0)))
14
+ : decodeURIComponent(url.slice(comma + 1));
15
+ return sanitizeSvg(text);
16
+ }
17
+ const response = await fetch(url);
18
+ if (!response.ok)
19
+ throw new Error(`SVG failed to load ${source}: ${response.status}`);
20
+ return sanitizeSvg(await response.text());
21
+ }
22
+ //# sourceMappingURL=SvgSource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SvgSource.js","sourceRoot":"","sources":["../../src/assets/SvgSource.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvC,8FAA8F;AAC9F,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,MAAc;IACjD,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC;IACnE,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5B,IAAI,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,KAAK,GAAG,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,MAAM,EAAE,CAAC,CAAC;QACrE,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;YAChD,CAAC,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/F,CAAC,CAAC,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;QAC5C,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,CAAC,QAAQ,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,MAAM,KAAK,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACtF,OAAO,WAAW,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;AAC3C,CAAC"}
@@ -22,4 +22,6 @@ export { AssetStream } from './Streaming.ts';
22
22
  export type { AssetBundle, AssetStreamOptions } from './Streaming.ts';
23
23
  export { fetchWithByteProgress } from './ByteProgress.ts';
24
24
  export type { ByteProgress, OnByteProgress } from './ByteProgress.ts';
25
+ export { loadSvgParts, releaseSvgParts } from './SvgParts.ts';
26
+ export type { SvgPartsOptions } from './SvgParts.ts';
25
27
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/assets/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACnF,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACpE,YAAY,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEnF,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AACrF,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACzD,YAAY,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/assets/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACnF,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACpE,YAAY,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEnF,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AACrF,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACzD,YAAY,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEtE,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAC9D,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC"}
@@ -16,4 +16,5 @@ export { loadBinary, getBinary, isBinaryLoaded, releaseBinary } from './binary.j
16
16
  export { sanitizeSvg, svgScaleVariants, svgDataUri, splitSvgGroups } from './svg.js';
17
17
  export { AssetStream } from './Streaming.js';
18
18
  export { fetchWithByteProgress } from './ByteProgress.js';
19
+ export { loadSvgParts, releaseSvgParts } from './SvgParts.js';
19
20
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/assets/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAGnF,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGpE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEnF,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAIrF,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/assets/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAGnF,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGpE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEnF,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAIrF,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAG1D,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"svg.d.ts","sourceRoot":"","sources":["../../src/assets/svg.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAcH;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAIlD;AAED,MAAM,WAAW,YAAY;IAC5B,2EAA2E;IAC3E,IAAI,EAAE,MAAM,CAAC;IACb,qFAAqF;IACrF,UAAU,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,6DAA6D;IAC7D,GAAG,EAAE,MAAM,CAAC;IACZ,qEAAqE;IACrE,UAAU,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;GASG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED;;;;GAIG;AACH;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,YAAY,EAAE,GAAG,UAAU,EAAE,CAa9F;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA2CrE"}
1
+ {"version":3,"file":"svg.d.ts","sourceRoot":"","sources":["../../src/assets/svg.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAcH;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAIlD;AAED,MAAM,WAAW,YAAY;IAC5B,2EAA2E;IAC3E,IAAI,EAAE,MAAM,CAAC;IACb,qFAAqF;IACrF,UAAU,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,6DAA6D;IAC7D,GAAG,EAAE,MAAM,CAAC;IACZ,qEAAqE;IACrE,UAAU,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;GASG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED;;;;GAIG;AACH;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,YAAY,EAAE,GAAG,UAAU,EAAE,CAa9F;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA8CrE"}
@@ -110,8 +110,10 @@ export function splitSvgGroups(source) {
110
110
  const close = inert.lastIndexOf('</svg>');
111
111
  if (!root || close < 0)
112
112
  throw new Error('SVG group split needs an <svg> root');
113
- const body = inert.slice(root[0].length, close);
114
- const parts = {};
113
+ const rawBody = inert.slice(root[0].length, close);
114
+ const shared = [...rawBody.matchAll(/<(defs|style)\b[^>]*>[\s\S]*?<\/\1\s*>/gi)].map((match) => match[0]).join('');
115
+ const body = rawBody.replace(/<(defs|style)\b[^>]*>[\s\S]*?<\/\1\s*>/gi, '');
116
+ const parts = Object.create(null);
115
117
  let position = 0;
116
118
  while (position < body.length) {
117
119
  const open = /<g\b([^>]*?)(\/?)>/i.exec(body.slice(position));
@@ -126,7 +128,7 @@ export function splitSvgGroups(source) {
126
128
  throw new Error('SVG group split refuses a group with no id');
127
129
  if (id in parts)
128
130
  throw new Error(`SVG group split refuses a duplicate id ${id}`);
129
- parts[id] = `${root[0]}</svg>`;
131
+ parts[id] = `${root[0]}${shared}${open[0]}</svg>`;
130
132
  position = contentStart;
131
133
  continue;
132
134
  }
@@ -143,17 +145,19 @@ export function splitSvgGroups(source) {
143
145
  if (depth === 0)
144
146
  closer = next[0];
145
147
  }
146
- else
148
+ else if (!/\/\s*>$/.test(next[0]))
147
149
  depth++;
148
150
  cursor += next.index + next[0].length;
149
151
  }
152
+ if (depth !== 0)
153
+ throw new Error(`SVG group ${id ?? '<unnamed>'} never closes`);
150
154
  const content = body.slice(contentStart, cursor - closer.length);
151
155
  position = cursor;
152
156
  if (!id)
153
157
  throw new Error('SVG group split refuses a group with no id');
154
158
  if (id in parts)
155
159
  throw new Error(`SVG group split refuses a duplicate id ${id}`);
156
- parts[id] = `${root[0]}${content}</svg>`;
160
+ parts[id] = `${root[0]}${shared}${open[0]}${content}</g></svg>`;
157
161
  }
158
162
  if (Object.keys(parts).length === 0)
159
163
  throw new Error('SVG group split found no named groups');
@@ -1 +1 @@
1
- {"version":3,"file":"svg.js","sourceRoot":"","sources":["../../src/assets/svg.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"svg.js","sourceRoot":"","sources":["../../src/assets/svg.ts"],"names":[],"mappings":"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"}