jailedthreejs 0.9.2-beta.2 → 0.9.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -31,21 +31,7 @@ Notes:
31
31
  - `convict.classList` is a JailedThreeJS compatibility alias (not native Three.js API).
32
32
  - `convict.userData.domId` and `convict.userData.classList` are also maintained.
33
33
 
34
- ## Installation
35
-
36
- ```bash
37
- npm install
38
- ```
39
-
40
- For local development in this repo:
41
-
42
- ```bash
43
- npm run dev
44
- ```
45
-
46
- This project uses Vite with `src/` as the root.
47
-
48
- ## npm Package Usage
34
+ ## Install
49
35
 
50
36
  Install with `three`:
51
37
 
@@ -62,7 +48,6 @@ import { JThree, Cell } from 'jailedthreejs';
62
48
  Package entrypoint notes:
63
49
 
64
50
  - npm publishes the library build from `dist/lib/`
65
- - the demo/test page build is separate (`dist/demo/`) and is not the npm entrypoint
66
51
 
67
52
  ## Minimal Example
68
53
 
@@ -228,29 +213,9 @@ Custom assets can be declared in CSS-like at-rules:
228
213
 
229
214
  Supported loader types include GLTF/GLB, FBX, textures, audio, MTL, and material JSON.
230
215
 
231
- ## Demo / Test Page
232
-
233
- `src/index.html` is a dedicated test/demo page for verifying runtime mapping and interaction behavior.
234
-
235
- It includes:
236
-
237
- - object selection
238
- - live DOM `id`/`class` mutation controls
239
- - runtime readout (`convict.name`, `convict.classList`, `userData.*`)
240
- - a mapping verification button
241
-
242
216
  ## Build Outputs
243
217
 
244
218
  - `npm run build:lib` -> builds the npm library package output to `dist/lib`
245
- - `npm run build:demo` -> builds the demo page to `dist/demo`
246
- - `npm run pack:check` -> runs `npm pack --dry-run` to inspect publish contents
247
-
248
- ## Manual Releases (npm + GitHub)
249
-
250
- - Beta releases publish with npm dist-tag `beta`
251
- - Stable releases publish with npm dist-tag `latest`
252
- - GitHub Releases are created manually from tags
253
- See `RELEASE.md` for the step-by-step checklist and command examples.
254
219
 
255
220
  ## Performance Notes (Current)
256
221
 
package/dist/lib/index.js CHANGED
@@ -308,35 +308,67 @@ function _get_Equation(timingFunction) {
308
308
  }
309
309
  return (t) => t;
310
310
  }
311
- function animateLerp(from, to, durationMs, onUpdate, onComplete, timingFunction = "linear") {
311
+ function animateLerp(from, to, durationMs, onUpdate, onComplete, timingFunction = "linear", signal = null) {
312
312
  const isAnimatable = (v) => typeof v === "number" || Array.isArray(v);
313
+ let rafId = 0;
314
+ let settled = false;
315
+ const finish = (shouldComplete, value = to) => {
316
+ if (settled) return;
317
+ settled = true;
318
+ if (rafId) {
319
+ cancelAnimationFrame(rafId);
320
+ rafId = 0;
321
+ }
322
+ if (signal && onAbort) {
323
+ signal.removeEventListener("abort", onAbort);
324
+ }
325
+ if (shouldComplete && onComplete) {
326
+ onComplete(value);
327
+ }
328
+ };
313
329
  const finishInstant = () => {
330
+ if (signal == null ? void 0 : signal.aborted) return;
314
331
  if (onUpdate) onUpdate(to, 1);
315
- if (onComplete) onComplete(to);
332
+ finish(true, to);
333
+ };
334
+ const onAbort = () => {
335
+ finish(false);
316
336
  };
337
+ if (signal == null ? void 0 : signal.aborted) {
338
+ return () => {
339
+ };
340
+ }
341
+ if (signal) {
342
+ signal.addEventListener("abort", onAbort, { once: true });
343
+ }
317
344
  if (!isAnimatable(from) || !isAnimatable(to)) {
318
345
  finishInstant();
319
- return;
346
+ return () => finish(false);
320
347
  }
321
348
  if (!Number.isFinite(durationMs) || durationMs <= 0) {
322
349
  finishInstant();
323
- return;
350
+ return () => finish(false);
324
351
  }
325
352
  const start = performance.now();
326
353
  const ease = _get_Equation(timingFunction);
327
354
  function step(now) {
355
+ if (settled || (signal == null ? void 0 : signal.aborted)) {
356
+ finish(false);
357
+ return;
358
+ }
328
359
  let t = (now - start) / durationMs;
329
360
  if (t >= 1) t = 1;
330
361
  const easedT = ease(t);
331
362
  const value = lerpValue(from, to, easedT, lerpNumber);
332
363
  if (onUpdate) onUpdate(value, easedT);
333
364
  if (t < 1) {
334
- requestAnimationFrame(step);
335
- } else if (onComplete) {
336
- onComplete(value);
365
+ rafId = requestAnimationFrame(step);
366
+ } else {
367
+ finish(true, value);
337
368
  }
338
369
  }
339
- requestAnimationFrame(step);
370
+ rafId = requestAnimationFrame(step);
371
+ return () => finish(false);
340
372
  }
341
373
  function parseKeyframeTime(keyText, totalDuration) {
342
374
  if (!keyText) return 0;
@@ -354,9 +386,10 @@ function parseKeyframeTime(keyText, totalDuration) {
354
386
  const n = Number(text);
355
387
  return Number.isFinite(n) ? n : 0;
356
388
  }
357
- async function KeyFrameAnimationLerp(object, animationObj) {
389
+ async function KeyFrameAnimationLerp(object, animationObj, signal = null) {
358
390
  var _a;
359
391
  if (!object || !(animationObj == null ? void 0 : animationObj.name) || !(animationObj == null ? void 0 : animationObj.duration)) return;
392
+ if (signal == null ? void 0 : signal.aborted) return;
360
393
  const keyFramesRule = getAnimationMap(animationObj.name);
361
394
  if (!keyFramesRule || !keyFramesRule.cssRules) {
362
395
  console.error(`Animation "${animationObj.name}" not found or has no rules.`);
@@ -369,6 +402,7 @@ async function KeyFrameAnimationLerp(object, animationObj) {
369
402
  );
370
403
  const runOnce = async () => {
371
404
  for (let i = 0; i < rules.length - 1; i++) {
405
+ if (signal == null ? void 0 : signal.aborted) return;
372
406
  const fromRule = rules[i];
373
407
  const toRule = rules[i + 1];
374
408
  const t0 = parseKeyframeTime(fromRule.keyText, duration);
@@ -391,21 +425,41 @@ async function KeyFrameAnimationLerp(object, animationObj) {
391
425
  if (!keys.length) continue;
392
426
  await Promise.all(
393
427
  keys.map((key) => {
428
+ if (signal == null ? void 0 : signal.aborted) return Promise.resolve();
394
429
  const fromVal = fromProps[key];
395
430
  const toVal = toProps[key];
396
431
  const resolveValue = (v) => v && typeof v.then === "function" ? v : Promise.resolve(v);
397
432
  return Promise.all([resolveValue(fromVal), resolveValue(toVal)]).then(([resolvedFrom, resolvedTo]) => new Promise((resolve) => {
398
433
  var _a2;
434
+ if (signal == null ? void 0 : signal.aborted) {
435
+ resolve();
436
+ return;
437
+ }
438
+ let done = false;
439
+ const finish = () => {
440
+ if (done) return;
441
+ done = true;
442
+ if (signal && onAbort) {
443
+ signal.removeEventListener("abort", onAbort);
444
+ }
445
+ resolve();
446
+ };
447
+ const onAbort = () => finish();
448
+ if (signal) {
449
+ signal.addEventListener("abort", onAbort, { once: true });
450
+ }
399
451
  animateLerp(
400
452
  resolvedFrom,
401
453
  resolvedTo,
402
454
  segmentMs,
403
455
  (v) => {
456
+ if (signal == null ? void 0 : signal.aborted) return;
404
457
  const { parent, key: finalKey } = deep_searchParms(object, key.split("-"));
405
458
  exchange_rule(parent, finalKey, v);
406
459
  },
407
- resolve,
408
- ((_a2 = animationObj.timing) == null ? void 0 : _a2.fun) || "linear"
460
+ finish,
461
+ ((_a2 = animationObj.timing) == null ? void 0 : _a2.fun) || "linear",
462
+ signal
409
463
  );
410
464
  }));
411
465
  })
@@ -417,12 +471,13 @@ async function KeyFrameAnimationLerp(object, animationObj) {
417
471
  iterationCount = Infinity;
418
472
  }
419
473
  if (iterationCount === Infinity) {
420
- while (true) {
474
+ while (!(signal == null ? void 0 : signal.aborted)) {
421
475
  await runOnce();
422
476
  }
423
477
  } else {
424
478
  const total = Number(iterationCount) || 1;
425
479
  for (let i = 0; i < total; i++) {
480
+ if (signal == null ? void 0 : signal.aborted) return;
426
481
  await runOnce();
427
482
  }
428
483
  }
@@ -457,6 +512,25 @@ function getObjectClassSelectors(object) {
457
512
  function hasClassPseudoRule(object, pseudo) {
458
513
  return getObjectClassSelectors(object).some((cls) => getCSSRule(`.${cls}${pseudo}`));
459
514
  }
515
+ function animationConfigKey(animCfg) {
516
+ var _a, _b;
517
+ if (!animCfg) return null;
518
+ return [
519
+ animCfg.name || "",
520
+ animCfg.duration || 0,
521
+ ((_a = animCfg.timing) == null ? void 0 : _a.fun) || "linear",
522
+ ((_b = animCfg.iteration) == null ? void 0 : _b.count) ?? 1
523
+ ].join("|");
524
+ }
525
+ function stopObjectAnimation(object) {
526
+ var _a, _b;
527
+ const ctrl = (_a = object == null ? void 0 : object.userData) == null ? void 0 : _a._animationAbortController;
528
+ if (ctrl && typeof ctrl.abort === "function" && !((_b = ctrl.signal) == null ? void 0 : _b.aborted)) {
529
+ ctrl.abort();
530
+ }
531
+ object.userData._animationAbortController = null;
532
+ object.userData._animationRunning = false;
533
+ }
460
534
  function parseAnimationCSS(value) {
461
535
  if (!value) return null;
462
536
  const lower = value.trim().toLowerCase();
@@ -635,6 +709,7 @@ function _apply_rule(rule, object, _chosenOne = null) {
635
709
  if (!rule || !rule.style || !object) return;
636
710
  const domEl = object.userData.domEl;
637
711
  object.userData._lastCSS = object.userData._lastCSS || /* @__PURE__ */ Object.create(null);
712
+ let sawAnimationDeclaration = false;
638
713
  if ((domEl == null ? void 0 : domEl.hasAttribute("onclick")) || (domEl == null ? void 0 : domEl.hasAttribute("onmouseover")) || (domEl == null ? void 0 : domEl.hasAttribute("ondblclick")) || (domEl == null ? void 0 : domEl.hasAttribute("onmousedown")) || (domEl == null ? void 0 : domEl.hasAttribute("onmouseup")) || (domEl == null ? void 0 : domEl.hasAttribute("oncontextmenu")) || hasClassPseudoRule(object, ":hover") || hasClassPseudoRule(object, ":focus") || object.userData.domId && getCSSRule(`#${object.userData.domId}:focus`) || object.userData.domId && getCSSRule(`#${object.userData.domId}:hover`)) {
639
714
  object.layers.enable(3);
640
715
  } else {
@@ -650,7 +725,13 @@ function _apply_rule(rule, object, _chosenOne = null) {
650
725
  continue;
651
726
  }
652
727
  if (rawProp === "--animation") {
728
+ sawAnimationDeclaration = true;
653
729
  const animCfg = parseAnimationCSS(value);
730
+ const nextAnimKey = animationConfigKey(animCfg);
731
+ if (object.userData._animationConfigKey !== nextAnimKey) {
732
+ stopObjectAnimation(object);
733
+ object.userData._animationConfigKey = nextAnimKey;
734
+ }
654
735
  object.animation = animCfg;
655
736
  continue;
656
737
  }
@@ -694,16 +775,26 @@ function _apply_rule(rule, object, _chosenOne = null) {
694
775
  assignValue(parsed);
695
776
  }
696
777
  }
778
+ if (sawAnimationDeclaration && !object.animation) {
779
+ stopObjectAnimation(object);
780
+ }
697
781
  if (object.animation) {
698
782
  if (!object.userData._animationRunning) {
783
+ const controller = new AbortController();
699
784
  object.userData._animationRunning = true;
785
+ object.userData._animationAbortController = controller;
700
786
  (async () => {
701
787
  try {
702
- await KeyFrameAnimationLerp(object, object.animation);
788
+ await KeyFrameAnimationLerp(object, object.animation, controller.signal);
703
789
  } catch (err) {
704
- console.error(err);
790
+ if (!controller.signal.aborted) {
791
+ console.error(err);
792
+ }
705
793
  } finally {
706
- object.userData._animationRunning = false;
794
+ if (object.userData._animationAbortController === controller) {
795
+ object.userData._animationAbortController = null;
796
+ object.userData._animationRunning = false;
797
+ }
707
798
  }
708
799
  })();
709
800
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/module/styleCache.js","../../src/module/utils.js","../../src/module/Train.js","../../src/module/artist.js","../../src/module/NoScope.js","../../src/module/cell.js","../../src/module/main.js"],"sourcesContent":["// styleCache.js\n//\n// Shared stylesheet-derived cache versioning for selector/keyframe/asset lookups.\n\nlet globalStyleCacheVersion = 0;\n\nexport function getGlobalStyleCacheVersion() {\n return globalStyleCacheVersion;\n}\n\nexport function markGlobalStyleCacheDirty() {\n globalStyleCacheVersion += 1;\n return globalStyleCacheVersion;\n}\n","// utils.js\r\n//\r\n// - Keyframe rule collection\r\n// - Class map for tag → THREE constructor\r\n// - Asset loading / caching\r\n// - Small array utilities\r\n\r\nimport * as THREE from 'three';\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';\nimport { FBXLoader } from 'three/examples/jsm/loaders/FBXLoader.js';\nimport { MTLLoader } from 'three/examples/jsm/loaders/MTLLoader.js';\nimport { getGlobalStyleCacheVersion } from './styleCache.js';\n\r\nexport let AllKeyFramesMap = new Map();\nlet keyframesCacheVersion = -1;\n\r\n/**\r\n * Collect all @keyframes rules from loaded stylesheets.\r\n *\r\n * @returns {Map<string, CSSKeyframesRule>}\r\n */\r\nexport function gatherKeyFrame_MAP() {\n const styleVersion = getGlobalStyleCacheVersion();\n if (keyframesCacheVersion === styleVersion) {\n return AllKeyFramesMap;\n }\n\n AllKeyFramesMap.clear();\n\r\n const KEYFRAMES_TYPES = new Set();\r\n if (typeof CSSRule !== 'undefined') {\r\n if ('KEYFRAMES_RULE' in CSSRule) KEYFRAMES_TYPES.add(CSSRule.KEYFRAMES_RULE);\r\n if ('WEBKIT_KEYFRAMES_RULE' in CSSRule) KEYFRAMES_TYPES.add(CSSRule.WEBKIT_KEYFRAMES_RULE);\r\n }\r\n\r\n for (const sheet of document.styleSheets) {\r\n let rules;\r\n try {\r\n rules = sheet.cssRules;\r\n } catch {\r\n continue;\r\n }\r\n for (const rule of rules) {\r\n if (KEYFRAMES_TYPES.has(rule.type)) {\r\n AllKeyFramesMap.set(rule.name, rule);\r\n }\r\n }\r\n }\n\n keyframesCacheVersion = styleVersion;\n return AllKeyFramesMap;\n}\n\r\n/**\r\n * Get a CSSKeyframesRule by name, rescanning stylesheets each call.\r\n *\r\n * @param {string} AnimName\r\n */\r\nexport function getAnimationMap(AnimName) {\r\n if (!AnimName) return undefined;\r\n gatherKeyFrame_MAP();\r\n return AllKeyFramesMap.get(AnimName);\r\n}\r\n\r\n/* ───────────────── CLASS MAP ───────────────── */\r\n\r\nlet classMap = null;\r\n\r\n/**\r\n * Build a map of tag-name-like keys → THREE.Object3D constructors.\r\n */\r\nfunction buildClassMap() {\r\n classMap = Object.getOwnPropertyNames(THREE)\r\n .filter(key => {\r\n const C = THREE[key];\r\n return typeof C === 'function' && C.prototype instanceof THREE.Object3D;\r\n })\r\n .reduce((m, key) => {\r\n m[key.toUpperCase()] = THREE[key];\r\n return m;\r\n }, Object.create(null));\r\n\r\n // include base Object3D explicitly\r\n classMap.OBJECT3D = THREE.Object3D;\r\n}\r\n\r\n/**\r\n * Get the cached class map, building it on first call.\r\n *\r\n * @returns {Object.<string,Function>}\r\n */\r\nexport function getClassMap() {\r\n if (!classMap) buildClassMap();\r\n return classMap;\r\n}\r\n\r\n/* ───────────────── ASSET MAP ───────────────── */\r\n\r\nconst assetMap = new Map();\r\nconst gltfLoader = new GLTFLoader();\r\nconst fbxLoader = new FBXLoader();\r\nconst textureLoader = new THREE.TextureLoader();\r\nconst audioLoader = new THREE.AudioLoader();\r\nconst mtlLoader = new MTLLoader();\r\n\r\nfunction storeAssetValue(key, value) {\r\n if (value && typeof value.then === 'function') {\r\n const pending = value\r\n .then(resolved => {\r\n assetMap.set(key, resolved);\r\n return resolved;\r\n })\r\n .catch(err => {\r\n console.error(`Failed to load asset \"${key}\":`, err);\r\n assetMap.delete(key);\r\n return null;\r\n });\r\n assetMap.set(key, pending);\r\n } else {\r\n assetMap.set(key, value);\r\n }\r\n}\r\n\r\n/**\r\n * Scan stylesheets for custom @rules that declare external assets.\r\n *\r\n * Syntax:\r\n * @MyShip {\r\n * url: \"./ship.glb\";\r\n * name: \"Spaceship\"; // optional, overrides @ identifier\r\n * }\r\n */\r\nfunction gatherAssetRules() {\n const styleVersion = getGlobalStyleCacheVersion();\n if (gatherAssetRules._cacheVersion === styleVersion) {\n return;\n }\n\n const ignoreAtRules = new Set([\n 'media', 'import', 'supports', 'keyframes', 'font-face', 'charset',\r\n 'namespace', 'page', 'counter-style', 'font-feature-values', 'viewport'\r\n ]);\r\n\r\n for (const sheet of document.styleSheets) {\r\n let rules;\r\n try {\r\n rules = sheet.cssRules;\r\n } catch {\r\n continue;\r\n }\r\n\r\n for (const rule of rules) {\r\n const text = rule.cssText?.trim();\r\n if (!text) continue;\r\n\r\n const match = text.match(/^@([A-Za-z0-9_-]+)\\s*\\{([^}]*)\\}/);\r\n if (!match) continue;\r\n\r\n const atName = match[1];\r\n if (ignoreAtRules.has(atName.toLowerCase())) continue;\r\n\r\n const body = match[2];\r\n const obj = {};\r\n body.split(';').forEach(line => {\r\n const parts = line\r\n .split(':')\r\n .map(s => s && s.trim())\r\n .filter(Boolean);\r\n if (parts.length >= 2) {\r\n const key = parts[0].toLowerCase();\r\n let value = parts[1];\r\n value = value.replace(/^['\"(]+|['\")]+$/g, '');\r\n obj[key] = value;\r\n }\r\n });\r\n\r\n const url = obj.url;\r\n if (!url) continue;\r\n\r\n let name;\r\n if (obj.name && obj.name.trim()) {\r\n name = obj.name.trim();\r\n } else {\r\n name = atName || (() => {\r\n const fname = url.split('/').pop() || '';\r\n const dot = fname.lastIndexOf('.');\r\n return dot >= 0 ? fname.slice(0, dot) : fname;\r\n })();\r\n }\r\n\r\n if (!assetMap.has(name)) {\n storeAssetValue(name, loadAsset(url));\n }\n }\n }\n\n gatherAssetRules._cacheVersion = styleVersion;\n}\n\r\n/**\r\n * Get or load an asset by name.\r\n *\r\n * Built-ins (auto-registered on first use):\r\n * - cube → BoxGeometry\r\n * - sphere → SphereGeometry\r\n * - plane → PlaneGeometry\r\n * - torus → TorusGeometry\r\n *\r\n * @param {string} name\r\n * @param {string|null} [path=null]\r\n * @returns {any}\r\n */\r\nexport function getAsset(name, path = null) {\r\n if (assetMap.size === 0) {\r\n storeAssetValue('cube', new THREE.BoxGeometry());\r\n storeAssetValue('sphere', new THREE.SphereGeometry());\r\n storeAssetValue('plane', new THREE.PlaneGeometry());\r\n storeAssetValue('torus', new THREE.TorusGeometry());\r\n }\r\n\r\n // read CSS-defined assets\r\n gatherAssetRules();\r\n\r\n const key = name;\r\n if (!assetMap.has(key)) {\r\n if (!path) {\r\n console.warn(`Asset \"${name}\" missing and no path supplied.`);\r\n return null;\r\n }\r\n storeAssetValue(key, loadAsset(path));\r\n }\r\n\r\n return assetMap.get(key);\r\n}\r\n\r\n/**\r\n * Load a 3D / texture / audio / material asset based on file extension.\r\n *\r\n * @param {string} url\r\n * @returns {Promise<any>|null}\r\n */\r\nexport function loadAsset(url) {\r\n const ext = (url.split('.').pop() || '').toLowerCase();\r\n switch (ext) {\r\n case 'gltf':\r\n case 'glb':\r\n return new Promise((res, rej) =>\r\n gltfLoader.load(url, d => res(d.scene || d), null, rej)\r\n );\r\n case 'fbx':\r\n return new Promise((res, rej) =>\r\n fbxLoader.load(url, res, null, rej)\r\n );\r\n case 'png':\r\n case 'jpg':\r\n case 'jpeg':\r\n case 'gif':\r\n case 'webp':\r\n return new Promise((res, rej) =>\r\n textureLoader.load(url, tex => res(tex), undefined, rej)\r\n );\r\n case 'mp3':\r\n case 'wav':\r\n case 'ogg':\r\n case 'flac':\r\n case 'aac':\r\n return new Promise((res, rej) =>\r\n audioLoader.load(url, buffer => res(buffer), undefined, rej)\r\n );\r\n case 'mtl':\r\n return new Promise((res, rej) =>\r\n mtlLoader.load(\r\n url,\r\n mtl => {\r\n mtl.preload();\r\n res(mtl);\r\n },\r\n undefined,\r\n rej\r\n )\r\n );\r\n case 'json':\r\n return fetch(url)\r\n .then(response => response.json())\r\n .then(json => {\r\n try {\r\n const loader = new THREE.MaterialLoader();\r\n return loader.parse(json);\r\n } catch (err) {\r\n console.warn(`MaterialLoader failed to parse ${url}:`, err);\r\n return json;\r\n }\r\n });\r\n default:\r\n console.warn(`No loader for \".${ext}\".`);\r\n return Promise.resolve(null);\r\n }\r\n}\r\n\r\n/**\r\n * Remove an item from an array without preserving order.\r\n *\r\n * @param {Array<any>} arry\r\n * @param {any} item\r\n */\r\nexport function fastRemove_arry(arry, item) {\r\n const index = arry.indexOf(item);\r\n if (index !== -1) {\r\n arry[index] = arry[arry.length - 1];\r\n arry.pop();\r\n }\r\n}\r\n\r\n// Alias for older code.\r\nexport const fastRemoveArray = fastRemove_arry;\r\n","// Train.js\r\n//\r\n// Interpolation / animation helpers used by JailedThreeJS.\r\n// - Numeric lerping\r\n// - Cubic-bezier easing\r\n// - Generic value interpolation (numbers + arrays)\r\n// - Time-based transitions over JS values\r\n// - CSS keyframe-driven animation for custom props\r\n\r\nimport { exchange_rule, deep_searchParms, CSSValueTo3JSValue } from './artist.js';\r\nimport { getAnimationMap } from './utils.js';\r\n\r\n/**\r\n * Linearly interpolate between two numbers.\r\n * @param {number} a\r\n * @param {number} b\r\n * @param {number} t in [0, 1]\r\n */\r\nexport function lerpNumber(a, b, t) {\r\n return a + (b - a) * t;\r\n}\r\n\r\n/**\r\n * Interpolate arrays with tolerant length handling.\r\n *\r\n * Length rule:\r\n * - For indices where both arrays have a value → lerp them.\r\n * - For indices that exist only in `from` → keep `from[i]`.\r\n * - For indices that exist only in `to` → keep `to[i]`.\r\n *\r\n * Example:\r\n * [x1,y1,z1,q1] → [x2,y2,z2]\r\n * ==>\r\n * [lerp(x1,x2), lerp(y1,y2), lerp(z1,z2), q1]\r\n *\r\n * @param {Array<number>} from\r\n * @param {Array<number>} to\r\n * @param {number} t\r\n * @param {(a:number,b:number,t:number)=>number} lerpMethod\r\n */\r\nfunction lerpArray(from, to, t, lerpMethod) {\r\n const maxLen = Math.max(from.length, to.length);\r\n const out = new Array(maxLen);\r\n for (let i = 0; i < maxLen; i++) {\r\n const hasFrom = i < from.length;\r\n const hasTo = i < to.length;\r\n if (hasFrom && hasTo) {\r\n out[i] = lerpMethod(from[i], to[i], t);\r\n } else if (hasFrom) {\r\n out[i] = from[i];\r\n } else {\r\n out[i] = to[i];\r\n }\r\n }\r\n return out;\r\n}\r\n\r\n/**\r\n * Interpolate numbers or arrays using the provided lerp method.\r\n *\r\n * @param {number|Array<number>} from\r\n * @param {number|Array<number>} to\r\n * @param {number} t\r\n * @param {(a:number,b:number,t:number)=>number} lerpMethod\r\n */\r\nexport function lerpValue(from, to, t, lerpMethod = lerpNumber) {\r\n const isNum = v => typeof v === 'number';\r\n const isArr = Array.isArray;\r\n\r\n if (isNum(from) && isNum(to)) {\r\n return lerpMethod(from, to, t);\r\n }\r\n if (isArr(from) && isArr(to)) {\r\n return lerpArray(from, to, t, lerpMethod);\r\n }\r\n // Mixed or unsupported types: just return `to` instantly.\r\n return to;\r\n}\r\n\r\n/**\r\n * Create a cubic-bezier easing function.\r\n * Implementation adapted from https://github.com/gre/bezier-easing\r\n */\r\nfunction cubicBezier(p0, p1, p2, p3) {\r\n const cx = 3 * p0;\r\n const bx = 3 * (p2 - p0) - cx;\r\n const ax = 1 - cx - bx;\r\n const cy = 3 * p1;\r\n const by = 3 * (p3 - p1) - cy;\r\n const ay = 1 - cy - by;\r\n\r\n function sampleCurveX(t) {\r\n return ((ax * t + bx) * t + cx) * t;\r\n }\r\n function sampleCurveY(t) {\r\n return ((ay * t + by) * t + cy) * t;\r\n }\r\n function sampleCurveDerivativeX(t) {\r\n return (3 * ax * t + 2 * bx) * t + cx;\r\n }\r\n function solveTforX(x) {\r\n let t = x;\r\n for (let i = 0; i < 4; i++) {\r\n const dx = sampleCurveX(t) - x;\r\n if (Math.abs(dx) < 1e-6) return t;\r\n t -= dx / sampleCurveDerivativeX(t);\r\n }\r\n return t;\r\n }\r\n return x => sampleCurveY(solveTforX(x));\r\n}\r\n\r\n/**\r\n * Resolve an easing function from a CSS timing function string.\r\n *\r\n * @param {string} timingFunction\r\n * @returns {(t:number)=>number}\r\n */\r\nfunction _get_Equation(timingFunction) {\r\n switch (timingFunction) {\r\n case 'linear':\r\n return t => t;\r\n case 'ease':\r\n return cubicBezier(0.25, 0.1, 0.25, 1.0);\r\n case 'ease-in':\r\n return cubicBezier(0.42, 0, 1.0, 1.0);\r\n case 'ease-out':\r\n return cubicBezier(0, 0, 0.58, 1.0);\r\n case 'ease-in-out':\r\n return cubicBezier(0.42, 0, 0.58, 1.0);\r\n default:\r\n break;\r\n }\r\n\r\n if (typeof timingFunction === 'string' && timingFunction.startsWith('cubic-bezier')) {\r\n const match = timingFunction.match(/cubic-bezier\\(([^)]+)\\)/);\r\n if (match) {\r\n const nums = match[1]\r\n .split(/[, ]+/)\r\n .map(Number)\r\n .filter(n => !Number.isNaN(n));\r\n if (nums.length === 4) {\r\n return cubicBezier(nums[0], nums[1], nums[2], nums[3]);\r\n }\r\n }\r\n }\r\n\r\n // Fallback to linear on garbage.\r\n return t => t;\r\n}\r\n\r\n/**\r\n * Animate between two values over time.\r\n *\r\n * - Supports numbers and arrays (arrays follow the tolerant rule above).\r\n * - Non-animatable values resolve instantly (onUpdate + onComplete with `to`).\r\n *\r\n * @param {number|Array<number>} from\r\n * @param {number|Array<number>} to\r\n * @param {number} durationMs\r\n * @param {(value:any, easedT:number) => void} onUpdate\r\n * @param {(finalValue:any) => void} [onComplete]\r\n * @param {string} [timingFunction='linear']\r\n */\r\nexport function animateLerp(\r\n from,\r\n to,\r\n durationMs,\r\n onUpdate,\r\n onComplete,\r\n timingFunction = 'linear'\r\n) {\r\n const isAnimatable = v =>\r\n typeof v === 'number' || Array.isArray(v);\r\n\r\n const finishInstant = () => {\r\n if (onUpdate) onUpdate(to, 1);\r\n if (onComplete) onComplete(to);\r\n };\r\n\r\n if (!isAnimatable(from) || !isAnimatable(to)) {\r\n finishInstant();\r\n return;\r\n }\r\n\r\n if (!Number.isFinite(durationMs) || durationMs <= 0) {\r\n finishInstant();\r\n return;\r\n }\r\n\r\n const start = performance.now();\r\n const ease = _get_Equation(timingFunction);\r\n\r\n function step(now) {\r\n let t = (now - start) / durationMs;\r\n if (t >= 1) t = 1;\r\n const easedT = ease(t);\r\n const value = lerpValue(from, to, easedT, lerpNumber);\r\n if (onUpdate) onUpdate(value, easedT);\r\n if (t < 1) {\r\n requestAnimationFrame(step);\r\n } else if (onComplete) {\r\n onComplete(value);\r\n }\r\n }\r\n\r\n requestAnimationFrame(step);\r\n}\r\n\r\n/**\r\n * Parse a keyframe time string into milliseconds.\r\n *\r\n * Supports:\r\n * - 'from' / 'to'\r\n * - percentages ('0%', '50%', '100%')\r\n * - '123ms'\r\n * - bare numbers treated as ms\r\n *\r\n * @param {string} keyText\r\n * @param {number} totalDuration\r\n */\r\nfunction parseKeyframeTime(keyText, totalDuration) {\r\n if (!keyText) return 0;\r\n const text = String(keyText).trim().toLowerCase();\r\n\r\n if (text === 'from') return 0;\r\n if (text === 'to') return totalDuration;\r\n\r\n if (text.endsWith('%')) {\r\n const v = parseFloat(text);\r\n return Number.isFinite(v) ? (v / 100) * totalDuration : 0;\r\n }\r\n if (text.endsWith('ms')) {\r\n const v = parseFloat(text);\r\n return Number.isFinite(v) ? v : 0;\r\n }\r\n const n = Number(text);\r\n return Number.isFinite(n) ? n : 0;\r\n}\r\n\r\n/**\r\n * Apply a CSS @keyframes animation to a Three.js object.\r\n *\r\n * @param {THREE.Object3D} object\r\n * @param {{\r\n * name: string,\r\n * duration: number,\r\n * timing?: { fun?: string },\r\n * iteration?: { count?: number | string }\r\n * }} animationObj\r\n */\r\nexport async function KeyFrameAnimationLerp(object, animationObj) {\r\n if (!object || !animationObj?.name || !animationObj?.duration) return;\r\n\r\n const keyFramesRule = getAnimationMap(animationObj.name);\r\n if (!keyFramesRule || !keyFramesRule.cssRules) {\r\n console.error(`Animation \"${animationObj.name}\" not found or has no rules.`);\r\n return;\r\n }\r\n\r\n const duration = animationObj.duration;\r\n\r\n const rules = Array.from(keyFramesRule.cssRules).slice();\r\n rules.sort(\r\n (a, b) =>\r\n parseKeyframeTime(a.keyText, duration) -\r\n parseKeyframeTime(b.keyText, duration)\r\n );\r\n\r\n const runOnce = async () => {\r\n for (let i = 0; i < rules.length - 1; i++) {\r\n const fromRule = rules[i];\r\n const toRule = rules[i + 1];\r\n const t0 = parseKeyframeTime(fromRule.keyText, duration);\r\n const t1 = parseKeyframeTime(toRule.keyText, duration);\r\n const segmentMs = t1 - t0;\r\n if (segmentMs <= 0) continue;\r\n\r\n const fromProps = {};\r\n const toProps = {};\r\n\r\n // Collect animatable custom props from \"from\" frame\r\n for (const propName of fromRule.style) {\r\n const raw = fromRule.style.getPropertyValue(propName);\r\n // custom props are expected to be `--foo-bar`\r\n if (!propName.startsWith('--')) continue;\r\n fromProps[propName.slice(2)] = CSSValueTo3JSValue(raw, object);\r\n }\r\n\r\n // Collect matching props from \"to\" frame\r\n for (const propName of toRule.style) {\r\n const raw = toRule.style.getPropertyValue(propName);\r\n if (!propName.startsWith('--')) continue;\r\n toProps[propName.slice(2)] = CSSValueTo3JSValue(raw, object);\r\n }\r\n\r\n const keys = Object.keys(fromProps).filter(k => k in toProps);\r\n if (!keys.length) continue;\r\n\r\n await Promise.all(\r\n keys.map(key => {\r\n const fromVal = fromProps[key];\r\n const toVal = toProps[key];\r\n\r\n // Resolve async assets before animating.\r\n const resolveValue = v =>\r\n (v && typeof v.then === 'function')\r\n ? v\r\n : Promise.resolve(v);\r\n\r\n return Promise.all([resolveValue(fromVal), resolveValue(toVal)])\r\n .then(([resolvedFrom, resolvedTo]) => new Promise(resolve => {\r\n animateLerp(\r\n resolvedFrom,\r\n resolvedTo,\r\n segmentMs,\r\n v => {\r\n const { parent, key: finalKey } = deep_searchParms(object, key.split('-'));\r\n exchange_rule(parent, finalKey, v);\r\n },\r\n resolve,\r\n animationObj.timing?.fun || 'linear'\r\n );\r\n }));\r\n })\r\n );\r\n }\r\n };\r\n\r\n let iterationCount = animationObj.iteration?.count ?? 1;\r\n if (iterationCount === 'infinity' || iterationCount === 'infinite') {\r\n iterationCount = Infinity;\r\n }\r\n\r\n if (iterationCount === Infinity) {\r\n // infinite loop – deliberately never resolves\r\n // eslint-disable-next-line no-constant-condition\r\n while (true) {\r\n // eslint-disable-next-line no-await-in-loop\r\n await runOnce();\r\n }\r\n } else {\r\n const total = Number(iterationCount) || 1;\r\n for (let i = 0; i < total; i++) {\r\n // eslint-disable-next-line no-await-in-loop\r\n await runOnce();\r\n }\r\n }\r\n}\r\n","// artist.js\r\n//\r\n// Maps CSS custom properties + selectors to Three.js objects.\r\n// Handles:\r\n// - CSS → Three value conversion\r\n// - Transition interpolation\r\n// - Keyframe-driven animations\r\n// - Pseudo-class painting (:hover, :focus, :active)\r\n\r\nimport { getAsset } from './utils.js';\nimport Cell from './cell.js';\nimport { animateLerp, KeyFrameAnimationLerp } from './Train.js';\nimport * as THREE from 'three';\nimport { getGlobalStyleCacheVersion } from './styleCache.js';\n\nlet selectorRuleCache = new Map();\nlet selectorRuleCacheVersion = -1;\nlet warnedLegacyNameClassFallback = false;\n\nfunction ensureSelectorRuleCache() {\n const version = getGlobalStyleCacheVersion();\n if (selectorRuleCacheVersion !== version) {\n selectorRuleCache.clear();\n selectorRuleCacheVersion = version;\n }\n}\n\nfunction getObjectClassSelectors(object) {\n const aliasList = object?.classList;\n if (Array.isArray(aliasList)) return aliasList;\n\n if (object?.userData && Object.prototype.hasOwnProperty.call(object.userData, 'classList')) {\n return Array.isArray(object.userData.classList) ? object.userData.classList : [];\n }\n\n if (object?.name) {\n if (!warnedLegacyNameClassFallback) {\n warnedLegacyNameClassFallback = true;\n console.warn(\n 'JailedThreeJS: inferring CSS classes from Object3D.name is deprecated. Use object.classList/userData.classList.'\n );\n }\n return [object.name];\n }\n\n return [];\n}\n\r\nfunction hasClassPseudoRule(object, pseudo) {\r\n return getObjectClassSelectors(object).some(cls => getCSSRule(`.${cls}${pseudo}`));\r\n}\r\n\r\nfunction parseAnimationCSS(value) {\r\n if (!value) return null;\r\n\r\n const lower = value.trim().toLowerCase();\r\n if (!lower || lower === 'none') return null;\r\n\r\n const parts = lower.split(/\\s+/).filter(Boolean);\r\n if (!parts.length) return null;\r\n\r\n // First token = name (keep original case for the keyframe name)\r\n const nameToken = parts.shift();\r\n if (!nameToken) return null;\r\n\r\n let durationMs = 1000; // default 1s\r\n let timingFun = 'linear'; // default timing\r\n let iterationCount = 1; // default once\r\n\r\n // Duration\r\n if (parts.length) {\r\n const timeToken = parts[0];\r\n if (/\\d/.test(timeToken)) {\r\n parts.shift();\r\n if (timeToken.endsWith('ms')) {\r\n durationMs = parseFloat(timeToken);\r\n } else if (timeToken.endsWith('s')) {\r\n durationMs = parseFloat(timeToken) * 1000;\r\n } else {\r\n durationMs = parseFloat(timeToken);\r\n }\r\n }\r\n }\r\n\r\n // Look for \"infinite\"/\"infinity\" in the remaining tokens\r\n const infIndex = parts.findIndex(t => t === 'infinite' || t === 'infinity');\r\n if (infIndex !== -1) {\r\n iterationCount = 'infinite';\r\n parts.splice(infIndex, 1);\r\n } else if (parts.length) {\r\n const maybeCount = parseInt(parts[parts.length - 1], 10);\r\n if (Number.isFinite(maybeCount) && maybeCount > 0) {\r\n iterationCount = maybeCount;\r\n parts.pop();\r\n }\r\n }\r\n\r\n // Whatever is left becomes the timing function string\r\n if (parts.length) {\r\n timingFun = parts.join(' ');\r\n }\r\n\r\n return {\r\n name: nameToken,\r\n duration: durationMs,\r\n iteration: { count: iterationCount },\r\n timing: { fun: timingFun }\r\n };\r\n}\r\n\r\n\r\n\r\nfunction parseTransitionCSS(value) {\r\n if (!value) return null;\r\n\r\n const lower = value.trim().toLowerCase();\r\n if (!lower || lower === 'none') return null;\r\n\r\n const parts = lower.split(/\\s+/).filter(Boolean);\r\n if (!parts.length) return null;\r\n\r\n const timeToken = parts.shift();\r\n let durationMs;\r\n\r\n if (timeToken.endsWith('ms')) {\r\n durationMs = parseFloat(timeToken);\r\n } else if (timeToken.endsWith('s')) {\r\n durationMs = parseFloat(timeToken) * 1000;\r\n } else {\r\n durationMs = parseFloat(timeToken);\r\n }\r\n\r\n if (!Number.isFinite(durationMs) || durationMs <= 0) {\r\n return null;\r\n }\r\n\r\n const timingFun = parts.join(' ') || 'linear';\r\n\r\n return {\r\n duration: durationMs,\r\n timing: { fun: timingFun }\r\n };\r\n}\r\n\r\n\r\n/**\r\n * Find first CSS rule whose selector list contains `selector` token.\r\n *\r\n * @param {string} selector\r\n * @returns {CSSStyleRule|undefined}\r\n */\r\nexport function getCSSRule(selector) {\n ensureSelectorRuleCache();\n if (selectorRuleCache.has(selector)) {\n return selectorRuleCache.get(selector) || undefined;\n }\n\n let found = null;\n for (const sheet of document.styleSheets) {\n let rules;\n try {\r\n rules = sheet.cssRules;\r\n } catch {\r\n // cross-origin stylesheet\r\n continue;\r\n }\r\n for (const rule of rules) {\r\n if (!rule.selectorText) continue;\r\n const selectors = rule.selectorText.split(',');\r\n for (const sel of selectors) {\r\n if (sel.trim().split(/\\s+/).includes(selector)) {\n found = rule;\n break;\n }\n }\n if (found) break;\n }\n if (found) break;\n }\n\n selectorRuleCache.set(selector, found);\n return found || undefined;\n}\n\r\n/**\r\n * Walk an object path and return parent + final key.\r\n *\r\n * @param {Object} object\r\n * @param {string[]} path\r\n * @returns {{parent:Object, key:string}}\r\n */\r\nexport function deep_searchParms(object, path) {\r\n const key = path[path.length - 1];\r\n const parent = path.slice(0, -1).reduce((o, k) => {\r\n if (o[k] == null) o[k] = {};\r\n return o[k];\r\n }, object);\r\n return { parent, key };\r\n}\r\n\r\n/**\r\n * Convert CSS value → Three.js friendly value.\r\n *\r\n * - \"(1,2,3)\" → [1,2,3]\r\n * - \"1.25\" → 1.25\r\n * - \"@foo\" → asset from getAsset('foo')\r\n * - \"#id-...\" → property copied from another convict in the same cell\r\n *\r\n * @param {string} value\r\n * @param {THREE.Object3D|null} [__object=null]\r\n * @returns {any}\r\n */\r\nexport function CSSValueTo3JSValue(value, __object = null) {\r\n let parsed;\r\n\r\n if (/^\\(.+\\)$/.test(value)) {\r\n parsed = value.slice(1, -1).split(',').map(v => parseFloat(v.trim()));\r\n } else if (!Number.isNaN(parseFloat(value))) {\r\n parsed = parseFloat(value);\r\n } else {\r\n parsed = value.replace(/^['\"]|['\"]$/g, '');\r\n }\r\n\r\n if (typeof parsed === 'string') {\r\n switch (parsed[0]) {\r\n case '@': {\r\n const p = parsed.slice(1);\r\n return getAsset(p);\r\n }\r\n case '#': {\r\n if (!__object) {\r\n console.error('CSSValueTo3JSValue: __object is null when resolving', parsed);\r\n return null;\r\n }\r\n try {\r\n const cellElement = __object.userData.domEl.closest('cell');\r\n const actualCellObject = Cell.getCell(cellElement);\r\n const path = parsed.split('-');\r\n if (path.length < 1) {\r\n throw new Error('Requesting empty paths using \"#\" is not allowed');\r\n }\r\n const targetObject = actualCellObject.getConvictById(path[0].slice(1));\r\n if (!targetObject) {\r\n throw new Error('Failed to find object with id ' + parsed);\r\n }\r\n path.shift();\r\n const { parent, key } = deep_searchParms(targetObject, path);\r\n return parent[key];\r\n } catch (err) {\r\n console.error(err);\r\n return undefined;\r\n }\r\n }\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n return parsed;\r\n}\r\n\r\n/**\r\n * Assign a value to a property, handling vectors / setters / plain fields.\r\n *\r\n * @param {Object} parent\r\n * @param {string} key\r\n * @param {any} value\r\n */\r\nexport function exchange_rule(parent, key, value) {\r\n if (!parent) return;\r\n const target = parent[key];\r\n\r\n try {\r\n if (Array.isArray(value)) {\r\n if (target && typeof target.set === 'function') {\r\n target.set(...value);\r\n } else if (typeof target === 'function') {\r\n target(...value);\r\n } else {\r\n parent[key] = value;\r\n }\r\n return;\r\n }\r\n\r\n // scalar or non-array\r\n if (target && typeof target.set === 'function') {\r\n target.set(value);\r\n } else if (typeof target === 'function') {\r\n target(value);\r\n } else {\r\n parent[key] = value;\r\n }\r\n } catch (err) {\r\n console.warn(`Failed to assign ${key} with`, value, err);\r\n }\r\n}\r\n\r\n/**\r\n * Core rule application.\r\n *\r\n * @param {CSSStyleRule|HTMLElement} rule\r\n * @param {THREE.Object3D} object\r\n * @param {string|null} [_chosenOne=null] selector that caused this rule\r\n */\r\nfunction _apply_rule(rule, object, _chosenOne = null) {\r\n if (!rule || !rule.style || !object) return;\r\n\r\n const domEl = object.userData.domEl;\r\n object.userData._lastCSS = object.userData._lastCSS || Object.create(null);\r\n\r\n // enable picking layer when interactive / pseudo-rules exist\r\n if (\r\n domEl?.hasAttribute('onclick') ||\r\n domEl?.hasAttribute('onmouseover') ||\r\n domEl?.hasAttribute('ondblclick') ||\r\n domEl?.hasAttribute('onmousedown') ||\r\n domEl?.hasAttribute('onmouseup') ||\r\n domEl?.hasAttribute('oncontextmenu') ||\r\n hasClassPseudoRule(object, ':hover') ||\r\n hasClassPseudoRule(object, ':focus') ||\r\n (object.userData.domId && getCSSRule(`#${object.userData.domId}:focus`)) ||\r\n (object.userData.domId && getCSSRule(`#${object.userData.domId}:hover`))\r\n ) {\r\n object.layers.enable(3);\r\n } else {\r\n object.layers.disable(3);\r\n }\r\n\r\n for (let i = 0; i < rule.style.length; i++) {\r\n const rawProp = rule.style[i];\r\n const value = rule.style.getPropertyValue(rawProp).trim();\r\n\r\n if (!rawProp.startsWith('--')) continue;\r\n\r\n // CSS-driven transition config\r\n if (rawProp === '--transition') {\r\n const cfg = parseTransitionCSS(value);\r\n object.transition = cfg; // may be null if \"none\"\r\n continue;\r\n }\r\n\r\n // CSS-driven animation config\r\n if (rawProp === '--animation') {\r\n const animCfg = parseAnimationCSS(value);\r\n object.animation = animCfg; // may be null if \"none\"\r\n continue;\r\n }\r\n\r\n // Normal custom property flow (position, rotation, etc.)\r\n const prop = rawProp.slice(2);\r\n const path = prop.split('-');\r\n const parsed = CSSValueTo3JSValue(value, object);\r\n const { parent, key } = deep_searchParms(object, path);\r\n\r\n const assignValue = (resolvedValue) => {\r\n if (resolvedValue === undefined) return;\r\n\r\n const transition = object.transition;\r\n const currentRaw = parent[key];\r\n const currentValue =\r\n currentRaw && typeof currentRaw.toArray === 'function'\r\n ? currentRaw.toArray()\r\n : currentRaw;\r\n\r\n const duration = transition?.duration ?? 0;\r\n const timingFn = transition?.timing?.fun ?? 'linear';\r\n const isAnimatable =\r\n transition &&\r\n duration > 0 &&\r\n (typeof currentValue === 'number' || Array.isArray(currentValue)) &&\r\n (typeof resolvedValue === 'number' || Array.isArray(resolvedValue));\r\n\r\n if (isAnimatable) {\r\n animateLerp(\r\n currentValue,\r\n resolvedValue,\r\n duration,\r\n v => exchange_rule(parent, key, v),\r\n () => {\r\n object.dispatchEvent({\r\n type: 'TransitionFinished',\r\n target: object,\r\n detail: { selector: _chosenOne, to: parent }\r\n });\r\n },\r\n timingFn\r\n );\r\n } else {\r\n exchange_rule(parent, key, resolvedValue);\r\n }\r\n };\r\n\r\n if (parsed && typeof parsed.then === 'function') {\r\n parsed.then(assignValue).catch(err =>\r\n console.error('Failed to resolve asset for', rawProp, err)\r\n );\r\n } else {\r\n assignValue(parsed);\r\n }\r\n}\r\n \r\n\r\n\r\n if (object.animation) {\r\n // Don't restart the animation every repaint\r\n if (!object.userData._animationRunning) {\r\n object.userData._animationRunning = true;\r\n\r\n (async () => {\r\n try {\r\n await KeyFrameAnimationLerp(object, object.animation);\r\n } catch (err) {\r\n console.error(err);\r\n } finally {\r\n // For infinite animations this never runs, which is fine:\r\n // we keep the flag true and never restart.\r\n object.userData._animationRunning = false;\r\n }\r\n })();\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Apply rules for a specific element inside a cell (inline style changes).\r\n *\r\n * @param {HTMLElement} convictElm\r\n * @param {Cell} cell\r\n */\r\nexport function paintConvict(convictElm, cell) {\r\n const convict = cell._allConvictsByDom.get(convictElm);\r\n if (convict) {\r\n _apply_rule(convictElm, convict);\r\n }\r\n}\r\n\r\n/**\r\n * Paint :hover / :focus / :active selectors for all convicts in a cell.\r\n *\r\n * @param {Cell} muse\r\n */\r\nexport function paintExtraCell(muse) {\r\n for (const obj of muse.classyConvicts) {\r\n const classes = getObjectClassSelectors(obj);\r\n (obj.userData.extraParams || []).forEach(param => {\r\n classes.forEach(cls => {\r\n const rule = getCSSRule(`.${cls}${param}`);\r\n if (rule) _apply_rule(rule, obj);\r\n });\r\n });\r\n }\r\n\r\n for (const obj of muse.namedConvicts) {\r\n if (!obj.userData.domId) continue;\r\n (obj.userData.extraParams || []).forEach(param => {\r\n const rule = getCSSRule(`#${obj.userData.domId}${param}`);\r\n if (rule) _apply_rule(rule, obj);\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * Paint base class/id rules for an entire cell.\r\n *\r\n * @param {Cell} muse\r\n */\r\nexport function paintCell(muse) {\r\n for (const obj of muse.classyConvicts) {\r\n for (const cls of getObjectClassSelectors(obj)) {\r\n const rule = getCSSRule(`.${cls}`);\r\n if (rule) _apply_rule(rule, obj, `.${cls}`);\r\n }\r\n }\r\n for (const obj of muse.namedConvicts) {\r\n if (!obj.userData.domId) continue;\r\n const rule = getCSSRule(`#${obj.userData.domId}`);\r\n if (rule) _apply_rule(rule, obj, `#${obj.userData.domId}`);\r\n }\r\n}\r\n\r\n/**\r\n * Paint a single object: base rules, pseudo-rules, inline style.\r\n *\r\n * @param {THREE.Object3D} muse\r\n */\r\nexport function paintSpecificMuse(muse) {\r\n const extra = muse.userData.extraParams || [];\r\n\r\n getObjectClassSelectors(muse).forEach(cls => {\r\n const rule = getCSSRule(`.${cls}`);\r\n if (rule) _apply_rule(rule, muse);\r\n });\r\n\r\n if (muse.userData.domId) {\r\n const baseIdRule = getCSSRule(`#${muse.userData.domId}`);\r\n if (baseIdRule) _apply_rule(baseIdRule, muse);\r\n }\r\n\r\n extra.forEach(param => {\r\n getObjectClassSelectors(muse).forEach(cls => {\r\n const clsRule = getCSSRule(`.${cls}${param}`);\r\n if (clsRule) _apply_rule(clsRule, muse);\r\n });\r\n });\r\n\r\n if (muse.userData.domId) {\r\n extra.forEach(param => {\r\n const idRule = getCSSRule(`#${muse.userData.domId}${param}`);\r\n if (idRule) _apply_rule(idRule, muse);\r\n });\r\n }\r\n\r\n if (muse.userData.domEl?.hasAttribute('style')) {\r\n _apply_rule(muse.userData.domEl, muse);\r\n }\r\n}\r\n\r\n/**\r\n * Apply constant :active rules each frame for flagged convicts.\r\n *\r\n * @param {THREE.Object3D} muse\r\n */\r\nexport function paintConstantMuse(muse) {\r\n getObjectClassSelectors(muse).forEach(cls => {\r\n const rule = getCSSRule(`.${cls}:active`);\r\n if (rule) _apply_rule(rule, muse);\r\n });\r\n if (muse.userData.domId) {\r\n const rule = getCSSRule(`#${muse.userData.domId}:active`);\r\n if (rule) _apply_rule(rule, muse);\r\n }\r\n}\r\n","// NoScope.js\r\n//\r\n// Centralised event handling.\r\n// Shared THREE.Raycaster + NDC pointer for all cells; all pickable\r\n// objects live on layer 3.\r\n\r\nimport * as THREE from 'three';\nimport { paintSpecificMuse } from './artist.js';\nimport { fastRemove_arry } from './utils.js';\n\r\nconst raycaster = new THREE.Raycaster();\r\nconst ndcPointer = new THREE.Vector2();\r\n\r\n// Only objects on layer 3 are considered pickable.\r\nraycaster.layers.set(3);\r\n\r\n/* Flag helpers */\r\n\r\nfunction addFlag(arr, flag) {\n if (arr.includes(flag)) return false;\n arr.push(flag);\n return true;\n}\n\nfunction delFlag(arr, flag) {\n const hadFlag = arr.includes(flag);\n if (!hadFlag) return false;\n fastRemove_arry(arr, flag);\n return true;\n}\n\n/* Public handlers */\n\nfunction _flushPendingPointerMove(cell) {\n if (!cell?._pointerMoveRaf || !cell._pendingPointerMoveEvt) return;\n cancelAnimationFrame(cell._pointerMoveRaf);\n cell._pointerMoveRaf = 0;\n const evt = cell._pendingPointerMoveEvt;\n cell._pendingPointerMoveEvt = null;\n _processPointerMove(evt, cell);\n}\n\nexport function default_onCellClick_method(domEvt, cell) {\n _flushPendingPointerMove(cell);\n const hit = cell._last_cast_caught;\n if (!hit) return;\n\n const focusChanged = addFlag(hit.userData.extraParams, ':focus');\n\r\n const synth = {\r\n type: 'cellclick',\r\n originalEvt: domEvt,\r\n target3d: hit,\r\n targetCell: cell,\r\n targetElement: hit.userData.domEl,\r\n pointerPosition: cell._lastHitPosition\r\n };\r\n\n hit.userData.domEl.onclick?.call(hit.userData.domEl, synth);\n if (focusChanged) paintSpecificMuse(hit);\n}\n\nexport function default_onCellPointerMove_method(domEvt, cell) {\n if (!cell.focusedCamera) return;\n\n cell._pendingPointerMoveEvt = domEvt;\n if (cell._pointerMoveRaf) return;\n\n cell._pointerMoveRaf = requestAnimationFrame(() => {\n const evt = cell._pendingPointerMoveEvt;\n cell._pendingPointerMoveEvt = null;\n cell._pointerMoveRaf = 0;\n if (!evt || !cell._running) return;\n _processPointerMove(evt, cell);\n });\n}\n\nfunction _processPointerMove(domEvt, cell) {\n _raycast(domEvt, cell.focusedCamera, cell.cellElm);\n\n const hitResult = raycaster.intersectObjects(cell.loadedScene.children, true)[0];\n const lastHit = cell._last_cast_caught;\n\n if (hitResult) {\n const hitObject = hitResult.object;\n let shouldRepaintCurrent = false;\n\n if (hitObject !== lastHit) {\n if (lastHit) {\n const hoverRemoved = delFlag(lastHit.userData.extraParams, ':hover');\n lastHit.userData.domEl.onmouseleave?.call(lastHit.userData.domEl, {\n type: 'cellmouseleave',\n originalEvt: domEvt,\n target3d: lastHit,\r\n targetCell: cell,\r\n targetElement: lastHit.userData.domEl,\r\n pointerPosition: cell._lastHitPosition\n });\n if (hoverRemoved) paintSpecificMuse(lastHit);\n }\n\n cell._last_cast_caught = hitObject;\n\r\n hitObject.userData.domEl.onmouseenter?.call(hitObject.userData.domEl, {\n type: 'cellmouseenter',\n originalEvt: domEvt,\n target3d: hitObject,\n targetCell: cell,\n targetElement: hitObject.userData.domEl,\n pointerPosition: hitResult.point\n });\n shouldRepaintCurrent = true;\n }\n\n if (addFlag(hitObject.userData.extraParams, ':hover')) {\n shouldRepaintCurrent = true;\n }\n cell._lastHitPosition = hitResult.point;\n\r\n hitObject.userData.domEl.onmouseover?.call(hitObject.userData.domEl, {\r\n type: 'cellhover',\r\n originalEvt: domEvt,\r\n target3d: hitObject,\r\n targetCell: cell,\r\n targetElement: hitObject.userData.domEl,\r\n pointerPosition: hitResult.point\n });\n\n if (shouldRepaintCurrent) paintSpecificMuse(hitObject);\n } else if (lastHit) {\n const hoverRemoved = delFlag(lastHit.userData.extraParams, ':hover');\n lastHit.userData.domEl.onmouseleave?.call(lastHit.userData.domEl, {\n type: 'cellmouseleave',\n originalEvt: domEvt,\n target3d: lastHit,\r\n targetCell: cell,\r\n targetElement: lastHit.userData.domEl,\r\n pointerPosition: cell._lastHitPosition\n });\n if (hoverRemoved) paintSpecificMuse(lastHit);\n cell._last_cast_caught = null;\n }\n}\n\nexport function default_onCellMouseDown_method(domEvt, cell) {\n _flushPendingPointerMove(cell);\n const hit = cell._last_cast_caught;\n if (!hit) return;\n\n const activeChanged = addFlag(hit.userData.extraParams, ':active');\n\r\n const synth = {\r\n type: 'celldown',\r\n originalEvt: domEvt,\r\n target3d: hit,\r\n targetCell: cell,\r\n targetElement: hit.userData.domEl,\r\n pointerPosition: cell._lastHitPosition\r\n };\r\n\n hit.userData.domEl.onmousedown?.call(hit.userData.domEl, synth);\n if (activeChanged) paintSpecificMuse(hit);\n}\n\nexport function default_onCellMouseUp_method(domEvt, cell) {\n _flushPendingPointerMove(cell);\n const hit = cell._last_cast_caught;\n if (!hit) return;\n\n const activeChanged = delFlag(hit.userData.extraParams, ':active');\n\r\n const synth = {\r\n type: 'cellup',\r\n originalEvt: domEvt,\r\n target3d: hit,\r\n targetCell: cell,\r\n targetElement: hit.userData.domEl,\r\n pointerPosition: cell._lastHitPosition\r\n };\r\n\n hit.userData.domEl.onmouseup?.call(hit.userData.domEl, synth);\n if (activeChanged) paintSpecificMuse(hit);\n}\n\nexport function default_onCellDoubleClick_method(domEvt, cell) {\n _flushPendingPointerMove(cell);\n const hit = cell._last_cast_caught;\n if (!hit) return;\n\n const focusChanged = addFlag(hit.userData.extraParams, ':focus');\n\r\n const synth = {\r\n type: 'celldblclick',\r\n originalEvt: domEvt,\r\n target3d: hit,\r\n targetCell: cell,\r\n targetElement: hit.userData.domEl,\r\n pointerPosition: cell._lastHitPosition\r\n };\r\n\n hit.userData.domEl.ondblclick?.call(hit.userData.domEl, synth);\n if (focusChanged) paintSpecificMuse(hit);\n}\n\nexport function default_onCellContextMenu_method(domEvt, cell) {\n _flushPendingPointerMove(cell);\n const hit = cell._last_cast_caught;\n if (!hit) return;\n\r\n const synth = {\r\n type: 'cellcontextmenu',\r\n originalEvt: domEvt,\r\n target3d: hit,\r\n targetCell: cell,\r\n targetElement: hit.userData.domEl,\r\n pointerPosition: cell._lastHitPosition\r\n };\r\n\n hit.userData.domEl.oncontextmenu?.call(hit.userData.domEl, synth);\n}\n\r\n/* Internal raycast helper */\r\n\r\n/**\r\n * @param {MouseEvent} domEvt\r\n * @param {THREE.Camera} camera\r\n * @param {HTMLElement} referenceEl\r\n */\r\nfunction _raycast(domEvt, camera, referenceEl) {\r\n if (!camera) return;\r\n\r\n const targetEl = referenceEl || domEvt.currentTarget || domEvt.target;\r\n const rect = targetEl.getBoundingClientRect();\r\n\r\n camera.updateMatrixWorld();\r\n\r\n ndcPointer.set(\r\n ((domEvt.clientX - rect.left) / rect.width) * 2 - 1,\r\n (-(domEvt.clientY - rect.top) / rect.height) * 2 + 1\r\n );\r\n\r\n raycaster.setFromCamera(ndcPointer, camera);\r\n}\r\n","// cell.js\r\n//\r\n// The Cell class drives a single <cell> element:\r\n// - DOM → Three.js object conversion\r\n// - Event wiring / raycasting integration\r\n// - CSS → object painting\r\n// - Mutation observers (DOM + <style> changes)\r\n// - Per-frame update callbacks\r\n\r\nimport * as THREE from 'three';\nimport { getClassMap } from './utils.js';\nimport {\n paintCell,\n paintConvict,\n paintSpecificMuse\n} from './artist.js';\nimport { markGlobalStyleCacheDirty } from './styleCache.js';\nimport {\r\n default_onCellClick_method,\r\n default_onCellPointerMove_method,\r\n default_onCellMouseDown_method,\r\n default_onCellMouseUp_method,\r\n default_onCellDoubleClick_method,\r\n default_onCellContextMenu_method\r\n} from './NoScope.js';\r\n\r\nclass Cell {\r\n static allCells = new WeakMap();\r\n\r\n /**\r\n * Retrieve an existing Cell for a <cell> element.\r\n *\r\n * @param {HTMLElement} element\r\n * @returns {Cell|null}\r\n */\r\n static getCell(element) {\r\n if (Cell.allCells.has(element)) {\r\n return Cell.allCells.get(element);\r\n }\r\n console.error('No Cell found with the element:', element);\r\n return null;\r\n }\r\n\r\n /**\r\n * @param {HTMLElement} cellElm\r\n * @param {THREE.WebGLRenderer} renderer\r\n * @param {THREE.Scene} scene\r\n * @param {THREE.Camera|null} [camera=null]\r\n * @param {Function|null} [_MainAnimMethod=null]\r\n */\r\n constructor(cellElm, renderer, scene, camera = null, _MainAnimMethod = null) {\r\n this.cellElm = cellElm;\r\n Object.defineProperty(cellElm, 'cell', {\r\n value: this,\r\n enumerable: false\r\n });\r\n\r\n this.threeRenderer = renderer;\n this.loadedScene = scene;\n this.focusedCamera = camera;\n\n this.classyConvicts = new Set();\n this.namedConvicts = new Set();\n this._allConvictsByDom = new WeakMap();\n this._convictsById = new Map();\n this._convictsByClass = new Map();\n\n this.updateFunds = [];\n this._observedStyleElements = new WeakSet();\n this._pendingStyleRepaint = false;\n this._pointerMoveRaf = 0;\n this._pendingPointerMoveEvt = null;\n\r\n this._last_cast_caught = null;\r\n this._lastHitPosition = null;\r\n Cell.allCells.set(cellElm, this);\r\n\r\n // initial scan\r\n this._ScanCell();\r\n\r\n // bind DOM event handlers\r\n this._boundPointerMove = evt => {\r\n default_onCellPointerMove_method(evt, this);\r\n };\r\n this._boundClick = evt => {\r\n default_onCellClick_method(evt, this);\r\n };\r\n this._boundMouseDown = evt => {\r\n default_onCellMouseDown_method(evt, this);\r\n };\r\n this._boundMouseUp = evt => {\r\n default_onCellMouseUp_method(evt, this);\r\n };\r\n this._boundDoubleClick = evt => {\r\n default_onCellDoubleClick_method(evt, this);\r\n };\r\n this._boundContextMenu = evt => {\r\n evt.preventDefault();\r\n default_onCellContextMenu_method(evt, this);\r\n };\r\n\r\n cellElm.addEventListener('mousemove', this._boundPointerMove);\r\n cellElm.addEventListener('click', this._boundClick);\r\n cellElm.addEventListener('mousedown', this._boundMouseDown);\r\n cellElm.addEventListener('mouseup', this._boundMouseUp);\r\n cellElm.addEventListener('dblclick', this._boundDoubleClick);\r\n cellElm.addEventListener('contextmenu', this._boundContextMenu);\r\n\r\n // initial paint\r\n paintCell(this);\r\n\r\n // Observe <style> content so keyframes / rules updates repaint\r\n this._styleElemObserver = new MutationObserver(() => {\n if (this._pendingStyleRepaint) return;\n markGlobalStyleCacheDirty();\n this._pendingStyleRepaint = true;\n requestAnimationFrame(() => {\n this._pendingStyleRepaint = false;\n paintCell(this);\n this._repaintKnownConvicts();\n });\n });\n\r\n this._observeStyleElements = root => {\r\n if (!root) return;\r\n const targets = [];\r\n if (root.nodeName === 'STYLE') {\r\n targets.push(root);\r\n } else if (typeof root.querySelectorAll === 'function') {\r\n targets.push(...root.querySelectorAll('style'));\r\n }\r\n targets.forEach(styleEl => {\r\n if (this._observedStyleElements.has(styleEl)) return;\r\n this._observedStyleElements.add(styleEl);\r\n this._styleElemObserver.observe(styleEl, {\r\n childList: true,\r\n characterData: true,\r\n subtree: true\r\n });\r\n });\r\n };\r\n\r\n this._styleHostObserver = new MutationObserver(mutationList => {\n mutationList.forEach(mutation => {\n let styleTreeChanged = false;\n mutation.addedNodes.forEach(node => {\n if (node.nodeType === Node.ELEMENT_NODE && node.nodeName === 'STYLE') {\n this._observeStyleElements(node);\n styleTreeChanged = true;\n } else if (node.nodeType === Node.ELEMENT_NODE && typeof node.querySelector === 'function' && node.querySelector('style')) {\n this._observeStyleElements(node);\n styleTreeChanged = true;\n }\n });\n mutation.removedNodes.forEach(node => {\n if (node.nodeType === Node.ELEMENT_NODE && (node.nodeName === 'STYLE' || (typeof node.querySelector === 'function' && node.querySelector('style')))) {\n styleTreeChanged = true;\n }\n });\n if (styleTreeChanged) {\n markGlobalStyleCacheDirty();\n this._scheduleFullRepaint();\n }\n });\n });\n\r\n this._observeStyleElements(this.cellElm);\r\n if (document.head) {\r\n this._observeStyleElements(document.head);\r\n this._styleHostObserver.observe(document.head, {\r\n childList: true,\r\n subtree: true\r\n });\r\n }\r\n\r\n // Observe inline style/id/class changes and child mutations\r\n this._styleObserver = new MutationObserver(mutationList => {\r\n mutationList.forEach(mutation => {\r\n if (mutation.target.nodeName === 'CANVAS') return;\r\n\r\n switch (mutation.type) {\r\n case 'childList': {\r\n for (let i = 0; i < mutation.addedNodes.length; i++) {\r\n const node = mutation.addedNodes[i];\r\n if (node.nodeType === Node.ELEMENT_NODE && node.nodeName !== 'CANVAS') {\r\n if (node.nodeName === 'STYLE') {\n this._observeStyleElements(node);\n markGlobalStyleCacheDirty();\n this._scheduleFullRepaint();\n } else {\n this.ScanElement(node);\n const convict = this.getConvictByDom(node);\n if (convict) {\r\n paintSpecificMuse(convict);\r\n }\r\n }\r\n }\r\n }\r\n for (let i = 0; i < mutation.removedNodes.length; i++) {\n const node = mutation.removedNodes[i];\n if (node.nodeType === Node.ELEMENT_NODE && node.nodeName !== 'CANVAS') {\n if (node.nodeName === 'STYLE' || (typeof node.querySelector === 'function' && node.querySelector('style'))) {\n markGlobalStyleCacheDirty();\n this._scheduleFullRepaint();\n }\n this.removeConvict(this._allConvictsByDom.get(node));\n }\n }\n break;\r\n }\r\n case 'attributes': {\r\n const target = mutation.target;\r\n const convict = target.convict;\r\n if (!convict) break;\r\n\n if (mutation.attributeName === 'id') {\n this._syncConvictIdentity(convict, target);\n paintSpecificMuse(convict);\n } else if (mutation.attributeName === 'class') {\n this._syncConvictIdentity(convict, target);\n paintSpecificMuse(convict);\n } else if (mutation.attributeName === 'style') {\n // inline style changed; repaint this convict\n paintConvict(target, this);\n }\r\n break;\r\n }\r\n }\r\n });\r\n });\r\n\r\n this._styleObserver.observe(this.cellElm, {\r\n attributes: true,\r\n childList: true,\r\n attributeFilter: ['style', 'id', 'class'],\r\n subtree: true\r\n });\r\n\r\n // Animation loop\r\n this._running = true;\r\n this._anim = _MainAnimMethod\r\n ? _MainAnimMethod.bind(this)\r\n : () => {\r\n if (!this._running) return;\r\n this.updateFunds.forEach(update => update());\r\n requestAnimationFrame(this._anim);\r\n if (this.focusedCamera) {\r\n this.threeRenderer.render(this.loadedScene, this.focusedCamera);\r\n }\r\n };\r\n\r\n // Resize handling\r\n this._resizeObserver = new ResizeObserver(entries => {\r\n for (const e of entries) {\r\n const { width, height } = e.contentRect;\r\n const dpr = window.devicePixelRatio || 1;\r\n this.threeRenderer.setPixelRatio(dpr);\r\n\r\n const safeWidth = Math.max(width, 1);\r\n const safeHeight = Math.max(height, 1);\r\n this.threeRenderer.setSize(safeWidth, safeHeight, false);\r\n\r\n if (this.focusedCamera && this.focusedCamera.isPerspectiveCamera) {\r\n this.focusedCamera.aspect = safeWidth / safeHeight;\r\n }\r\n if (this.focusedCamera) {\r\n this.focusedCamera.updateProjectionMatrix();\r\n }\r\n }\r\n });\r\n this._resizeObserver.observe(this.cellElm);\r\n\r\n this._anim();\n }\n\n _scheduleFullRepaint() {\n if (this._pendingStyleRepaint) return;\n this._pendingStyleRepaint = true;\n requestAnimationFrame(() => {\n this._pendingStyleRepaint = false;\n paintCell(this);\n this._repaintKnownConvicts();\n });\n }\n\n _repaintKnownConvicts() {\n const visited = new Set();\n for (const convict of this.classyConvicts) {\n if (!visited.has(convict)) {\n visited.add(convict);\n paintSpecificMuse(convict);\n }\n }\n for (const convict of this.namedConvicts) {\n if (!visited.has(convict)) {\n visited.add(convict);\n paintSpecificMuse(convict);\n }\n }\n }\n\n _normalizeClassList(input) {\n if (Array.isArray(input)) return input.filter(Boolean).map(String);\n if (typeof input === 'string') return input.split(/\\s+/).filter(Boolean);\n if (input && typeof input[Symbol.iterator] === 'function') {\n return Array.from(input).filter(Boolean).map(String);\n }\n return [];\n }\n\n _ensureConvictClassAlias(convict) {\n if (Object.prototype.hasOwnProperty.call(convict, 'classList')) return;\n Object.defineProperty(convict, 'classList', {\n enumerable: false,\n configurable: true,\n get() {\n return this.userData.classList;\n },\n set(value) {\n let next = [];\n if (Array.isArray(value)) {\n next = value.filter(Boolean).map(String);\n } else if (typeof value === 'string') {\n next = value.split(/\\s+/).filter(Boolean);\n } else if (value && typeof value[Symbol.iterator] === 'function') {\n next = Array.from(value).filter(Boolean).map(String);\n }\n const domEl = this.userData?.domEl;\n if (domEl && domEl.className !== next.join(' ')) {\n domEl.className = next.join(' ');\n return;\n }\n this.userData.classList = next;\n }\n });\n }\n\n _removeClassIndex(convict, className) {\n const bucket = this._convictsByClass.get(className);\n if (!bucket) return;\n bucket.delete(convict);\n if (bucket.size === 0) {\n this._convictsByClass.delete(className);\n }\n }\n\n _syncConvictIdentity(convict, elm) {\n if (!convict || !elm) return;\n\n const prevId = convict.userData.domId || '';\n const prevClasses = Array.isArray(convict.userData.classList)\n ? convict.userData.classList\n : [];\n\n const nextId = elm.id || '';\n const nextClasses = this._normalizeClassList(elm.classList);\n\n if (prevId && this._convictsById.get(prevId) === convict) {\n this._convictsById.delete(prevId);\n }\n for (const cls of prevClasses) {\n this._removeClassIndex(convict, cls);\n }\n\n convict.userData.domId = nextId;\n convict.userData.classList = nextClasses;\n if (nextId) {\n convict.name = nextId;\n } else if (convict.name === prevId) {\n convict.name = '';\n }\n\n if (nextId) {\n this._convictsById.set(nextId, convict);\n this.namedConvicts.add(convict);\n } else {\n this.namedConvicts.delete(convict);\n }\n\n if (nextClasses.length) {\n this.classyConvicts.add(convict);\n for (const cls of nextClasses) {\n let bucket = this._convictsByClass.get(cls);\n if (!bucket) {\n bucket = new Set();\n this._convictsByClass.set(cls, bucket);\n }\n bucket.add(convict);\n }\n } else {\n this.classyConvicts.delete(convict);\n }\n }\n\n /**\n * Initial scan of cell children.\n * @private\n */\n _ScanCell() {\r\n for (let i = 0; i < this.cellElm.children.length; i++) {\r\n const convictElm = this.cellElm.children[i];\r\n this.ScanElement(convictElm);\r\n }\r\n }\r\n\r\n /**\r\n * Convert a DOM element into a Three.js object and wire it up.\r\n *\r\n * @param {HTMLElement} elm\r\n */\r\n ScanElement(elm) {\r\n if (this._allConvictsByDom.has(elm)) return;\r\n\r\n const parentObj = this.getConvictByDom(elm.parentElement) || this.loadedScene;\r\n const instance = this.ConvertDomToObject(elm);\r\n\r\n if (instance === null) {\r\n // still recurse children\r\n for (let i = 0; i < elm.children.length; i++) {\r\n this.ScanElement(elm.children[i]);\r\n }\r\n return;\r\n }\r\n\r\n // Camera tags: configure projection\r\n if (elm.tagName.includes('CAMERA')) {\r\n const rect = this.cellElm.getBoundingClientRect();\r\n const aspect = rect.height ? rect.width / rect.height : 1;\r\n\r\n if (elm.tagName === 'PERSPECTIVECAMERA') {\r\n instance.fov = 75;\r\n instance.aspect = aspect;\r\n instance.far = 1000;\r\n instance.near = 0.1;\r\n } else {\r\n const frustumSize = 20;\r\n instance.frustumSize = frustumSize;\r\n instance.aspect = aspect;\r\n instance.left = (-frustumSize * aspect) / 2;\r\n instance.right = (frustumSize * aspect) / 2;\r\n instance.top = frustumSize / 2;\r\n instance.bottom = -frustumSize / 2;\r\n instance.refreshLook = fSize => {\r\n instance.frustumSize = fSize;\r\n instance.left = (-fSize * instance.aspect) / 2;\r\n instance.right = (fSize * instance.aspect) / 2;\r\n instance.top = fSize / 2;\r\n instance.bottom = -fSize / 2;\r\n instance.updateProjectionMatrix();\r\n };\r\n }\r\n\r\n const rectW = rect.width || 1;\r\n const rectH = rect.height || 1;\r\n\r\n if (elm.hasAttribute('render')) {\r\n this.focusedCamera = instance;\r\n this.focusedCamera.updateProjectionMatrix();\r\n this.threeRenderer.setPixelRatio(window.devicePixelRatio || 1);\r\n this.threeRenderer.setSize(rectW, rectH, false);\r\n } else if (!this.focusedCamera) {\r\n this.focusedCamera = instance;\r\n this.focusedCamera.updateProjectionMatrix();\r\n }\r\n }\r\n\r\n instance.userData.domEl = elm;\n instance.userData.extraParams = [];\n instance.userData.domId = '';\n instance.userData.classList = [];\n instance.transition = null;\n this._ensureConvictClassAlias(instance);\n\n parentObj.add(instance);\n\n this._allConvictsByDom.set(elm, instance);\n this._syncConvictIdentity(instance, elm);\n\n for (let i = 0; i < elm.children.length; i++) {\n this.ScanElement(elm.children[i]);\n }\r\n\r\n if (!Object.prototype.hasOwnProperty.call(elm, 'convict')) {\r\n Object.defineProperty(elm, 'convict', {\r\n value: this.getConvictByDom(elm),\r\n enumerable: false\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Tag → THREE.Object3D constructor.\r\n *\r\n * @param {HTMLElement} elm\r\n * @returns {THREE.Object3D|null}\r\n */\r\n ConvertDomToObject(elm) {\r\n if (elm.tagName === 'CANVAS') return null;\r\n\r\n const key = elm.tagName.replace(/-/g, '');\r\n const Ctor = getClassMap()[key];\r\n if (!Ctor) {\r\n console.warn(`Unknown THREE class for <${elm.tagName.toLowerCase()}>`);\r\n return null;\r\n }\r\n return new Ctor();\r\n }\r\n\r\n /**\r\n * Remove a convict and its children.\r\n *\r\n * @param {THREE.Object3D|null} convict\r\n */\r\n removeConvict(convict) {\r\n if (!convict) return;\r\n\r\n convict.children.slice().forEach(child => {\n const domNode = child.userData?.domEl;\r\n if (domNode) {\r\n this.removeConvict(this._allConvictsByDom.get(domNode));\r\n } else {\r\n this.removeConvict(child);\r\n }\r\n });\n\n const domId = convict.userData?.domId;\n if (domId && this._convictsById.get(domId) === convict) {\n this._convictsById.delete(domId);\n }\n const classes = Array.isArray(convict.userData?.classList) ? convict.userData.classList : [];\n for (const cls of classes) {\n this._removeClassIndex(convict, cls);\n }\n this.classyConvicts.delete(convict);\n this.namedConvicts.delete(convict);\n\n if (convict.userData.domEl) {\n this._allConvictsByDom.delete(convict.userData.domEl);\n convict.userData.domEl.remove();\r\n }\r\n\r\n if (convict.parent) {\r\n convict.parent.remove(convict);\r\n }\r\n }\r\n\r\n /**\r\n * Get convict by DOM element.\r\n *\r\n * @param {HTMLElement} element\r\n */\r\n getConvictByDom(element) {\r\n return this._allConvictsByDom.get(element);\r\n }\r\n\r\n /**\r\n * Get convict by DOM id (global document lookup).\r\n *\r\n * @param {string} id\r\n */\r\n getConvictById(id) {\n return this._convictsById.get(id);\n }\n\r\n /**\r\n * Get all convicts with a given class.\r\n *\r\n * @param {string} className\r\n * @returns {Array<THREE.Object3D>}\r\n */\r\n getConvictsByClass(className) {\n return Array.from(this._convictsByClass.get(className) || []);\n }\n\r\n /**\r\n * Register a per-frame callback.\r\n *\r\n * @param {Function} fn\r\n */\r\n addUpdateFunction(fn) {\r\n if (typeof fn === 'function') {\r\n const bound = fn.bind(this);\r\n bound.originalFn = fn;\r\n this.updateFunds.push(bound);\r\n }\r\n }\r\n\r\n /**\r\n * Remove a previously registered per-frame callback.\r\n *\r\n * @param {Function} fn\r\n */\r\n removeUpdateFunction(fn) {\r\n const idx = this.updateFunds.findIndex(item => item?.originalFn === fn);\r\n if (idx >= 0) {\r\n this.updateFunds.splice(idx, 1);\r\n }\r\n }\r\n\r\n /**\r\n * Tear down observers, handlers and canvas.\r\n */\r\n dispose() {\r\n this._running = false;\r\n\r\n this._resizeObserver.disconnect();\r\n this._styleObserver.disconnect();\r\n this._styleElemObserver.disconnect();\r\n this._styleHostObserver.disconnect();\n\n if (this._pointerMoveRaf) {\n cancelAnimationFrame(this._pointerMoveRaf);\n this._pointerMoveRaf = 0;\n }\n this._pendingPointerMoveEvt = null;\n\r\n this.cellElm.removeEventListener('mousemove', this._boundPointerMove);\r\n this.cellElm.removeEventListener('click', this._boundClick);\r\n this.cellElm.removeEventListener('mousedown', this._boundMouseDown);\r\n this.cellElm.removeEventListener('mouseup', this._boundMouseUp);\r\n this.cellElm.removeEventListener('dblclick', this._boundDoubleClick);\r\n this.cellElm.removeEventListener('contextmenu', this._boundContextMenu);\r\n\r\n const canvas = this.threeRenderer.domElement;\r\n if (canvas && canvas.parentNode) {\r\n canvas.parentNode.removeChild(canvas);\r\n }\r\n }\r\n}\r\n\r\nexport default Cell;\r\n","// main.js\r\n//\r\n// JThree facade: finds <cell> elements, bootstraps renderer/scene/cell\r\n// for each, and keeps a WeakMap of created Cell instances.\r\n\r\nimport * as THREE from 'three';\r\nimport Cell from './cell.js';\r\n\r\nclass JTHREE {\r\n static __Loaded_Cells__ = new WeakMap();\r\n static __StyleTag__ = null;\r\n\r\n /**\r\n * Convert all <cell> elements in the document.\r\n */\r\n static init_convert() {\r\n if (!JTHREE.__StyleTag__ && document.head) {\r\n const styleSheet = document.createElement('style');\r\n styleSheet.textContent = `\r\n cell > :not(canvas) {\r\n display: none;\r\n }\r\n `;\r\n document.head.appendChild(styleSheet);\r\n JTHREE.__StyleTag__ = styleSheet;\r\n }\r\n\r\n document.querySelectorAll('cell').forEach(el => {\r\n if (JTHREE.__Loaded_Cells__.has(el)) return;\r\n JTHREE.create_THREEJSRENDERER(el);\r\n });\r\n }\r\n\r\n /**\r\n * Legacy alias.\r\n */\r\n static _convert_init_() {\r\n return JTHREE.init_convert();\r\n }\r\n\r\n /**\r\n * Create renderer + scene for a given <cell> element.\r\n *\r\n * @param {HTMLElement} cellEl\r\n * @returns {Cell}\r\n */\r\n static create_THREEJSRENDERER(cellEl) {\r\n if (JTHREE.__Loaded_Cells__.has(cellEl)) {\r\n return JTHREE.__Loaded_Cells__.get(cellEl);\r\n }\r\n\r\n const { canvas, width, height, dpr } = createWebGLOverlay(cellEl);\r\n const safeWidth = width || 1;\r\n const safeHeight = height || 1;\r\n\r\n const renderer = new THREE.WebGLRenderer({ canvas, antialias: true });\r\n renderer.setPixelRatio(dpr);\r\n renderer.setSize(safeWidth, safeHeight, false);\r\n renderer.setClearColor(0x000000, 1);\r\n\r\n const scene = new THREE.Scene();\r\n\r\n // Find explicit cameras\r\n const regex = /camera/i;\r\n const foundCameraElms = Array.from(cellEl.children).filter(child =>\r\n regex.test(child.tagName) ||\r\n regex.test(child.id) ||\r\n regex.test(child.className)\r\n );\r\n\r\n let camera = null;\r\n if (foundCameraElms.length === 0) {\r\n camera = new THREE.PerspectiveCamera(75, safeWidth / safeHeight, 0.1, 1000);\r\n console.warn('No camera found for', cellEl, '. Creating a default camera.');\r\n }\r\n\r\n const cell = new Cell(cellEl, renderer, scene, camera || null);\r\n JTHREE.__Loaded_Cells__.set(cellEl, cell);\r\n\r\n cellEl.dispatchEvent(\r\n new CustomEvent('OnStart', { detail: { cell, CellEl: cellEl } })\r\n );\r\n\r\n return cell;\r\n }\r\n}\r\n\r\n/**\r\n * Create a WebGL canvas overlay on a host element.\r\n *\r\n * @param {HTMLElement} hostEl\r\n * @param {Object} [glOptions={}]\r\n * @returns {{canvas:HTMLCanvasElement, gl:WebGLRenderingContext, width:number, height:number, dpr:number}}\r\n */\r\nfunction createWebGLOverlay(hostEl, glOptions = {}) {\r\n const { width, height } = hostEl.getBoundingClientRect();\r\n const dpr = window.devicePixelRatio || 1;\r\n\r\n if (getComputedStyle(hostEl).position === 'static') {\r\n hostEl.style.position = 'relative';\r\n }\r\n\r\n const canvas = document.createElement('canvas');\r\n canvas.width = Math.max(1, Math.round(width * dpr));\r\n canvas.height = Math.max(1, Math.round(height * dpr));\r\n Object.assign(canvas.style, {\r\n position: 'absolute',\r\n top: '0',\r\n left: '0',\r\n width: `${width}px`,\r\n height: `${height}px`,\r\n pointerEvents: 'none',\r\n //zIndex: '-999'\r\n });\r\n\r\n hostEl.appendChild(canvas);\r\n\r\n const gl =\r\n canvas.getContext('webgl2', glOptions) ||\r\n canvas.getContext('webgl', glOptions) ||\r\n canvas.getContext('experimental-webgl', glOptions);\r\n\r\n if (!gl) {\r\n throw new Error('Your browser doesn’t support WebGL.');\r\n }\r\n\r\n gl.viewport(0, 0, canvas.width, canvas.height);\r\n return { canvas, gl, width, height, dpr };\r\n}\r\n\r\n// Auto-initialise on import.\r\nJTHREE.init_convert();\r\nwindow.JThree = JTHREE;\r\n\r\nexport { JTHREE };\r\nexport default JTHREE;\r\n"],"names":["_a"],"mappings":";;;;;;;AAIA,IAAI,0BAA0B;AAEvB,SAAS,6BAA6B;AAC3C,SAAO;AACT;AAEO,SAAS,4BAA4B;AAC1C,6BAA2B;AAC3B,SAAO;AACT;ACAU,IAAC,kBAAkB,oBAAI,IAAG;AACpC,IAAI,wBAAwB;AAOrB,SAAS,qBAAqB;AACnC,QAAM,eAAe,2BAA0B;AAC/C,MAAI,0BAA0B,cAAc;AAC1C,WAAO;AAAA,EACT;AAEA,kBAAgB,MAAK;AAErB,QAAM,kBAAkB,oBAAI;AAC5B,MAAI,OAAO,YAAY,aAAa;AAClC,QAAI,oBAAoB,QAAS,iBAAgB,IAAI,QAAQ,cAAc;AAC3E,QAAI,2BAA2B,QAAS,iBAAgB,IAAI,QAAQ,qBAAqB;AAAA,EAC3F;AAEA,aAAW,SAAS,SAAS,aAAa;AACxC,QAAI;AACJ,QAAI;AACF,cAAQ,MAAM;AAAA,IAChB,QAAQ;AACN;AAAA,IACF;AACA,eAAW,QAAQ,OAAO;AACxB,UAAI,gBAAgB,IAAI,KAAK,IAAI,GAAG;AAClC,wBAAgB,IAAI,KAAK,MAAM,IAAI;AAAA,MACrC;AAAA,IACF;AAAA,EACF;AAEA,0BAAwB;AACxB,SAAO;AACT;AAOO,SAAS,gBAAgB,UAAU;AACxC,MAAI,CAAC,SAAU,QAAO;AACtB;AACA,SAAO,gBAAgB,IAAI,QAAQ;AACrC;AAIA,IAAI,WAAW;AAKf,SAAS,gBAAgB;AACvB,aAAW,OAAO,oBAAoB,KAAK,EACxC,OAAO,SAAO;AACb,UAAM,IAAI,MAAM,GAAG;AACnB,WAAO,OAAO,MAAM,cAAc,EAAE,qBAAqB,MAAM;AAAA,EACjE,CAAC,EACA,OAAO,CAAC,GAAG,QAAQ;AAClB,MAAE,IAAI,YAAW,CAAE,IAAI,MAAM,GAAG;AAChC,WAAO;AAAA,EACT,GAAG,uBAAO,OAAO,IAAI,CAAC;AAGxB,WAAS,WAAW,MAAM;AAC5B;AAOO,SAAS,cAAc;AAC5B,MAAI,CAAC,SAAU;AACf,SAAO;AACT;AAIA,MAAM,WAAW,oBAAI;AACrB,MAAM,aAAa,IAAI;AACvB,MAAM,YAAY,IAAI;AACtB,MAAM,gBAAgB,IAAI,MAAM;AAChC,MAAM,cAAc,IAAI,MAAM;AAC9B,MAAM,YAAY,IAAI;AAEtB,SAAS,gBAAgB,KAAK,OAAO;AACnC,MAAI,SAAS,OAAO,MAAM,SAAS,YAAY;AAC7C,UAAM,UAAU,MACb,KAAK,cAAY;AAChB,eAAS,IAAI,KAAK,QAAQ;AAC1B,aAAO;AAAA,IACT,CAAC,EACA,MAAM,SAAO;AACZ,cAAQ,MAAM,yBAAyB,GAAG,MAAM,GAAG;AACnD,eAAS,OAAO,GAAG;AACnB,aAAO;AAAA,IACT,CAAC;AACH,aAAS,IAAI,KAAK,OAAO;AAAA,EAC3B,OAAO;AACL,aAAS,IAAI,KAAK,KAAK;AAAA,EACzB;AACF;AAWA,SAAS,mBAAmB;;AAC1B,QAAM,eAAe,2BAA0B;AAC/C,MAAI,iBAAiB,kBAAkB,cAAc;AACnD;AAAA,EACF;AAEA,QAAM,gBAAgB,oBAAI,IAAI;AAAA,IAC5B;AAAA,IAAS;AAAA,IAAU;AAAA,IAAY;AAAA,IAAa;AAAA,IAAa;AAAA,IACzD;AAAA,IAAa;AAAA,IAAQ;AAAA,IAAiB;AAAA,IAAuB;AAAA,EACjE,CAAG;AAED,aAAW,SAAS,SAAS,aAAa;AACxC,QAAI;AACJ,QAAI;AACF,cAAQ,MAAM;AAAA,IAChB,QAAQ;AACN;AAAA,IACF;AAEA,eAAW,QAAQ,OAAO;AACxB,YAAM,QAAO,UAAK,YAAL,mBAAc;AAC3B,UAAI,CAAC,KAAM;AAEX,YAAM,QAAQ,KAAK,MAAM,kCAAkC;AAC3D,UAAI,CAAC,MAAO;AAEZ,YAAM,SAAS,MAAM,CAAC;AACtB,UAAI,cAAc,IAAI,OAAO,YAAW,CAAE,EAAG;AAE7C,YAAM,OAAO,MAAM,CAAC;AACpB,YAAM,MAAM,CAAA;AACZ,WAAK,MAAM,GAAG,EAAE,QAAQ,UAAQ;AAC9B,cAAM,QAAQ,KACX,MAAM,GAAG,EACT,IAAI,OAAK,KAAK,EAAE,KAAI,CAAE,EACtB,OAAO,OAAO;AACjB,YAAI,MAAM,UAAU,GAAG;AACrB,gBAAM,MAAM,MAAM,CAAC,EAAE,YAAW;AAChC,cAAI,QAAQ,MAAM,CAAC;AACnB,kBAAQ,MAAM,QAAQ,oBAAoB,EAAE;AAC5C,cAAI,GAAG,IAAI;AAAA,QACb;AAAA,MACF,CAAC;AAED,YAAM,MAAM,IAAI;AAChB,UAAI,CAAC,IAAK;AAEV,UAAI;AACJ,UAAI,IAAI,QAAQ,IAAI,KAAK,KAAI,GAAI;AAC/B,eAAO,IAAI,KAAK;MAClB,OAAO;AACL,eAAO,WAAW,MAAM;AACtB,gBAAM,QAAQ,IAAI,MAAM,GAAG,EAAE,IAAG,KAAM;AACtC,gBAAM,MAAM,MAAM,YAAY,GAAG;AACjC,iBAAO,OAAO,IAAI,MAAM,MAAM,GAAG,GAAG,IAAI;AAAA,QAC1C;MACF;AAEA,UAAI,CAAC,SAAS,IAAI,IAAI,GAAG;AACvB,wBAAgB,MAAM,UAAU,GAAG,CAAC;AAAA,MACtC;AAAA,IACF;AAAA,EACF;AAEA,mBAAiB,gBAAgB;AACnC;AAeO,SAAS,SAAS,MAAM,OAAO,MAAM;AAC1C,MAAI,SAAS,SAAS,GAAG;AACvB,oBAAgB,QAAQ,IAAI,MAAM,YAAW,CAAE;AAC/C,oBAAgB,UAAU,IAAI,MAAM,eAAc,CAAE;AACpD,oBAAgB,SAAS,IAAI,MAAM,cAAa,CAAE;AAClD,oBAAgB,SAAS,IAAI,MAAM,cAAa,CAAE;AAAA,EACpD;AAGA;AAEA,QAAM,MAAM;AACZ,MAAI,CAAC,SAAS,IAAI,GAAG,GAAG;AACtB,QAAI,CAAC,MAAM;AACT,cAAQ,KAAK,UAAU,IAAI,iCAAiC;AAC5D,aAAO;AAAA,IACT;AACA,oBAAgB,KAAK,UAAU,IAAI,CAAC;AAAA,EACtC;AAEA,SAAO,SAAS,IAAI,GAAG;AACzB;AAQO,SAAS,UAAU,KAAK;AAC7B,QAAM,OAAO,IAAI,MAAM,GAAG,EAAE,IAAG,KAAM,IAAI;AACzC,UAAQ,KAAG;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO,IAAI;AAAA,QAAQ,CAAC,KAAK,QACvB,WAAW,KAAK,KAAK,OAAK,IAAI,EAAE,SAAS,CAAC,GAAG,MAAM,GAAG;AAAA,MAC9D;AAAA,IACI,KAAK;AACH,aAAO,IAAI;AAAA,QAAQ,CAAC,KAAK,QACvB,UAAU,KAAK,KAAK,KAAK,MAAM,GAAG;AAAA,MAC1C;AAAA,IACI,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO,IAAI;AAAA,QAAQ,CAAC,KAAK,QACvB,cAAc,KAAK,KAAK,SAAO,IAAI,GAAG,GAAG,QAAW,GAAG;AAAA,MAC/D;AAAA,IACI,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO,IAAI;AAAA,QAAQ,CAAC,KAAK,QACvB,YAAY,KAAK,KAAK,YAAU,IAAI,MAAM,GAAG,QAAW,GAAG;AAAA,MACnE;AAAA,IACI,KAAK;AACH,aAAO,IAAI;AAAA,QAAQ,CAAC,KAAK,QACvB,UAAU;AAAA,UACR;AAAA,UACA,SAAO;AACL,gBAAI,QAAO;AACX,gBAAI,GAAG;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,QACV;AAAA,MACA;AAAA,IACI,KAAK;AACH,aAAO,MAAM,GAAG,EACb,KAAK,cAAY,SAAS,MAAM,EAChC,KAAK,UAAQ;AACZ,YAAI;AACF,gBAAM,SAAS,IAAI,MAAM;AACzB,iBAAO,OAAO,MAAM,IAAI;AAAA,QAC1B,SAAS,KAAK;AACZ,kBAAQ,KAAK,kCAAkC,GAAG,KAAK,GAAG;AAC1D,iBAAO;AAAA,QACT;AAAA,MACF,CAAC;AAAA,IACL;AACE,cAAQ,KAAK,mBAAmB,GAAG,IAAI;AACvC,aAAO,QAAQ,QAAQ,IAAI;AAAA,EACjC;AACA;AAQO,SAAS,gBAAgB,MAAM,MAAM;AAC1C,QAAM,QAAQ,KAAK,QAAQ,IAAI;AAC/B,MAAI,UAAU,IAAI;AAChB,SAAK,KAAK,IAAI,KAAK,KAAK,SAAS,CAAC;AAClC,SAAK,IAAG;AAAA,EACV;AACF;AAGY,MAAC,kBAAkB;ACxSxB,SAAS,WAAW,GAAG,GAAG,GAAG;AAClC,SAAO,KAAK,IAAI,KAAK;AACvB;AAoBA,SAAS,UAAU,MAAM,IAAI,GAAG,YAAY;AAC1C,QAAM,SAAS,KAAK,IAAI,KAAK,QAAQ,GAAG,MAAM;AAC9C,QAAM,MAAM,IAAI,MAAM,MAAM;AAC5B,WAAS,IAAI,GAAG,IAAI,QAAQ,KAAK;AAC/B,UAAM,UAAU,IAAI,KAAK;AACzB,UAAM,QAAQ,IAAI,GAAG;AACrB,QAAI,WAAW,OAAO;AACpB,UAAI,CAAC,IAAI,WAAW,KAAK,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC;AAAA,IACvC,WAAW,SAAS;AAClB,UAAI,CAAC,IAAI,KAAK,CAAC;AAAA,IACjB,OAAO;AACL,UAAI,CAAC,IAAI,GAAG,CAAC;AAAA,IACf;AAAA,EACF;AACA,SAAO;AACT;AAUO,SAAS,UAAU,MAAM,IAAI,GAAG,aAAa,YAAY;AAC9D,QAAM,QAAQ,OAAK,OAAO,MAAM;AAChC,QAAM,QAAQ,MAAM;AAEpB,MAAI,MAAM,IAAI,KAAK,MAAM,EAAE,GAAG;AAC5B,WAAO,WAAW,MAAM,IAAI,CAAC;AAAA,EAC/B;AACA,MAAI,MAAM,IAAI,KAAK,MAAM,EAAE,GAAG;AAC5B,WAAO,UAAU,MAAM,IAAI,GAAG,UAAU;AAAA,EAC1C;AAEA,SAAO;AACT;AAMA,SAAS,YAAY,IAAI,IAAI,IAAI,IAAI;AACnC,QAAM,KAAK,IAAI;AACf,QAAM,KAAK,KAAK,KAAK,MAAM;AAC3B,QAAM,KAAK,IAAI,KAAK;AACpB,QAAM,KAAK,IAAI;AACf,QAAM,KAAK,KAAK,KAAK,MAAM;AAC3B,QAAM,KAAK,IAAI,KAAK;AAEpB,WAAS,aAAa,GAAG;AACvB,aAAS,KAAK,IAAI,MAAM,IAAI,MAAM;AAAA,EACpC;AACA,WAAS,aAAa,GAAG;AACvB,aAAS,KAAK,IAAI,MAAM,IAAI,MAAM;AAAA,EACpC;AACA,WAAS,uBAAuB,GAAG;AACjC,YAAQ,IAAI,KAAK,IAAI,IAAI,MAAM,IAAI;AAAA,EACrC;AACA,WAAS,WAAW,GAAG;AACrB,QAAI,IAAI;AACR,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,YAAM,KAAK,aAAa,CAAC,IAAI;AAC7B,UAAI,KAAK,IAAI,EAAE,IAAI,KAAM,QAAO;AAChC,WAAK,KAAK,uBAAuB,CAAC;AAAA,IACpC;AACA,WAAO;AAAA,EACT;AACA,SAAO,OAAK,aAAa,WAAW,CAAC,CAAC;AACxC;AAQA,SAAS,cAAc,gBAAgB;AACrC,UAAQ,gBAAc;AAAA,IACpB,KAAK;AACH,aAAO,OAAK;AAAA,IACd,KAAK;AACH,aAAO,YAAY,MAAM,KAAK,MAAM,CAAG;AAAA,IACzC,KAAK;AACH,aAAO,YAAY,MAAM,GAAG,GAAK,CAAG;AAAA,IACtC,KAAK;AACH,aAAO,YAAY,GAAG,GAAG,MAAM,CAAG;AAAA,IACpC,KAAK;AACH,aAAO,YAAY,MAAM,GAAG,MAAM,CAAG;AAAA,EAG3C;AAEE,MAAI,OAAO,mBAAmB,YAAY,eAAe,WAAW,cAAc,GAAG;AACnF,UAAM,QAAQ,eAAe,MAAM,yBAAyB;AAC5D,QAAI,OAAO;AACT,YAAM,OAAO,MAAM,CAAC,EACjB,MAAM,OAAO,EACb,IAAI,MAAM,EACV,OAAO,OAAK,CAAC,OAAO,MAAM,CAAC,CAAC;AAC/B,UAAI,KAAK,WAAW,GAAG;AACrB,eAAO,YAAY,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC;AAAA,MACvD;AAAA,IACF;AAAA,EACF;AAGA,SAAO,OAAK;AACd;AAeO,SAAS,YACd,MACA,IACA,YACA,UACA,YACA,iBAAiB,UACjB;AACA,QAAM,eAAe,OACnB,OAAO,MAAM,YAAY,MAAM,QAAQ,CAAC;AAE1C,QAAM,gBAAgB,MAAM;AAC1B,QAAI,SAAU,UAAS,IAAI,CAAC;AAC5B,QAAI,WAAY,YAAW,EAAE;AAAA,EAC/B;AAEA,MAAI,CAAC,aAAa,IAAI,KAAK,CAAC,aAAa,EAAE,GAAG;AAC5C;AACA;AAAA,EACF;AAEA,MAAI,CAAC,OAAO,SAAS,UAAU,KAAK,cAAc,GAAG;AACnD;AACA;AAAA,EACF;AAEA,QAAM,QAAQ,YAAY;AAC1B,QAAM,OAAO,cAAc,cAAc;AAEzC,WAAS,KAAK,KAAK;AACjB,QAAI,KAAK,MAAM,SAAS;AACxB,QAAI,KAAK,EAAG,KAAI;AAChB,UAAM,SAAS,KAAK,CAAC;AACrB,UAAM,QAAQ,UAAU,MAAM,IAAI,QAAQ,UAAU;AACpD,QAAI,SAAU,UAAS,OAAO,MAAM;AACpC,QAAI,IAAI,GAAG;AACT,4BAAsB,IAAI;AAAA,IAC5B,WAAW,YAAY;AACrB,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAEA,wBAAsB,IAAI;AAC5B;AAcA,SAAS,kBAAkB,SAAS,eAAe;AACjD,MAAI,CAAC,QAAS,QAAO;AACrB,QAAM,OAAO,OAAO,OAAO,EAAE,KAAI,EAAG;AAEpC,MAAI,SAAS,OAAQ,QAAO;AAC5B,MAAI,SAAS,KAAM,QAAO;AAE1B,MAAI,KAAK,SAAS,GAAG,GAAG;AACtB,UAAM,IAAI,WAAW,IAAI;AACzB,WAAO,OAAO,SAAS,CAAC,IAAK,IAAI,MAAO,gBAAgB;AAAA,EAC1D;AACA,MAAI,KAAK,SAAS,IAAI,GAAG;AACvB,UAAM,IAAI,WAAW,IAAI;AACzB,WAAO,OAAO,SAAS,CAAC,IAAI,IAAI;AAAA,EAClC;AACA,QAAM,IAAI,OAAO,IAAI;AACrB,SAAO,OAAO,SAAS,CAAC,IAAI,IAAI;AAClC;AAaO,eAAe,sBAAsB,QAAQ,cAAc;;AAChE,MAAI,CAAC,UAAU,EAAC,6CAAc,SAAQ,EAAC,6CAAc,UAAU;AAE/D,QAAM,gBAAgB,gBAAgB,aAAa,IAAI;AACvD,MAAI,CAAC,iBAAiB,CAAC,cAAc,UAAU;AAC7C,YAAQ,MAAM,cAAc,aAAa,IAAI,8BAA8B;AAC3E;AAAA,EACF;AAEA,QAAM,WAAW,aAAa;AAE9B,QAAM,QAAQ,MAAM,KAAK,cAAc,QAAQ,EAAE;AACjD,QAAM;AAAA,IACJ,CAAC,GAAG,MACF,kBAAkB,EAAE,SAAS,QAAQ,IACrC,kBAAkB,EAAE,SAAS,QAAQ;AAAA,EAC3C;AAEE,QAAM,UAAU,YAAY;AAC1B,aAAS,IAAI,GAAG,IAAI,MAAM,SAAS,GAAG,KAAK;AACzC,YAAM,WAAW,MAAM,CAAC;AACxB,YAAM,SAAS,MAAM,IAAI,CAAC;AAC1B,YAAM,KAAK,kBAAkB,SAAS,SAAS,QAAQ;AACvD,YAAM,KAAK,kBAAkB,OAAO,SAAS,QAAQ;AACrD,YAAM,YAAY,KAAK;AACvB,UAAI,aAAa,EAAG;AAEpB,YAAM,YAAY,CAAA;AAClB,YAAM,UAAU,CAAA;AAGhB,iBAAW,YAAY,SAAS,OAAO;AACrC,cAAM,MAAM,SAAS,MAAM,iBAAiB,QAAQ;AAEpD,YAAI,CAAC,SAAS,WAAW,IAAI,EAAG;AAChC,kBAAU,SAAS,MAAM,CAAC,CAAC,IAAI,mBAAmB,KAAK,MAAM;AAAA,MAC/D;AAGA,iBAAW,YAAY,OAAO,OAAO;AACnC,cAAM,MAAM,OAAO,MAAM,iBAAiB,QAAQ;AAClD,YAAI,CAAC,SAAS,WAAW,IAAI,EAAG;AAChC,gBAAQ,SAAS,MAAM,CAAC,CAAC,IAAI,mBAAmB,KAAK,MAAM;AAAA,MAC7D;AAEA,YAAM,OAAO,OAAO,KAAK,SAAS,EAAE,OAAO,OAAK,KAAK,OAAO;AAC5D,UAAI,CAAC,KAAK,OAAQ;AAElB,YAAM,QAAQ;AAAA,QACZ,KAAK,IAAI,SAAO;AACd,gBAAM,UAAU,UAAU,GAAG;AAC7B,gBAAM,QAAQ,QAAQ,GAAG;AAGzB,gBAAM,eAAe,OAClB,KAAK,OAAO,EAAE,SAAS,aACpB,IACA,QAAQ,QAAQ,CAAC;AAEvB,iBAAO,QAAQ,IAAI,CAAC,aAAa,OAAO,GAAG,aAAa,KAAK,CAAC,CAAC,EAC5D,KAAK,CAAC,CAAC,cAAc,UAAU,MAAM,IAAI,QAAQ,aAAW;;AAC3D;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA,OAAK;AACH,sBAAM,EAAE,QAAQ,KAAK,aAAa,iBAAiB,QAAQ,IAAI,MAAM,GAAG,CAAC;AACzE,8BAAc,QAAQ,UAAU,CAAC;AAAA,cACnC;AAAA,cACA;AAAA,gBACAA,MAAA,aAAa,WAAb,gBAAAA,IAAqB,QAAO;AAAA,YAC5C;AAAA,UACY,CAAC,CAAC;AAAA,QACN,CAAC;AAAA,MACT;AAAA,IACI;AAAA,EACF;AAEA,MAAI,mBAAiB,kBAAa,cAAb,mBAAwB,UAAS;AACtD,MAAI,mBAAmB,cAAc,mBAAmB,YAAY;AAClE,qBAAiB;AAAA,EACnB;AAEA,MAAI,mBAAmB,UAAU;AAG/B,WAAO,MAAM;AAEX,YAAM,QAAO;AAAA,IACf;AAAA,EACF,OAAO;AACL,UAAM,QAAQ,OAAO,cAAc,KAAK;AACxC,aAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAE9B,YAAM,QAAO;AAAA,IACf;AAAA,EACF;AACF;AC7UA,IAAI,oBAAoB,oBAAI,IAAG;AAC/B,IAAI,2BAA2B;AAC/B,IAAI,gCAAgC;AAEpC,SAAS,0BAA0B;AACjC,QAAM,UAAU,2BAA0B;AAC1C,MAAI,6BAA6B,SAAS;AACxC,sBAAkB,MAAK;AACvB,+BAA2B;AAAA,EAC7B;AACF;AAEA,SAAS,wBAAwB,QAAQ;AACvC,QAAM,YAAY,iCAAQ;AAC1B,MAAI,MAAM,QAAQ,SAAS,EAAG,QAAO;AAErC,OAAI,iCAAQ,aAAY,OAAO,UAAU,eAAe,KAAK,OAAO,UAAU,WAAW,GAAG;AAC1F,WAAO,MAAM,QAAQ,OAAO,SAAS,SAAS,IAAI,OAAO,SAAS,YAAY,CAAA;AAAA,EAChF;AAEA,MAAI,iCAAQ,MAAM;AAChB,QAAI,CAAC,+BAA+B;AAClC,sCAAgC;AAChC,cAAQ;AAAA,QACN;AAAA,MACR;AAAA,IACI;AACA,WAAO,CAAC,OAAO,IAAI;AAAA,EACrB;AAEA,SAAO,CAAA;AACT;AAEA,SAAS,mBAAmB,QAAQ,QAAQ;AAC1C,SAAO,wBAAwB,MAAM,EAAE,KAAK,SAAO,WAAW,IAAI,GAAG,GAAG,MAAM,EAAE,CAAC;AACnF;AAEA,SAAS,kBAAkB,OAAO;AAChC,MAAI,CAAC,MAAO,QAAO;AAEnB,QAAM,QAAQ,MAAM,KAAI,EAAG,YAAW;AACtC,MAAI,CAAC,SAAS,UAAU,OAAQ,QAAO;AAEvC,QAAM,QAAQ,MAAM,MAAM,KAAK,EAAE,OAAO,OAAO;AAC/C,MAAI,CAAC,MAAM,OAAQ,QAAO;AAG1B,QAAM,YAAY,MAAM;AACxB,MAAI,CAAC,UAAW,QAAO;AAEvB,MAAI,aAAa;AACjB,MAAI,YAAY;AAChB,MAAI,iBAAiB;AAGrB,MAAI,MAAM,QAAQ;AAChB,UAAM,YAAY,MAAM,CAAC;AACzB,QAAI,KAAK,KAAK,SAAS,GAAG;AACxB,YAAM,MAAK;AACX,UAAI,UAAU,SAAS,IAAI,GAAG;AAC5B,qBAAa,WAAW,SAAS;AAAA,MACnC,WAAW,UAAU,SAAS,GAAG,GAAG;AAClC,qBAAa,WAAW,SAAS,IAAI;AAAA,MACvC,OAAO;AACL,qBAAa,WAAW,SAAS;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AAGA,QAAM,WAAW,MAAM,UAAU,OAAK,MAAM,cAAc,MAAM,UAAU;AAC1E,MAAI,aAAa,IAAI;AACnB,qBAAiB;AACjB,UAAM,OAAO,UAAU,CAAC;AAAA,EAC1B,WAAW,MAAM,QAAQ;AACvB,UAAM,aAAa,SAAS,MAAM,MAAM,SAAS,CAAC,GAAG,EAAE;AACvD,QAAI,OAAO,SAAS,UAAU,KAAK,aAAa,GAAG;AACjD,uBAAiB;AACjB,YAAM,IAAG;AAAA,IACX;AAAA,EACF;AAGA,MAAI,MAAM,QAAQ;AAChB,gBAAY,MAAM,KAAK,GAAG;AAAA,EAC5B;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,IACV,WAAW,EAAE,OAAO,eAAc;AAAA,IAClC,QAAQ,EAAE,KAAK,UAAS;AAAA,EAC5B;AACA;AAIA,SAAS,mBAAmB,OAAO;AACjC,MAAI,CAAC,MAAO,QAAO;AAEnB,QAAM,QAAQ,MAAM,KAAI,EAAG,YAAW;AACtC,MAAI,CAAC,SAAS,UAAU,OAAQ,QAAO;AAEvC,QAAM,QAAQ,MAAM,MAAM,KAAK,EAAE,OAAO,OAAO;AAC/C,MAAI,CAAC,MAAM,OAAQ,QAAO;AAE1B,QAAM,YAAY,MAAM;AACxB,MAAI;AAEJ,MAAI,UAAU,SAAS,IAAI,GAAG;AAC5B,iBAAa,WAAW,SAAS;AAAA,EACnC,WAAW,UAAU,SAAS,GAAG,GAAG;AAClC,iBAAa,WAAW,SAAS,IAAI;AAAA,EACvC,OAAO;AACL,iBAAa,WAAW,SAAS;AAAA,EACnC;AAEA,MAAI,CAAC,OAAO,SAAS,UAAU,KAAK,cAAc,GAAG;AACnD,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,MAAM,KAAK,GAAG,KAAK;AAErC,SAAO;AAAA,IACL,UAAU;AAAA,IACV,QAAQ,EAAE,KAAK,UAAS;AAAA,EAC5B;AACA;AASO,SAAS,WAAW,UAAU;AACnC,0BAAuB;AACvB,MAAI,kBAAkB,IAAI,QAAQ,GAAG;AACnC,WAAO,kBAAkB,IAAI,QAAQ,KAAK;AAAA,EAC5C;AAEA,MAAI,QAAQ;AACZ,aAAW,SAAS,SAAS,aAAa;AACxC,QAAI;AACJ,QAAI;AACF,cAAQ,MAAM;AAAA,IAChB,QAAQ;AAEN;AAAA,IACF;AACA,eAAW,QAAQ,OAAO;AACxB,UAAI,CAAC,KAAK,aAAc;AACxB,YAAM,YAAY,KAAK,aAAa,MAAM,GAAG;AAC7C,iBAAW,OAAO,WAAW;AAC3B,YAAI,IAAI,OAAO,MAAM,KAAK,EAAE,SAAS,QAAQ,GAAG;AAC9C,kBAAQ;AACR;AAAA,QACF;AAAA,MACF;AACA,UAAI,MAAO;AAAA,IACb;AACA,QAAI,MAAO;AAAA,EACb;AAEA,oBAAkB,IAAI,UAAU,KAAK;AACrC,SAAO,SAAS;AAClB;AASO,SAAS,iBAAiB,QAAQ,MAAM;AAC7C,QAAM,MAAM,KAAK,KAAK,SAAS,CAAC;AAChC,QAAM,SAAS,KAAK,MAAM,GAAG,EAAE,EAAE,OAAO,CAAC,GAAG,MAAM;AAChD,QAAI,EAAE,CAAC,KAAK,KAAM,GAAE,CAAC,IAAI;AACzB,WAAO,EAAE,CAAC;AAAA,EACZ,GAAG,MAAM;AACT,SAAO,EAAE,QAAQ;AACnB;AAcO,SAAS,mBAAmB,OAAO,WAAW,MAAM;AACzD,MAAI;AAEJ,MAAI,WAAW,KAAK,KAAK,GAAG;AAC1B,aAAS,MAAM,MAAM,GAAG,EAAE,EAAE,MAAM,GAAG,EAAE,IAAI,OAAK,WAAW,EAAE,KAAI,CAAE,CAAC;AAAA,EACtE,WAAW,CAAC,OAAO,MAAM,WAAW,KAAK,CAAC,GAAG;AAC3C,aAAS,WAAW,KAAK;AAAA,EAC3B,OAAO;AACL,aAAS,MAAM,QAAQ,gBAAgB,EAAE;AAAA,EAC3C;AAEA,MAAI,OAAO,WAAW,UAAU;AAC9B,YAAQ,OAAO,CAAC,GAAC;AAAA,MACf,KAAK,KAAK;AACR,cAAM,IAAI,OAAO,MAAM,CAAC;AACxB,eAAO,SAAS,CAAC;AAAA,MACnB;AAAA,MACA,KAAK,KAAK;AACR,YAAI,CAAC,UAAU;AACb,kBAAQ,MAAM,uDAAuD,MAAM;AAC3E,iBAAO;AAAA,QACT;AACA,YAAI;AACF,gBAAM,cAAc,SAAS,SAAS,MAAM,QAAQ,MAAM;AAC1D,gBAAM,mBAAmB,KAAK,QAAQ,WAAW;AACjD,gBAAM,OAAO,OAAO,MAAM,GAAG;AAC7B,cAAI,KAAK,SAAS,GAAG;AACnB,kBAAM,IAAI,MAAM,iDAAiD;AAAA,UACnE;AACA,gBAAM,eAAe,iBAAiB,eAAe,KAAK,CAAC,EAAE,MAAM,CAAC,CAAC;AACrE,cAAI,CAAC,cAAc;AACjB,kBAAM,IAAI,MAAM,mCAAmC,MAAM;AAAA,UAC3D;AACA,eAAK,MAAK;AACV,gBAAM,EAAE,QAAQ,IAAG,IAAK,iBAAiB,cAAc,IAAI;AAC3D,iBAAO,OAAO,GAAG;AAAA,QACnB,SAAS,KAAK;AACZ,kBAAQ,MAAM,GAAG;AACjB,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,IAGN;AAAA,EACE;AAEA,SAAO;AACT;AASO,SAAS,cAAc,QAAQ,KAAK,OAAO;AAChD,MAAI,CAAC,OAAQ;AACb,QAAM,SAAS,OAAO,GAAG;AAEzB,MAAI;AACF,QAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,UAAI,UAAU,OAAO,OAAO,QAAQ,YAAY;AAC9C,eAAO,IAAI,GAAG,KAAK;AAAA,MACrB,WAAW,OAAO,WAAW,YAAY;AACvC,eAAO,GAAG,KAAK;AAAA,MACjB,OAAO;AACL,eAAO,GAAG,IAAI;AAAA,MAChB;AACA;AAAA,IACF;AAGA,QAAI,UAAU,OAAO,OAAO,QAAQ,YAAY;AAC9C,aAAO,IAAI,KAAK;AAAA,IAClB,WAAW,OAAO,WAAW,YAAY;AACvC,aAAO,KAAK;AAAA,IACd,OAAO;AACL,aAAO,GAAG,IAAI;AAAA,IAChB;AAAA,EACF,SAAS,KAAK;AACZ,YAAQ,KAAK,oBAAoB,GAAG,SAAS,OAAO,GAAG;AAAA,EACzD;AACF;AASA,SAAS,YAAY,MAAM,QAAQ,aAAa,MAAM;AACpD,MAAI,CAAC,QAAQ,CAAC,KAAK,SAAS,CAAC,OAAQ;AAErC,QAAM,QAAQ,OAAO,SAAS;AAC9B,SAAO,SAAS,WAAW,OAAO,SAAS,YAAY,uBAAO,OAAO,IAAI;AAGzE,OACE,+BAAO,aAAa,gBACpB,+BAAO,aAAa,oBACpB,+BAAO,aAAa,mBACpB,+BAAO,aAAa,oBACpB,+BAAO,aAAa,kBACpB,+BAAO,aAAa,qBACpB,mBAAmB,QAAQ,QAAQ,KACnC,mBAAmB,QAAQ,QAAQ,KAClC,OAAO,SAAS,SAAS,WAAW,IAAI,OAAO,SAAS,KAAK,QAAQ,KACrE,OAAO,SAAS,SAAS,WAAW,IAAI,OAAO,SAAS,KAAK,QAAQ,GACtE;AACA,WAAO,OAAO,OAAO,CAAC;AAAA,EACxB,OAAO;AACL,WAAO,OAAO,QAAQ,CAAC;AAAA,EACzB;AAEA,WAAS,IAAI,GAAG,IAAI,KAAK,MAAM,QAAQ,KAAK;AAC5C,UAAM,UAAU,KAAK,MAAM,CAAC;AAC5B,UAAM,QAAQ,KAAK,MAAM,iBAAiB,OAAO,EAAE;AAEnD,QAAI,CAAC,QAAQ,WAAW,IAAI,EAAG;AAG/B,QAAI,YAAY,gBAAgB;AAC9B,YAAM,MAAM,mBAAmB,KAAK;AACpC,aAAO,aAAa;AACpB;AAAA,IACF;AAGA,QAAI,YAAY,eAAe;AAC7B,YAAM,UAAU,kBAAkB,KAAK;AACvC,aAAO,YAAY;AACnB;AAAA,IACF;AAGA,UAAM,OAAO,QAAQ,MAAM,CAAC;AAC5B,UAAM,OAAO,KAAK,MAAM,GAAG;AAC3B,UAAM,SAAS,mBAAmB,OAAO,MAAM;AAC/C,UAAM,EAAE,QAAQ,IAAG,IAAK,iBAAiB,QAAQ,IAAI;AAErD,UAAM,cAAc,CAAC,kBAAkB;;AACrC,UAAI,kBAAkB,OAAW;AAEjC,YAAM,aAAa,OAAO;AAC1B,YAAM,aAAa,OAAO,GAAG;AAC7B,YAAM,eACJ,cAAc,OAAO,WAAW,YAAY,aACxC,WAAW,QAAO,IAClB;AAEN,YAAM,YAAW,yCAAY,aAAY;AACzC,YAAM,aAAW,8CAAY,WAAZ,mBAAoB,QAAO;AAC5C,YAAM,eACJ,cACA,WAAW,MACV,OAAO,iBAAiB,YAAY,MAAM,QAAQ,YAAY,OAC9D,OAAO,kBAAkB,YAAY,MAAM,QAAQ,aAAa;AAEnE,UAAI,cAAc;AAChB;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA,OAAK,cAAc,QAAQ,KAAK,CAAC;AAAA,UACjC,MAAM;AACJ,mBAAO,cAAc;AAAA,cACnB,MAAM;AAAA,cACN,QAAQ;AAAA,cACR,QAAQ,EAAE,UAAU,YAAY,IAAI,OAAM;AAAA,YACtD,CAAW;AAAA,UACH;AAAA,UACA;AAAA,QACR;AAAA,MACI,OAAO;AACL,sBAAc,QAAQ,KAAK,aAAa;AAAA,MAC1C;AAAA,IACF;AAEA,QAAI,UAAU,OAAO,OAAO,SAAS,YAAY;AAC/C,aAAO,KAAK,WAAW,EAAE;AAAA,QAAM,SAC7B,QAAQ,MAAM,+BAA+B,SAAS,GAAG;AAAA,MAC/D;AAAA,IACE,OAAO;AACL,kBAAY,MAAM;AAAA,IACpB;AAAA,EACF;AAIC,MAAI,OAAO,WAAW;AAEnB,QAAI,CAAC,OAAO,SAAS,mBAAmB;AACtC,aAAO,SAAS,oBAAoB;AAEpC,OAAC,YAAY;AACX,YAAI;AACF,gBAAM,sBAAsB,QAAQ,OAAO,SAAS;AAAA,QACtD,SAAS,KAAK;AACZ,kBAAQ,MAAM,GAAG;AAAA,QACnB,UAAC;AAGC,iBAAO,SAAS,oBAAoB;AAAA,QACtC;AAAA,MACF;IACF;AAAA,EACF;AACF;AAQO,SAAS,aAAa,YAAY,MAAM;AAC7C,QAAM,UAAU,KAAK,kBAAkB,IAAI,UAAU;AACrD,MAAI,SAAS;AACX,gBAAY,YAAY,OAAO;AAAA,EACjC;AACF;AAOO,SAAS,eAAe,MAAM;AACnC,aAAW,OAAO,KAAK,gBAAgB;AACrC,UAAM,UAAU,wBAAwB,GAAG;AAC3C,KAAC,IAAI,SAAS,eAAe,CAAA,GAAI,QAAQ,WAAS;AAChD,cAAQ,QAAQ,SAAO;AACrB,cAAM,OAAO,WAAW,IAAI,GAAG,GAAG,KAAK,EAAE;AACzC,YAAI,KAAM,aAAY,MAAM,GAAG;AAAA,MACjC,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAEA,aAAW,OAAO,KAAK,eAAe;AACpC,QAAI,CAAC,IAAI,SAAS,MAAO;AACzB,KAAC,IAAI,SAAS,eAAe,CAAA,GAAI,QAAQ,WAAS;AAChD,YAAM,OAAO,WAAW,IAAI,IAAI,SAAS,KAAK,GAAG,KAAK,EAAE;AACxD,UAAI,KAAM,aAAY,MAAM,GAAG;AAAA,IACjC,CAAC;AAAA,EACH;AACF;AAOO,SAAS,UAAU,MAAM;AAC9B,aAAW,OAAO,KAAK,gBAAgB;AACrC,eAAW,OAAO,wBAAwB,GAAG,GAAG;AAC9C,YAAM,OAAO,WAAW,IAAI,GAAG,EAAE;AACjC,UAAI,KAAM,aAAY,MAAM,KAAK,IAAI,GAAG,EAAE;AAAA,IAC5C;AAAA,EACF;AACA,aAAW,OAAO,KAAK,eAAe;AACpC,QAAI,CAAC,IAAI,SAAS,MAAO;AACzB,UAAM,OAAO,WAAW,IAAI,IAAI,SAAS,KAAK,EAAE;AAChD,QAAI,KAAM,aAAY,MAAM,KAAK,IAAI,IAAI,SAAS,KAAK,EAAE;AAAA,EAC3D;AACF;AAOO,SAAS,kBAAkB,MAAM;;AACtC,QAAM,QAAQ,KAAK,SAAS,eAAe,CAAA;AAE3C,0BAAwB,IAAI,EAAE,QAAQ,SAAO;AAC3C,UAAM,OAAO,WAAW,IAAI,GAAG,EAAE;AACjC,QAAI,KAAM,aAAY,MAAM,IAAI;AAAA,EAClC,CAAC;AAED,MAAI,KAAK,SAAS,OAAO;AACvB,UAAM,aAAa,WAAW,IAAI,KAAK,SAAS,KAAK,EAAE;AACvD,QAAI,WAAY,aAAY,YAAY,IAAI;AAAA,EAC9C;AAEA,QAAM,QAAQ,WAAS;AACrB,4BAAwB,IAAI,EAAE,QAAQ,SAAO;AAC3C,YAAM,UAAU,WAAW,IAAI,GAAG,GAAG,KAAK,EAAE;AAC5C,UAAI,QAAS,aAAY,SAAS,IAAI;AAAA,IACxC,CAAC;AAAA,EACH,CAAC;AAED,MAAI,KAAK,SAAS,OAAO;AACvB,UAAM,QAAQ,WAAS;AACrB,YAAM,SAAS,WAAW,IAAI,KAAK,SAAS,KAAK,GAAG,KAAK,EAAE;AAC3D,UAAI,OAAQ,aAAY,QAAQ,IAAI;AAAA,IACtC,CAAC;AAAA,EACH;AAEA,OAAI,UAAK,SAAS,UAAd,mBAAqB,aAAa,UAAU;AAC9C,gBAAY,KAAK,SAAS,OAAO,IAAI;AAAA,EACvC;AACF;AAOO,SAAS,kBAAkB,MAAM;AACtC,0BAAwB,IAAI,EAAE,QAAQ,SAAO;AAC3C,UAAM,OAAO,WAAW,IAAI,GAAG,SAAS;AACxC,QAAI,KAAM,aAAY,MAAM,IAAI;AAAA,EAClC,CAAC;AACD,MAAI,KAAK,SAAS,OAAO;AACvB,UAAM,OAAO,WAAW,IAAI,KAAK,SAAS,KAAK,SAAS;AACxD,QAAI,KAAM,aAAY,MAAM,IAAI;AAAA,EAClC;AACF;ACzgBA,MAAM,YAAY,IAAI,MAAM;AAC5B,MAAM,aAAa,IAAI,MAAM;AAG7B,UAAU,OAAO,IAAI,CAAC;AAItB,SAAS,QAAQ,KAAK,MAAM;AAC1B,MAAI,IAAI,SAAS,IAAI,EAAG,QAAO;AAC/B,MAAI,KAAK,IAAI;AACb,SAAO;AACT;AAEA,SAAS,QAAQ,KAAK,MAAM;AAC1B,QAAM,UAAU,IAAI,SAAS,IAAI;AACjC,MAAI,CAAC,QAAS,QAAO;AACrB,kBAAgB,KAAK,IAAI;AACzB,SAAO;AACT;AAIA,SAAS,yBAAyB,MAAM;AACtC,MAAI,EAAC,6BAAM,oBAAmB,CAAC,KAAK,uBAAwB;AAC5D,uBAAqB,KAAK,eAAe;AACzC,OAAK,kBAAkB;AACvB,QAAM,MAAM,KAAK;AACjB,OAAK,yBAAyB;AAC9B,sBAAoB,KAAK,IAAI;AAC/B;AAEO,SAAS,2BAA2B,QAAQ,MAAM;;AACvD,2BAAyB,IAAI;AAC7B,QAAM,MAAM,KAAK;AACjB,MAAI,CAAC,IAAK;AAEV,QAAM,eAAe,QAAQ,IAAI,SAAS,aAAa,QAAQ;AAE/D,QAAM,QAAQ;AAAA,IACZ,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,eAAe,IAAI,SAAS;AAAA,IAC5B,iBAAiB,KAAK;AAAA,EAC1B;AAEE,YAAI,SAAS,MAAM,YAAnB,mBAA4B,KAAK,IAAI,SAAS,OAAO;AACrD,MAAI,aAAc,mBAAkB,GAAG;AACzC;AAEO,SAAS,iCAAiC,QAAQ,MAAM;AAC7D,MAAI,CAAC,KAAK,cAAe;AAEzB,OAAK,yBAAyB;AAC9B,MAAI,KAAK,gBAAiB;AAE1B,OAAK,kBAAkB,sBAAsB,MAAM;AACjD,UAAM,MAAM,KAAK;AACjB,SAAK,yBAAyB;AAC9B,SAAK,kBAAkB;AACvB,QAAI,CAAC,OAAO,CAAC,KAAK,SAAU;AAC5B,wBAAoB,KAAK,IAAI;AAAA,EAC/B,CAAC;AACH;AAEA,SAAS,oBAAoB,QAAQ,MAAM;;AACzC,WAAS,QAAQ,KAAK,eAAe,KAAK,OAAO;AAEjD,QAAM,YAAY,UAAU,iBAAiB,KAAK,YAAY,UAAU,IAAI,EAAE,CAAC;AAC/E,QAAM,UAAU,KAAK;AAErB,MAAI,WAAW;AACb,UAAM,YAAY,UAAU;AAC5B,QAAI,uBAAuB;AAE3B,QAAI,cAAc,SAAS;AACzB,UAAI,SAAS;AACX,cAAM,eAAe,QAAQ,QAAQ,SAAS,aAAa,QAAQ;AACnE,sBAAQ,SAAS,MAAM,iBAAvB,mBAAqC,KAAK,QAAQ,SAAS,OAAO;AAAA,UAChE,MAAM;AAAA,UACN,aAAa;AAAA,UACb,UAAU;AAAA,UACV,YAAY;AAAA,UACZ,eAAe,QAAQ,SAAS;AAAA,UAChC,iBAAiB,KAAK;AAAA,QAChC;AACQ,YAAI,aAAc,mBAAkB,OAAO;AAAA,MAC7C;AAEA,WAAK,oBAAoB;AAEzB,sBAAU,SAAS,MAAM,iBAAzB,mBAAuC,KAAK,UAAU,SAAS,OAAO;AAAA,QACpE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,eAAe,UAAU,SAAS;AAAA,QAClC,iBAAiB,UAAU;AAAA,MACnC;AACM,6BAAuB;AAAA,IACzB;AAEA,QAAI,QAAQ,UAAU,SAAS,aAAa,QAAQ,GAAG;AACrD,6BAAuB;AAAA,IACzB;AACA,SAAK,mBAAmB,UAAU;AAElC,oBAAU,SAAS,MAAM,gBAAzB,mBAAsC,KAAK,UAAU,SAAS,OAAO;AAAA,MACnE,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,eAAe,UAAU,SAAS;AAAA,MAClC,iBAAiB,UAAU;AAAA,IACjC;AAEI,QAAI,qBAAsB,mBAAkB,SAAS;AAAA,EACvD,WAAW,SAAS;AAClB,UAAM,eAAe,QAAQ,QAAQ,SAAS,aAAa,QAAQ;AACnE,kBAAQ,SAAS,MAAM,iBAAvB,mBAAqC,KAAK,QAAQ,SAAS,OAAO;AAAA,MAChE,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,eAAe,QAAQ,SAAS;AAAA,MAChC,iBAAiB,KAAK;AAAA,IAC5B;AACI,QAAI,aAAc,mBAAkB,OAAO;AAC3C,SAAK,oBAAoB;AAAA,EAC3B;AACF;AAEO,SAAS,+BAA+B,QAAQ,MAAM;;AAC3D,2BAAyB,IAAI;AAC7B,QAAM,MAAM,KAAK;AACjB,MAAI,CAAC,IAAK;AAEV,QAAM,gBAAgB,QAAQ,IAAI,SAAS,aAAa,SAAS;AAEjE,QAAM,QAAQ;AAAA,IACZ,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,eAAe,IAAI,SAAS;AAAA,IAC5B,iBAAiB,KAAK;AAAA,EAC1B;AAEE,YAAI,SAAS,MAAM,gBAAnB,mBAAgC,KAAK,IAAI,SAAS,OAAO;AACzD,MAAI,cAAe,mBAAkB,GAAG;AAC1C;AAEO,SAAS,6BAA6B,QAAQ,MAAM;;AACzD,2BAAyB,IAAI;AAC7B,QAAM,MAAM,KAAK;AACjB,MAAI,CAAC,IAAK;AAEV,QAAM,gBAAgB,QAAQ,IAAI,SAAS,aAAa,SAAS;AAEjE,QAAM,QAAQ;AAAA,IACZ,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,eAAe,IAAI,SAAS;AAAA,IAC5B,iBAAiB,KAAK;AAAA,EAC1B;AAEE,YAAI,SAAS,MAAM,cAAnB,mBAA8B,KAAK,IAAI,SAAS,OAAO;AACvD,MAAI,cAAe,mBAAkB,GAAG;AAC1C;AAEO,SAAS,iCAAiC,QAAQ,MAAM;;AAC7D,2BAAyB,IAAI;AAC7B,QAAM,MAAM,KAAK;AACjB,MAAI,CAAC,IAAK;AAEV,QAAM,eAAe,QAAQ,IAAI,SAAS,aAAa,QAAQ;AAE/D,QAAM,QAAQ;AAAA,IACZ,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,eAAe,IAAI,SAAS;AAAA,IAC5B,iBAAiB,KAAK;AAAA,EAC1B;AAEE,YAAI,SAAS,MAAM,eAAnB,mBAA+B,KAAK,IAAI,SAAS,OAAO;AACxD,MAAI,aAAc,mBAAkB,GAAG;AACzC;AAEO,SAAS,iCAAiC,QAAQ,MAAM;;AAC7D,2BAAyB,IAAI;AAC7B,QAAM,MAAM,KAAK;AACjB,MAAI,CAAC,IAAK;AAEV,QAAM,QAAQ;AAAA,IACZ,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,eAAe,IAAI,SAAS;AAAA,IAC5B,iBAAiB,KAAK;AAAA,EAC1B;AAEE,YAAI,SAAS,MAAM,kBAAnB,mBAAkC,KAAK,IAAI,SAAS,OAAO;AAC7D;AASA,SAAS,SAAS,QAAQ,QAAQ,aAAa;AAC7C,MAAI,CAAC,OAAQ;AAEb,QAAM,WAAW,eAAe,OAAO,iBAAiB,OAAO;AAC/D,QAAM,OAAO,SAAS;AAEtB,SAAO,kBAAiB;AAExB,aAAW;AAAA,KACP,OAAO,UAAU,KAAK,QAAQ,KAAK,QAAS,IAAI;AAAA,IACjD,EAAE,OAAO,UAAU,KAAK,OAAO,KAAK,SAAU,IAAI;AAAA,EACvD;AAEE,YAAU,cAAc,YAAY,MAAM;AAC5C;ACxNA,MAAM,QAAN,MAAM,MAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAST,OAAO,QAAQ,SAAS;AACtB,QAAI,MAAK,SAAS,IAAI,OAAO,GAAG;AAC9B,aAAO,MAAK,SAAS,IAAI,OAAO;AAAA,IAClC;AACA,YAAQ,MAAM,mCAAmC,OAAO;AACxD,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,YAAY,SAAS,UAAU,OAAO,SAAS,MAAM,kBAAkB,MAAM;AAC3E,SAAK,UAAU;AACf,WAAO,eAAe,SAAS,QAAQ;AAAA,MACrC,OAAO;AAAA,MACP,YAAY;AAAA,IAClB,CAAK;AAED,SAAK,gBAAgB;AACrB,SAAK,cAAc;AACnB,SAAK,gBAAgB;AAErB,SAAK,iBAAiB,oBAAI,IAAG;AAC7B,SAAK,gBAAgB,oBAAI,IAAG;AAC5B,SAAK,oBAAoB,oBAAI,QAAO;AACpC,SAAK,gBAAgB,oBAAI,IAAG;AAC5B,SAAK,mBAAmB,oBAAI,IAAG;AAE/B,SAAK,cAAc,CAAA;AACnB,SAAK,yBAAyB,oBAAI,QAAO;AACzC,SAAK,uBAAuB;AAC5B,SAAK,kBAAkB;AACvB,SAAK,yBAAyB;AAE9B,SAAK,oBAAoB;AACzB,SAAK,mBAAmB;AACxB,UAAK,SAAS,IAAI,SAAS,IAAI;AAG/B,SAAK,UAAS;AAGd,SAAK,oBAAoB,SAAO;AAC9B,uCAAiC,KAAK,IAAI;AAAA,IAC5C;AACA,SAAK,cAAc,SAAO;AACxB,iCAA2B,KAAK,IAAI;AAAA,IACtC;AACA,SAAK,kBAAkB,SAAO;AAC5B,qCAA+B,KAAK,IAAI;AAAA,IAC1C;AACA,SAAK,gBAAgB,SAAO;AAC1B,mCAA6B,KAAK,IAAI;AAAA,IACxC;AACA,SAAK,oBAAoB,SAAO;AAC9B,uCAAiC,KAAK,IAAI;AAAA,IAC5C;AACA,SAAK,oBAAoB,SAAO;AAC9B,UAAI,eAAc;AAClB,uCAAiC,KAAK,IAAI;AAAA,IAC5C;AAEA,YAAQ,iBAAiB,aAAa,KAAK,iBAAiB;AAC5D,YAAQ,iBAAiB,SAAS,KAAK,WAAW;AAClD,YAAQ,iBAAiB,aAAa,KAAK,eAAe;AAC1D,YAAQ,iBAAiB,WAAW,KAAK,aAAa;AACtD,YAAQ,iBAAiB,YAAY,KAAK,iBAAiB;AAC3D,YAAQ,iBAAiB,eAAe,KAAK,iBAAiB;AAG9D,cAAU,IAAI;AAGd,SAAK,qBAAqB,IAAI,iBAAiB,MAAM;AACnD,UAAI,KAAK,qBAAsB;AAC/B,gCAAyB;AACzB,WAAK,uBAAuB;AAC5B,4BAAsB,MAAM;AAC1B,aAAK,uBAAuB;AAC5B,kBAAU,IAAI;AACd,aAAK,sBAAqB;AAAA,MAC5B,CAAC;AAAA,IACH,CAAC;AAED,SAAK,wBAAwB,UAAQ;AACnC,UAAI,CAAC,KAAM;AACX,YAAM,UAAU,CAAA;AAChB,UAAI,KAAK,aAAa,SAAS;AAC7B,gBAAQ,KAAK,IAAI;AAAA,MACnB,WAAW,OAAO,KAAK,qBAAqB,YAAY;AACtD,gBAAQ,KAAK,GAAG,KAAK,iBAAiB,OAAO,CAAC;AAAA,MAChD;AACA,cAAQ,QAAQ,aAAW;AACzB,YAAI,KAAK,uBAAuB,IAAI,OAAO,EAAG;AAC9C,aAAK,uBAAuB,IAAI,OAAO;AACvC,aAAK,mBAAmB,QAAQ,SAAS;AAAA,UACvC,WAAW;AAAA,UACX,eAAe;AAAA,UACf,SAAS;AAAA,QACnB,CAAS;AAAA,MACH,CAAC;AAAA,IACH;AAEA,SAAK,qBAAqB,IAAI,iBAAiB,kBAAgB;AAC7D,mBAAa,QAAQ,cAAY;AAC/B,YAAI,mBAAmB;AACvB,iBAAS,WAAW,QAAQ,UAAQ;AAClC,cAAI,KAAK,aAAa,KAAK,gBAAgB,KAAK,aAAa,SAAS;AACpE,iBAAK,sBAAsB,IAAI;AAC/B,+BAAmB;AAAA,UACrB,WAAW,KAAK,aAAa,KAAK,gBAAgB,OAAO,KAAK,kBAAkB,cAAc,KAAK,cAAc,OAAO,GAAG;AACzH,iBAAK,sBAAsB,IAAI;AAC/B,+BAAmB;AAAA,UACrB;AAAA,QACF,CAAC;AACD,iBAAS,aAAa,QAAQ,UAAQ;AACpC,cAAI,KAAK,aAAa,KAAK,iBAAiB,KAAK,aAAa,WAAY,OAAO,KAAK,kBAAkB,cAAc,KAAK,cAAc,OAAO,IAAK;AACnJ,+BAAmB;AAAA,UACrB;AAAA,QACF,CAAC;AACD,YAAI,kBAAkB;AACpB,oCAAyB;AACzB,eAAK,qBAAoB;AAAA,QAC3B;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAED,SAAK,sBAAsB,KAAK,OAAO;AACvC,QAAI,SAAS,MAAM;AACjB,WAAK,sBAAsB,SAAS,IAAI;AACxC,WAAK,mBAAmB,QAAQ,SAAS,MAAM;AAAA,QAC7C,WAAW;AAAA,QACX,SAAS;AAAA,MACjB,CAAO;AAAA,IACH;AAGA,SAAK,iBAAiB,IAAI,iBAAiB,kBAAgB;AACzD,mBAAa,QAAQ,cAAY;AAC/B,YAAI,SAAS,OAAO,aAAa,SAAU;AAE3C,gBAAQ,SAAS,MAAI;AAAA,UACnB,KAAK,aAAa;AAChB,qBAAS,IAAI,GAAG,IAAI,SAAS,WAAW,QAAQ,KAAK;AACnD,oBAAM,OAAO,SAAS,WAAW,CAAC;AAClC,kBAAI,KAAK,aAAa,KAAK,gBAAgB,KAAK,aAAa,UAAU;AACrE,oBAAI,KAAK,aAAa,SAAS;AAC7B,uBAAK,sBAAsB,IAAI;AAC/B,4CAAyB;AACzB,uBAAK,qBAAoB;AAAA,gBAC3B,OAAO;AACL,uBAAK,YAAY,IAAI;AACrB,wBAAM,UAAU,KAAK,gBAAgB,IAAI;AACzC,sBAAI,SAAS;AACX,sCAAkB,OAAO;AAAA,kBAC3B;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AACA,qBAAS,IAAI,GAAG,IAAI,SAAS,aAAa,QAAQ,KAAK;AACrD,oBAAM,OAAO,SAAS,aAAa,CAAC;AACpC,kBAAI,KAAK,aAAa,KAAK,gBAAgB,KAAK,aAAa,UAAU;AACrE,oBAAI,KAAK,aAAa,WAAY,OAAO,KAAK,kBAAkB,cAAc,KAAK,cAAc,OAAO,GAAI;AAC1G,4CAAyB;AACzB,uBAAK,qBAAoB;AAAA,gBAC3B;AACA,qBAAK,cAAc,KAAK,kBAAkB,IAAI,IAAI,CAAC;AAAA,cACrD;AAAA,YACF;AACA;AAAA,UACF;AAAA,UACA,KAAK,cAAc;AACjB,kBAAM,SAAS,SAAS;AACxB,kBAAM,UAAU,OAAO;AACvB,gBAAI,CAAC,QAAS;AAEd,gBAAI,SAAS,kBAAkB,MAAM;AACnC,mBAAK,qBAAqB,SAAS,MAAM;AACzC,gCAAkB,OAAO;AAAA,YAC3B,WAAW,SAAS,kBAAkB,SAAS;AAC7C,mBAAK,qBAAqB,SAAS,MAAM;AACzC,gCAAkB,OAAO;AAAA,YAC3B,WAAW,SAAS,kBAAkB,SAAS;AAE7C,2BAAa,QAAQ,IAAI;AAAA,YAC3B;AACA;AAAA,UACF;AAAA,QACV;AAAA,MACM,CAAC;AAAA,IACH,CAAC;AAED,SAAK,eAAe,QAAQ,KAAK,SAAS;AAAA,MACxC,YAAY;AAAA,MACZ,WAAW;AAAA,MACX,iBAAiB,CAAC,SAAS,MAAM,OAAO;AAAA,MACxC,SAAS;AAAA,IACf,CAAK;AAGD,SAAK,WAAW;AAChB,SAAK,QAAQ,kBACT,gBAAgB,KAAK,IAAI,IACzB,MAAM;AACJ,UAAI,CAAC,KAAK,SAAU;AACpB,WAAK,YAAY,QAAQ,YAAU,OAAM,CAAE;AAC3C,4BAAsB,KAAK,KAAK;AAChC,UAAI,KAAK,eAAe;AACtB,aAAK,cAAc,OAAO,KAAK,aAAa,KAAK,aAAa;AAAA,MAChE;AAAA,IACF;AAGJ,SAAK,kBAAkB,IAAI,eAAe,aAAW;AACnD,iBAAW,KAAK,SAAS;AACvB,cAAM,EAAE,OAAO,WAAW,EAAE;AAC5B,cAAM,MAAM,OAAO,oBAAoB;AACvC,aAAK,cAAc,cAAc,GAAG;AAEpC,cAAM,YAAY,KAAK,IAAI,OAAO,CAAC;AACnC,cAAM,aAAa,KAAK,IAAI,QAAQ,CAAC;AACrC,aAAK,cAAc,QAAQ,WAAW,YAAY,KAAK;AAEvD,YAAI,KAAK,iBAAiB,KAAK,cAAc,qBAAqB;AAChE,eAAK,cAAc,SAAS,YAAY;AAAA,QAC1C;AACA,YAAI,KAAK,eAAe;AACtB,eAAK,cAAc;QACrB;AAAA,MACF;AAAA,IACF,CAAC;AACD,SAAK,gBAAgB,QAAQ,KAAK,OAAO;AAEzC,SAAK,MAAK;AAAA,EACZ;AAAA,EAEA,uBAAuB;AACrB,QAAI,KAAK,qBAAsB;AAC/B,SAAK,uBAAuB;AAC5B,0BAAsB,MAAM;AAC1B,WAAK,uBAAuB;AAC5B,gBAAU,IAAI;AACd,WAAK,sBAAqB;AAAA,IAC5B,CAAC;AAAA,EACH;AAAA,EAEA,wBAAwB;AACtB,UAAM,UAAU,oBAAI,IAAG;AACvB,eAAW,WAAW,KAAK,gBAAgB;AACzC,UAAI,CAAC,QAAQ,IAAI,OAAO,GAAG;AACzB,gBAAQ,IAAI,OAAO;AACnB,0BAAkB,OAAO;AAAA,MAC3B;AAAA,IACF;AACA,eAAW,WAAW,KAAK,eAAe;AACxC,UAAI,CAAC,QAAQ,IAAI,OAAO,GAAG;AACzB,gBAAQ,IAAI,OAAO;AACnB,0BAAkB,OAAO;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AAAA,EAEA,oBAAoB,OAAO;AACzB,QAAI,MAAM,QAAQ,KAAK,EAAG,QAAO,MAAM,OAAO,OAAO,EAAE,IAAI,MAAM;AACjE,QAAI,OAAO,UAAU,SAAU,QAAO,MAAM,MAAM,KAAK,EAAE,OAAO,OAAO;AACvE,QAAI,SAAS,OAAO,MAAM,OAAO,QAAQ,MAAM,YAAY;AACzD,aAAO,MAAM,KAAK,KAAK,EAAE,OAAO,OAAO,EAAE,IAAI,MAAM;AAAA,IACrD;AACA,WAAO,CAAA;AAAA,EACT;AAAA,EAEA,yBAAyB,SAAS;AAChC,QAAI,OAAO,UAAU,eAAe,KAAK,SAAS,WAAW,EAAG;AAChE,WAAO,eAAe,SAAS,aAAa;AAAA,MAC1C,YAAY;AAAA,MACZ,cAAc;AAAA,MACd,MAAM;AACJ,eAAO,KAAK,SAAS;AAAA,MACvB;AAAA,MACA,IAAI,OAAO;;AACT,YAAI,OAAO,CAAA;AACX,YAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,iBAAO,MAAM,OAAO,OAAO,EAAE,IAAI,MAAM;AAAA,QACzC,WAAW,OAAO,UAAU,UAAU;AACpC,iBAAO,MAAM,MAAM,KAAK,EAAE,OAAO,OAAO;AAAA,QAC1C,WAAW,SAAS,OAAO,MAAM,OAAO,QAAQ,MAAM,YAAY;AAChE,iBAAO,MAAM,KAAK,KAAK,EAAE,OAAO,OAAO,EAAE,IAAI,MAAM;AAAA,QACrD;AACA,cAAM,SAAQ,UAAK,aAAL,mBAAe;AAC7B,YAAI,SAAS,MAAM,cAAc,KAAK,KAAK,GAAG,GAAG;AAC/C,gBAAM,YAAY,KAAK,KAAK,GAAG;AAC/B;AAAA,QACF;AACA,aAAK,SAAS,YAAY;AAAA,MAC5B;AAAA,IACN,CAAK;AAAA,EACH;AAAA,EAEA,kBAAkB,SAAS,WAAW;AACpC,UAAM,SAAS,KAAK,iBAAiB,IAAI,SAAS;AAClD,QAAI,CAAC,OAAQ;AACb,WAAO,OAAO,OAAO;AACrB,QAAI,OAAO,SAAS,GAAG;AACrB,WAAK,iBAAiB,OAAO,SAAS;AAAA,IACxC;AAAA,EACF;AAAA,EAEA,qBAAqB,SAAS,KAAK;AACjC,QAAI,CAAC,WAAW,CAAC,IAAK;AAEtB,UAAM,SAAS,QAAQ,SAAS,SAAS;AACzC,UAAM,cAAc,MAAM,QAAQ,QAAQ,SAAS,SAAS,IACxD,QAAQ,SAAS,YACjB,CAAA;AAEJ,UAAM,SAAS,IAAI,MAAM;AACzB,UAAM,cAAc,KAAK,oBAAoB,IAAI,SAAS;AAE1D,QAAI,UAAU,KAAK,cAAc,IAAI,MAAM,MAAM,SAAS;AACxD,WAAK,cAAc,OAAO,MAAM;AAAA,IAClC;AACA,eAAW,OAAO,aAAa;AAC7B,WAAK,kBAAkB,SAAS,GAAG;AAAA,IACrC;AAEA,YAAQ,SAAS,QAAQ;AACzB,YAAQ,SAAS,YAAY;AAC7B,QAAI,QAAQ;AACV,cAAQ,OAAO;AAAA,IACjB,WAAW,QAAQ,SAAS,QAAQ;AAClC,cAAQ,OAAO;AAAA,IACjB;AAEA,QAAI,QAAQ;AACV,WAAK,cAAc,IAAI,QAAQ,OAAO;AACtC,WAAK,cAAc,IAAI,OAAO;AAAA,IAChC,OAAO;AACL,WAAK,cAAc,OAAO,OAAO;AAAA,IACnC;AAEA,QAAI,YAAY,QAAQ;AACtB,WAAK,eAAe,IAAI,OAAO;AAC/B,iBAAW,OAAO,aAAa;AAC7B,YAAI,SAAS,KAAK,iBAAiB,IAAI,GAAG;AAC1C,YAAI,CAAC,QAAQ;AACX,mBAAS,oBAAI,IAAG;AAChB,eAAK,iBAAiB,IAAI,KAAK,MAAM;AAAA,QACvC;AACA,eAAO,IAAI,OAAO;AAAA,MACpB;AAAA,IACF,OAAO;AACL,WAAK,eAAe,OAAO,OAAO;AAAA,IACpC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY;AACV,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,SAAS,QAAQ,KAAK;AACrD,YAAM,aAAa,KAAK,QAAQ,SAAS,CAAC;AAC1C,WAAK,YAAY,UAAU;AAAA,IAC7B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YAAY,KAAK;AACf,QAAI,KAAK,kBAAkB,IAAI,GAAG,EAAG;AAErC,UAAM,YAAY,KAAK,gBAAgB,IAAI,aAAa,KAAK,KAAK;AAClE,UAAM,WAAW,KAAK,mBAAmB,GAAG;AAE5C,QAAI,aAAa,MAAM;AAErB,eAAS,IAAI,GAAG,IAAI,IAAI,SAAS,QAAQ,KAAK;AAC5C,aAAK,YAAY,IAAI,SAAS,CAAC,CAAC;AAAA,MAClC;AACA;AAAA,IACF;AAGA,QAAI,IAAI,QAAQ,SAAS,QAAQ,GAAG;AAClC,YAAM,OAAO,KAAK,QAAQ,sBAAqB;AAC/C,YAAM,SAAS,KAAK,SAAS,KAAK,QAAQ,KAAK,SAAS;AAExD,UAAI,IAAI,YAAY,qBAAqB;AACvC,iBAAS,MAAM;AACf,iBAAS,SAAS;AAClB,iBAAS,MAAM;AACf,iBAAS,OAAO;AAAA,MAClB,OAAO;AACL,cAAM,cAAc;AACpB,iBAAS,cAAc;AACvB,iBAAS,SAAS;AAClB,iBAAS,OAAQ,CAAC,cAAc,SAAU;AAC1C,iBAAS,QAAS,cAAc,SAAU;AAC1C,iBAAS,MAAM,cAAc;AAC7B,iBAAS,SAAS,CAAC,cAAc;AACjC,iBAAS,cAAc,WAAS;AAC9B,mBAAS,cAAc;AACvB,mBAAS,OAAQ,CAAC,QAAQ,SAAS,SAAU;AAC7C,mBAAS,QAAS,QAAQ,SAAS,SAAU;AAC7C,mBAAS,MAAM,QAAQ;AACvB,mBAAS,SAAS,CAAC,QAAQ;AAC3B,mBAAS,uBAAsB;AAAA,QACjC;AAAA,MACF;AAEA,YAAM,QAAQ,KAAK,SAAS;AAC5B,YAAM,QAAQ,KAAK,UAAU;AAE7B,UAAI,IAAI,aAAa,QAAQ,GAAG;AAC9B,aAAK,gBAAgB;AACrB,aAAK,cAAc;AACnB,aAAK,cAAc,cAAc,OAAO,oBAAoB,CAAC;AAC7D,aAAK,cAAc,QAAQ,OAAO,OAAO,KAAK;AAAA,MAChD,WAAW,CAAC,KAAK,eAAe;AAC9B,aAAK,gBAAgB;AACrB,aAAK,cAAc;MACrB;AAAA,IACF;AAEA,aAAS,SAAS,QAAQ;AAC1B,aAAS,SAAS,cAAc,CAAA;AAChC,aAAS,SAAS,QAAQ;AAC1B,aAAS,SAAS,YAAY,CAAA;AAC9B,aAAS,aAAa;AACtB,SAAK,yBAAyB,QAAQ;AAEtC,cAAU,IAAI,QAAQ;AAEtB,SAAK,kBAAkB,IAAI,KAAK,QAAQ;AACxC,SAAK,qBAAqB,UAAU,GAAG;AAEvC,aAAS,IAAI,GAAG,IAAI,IAAI,SAAS,QAAQ,KAAK;AAC5C,WAAK,YAAY,IAAI,SAAS,CAAC,CAAC;AAAA,IAClC;AAEA,QAAI,CAAC,OAAO,UAAU,eAAe,KAAK,KAAK,SAAS,GAAG;AACzD,aAAO,eAAe,KAAK,WAAW;AAAA,QACpC,OAAO,KAAK,gBAAgB,GAAG;AAAA,QAC/B,YAAY;AAAA,MACpB,CAAO;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,mBAAmB,KAAK;AACtB,QAAI,IAAI,YAAY,SAAU,QAAO;AAErC,UAAM,MAAM,IAAI,QAAQ,QAAQ,MAAM,EAAE;AACxC,UAAM,OAAO,cAAc,GAAG;AAC9B,QAAI,CAAC,MAAM;AACT,cAAQ,KAAK,4BAA4B,IAAI,QAAQ,YAAW,CAAE,GAAG;AACrE,aAAO;AAAA,IACT;AACA,WAAO,IAAI,KAAI;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,cAAc,SAAS;;AACrB,QAAI,CAAC,QAAS;AAEd,YAAQ,SAAS,QAAQ,QAAQ,WAAS;;AACxC,YAAM,WAAUA,MAAA,MAAM,aAAN,gBAAAA,IAAgB;AAChC,UAAI,SAAS;AACX,aAAK,cAAc,KAAK,kBAAkB,IAAI,OAAO,CAAC;AAAA,MACxD,OAAO;AACL,aAAK,cAAc,KAAK;AAAA,MAC1B;AAAA,IACF,CAAC;AAED,UAAM,SAAQ,aAAQ,aAAR,mBAAkB;AAChC,QAAI,SAAS,KAAK,cAAc,IAAI,KAAK,MAAM,SAAS;AACtD,WAAK,cAAc,OAAO,KAAK;AAAA,IACjC;AACA,UAAM,UAAU,MAAM,SAAQ,aAAQ,aAAR,mBAAkB,SAAS,IAAI,QAAQ,SAAS,YAAY,CAAA;AAC1F,eAAW,OAAO,SAAS;AACzB,WAAK,kBAAkB,SAAS,GAAG;AAAA,IACrC;AACA,SAAK,eAAe,OAAO,OAAO;AAClC,SAAK,cAAc,OAAO,OAAO;AAEjC,QAAI,QAAQ,SAAS,OAAO;AAC1B,WAAK,kBAAkB,OAAO,QAAQ,SAAS,KAAK;AACpD,cAAQ,SAAS,MAAM;IACzB;AAEA,QAAI,QAAQ,QAAQ;AAClB,cAAQ,OAAO,OAAO,OAAO;AAAA,IAC/B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,gBAAgB,SAAS;AACvB,WAAO,KAAK,kBAAkB,IAAI,OAAO;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,eAAe,IAAI;AACjB,WAAO,KAAK,cAAc,IAAI,EAAE;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,mBAAmB,WAAW;AAC5B,WAAO,MAAM,KAAK,KAAK,iBAAiB,IAAI,SAAS,KAAK,EAAE;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,kBAAkB,IAAI;AACpB,QAAI,OAAO,OAAO,YAAY;AAC5B,YAAM,QAAQ,GAAG,KAAK,IAAI;AAC1B,YAAM,aAAa;AACnB,WAAK,YAAY,KAAK,KAAK;AAAA,IAC7B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,qBAAqB,IAAI;AACvB,UAAM,MAAM,KAAK,YAAY,UAAU,WAAQ,6BAAM,gBAAe,EAAE;AACtE,QAAI,OAAO,GAAG;AACZ,WAAK,YAAY,OAAO,KAAK,CAAC;AAAA,IAChC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU;AACR,SAAK,WAAW;AAEhB,SAAK,gBAAgB;AACrB,SAAK,eAAe;AACpB,SAAK,mBAAmB;AACxB,SAAK,mBAAmB,WAAU;AAElC,QAAI,KAAK,iBAAiB;AACxB,2BAAqB,KAAK,eAAe;AACzC,WAAK,kBAAkB;AAAA,IACzB;AACA,SAAK,yBAAyB;AAE9B,SAAK,QAAQ,oBAAoB,aAAa,KAAK,iBAAiB;AACpE,SAAK,QAAQ,oBAAoB,SAAS,KAAK,WAAW;AAC1D,SAAK,QAAQ,oBAAoB,aAAa,KAAK,eAAe;AAClE,SAAK,QAAQ,oBAAoB,WAAW,KAAK,aAAa;AAC9D,SAAK,QAAQ,oBAAoB,YAAY,KAAK,iBAAiB;AACnE,SAAK,QAAQ,oBAAoB,eAAe,KAAK,iBAAiB;AAEtE,UAAM,SAAS,KAAK,cAAc;AAClC,QAAI,UAAU,OAAO,YAAY;AAC/B,aAAO,WAAW,YAAY,MAAM;AAAA,IACtC;AAAA,EACF;AACF;AAzlBE,cADI,OACG,YAAW,oBAAI;AADxB,IAAM,OAAN;AClBA,MAAM,UAAN,MAAM,QAAO;AAAA;AAAA;AAAA;AAAA,EAOX,OAAO,eAAe;AACpB,QAAI,CAAC,QAAO,gBAAgB,SAAS,MAAM;AACzC,YAAM,aAAa,SAAS,cAAc,OAAO;AACjD,iBAAW,cAAc;AAAA;AAAA;AAAA;AAAA;AAKzB,eAAS,KAAK,YAAY,UAAU;AACpC,cAAO,eAAe;AAAA,IACxB;AAEA,aAAS,iBAAiB,MAAM,EAAE,QAAQ,QAAM;AAC9C,UAAI,QAAO,iBAAiB,IAAI,EAAE,EAAG;AACrC,cAAO,uBAAuB,EAAE;AAAA,IAClC,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,iBAAiB;AACtB,WAAO,QAAO;EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,uBAAuB,QAAQ;AACpC,QAAI,QAAO,iBAAiB,IAAI,MAAM,GAAG;AACvC,aAAO,QAAO,iBAAiB,IAAI,MAAM;AAAA,IAC3C;AAEA,UAAM,EAAE,QAAQ,OAAO,QAAQ,QAAQ,mBAAmB,MAAM;AAChE,UAAM,YAAY,SAAS;AAC3B,UAAM,aAAa,UAAU;AAE7B,UAAM,WAAW,IAAI,MAAM,cAAc,EAAE,QAAQ,WAAW,KAAI,CAAE;AACpE,aAAS,cAAc,GAAG;AAC1B,aAAS,QAAQ,WAAW,YAAY,KAAK;AAC7C,aAAS,cAAc,GAAU,CAAC;AAElC,UAAM,QAAQ,IAAI,MAAM;AAGxB,UAAM,QAAQ;AACd,UAAM,kBAAkB,MAAM,KAAK,OAAO,QAAQ,EAAE;AAAA,MAAO,WACzD,MAAM,KAAK,MAAM,OAAO,KACxB,MAAM,KAAK,MAAM,EAAE,KACnB,MAAM,KAAK,MAAM,SAAS;AAAA,IAChC;AAEI,QAAI,SAAS;AACb,QAAI,gBAAgB,WAAW,GAAG;AAChC,eAAS,IAAI,MAAM,kBAAkB,IAAI,YAAY,YAAY,KAAK,GAAI;AAC1E,cAAQ,KAAK,uBAAuB,QAAQ,8BAA8B;AAAA,IAC5E;AAEA,UAAM,OAAO,IAAI,KAAK,QAAQ,UAAU,OAAO,UAAU,IAAI;AAC7D,YAAO,iBAAiB,IAAI,QAAQ,IAAI;AAExC,WAAO;AAAA,MACL,IAAI,YAAY,WAAW,EAAE,QAAQ,EAAE,MAAM,QAAQ,OAAM,GAAI;AAAA,IACrE;AAEI,WAAO;AAAA,EACT;AACF;AA5EE,cADI,SACG,oBAAmB,oBAAI;AAC9B,cAFI,SAEG,gBAAe;AAFxB,IAAM,SAAN;AAsFA,SAAS,mBAAmB,QAAQ,YAAY,IAAI;AAClD,QAAM,EAAE,OAAO,OAAM,IAAK,OAAO,sBAAqB;AACtD,QAAM,MAAM,OAAO,oBAAoB;AAEvC,MAAI,iBAAiB,MAAM,EAAE,aAAa,UAAU;AAClD,WAAO,MAAM,WAAW;AAAA,EAC1B;AAEA,QAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,SAAO,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,QAAQ,GAAG,CAAC;AAClD,SAAO,SAAS,KAAK,IAAI,GAAG,KAAK,MAAM,SAAS,GAAG,CAAC;AACpD,SAAO,OAAO,OAAO,OAAO;AAAA,IAC1B,UAAU;AAAA,IACV,KAAK;AAAA,IACL,MAAM;AAAA,IACN,OAAO,GAAG,KAAK;AAAA,IACf,QAAQ,GAAG,MAAM;AAAA,IACjB,eAAe;AAAA;AAAA,EAEnB,CAAG;AAED,SAAO,YAAY,MAAM;AAEzB,QAAM,KACJ,OAAO,WAAW,UAAU,SAAS,KACrC,OAAO,WAAW,SAAS,SAAS,KACpC,OAAO,WAAW,sBAAsB,SAAS;AAEnD,MAAI,CAAC,IAAI;AACP,UAAM,IAAI,MAAM,qCAAqC;AAAA,EACvD;AAEA,KAAG,SAAS,GAAG,GAAG,OAAO,OAAO,OAAO,MAAM;AAC7C,SAAO,EAAE,QAAQ,IAAI,OAAO,QAAQ,IAAG;AACzC;AAGA,OAAO,aAAY;AACnB,OAAO,SAAS;"}
1
+ {"version":3,"file":"index.js","sources":["../../src/module/styleCache.js","../../src/module/utils.js","../../src/module/Train.js","../../src/module/artist.js","../../src/module/NoScope.js","../../src/module/cell.js","../../src/module/main.js"],"sourcesContent":["// styleCache.js\n//\n// Shared stylesheet-derived cache versioning for selector/keyframe/asset lookups.\n\nlet globalStyleCacheVersion = 0;\n\nexport function getGlobalStyleCacheVersion() {\n return globalStyleCacheVersion;\n}\n\nexport function markGlobalStyleCacheDirty() {\n globalStyleCacheVersion += 1;\n return globalStyleCacheVersion;\n}\n","// utils.js\r\n//\r\n// - Keyframe rule collection\r\n// - Class map for tag → THREE constructor\r\n// - Asset loading / caching\r\n// - Small array utilities\r\n\r\nimport * as THREE from 'three';\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';\nimport { FBXLoader } from 'three/examples/jsm/loaders/FBXLoader.js';\nimport { MTLLoader } from 'three/examples/jsm/loaders/MTLLoader.js';\nimport { getGlobalStyleCacheVersion } from './styleCache.js';\n\r\nexport let AllKeyFramesMap = new Map();\nlet keyframesCacheVersion = -1;\n\r\n/**\r\n * Collect all @keyframes rules from loaded stylesheets.\r\n *\r\n * @returns {Map<string, CSSKeyframesRule>}\r\n */\r\nexport function gatherKeyFrame_MAP() {\n const styleVersion = getGlobalStyleCacheVersion();\n if (keyframesCacheVersion === styleVersion) {\n return AllKeyFramesMap;\n }\n\n AllKeyFramesMap.clear();\n\r\n const KEYFRAMES_TYPES = new Set();\r\n if (typeof CSSRule !== 'undefined') {\r\n if ('KEYFRAMES_RULE' in CSSRule) KEYFRAMES_TYPES.add(CSSRule.KEYFRAMES_RULE);\r\n if ('WEBKIT_KEYFRAMES_RULE' in CSSRule) KEYFRAMES_TYPES.add(CSSRule.WEBKIT_KEYFRAMES_RULE);\r\n }\r\n\r\n for (const sheet of document.styleSheets) {\r\n let rules;\r\n try {\r\n rules = sheet.cssRules;\r\n } catch {\r\n continue;\r\n }\r\n for (const rule of rules) {\r\n if (KEYFRAMES_TYPES.has(rule.type)) {\r\n AllKeyFramesMap.set(rule.name, rule);\r\n }\r\n }\r\n }\n\n keyframesCacheVersion = styleVersion;\n return AllKeyFramesMap;\n}\n\r\n/**\r\n * Get a CSSKeyframesRule by name, rescanning stylesheets each call.\r\n *\r\n * @param {string} AnimName\r\n */\r\nexport function getAnimationMap(AnimName) {\r\n if (!AnimName) return undefined;\r\n gatherKeyFrame_MAP();\r\n return AllKeyFramesMap.get(AnimName);\r\n}\r\n\r\n/* ───────────────── CLASS MAP ───────────────── */\r\n\r\nlet classMap = null;\r\n\r\n/**\r\n * Build a map of tag-name-like keys → THREE.Object3D constructors.\r\n */\r\nfunction buildClassMap() {\r\n classMap = Object.getOwnPropertyNames(THREE)\r\n .filter(key => {\r\n const C = THREE[key];\r\n return typeof C === 'function' && C.prototype instanceof THREE.Object3D;\r\n })\r\n .reduce((m, key) => {\r\n m[key.toUpperCase()] = THREE[key];\r\n return m;\r\n }, Object.create(null));\r\n\r\n // include base Object3D explicitly\r\n classMap.OBJECT3D = THREE.Object3D;\r\n}\r\n\r\n/**\r\n * Get the cached class map, building it on first call.\r\n *\r\n * @returns {Object.<string,Function>}\r\n */\r\nexport function getClassMap() {\r\n if (!classMap) buildClassMap();\r\n return classMap;\r\n}\r\n\r\n/* ───────────────── ASSET MAP ───────────────── */\r\n\r\nconst assetMap = new Map();\r\nconst gltfLoader = new GLTFLoader();\r\nconst fbxLoader = new FBXLoader();\r\nconst textureLoader = new THREE.TextureLoader();\r\nconst audioLoader = new THREE.AudioLoader();\r\nconst mtlLoader = new MTLLoader();\r\n\r\nfunction storeAssetValue(key, value) {\r\n if (value && typeof value.then === 'function') {\r\n const pending = value\r\n .then(resolved => {\r\n assetMap.set(key, resolved);\r\n return resolved;\r\n })\r\n .catch(err => {\r\n console.error(`Failed to load asset \"${key}\":`, err);\r\n assetMap.delete(key);\r\n return null;\r\n });\r\n assetMap.set(key, pending);\r\n } else {\r\n assetMap.set(key, value);\r\n }\r\n}\r\n\r\n/**\r\n * Scan stylesheets for custom @rules that declare external assets.\r\n *\r\n * Syntax:\r\n * @MyShip {\r\n * url: \"./ship.glb\";\r\n * name: \"Spaceship\"; // optional, overrides @ identifier\r\n * }\r\n */\r\nfunction gatherAssetRules() {\n const styleVersion = getGlobalStyleCacheVersion();\n if (gatherAssetRules._cacheVersion === styleVersion) {\n return;\n }\n\n const ignoreAtRules = new Set([\n 'media', 'import', 'supports', 'keyframes', 'font-face', 'charset',\r\n 'namespace', 'page', 'counter-style', 'font-feature-values', 'viewport'\r\n ]);\r\n\r\n for (const sheet of document.styleSheets) {\r\n let rules;\r\n try {\r\n rules = sheet.cssRules;\r\n } catch {\r\n continue;\r\n }\r\n\r\n for (const rule of rules) {\r\n const text = rule.cssText?.trim();\r\n if (!text) continue;\r\n\r\n const match = text.match(/^@([A-Za-z0-9_-]+)\\s*\\{([^}]*)\\}/);\r\n if (!match) continue;\r\n\r\n const atName = match[1];\r\n if (ignoreAtRules.has(atName.toLowerCase())) continue;\r\n\r\n const body = match[2];\r\n const obj = {};\r\n body.split(';').forEach(line => {\r\n const parts = line\r\n .split(':')\r\n .map(s => s && s.trim())\r\n .filter(Boolean);\r\n if (parts.length >= 2) {\r\n const key = parts[0].toLowerCase();\r\n let value = parts[1];\r\n value = value.replace(/^['\"(]+|['\")]+$/g, '');\r\n obj[key] = value;\r\n }\r\n });\r\n\r\n const url = obj.url;\r\n if (!url) continue;\r\n\r\n let name;\r\n if (obj.name && obj.name.trim()) {\r\n name = obj.name.trim();\r\n } else {\r\n name = atName || (() => {\r\n const fname = url.split('/').pop() || '';\r\n const dot = fname.lastIndexOf('.');\r\n return dot >= 0 ? fname.slice(0, dot) : fname;\r\n })();\r\n }\r\n\r\n if (!assetMap.has(name)) {\n storeAssetValue(name, loadAsset(url));\n }\n }\n }\n\n gatherAssetRules._cacheVersion = styleVersion;\n}\n\r\n/**\r\n * Get or load an asset by name.\r\n *\r\n * Built-ins (auto-registered on first use):\r\n * - cube → BoxGeometry\r\n * - sphere → SphereGeometry\r\n * - plane → PlaneGeometry\r\n * - torus → TorusGeometry\r\n *\r\n * @param {string} name\r\n * @param {string|null} [path=null]\r\n * @returns {any}\r\n */\r\nexport function getAsset(name, path = null) {\r\n if (assetMap.size === 0) {\r\n storeAssetValue('cube', new THREE.BoxGeometry());\r\n storeAssetValue('sphere', new THREE.SphereGeometry());\r\n storeAssetValue('plane', new THREE.PlaneGeometry());\r\n storeAssetValue('torus', new THREE.TorusGeometry());\r\n }\r\n\r\n // read CSS-defined assets\r\n gatherAssetRules();\r\n\r\n const key = name;\r\n if (!assetMap.has(key)) {\r\n if (!path) {\r\n console.warn(`Asset \"${name}\" missing and no path supplied.`);\r\n return null;\r\n }\r\n storeAssetValue(key, loadAsset(path));\r\n }\r\n\r\n return assetMap.get(key);\r\n}\r\n\r\n/**\r\n * Load a 3D / texture / audio / material asset based on file extension.\r\n *\r\n * @param {string} url\r\n * @returns {Promise<any>|null}\r\n */\r\nexport function loadAsset(url) {\r\n const ext = (url.split('.').pop() || '').toLowerCase();\r\n switch (ext) {\r\n case 'gltf':\r\n case 'glb':\r\n return new Promise((res, rej) =>\r\n gltfLoader.load(url, d => res(d.scene || d), null, rej)\r\n );\r\n case 'fbx':\r\n return new Promise((res, rej) =>\r\n fbxLoader.load(url, res, null, rej)\r\n );\r\n case 'png':\r\n case 'jpg':\r\n case 'jpeg':\r\n case 'gif':\r\n case 'webp':\r\n return new Promise((res, rej) =>\r\n textureLoader.load(url, tex => res(tex), undefined, rej)\r\n );\r\n case 'mp3':\r\n case 'wav':\r\n case 'ogg':\r\n case 'flac':\r\n case 'aac':\r\n return new Promise((res, rej) =>\r\n audioLoader.load(url, buffer => res(buffer), undefined, rej)\r\n );\r\n case 'mtl':\r\n return new Promise((res, rej) =>\r\n mtlLoader.load(\r\n url,\r\n mtl => {\r\n mtl.preload();\r\n res(mtl);\r\n },\r\n undefined,\r\n rej\r\n )\r\n );\r\n case 'json':\r\n return fetch(url)\r\n .then(response => response.json())\r\n .then(json => {\r\n try {\r\n const loader = new THREE.MaterialLoader();\r\n return loader.parse(json);\r\n } catch (err) {\r\n console.warn(`MaterialLoader failed to parse ${url}:`, err);\r\n return json;\r\n }\r\n });\r\n default:\r\n console.warn(`No loader for \".${ext}\".`);\r\n return Promise.resolve(null);\r\n }\r\n}\r\n\r\n/**\r\n * Remove an item from an array without preserving order.\r\n *\r\n * @param {Array<any>} arry\r\n * @param {any} item\r\n */\r\nexport function fastRemove_arry(arry, item) {\r\n const index = arry.indexOf(item);\r\n if (index !== -1) {\r\n arry[index] = arry[arry.length - 1];\r\n arry.pop();\r\n }\r\n}\r\n\r\n// Alias for older code.\r\nexport const fastRemoveArray = fastRemove_arry;\r\n","// Train.js\r\n//\r\n// Interpolation / animation helpers used by JailedThreeJS.\r\n// - Numeric lerping\r\n// - Cubic-bezier easing\r\n// - Generic value interpolation (numbers + arrays)\r\n// - Time-based transitions over JS values\r\n// - CSS keyframe-driven animation for custom props\r\n\r\nimport { exchange_rule, deep_searchParms, CSSValueTo3JSValue } from './artist.js';\r\nimport { getAnimationMap } from './utils.js';\r\n\r\n/**\r\n * Linearly interpolate between two numbers.\r\n * @param {number} a\r\n * @param {number} b\r\n * @param {number} t in [0, 1]\r\n */\r\nexport function lerpNumber(a, b, t) {\r\n return a + (b - a) * t;\r\n}\r\n\r\n/**\r\n * Interpolate arrays with tolerant length handling.\r\n *\r\n * Length rule:\r\n * - For indices where both arrays have a value → lerp them.\r\n * - For indices that exist only in `from` → keep `from[i]`.\r\n * - For indices that exist only in `to` → keep `to[i]`.\r\n *\r\n * Example:\r\n * [x1,y1,z1,q1] → [x2,y2,z2]\r\n * ==>\r\n * [lerp(x1,x2), lerp(y1,y2), lerp(z1,z2), q1]\r\n *\r\n * @param {Array<number>} from\r\n * @param {Array<number>} to\r\n * @param {number} t\r\n * @param {(a:number,b:number,t:number)=>number} lerpMethod\r\n */\r\nfunction lerpArray(from, to, t, lerpMethod) {\r\n const maxLen = Math.max(from.length, to.length);\r\n const out = new Array(maxLen);\r\n for (let i = 0; i < maxLen; i++) {\r\n const hasFrom = i < from.length;\r\n const hasTo = i < to.length;\r\n if (hasFrom && hasTo) {\r\n out[i] = lerpMethod(from[i], to[i], t);\r\n } else if (hasFrom) {\r\n out[i] = from[i];\r\n } else {\r\n out[i] = to[i];\r\n }\r\n }\r\n return out;\r\n}\r\n\r\n/**\r\n * Interpolate numbers or arrays using the provided lerp method.\r\n *\r\n * @param {number|Array<number>} from\r\n * @param {number|Array<number>} to\r\n * @param {number} t\r\n * @param {(a:number,b:number,t:number)=>number} lerpMethod\r\n */\r\nexport function lerpValue(from, to, t, lerpMethod = lerpNumber) {\r\n const isNum = v => typeof v === 'number';\r\n const isArr = Array.isArray;\r\n\r\n if (isNum(from) && isNum(to)) {\r\n return lerpMethod(from, to, t);\r\n }\r\n if (isArr(from) && isArr(to)) {\r\n return lerpArray(from, to, t, lerpMethod);\r\n }\r\n // Mixed or unsupported types: just return `to` instantly.\r\n return to;\r\n}\r\n\r\n/**\r\n * Create a cubic-bezier easing function.\r\n * Implementation adapted from https://github.com/gre/bezier-easing\r\n */\r\nfunction cubicBezier(p0, p1, p2, p3) {\r\n const cx = 3 * p0;\r\n const bx = 3 * (p2 - p0) - cx;\r\n const ax = 1 - cx - bx;\r\n const cy = 3 * p1;\r\n const by = 3 * (p3 - p1) - cy;\r\n const ay = 1 - cy - by;\r\n\r\n function sampleCurveX(t) {\r\n return ((ax * t + bx) * t + cx) * t;\r\n }\r\n function sampleCurveY(t) {\r\n return ((ay * t + by) * t + cy) * t;\r\n }\r\n function sampleCurveDerivativeX(t) {\r\n return (3 * ax * t + 2 * bx) * t + cx;\r\n }\r\n function solveTforX(x) {\r\n let t = x;\r\n for (let i = 0; i < 4; i++) {\r\n const dx = sampleCurveX(t) - x;\r\n if (Math.abs(dx) < 1e-6) return t;\r\n t -= dx / sampleCurveDerivativeX(t);\r\n }\r\n return t;\r\n }\r\n return x => sampleCurveY(solveTforX(x));\r\n}\r\n\r\n/**\r\n * Resolve an easing function from a CSS timing function string.\r\n *\r\n * @param {string} timingFunction\r\n * @returns {(t:number)=>number}\r\n */\r\nfunction _get_Equation(timingFunction) {\r\n switch (timingFunction) {\r\n case 'linear':\r\n return t => t;\r\n case 'ease':\r\n return cubicBezier(0.25, 0.1, 0.25, 1.0);\r\n case 'ease-in':\r\n return cubicBezier(0.42, 0, 1.0, 1.0);\r\n case 'ease-out':\r\n return cubicBezier(0, 0, 0.58, 1.0);\r\n case 'ease-in-out':\r\n return cubicBezier(0.42, 0, 0.58, 1.0);\r\n default:\r\n break;\r\n }\r\n\r\n if (typeof timingFunction === 'string' && timingFunction.startsWith('cubic-bezier')) {\r\n const match = timingFunction.match(/cubic-bezier\\(([^)]+)\\)/);\r\n if (match) {\r\n const nums = match[1]\r\n .split(/[, ]+/)\r\n .map(Number)\r\n .filter(n => !Number.isNaN(n));\r\n if (nums.length === 4) {\r\n return cubicBezier(nums[0], nums[1], nums[2], nums[3]);\r\n }\r\n }\r\n }\r\n\r\n // Fallback to linear on garbage.\r\n return t => t;\r\n}\r\n\r\n/**\r\n * Animate between two values over time.\r\n *\r\n * - Supports numbers and arrays (arrays follow the tolerant rule above).\r\n * - Non-animatable values resolve instantly (onUpdate + onComplete with `to`).\r\n *\r\n * @param {number|Array<number>} from\r\n * @param {number|Array<number>} to\r\n * @param {number} durationMs\r\n * @param {(value:any, easedT:number) => void} onUpdate\r\n * @param {(finalValue:any) => void} [onComplete]\r\n * @param {string} [timingFunction='linear']\r\n */\r\nexport function animateLerp(\n from,\n to,\n durationMs,\n onUpdate,\n onComplete,\n timingFunction = 'linear',\n signal = null\n) {\n const isAnimatable = v =>\n typeof v === 'number' || Array.isArray(v);\n let rafId = 0;\n let settled = false;\n\n const finish = (shouldComplete, value = to) => {\n if (settled) return;\n settled = true;\n if (rafId) {\n cancelAnimationFrame(rafId);\n rafId = 0;\n }\n if (signal && onAbort) {\n signal.removeEventListener('abort', onAbort);\n }\n if (shouldComplete && onComplete) {\n onComplete(value);\n }\n };\n\n const finishInstant = () => {\n if (signal?.aborted) return;\n if (onUpdate) onUpdate(to, 1);\n finish(true, to);\n };\n\n const onAbort = () => {\n finish(false);\n };\n\n if (signal?.aborted) {\n return () => {};\n }\n if (signal) {\n signal.addEventListener('abort', onAbort, { once: true });\n }\n\n if (!isAnimatable(from) || !isAnimatable(to)) {\n finishInstant();\n return () => finish(false);\n }\n\n if (!Number.isFinite(durationMs) || durationMs <= 0) {\n finishInstant();\n return () => finish(false);\n }\n\r\n const start = performance.now();\r\n const ease = _get_Equation(timingFunction);\r\n\r\n function step(now) {\n if (settled || signal?.aborted) {\n finish(false);\n return;\n }\n let t = (now - start) / durationMs;\n if (t >= 1) t = 1;\n const easedT = ease(t);\n const value = lerpValue(from, to, easedT, lerpNumber);\n if (onUpdate) onUpdate(value, easedT);\n if (t < 1) {\n rafId = requestAnimationFrame(step);\n } else {\n finish(true, value);\n }\n }\n\n rafId = requestAnimationFrame(step);\n return () => finish(false);\n}\n\r\n/**\r\n * Parse a keyframe time string into milliseconds.\r\n *\r\n * Supports:\r\n * - 'from' / 'to'\r\n * - percentages ('0%', '50%', '100%')\r\n * - '123ms'\r\n * - bare numbers treated as ms\r\n *\r\n * @param {string} keyText\r\n * @param {number} totalDuration\r\n */\r\nfunction parseKeyframeTime(keyText, totalDuration) {\r\n if (!keyText) return 0;\r\n const text = String(keyText).trim().toLowerCase();\r\n\r\n if (text === 'from') return 0;\r\n if (text === 'to') return totalDuration;\r\n\r\n if (text.endsWith('%')) {\r\n const v = parseFloat(text);\r\n return Number.isFinite(v) ? (v / 100) * totalDuration : 0;\r\n }\r\n if (text.endsWith('ms')) {\r\n const v = parseFloat(text);\r\n return Number.isFinite(v) ? v : 0;\r\n }\r\n const n = Number(text);\r\n return Number.isFinite(n) ? n : 0;\r\n}\r\n\r\n/**\r\n * Apply a CSS @keyframes animation to a Three.js object.\r\n *\r\n * @param {THREE.Object3D} object\r\n * @param {{\r\n * name: string,\r\n * duration: number,\r\n * timing?: { fun?: string },\r\n * iteration?: { count?: number | string }\r\n * }} animationObj\r\n */\r\nexport async function KeyFrameAnimationLerp(object, animationObj, signal = null) {\n if (!object || !animationObj?.name || !animationObj?.duration) return;\n if (signal?.aborted) return;\n\r\n const keyFramesRule = getAnimationMap(animationObj.name);\r\n if (!keyFramesRule || !keyFramesRule.cssRules) {\r\n console.error(`Animation \"${animationObj.name}\" not found or has no rules.`);\r\n return;\r\n }\r\n\r\n const duration = animationObj.duration;\r\n\r\n const rules = Array.from(keyFramesRule.cssRules).slice();\r\n rules.sort(\r\n (a, b) =>\r\n parseKeyframeTime(a.keyText, duration) -\r\n parseKeyframeTime(b.keyText, duration)\r\n );\r\n\r\n const runOnce = async () => {\n for (let i = 0; i < rules.length - 1; i++) {\n if (signal?.aborted) return;\n const fromRule = rules[i];\n const toRule = rules[i + 1];\r\n const t0 = parseKeyframeTime(fromRule.keyText, duration);\r\n const t1 = parseKeyframeTime(toRule.keyText, duration);\r\n const segmentMs = t1 - t0;\r\n if (segmentMs <= 0) continue;\r\n\r\n const fromProps = {};\r\n const toProps = {};\r\n\r\n // Collect animatable custom props from \"from\" frame\r\n for (const propName of fromRule.style) {\r\n const raw = fromRule.style.getPropertyValue(propName);\r\n // custom props are expected to be `--foo-bar`\r\n if (!propName.startsWith('--')) continue;\r\n fromProps[propName.slice(2)] = CSSValueTo3JSValue(raw, object);\r\n }\r\n\r\n // Collect matching props from \"to\" frame\r\n for (const propName of toRule.style) {\r\n const raw = toRule.style.getPropertyValue(propName);\r\n if (!propName.startsWith('--')) continue;\r\n toProps[propName.slice(2)] = CSSValueTo3JSValue(raw, object);\r\n }\r\n\r\n const keys = Object.keys(fromProps).filter(k => k in toProps);\r\n if (!keys.length) continue;\r\n\r\n await Promise.all(\n keys.map(key => {\n if (signal?.aborted) return Promise.resolve();\n const fromVal = fromProps[key];\n const toVal = toProps[key];\n\r\n // Resolve async assets before animating.\r\n const resolveValue = v =>\r\n (v && typeof v.then === 'function')\r\n ? v\r\n : Promise.resolve(v);\r\n\r\n return Promise.all([resolveValue(fromVal), resolveValue(toVal)])\n .then(([resolvedFrom, resolvedTo]) => new Promise(resolve => {\n if (signal?.aborted) {\n resolve();\n return;\n }\n let done = false;\n const finish = () => {\n if (done) return;\n done = true;\n if (signal && onAbort) {\n signal.removeEventListener('abort', onAbort);\n }\n resolve();\n };\n const onAbort = () => finish();\n if (signal) {\n signal.addEventListener('abort', onAbort, { once: true });\n }\n animateLerp(\n resolvedFrom,\n resolvedTo,\n segmentMs,\n v => {\n if (signal?.aborted) return;\n const { parent, key: finalKey } = deep_searchParms(object, key.split('-'));\n exchange_rule(parent, finalKey, v);\n },\n finish,\n animationObj.timing?.fun || 'linear',\n signal\n );\n }));\n })\n );\n }\n };\n\r\n let iterationCount = animationObj.iteration?.count ?? 1;\r\n if (iterationCount === 'infinity' || iterationCount === 'infinite') {\r\n iterationCount = Infinity;\r\n }\r\n\r\n if (iterationCount === Infinity) {\n while (!signal?.aborted) {\n // eslint-disable-next-line no-await-in-loop\n await runOnce();\n }\n } else {\n const total = Number(iterationCount) || 1;\n for (let i = 0; i < total; i++) {\n if (signal?.aborted) return;\n // eslint-disable-next-line no-await-in-loop\n await runOnce();\n }\n }\n}\n","// artist.js\r\n//\r\n// Maps CSS custom properties + selectors to Three.js objects.\r\n// Handles:\r\n// - CSS → Three value conversion\r\n// - Transition interpolation\r\n// - Keyframe-driven animations\r\n// - Pseudo-class painting (:hover, :focus, :active)\r\n\r\nimport { getAsset } from './utils.js';\nimport Cell from './cell.js';\nimport { animateLerp, KeyFrameAnimationLerp } from './Train.js';\nimport * as THREE from 'three';\nimport { getGlobalStyleCacheVersion } from './styleCache.js';\n\nlet selectorRuleCache = new Map();\nlet selectorRuleCacheVersion = -1;\nlet warnedLegacyNameClassFallback = false;\n\nfunction ensureSelectorRuleCache() {\n const version = getGlobalStyleCacheVersion();\n if (selectorRuleCacheVersion !== version) {\n selectorRuleCache.clear();\n selectorRuleCacheVersion = version;\n }\n}\n\nfunction getObjectClassSelectors(object) {\n const aliasList = object?.classList;\n if (Array.isArray(aliasList)) return aliasList;\n\n if (object?.userData && Object.prototype.hasOwnProperty.call(object.userData, 'classList')) {\n return Array.isArray(object.userData.classList) ? object.userData.classList : [];\n }\n\n if (object?.name) {\n if (!warnedLegacyNameClassFallback) {\n warnedLegacyNameClassFallback = true;\n console.warn(\n 'JailedThreeJS: inferring CSS classes from Object3D.name is deprecated. Use object.classList/userData.classList.'\n );\n }\n return [object.name];\n }\n\n return [];\n}\n\r\nfunction hasClassPseudoRule(object, pseudo) {\n return getObjectClassSelectors(object).some(cls => getCSSRule(`.${cls}${pseudo}`));\n}\n\nfunction animationConfigKey(animCfg) {\n if (!animCfg) return null;\n return [\n animCfg.name || '',\n animCfg.duration || 0,\n animCfg.timing?.fun || 'linear',\n animCfg.iteration?.count ?? 1\n ].join('|');\n}\n\nfunction stopObjectAnimation(object) {\n const ctrl = object?.userData?._animationAbortController;\n if (ctrl && typeof ctrl.abort === 'function' && !ctrl.signal?.aborted) {\n ctrl.abort();\n }\n object.userData._animationAbortController = null;\n object.userData._animationRunning = false;\n}\n\r\nfunction parseAnimationCSS(value) {\r\n if (!value) return null;\r\n\r\n const lower = value.trim().toLowerCase();\r\n if (!lower || lower === 'none') return null;\r\n\r\n const parts = lower.split(/\\s+/).filter(Boolean);\r\n if (!parts.length) return null;\r\n\r\n // First token = name (keep original case for the keyframe name)\r\n const nameToken = parts.shift();\r\n if (!nameToken) return null;\r\n\r\n let durationMs = 1000; // default 1s\r\n let timingFun = 'linear'; // default timing\r\n let iterationCount = 1; // default once\r\n\r\n // Duration\r\n if (parts.length) {\r\n const timeToken = parts[0];\r\n if (/\\d/.test(timeToken)) {\r\n parts.shift();\r\n if (timeToken.endsWith('ms')) {\r\n durationMs = parseFloat(timeToken);\r\n } else if (timeToken.endsWith('s')) {\r\n durationMs = parseFloat(timeToken) * 1000;\r\n } else {\r\n durationMs = parseFloat(timeToken);\r\n }\r\n }\r\n }\r\n\r\n // Look for \"infinite\"/\"infinity\" in the remaining tokens\r\n const infIndex = parts.findIndex(t => t === 'infinite' || t === 'infinity');\r\n if (infIndex !== -1) {\r\n iterationCount = 'infinite';\r\n parts.splice(infIndex, 1);\r\n } else if (parts.length) {\r\n const maybeCount = parseInt(parts[parts.length - 1], 10);\r\n if (Number.isFinite(maybeCount) && maybeCount > 0) {\r\n iterationCount = maybeCount;\r\n parts.pop();\r\n }\r\n }\r\n\r\n // Whatever is left becomes the timing function string\r\n if (parts.length) {\r\n timingFun = parts.join(' ');\r\n }\r\n\r\n return {\r\n name: nameToken,\r\n duration: durationMs,\r\n iteration: { count: iterationCount },\r\n timing: { fun: timingFun }\r\n };\r\n}\r\n\r\n\r\n\r\nfunction parseTransitionCSS(value) {\r\n if (!value) return null;\r\n\r\n const lower = value.trim().toLowerCase();\r\n if (!lower || lower === 'none') return null;\r\n\r\n const parts = lower.split(/\\s+/).filter(Boolean);\r\n if (!parts.length) return null;\r\n\r\n const timeToken = parts.shift();\r\n let durationMs;\r\n\r\n if (timeToken.endsWith('ms')) {\r\n durationMs = parseFloat(timeToken);\r\n } else if (timeToken.endsWith('s')) {\r\n durationMs = parseFloat(timeToken) * 1000;\r\n } else {\r\n durationMs = parseFloat(timeToken);\r\n }\r\n\r\n if (!Number.isFinite(durationMs) || durationMs <= 0) {\r\n return null;\r\n }\r\n\r\n const timingFun = parts.join(' ') || 'linear';\r\n\r\n return {\r\n duration: durationMs,\r\n timing: { fun: timingFun }\r\n };\r\n}\r\n\r\n\r\n/**\r\n * Find first CSS rule whose selector list contains `selector` token.\r\n *\r\n * @param {string} selector\r\n * @returns {CSSStyleRule|undefined}\r\n */\r\nexport function getCSSRule(selector) {\n ensureSelectorRuleCache();\n if (selectorRuleCache.has(selector)) {\n return selectorRuleCache.get(selector) || undefined;\n }\n\n let found = null;\n for (const sheet of document.styleSheets) {\n let rules;\n try {\r\n rules = sheet.cssRules;\r\n } catch {\r\n // cross-origin stylesheet\r\n continue;\r\n }\r\n for (const rule of rules) {\r\n if (!rule.selectorText) continue;\r\n const selectors = rule.selectorText.split(',');\r\n for (const sel of selectors) {\r\n if (sel.trim().split(/\\s+/).includes(selector)) {\n found = rule;\n break;\n }\n }\n if (found) break;\n }\n if (found) break;\n }\n\n selectorRuleCache.set(selector, found);\n return found || undefined;\n}\n\r\n/**\r\n * Walk an object path and return parent + final key.\r\n *\r\n * @param {Object} object\r\n * @param {string[]} path\r\n * @returns {{parent:Object, key:string}}\r\n */\r\nexport function deep_searchParms(object, path) {\r\n const key = path[path.length - 1];\r\n const parent = path.slice(0, -1).reduce((o, k) => {\r\n if (o[k] == null) o[k] = {};\r\n return o[k];\r\n }, object);\r\n return { parent, key };\r\n}\r\n\r\n/**\r\n * Convert CSS value → Three.js friendly value.\r\n *\r\n * - \"(1,2,3)\" → [1,2,3]\r\n * - \"1.25\" → 1.25\r\n * - \"@foo\" → asset from getAsset('foo')\r\n * - \"#id-...\" → property copied from another convict in the same cell\r\n *\r\n * @param {string} value\r\n * @param {THREE.Object3D|null} [__object=null]\r\n * @returns {any}\r\n */\r\nexport function CSSValueTo3JSValue(value, __object = null) {\r\n let parsed;\r\n\r\n if (/^\\(.+\\)$/.test(value)) {\r\n parsed = value.slice(1, -1).split(',').map(v => parseFloat(v.trim()));\r\n } else if (!Number.isNaN(parseFloat(value))) {\r\n parsed = parseFloat(value);\r\n } else {\r\n parsed = value.replace(/^['\"]|['\"]$/g, '');\r\n }\r\n\r\n if (typeof parsed === 'string') {\r\n switch (parsed[0]) {\r\n case '@': {\r\n const p = parsed.slice(1);\r\n return getAsset(p);\r\n }\r\n case '#': {\r\n if (!__object) {\r\n console.error('CSSValueTo3JSValue: __object is null when resolving', parsed);\r\n return null;\r\n }\r\n try {\r\n const cellElement = __object.userData.domEl.closest('cell');\r\n const actualCellObject = Cell.getCell(cellElement);\r\n const path = parsed.split('-');\r\n if (path.length < 1) {\r\n throw new Error('Requesting empty paths using \"#\" is not allowed');\r\n }\r\n const targetObject = actualCellObject.getConvictById(path[0].slice(1));\r\n if (!targetObject) {\r\n throw new Error('Failed to find object with id ' + parsed);\r\n }\r\n path.shift();\r\n const { parent, key } = deep_searchParms(targetObject, path);\r\n return parent[key];\r\n } catch (err) {\r\n console.error(err);\r\n return undefined;\r\n }\r\n }\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n return parsed;\r\n}\r\n\r\n/**\r\n * Assign a value to a property, handling vectors / setters / plain fields.\r\n *\r\n * @param {Object} parent\r\n * @param {string} key\r\n * @param {any} value\r\n */\r\nexport function exchange_rule(parent, key, value) {\r\n if (!parent) return;\r\n const target = parent[key];\r\n\r\n try {\r\n if (Array.isArray(value)) {\r\n if (target && typeof target.set === 'function') {\r\n target.set(...value);\r\n } else if (typeof target === 'function') {\r\n target(...value);\r\n } else {\r\n parent[key] = value;\r\n }\r\n return;\r\n }\r\n\r\n // scalar or non-array\r\n if (target && typeof target.set === 'function') {\r\n target.set(value);\r\n } else if (typeof target === 'function') {\r\n target(value);\r\n } else {\r\n parent[key] = value;\r\n }\r\n } catch (err) {\r\n console.warn(`Failed to assign ${key} with`, value, err);\r\n }\r\n}\r\n\r\n/**\r\n * Core rule application.\r\n *\r\n * @param {CSSStyleRule|HTMLElement} rule\r\n * @param {THREE.Object3D} object\r\n * @param {string|null} [_chosenOne=null] selector that caused this rule\r\n */\r\nfunction _apply_rule(rule, object, _chosenOne = null) {\n if (!rule || !rule.style || !object) return;\n\n const domEl = object.userData.domEl;\n object.userData._lastCSS = object.userData._lastCSS || Object.create(null);\n let sawAnimationDeclaration = false;\n\r\n // enable picking layer when interactive / pseudo-rules exist\r\n if (\r\n domEl?.hasAttribute('onclick') ||\r\n domEl?.hasAttribute('onmouseover') ||\r\n domEl?.hasAttribute('ondblclick') ||\r\n domEl?.hasAttribute('onmousedown') ||\r\n domEl?.hasAttribute('onmouseup') ||\r\n domEl?.hasAttribute('oncontextmenu') ||\r\n hasClassPseudoRule(object, ':hover') ||\r\n hasClassPseudoRule(object, ':focus') ||\r\n (object.userData.domId && getCSSRule(`#${object.userData.domId}:focus`)) ||\r\n (object.userData.domId && getCSSRule(`#${object.userData.domId}:hover`))\r\n ) {\r\n object.layers.enable(3);\r\n } else {\r\n object.layers.disable(3);\r\n }\r\n\r\n for (let i = 0; i < rule.style.length; i++) {\r\n const rawProp = rule.style[i];\r\n const value = rule.style.getPropertyValue(rawProp).trim();\r\n\r\n if (!rawProp.startsWith('--')) continue;\r\n\r\n // CSS-driven transition config\r\n if (rawProp === '--transition') {\r\n const cfg = parseTransitionCSS(value);\r\n object.transition = cfg; // may be null if \"none\"\r\n continue;\r\n }\r\n\r\n // CSS-driven animation config\r\n if (rawProp === '--animation') {\n sawAnimationDeclaration = true;\n const animCfg = parseAnimationCSS(value);\n const nextAnimKey = animationConfigKey(animCfg);\n if (object.userData._animationConfigKey !== nextAnimKey) {\n stopObjectAnimation(object);\n object.userData._animationConfigKey = nextAnimKey;\n }\n object.animation = animCfg; // may be null if \"none\"\n continue;\n }\n\r\n // Normal custom property flow (position, rotation, etc.)\r\n const prop = rawProp.slice(2);\r\n const path = prop.split('-');\r\n const parsed = CSSValueTo3JSValue(value, object);\r\n const { parent, key } = deep_searchParms(object, path);\r\n\r\n const assignValue = (resolvedValue) => {\r\n if (resolvedValue === undefined) return;\r\n\r\n const transition = object.transition;\r\n const currentRaw = parent[key];\r\n const currentValue =\r\n currentRaw && typeof currentRaw.toArray === 'function'\r\n ? currentRaw.toArray()\r\n : currentRaw;\r\n\r\n const duration = transition?.duration ?? 0;\r\n const timingFn = transition?.timing?.fun ?? 'linear';\r\n const isAnimatable =\r\n transition &&\r\n duration > 0 &&\r\n (typeof currentValue === 'number' || Array.isArray(currentValue)) &&\r\n (typeof resolvedValue === 'number' || Array.isArray(resolvedValue));\r\n\r\n if (isAnimatable) {\r\n animateLerp(\r\n currentValue,\r\n resolvedValue,\r\n duration,\r\n v => exchange_rule(parent, key, v),\r\n () => {\r\n object.dispatchEvent({\r\n type: 'TransitionFinished',\r\n target: object,\r\n detail: { selector: _chosenOne, to: parent }\r\n });\r\n },\r\n timingFn\r\n );\r\n } else {\r\n exchange_rule(parent, key, resolvedValue);\r\n }\r\n };\r\n\r\n if (parsed && typeof parsed.then === 'function') {\r\n parsed.then(assignValue).catch(err =>\r\n console.error('Failed to resolve asset for', rawProp, err)\r\n );\r\n } else {\r\n assignValue(parsed);\r\n }\r\n}\n \n\n\n if (sawAnimationDeclaration && !object.animation) {\n stopObjectAnimation(object);\n }\n\n if (object.animation) {\n // Don't restart the animation every repaint\n if (!object.userData._animationRunning) {\n const controller = new AbortController();\n object.userData._animationRunning = true;\n object.userData._animationAbortController = controller;\n\n (async () => {\n try {\n await KeyFrameAnimationLerp(object, object.animation, controller.signal);\n } catch (err) {\n if (!controller.signal.aborted) {\n console.error(err);\n }\n } finally {\n if (object.userData._animationAbortController === controller) {\n object.userData._animationAbortController = null;\n object.userData._animationRunning = false;\n }\n }\n })();\n }\n }\n}\r\n\r\n/**\r\n * Apply rules for a specific element inside a cell (inline style changes).\r\n *\r\n * @param {HTMLElement} convictElm\r\n * @param {Cell} cell\r\n */\r\nexport function paintConvict(convictElm, cell) {\r\n const convict = cell._allConvictsByDom.get(convictElm);\r\n if (convict) {\r\n _apply_rule(convictElm, convict);\r\n }\r\n}\r\n\r\n/**\r\n * Paint :hover / :focus / :active selectors for all convicts in a cell.\r\n *\r\n * @param {Cell} muse\r\n */\r\nexport function paintExtraCell(muse) {\r\n for (const obj of muse.classyConvicts) {\r\n const classes = getObjectClassSelectors(obj);\r\n (obj.userData.extraParams || []).forEach(param => {\r\n classes.forEach(cls => {\r\n const rule = getCSSRule(`.${cls}${param}`);\r\n if (rule) _apply_rule(rule, obj);\r\n });\r\n });\r\n }\r\n\r\n for (const obj of muse.namedConvicts) {\r\n if (!obj.userData.domId) continue;\r\n (obj.userData.extraParams || []).forEach(param => {\r\n const rule = getCSSRule(`#${obj.userData.domId}${param}`);\r\n if (rule) _apply_rule(rule, obj);\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * Paint base class/id rules for an entire cell.\r\n *\r\n * @param {Cell} muse\r\n */\r\nexport function paintCell(muse) {\r\n for (const obj of muse.classyConvicts) {\r\n for (const cls of getObjectClassSelectors(obj)) {\r\n const rule = getCSSRule(`.${cls}`);\r\n if (rule) _apply_rule(rule, obj, `.${cls}`);\r\n }\r\n }\r\n for (const obj of muse.namedConvicts) {\r\n if (!obj.userData.domId) continue;\r\n const rule = getCSSRule(`#${obj.userData.domId}`);\r\n if (rule) _apply_rule(rule, obj, `#${obj.userData.domId}`);\r\n }\r\n}\r\n\r\n/**\r\n * Paint a single object: base rules, pseudo-rules, inline style.\r\n *\r\n * @param {THREE.Object3D} muse\r\n */\r\nexport function paintSpecificMuse(muse) {\r\n const extra = muse.userData.extraParams || [];\r\n\r\n getObjectClassSelectors(muse).forEach(cls => {\r\n const rule = getCSSRule(`.${cls}`);\r\n if (rule) _apply_rule(rule, muse);\r\n });\r\n\r\n if (muse.userData.domId) {\r\n const baseIdRule = getCSSRule(`#${muse.userData.domId}`);\r\n if (baseIdRule) _apply_rule(baseIdRule, muse);\r\n }\r\n\r\n extra.forEach(param => {\r\n getObjectClassSelectors(muse).forEach(cls => {\r\n const clsRule = getCSSRule(`.${cls}${param}`);\r\n if (clsRule) _apply_rule(clsRule, muse);\r\n });\r\n });\r\n\r\n if (muse.userData.domId) {\r\n extra.forEach(param => {\r\n const idRule = getCSSRule(`#${muse.userData.domId}${param}`);\r\n if (idRule) _apply_rule(idRule, muse);\r\n });\r\n }\r\n\r\n if (muse.userData.domEl?.hasAttribute('style')) {\r\n _apply_rule(muse.userData.domEl, muse);\r\n }\r\n}\r\n\r\n/**\r\n * Apply constant :active rules each frame for flagged convicts.\r\n *\r\n * @param {THREE.Object3D} muse\r\n */\r\nexport function paintConstantMuse(muse) {\r\n getObjectClassSelectors(muse).forEach(cls => {\r\n const rule = getCSSRule(`.${cls}:active`);\r\n if (rule) _apply_rule(rule, muse);\r\n });\r\n if (muse.userData.domId) {\r\n const rule = getCSSRule(`#${muse.userData.domId}:active`);\r\n if (rule) _apply_rule(rule, muse);\r\n }\r\n}\r\n","// NoScope.js\r\n//\r\n// Centralised event handling.\r\n// Shared THREE.Raycaster + NDC pointer for all cells; all pickable\r\n// objects live on layer 3.\r\n\r\nimport * as THREE from 'three';\nimport { paintSpecificMuse } from './artist.js';\nimport { fastRemove_arry } from './utils.js';\n\r\nconst raycaster = new THREE.Raycaster();\r\nconst ndcPointer = new THREE.Vector2();\r\n\r\n// Only objects on layer 3 are considered pickable.\r\nraycaster.layers.set(3);\r\n\r\n/* Flag helpers */\r\n\r\nfunction addFlag(arr, flag) {\n if (arr.includes(flag)) return false;\n arr.push(flag);\n return true;\n}\n\nfunction delFlag(arr, flag) {\n const hadFlag = arr.includes(flag);\n if (!hadFlag) return false;\n fastRemove_arry(arr, flag);\n return true;\n}\n\n/* Public handlers */\n\nfunction _flushPendingPointerMove(cell) {\n if (!cell?._pointerMoveRaf || !cell._pendingPointerMoveEvt) return;\n cancelAnimationFrame(cell._pointerMoveRaf);\n cell._pointerMoveRaf = 0;\n const evt = cell._pendingPointerMoveEvt;\n cell._pendingPointerMoveEvt = null;\n _processPointerMove(evt, cell);\n}\n\nexport function default_onCellClick_method(domEvt, cell) {\n _flushPendingPointerMove(cell);\n const hit = cell._last_cast_caught;\n if (!hit) return;\n\n const focusChanged = addFlag(hit.userData.extraParams, ':focus');\n\r\n const synth = {\r\n type: 'cellclick',\r\n originalEvt: domEvt,\r\n target3d: hit,\r\n targetCell: cell,\r\n targetElement: hit.userData.domEl,\r\n pointerPosition: cell._lastHitPosition\r\n };\r\n\n hit.userData.domEl.onclick?.call(hit.userData.domEl, synth);\n if (focusChanged) paintSpecificMuse(hit);\n}\n\nexport function default_onCellPointerMove_method(domEvt, cell) {\n if (!cell.focusedCamera) return;\n\n cell._pendingPointerMoveEvt = domEvt;\n if (cell._pointerMoveRaf) return;\n\n cell._pointerMoveRaf = requestAnimationFrame(() => {\n const evt = cell._pendingPointerMoveEvt;\n cell._pendingPointerMoveEvt = null;\n cell._pointerMoveRaf = 0;\n if (!evt || !cell._running) return;\n _processPointerMove(evt, cell);\n });\n}\n\nfunction _processPointerMove(domEvt, cell) {\n _raycast(domEvt, cell.focusedCamera, cell.cellElm);\n\n const hitResult = raycaster.intersectObjects(cell.loadedScene.children, true)[0];\n const lastHit = cell._last_cast_caught;\n\n if (hitResult) {\n const hitObject = hitResult.object;\n let shouldRepaintCurrent = false;\n\n if (hitObject !== lastHit) {\n if (lastHit) {\n const hoverRemoved = delFlag(lastHit.userData.extraParams, ':hover');\n lastHit.userData.domEl.onmouseleave?.call(lastHit.userData.domEl, {\n type: 'cellmouseleave',\n originalEvt: domEvt,\n target3d: lastHit,\r\n targetCell: cell,\r\n targetElement: lastHit.userData.domEl,\r\n pointerPosition: cell._lastHitPosition\n });\n if (hoverRemoved) paintSpecificMuse(lastHit);\n }\n\n cell._last_cast_caught = hitObject;\n\r\n hitObject.userData.domEl.onmouseenter?.call(hitObject.userData.domEl, {\n type: 'cellmouseenter',\n originalEvt: domEvt,\n target3d: hitObject,\n targetCell: cell,\n targetElement: hitObject.userData.domEl,\n pointerPosition: hitResult.point\n });\n shouldRepaintCurrent = true;\n }\n\n if (addFlag(hitObject.userData.extraParams, ':hover')) {\n shouldRepaintCurrent = true;\n }\n cell._lastHitPosition = hitResult.point;\n\r\n hitObject.userData.domEl.onmouseover?.call(hitObject.userData.domEl, {\r\n type: 'cellhover',\r\n originalEvt: domEvt,\r\n target3d: hitObject,\r\n targetCell: cell,\r\n targetElement: hitObject.userData.domEl,\r\n pointerPosition: hitResult.point\n });\n\n if (shouldRepaintCurrent) paintSpecificMuse(hitObject);\n } else if (lastHit) {\n const hoverRemoved = delFlag(lastHit.userData.extraParams, ':hover');\n lastHit.userData.domEl.onmouseleave?.call(lastHit.userData.domEl, {\n type: 'cellmouseleave',\n originalEvt: domEvt,\n target3d: lastHit,\r\n targetCell: cell,\r\n targetElement: lastHit.userData.domEl,\r\n pointerPosition: cell._lastHitPosition\n });\n if (hoverRemoved) paintSpecificMuse(lastHit);\n cell._last_cast_caught = null;\n }\n}\n\nexport function default_onCellMouseDown_method(domEvt, cell) {\n _flushPendingPointerMove(cell);\n const hit = cell._last_cast_caught;\n if (!hit) return;\n\n const activeChanged = addFlag(hit.userData.extraParams, ':active');\n\r\n const synth = {\r\n type: 'celldown',\r\n originalEvt: domEvt,\r\n target3d: hit,\r\n targetCell: cell,\r\n targetElement: hit.userData.domEl,\r\n pointerPosition: cell._lastHitPosition\r\n };\r\n\n hit.userData.domEl.onmousedown?.call(hit.userData.domEl, synth);\n if (activeChanged) paintSpecificMuse(hit);\n}\n\nexport function default_onCellMouseUp_method(domEvt, cell) {\n _flushPendingPointerMove(cell);\n const hit = cell._last_cast_caught;\n if (!hit) return;\n\n const activeChanged = delFlag(hit.userData.extraParams, ':active');\n\r\n const synth = {\r\n type: 'cellup',\r\n originalEvt: domEvt,\r\n target3d: hit,\r\n targetCell: cell,\r\n targetElement: hit.userData.domEl,\r\n pointerPosition: cell._lastHitPosition\r\n };\r\n\n hit.userData.domEl.onmouseup?.call(hit.userData.domEl, synth);\n if (activeChanged) paintSpecificMuse(hit);\n}\n\nexport function default_onCellDoubleClick_method(domEvt, cell) {\n _flushPendingPointerMove(cell);\n const hit = cell._last_cast_caught;\n if (!hit) return;\n\n const focusChanged = addFlag(hit.userData.extraParams, ':focus');\n\r\n const synth = {\r\n type: 'celldblclick',\r\n originalEvt: domEvt,\r\n target3d: hit,\r\n targetCell: cell,\r\n targetElement: hit.userData.domEl,\r\n pointerPosition: cell._lastHitPosition\r\n };\r\n\n hit.userData.domEl.ondblclick?.call(hit.userData.domEl, synth);\n if (focusChanged) paintSpecificMuse(hit);\n}\n\nexport function default_onCellContextMenu_method(domEvt, cell) {\n _flushPendingPointerMove(cell);\n const hit = cell._last_cast_caught;\n if (!hit) return;\n\r\n const synth = {\r\n type: 'cellcontextmenu',\r\n originalEvt: domEvt,\r\n target3d: hit,\r\n targetCell: cell,\r\n targetElement: hit.userData.domEl,\r\n pointerPosition: cell._lastHitPosition\r\n };\r\n\n hit.userData.domEl.oncontextmenu?.call(hit.userData.domEl, synth);\n}\n\r\n/* Internal raycast helper */\r\n\r\n/**\r\n * @param {MouseEvent} domEvt\r\n * @param {THREE.Camera} camera\r\n * @param {HTMLElement} referenceEl\r\n */\r\nfunction _raycast(domEvt, camera, referenceEl) {\r\n if (!camera) return;\r\n\r\n const targetEl = referenceEl || domEvt.currentTarget || domEvt.target;\r\n const rect = targetEl.getBoundingClientRect();\r\n\r\n camera.updateMatrixWorld();\r\n\r\n ndcPointer.set(\r\n ((domEvt.clientX - rect.left) / rect.width) * 2 - 1,\r\n (-(domEvt.clientY - rect.top) / rect.height) * 2 + 1\r\n );\r\n\r\n raycaster.setFromCamera(ndcPointer, camera);\r\n}\r\n","// cell.js\r\n//\r\n// The Cell class drives a single <cell> element:\r\n// - DOM → Three.js object conversion\r\n// - Event wiring / raycasting integration\r\n// - CSS → object painting\r\n// - Mutation observers (DOM + <style> changes)\r\n// - Per-frame update callbacks\r\n\r\nimport * as THREE from 'three';\nimport { getClassMap } from './utils.js';\nimport {\n paintCell,\n paintConvict,\n paintSpecificMuse\n} from './artist.js';\nimport { markGlobalStyleCacheDirty } from './styleCache.js';\nimport {\r\n default_onCellClick_method,\r\n default_onCellPointerMove_method,\r\n default_onCellMouseDown_method,\r\n default_onCellMouseUp_method,\r\n default_onCellDoubleClick_method,\r\n default_onCellContextMenu_method\r\n} from './NoScope.js';\r\n\r\nclass Cell {\r\n static allCells = new WeakMap();\r\n\r\n /**\r\n * Retrieve an existing Cell for a <cell> element.\r\n *\r\n * @param {HTMLElement} element\r\n * @returns {Cell|null}\r\n */\r\n static getCell(element) {\r\n if (Cell.allCells.has(element)) {\r\n return Cell.allCells.get(element);\r\n }\r\n console.error('No Cell found with the element:', element);\r\n return null;\r\n }\r\n\r\n /**\r\n * @param {HTMLElement} cellElm\r\n * @param {THREE.WebGLRenderer} renderer\r\n * @param {THREE.Scene} scene\r\n * @param {THREE.Camera|null} [camera=null]\r\n * @param {Function|null} [_MainAnimMethod=null]\r\n */\r\n constructor(cellElm, renderer, scene, camera = null, _MainAnimMethod = null) {\r\n this.cellElm = cellElm;\r\n Object.defineProperty(cellElm, 'cell', {\r\n value: this,\r\n enumerable: false\r\n });\r\n\r\n this.threeRenderer = renderer;\n this.loadedScene = scene;\n this.focusedCamera = camera;\n\n this.classyConvicts = new Set();\n this.namedConvicts = new Set();\n this._allConvictsByDom = new WeakMap();\n this._convictsById = new Map();\n this._convictsByClass = new Map();\n\n this.updateFunds = [];\n this._observedStyleElements = new WeakSet();\n this._pendingStyleRepaint = false;\n this._pointerMoveRaf = 0;\n this._pendingPointerMoveEvt = null;\n\r\n this._last_cast_caught = null;\r\n this._lastHitPosition = null;\r\n Cell.allCells.set(cellElm, this);\r\n\r\n // initial scan\r\n this._ScanCell();\r\n\r\n // bind DOM event handlers\r\n this._boundPointerMove = evt => {\r\n default_onCellPointerMove_method(evt, this);\r\n };\r\n this._boundClick = evt => {\r\n default_onCellClick_method(evt, this);\r\n };\r\n this._boundMouseDown = evt => {\r\n default_onCellMouseDown_method(evt, this);\r\n };\r\n this._boundMouseUp = evt => {\r\n default_onCellMouseUp_method(evt, this);\r\n };\r\n this._boundDoubleClick = evt => {\r\n default_onCellDoubleClick_method(evt, this);\r\n };\r\n this._boundContextMenu = evt => {\r\n evt.preventDefault();\r\n default_onCellContextMenu_method(evt, this);\r\n };\r\n\r\n cellElm.addEventListener('mousemove', this._boundPointerMove);\r\n cellElm.addEventListener('click', this._boundClick);\r\n cellElm.addEventListener('mousedown', this._boundMouseDown);\r\n cellElm.addEventListener('mouseup', this._boundMouseUp);\r\n cellElm.addEventListener('dblclick', this._boundDoubleClick);\r\n cellElm.addEventListener('contextmenu', this._boundContextMenu);\r\n\r\n // initial paint\r\n paintCell(this);\r\n\r\n // Observe <style> content so keyframes / rules updates repaint\r\n this._styleElemObserver = new MutationObserver(() => {\n if (this._pendingStyleRepaint) return;\n markGlobalStyleCacheDirty();\n this._pendingStyleRepaint = true;\n requestAnimationFrame(() => {\n this._pendingStyleRepaint = false;\n paintCell(this);\n this._repaintKnownConvicts();\n });\n });\n\r\n this._observeStyleElements = root => {\r\n if (!root) return;\r\n const targets = [];\r\n if (root.nodeName === 'STYLE') {\r\n targets.push(root);\r\n } else if (typeof root.querySelectorAll === 'function') {\r\n targets.push(...root.querySelectorAll('style'));\r\n }\r\n targets.forEach(styleEl => {\r\n if (this._observedStyleElements.has(styleEl)) return;\r\n this._observedStyleElements.add(styleEl);\r\n this._styleElemObserver.observe(styleEl, {\r\n childList: true,\r\n characterData: true,\r\n subtree: true\r\n });\r\n });\r\n };\r\n\r\n this._styleHostObserver = new MutationObserver(mutationList => {\n mutationList.forEach(mutation => {\n let styleTreeChanged = false;\n mutation.addedNodes.forEach(node => {\n if (node.nodeType === Node.ELEMENT_NODE && node.nodeName === 'STYLE') {\n this._observeStyleElements(node);\n styleTreeChanged = true;\n } else if (node.nodeType === Node.ELEMENT_NODE && typeof node.querySelector === 'function' && node.querySelector('style')) {\n this._observeStyleElements(node);\n styleTreeChanged = true;\n }\n });\n mutation.removedNodes.forEach(node => {\n if (node.nodeType === Node.ELEMENT_NODE && (node.nodeName === 'STYLE' || (typeof node.querySelector === 'function' && node.querySelector('style')))) {\n styleTreeChanged = true;\n }\n });\n if (styleTreeChanged) {\n markGlobalStyleCacheDirty();\n this._scheduleFullRepaint();\n }\n });\n });\n\r\n this._observeStyleElements(this.cellElm);\r\n if (document.head) {\r\n this._observeStyleElements(document.head);\r\n this._styleHostObserver.observe(document.head, {\r\n childList: true,\r\n subtree: true\r\n });\r\n }\r\n\r\n // Observe inline style/id/class changes and child mutations\r\n this._styleObserver = new MutationObserver(mutationList => {\r\n mutationList.forEach(mutation => {\r\n if (mutation.target.nodeName === 'CANVAS') return;\r\n\r\n switch (mutation.type) {\r\n case 'childList': {\r\n for (let i = 0; i < mutation.addedNodes.length; i++) {\r\n const node = mutation.addedNodes[i];\r\n if (node.nodeType === Node.ELEMENT_NODE && node.nodeName !== 'CANVAS') {\r\n if (node.nodeName === 'STYLE') {\n this._observeStyleElements(node);\n markGlobalStyleCacheDirty();\n this._scheduleFullRepaint();\n } else {\n this.ScanElement(node);\n const convict = this.getConvictByDom(node);\n if (convict) {\r\n paintSpecificMuse(convict);\r\n }\r\n }\r\n }\r\n }\r\n for (let i = 0; i < mutation.removedNodes.length; i++) {\n const node = mutation.removedNodes[i];\n if (node.nodeType === Node.ELEMENT_NODE && node.nodeName !== 'CANVAS') {\n if (node.nodeName === 'STYLE' || (typeof node.querySelector === 'function' && node.querySelector('style'))) {\n markGlobalStyleCacheDirty();\n this._scheduleFullRepaint();\n }\n this.removeConvict(this._allConvictsByDom.get(node));\n }\n }\n break;\r\n }\r\n case 'attributes': {\r\n const target = mutation.target;\r\n const convict = target.convict;\r\n if (!convict) break;\r\n\n if (mutation.attributeName === 'id') {\n this._syncConvictIdentity(convict, target);\n paintSpecificMuse(convict);\n } else if (mutation.attributeName === 'class') {\n this._syncConvictIdentity(convict, target);\n paintSpecificMuse(convict);\n } else if (mutation.attributeName === 'style') {\n // inline style changed; repaint this convict\n paintConvict(target, this);\n }\r\n break;\r\n }\r\n }\r\n });\r\n });\r\n\r\n this._styleObserver.observe(this.cellElm, {\r\n attributes: true,\r\n childList: true,\r\n attributeFilter: ['style', 'id', 'class'],\r\n subtree: true\r\n });\r\n\r\n // Animation loop\r\n this._running = true;\r\n this._anim = _MainAnimMethod\r\n ? _MainAnimMethod.bind(this)\r\n : () => {\r\n if (!this._running) return;\r\n this.updateFunds.forEach(update => update());\r\n requestAnimationFrame(this._anim);\r\n if (this.focusedCamera) {\r\n this.threeRenderer.render(this.loadedScene, this.focusedCamera);\r\n }\r\n };\r\n\r\n // Resize handling\r\n this._resizeObserver = new ResizeObserver(entries => {\r\n for (const e of entries) {\r\n const { width, height } = e.contentRect;\r\n const dpr = window.devicePixelRatio || 1;\r\n this.threeRenderer.setPixelRatio(dpr);\r\n\r\n const safeWidth = Math.max(width, 1);\r\n const safeHeight = Math.max(height, 1);\r\n this.threeRenderer.setSize(safeWidth, safeHeight, false);\r\n\r\n if (this.focusedCamera && this.focusedCamera.isPerspectiveCamera) {\r\n this.focusedCamera.aspect = safeWidth / safeHeight;\r\n }\r\n if (this.focusedCamera) {\r\n this.focusedCamera.updateProjectionMatrix();\r\n }\r\n }\r\n });\r\n this._resizeObserver.observe(this.cellElm);\r\n\r\n this._anim();\n }\n\n _scheduleFullRepaint() {\n if (this._pendingStyleRepaint) return;\n this._pendingStyleRepaint = true;\n requestAnimationFrame(() => {\n this._pendingStyleRepaint = false;\n paintCell(this);\n this._repaintKnownConvicts();\n });\n }\n\n _repaintKnownConvicts() {\n const visited = new Set();\n for (const convict of this.classyConvicts) {\n if (!visited.has(convict)) {\n visited.add(convict);\n paintSpecificMuse(convict);\n }\n }\n for (const convict of this.namedConvicts) {\n if (!visited.has(convict)) {\n visited.add(convict);\n paintSpecificMuse(convict);\n }\n }\n }\n\n _normalizeClassList(input) {\n if (Array.isArray(input)) return input.filter(Boolean).map(String);\n if (typeof input === 'string') return input.split(/\\s+/).filter(Boolean);\n if (input && typeof input[Symbol.iterator] === 'function') {\n return Array.from(input).filter(Boolean).map(String);\n }\n return [];\n }\n\n _ensureConvictClassAlias(convict) {\n if (Object.prototype.hasOwnProperty.call(convict, 'classList')) return;\n Object.defineProperty(convict, 'classList', {\n enumerable: false,\n configurable: true,\n get() {\n return this.userData.classList;\n },\n set(value) {\n let next = [];\n if (Array.isArray(value)) {\n next = value.filter(Boolean).map(String);\n } else if (typeof value === 'string') {\n next = value.split(/\\s+/).filter(Boolean);\n } else if (value && typeof value[Symbol.iterator] === 'function') {\n next = Array.from(value).filter(Boolean).map(String);\n }\n const domEl = this.userData?.domEl;\n if (domEl && domEl.className !== next.join(' ')) {\n domEl.className = next.join(' ');\n return;\n }\n this.userData.classList = next;\n }\n });\n }\n\n _removeClassIndex(convict, className) {\n const bucket = this._convictsByClass.get(className);\n if (!bucket) return;\n bucket.delete(convict);\n if (bucket.size === 0) {\n this._convictsByClass.delete(className);\n }\n }\n\n _syncConvictIdentity(convict, elm) {\n if (!convict || !elm) return;\n\n const prevId = convict.userData.domId || '';\n const prevClasses = Array.isArray(convict.userData.classList)\n ? convict.userData.classList\n : [];\n\n const nextId = elm.id || '';\n const nextClasses = this._normalizeClassList(elm.classList);\n\n if (prevId && this._convictsById.get(prevId) === convict) {\n this._convictsById.delete(prevId);\n }\n for (const cls of prevClasses) {\n this._removeClassIndex(convict, cls);\n }\n\n convict.userData.domId = nextId;\n convict.userData.classList = nextClasses;\n if (nextId) {\n convict.name = nextId;\n } else if (convict.name === prevId) {\n convict.name = '';\n }\n\n if (nextId) {\n this._convictsById.set(nextId, convict);\n this.namedConvicts.add(convict);\n } else {\n this.namedConvicts.delete(convict);\n }\n\n if (nextClasses.length) {\n this.classyConvicts.add(convict);\n for (const cls of nextClasses) {\n let bucket = this._convictsByClass.get(cls);\n if (!bucket) {\n bucket = new Set();\n this._convictsByClass.set(cls, bucket);\n }\n bucket.add(convict);\n }\n } else {\n this.classyConvicts.delete(convict);\n }\n }\n\n /**\n * Initial scan of cell children.\n * @private\n */\n _ScanCell() {\r\n for (let i = 0; i < this.cellElm.children.length; i++) {\r\n const convictElm = this.cellElm.children[i];\r\n this.ScanElement(convictElm);\r\n }\r\n }\r\n\r\n /**\r\n * Convert a DOM element into a Three.js object and wire it up.\r\n *\r\n * @param {HTMLElement} elm\r\n */\r\n ScanElement(elm) {\r\n if (this._allConvictsByDom.has(elm)) return;\r\n\r\n const parentObj = this.getConvictByDom(elm.parentElement) || this.loadedScene;\r\n const instance = this.ConvertDomToObject(elm);\r\n\r\n if (instance === null) {\r\n // still recurse children\r\n for (let i = 0; i < elm.children.length; i++) {\r\n this.ScanElement(elm.children[i]);\r\n }\r\n return;\r\n }\r\n\r\n // Camera tags: configure projection\r\n if (elm.tagName.includes('CAMERA')) {\r\n const rect = this.cellElm.getBoundingClientRect();\r\n const aspect = rect.height ? rect.width / rect.height : 1;\r\n\r\n if (elm.tagName === 'PERSPECTIVECAMERA') {\r\n instance.fov = 75;\r\n instance.aspect = aspect;\r\n instance.far = 1000;\r\n instance.near = 0.1;\r\n } else {\r\n const frustumSize = 20;\r\n instance.frustumSize = frustumSize;\r\n instance.aspect = aspect;\r\n instance.left = (-frustumSize * aspect) / 2;\r\n instance.right = (frustumSize * aspect) / 2;\r\n instance.top = frustumSize / 2;\r\n instance.bottom = -frustumSize / 2;\r\n instance.refreshLook = fSize => {\r\n instance.frustumSize = fSize;\r\n instance.left = (-fSize * instance.aspect) / 2;\r\n instance.right = (fSize * instance.aspect) / 2;\r\n instance.top = fSize / 2;\r\n instance.bottom = -fSize / 2;\r\n instance.updateProjectionMatrix();\r\n };\r\n }\r\n\r\n const rectW = rect.width || 1;\r\n const rectH = rect.height || 1;\r\n\r\n if (elm.hasAttribute('render')) {\r\n this.focusedCamera = instance;\r\n this.focusedCamera.updateProjectionMatrix();\r\n this.threeRenderer.setPixelRatio(window.devicePixelRatio || 1);\r\n this.threeRenderer.setSize(rectW, rectH, false);\r\n } else if (!this.focusedCamera) {\r\n this.focusedCamera = instance;\r\n this.focusedCamera.updateProjectionMatrix();\r\n }\r\n }\r\n\r\n instance.userData.domEl = elm;\n instance.userData.extraParams = [];\n instance.userData.domId = '';\n instance.userData.classList = [];\n instance.transition = null;\n this._ensureConvictClassAlias(instance);\n\n parentObj.add(instance);\n\n this._allConvictsByDom.set(elm, instance);\n this._syncConvictIdentity(instance, elm);\n\n for (let i = 0; i < elm.children.length; i++) {\n this.ScanElement(elm.children[i]);\n }\r\n\r\n if (!Object.prototype.hasOwnProperty.call(elm, 'convict')) {\r\n Object.defineProperty(elm, 'convict', {\r\n value: this.getConvictByDom(elm),\r\n enumerable: false\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Tag → THREE.Object3D constructor.\r\n *\r\n * @param {HTMLElement} elm\r\n * @returns {THREE.Object3D|null}\r\n */\r\n ConvertDomToObject(elm) {\r\n if (elm.tagName === 'CANVAS') return null;\r\n\r\n const key = elm.tagName.replace(/-/g, '');\r\n const Ctor = getClassMap()[key];\r\n if (!Ctor) {\r\n console.warn(`Unknown THREE class for <${elm.tagName.toLowerCase()}>`);\r\n return null;\r\n }\r\n return new Ctor();\r\n }\r\n\r\n /**\r\n * Remove a convict and its children.\r\n *\r\n * @param {THREE.Object3D|null} convict\r\n */\r\n removeConvict(convict) {\r\n if (!convict) return;\r\n\r\n convict.children.slice().forEach(child => {\n const domNode = child.userData?.domEl;\r\n if (domNode) {\r\n this.removeConvict(this._allConvictsByDom.get(domNode));\r\n } else {\r\n this.removeConvict(child);\r\n }\r\n });\n\n const domId = convict.userData?.domId;\n if (domId && this._convictsById.get(domId) === convict) {\n this._convictsById.delete(domId);\n }\n const classes = Array.isArray(convict.userData?.classList) ? convict.userData.classList : [];\n for (const cls of classes) {\n this._removeClassIndex(convict, cls);\n }\n this.classyConvicts.delete(convict);\n this.namedConvicts.delete(convict);\n\n if (convict.userData.domEl) {\n this._allConvictsByDom.delete(convict.userData.domEl);\n convict.userData.domEl.remove();\r\n }\r\n\r\n if (convict.parent) {\r\n convict.parent.remove(convict);\r\n }\r\n }\r\n\r\n /**\r\n * Get convict by DOM element.\r\n *\r\n * @param {HTMLElement} element\r\n */\r\n getConvictByDom(element) {\r\n return this._allConvictsByDom.get(element);\r\n }\r\n\r\n /**\r\n * Get convict by DOM id (global document lookup).\r\n *\r\n * @param {string} id\r\n */\r\n getConvictById(id) {\n return this._convictsById.get(id);\n }\n\r\n /**\r\n * Get all convicts with a given class.\r\n *\r\n * @param {string} className\r\n * @returns {Array<THREE.Object3D>}\r\n */\r\n getConvictsByClass(className) {\n return Array.from(this._convictsByClass.get(className) || []);\n }\n\r\n /**\r\n * Register a per-frame callback.\r\n *\r\n * @param {Function} fn\r\n */\r\n addUpdateFunction(fn) {\r\n if (typeof fn === 'function') {\r\n const bound = fn.bind(this);\r\n bound.originalFn = fn;\r\n this.updateFunds.push(bound);\r\n }\r\n }\r\n\r\n /**\r\n * Remove a previously registered per-frame callback.\r\n *\r\n * @param {Function} fn\r\n */\r\n removeUpdateFunction(fn) {\r\n const idx = this.updateFunds.findIndex(item => item?.originalFn === fn);\r\n if (idx >= 0) {\r\n this.updateFunds.splice(idx, 1);\r\n }\r\n }\r\n\r\n /**\r\n * Tear down observers, handlers and canvas.\r\n */\r\n dispose() {\r\n this._running = false;\r\n\r\n this._resizeObserver.disconnect();\r\n this._styleObserver.disconnect();\r\n this._styleElemObserver.disconnect();\r\n this._styleHostObserver.disconnect();\n\n if (this._pointerMoveRaf) {\n cancelAnimationFrame(this._pointerMoveRaf);\n this._pointerMoveRaf = 0;\n }\n this._pendingPointerMoveEvt = null;\n\r\n this.cellElm.removeEventListener('mousemove', this._boundPointerMove);\r\n this.cellElm.removeEventListener('click', this._boundClick);\r\n this.cellElm.removeEventListener('mousedown', this._boundMouseDown);\r\n this.cellElm.removeEventListener('mouseup', this._boundMouseUp);\r\n this.cellElm.removeEventListener('dblclick', this._boundDoubleClick);\r\n this.cellElm.removeEventListener('contextmenu', this._boundContextMenu);\r\n\r\n const canvas = this.threeRenderer.domElement;\r\n if (canvas && canvas.parentNode) {\r\n canvas.parentNode.removeChild(canvas);\r\n }\r\n }\r\n}\r\n\r\nexport default Cell;\r\n","// main.js\r\n//\r\n// JThree facade: finds <cell> elements, bootstraps renderer/scene/cell\r\n// for each, and keeps a WeakMap of created Cell instances.\r\n\r\nimport * as THREE from 'three';\r\nimport Cell from './cell.js';\r\n\r\nclass JTHREE {\r\n static __Loaded_Cells__ = new WeakMap();\r\n static __StyleTag__ = null;\r\n\r\n /**\r\n * Convert all <cell> elements in the document.\r\n */\r\n static init_convert() {\r\n if (!JTHREE.__StyleTag__ && document.head) {\r\n const styleSheet = document.createElement('style');\r\n styleSheet.textContent = `\r\n cell > :not(canvas) {\r\n display: none;\r\n }\r\n `;\r\n document.head.appendChild(styleSheet);\r\n JTHREE.__StyleTag__ = styleSheet;\r\n }\r\n\r\n document.querySelectorAll('cell').forEach(el => {\r\n if (JTHREE.__Loaded_Cells__.has(el)) return;\r\n JTHREE.create_THREEJSRENDERER(el);\r\n });\r\n }\r\n\r\n /**\r\n * Legacy alias.\r\n */\r\n static _convert_init_() {\r\n return JTHREE.init_convert();\r\n }\r\n\r\n /**\r\n * Create renderer + scene for a given <cell> element.\r\n *\r\n * @param {HTMLElement} cellEl\r\n * @returns {Cell}\r\n */\r\n static create_THREEJSRENDERER(cellEl) {\r\n if (JTHREE.__Loaded_Cells__.has(cellEl)) {\r\n return JTHREE.__Loaded_Cells__.get(cellEl);\r\n }\r\n\r\n const { canvas, width, height, dpr } = createWebGLOverlay(cellEl);\r\n const safeWidth = width || 1;\r\n const safeHeight = height || 1;\r\n\r\n const renderer = new THREE.WebGLRenderer({ canvas, antialias: true });\r\n renderer.setPixelRatio(dpr);\r\n renderer.setSize(safeWidth, safeHeight, false);\r\n renderer.setClearColor(0x000000, 1);\r\n\r\n const scene = new THREE.Scene();\r\n\r\n // Find explicit cameras\r\n const regex = /camera/i;\r\n const foundCameraElms = Array.from(cellEl.children).filter(child =>\r\n regex.test(child.tagName) ||\r\n regex.test(child.id) ||\r\n regex.test(child.className)\r\n );\r\n\r\n let camera = null;\r\n if (foundCameraElms.length === 0) {\r\n camera = new THREE.PerspectiveCamera(75, safeWidth / safeHeight, 0.1, 1000);\r\n console.warn('No camera found for', cellEl, '. Creating a default camera.');\r\n }\r\n\r\n const cell = new Cell(cellEl, renderer, scene, camera || null);\r\n JTHREE.__Loaded_Cells__.set(cellEl, cell);\r\n\r\n cellEl.dispatchEvent(\r\n new CustomEvent('OnStart', { detail: { cell, CellEl: cellEl } })\r\n );\r\n\r\n return cell;\r\n }\r\n}\r\n\r\n/**\r\n * Create a WebGL canvas overlay on a host element.\r\n *\r\n * @param {HTMLElement} hostEl\r\n * @param {Object} [glOptions={}]\r\n * @returns {{canvas:HTMLCanvasElement, gl:WebGLRenderingContext, width:number, height:number, dpr:number}}\r\n */\r\nfunction createWebGLOverlay(hostEl, glOptions = {}) {\r\n const { width, height } = hostEl.getBoundingClientRect();\r\n const dpr = window.devicePixelRatio || 1;\r\n\r\n if (getComputedStyle(hostEl).position === 'static') {\r\n hostEl.style.position = 'relative';\r\n }\r\n\r\n const canvas = document.createElement('canvas');\r\n canvas.width = Math.max(1, Math.round(width * dpr));\r\n canvas.height = Math.max(1, Math.round(height * dpr));\r\n Object.assign(canvas.style, {\r\n position: 'absolute',\r\n top: '0',\r\n left: '0',\r\n width: `${width}px`,\r\n height: `${height}px`,\r\n pointerEvents: 'none',\r\n //zIndex: '-999'\r\n });\r\n\r\n hostEl.appendChild(canvas);\r\n\r\n const gl =\r\n canvas.getContext('webgl2', glOptions) ||\r\n canvas.getContext('webgl', glOptions) ||\r\n canvas.getContext('experimental-webgl', glOptions);\r\n\r\n if (!gl) {\r\n throw new Error('Your browser doesn’t support WebGL.');\r\n }\r\n\r\n gl.viewport(0, 0, canvas.width, canvas.height);\r\n return { canvas, gl, width, height, dpr };\r\n}\r\n\r\n// Auto-initialise on import.\r\nJTHREE.init_convert();\r\nwindow.JThree = JTHREE;\r\n\r\nexport { JTHREE };\r\nexport default JTHREE;\r\n"],"names":["_a"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jailedthreejs",
3
- "version": "0.9.2-beta.2",
3
+ "version": "0.9.3",
4
4
  "description": "Dedicated To Willson :D, A small, fast and lightweight Three.js framework.",
5
5
  "license": "MIT",
6
6
  "author": "M.K.",