jailedthreejs 0.9.3 → 0.9.4
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 +3 -0
- package/dist/lib/index.js +32 -4
- package/dist/lib/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
package/dist/lib/index.js
CHANGED
|
@@ -5,6 +5,7 @@ import * as THREE from "three";
|
|
|
5
5
|
import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader.js";
|
|
6
6
|
import { FBXLoader } from "three/examples/jsm/loaders/FBXLoader.js";
|
|
7
7
|
import { MTLLoader } from "three/examples/jsm/loaders/MTLLoader.js";
|
|
8
|
+
import { OBJLoader } from "three/examples/jsm/loaders/OBJLoader.js";
|
|
8
9
|
let globalStyleCacheVersion = 0;
|
|
9
10
|
function getGlobalStyleCacheVersion() {
|
|
10
11
|
return globalStyleCacheVersion;
|
|
@@ -68,6 +69,11 @@ const fbxLoader = new FBXLoader();
|
|
|
68
69
|
const textureLoader = new THREE.TextureLoader();
|
|
69
70
|
const audioLoader = new THREE.AudioLoader();
|
|
70
71
|
const mtlLoader = new MTLLoader();
|
|
72
|
+
const objLoader = new OBJLoader();
|
|
73
|
+
function getUrlBasePath(url) {
|
|
74
|
+
const slash = url.lastIndexOf("/");
|
|
75
|
+
return slash >= 0 ? url.slice(0, slash + 1) : "";
|
|
76
|
+
}
|
|
71
77
|
function storeAssetValue(key, value) {
|
|
72
78
|
if (value && typeof value.then === "function") {
|
|
73
79
|
const pending = value.then((resolved) => {
|
|
@@ -193,8 +199,11 @@ function loadAsset(url) {
|
|
|
193
199
|
(res, rej) => audioLoader.load(url, (buffer) => res(buffer), void 0, rej)
|
|
194
200
|
);
|
|
195
201
|
case "mtl":
|
|
196
|
-
return new Promise(
|
|
197
|
-
|
|
202
|
+
return new Promise((res, rej) => {
|
|
203
|
+
const basePath = getUrlBasePath(url);
|
|
204
|
+
mtlLoader.setPath(basePath);
|
|
205
|
+
mtlLoader.setResourcePath(basePath);
|
|
206
|
+
mtlLoader.load(
|
|
198
207
|
url,
|
|
199
208
|
(mtl) => {
|
|
200
209
|
mtl.preload();
|
|
@@ -202,8 +211,27 @@ function loadAsset(url) {
|
|
|
202
211
|
},
|
|
203
212
|
void 0,
|
|
204
213
|
rej
|
|
205
|
-
)
|
|
206
|
-
);
|
|
214
|
+
);
|
|
215
|
+
});
|
|
216
|
+
case "obj":
|
|
217
|
+
return new Promise((res, rej) => {
|
|
218
|
+
const basePath = getUrlBasePath(url);
|
|
219
|
+
const mtlUrl = url.replace(/\.obj$/i, ".mtl");
|
|
220
|
+
mtlLoader.setPath(basePath);
|
|
221
|
+
mtlLoader.setResourcePath(basePath);
|
|
222
|
+
mtlLoader.load(
|
|
223
|
+
mtlUrl,
|
|
224
|
+
(mtl) => {
|
|
225
|
+
mtl.preload();
|
|
226
|
+
objLoader.setMaterials(mtl);
|
|
227
|
+
objLoader.load(url, res, null, rej);
|
|
228
|
+
},
|
|
229
|
+
void 0,
|
|
230
|
+
() => {
|
|
231
|
+
objLoader.load(url, res, null, rej);
|
|
232
|
+
}
|
|
233
|
+
);
|
|
234
|
+
});
|
|
207
235
|
case "json":
|
|
208
236
|
return fetch(url).then((response) => response.json()).then((json) => {
|
|
209
237
|
try {
|
package/dist/lib/index.js.map
CHANGED
|
@@ -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(\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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"}
|
|
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';\r\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';\r\nimport { FBXLoader } from 'three/examples/jsm/loaders/FBXLoader.js';\r\nimport { MTLLoader } from 'three/examples/jsm/loaders/MTLLoader.js';\r\nimport { OBJLoader } from 'three/examples/jsm/loaders/OBJLoader.js';\r\nimport { getGlobalStyleCacheVersion } from './styleCache.js';\r\n\r\nexport let AllKeyFramesMap = new Map();\r\nlet keyframesCacheVersion = -1;\r\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() {\r\n const styleVersion = getGlobalStyleCacheVersion();\r\n if (keyframesCacheVersion === styleVersion) {\r\n return AllKeyFramesMap;\r\n }\r\n\r\n AllKeyFramesMap.clear();\r\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 }\r\n\r\n keyframesCacheVersion = styleVersion;\r\n return AllKeyFramesMap;\r\n}\r\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\nconst objLoader = new OBJLoader();\r\n\r\nfunction getUrlBasePath(url) {\r\n const slash = url.lastIndexOf('/');\r\n return slash >= 0 ? url.slice(0, slash + 1) : '';\r\n}\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() {\r\n const styleVersion = getGlobalStyleCacheVersion();\r\n if (gatherAssetRules._cacheVersion === styleVersion) {\r\n return;\r\n }\r\n\r\n const ignoreAtRules = new Set([\r\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)) {\r\n storeAssetValue(name, loadAsset(url));\r\n }\r\n }\r\n }\r\n\r\n gatherAssetRules._cacheVersion = styleVersion;\r\n}\r\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 const basePath = getUrlBasePath(url);\r\n mtlLoader.setPath(basePath);\r\n mtlLoader.setResourcePath(basePath);\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 'obj':\r\n return new Promise((res, rej) => {\r\n const basePath = getUrlBasePath(url);\r\n const mtlUrl = url.replace(/\\.obj$/i, '.mtl');\r\n\r\n mtlLoader.setPath(basePath);\r\n mtlLoader.setResourcePath(basePath);\r\n mtlLoader.load(\r\n mtlUrl,\r\n mtl => {\r\n mtl.preload();\r\n objLoader.setMaterials(mtl);\r\n objLoader.load(url, res, null, rej);\r\n },\r\n undefined,\r\n () => {\r\n // If no companion MTL exists, still load the OBJ geometry.\r\n objLoader.load(url, res, null, rej);\r\n }\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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"}
|