jailedthreejs 0.9.3 → 0.9.5
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 +14 -11
- package/dist/lib/index.js +192 -58
- package/dist/lib/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
[](https://deepwiki.com/yepistream/JailedThreeJS)
|
|
2
|
+
|
|
3
|
+
|
|
1
4
|
# JailedThreeJS
|
|
2
5
|
|
|
3
6
|
A CSS-first layer on top of Three.js.
|
|
@@ -11,7 +14,7 @@ Define a scene with HTML inside a `<cell>`, style objects with CSS custom proper
|
|
|
11
14
|
- Supports DOM-style interaction (`onclick`, `onmouseover`, `ondblclick`, `oncontextmenu`, ...)
|
|
12
15
|
- Supports CSS pseudo-classes on 3D objects (`:hover`, `:focus`, `:active`)
|
|
13
16
|
- Supports transitions and CSS `@keyframes`-driven animation of custom props
|
|
14
|
-
- Supports basic asset references (
|
|
17
|
+
- Supports basic asset references (`cube`, `sphere`, `plane`, `torus`) plus CSS-defined asset rules
|
|
15
18
|
|
|
16
19
|
## Identity Mapping (Important)
|
|
17
20
|
|
|
@@ -69,7 +72,7 @@ Package entrypoint notes:
|
|
|
69
72
|
}
|
|
70
73
|
|
|
71
74
|
.scene-object {
|
|
72
|
-
--geometry:
|
|
75
|
+
--geometry: cube;
|
|
73
76
|
--position: (0, 0, 0);
|
|
74
77
|
--material-color: (0.3, 0.7, 1.0);
|
|
75
78
|
--transition: 200ms ease-out;
|
|
@@ -121,7 +124,7 @@ Examples:
|
|
|
121
124
|
- `--rotation: (rx,ry,rz)`
|
|
122
125
|
- `--scale: (sx,sy,sz)`
|
|
123
126
|
- `--material-color: (r,g,b)`
|
|
124
|
-
- `--geometry:
|
|
127
|
+
- `--geometry: cube`
|
|
125
128
|
- `--transition: 250ms ease`
|
|
126
129
|
- `--animation: bob 1.5s infinite ease-in-out`
|
|
127
130
|
|
|
@@ -187,27 +190,27 @@ JailedThreeJS parses custom property values with a best-effort mapper:
|
|
|
187
190
|
|
|
188
191
|
- `"(1,2,3)"` -> `[1,2,3]`
|
|
189
192
|
- `"1.25"` -> `1.25`
|
|
190
|
-
- `"
|
|
193
|
+
- `"cube"` -> built-in asset/object from the asset cache
|
|
191
194
|
- `"#otherId-position-x"` -> property lookup from another object in the same cell
|
|
192
195
|
|
|
193
196
|
## Assets
|
|
194
197
|
|
|
195
198
|
Built-ins are available by default:
|
|
196
199
|
|
|
197
|
-
-
|
|
198
|
-
-
|
|
199
|
-
-
|
|
200
|
-
-
|
|
200
|
+
- `cube`
|
|
201
|
+
- `sphere`
|
|
202
|
+
- `plane`
|
|
203
|
+
- `torus`
|
|
201
204
|
|
|
202
205
|
Custom assets can be declared in CSS-like at-rules:
|
|
203
206
|
|
|
204
207
|
```css
|
|
205
|
-
@Ship
|
|
206
|
-
url: "
|
|
208
|
+
@Ship{
|
|
209
|
+
url: "/models/ship.glb";
|
|
207
210
|
}
|
|
208
211
|
|
|
209
212
|
.hero {
|
|
210
|
-
--geometry:
|
|
213
|
+
--geometry: Ship;
|
|
211
214
|
}
|
|
212
215
|
```
|
|
213
216
|
|
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,19 @@ 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
|
+
const pendingStylesheetAssetParses = /* @__PURE__ */ new Set();
|
|
74
|
+
function trackStylesheetParse(promise) {
|
|
75
|
+
if (!promise || typeof promise.then !== "function") return;
|
|
76
|
+
pendingStylesheetAssetParses.add(promise);
|
|
77
|
+
promise.finally(() => {
|
|
78
|
+
pendingStylesheetAssetParses.delete(promise);
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
function getUrlBasePath(url) {
|
|
82
|
+
const slash = url.lastIndexOf("/");
|
|
83
|
+
return slash >= 0 ? url.slice(0, slash + 1) : "";
|
|
84
|
+
}
|
|
71
85
|
function storeAssetValue(key, value) {
|
|
72
86
|
if (value && typeof value.then === "function") {
|
|
73
87
|
const pending = value.then((resolved) => {
|
|
@@ -83,12 +97,8 @@ function storeAssetValue(key, value) {
|
|
|
83
97
|
assetMap.set(key, value);
|
|
84
98
|
}
|
|
85
99
|
}
|
|
86
|
-
function
|
|
87
|
-
|
|
88
|
-
const styleVersion = getGlobalStyleCacheVersion();
|
|
89
|
-
if (gatherAssetRules._cacheVersion === styleVersion) {
|
|
90
|
-
return;
|
|
91
|
-
}
|
|
100
|
+
function parseAssetRulesFromText(cssText) {
|
|
101
|
+
if (!cssText || typeof cssText !== "string") return [];
|
|
92
102
|
const ignoreAtRules = /* @__PURE__ */ new Set([
|
|
93
103
|
"media",
|
|
94
104
|
"import",
|
|
@@ -102,46 +112,75 @@ function gatherAssetRules() {
|
|
|
102
112
|
"font-feature-values",
|
|
103
113
|
"viewport"
|
|
104
114
|
]);
|
|
115
|
+
const assets = [];
|
|
116
|
+
const atRuleRegex = /@([A-Za-z0-9_-]+)\s*\{([\s\S]*?)\}/g;
|
|
117
|
+
let match;
|
|
118
|
+
while ((match = atRuleRegex.exec(cssText)) !== null) {
|
|
119
|
+
const atName = match[1];
|
|
120
|
+
if (ignoreAtRules.has(atName.toLowerCase())) continue;
|
|
121
|
+
const body = match[2] || "";
|
|
122
|
+
const obj = {};
|
|
123
|
+
body.split(";").forEach((line) => {
|
|
124
|
+
const idx = line.indexOf(":");
|
|
125
|
+
if (idx <= 0) return;
|
|
126
|
+
const key = line.slice(0, idx).trim().toLowerCase();
|
|
127
|
+
const rawValue = line.slice(idx + 1).trim();
|
|
128
|
+
if (!key || !rawValue) return;
|
|
129
|
+
obj[key] = rawValue.replace(/^['"(]+|['")]+$/g, "");
|
|
130
|
+
});
|
|
131
|
+
const url = "." + obj.url;
|
|
132
|
+
if (!url) continue;
|
|
133
|
+
const name = obj.name && obj.name.trim() ? obj.name.trim() : atName;
|
|
134
|
+
assets.push({ name, url });
|
|
135
|
+
}
|
|
136
|
+
return assets;
|
|
137
|
+
}
|
|
138
|
+
function registerParsedAssetRuleEntries(entries) {
|
|
139
|
+
if (!Array.isArray(entries)) return;
|
|
140
|
+
for (const entry of entries) {
|
|
141
|
+
if (!(entry == null ? void 0 : entry.name) || !(entry == null ? void 0 : entry.url)) continue;
|
|
142
|
+
if (!assetMap.has(entry.name)) {
|
|
143
|
+
storeAssetValue(entry.name, loadAsset(entry.url));
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
function gatherAssetRules() {
|
|
148
|
+
const styleVersion = getGlobalStyleCacheVersion();
|
|
149
|
+
if (gatherAssetRules._cacheVersion === styleVersion) {
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
const linkSheetsToParse = [];
|
|
105
153
|
for (const sheet of document.styleSheets) {
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
} catch {
|
|
154
|
+
const owner = sheet.ownerNode;
|
|
155
|
+
if ((owner == null ? void 0 : owner.nodeName) === "STYLE") {
|
|
156
|
+
registerParsedAssetRuleEntries(parseAssetRulesFromText(owner.textContent || ""));
|
|
110
157
|
continue;
|
|
111
158
|
}
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
159
|
+
if ((owner == null ? void 0 : owner.nodeName) === "LINK" && sheet.href) {
|
|
160
|
+
linkSheetsToParse.push(sheet.href);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
const uniqueLinks = [...new Set(linkSheetsToParse)];
|
|
164
|
+
if (!gatherAssetRules._linkFetchByVersion) {
|
|
165
|
+
gatherAssetRules._linkFetchByVersion = /* @__PURE__ */ new Map();
|
|
166
|
+
}
|
|
167
|
+
const cacheKeyPrefix = `${styleVersion}|`;
|
|
168
|
+
for (const key of [...gatherAssetRules._linkFetchByVersion.keys()]) {
|
|
169
|
+
if (!key.startsWith(cacheKeyPrefix)) {
|
|
170
|
+
gatherAssetRules._linkFetchByVersion.delete(key);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
if (uniqueLinks.length) {
|
|
174
|
+
for (const href of uniqueLinks) {
|
|
175
|
+
const fetchKey = `${styleVersion}|${href}`;
|
|
176
|
+
if (gatherAssetRules._linkFetchByVersion.has(fetchKey)) continue;
|
|
177
|
+
const parsePromise = fetch(href).then((resp) => resp.ok ? resp.text() : "").then((cssText) => {
|
|
178
|
+
registerParsedAssetRuleEntries(parseAssetRulesFromText(cssText));
|
|
179
|
+
}).catch((err) => {
|
|
180
|
+
console.warn(`Failed to parse stylesheet text for asset rules: ${href}`, err);
|
|
129
181
|
});
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
let name;
|
|
133
|
-
if (obj.name && obj.name.trim()) {
|
|
134
|
-
name = obj.name.trim();
|
|
135
|
-
} else {
|
|
136
|
-
name = atName || (() => {
|
|
137
|
-
const fname = url.split("/").pop() || "";
|
|
138
|
-
const dot = fname.lastIndexOf(".");
|
|
139
|
-
return dot >= 0 ? fname.slice(0, dot) : fname;
|
|
140
|
-
})();
|
|
141
|
-
}
|
|
142
|
-
if (!assetMap.has(name)) {
|
|
143
|
-
storeAssetValue(name, loadAsset(url));
|
|
144
|
-
}
|
|
182
|
+
gatherAssetRules._linkFetchByVersion.set(fetchKey, parsePromise);
|
|
183
|
+
trackStylesheetParse(parsePromise);
|
|
145
184
|
}
|
|
146
185
|
}
|
|
147
186
|
gatherAssetRules._cacheVersion = styleVersion;
|
|
@@ -157,6 +196,15 @@ function getAsset(name, path = null) {
|
|
|
157
196
|
const key = name;
|
|
158
197
|
if (!assetMap.has(key)) {
|
|
159
198
|
if (!path) {
|
|
199
|
+
if (pendingStylesheetAssetParses.size > 0) {
|
|
200
|
+
const pending = Promise.allSettled([...pendingStylesheetAssetParses]).then(() => {
|
|
201
|
+
const resolved = assetMap.get(key);
|
|
202
|
+
if (resolved !== void 0) return resolved;
|
|
203
|
+
console.warn(`Asset "${name}" missing and no path supplied.`);
|
|
204
|
+
return null;
|
|
205
|
+
});
|
|
206
|
+
return pending;
|
|
207
|
+
}
|
|
160
208
|
console.warn(`Asset "${name}" missing and no path supplied.`);
|
|
161
209
|
return null;
|
|
162
210
|
}
|
|
@@ -193,8 +241,11 @@ function loadAsset(url) {
|
|
|
193
241
|
(res, rej) => audioLoader.load(url, (buffer) => res(buffer), void 0, rej)
|
|
194
242
|
);
|
|
195
243
|
case "mtl":
|
|
196
|
-
return new Promise(
|
|
197
|
-
|
|
244
|
+
return new Promise((res, rej) => {
|
|
245
|
+
const basePath = getUrlBasePath(url);
|
|
246
|
+
mtlLoader.setPath(basePath);
|
|
247
|
+
mtlLoader.setResourcePath(basePath);
|
|
248
|
+
mtlLoader.load(
|
|
198
249
|
url,
|
|
199
250
|
(mtl) => {
|
|
200
251
|
mtl.preload();
|
|
@@ -202,8 +253,26 @@ function loadAsset(url) {
|
|
|
202
253
|
},
|
|
203
254
|
void 0,
|
|
204
255
|
rej
|
|
205
|
-
)
|
|
206
|
-
);
|
|
256
|
+
);
|
|
257
|
+
});
|
|
258
|
+
case "obj":
|
|
259
|
+
return new Promise((res, rej) => {
|
|
260
|
+
getUrlBasePath(url);
|
|
261
|
+
const mtlUrl = url.replace(/\.obj$/i, ".mtl");
|
|
262
|
+
console.log(mtlUrl);
|
|
263
|
+
mtlLoader.load(
|
|
264
|
+
mtlUrl,
|
|
265
|
+
(mtl) => {
|
|
266
|
+
mtl.preload();
|
|
267
|
+
objLoader.setMaterials(mtl);
|
|
268
|
+
objLoader.load(url, res, null, rej);
|
|
269
|
+
},
|
|
270
|
+
void 0,
|
|
271
|
+
() => {
|
|
272
|
+
objLoader.load(url, res, null, rej);
|
|
273
|
+
}
|
|
274
|
+
);
|
|
275
|
+
});
|
|
207
276
|
case "json":
|
|
208
277
|
return fetch(url).then((response) => response.json()).then((json) => {
|
|
209
278
|
try {
|
|
@@ -485,6 +554,7 @@ async function KeyFrameAnimationLerp(object, animationObj, signal = null) {
|
|
|
485
554
|
let selectorRuleCache = /* @__PURE__ */ new Map();
|
|
486
555
|
let selectorRuleCacheVersion = -1;
|
|
487
556
|
let warnedLegacyNameClassFallback = false;
|
|
557
|
+
let asyncAssignmentSerial = 0;
|
|
488
558
|
function ensureSelectorRuleCache() {
|
|
489
559
|
const version = getGlobalStyleCacheVersion();
|
|
490
560
|
if (selectorRuleCacheVersion !== version) {
|
|
@@ -531,6 +601,43 @@ function stopObjectAnimation(object) {
|
|
|
531
601
|
object.userData._animationAbortController = null;
|
|
532
602
|
object.userData._animationRunning = false;
|
|
533
603
|
}
|
|
604
|
+
function coerceAssetToGeometryPayload(assetValue, rawProp) {
|
|
605
|
+
var _a;
|
|
606
|
+
if (!assetValue) return null;
|
|
607
|
+
if (assetValue.isBufferGeometry) {
|
|
608
|
+
return { geometry: assetValue, material: null };
|
|
609
|
+
}
|
|
610
|
+
if ((_a = assetValue.geometry) == null ? void 0 : _a.isBufferGeometry) {
|
|
611
|
+
return {
|
|
612
|
+
geometry: assetValue.geometry,
|
|
613
|
+
material: assetValue.material ?? null
|
|
614
|
+
};
|
|
615
|
+
}
|
|
616
|
+
if (assetValue.isObject3D && typeof assetValue.traverse === "function") {
|
|
617
|
+
let foundMesh = null;
|
|
618
|
+
assetValue.traverse((node) => {
|
|
619
|
+
var _a2;
|
|
620
|
+
if (!foundMesh && (node == null ? void 0 : node.isMesh) && ((_a2 = node.geometry) == null ? void 0 : _a2.isBufferGeometry)) {
|
|
621
|
+
foundMesh = node;
|
|
622
|
+
}
|
|
623
|
+
});
|
|
624
|
+
if (foundMesh) {
|
|
625
|
+
return {
|
|
626
|
+
geometry: foundMesh.geometry,
|
|
627
|
+
material: foundMesh.material ?? null
|
|
628
|
+
};
|
|
629
|
+
}
|
|
630
|
+
}
|
|
631
|
+
console.error(`Asset resolved for "${rawProp}" is not a BufferGeometry.`);
|
|
632
|
+
return null;
|
|
633
|
+
}
|
|
634
|
+
function cloneMaterialLike(material) {
|
|
635
|
+
if (!material) return material;
|
|
636
|
+
if (Array.isArray(material)) {
|
|
637
|
+
return material.map((m) => (m == null ? void 0 : m.clone) ? m.clone() : m);
|
|
638
|
+
}
|
|
639
|
+
return material.clone ? material.clone() : material;
|
|
640
|
+
}
|
|
534
641
|
function parseAnimationCSS(value) {
|
|
535
642
|
if (!value) return null;
|
|
536
643
|
const lower = value.trim().toLowerCase();
|
|
@@ -638,20 +745,23 @@ function deep_searchParms(object, path) {
|
|
|
638
745
|
return { parent, key };
|
|
639
746
|
}
|
|
640
747
|
function CSSValueTo3JSValue(value, __object = null) {
|
|
748
|
+
const normalizedValue = typeof value === "string" ? value.trim() : value;
|
|
749
|
+
if (typeof normalizedValue !== "string") return normalizedValue;
|
|
641
750
|
let parsed;
|
|
642
|
-
if (/^\(.+\)$/.test(
|
|
643
|
-
parsed =
|
|
644
|
-
} else if (!Number.isNaN(parseFloat(
|
|
645
|
-
parsed = parseFloat(
|
|
751
|
+
if (/^\(.+\)$/.test(normalizedValue)) {
|
|
752
|
+
parsed = normalizedValue.slice(1, -1).split(",").map((v) => parseFloat(v.trim()));
|
|
753
|
+
} else if (!Number.isNaN(parseFloat(normalizedValue))) {
|
|
754
|
+
parsed = parseFloat(normalizedValue);
|
|
646
755
|
} else {
|
|
647
|
-
parsed =
|
|
756
|
+
parsed = normalizedValue.replace(/^['"]|['"]$/g, "");
|
|
648
757
|
}
|
|
649
758
|
if (typeof parsed === "string") {
|
|
759
|
+
console.log(parsed);
|
|
760
|
+
const assetName = parsed;
|
|
761
|
+
if (getAsset(assetName)) {
|
|
762
|
+
return getAsset(assetName);
|
|
763
|
+
}
|
|
650
764
|
switch (parsed[0]) {
|
|
651
|
-
case "@": {
|
|
652
|
-
const p = parsed.slice(1);
|
|
653
|
-
return getAsset(p);
|
|
654
|
-
}
|
|
655
765
|
case "#": {
|
|
656
766
|
if (!__object) {
|
|
657
767
|
console.error("CSSValueTo3JSValue: __object is null when resolving", parsed);
|
|
@@ -709,6 +819,7 @@ function _apply_rule(rule, object, _chosenOne = null) {
|
|
|
709
819
|
if (!rule || !rule.style || !object) return;
|
|
710
820
|
const domEl = object.userData.domEl;
|
|
711
821
|
object.userData._lastCSS = object.userData._lastCSS || /* @__PURE__ */ Object.create(null);
|
|
822
|
+
object.userData._pendingAsyncAssignments = object.userData._pendingAsyncAssignments || /* @__PURE__ */ Object.create(null);
|
|
712
823
|
let sawAnimationDeclaration = false;
|
|
713
824
|
if ((domEl == null ? void 0 : domEl.hasAttribute("onclick")) || (domEl == null ? void 0 : domEl.hasAttribute("onmouseover")) || (domEl == null ? void 0 : domEl.hasAttribute("ondblclick")) || (domEl == null ? void 0 : domEl.hasAttribute("onmousedown")) || (domEl == null ? void 0 : domEl.hasAttribute("onmouseup")) || (domEl == null ? void 0 : domEl.hasAttribute("oncontextmenu")) || hasClassPseudoRule(object, ":hover") || hasClassPseudoRule(object, ":focus") || object.userData.domId && getCSSRule(`#${object.userData.domId}:focus`) || object.userData.domId && getCSSRule(`#${object.userData.domId}:hover`)) {
|
|
714
825
|
object.layers.enable(3);
|
|
@@ -739,19 +850,35 @@ function _apply_rule(rule, object, _chosenOne = null) {
|
|
|
739
850
|
const path = prop.split("-");
|
|
740
851
|
const parsed = CSSValueTo3JSValue(value, object);
|
|
741
852
|
const { parent, key } = deep_searchParms(object, path);
|
|
853
|
+
const referencedAssetName = value;
|
|
854
|
+
const assignmentToken = ++asyncAssignmentSerial;
|
|
855
|
+
object.userData._pendingAsyncAssignments[prop] = assignmentToken;
|
|
742
856
|
const assignValue = (resolvedValue) => {
|
|
743
857
|
var _a;
|
|
858
|
+
if (object.userData._pendingAsyncAssignments[prop] !== assignmentToken) {
|
|
859
|
+
return;
|
|
860
|
+
}
|
|
744
861
|
if (resolvedValue === void 0) return;
|
|
862
|
+
if (referencedAssetName && resolvedValue == null) return;
|
|
863
|
+
let finalValue = resolvedValue;
|
|
864
|
+
if (referencedAssetName && key === "geometry") {
|
|
865
|
+
const payload = coerceAssetToGeometryPayload(resolvedValue, rawProp);
|
|
866
|
+
if (!payload) return;
|
|
867
|
+
finalValue = payload.geometry;
|
|
868
|
+
if (payload.material && parent && (Object.prototype.hasOwnProperty.call(parent, "material") || parent.isMesh)) {
|
|
869
|
+
parent.material = cloneMaterialLike(payload.material);
|
|
870
|
+
}
|
|
871
|
+
}
|
|
745
872
|
const transition = object.transition;
|
|
746
873
|
const currentRaw = parent[key];
|
|
747
874
|
const currentValue = currentRaw && typeof currentRaw.toArray === "function" ? currentRaw.toArray() : currentRaw;
|
|
748
875
|
const duration = (transition == null ? void 0 : transition.duration) ?? 0;
|
|
749
876
|
const timingFn = ((_a = transition == null ? void 0 : transition.timing) == null ? void 0 : _a.fun) ?? "linear";
|
|
750
|
-
const isAnimatable = transition && duration > 0 && (typeof currentValue === "number" || Array.isArray(currentValue)) && (typeof
|
|
877
|
+
const isAnimatable = transition && duration > 0 && (typeof currentValue === "number" || Array.isArray(currentValue)) && (typeof finalValue === "number" || Array.isArray(finalValue));
|
|
751
878
|
if (isAnimatable) {
|
|
752
879
|
animateLerp(
|
|
753
880
|
currentValue,
|
|
754
|
-
|
|
881
|
+
finalValue,
|
|
755
882
|
duration,
|
|
756
883
|
(v) => exchange_rule(parent, key, v),
|
|
757
884
|
() => {
|
|
@@ -764,7 +891,7 @@ function _apply_rule(rule, object, _chosenOne = null) {
|
|
|
764
891
|
timingFn
|
|
765
892
|
);
|
|
766
893
|
} else {
|
|
767
|
-
exchange_rule(parent, key,
|
|
894
|
+
exchange_rule(parent, key, finalValue);
|
|
768
895
|
}
|
|
769
896
|
};
|
|
770
897
|
if (parsed && typeof parsed.then === "function") {
|
|
@@ -801,6 +928,7 @@ function _apply_rule(rule, object, _chosenOne = null) {
|
|
|
801
928
|
}
|
|
802
929
|
}
|
|
803
930
|
function paintConvict(convictElm, cell) {
|
|
931
|
+
gatherAssetRules();
|
|
804
932
|
const convict = cell._allConvictsByDom.get(convictElm);
|
|
805
933
|
if (convict) {
|
|
806
934
|
_apply_rule(convictElm, convict);
|
|
@@ -825,6 +953,7 @@ function paintExtraCell(muse) {
|
|
|
825
953
|
}
|
|
826
954
|
}
|
|
827
955
|
function paintCell(muse) {
|
|
956
|
+
gatherAssetRules();
|
|
828
957
|
for (const obj of muse.classyConvicts) {
|
|
829
958
|
for (const cls of getObjectClassSelectors(obj)) {
|
|
830
959
|
const rule = getCSSRule(`.${cls}`);
|
|
@@ -839,6 +968,7 @@ function paintCell(muse) {
|
|
|
839
968
|
}
|
|
840
969
|
function paintSpecificMuse(muse) {
|
|
841
970
|
var _a;
|
|
971
|
+
gatherAssetRules();
|
|
842
972
|
const extra = muse.userData.extraParams || [];
|
|
843
973
|
getObjectClassSelectors(muse).forEach((cls) => {
|
|
844
974
|
const rule = getCSSRule(`.${cls}`);
|
|
@@ -1130,6 +1260,7 @@ const _Cell = class _Cell {
|
|
|
1130
1260
|
cellElm.addEventListener("mouseup", this._boundMouseUp);
|
|
1131
1261
|
cellElm.addEventListener("dblclick", this._boundDoubleClick);
|
|
1132
1262
|
cellElm.addEventListener("contextmenu", this._boundContextMenu);
|
|
1263
|
+
gatherAssetRules();
|
|
1133
1264
|
paintCell(this);
|
|
1134
1265
|
this._styleElemObserver = new MutationObserver(() => {
|
|
1135
1266
|
if (this._pendingStyleRepaint) return;
|
|
@@ -1137,6 +1268,7 @@ const _Cell = class _Cell {
|
|
|
1137
1268
|
this._pendingStyleRepaint = true;
|
|
1138
1269
|
requestAnimationFrame(() => {
|
|
1139
1270
|
this._pendingStyleRepaint = false;
|
|
1271
|
+
gatherAssetRules();
|
|
1140
1272
|
paintCell(this);
|
|
1141
1273
|
this._repaintKnownConvicts();
|
|
1142
1274
|
});
|
|
@@ -1280,6 +1412,7 @@ const _Cell = class _Cell {
|
|
|
1280
1412
|
this._pendingStyleRepaint = true;
|
|
1281
1413
|
requestAnimationFrame(() => {
|
|
1282
1414
|
this._pendingStyleRepaint = false;
|
|
1415
|
+
gatherAssetRules();
|
|
1283
1416
|
paintCell(this);
|
|
1284
1417
|
this._repaintKnownConvicts();
|
|
1285
1418
|
});
|
|
@@ -1698,6 +1831,7 @@ export {
|
|
|
1698
1831
|
exchange_rule,
|
|
1699
1832
|
fastRemoveArray,
|
|
1700
1833
|
fastRemove_arry,
|
|
1834
|
+
gatherAssetRules,
|
|
1701
1835
|
gatherKeyFrame_MAP,
|
|
1702
1836
|
getAnimationMap,
|
|
1703
1837
|
getAsset,
|
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\n//\n// - Keyframe rule collection\n// - Class map for tag → THREE constructor\n// - Asset loading / caching\n// - Small array utilities\n\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 { OBJLoader } from 'three/examples/jsm/loaders/OBJLoader.js';\nimport { getGlobalStyleCacheVersion } from './styleCache.js';\n\nexport let AllKeyFramesMap = new Map();\nlet keyframesCacheVersion = -1;\n\n/**\n * Collect all @keyframes rules from loaded stylesheets.\n *\n * @returns {Map<string, CSSKeyframesRule>}\n */\nexport function gatherKeyFrame_MAP() {\n const styleVersion = getGlobalStyleCacheVersion();\n if (keyframesCacheVersion === styleVersion) {\n return AllKeyFramesMap;\n }\n\n AllKeyFramesMap.clear();\n\n const KEYFRAMES_TYPES = new Set();\n if (typeof CSSRule !== 'undefined') {\n if ('KEYFRAMES_RULE' in CSSRule) KEYFRAMES_TYPES.add(CSSRule.KEYFRAMES_RULE);\n if ('WEBKIT_KEYFRAMES_RULE' in CSSRule) KEYFRAMES_TYPES.add(CSSRule.WEBKIT_KEYFRAMES_RULE);\n }\n\n for (const sheet of document.styleSheets) {\n let rules;\n try {\n rules = sheet.cssRules;\n } catch {\n continue;\n }\n for (const rule of rules) {\n if (KEYFRAMES_TYPES.has(rule.type)) {\n AllKeyFramesMap.set(rule.name, rule);\n }\n }\n }\n\n keyframesCacheVersion = styleVersion;\n return AllKeyFramesMap;\n}\n\n/**\n * Get a CSSKeyframesRule by name, rescanning stylesheets each call.\n *\n * @param {string} AnimName\n */\nexport function getAnimationMap(AnimName) {\n if (!AnimName) return undefined;\n gatherKeyFrame_MAP();\n return AllKeyFramesMap.get(AnimName);\n}\n\n/* ───────────────── CLASS MAP ───────────────── */\n\nlet classMap = null;\n\n/**\n * Build a map of tag-name-like keys → THREE.Object3D constructors.\n */\nfunction buildClassMap() {\n classMap = Object.getOwnPropertyNames(THREE)\n .filter(key => {\n const C = THREE[key];\n return typeof C === 'function' && C.prototype instanceof THREE.Object3D;\n })\n .reduce((m, key) => {\n m[key.toUpperCase()] = THREE[key];\n return m;\n }, Object.create(null));\n\n // include base Object3D explicitly\n classMap.OBJECT3D = THREE.Object3D;\n}\n\n/**\n * Get the cached class map, building it on first call.\n *\n * @returns {Object.<string,Function>}\n */\nexport function getClassMap() {\n if (!classMap) buildClassMap();\n return classMap;\n}\n\n/* ───────────────── ASSET MAP ───────────────── */\n\nconst assetMap = new Map();\nconst gltfLoader = new GLTFLoader();\nconst fbxLoader = new FBXLoader();\nconst textureLoader = new THREE.TextureLoader();\nconst audioLoader = new THREE.AudioLoader();\nconst mtlLoader = new MTLLoader();\nconst objLoader = new OBJLoader();\n\nconst pendingStylesheetAssetParses = new Set();\n\nfunction trackStylesheetParse(promise) {\n if (!promise || typeof promise.then !== 'function') return;\n pendingStylesheetAssetParses.add(promise);\n promise.finally(() => {\n pendingStylesheetAssetParses.delete(promise);\n });\n}\n\nfunction getUrlBasePath(url) {\n const slash = url.lastIndexOf('/');\n return slash >= 0 ? url.slice(0, slash + 1) : '';\n}\n\nfunction storeAssetValue(key, value) {\n if (value && typeof value.then === 'function') {\n const pending = value\n .then(resolved => {\n assetMap.set(key, resolved);\n return resolved;\n })\n .catch(err => {\n console.error(`Failed to load asset \"${key}\":`, err);\n assetMap.delete(key);\n return null;\n });\n assetMap.set(key, pending);\n } else {\n assetMap.set(key, value);\n }\n}\n\nfunction parseAssetRulesFromText(cssText) {\n if (!cssText || typeof cssText !== 'string') return [];\n\n const ignoreAtRules = new Set([\n 'media', 'import', 'supports', 'keyframes', 'font-face', 'charset',\n 'namespace', 'page', 'counter-style', 'font-feature-values', 'viewport'\n ]);\n\n const assets = [];\n const atRuleRegex = /@([A-Za-z0-9_-]+)\\s*\\{([\\s\\S]*?)\\}/g;\n let match;\n while ((match = atRuleRegex.exec(cssText)) !== null) {\n const atName = match[1];\n if (ignoreAtRules.has(atName.toLowerCase())) continue;\n\n const body = match[2] || '';\n const obj = {};\n body.split(';').forEach(line => {\n const idx = line.indexOf(':');\n if (idx <= 0) return;\n const key = line.slice(0, idx).trim().toLowerCase();\n const rawValue = line.slice(idx + 1).trim();\n if (!key || !rawValue) return;\n obj[key] = rawValue.replace(/^['\"(]+|['\")]+$/g, '');\n });\n\n const url = \".\" + obj.url;\n if (!url) continue;\n\n\n const name = (obj.name && obj.name.trim())\n ? obj.name.trim()\n : atName;\n\n assets.push({ name, url });\n }\n\n return assets;\n}\n\nfunction registerParsedAssetRuleEntries(entries) {\n if (!Array.isArray(entries)) return;\n for (const entry of entries) {\n if (!entry?.name || !entry?.url) continue;\n if (!assetMap.has(entry.name)) {\n storeAssetValue(entry.name, loadAsset(entry.url));\n }\n }\n}\n\n/**\n * Scan stylesheets for custom @rules that declare external assets.\n *\n * Syntax:\n * @MyShip {\n * url: \"./ship.glb\";\n * name: \"Spaceship\"; // optional, overrides @ identifier\n * }\n */\nexport function gatherAssetRules() {\n const styleVersion = getGlobalStyleCacheVersion();\n if (gatherAssetRules._cacheVersion === styleVersion) {\n return;\n }\n\n const linkSheetsToParse = [];\n for (const sheet of document.styleSheets) {\n const owner = sheet.ownerNode;\n if (owner?.nodeName === 'STYLE') {\n registerParsedAssetRuleEntries(parseAssetRulesFromText(owner.textContent || ''));\n continue;\n }\n\n if (owner?.nodeName === 'LINK' && sheet.href) {\n linkSheetsToParse.push(sheet.href);\n }\n }\n\n const uniqueLinks = [...new Set(linkSheetsToParse)];\n if (!gatherAssetRules._linkFetchByVersion) {\n gatherAssetRules._linkFetchByVersion = new Map();\n }\n\n const cacheKeyPrefix = `${styleVersion}|`;\n for (const key of [...gatherAssetRules._linkFetchByVersion.keys()]) {\n if (!key.startsWith(cacheKeyPrefix)) {\n gatherAssetRules._linkFetchByVersion.delete(key);\n }\n }\n\n if (uniqueLinks.length) {\n for (const href of uniqueLinks) {\n const fetchKey = `${styleVersion}|${href}`;\n if (gatherAssetRules._linkFetchByVersion.has(fetchKey)) continue;\n\n const parsePromise = fetch(href)\n .then(resp => (resp.ok ? resp.text() : ''))\n .then(cssText => {\n registerParsedAssetRuleEntries(parseAssetRulesFromText(cssText));\n })\n .catch(err => {\n console.warn(`Failed to parse stylesheet text for asset rules: ${href}`, err);\n });\n\n gatherAssetRules._linkFetchByVersion.set(fetchKey, parsePromise);\n trackStylesheetParse(parsePromise);\n }\n }\n\n gatherAssetRules._cacheVersion = styleVersion;\n}\n\n/**\n * Get or load an asset by name.\n *\n * Built-ins (auto-registered on first use):\n * - cube → BoxGeometry\n * - sphere → SphereGeometry\n * - plane → PlaneGeometry\n * - torus → TorusGeometry\n *\n * @param {string} name\n * @param {string|null} [path=null]\n * @returns {any}\n */\nexport function getAsset(name, path = null) {\n if (assetMap.size === 0) {\n storeAssetValue('cube', new THREE.BoxGeometry());\n storeAssetValue('sphere', new THREE.SphereGeometry());\n storeAssetValue('plane', new THREE.PlaneGeometry());\n storeAssetValue('torus', new THREE.TorusGeometry());\n }\n\n // read CSS-defined assets\n gatherAssetRules();\n\n const key = name;\n if (!assetMap.has(key)) {\n if (!path) {\n if (pendingStylesheetAssetParses.size > 0) {\n const pending = Promise.allSettled([...pendingStylesheetAssetParses]).then(() => {\n const resolved = assetMap.get(key);\n if (resolved !== undefined) return resolved;\n console.warn(`Asset \"${name}\" missing and no path supplied.`);\n return null;\n });\n return pending;\n }\n\n console.warn(`Asset \"${name}\" missing and no path supplied.`);\n return null;\n }\n storeAssetValue(key, loadAsset(path));\n }\n\n return assetMap.get(key);\n}\n\n/**\n * Load a 3D / texture / audio / material asset based on file extension.\n *\n * @param {string} url\n * @returns {Promise<any>|null}\n */\nexport function loadAsset(url) {\n const ext = (url.split('.').pop() || '').toLowerCase();\n switch (ext) {\n case 'gltf':\n case 'glb':\n return new Promise((res, rej) =>\n gltfLoader.load(url, d => res(d.scene || d), null, rej)\n );\n case 'fbx':\n return new Promise((res, rej) =>\n fbxLoader.load(url, res, null, rej)\n );\n case 'png':\n case 'jpg':\n case 'jpeg':\n case 'gif':\n case 'webp':\n return new Promise((res, rej) =>\n textureLoader.load(url, tex => res(tex), undefined, rej)\n );\n case 'mp3':\n case 'wav':\n case 'ogg':\n case 'flac':\n case 'aac':\n return new Promise((res, rej) =>\n audioLoader.load(url, buffer => res(buffer), undefined, rej)\n );\n case 'mtl':\n return new Promise((res, rej) => {\n const basePath = getUrlBasePath(url);\n mtlLoader.setPath(basePath);\n mtlLoader.setResourcePath(basePath);\n mtlLoader.load(\n url,\n mtl => {\n mtl.preload();\n res(mtl);\n },\n undefined,\n rej\n );\n });\n case 'obj':\n return new Promise((res, rej) => {\n const basePath = getUrlBasePath(url);\n const mtlUrl = url.replace(/\\.obj$/i, '.mtl');\n\n console.log(mtlUrl);\n\n\n mtlLoader.load(\n mtlUrl,\n mtl => {\n mtl.preload();\n objLoader.setMaterials(mtl);\n objLoader.load(url, res, null, rej);\n },\n undefined,\n () => {\n // If no companion MTL exists, still load the OBJ geometry.\n objLoader.load(url, res, null, rej);\n }\n );\n });\n case 'json':\n return fetch(url)\n .then(response => response.json())\n .then(json => {\n try {\n const loader = new THREE.MaterialLoader();\n return loader.parse(json);\n } catch (err) {\n console.warn(`MaterialLoader failed to parse ${url}:`, err);\n return json;\n }\n });\n default:\n console.warn(`No loader for \".${ext}\".`);\n return Promise.resolve(null);\n }\n}\n\n/**\n * Remove an item from an array without preserving order.\n *\n * @param {Array<any>} arry\n * @param {any} item\n */\nexport function fastRemove_arry(arry, item) {\n const index = arry.indexOf(item);\n if (index !== -1) {\n arry[index] = arry[arry.length - 1];\n arry.pop();\n }\n}\n\n// Alias for older code.\nexport const fastRemoveArray = fastRemove_arry;","// 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 { gatherAssetRules, getAsset } from './utils.js';\r\nimport Cell from './cell.js';\r\nimport { animateLerp, KeyFrameAnimationLerp } from './Train.js';\r\nimport * as THREE from 'three';\r\nimport { getGlobalStyleCacheVersion } from './styleCache.js';\r\n\r\nlet selectorRuleCache = new Map();\r\nlet selectorRuleCacheVersion = -1;\r\nlet warnedLegacyNameClassFallback = false;\r\nlet asyncAssignmentSerial = 0;\r\nconst ASSET_REFERENCE_RE = /^@asset\\s*\\(\\s*([^)]+?)\\s*\\)$/i;\r\n\r\nfunction ensureSelectorRuleCache() {\r\n const version = getGlobalStyleCacheVersion();\r\n if (selectorRuleCacheVersion !== version) {\r\n selectorRuleCache.clear();\r\n selectorRuleCacheVersion = version;\r\n }\r\n}\r\n\r\nfunction getObjectClassSelectors(object) {\r\n const aliasList = object?.classList;\r\n if (Array.isArray(aliasList)) return aliasList;\r\n\r\n if (object?.userData && Object.prototype.hasOwnProperty.call(object.userData, 'classList')) {\r\n return Array.isArray(object.userData.classList) ? object.userData.classList : [];\r\n }\r\n\r\n if (object?.name) {\r\n if (!warnedLegacyNameClassFallback) {\r\n warnedLegacyNameClassFallback = true;\r\n console.warn(\r\n 'JailedThreeJS: inferring CSS classes from Object3D.name is deprecated. Use object.classList/userData.classList.'\r\n );\r\n }\r\n return [object.name];\r\n }\r\n\r\n return [];\r\n}\r\n\r\nfunction hasClassPseudoRule(object, pseudo) {\r\n return getObjectClassSelectors(object).some(cls => getCSSRule(`.${cls}${pseudo}`));\r\n}\r\n\r\nfunction animationConfigKey(animCfg) {\r\n if (!animCfg) return null;\r\n return [\r\n animCfg.name || '',\r\n animCfg.duration || 0,\r\n animCfg.timing?.fun || 'linear',\r\n animCfg.iteration?.count ?? 1\r\n ].join('|');\r\n}\r\n\r\nfunction stopObjectAnimation(object) {\r\n const ctrl = object?.userData?._animationAbortController;\r\n if (ctrl && typeof ctrl.abort === 'function' && !ctrl.signal?.aborted) {\r\n ctrl.abort();\r\n }\r\n object.userData._animationAbortController = null;\r\n object.userData._animationRunning = false;\r\n}\r\n\r\n\r\n\r\nfunction coerceAssetToGeometryPayload(assetValue, rawProp) {\r\n if (!assetValue) return null;\r\n\r\n if (assetValue.isBufferGeometry) {\r\n return { geometry: assetValue, material: null };\r\n }\r\n\r\n if (assetValue.geometry?.isBufferGeometry) {\r\n return {\r\n geometry: assetValue.geometry,\r\n material: assetValue.material ?? null\r\n };\r\n }\r\n\r\n if (assetValue.isObject3D && typeof assetValue.traverse === 'function') {\r\n let foundMesh = null;\r\n assetValue.traverse(node => {\r\n if (!foundMesh && node?.isMesh && node.geometry?.isBufferGeometry) {\r\n foundMesh = node;\r\n }\r\n });\r\n if (foundMesh) {\r\n return {\r\n geometry: foundMesh.geometry,\r\n material: foundMesh.material ?? null\r\n };\r\n }\r\n }\r\n console.error(`Asset resolved for \"${rawProp}\" is not a BufferGeometry.`);\r\n return null;\r\n}\r\n\r\nfunction cloneMaterialLike(material) {\r\n if (!material) return material;\r\n if (Array.isArray(material)) {\r\n return material.map(m => (m?.clone ? m.clone() : m));\r\n }\r\n return material.clone ? material.clone() : material;\r\n}\r\n\r\nfunction parseAnimationCSS(value) {\r\n if (!value) return null;\r\n\r\n const lower = value.trim().toLowerCase();\r\n if (!lower || lower === 'none') return null;\r\n\r\n const parts = lower.split(/\\s+/).filter(Boolean);\r\n if (!parts.length) return null;\r\n\r\n // First token = name (keep original case for the keyframe name)\r\n const nameToken = parts.shift();\r\n if (!nameToken) return null;\r\n\r\n let durationMs = 1000; // default 1s\r\n let timingFun = 'linear'; // default timing\r\n let iterationCount = 1; // default once\r\n\r\n // Duration\r\n if (parts.length) {\r\n const timeToken = parts[0];\r\n if (/\\d/.test(timeToken)) {\r\n parts.shift();\r\n if (timeToken.endsWith('ms')) {\r\n durationMs = parseFloat(timeToken);\r\n } else if (timeToken.endsWith('s')) {\r\n durationMs = parseFloat(timeToken) * 1000;\r\n } else {\r\n durationMs = parseFloat(timeToken);\r\n }\r\n }\r\n }\r\n\r\n // Look for \"infinite\"/\"infinity\" in the remaining tokens\r\n const infIndex = parts.findIndex(t => t === 'infinite' || t === 'infinity');\r\n if (infIndex !== -1) {\r\n iterationCount = 'infinite';\r\n parts.splice(infIndex, 1);\r\n } else if (parts.length) {\r\n const maybeCount = parseInt(parts[parts.length - 1], 10);\r\n if (Number.isFinite(maybeCount) && maybeCount > 0) {\r\n iterationCount = maybeCount;\r\n parts.pop();\r\n }\r\n }\r\n\r\n // Whatever is left becomes the timing function string\r\n if (parts.length) {\r\n timingFun = parts.join(' ');\r\n }\r\n\r\n return {\r\n name: nameToken,\r\n duration: durationMs,\r\n iteration: { count: iterationCount },\r\n timing: { fun: timingFun }\r\n };\r\n}\r\n\r\n\r\n\r\nfunction parseTransitionCSS(value) {\r\n if (!value) return null;\r\n\r\n const lower = value.trim().toLowerCase();\r\n if (!lower || lower === 'none') return null;\r\n\r\n const parts = lower.split(/\\s+/).filter(Boolean);\r\n if (!parts.length) return null;\r\n\r\n const timeToken = parts.shift();\r\n let durationMs;\r\n\r\n if (timeToken.endsWith('ms')) {\r\n durationMs = parseFloat(timeToken);\r\n } else if (timeToken.endsWith('s')) {\r\n durationMs = parseFloat(timeToken) * 1000;\r\n } else {\r\n durationMs = parseFloat(timeToken);\r\n }\r\n\r\n if (!Number.isFinite(durationMs) || durationMs <= 0) {\r\n return null;\r\n }\r\n\r\n const timingFun = parts.join(' ') || 'linear';\r\n\r\n return {\r\n duration: durationMs,\r\n timing: { fun: timingFun }\r\n };\r\n}\r\n\r\n\r\n/**\r\n * Find first CSS rule whose selector list contains `selector` token.\r\n *\r\n * @param {string} selector\r\n * @returns {CSSStyleRule|undefined}\r\n */\r\nexport function getCSSRule(selector) {\r\n ensureSelectorRuleCache();\r\n if (selectorRuleCache.has(selector)) {\r\n return selectorRuleCache.get(selector) || undefined;\r\n }\r\n\r\n let found = null;\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 // 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)) {\r\n found = rule;\r\n break;\r\n }\r\n }\r\n if (found) break;\r\n }\r\n if (found) break;\r\n }\r\n\r\n selectorRuleCache.set(selector, found);\r\n return found || undefined;\r\n}\r\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 * - \"#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 const normalizedValue = typeof value === 'string' ? value.trim() : value;\r\n if (typeof normalizedValue !== 'string') return normalizedValue;\r\n let parsed;\r\n\r\n if (/^\\(.+\\)$/.test(normalizedValue)) {\r\n parsed = normalizedValue.slice(1, -1).split(',').map(v => parseFloat(v.trim()));\r\n } else if (!Number.isNaN(parseFloat(normalizedValue))) {\r\n parsed = parseFloat(normalizedValue);\r\n } else {\r\n parsed = normalizedValue.replace(/^['\"]|['\"]$/g, '');\r\n }\r\n\r\n if (typeof parsed === 'string') {\r\n console.log(parsed);\r\n const assetName = parsed;\r\n if (getAsset(assetName)) {\r\n return getAsset(assetName);\r\n }\r\n\r\n\r\n switch (parsed[0]) {\r\n case '#': {\r\n if (!__object) {\r\n console.error('CSSValueTo3JSValue: __object is null when resolving', parsed);\r\n return null;\r\n }\r\n try {\r\n const cellElement = __object.userData.domEl.closest('cell');\r\n const actualCellObject = Cell.getCell(cellElement);\r\n const path = parsed.split('-');\r\n if (path.length < 1) {\r\n throw new Error('Requesting empty paths using \"#\" is not allowed');\r\n }\r\n const targetObject = actualCellObject.getConvictById(path[0].slice(1));\r\n if (!targetObject) {\r\n throw new Error('Failed to find object with id ' + parsed);\r\n }\r\n path.shift();\r\n const { parent, key } = deep_searchParms(targetObject, path);\r\n return parent[key];\r\n } catch (err) {\r\n console.error(err);\r\n return undefined;\r\n }\r\n }\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n return parsed;\r\n}\r\n\r\n/**\r\n * Assign a value to a property, handling vectors / setters / plain fields.\r\n *\r\n * @param {Object} parent\r\n * @param {string} key\r\n * @param {any} value\r\n */\r\nexport function exchange_rule(parent, key, value) {\r\n if (!parent) return;\r\n const target = parent[key];\r\n\r\n try {\r\n if (Array.isArray(value)) {\r\n if (target && typeof target.set === 'function') {\r\n target.set(...value);\r\n } else if (typeof target === 'function') {\r\n target(...value);\r\n } else {\r\n parent[key] = value;\r\n }\r\n return;\r\n }\r\n\r\n // scalar or non-array\r\n if (target && typeof target.set === 'function') {\r\n target.set(value);\r\n } else if (typeof target === 'function') {\r\n target(value);\r\n } else {\r\n parent[key] = value;\r\n }\r\n } catch (err) {\r\n console.warn(`Failed to assign ${key} with`, value, err);\r\n }\r\n}\r\n\r\n/**\r\n * Core rule application.\r\n *\r\n * @param {CSSStyleRule|HTMLElement} rule\r\n * @param {THREE.Object3D} object\r\n * @param {string|null} [_chosenOne=null] selector that caused this rule\r\n */\r\nfunction _apply_rule(rule, object, _chosenOne = null) {\r\n if (!rule || !rule.style || !object) return;\r\n\r\n const domEl = object.userData.domEl;\r\n object.userData._lastCSS = object.userData._lastCSS || Object.create(null);\r\n object.userData._pendingAsyncAssignments =\r\n object.userData._pendingAsyncAssignments || Object.create(null);\r\n let sawAnimationDeclaration = false;\r\n\r\n // enable picking layer when interactive / pseudo-rules exist\r\n if (\r\n domEl?.hasAttribute('onclick') ||\r\n domEl?.hasAttribute('onmouseover') ||\r\n domEl?.hasAttribute('ondblclick') ||\r\n domEl?.hasAttribute('onmousedown') ||\r\n domEl?.hasAttribute('onmouseup') ||\r\n domEl?.hasAttribute('oncontextmenu') ||\r\n hasClassPseudoRule(object, ':hover') ||\r\n hasClassPseudoRule(object, ':focus') ||\r\n (object.userData.domId && getCSSRule(`#${object.userData.domId}:focus`)) ||\r\n (object.userData.domId && getCSSRule(`#${object.userData.domId}:hover`))\r\n ) {\r\n object.layers.enable(3);\r\n } else {\r\n object.layers.disable(3);\r\n }\r\n\r\n for (let i = 0; i < rule.style.length; i++) {\r\n const rawProp = rule.style[i];\r\n const value = rule.style.getPropertyValue(rawProp).trim();\r\n\r\n if (!rawProp.startsWith('--')) continue;\r\n\r\n // CSS-driven transition config\r\n if (rawProp === '--transition') {\r\n const cfg = parseTransitionCSS(value);\r\n object.transition = cfg; // may be null if \"none\"\r\n continue;\r\n }\r\n\r\n // CSS-driven animation config\r\n if (rawProp === '--animation') {\r\n sawAnimationDeclaration = true;\r\n const animCfg = parseAnimationCSS(value);\r\n const nextAnimKey = animationConfigKey(animCfg);\r\n if (object.userData._animationConfigKey !== nextAnimKey) {\r\n stopObjectAnimation(object);\r\n object.userData._animationConfigKey = nextAnimKey;\r\n }\r\n object.animation = animCfg; // may be null if \"none\"\r\n continue;\r\n }\r\n\r\n // Normal custom property flow (position, rotation, etc.)\r\n const prop = rawProp.slice(2);\r\n const path = prop.split('-');\r\n const parsed = CSSValueTo3JSValue(value, object);\r\n const { parent, key } = deep_searchParms(object, path);\r\n const referencedAssetName = value;\r\n const assignmentToken = ++asyncAssignmentSerial;\r\n object.userData._pendingAsyncAssignments[prop] = assignmentToken;\r\n\r\n const assignValue = (resolvedValue) => {\r\n if (object.userData._pendingAsyncAssignments[prop] !== assignmentToken) {\r\n return;\r\n }\r\n if (resolvedValue === undefined) return;\r\n if (referencedAssetName && resolvedValue == null) return;\r\n\r\n let finalValue = resolvedValue;\r\n if (referencedAssetName && key === 'geometry') {\r\n const payload = coerceAssetToGeometryPayload(resolvedValue, rawProp);\r\n if (!payload) return;\r\n finalValue = payload.geometry;\r\n\r\n if (\r\n payload.material &&\r\n parent &&\r\n (Object.prototype.hasOwnProperty.call(parent, 'material') || parent.isMesh)\r\n ) {\r\n parent.material = cloneMaterialLike(payload.material);\r\n }\r\n }\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 finalValue === 'number' || Array.isArray(finalValue));\r\n\r\n if (isAnimatable) {\r\n animateLerp(\r\n currentValue,\r\n finalValue,\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, finalValue);\r\n }\r\n };\r\n\r\n if (parsed && typeof parsed.then === 'function') {\r\n parsed.then(assignValue).catch(err =>\r\n console.error('Failed to resolve asset for', rawProp, err)\r\n );\r\n } else {\r\n assignValue(parsed);\r\n }\r\n}\r\n \r\n\r\n\r\n if (sawAnimationDeclaration && !object.animation) {\r\n stopObjectAnimation(object);\r\n }\r\n\r\n if (object.animation) {\r\n // Don't restart the animation every repaint\r\n if (!object.userData._animationRunning) {\r\n const controller = new AbortController();\r\n object.userData._animationRunning = true;\r\n object.userData._animationAbortController = controller;\r\n\r\n (async () => {\r\n try {\r\n await KeyFrameAnimationLerp(object, object.animation, controller.signal);\r\n } catch (err) {\r\n if (!controller.signal.aborted) {\r\n console.error(err);\r\n }\r\n } finally {\r\n if (object.userData._animationAbortController === controller) {\r\n object.userData._animationAbortController = null;\r\n object.userData._animationRunning = false;\r\n }\r\n }\r\n })();\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Apply rules for a specific element inside a cell (inline style changes).\r\n *\r\n * @param {HTMLElement} convictElm\r\n * @param {Cell} cell\r\n */\r\nexport function paintConvict(convictElm, cell) {\r\n gatherAssetRules();\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 gatherAssetRules();\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 gatherAssetRules();\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';\r\nimport { gatherAssetRules, getClassMap } from './utils.js';\r\nimport {\r\n paintCell,\r\n paintConvict,\r\n paintSpecificMuse\r\n} from './artist.js';\r\nimport { markGlobalStyleCacheDirty } from './styleCache.js';\r\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;\r\n this.loadedScene = scene;\r\n this.focusedCamera = camera;\r\n\r\n this.classyConvicts = new Set();\r\n this.namedConvicts = new Set();\r\n this._allConvictsByDom = new WeakMap();\r\n this._convictsById = new Map();\r\n this._convictsByClass = new Map();\r\n\r\n this.updateFunds = [];\r\n this._observedStyleElements = new WeakSet();\r\n this._pendingStyleRepaint = false;\r\n this._pointerMoveRaf = 0;\r\n this._pendingPointerMoveEvt = null;\r\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 // prime CSS-declared assets before first style apply\r\n gatherAssetRules();\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(() => {\r\n if (this._pendingStyleRepaint) return;\r\n markGlobalStyleCacheDirty();\r\n this._pendingStyleRepaint = true;\r\n requestAnimationFrame(() => {\r\n this._pendingStyleRepaint = false;\r\n gatherAssetRules();\r\n paintCell(this);\r\n this._repaintKnownConvicts();\r\n });\r\n });\r\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 => {\r\n mutationList.forEach(mutation => {\r\n let styleTreeChanged = false;\r\n mutation.addedNodes.forEach(node => {\r\n if (node.nodeType === Node.ELEMENT_NODE && node.nodeName === 'STYLE') {\r\n this._observeStyleElements(node);\r\n styleTreeChanged = true;\r\n } else if (node.nodeType === Node.ELEMENT_NODE && typeof node.querySelector === 'function' && node.querySelector('style')) {\r\n this._observeStyleElements(node);\r\n styleTreeChanged = true;\r\n }\r\n });\r\n mutation.removedNodes.forEach(node => {\r\n if (node.nodeType === Node.ELEMENT_NODE && (node.nodeName === 'STYLE' || (typeof node.querySelector === 'function' && node.querySelector('style')))) {\r\n styleTreeChanged = true;\r\n }\r\n });\r\n if (styleTreeChanged) {\r\n markGlobalStyleCacheDirty();\r\n this._scheduleFullRepaint();\r\n }\r\n });\r\n });\r\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') {\r\n this._observeStyleElements(node);\r\n markGlobalStyleCacheDirty();\r\n this._scheduleFullRepaint();\r\n } else {\r\n this.ScanElement(node);\r\n const convict = this.getConvictByDom(node);\r\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++) {\r\n const node = mutation.removedNodes[i];\r\n if (node.nodeType === Node.ELEMENT_NODE && node.nodeName !== 'CANVAS') {\r\n if (node.nodeName === 'STYLE' || (typeof node.querySelector === 'function' && node.querySelector('style'))) {\r\n markGlobalStyleCacheDirty();\r\n this._scheduleFullRepaint();\r\n }\r\n this.removeConvict(this._allConvictsByDom.get(node));\r\n }\r\n }\r\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\r\n if (mutation.attributeName === 'id') {\r\n this._syncConvictIdentity(convict, target);\r\n paintSpecificMuse(convict);\r\n } else if (mutation.attributeName === 'class') {\r\n this._syncConvictIdentity(convict, target);\r\n paintSpecificMuse(convict);\r\n } else if (mutation.attributeName === 'style') {\r\n // inline style changed; repaint this convict\r\n paintConvict(target, this);\r\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();\r\n }\r\n\r\n _scheduleFullRepaint() {\r\n if (this._pendingStyleRepaint) return;\r\n this._pendingStyleRepaint = true;\r\n requestAnimationFrame(() => {\r\n this._pendingStyleRepaint = false;\r\n gatherAssetRules();\r\n paintCell(this);\r\n this._repaintKnownConvicts();\r\n });\r\n }\r\n\r\n _repaintKnownConvicts() {\r\n const visited = new Set();\r\n for (const convict of this.classyConvicts) {\r\n if (!visited.has(convict)) {\r\n visited.add(convict);\r\n paintSpecificMuse(convict);\r\n }\r\n }\r\n for (const convict of this.namedConvicts) {\r\n if (!visited.has(convict)) {\r\n visited.add(convict);\r\n paintSpecificMuse(convict);\r\n }\r\n }\r\n }\r\n\r\n _normalizeClassList(input) {\r\n if (Array.isArray(input)) return input.filter(Boolean).map(String);\r\n if (typeof input === 'string') return input.split(/\\s+/).filter(Boolean);\r\n if (input && typeof input[Symbol.iterator] === 'function') {\r\n return Array.from(input).filter(Boolean).map(String);\r\n }\r\n return [];\r\n }\r\n\r\n _ensureConvictClassAlias(convict) {\r\n if (Object.prototype.hasOwnProperty.call(convict, 'classList')) return;\r\n Object.defineProperty(convict, 'classList', {\r\n enumerable: false,\r\n configurable: true,\r\n get() {\r\n return this.userData.classList;\r\n },\r\n set(value) {\r\n let next = [];\r\n if (Array.isArray(value)) {\r\n next = value.filter(Boolean).map(String);\r\n } else if (typeof value === 'string') {\r\n next = value.split(/\\s+/).filter(Boolean);\r\n } else if (value && typeof value[Symbol.iterator] === 'function') {\r\n next = Array.from(value).filter(Boolean).map(String);\r\n }\r\n const domEl = this.userData?.domEl;\r\n if (domEl && domEl.className !== next.join(' ')) {\r\n domEl.className = next.join(' ');\r\n return;\r\n }\r\n this.userData.classList = next;\r\n }\r\n });\r\n }\r\n\r\n _removeClassIndex(convict, className) {\r\n const bucket = this._convictsByClass.get(className);\r\n if (!bucket) return;\r\n bucket.delete(convict);\r\n if (bucket.size === 0) {\r\n this._convictsByClass.delete(className);\r\n }\r\n }\r\n\r\n _syncConvictIdentity(convict, elm) {\r\n if (!convict || !elm) return;\r\n\r\n const prevId = convict.userData.domId || '';\r\n const prevClasses = Array.isArray(convict.userData.classList)\r\n ? convict.userData.classList\r\n : [];\r\n\r\n const nextId = elm.id || '';\r\n const nextClasses = this._normalizeClassList(elm.classList);\r\n\r\n if (prevId && this._convictsById.get(prevId) === convict) {\r\n this._convictsById.delete(prevId);\r\n }\r\n for (const cls of prevClasses) {\r\n this._removeClassIndex(convict, cls);\r\n }\r\n\r\n convict.userData.domId = nextId;\r\n convict.userData.classList = nextClasses;\r\n if (nextId) {\r\n convict.name = nextId;\r\n } else if (convict.name === prevId) {\r\n convict.name = '';\r\n }\r\n\r\n if (nextId) {\r\n this._convictsById.set(nextId, convict);\r\n this.namedConvicts.add(convict);\r\n } else {\r\n this.namedConvicts.delete(convict);\r\n }\r\n\r\n if (nextClasses.length) {\r\n this.classyConvicts.add(convict);\r\n for (const cls of nextClasses) {\r\n let bucket = this._convictsByClass.get(cls);\r\n if (!bucket) {\r\n bucket = new Set();\r\n this._convictsByClass.set(cls, bucket);\r\n }\r\n bucket.add(convict);\r\n }\r\n } else {\r\n this.classyConvicts.delete(convict);\r\n }\r\n }\r\n\r\n /**\r\n * Initial scan of cell children.\r\n * @private\r\n */\r\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;\r\n instance.userData.extraParams = [];\r\n instance.userData.domId = '';\r\n instance.userData.classList = [];\r\n instance.transition = null;\r\n this._ensureConvictClassAlias(instance);\r\n\r\n parentObj.add(instance);\r\n\r\n this._allConvictsByDom.set(elm, instance);\r\n this._syncConvictIdentity(instance, elm);\r\n\r\n for (let i = 0; i < elm.children.length; i++) {\r\n this.ScanElement(elm.children[i]);\r\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 => {\r\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 });\r\n\r\n const domId = convict.userData?.domId;\r\n if (domId && this._convictsById.get(domId) === convict) {\r\n this._convictsById.delete(domId);\r\n }\r\n const classes = Array.isArray(convict.userData?.classList) ? convict.userData.classList : [];\r\n for (const cls of classes) {\r\n this._removeClassIndex(convict, cls);\r\n }\r\n this.classyConvicts.delete(convict);\r\n this.namedConvicts.delete(convict);\r\n\r\n if (convict.userData.domEl) {\r\n this._allConvictsByDom.delete(convict.userData.domEl);\r\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) {\r\n return this._convictsById.get(id);\r\n }\r\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) {\r\n return Array.from(this._convictsByClass.get(className) || []);\r\n }\r\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();\r\n\r\n if (this._pointerMoveRaf) {\r\n cancelAnimationFrame(this._pointerMoveRaf);\r\n this._pointerMoveRaf = 0;\r\n }\r\n this._pendingPointerMoveEvt = null;\r\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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"}
|