jailedthreejs 0.9.4 → 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 +11 -11
- package/dist/lib/index.js +163 -57
- package/dist/lib/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -14,7 +14,7 @@ Define a scene with HTML inside a `<cell>`, style objects with CSS custom proper
|
|
|
14
14
|
- Supports DOM-style interaction (`onclick`, `onmouseover`, `ondblclick`, `oncontextmenu`, ...)
|
|
15
15
|
- Supports CSS pseudo-classes on 3D objects (`:hover`, `:focus`, `:active`)
|
|
16
16
|
- Supports transitions and CSS `@keyframes`-driven animation of custom props
|
|
17
|
-
- Supports basic asset references (
|
|
17
|
+
- Supports basic asset references (`cube`, `sphere`, `plane`, `torus`) plus CSS-defined asset rules
|
|
18
18
|
|
|
19
19
|
## Identity Mapping (Important)
|
|
20
20
|
|
|
@@ -72,7 +72,7 @@ Package entrypoint notes:
|
|
|
72
72
|
}
|
|
73
73
|
|
|
74
74
|
.scene-object {
|
|
75
|
-
--geometry:
|
|
75
|
+
--geometry: cube;
|
|
76
76
|
--position: (0, 0, 0);
|
|
77
77
|
--material-color: (0.3, 0.7, 1.0);
|
|
78
78
|
--transition: 200ms ease-out;
|
|
@@ -124,7 +124,7 @@ Examples:
|
|
|
124
124
|
- `--rotation: (rx,ry,rz)`
|
|
125
125
|
- `--scale: (sx,sy,sz)`
|
|
126
126
|
- `--material-color: (r,g,b)`
|
|
127
|
-
- `--geometry:
|
|
127
|
+
- `--geometry: cube`
|
|
128
128
|
- `--transition: 250ms ease`
|
|
129
129
|
- `--animation: bob 1.5s infinite ease-in-out`
|
|
130
130
|
|
|
@@ -190,27 +190,27 @@ JailedThreeJS parses custom property values with a best-effort mapper:
|
|
|
190
190
|
|
|
191
191
|
- `"(1,2,3)"` -> `[1,2,3]`
|
|
192
192
|
- `"1.25"` -> `1.25`
|
|
193
|
-
- `"
|
|
193
|
+
- `"cube"` -> built-in asset/object from the asset cache
|
|
194
194
|
- `"#otherId-position-x"` -> property lookup from another object in the same cell
|
|
195
195
|
|
|
196
196
|
## Assets
|
|
197
197
|
|
|
198
198
|
Built-ins are available by default:
|
|
199
199
|
|
|
200
|
-
-
|
|
201
|
-
-
|
|
202
|
-
-
|
|
203
|
-
-
|
|
200
|
+
- `cube`
|
|
201
|
+
- `sphere`
|
|
202
|
+
- `plane`
|
|
203
|
+
- `torus`
|
|
204
204
|
|
|
205
205
|
Custom assets can be declared in CSS-like at-rules:
|
|
206
206
|
|
|
207
207
|
```css
|
|
208
|
-
@Ship
|
|
209
|
-
url: "
|
|
208
|
+
@Ship{
|
|
209
|
+
url: "/models/ship.glb";
|
|
210
210
|
}
|
|
211
211
|
|
|
212
212
|
.hero {
|
|
213
|
-
--geometry:
|
|
213
|
+
--geometry: Ship;
|
|
214
214
|
}
|
|
215
215
|
```
|
|
216
216
|
|
package/dist/lib/index.js
CHANGED
|
@@ -70,6 +70,14 @@ const textureLoader = new THREE.TextureLoader();
|
|
|
70
70
|
const audioLoader = new THREE.AudioLoader();
|
|
71
71
|
const mtlLoader = new MTLLoader();
|
|
72
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
|
+
}
|
|
73
81
|
function getUrlBasePath(url) {
|
|
74
82
|
const slash = url.lastIndexOf("/");
|
|
75
83
|
return slash >= 0 ? url.slice(0, slash + 1) : "";
|
|
@@ -89,12 +97,8 @@ function storeAssetValue(key, value) {
|
|
|
89
97
|
assetMap.set(key, value);
|
|
90
98
|
}
|
|
91
99
|
}
|
|
92
|
-
function
|
|
93
|
-
|
|
94
|
-
const styleVersion = getGlobalStyleCacheVersion();
|
|
95
|
-
if (gatherAssetRules._cacheVersion === styleVersion) {
|
|
96
|
-
return;
|
|
97
|
-
}
|
|
100
|
+
function parseAssetRulesFromText(cssText) {
|
|
101
|
+
if (!cssText || typeof cssText !== "string") return [];
|
|
98
102
|
const ignoreAtRules = /* @__PURE__ */ new Set([
|
|
99
103
|
"media",
|
|
100
104
|
"import",
|
|
@@ -108,46 +112,75 @@ function gatherAssetRules() {
|
|
|
108
112
|
"font-feature-values",
|
|
109
113
|
"viewport"
|
|
110
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 = [];
|
|
111
153
|
for (const sheet of document.styleSheets) {
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
} catch {
|
|
154
|
+
const owner = sheet.ownerNode;
|
|
155
|
+
if ((owner == null ? void 0 : owner.nodeName) === "STYLE") {
|
|
156
|
+
registerParsedAssetRuleEntries(parseAssetRulesFromText(owner.textContent || ""));
|
|
116
157
|
continue;
|
|
117
158
|
}
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
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);
|
|
135
181
|
});
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
let name;
|
|
139
|
-
if (obj.name && obj.name.trim()) {
|
|
140
|
-
name = obj.name.trim();
|
|
141
|
-
} else {
|
|
142
|
-
name = atName || (() => {
|
|
143
|
-
const fname = url.split("/").pop() || "";
|
|
144
|
-
const dot = fname.lastIndexOf(".");
|
|
145
|
-
return dot >= 0 ? fname.slice(0, dot) : fname;
|
|
146
|
-
})();
|
|
147
|
-
}
|
|
148
|
-
if (!assetMap.has(name)) {
|
|
149
|
-
storeAssetValue(name, loadAsset(url));
|
|
150
|
-
}
|
|
182
|
+
gatherAssetRules._linkFetchByVersion.set(fetchKey, parsePromise);
|
|
183
|
+
trackStylesheetParse(parsePromise);
|
|
151
184
|
}
|
|
152
185
|
}
|
|
153
186
|
gatherAssetRules._cacheVersion = styleVersion;
|
|
@@ -163,6 +196,15 @@ function getAsset(name, path = null) {
|
|
|
163
196
|
const key = name;
|
|
164
197
|
if (!assetMap.has(key)) {
|
|
165
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
|
+
}
|
|
166
208
|
console.warn(`Asset "${name}" missing and no path supplied.`);
|
|
167
209
|
return null;
|
|
168
210
|
}
|
|
@@ -215,10 +257,9 @@ function loadAsset(url) {
|
|
|
215
257
|
});
|
|
216
258
|
case "obj":
|
|
217
259
|
return new Promise((res, rej) => {
|
|
218
|
-
|
|
260
|
+
getUrlBasePath(url);
|
|
219
261
|
const mtlUrl = url.replace(/\.obj$/i, ".mtl");
|
|
220
|
-
|
|
221
|
-
mtlLoader.setResourcePath(basePath);
|
|
262
|
+
console.log(mtlUrl);
|
|
222
263
|
mtlLoader.load(
|
|
223
264
|
mtlUrl,
|
|
224
265
|
(mtl) => {
|
|
@@ -513,6 +554,7 @@ async function KeyFrameAnimationLerp(object, animationObj, signal = null) {
|
|
|
513
554
|
let selectorRuleCache = /* @__PURE__ */ new Map();
|
|
514
555
|
let selectorRuleCacheVersion = -1;
|
|
515
556
|
let warnedLegacyNameClassFallback = false;
|
|
557
|
+
let asyncAssignmentSerial = 0;
|
|
516
558
|
function ensureSelectorRuleCache() {
|
|
517
559
|
const version = getGlobalStyleCacheVersion();
|
|
518
560
|
if (selectorRuleCacheVersion !== version) {
|
|
@@ -559,6 +601,43 @@ function stopObjectAnimation(object) {
|
|
|
559
601
|
object.userData._animationAbortController = null;
|
|
560
602
|
object.userData._animationRunning = false;
|
|
561
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
|
+
}
|
|
562
641
|
function parseAnimationCSS(value) {
|
|
563
642
|
if (!value) return null;
|
|
564
643
|
const lower = value.trim().toLowerCase();
|
|
@@ -666,20 +745,23 @@ function deep_searchParms(object, path) {
|
|
|
666
745
|
return { parent, key };
|
|
667
746
|
}
|
|
668
747
|
function CSSValueTo3JSValue(value, __object = null) {
|
|
748
|
+
const normalizedValue = typeof value === "string" ? value.trim() : value;
|
|
749
|
+
if (typeof normalizedValue !== "string") return normalizedValue;
|
|
669
750
|
let parsed;
|
|
670
|
-
if (/^\(.+\)$/.test(
|
|
671
|
-
parsed =
|
|
672
|
-
} else if (!Number.isNaN(parseFloat(
|
|
673
|
-
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);
|
|
674
755
|
} else {
|
|
675
|
-
parsed =
|
|
756
|
+
parsed = normalizedValue.replace(/^['"]|['"]$/g, "");
|
|
676
757
|
}
|
|
677
758
|
if (typeof parsed === "string") {
|
|
759
|
+
console.log(parsed);
|
|
760
|
+
const assetName = parsed;
|
|
761
|
+
if (getAsset(assetName)) {
|
|
762
|
+
return getAsset(assetName);
|
|
763
|
+
}
|
|
678
764
|
switch (parsed[0]) {
|
|
679
|
-
case "@": {
|
|
680
|
-
const p = parsed.slice(1);
|
|
681
|
-
return getAsset(p);
|
|
682
|
-
}
|
|
683
765
|
case "#": {
|
|
684
766
|
if (!__object) {
|
|
685
767
|
console.error("CSSValueTo3JSValue: __object is null when resolving", parsed);
|
|
@@ -737,6 +819,7 @@ function _apply_rule(rule, object, _chosenOne = null) {
|
|
|
737
819
|
if (!rule || !rule.style || !object) return;
|
|
738
820
|
const domEl = object.userData.domEl;
|
|
739
821
|
object.userData._lastCSS = object.userData._lastCSS || /* @__PURE__ */ Object.create(null);
|
|
822
|
+
object.userData._pendingAsyncAssignments = object.userData._pendingAsyncAssignments || /* @__PURE__ */ Object.create(null);
|
|
740
823
|
let sawAnimationDeclaration = false;
|
|
741
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`)) {
|
|
742
825
|
object.layers.enable(3);
|
|
@@ -767,19 +850,35 @@ function _apply_rule(rule, object, _chosenOne = null) {
|
|
|
767
850
|
const path = prop.split("-");
|
|
768
851
|
const parsed = CSSValueTo3JSValue(value, object);
|
|
769
852
|
const { parent, key } = deep_searchParms(object, path);
|
|
853
|
+
const referencedAssetName = value;
|
|
854
|
+
const assignmentToken = ++asyncAssignmentSerial;
|
|
855
|
+
object.userData._pendingAsyncAssignments[prop] = assignmentToken;
|
|
770
856
|
const assignValue = (resolvedValue) => {
|
|
771
857
|
var _a;
|
|
858
|
+
if (object.userData._pendingAsyncAssignments[prop] !== assignmentToken) {
|
|
859
|
+
return;
|
|
860
|
+
}
|
|
772
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
|
+
}
|
|
773
872
|
const transition = object.transition;
|
|
774
873
|
const currentRaw = parent[key];
|
|
775
874
|
const currentValue = currentRaw && typeof currentRaw.toArray === "function" ? currentRaw.toArray() : currentRaw;
|
|
776
875
|
const duration = (transition == null ? void 0 : transition.duration) ?? 0;
|
|
777
876
|
const timingFn = ((_a = transition == null ? void 0 : transition.timing) == null ? void 0 : _a.fun) ?? "linear";
|
|
778
|
-
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));
|
|
779
878
|
if (isAnimatable) {
|
|
780
879
|
animateLerp(
|
|
781
880
|
currentValue,
|
|
782
|
-
|
|
881
|
+
finalValue,
|
|
783
882
|
duration,
|
|
784
883
|
(v) => exchange_rule(parent, key, v),
|
|
785
884
|
() => {
|
|
@@ -792,7 +891,7 @@ function _apply_rule(rule, object, _chosenOne = null) {
|
|
|
792
891
|
timingFn
|
|
793
892
|
);
|
|
794
893
|
} else {
|
|
795
|
-
exchange_rule(parent, key,
|
|
894
|
+
exchange_rule(parent, key, finalValue);
|
|
796
895
|
}
|
|
797
896
|
};
|
|
798
897
|
if (parsed && typeof parsed.then === "function") {
|
|
@@ -829,6 +928,7 @@ function _apply_rule(rule, object, _chosenOne = null) {
|
|
|
829
928
|
}
|
|
830
929
|
}
|
|
831
930
|
function paintConvict(convictElm, cell) {
|
|
931
|
+
gatherAssetRules();
|
|
832
932
|
const convict = cell._allConvictsByDom.get(convictElm);
|
|
833
933
|
if (convict) {
|
|
834
934
|
_apply_rule(convictElm, convict);
|
|
@@ -853,6 +953,7 @@ function paintExtraCell(muse) {
|
|
|
853
953
|
}
|
|
854
954
|
}
|
|
855
955
|
function paintCell(muse) {
|
|
956
|
+
gatherAssetRules();
|
|
856
957
|
for (const obj of muse.classyConvicts) {
|
|
857
958
|
for (const cls of getObjectClassSelectors(obj)) {
|
|
858
959
|
const rule = getCSSRule(`.${cls}`);
|
|
@@ -867,6 +968,7 @@ function paintCell(muse) {
|
|
|
867
968
|
}
|
|
868
969
|
function paintSpecificMuse(muse) {
|
|
869
970
|
var _a;
|
|
971
|
+
gatherAssetRules();
|
|
870
972
|
const extra = muse.userData.extraParams || [];
|
|
871
973
|
getObjectClassSelectors(muse).forEach((cls) => {
|
|
872
974
|
const rule = getCSSRule(`.${cls}`);
|
|
@@ -1158,6 +1260,7 @@ const _Cell = class _Cell {
|
|
|
1158
1260
|
cellElm.addEventListener("mouseup", this._boundMouseUp);
|
|
1159
1261
|
cellElm.addEventListener("dblclick", this._boundDoubleClick);
|
|
1160
1262
|
cellElm.addEventListener("contextmenu", this._boundContextMenu);
|
|
1263
|
+
gatherAssetRules();
|
|
1161
1264
|
paintCell(this);
|
|
1162
1265
|
this._styleElemObserver = new MutationObserver(() => {
|
|
1163
1266
|
if (this._pendingStyleRepaint) return;
|
|
@@ -1165,6 +1268,7 @@ const _Cell = class _Cell {
|
|
|
1165
1268
|
this._pendingStyleRepaint = true;
|
|
1166
1269
|
requestAnimationFrame(() => {
|
|
1167
1270
|
this._pendingStyleRepaint = false;
|
|
1271
|
+
gatherAssetRules();
|
|
1168
1272
|
paintCell(this);
|
|
1169
1273
|
this._repaintKnownConvicts();
|
|
1170
1274
|
});
|
|
@@ -1308,6 +1412,7 @@ const _Cell = class _Cell {
|
|
|
1308
1412
|
this._pendingStyleRepaint = true;
|
|
1309
1413
|
requestAnimationFrame(() => {
|
|
1310
1414
|
this._pendingStyleRepaint = false;
|
|
1415
|
+
gatherAssetRules();
|
|
1311
1416
|
paintCell(this);
|
|
1312
1417
|
this._repaintKnownConvicts();
|
|
1313
1418
|
});
|
|
@@ -1726,6 +1831,7 @@ export {
|
|
|
1726
1831
|
exchange_rule,
|
|
1727
1832
|
fastRemoveArray,
|
|
1728
1833
|
fastRemove_arry,
|
|
1834
|
+
gatherAssetRules,
|
|
1729
1835
|
gatherKeyFrame_MAP,
|
|
1730
1836
|
getAnimationMap,
|
|
1731
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';\r\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';\r\nimport { FBXLoader } from 'three/examples/jsm/loaders/FBXLoader.js';\r\nimport { MTLLoader } from 'three/examples/jsm/loaders/MTLLoader.js';\r\nimport { OBJLoader } from 'three/examples/jsm/loaders/OBJLoader.js';\r\nimport { getGlobalStyleCacheVersion } from './styleCache.js';\r\n\r\nexport let AllKeyFramesMap = new Map();\r\nlet keyframesCacheVersion = -1;\r\n\r\n/**\r\n * Collect all @keyframes rules from loaded stylesheets.\r\n *\r\n * @returns {Map<string, CSSKeyframesRule>}\r\n */\r\nexport function gatherKeyFrame_MAP() {\r\n const styleVersion = getGlobalStyleCacheVersion();\r\n if (keyframesCacheVersion === styleVersion) {\r\n return AllKeyFramesMap;\r\n }\r\n\r\n AllKeyFramesMap.clear();\r\n\r\n const KEYFRAMES_TYPES = new Set();\r\n if (typeof CSSRule !== 'undefined') {\r\n if ('KEYFRAMES_RULE' in CSSRule) KEYFRAMES_TYPES.add(CSSRule.KEYFRAMES_RULE);\r\n if ('WEBKIT_KEYFRAMES_RULE' in CSSRule) KEYFRAMES_TYPES.add(CSSRule.WEBKIT_KEYFRAMES_RULE);\r\n }\r\n\r\n for (const sheet of document.styleSheets) {\r\n let rules;\r\n try {\r\n rules = sheet.cssRules;\r\n } catch {\r\n continue;\r\n }\r\n for (const rule of rules) {\r\n if (KEYFRAMES_TYPES.has(rule.type)) {\r\n AllKeyFramesMap.set(rule.name, rule);\r\n }\r\n }\r\n }\r\n\r\n keyframesCacheVersion = styleVersion;\r\n return AllKeyFramesMap;\r\n}\r\n\r\n/**\r\n * Get a CSSKeyframesRule by name, rescanning stylesheets each call.\r\n *\r\n * @param {string} AnimName\r\n */\r\nexport function getAnimationMap(AnimName) {\r\n if (!AnimName) return undefined;\r\n gatherKeyFrame_MAP();\r\n return AllKeyFramesMap.get(AnimName);\r\n}\r\n\r\n/* ───────────────── CLASS MAP ───────────────── */\r\n\r\nlet classMap = null;\r\n\r\n/**\r\n * Build a map of tag-name-like keys → THREE.Object3D constructors.\r\n */\r\nfunction buildClassMap() {\r\n classMap = Object.getOwnPropertyNames(THREE)\r\n .filter(key => {\r\n const C = THREE[key];\r\n return typeof C === 'function' && C.prototype instanceof THREE.Object3D;\r\n })\r\n .reduce((m, key) => {\r\n m[key.toUpperCase()] = THREE[key];\r\n return m;\r\n }, Object.create(null));\r\n\r\n // include base Object3D explicitly\r\n classMap.OBJECT3D = THREE.Object3D;\r\n}\r\n\r\n/**\r\n * Get the cached class map, building it on first call.\r\n *\r\n * @returns {Object.<string,Function>}\r\n */\r\nexport function getClassMap() {\r\n if (!classMap) buildClassMap();\r\n return classMap;\r\n}\r\n\r\n/* ───────────────── ASSET MAP ───────────────── */\r\n\r\nconst assetMap = new Map();\r\nconst gltfLoader = new GLTFLoader();\r\nconst fbxLoader = new FBXLoader();\r\nconst textureLoader = new THREE.TextureLoader();\r\nconst audioLoader = new THREE.AudioLoader();\r\nconst mtlLoader = new MTLLoader();\r\nconst objLoader = new OBJLoader();\r\n\r\nfunction getUrlBasePath(url) {\r\n const slash = url.lastIndexOf('/');\r\n return slash >= 0 ? url.slice(0, slash + 1) : '';\r\n}\r\n\r\nfunction storeAssetValue(key, value) {\r\n if (value && typeof value.then === 'function') {\r\n const pending = value\r\n .then(resolved => {\r\n assetMap.set(key, resolved);\r\n return resolved;\r\n })\r\n .catch(err => {\r\n console.error(`Failed to load asset \"${key}\":`, err);\r\n assetMap.delete(key);\r\n return null;\r\n });\r\n assetMap.set(key, pending);\r\n } else {\r\n assetMap.set(key, value);\r\n }\r\n}\r\n\r\n/**\r\n * Scan stylesheets for custom @rules that declare external assets.\r\n *\r\n * Syntax:\r\n * @MyShip {\r\n * url: \"./ship.glb\";\r\n * name: \"Spaceship\"; // optional, overrides @ identifier\r\n * }\r\n */\r\nfunction gatherAssetRules() {\r\n const styleVersion = getGlobalStyleCacheVersion();\r\n if (gatherAssetRules._cacheVersion === styleVersion) {\r\n return;\r\n }\r\n\r\n const ignoreAtRules = new Set([\r\n 'media', 'import', 'supports', 'keyframes', 'font-face', 'charset',\r\n 'namespace', 'page', 'counter-style', 'font-feature-values', 'viewport'\r\n ]);\r\n\r\n for (const sheet of document.styleSheets) {\r\n let rules;\r\n try {\r\n rules = sheet.cssRules;\r\n } catch {\r\n continue;\r\n }\r\n\r\n for (const rule of rules) {\r\n const text = rule.cssText?.trim();\r\n if (!text) continue;\r\n\r\n const match = text.match(/^@([A-Za-z0-9_-]+)\\s*\\{([^}]*)\\}/);\r\n if (!match) continue;\r\n\r\n const atName = match[1];\r\n if (ignoreAtRules.has(atName.toLowerCase())) continue;\r\n\r\n const body = match[2];\r\n const obj = {};\r\n body.split(';').forEach(line => {\r\n const parts = line\r\n .split(':')\r\n .map(s => s && s.trim())\r\n .filter(Boolean);\r\n if (parts.length >= 2) {\r\n const key = parts[0].toLowerCase();\r\n let value = parts[1];\r\n value = value.replace(/^['\"(]+|['\")]+$/g, '');\r\n obj[key] = value;\r\n }\r\n });\r\n\r\n const url = obj.url;\r\n if (!url) continue;\r\n\r\n let name;\r\n if (obj.name && obj.name.trim()) {\r\n name = obj.name.trim();\r\n } else {\r\n name = atName || (() => {\r\n const fname = url.split('/').pop() || '';\r\n const dot = fname.lastIndexOf('.');\r\n return dot >= 0 ? fname.slice(0, dot) : fname;\r\n })();\r\n }\r\n\r\n if (!assetMap.has(name)) {\r\n storeAssetValue(name, loadAsset(url));\r\n }\r\n }\r\n }\r\n\r\n gatherAssetRules._cacheVersion = styleVersion;\r\n}\r\n\r\n/**\r\n * Get or load an asset by name.\r\n *\r\n * Built-ins (auto-registered on first use):\r\n * - cube → BoxGeometry\r\n * - sphere → SphereGeometry\r\n * - plane → PlaneGeometry\r\n * - torus → TorusGeometry\r\n *\r\n * @param {string} name\r\n * @param {string|null} [path=null]\r\n * @returns {any}\r\n */\r\nexport function getAsset(name, path = null) {\r\n if (assetMap.size === 0) {\r\n storeAssetValue('cube', new THREE.BoxGeometry());\r\n storeAssetValue('sphere', new THREE.SphereGeometry());\r\n storeAssetValue('plane', new THREE.PlaneGeometry());\r\n storeAssetValue('torus', new THREE.TorusGeometry());\r\n }\r\n\r\n // read CSS-defined assets\r\n gatherAssetRules();\r\n\r\n const key = name;\r\n if (!assetMap.has(key)) {\r\n if (!path) {\r\n console.warn(`Asset \"${name}\" missing and no path supplied.`);\r\n return null;\r\n }\r\n storeAssetValue(key, loadAsset(path));\r\n }\r\n\r\n return assetMap.get(key);\r\n}\r\n\r\n/**\r\n * Load a 3D / texture / audio / material asset based on file extension.\r\n *\r\n * @param {string} url\r\n * @returns {Promise<any>|null}\r\n */\r\nexport function loadAsset(url) {\r\n const ext = (url.split('.').pop() || '').toLowerCase();\r\n switch (ext) {\r\n case 'gltf':\r\n case 'glb':\r\n return new Promise((res, rej) =>\r\n gltfLoader.load(url, d => res(d.scene || d), null, rej)\r\n );\r\n case 'fbx':\r\n return new Promise((res, rej) =>\r\n fbxLoader.load(url, res, null, rej)\r\n );\r\n case 'png':\r\n case 'jpg':\r\n case 'jpeg':\r\n case 'gif':\r\n case 'webp':\r\n return new Promise((res, rej) =>\r\n textureLoader.load(url, tex => res(tex), undefined, rej)\r\n );\r\n case 'mp3':\r\n case 'wav':\r\n case 'ogg':\r\n case 'flac':\r\n case 'aac':\r\n return new Promise((res, rej) =>\r\n audioLoader.load(url, buffer => res(buffer), undefined, rej)\r\n );\r\n case 'mtl':\r\n return new Promise((res, rej) => {\r\n const basePath = getUrlBasePath(url);\r\n mtlLoader.setPath(basePath);\r\n mtlLoader.setResourcePath(basePath);\r\n mtlLoader.load(\r\n url,\r\n mtl => {\r\n mtl.preload();\r\n res(mtl);\r\n },\r\n undefined,\r\n rej\r\n );\r\n });\r\n case 'obj':\r\n return new Promise((res, rej) => {\r\n const basePath = getUrlBasePath(url);\r\n const mtlUrl = url.replace(/\\.obj$/i, '.mtl');\r\n\r\n mtlLoader.setPath(basePath);\r\n mtlLoader.setResourcePath(basePath);\r\n mtlLoader.load(\r\n mtlUrl,\r\n mtl => {\r\n mtl.preload();\r\n objLoader.setMaterials(mtl);\r\n objLoader.load(url, res, null, rej);\r\n },\r\n undefined,\r\n () => {\r\n // If no companion MTL exists, still load the OBJ geometry.\r\n objLoader.load(url, res, null, rej);\r\n }\r\n );\r\n });\r\n case 'json':\r\n return fetch(url)\r\n .then(response => response.json())\r\n .then(json => {\r\n try {\r\n const loader = new THREE.MaterialLoader();\r\n return loader.parse(json);\r\n } catch (err) {\r\n console.warn(`MaterialLoader failed to parse ${url}:`, err);\r\n return json;\r\n }\r\n });\r\n default:\r\n console.warn(`No loader for \".${ext}\".`);\r\n return Promise.resolve(null);\r\n }\r\n}\r\n\r\n/**\r\n * Remove an item from an array without preserving order.\r\n *\r\n * @param {Array<any>} arry\r\n * @param {any} item\r\n */\r\nexport function fastRemove_arry(arry, item) {\r\n const index = arry.indexOf(item);\r\n if (index !== -1) {\r\n arry[index] = arry[arry.length - 1];\r\n arry.pop();\r\n }\r\n}\r\n\r\n// Alias for older code.\r\nexport const fastRemoveArray = fastRemove_arry;\r\n","// Train.js\r\n//\r\n// Interpolation / animation helpers used by JailedThreeJS.\r\n// - Numeric lerping\r\n// - Cubic-bezier easing\r\n// - Generic value interpolation (numbers + arrays)\r\n// - Time-based transitions over JS values\r\n// - CSS keyframe-driven animation for custom props\r\n\r\nimport { exchange_rule, deep_searchParms, CSSValueTo3JSValue } from './artist.js';\r\nimport { getAnimationMap } from './utils.js';\r\n\r\n/**\r\n * Linearly interpolate between two numbers.\r\n * @param {number} a\r\n * @param {number} b\r\n * @param {number} t in [0, 1]\r\n */\r\nexport function lerpNumber(a, b, t) {\r\n return a + (b - a) * t;\r\n}\r\n\r\n/**\r\n * Interpolate arrays with tolerant length handling.\r\n *\r\n * Length rule:\r\n * - For indices where both arrays have a value → lerp them.\r\n * - For indices that exist only in `from` → keep `from[i]`.\r\n * - For indices that exist only in `to` → keep `to[i]`.\r\n *\r\n * Example:\r\n * [x1,y1,z1,q1] → [x2,y2,z2]\r\n * ==>\r\n * [lerp(x1,x2), lerp(y1,y2), lerp(z1,z2), q1]\r\n *\r\n * @param {Array<number>} from\r\n * @param {Array<number>} to\r\n * @param {number} t\r\n * @param {(a:number,b:number,t:number)=>number} lerpMethod\r\n */\r\nfunction lerpArray(from, to, t, lerpMethod) {\r\n const maxLen = Math.max(from.length, to.length);\r\n const out = new Array(maxLen);\r\n for (let i = 0; i < maxLen; i++) {\r\n const hasFrom = i < from.length;\r\n const hasTo = i < to.length;\r\n if (hasFrom && hasTo) {\r\n out[i] = lerpMethod(from[i], to[i], t);\r\n } else if (hasFrom) {\r\n out[i] = from[i];\r\n } else {\r\n out[i] = to[i];\r\n }\r\n }\r\n return out;\r\n}\r\n\r\n/**\r\n * Interpolate numbers or arrays using the provided lerp method.\r\n *\r\n * @param {number|Array<number>} from\r\n * @param {number|Array<number>} to\r\n * @param {number} t\r\n * @param {(a:number,b:number,t:number)=>number} lerpMethod\r\n */\r\nexport function lerpValue(from, to, t, lerpMethod = lerpNumber) {\r\n const isNum = v => typeof v === 'number';\r\n const isArr = Array.isArray;\r\n\r\n if (isNum(from) && isNum(to)) {\r\n return lerpMethod(from, to, t);\r\n }\r\n if (isArr(from) && isArr(to)) {\r\n return lerpArray(from, to, t, lerpMethod);\r\n }\r\n // Mixed or unsupported types: just return `to` instantly.\r\n return to;\r\n}\r\n\r\n/**\r\n * Create a cubic-bezier easing function.\r\n * Implementation adapted from https://github.com/gre/bezier-easing\r\n */\r\nfunction cubicBezier(p0, p1, p2, p3) {\r\n const cx = 3 * p0;\r\n const bx = 3 * (p2 - p0) - cx;\r\n const ax = 1 - cx - bx;\r\n const cy = 3 * p1;\r\n const by = 3 * (p3 - p1) - cy;\r\n const ay = 1 - cy - by;\r\n\r\n function sampleCurveX(t) {\r\n return ((ax * t + bx) * t + cx) * t;\r\n }\r\n function sampleCurveY(t) {\r\n return ((ay * t + by) * t + cy) * t;\r\n }\r\n function sampleCurveDerivativeX(t) {\r\n return (3 * ax * t + 2 * bx) * t + cx;\r\n }\r\n function solveTforX(x) {\r\n let t = x;\r\n for (let i = 0; i < 4; i++) {\r\n const dx = sampleCurveX(t) - x;\r\n if (Math.abs(dx) < 1e-6) return t;\r\n t -= dx / sampleCurveDerivativeX(t);\r\n }\r\n return t;\r\n }\r\n return x => sampleCurveY(solveTforX(x));\r\n}\r\n\r\n/**\r\n * Resolve an easing function from a CSS timing function string.\r\n *\r\n * @param {string} timingFunction\r\n * @returns {(t:number)=>number}\r\n */\r\nfunction _get_Equation(timingFunction) {\r\n switch (timingFunction) {\r\n case 'linear':\r\n return t => t;\r\n case 'ease':\r\n return cubicBezier(0.25, 0.1, 0.25, 1.0);\r\n case 'ease-in':\r\n return cubicBezier(0.42, 0, 1.0, 1.0);\r\n case 'ease-out':\r\n return cubicBezier(0, 0, 0.58, 1.0);\r\n case 'ease-in-out':\r\n return cubicBezier(0.42, 0, 0.58, 1.0);\r\n default:\r\n break;\r\n }\r\n\r\n if (typeof timingFunction === 'string' && timingFunction.startsWith('cubic-bezier')) {\r\n const match = timingFunction.match(/cubic-bezier\\(([^)]+)\\)/);\r\n if (match) {\r\n const nums = match[1]\r\n .split(/[, ]+/)\r\n .map(Number)\r\n .filter(n => !Number.isNaN(n));\r\n if (nums.length === 4) {\r\n return cubicBezier(nums[0], nums[1], nums[2], nums[3]);\r\n }\r\n }\r\n }\r\n\r\n // Fallback to linear on garbage.\r\n return t => t;\r\n}\r\n\r\n/**\r\n * Animate between two values over time.\r\n *\r\n * - Supports numbers and arrays (arrays follow the tolerant rule above).\r\n * - Non-animatable values resolve instantly (onUpdate + onComplete with `to`).\r\n *\r\n * @param {number|Array<number>} from\r\n * @param {number|Array<number>} to\r\n * @param {number} durationMs\r\n * @param {(value:any, easedT:number) => void} onUpdate\r\n * @param {(finalValue:any) => void} [onComplete]\r\n * @param {string} [timingFunction='linear']\r\n */\r\nexport function animateLerp(\n from,\n to,\n durationMs,\n onUpdate,\n onComplete,\n timingFunction = 'linear',\n signal = null\n) {\n const isAnimatable = v =>\n typeof v === 'number' || Array.isArray(v);\n let rafId = 0;\n let settled = false;\n\n const finish = (shouldComplete, value = to) => {\n if (settled) return;\n settled = true;\n if (rafId) {\n cancelAnimationFrame(rafId);\n rafId = 0;\n }\n if (signal && onAbort) {\n signal.removeEventListener('abort', onAbort);\n }\n if (shouldComplete && onComplete) {\n onComplete(value);\n }\n };\n\n const finishInstant = () => {\n if (signal?.aborted) return;\n if (onUpdate) onUpdate(to, 1);\n finish(true, to);\n };\n\n const onAbort = () => {\n finish(false);\n };\n\n if (signal?.aborted) {\n return () => {};\n }\n if (signal) {\n signal.addEventListener('abort', onAbort, { once: true });\n }\n\n if (!isAnimatable(from) || !isAnimatable(to)) {\n finishInstant();\n return () => finish(false);\n }\n\n if (!Number.isFinite(durationMs) || durationMs <= 0) {\n finishInstant();\n return () => finish(false);\n }\n\r\n const start = performance.now();\r\n const ease = _get_Equation(timingFunction);\r\n\r\n function step(now) {\n if (settled || signal?.aborted) {\n finish(false);\n return;\n }\n let t = (now - start) / durationMs;\n if (t >= 1) t = 1;\n const easedT = ease(t);\n const value = lerpValue(from, to, easedT, lerpNumber);\n if (onUpdate) onUpdate(value, easedT);\n if (t < 1) {\n rafId = requestAnimationFrame(step);\n } else {\n finish(true, value);\n }\n }\n\n rafId = requestAnimationFrame(step);\n return () => finish(false);\n}\n\r\n/**\r\n * Parse a keyframe time string into milliseconds.\r\n *\r\n * Supports:\r\n * - 'from' / 'to'\r\n * - percentages ('0%', '50%', '100%')\r\n * - '123ms'\r\n * - bare numbers treated as ms\r\n *\r\n * @param {string} keyText\r\n * @param {number} totalDuration\r\n */\r\nfunction parseKeyframeTime(keyText, totalDuration) {\r\n if (!keyText) return 0;\r\n const text = String(keyText).trim().toLowerCase();\r\n\r\n if (text === 'from') return 0;\r\n if (text === 'to') return totalDuration;\r\n\r\n if (text.endsWith('%')) {\r\n const v = parseFloat(text);\r\n return Number.isFinite(v) ? (v / 100) * totalDuration : 0;\r\n }\r\n if (text.endsWith('ms')) {\r\n const v = parseFloat(text);\r\n return Number.isFinite(v) ? v : 0;\r\n }\r\n const n = Number(text);\r\n return Number.isFinite(n) ? n : 0;\r\n}\r\n\r\n/**\r\n * Apply a CSS @keyframes animation to a Three.js object.\r\n *\r\n * @param {THREE.Object3D} object\r\n * @param {{\r\n * name: string,\r\n * duration: number,\r\n * timing?: { fun?: string },\r\n * iteration?: { count?: number | string }\r\n * }} animationObj\r\n */\r\nexport async function KeyFrameAnimationLerp(object, animationObj, signal = null) {\n if (!object || !animationObj?.name || !animationObj?.duration) return;\n if (signal?.aborted) return;\n\r\n const keyFramesRule = getAnimationMap(animationObj.name);\r\n if (!keyFramesRule || !keyFramesRule.cssRules) {\r\n console.error(`Animation \"${animationObj.name}\" not found or has no rules.`);\r\n return;\r\n }\r\n\r\n const duration = animationObj.duration;\r\n\r\n const rules = Array.from(keyFramesRule.cssRules).slice();\r\n rules.sort(\r\n (a, b) =>\r\n parseKeyframeTime(a.keyText, duration) -\r\n parseKeyframeTime(b.keyText, duration)\r\n );\r\n\r\n const runOnce = async () => {\n for (let i = 0; i < rules.length - 1; i++) {\n if (signal?.aborted) return;\n const fromRule = rules[i];\n const toRule = rules[i + 1];\r\n const t0 = parseKeyframeTime(fromRule.keyText, duration);\r\n const t1 = parseKeyframeTime(toRule.keyText, duration);\r\n const segmentMs = t1 - t0;\r\n if (segmentMs <= 0) continue;\r\n\r\n const fromProps = {};\r\n const toProps = {};\r\n\r\n // Collect animatable custom props from \"from\" frame\r\n for (const propName of fromRule.style) {\r\n const raw = fromRule.style.getPropertyValue(propName);\r\n // custom props are expected to be `--foo-bar`\r\n if (!propName.startsWith('--')) continue;\r\n fromProps[propName.slice(2)] = CSSValueTo3JSValue(raw, object);\r\n }\r\n\r\n // Collect matching props from \"to\" frame\r\n for (const propName of toRule.style) {\r\n const raw = toRule.style.getPropertyValue(propName);\r\n if (!propName.startsWith('--')) continue;\r\n toProps[propName.slice(2)] = CSSValueTo3JSValue(raw, object);\r\n }\r\n\r\n const keys = Object.keys(fromProps).filter(k => k in toProps);\r\n if (!keys.length) continue;\r\n\r\n await Promise.all(\n keys.map(key => {\n if (signal?.aborted) return Promise.resolve();\n const fromVal = fromProps[key];\n const toVal = toProps[key];\n\r\n // Resolve async assets before animating.\r\n const resolveValue = v =>\r\n (v && typeof v.then === 'function')\r\n ? v\r\n : Promise.resolve(v);\r\n\r\n return Promise.all([resolveValue(fromVal), resolveValue(toVal)])\n .then(([resolvedFrom, resolvedTo]) => new Promise(resolve => {\n if (signal?.aborted) {\n resolve();\n return;\n }\n let done = false;\n const finish = () => {\n if (done) return;\n done = true;\n if (signal && onAbort) {\n signal.removeEventListener('abort', onAbort);\n }\n resolve();\n };\n const onAbort = () => finish();\n if (signal) {\n signal.addEventListener('abort', onAbort, { once: true });\n }\n animateLerp(\n resolvedFrom,\n resolvedTo,\n segmentMs,\n v => {\n if (signal?.aborted) return;\n const { parent, key: finalKey } = deep_searchParms(object, key.split('-'));\n exchange_rule(parent, finalKey, v);\n },\n finish,\n animationObj.timing?.fun || 'linear',\n signal\n );\n }));\n })\n );\n }\n };\n\r\n let iterationCount = animationObj.iteration?.count ?? 1;\r\n if (iterationCount === 'infinity' || iterationCount === 'infinite') {\r\n iterationCount = Infinity;\r\n }\r\n\r\n if (iterationCount === Infinity) {\n while (!signal?.aborted) {\n // eslint-disable-next-line no-await-in-loop\n await runOnce();\n }\n } else {\n const total = Number(iterationCount) || 1;\n for (let i = 0; i < total; i++) {\n if (signal?.aborted) return;\n // eslint-disable-next-line no-await-in-loop\n await runOnce();\n }\n }\n}\n","// artist.js\r\n//\r\n// Maps CSS custom properties + selectors to Three.js objects.\r\n// Handles:\r\n// - CSS → Three value conversion\r\n// - Transition interpolation\r\n// - Keyframe-driven animations\r\n// - Pseudo-class painting (:hover, :focus, :active)\r\n\r\nimport { getAsset } from './utils.js';\nimport Cell from './cell.js';\nimport { animateLerp, KeyFrameAnimationLerp } from './Train.js';\nimport * as THREE from 'three';\nimport { getGlobalStyleCacheVersion } from './styleCache.js';\n\nlet selectorRuleCache = new Map();\nlet selectorRuleCacheVersion = -1;\nlet warnedLegacyNameClassFallback = false;\n\nfunction ensureSelectorRuleCache() {\n const version = getGlobalStyleCacheVersion();\n if (selectorRuleCacheVersion !== version) {\n selectorRuleCache.clear();\n selectorRuleCacheVersion = version;\n }\n}\n\nfunction getObjectClassSelectors(object) {\n const aliasList = object?.classList;\n if (Array.isArray(aliasList)) return aliasList;\n\n if (object?.userData && Object.prototype.hasOwnProperty.call(object.userData, 'classList')) {\n return Array.isArray(object.userData.classList) ? object.userData.classList : [];\n }\n\n if (object?.name) {\n if (!warnedLegacyNameClassFallback) {\n warnedLegacyNameClassFallback = true;\n console.warn(\n 'JailedThreeJS: inferring CSS classes from Object3D.name is deprecated. Use object.classList/userData.classList.'\n );\n }\n return [object.name];\n }\n\n return [];\n}\n\r\nfunction hasClassPseudoRule(object, pseudo) {\n return getObjectClassSelectors(object).some(cls => getCSSRule(`.${cls}${pseudo}`));\n}\n\nfunction animationConfigKey(animCfg) {\n if (!animCfg) return null;\n return [\n animCfg.name || '',\n animCfg.duration || 0,\n animCfg.timing?.fun || 'linear',\n animCfg.iteration?.count ?? 1\n ].join('|');\n}\n\nfunction stopObjectAnimation(object) {\n const ctrl = object?.userData?._animationAbortController;\n if (ctrl && typeof ctrl.abort === 'function' && !ctrl.signal?.aborted) {\n ctrl.abort();\n }\n object.userData._animationAbortController = null;\n object.userData._animationRunning = false;\n}\n\r\nfunction parseAnimationCSS(value) {\r\n if (!value) return null;\r\n\r\n const lower = value.trim().toLowerCase();\r\n if (!lower || lower === 'none') return null;\r\n\r\n const parts = lower.split(/\\s+/).filter(Boolean);\r\n if (!parts.length) return null;\r\n\r\n // First token = name (keep original case for the keyframe name)\r\n const nameToken = parts.shift();\r\n if (!nameToken) return null;\r\n\r\n let durationMs = 1000; // default 1s\r\n let timingFun = 'linear'; // default timing\r\n let iterationCount = 1; // default once\r\n\r\n // Duration\r\n if (parts.length) {\r\n const timeToken = parts[0];\r\n if (/\\d/.test(timeToken)) {\r\n parts.shift();\r\n if (timeToken.endsWith('ms')) {\r\n durationMs = parseFloat(timeToken);\r\n } else if (timeToken.endsWith('s')) {\r\n durationMs = parseFloat(timeToken) * 1000;\r\n } else {\r\n durationMs = parseFloat(timeToken);\r\n }\r\n }\r\n }\r\n\r\n // Look for \"infinite\"/\"infinity\" in the remaining tokens\r\n const infIndex = parts.findIndex(t => t === 'infinite' || t === 'infinity');\r\n if (infIndex !== -1) {\r\n iterationCount = 'infinite';\r\n parts.splice(infIndex, 1);\r\n } else if (parts.length) {\r\n const maybeCount = parseInt(parts[parts.length - 1], 10);\r\n if (Number.isFinite(maybeCount) && maybeCount > 0) {\r\n iterationCount = maybeCount;\r\n parts.pop();\r\n }\r\n }\r\n\r\n // Whatever is left becomes the timing function string\r\n if (parts.length) {\r\n timingFun = parts.join(' ');\r\n }\r\n\r\n return {\r\n name: nameToken,\r\n duration: durationMs,\r\n iteration: { count: iterationCount },\r\n timing: { fun: timingFun }\r\n };\r\n}\r\n\r\n\r\n\r\nfunction parseTransitionCSS(value) {\r\n if (!value) return null;\r\n\r\n const lower = value.trim().toLowerCase();\r\n if (!lower || lower === 'none') return null;\r\n\r\n const parts = lower.split(/\\s+/).filter(Boolean);\r\n if (!parts.length) return null;\r\n\r\n const timeToken = parts.shift();\r\n let durationMs;\r\n\r\n if (timeToken.endsWith('ms')) {\r\n durationMs = parseFloat(timeToken);\r\n } else if (timeToken.endsWith('s')) {\r\n durationMs = parseFloat(timeToken) * 1000;\r\n } else {\r\n durationMs = parseFloat(timeToken);\r\n }\r\n\r\n if (!Number.isFinite(durationMs) || durationMs <= 0) {\r\n return null;\r\n }\r\n\r\n const timingFun = parts.join(' ') || 'linear';\r\n\r\n return {\r\n duration: durationMs,\r\n timing: { fun: timingFun }\r\n };\r\n}\r\n\r\n\r\n/**\r\n * Find first CSS rule whose selector list contains `selector` token.\r\n *\r\n * @param {string} selector\r\n * @returns {CSSStyleRule|undefined}\r\n */\r\nexport function getCSSRule(selector) {\n ensureSelectorRuleCache();\n if (selectorRuleCache.has(selector)) {\n return selectorRuleCache.get(selector) || undefined;\n }\n\n let found = null;\n for (const sheet of document.styleSheets) {\n let rules;\n try {\r\n rules = sheet.cssRules;\r\n } catch {\r\n // cross-origin stylesheet\r\n continue;\r\n }\r\n for (const rule of rules) {\r\n if (!rule.selectorText) continue;\r\n const selectors = rule.selectorText.split(',');\r\n for (const sel of selectors) {\r\n if (sel.trim().split(/\\s+/).includes(selector)) {\n found = rule;\n break;\n }\n }\n if (found) break;\n }\n if (found) break;\n }\n\n selectorRuleCache.set(selector, found);\n return found || undefined;\n}\n\r\n/**\r\n * Walk an object path and return parent + final key.\r\n *\r\n * @param {Object} object\r\n * @param {string[]} path\r\n * @returns {{parent:Object, key:string}}\r\n */\r\nexport function deep_searchParms(object, path) {\r\n const key = path[path.length - 1];\r\n const parent = path.slice(0, -1).reduce((o, k) => {\r\n if (o[k] == null) o[k] = {};\r\n return o[k];\r\n }, object);\r\n return { parent, key };\r\n}\r\n\r\n/**\r\n * Convert CSS value → Three.js friendly value.\r\n *\r\n * - \"(1,2,3)\" → [1,2,3]\r\n * - \"1.25\" → 1.25\r\n * - \"@foo\" → asset from getAsset('foo')\r\n * - \"#id-...\" → property copied from another convict in the same cell\r\n *\r\n * @param {string} value\r\n * @param {THREE.Object3D|null} [__object=null]\r\n * @returns {any}\r\n */\r\nexport function CSSValueTo3JSValue(value, __object = null) {\r\n let parsed;\r\n\r\n if (/^\\(.+\\)$/.test(value)) {\r\n parsed = value.slice(1, -1).split(',').map(v => parseFloat(v.trim()));\r\n } else if (!Number.isNaN(parseFloat(value))) {\r\n parsed = parseFloat(value);\r\n } else {\r\n parsed = value.replace(/^['\"]|['\"]$/g, '');\r\n }\r\n\r\n if (typeof parsed === 'string') {\r\n switch (parsed[0]) {\r\n case '@': {\r\n const p = parsed.slice(1);\r\n return getAsset(p);\r\n }\r\n case '#': {\r\n if (!__object) {\r\n console.error('CSSValueTo3JSValue: __object is null when resolving', parsed);\r\n return null;\r\n }\r\n try {\r\n const cellElement = __object.userData.domEl.closest('cell');\r\n const actualCellObject = Cell.getCell(cellElement);\r\n const path = parsed.split('-');\r\n if (path.length < 1) {\r\n throw new Error('Requesting empty paths using \"#\" is not allowed');\r\n }\r\n const targetObject = actualCellObject.getConvictById(path[0].slice(1));\r\n if (!targetObject) {\r\n throw new Error('Failed to find object with id ' + parsed);\r\n }\r\n path.shift();\r\n const { parent, key } = deep_searchParms(targetObject, path);\r\n return parent[key];\r\n } catch (err) {\r\n console.error(err);\r\n return undefined;\r\n }\r\n }\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n return parsed;\r\n}\r\n\r\n/**\r\n * Assign a value to a property, handling vectors / setters / plain fields.\r\n *\r\n * @param {Object} parent\r\n * @param {string} key\r\n * @param {any} value\r\n */\r\nexport function exchange_rule(parent, key, value) {\r\n if (!parent) return;\r\n const target = parent[key];\r\n\r\n try {\r\n if (Array.isArray(value)) {\r\n if (target && typeof target.set === 'function') {\r\n target.set(...value);\r\n } else if (typeof target === 'function') {\r\n target(...value);\r\n } else {\r\n parent[key] = value;\r\n }\r\n return;\r\n }\r\n\r\n // scalar or non-array\r\n if (target && typeof target.set === 'function') {\r\n target.set(value);\r\n } else if (typeof target === 'function') {\r\n target(value);\r\n } else {\r\n parent[key] = value;\r\n }\r\n } catch (err) {\r\n console.warn(`Failed to assign ${key} with`, value, err);\r\n }\r\n}\r\n\r\n/**\r\n * Core rule application.\r\n *\r\n * @param {CSSStyleRule|HTMLElement} rule\r\n * @param {THREE.Object3D} object\r\n * @param {string|null} [_chosenOne=null] selector that caused this rule\r\n */\r\nfunction _apply_rule(rule, object, _chosenOne = null) {\n if (!rule || !rule.style || !object) return;\n\n const domEl = object.userData.domEl;\n object.userData._lastCSS = object.userData._lastCSS || Object.create(null);\n let sawAnimationDeclaration = false;\n\r\n // enable picking layer when interactive / pseudo-rules exist\r\n if (\r\n domEl?.hasAttribute('onclick') ||\r\n domEl?.hasAttribute('onmouseover') ||\r\n domEl?.hasAttribute('ondblclick') ||\r\n domEl?.hasAttribute('onmousedown') ||\r\n domEl?.hasAttribute('onmouseup') ||\r\n domEl?.hasAttribute('oncontextmenu') ||\r\n hasClassPseudoRule(object, ':hover') ||\r\n hasClassPseudoRule(object, ':focus') ||\r\n (object.userData.domId && getCSSRule(`#${object.userData.domId}:focus`)) ||\r\n (object.userData.domId && getCSSRule(`#${object.userData.domId}:hover`))\r\n ) {\r\n object.layers.enable(3);\r\n } else {\r\n object.layers.disable(3);\r\n }\r\n\r\n for (let i = 0; i < rule.style.length; i++) {\r\n const rawProp = rule.style[i];\r\n const value = rule.style.getPropertyValue(rawProp).trim();\r\n\r\n if (!rawProp.startsWith('--')) continue;\r\n\r\n // CSS-driven transition config\r\n if (rawProp === '--transition') {\r\n const cfg = parseTransitionCSS(value);\r\n object.transition = cfg; // may be null if \"none\"\r\n continue;\r\n }\r\n\r\n // CSS-driven animation config\r\n if (rawProp === '--animation') {\n sawAnimationDeclaration = true;\n const animCfg = parseAnimationCSS(value);\n const nextAnimKey = animationConfigKey(animCfg);\n if (object.userData._animationConfigKey !== nextAnimKey) {\n stopObjectAnimation(object);\n object.userData._animationConfigKey = nextAnimKey;\n }\n object.animation = animCfg; // may be null if \"none\"\n continue;\n }\n\r\n // Normal custom property flow (position, rotation, etc.)\r\n const prop = rawProp.slice(2);\r\n const path = prop.split('-');\r\n const parsed = CSSValueTo3JSValue(value, object);\r\n const { parent, key } = deep_searchParms(object, path);\r\n\r\n const assignValue = (resolvedValue) => {\r\n if (resolvedValue === undefined) return;\r\n\r\n const transition = object.transition;\r\n const currentRaw = parent[key];\r\n const currentValue =\r\n currentRaw && typeof currentRaw.toArray === 'function'\r\n ? currentRaw.toArray()\r\n : currentRaw;\r\n\r\n const duration = transition?.duration ?? 0;\r\n const timingFn = transition?.timing?.fun ?? 'linear';\r\n const isAnimatable =\r\n transition &&\r\n duration > 0 &&\r\n (typeof currentValue === 'number' || Array.isArray(currentValue)) &&\r\n (typeof resolvedValue === 'number' || Array.isArray(resolvedValue));\r\n\r\n if (isAnimatable) {\r\n animateLerp(\r\n currentValue,\r\n resolvedValue,\r\n duration,\r\n v => exchange_rule(parent, key, v),\r\n () => {\r\n object.dispatchEvent({\r\n type: 'TransitionFinished',\r\n target: object,\r\n detail: { selector: _chosenOne, to: parent }\r\n });\r\n },\r\n timingFn\r\n );\r\n } else {\r\n exchange_rule(parent, key, resolvedValue);\r\n }\r\n };\r\n\r\n if (parsed && typeof parsed.then === 'function') {\r\n parsed.then(assignValue).catch(err =>\r\n console.error('Failed to resolve asset for', rawProp, err)\r\n );\r\n } else {\r\n assignValue(parsed);\r\n }\r\n}\n \n\n\n if (sawAnimationDeclaration && !object.animation) {\n stopObjectAnimation(object);\n }\n\n if (object.animation) {\n // Don't restart the animation every repaint\n if (!object.userData._animationRunning) {\n const controller = new AbortController();\n object.userData._animationRunning = true;\n object.userData._animationAbortController = controller;\n\n (async () => {\n try {\n await KeyFrameAnimationLerp(object, object.animation, controller.signal);\n } catch (err) {\n if (!controller.signal.aborted) {\n console.error(err);\n }\n } finally {\n if (object.userData._animationAbortController === controller) {\n object.userData._animationAbortController = null;\n object.userData._animationRunning = false;\n }\n }\n })();\n }\n }\n}\r\n\r\n/**\r\n * Apply rules for a specific element inside a cell (inline style changes).\r\n *\r\n * @param {HTMLElement} convictElm\r\n * @param {Cell} cell\r\n */\r\nexport function paintConvict(convictElm, cell) {\r\n const convict = cell._allConvictsByDom.get(convictElm);\r\n if (convict) {\r\n _apply_rule(convictElm, convict);\r\n }\r\n}\r\n\r\n/**\r\n * Paint :hover / :focus / :active selectors for all convicts in a cell.\r\n *\r\n * @param {Cell} muse\r\n */\r\nexport function paintExtraCell(muse) {\r\n for (const obj of muse.classyConvicts) {\r\n const classes = getObjectClassSelectors(obj);\r\n (obj.userData.extraParams || []).forEach(param => {\r\n classes.forEach(cls => {\r\n const rule = getCSSRule(`.${cls}${param}`);\r\n if (rule) _apply_rule(rule, obj);\r\n });\r\n });\r\n }\r\n\r\n for (const obj of muse.namedConvicts) {\r\n if (!obj.userData.domId) continue;\r\n (obj.userData.extraParams || []).forEach(param => {\r\n const rule = getCSSRule(`#${obj.userData.domId}${param}`);\r\n if (rule) _apply_rule(rule, obj);\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * Paint base class/id rules for an entire cell.\r\n *\r\n * @param {Cell} muse\r\n */\r\nexport function paintCell(muse) {\r\n for (const obj of muse.classyConvicts) {\r\n for (const cls of getObjectClassSelectors(obj)) {\r\n const rule = getCSSRule(`.${cls}`);\r\n if (rule) _apply_rule(rule, obj, `.${cls}`);\r\n }\r\n }\r\n for (const obj of muse.namedConvicts) {\r\n if (!obj.userData.domId) continue;\r\n const rule = getCSSRule(`#${obj.userData.domId}`);\r\n if (rule) _apply_rule(rule, obj, `#${obj.userData.domId}`);\r\n }\r\n}\r\n\r\n/**\r\n * Paint a single object: base rules, pseudo-rules, inline style.\r\n *\r\n * @param {THREE.Object3D} muse\r\n */\r\nexport function paintSpecificMuse(muse) {\r\n const extra = muse.userData.extraParams || [];\r\n\r\n getObjectClassSelectors(muse).forEach(cls => {\r\n const rule = getCSSRule(`.${cls}`);\r\n if (rule) _apply_rule(rule, muse);\r\n });\r\n\r\n if (muse.userData.domId) {\r\n const baseIdRule = getCSSRule(`#${muse.userData.domId}`);\r\n if (baseIdRule) _apply_rule(baseIdRule, muse);\r\n }\r\n\r\n extra.forEach(param => {\r\n getObjectClassSelectors(muse).forEach(cls => {\r\n const clsRule = getCSSRule(`.${cls}${param}`);\r\n if (clsRule) _apply_rule(clsRule, muse);\r\n });\r\n });\r\n\r\n if (muse.userData.domId) {\r\n extra.forEach(param => {\r\n const idRule = getCSSRule(`#${muse.userData.domId}${param}`);\r\n if (idRule) _apply_rule(idRule, muse);\r\n });\r\n }\r\n\r\n if (muse.userData.domEl?.hasAttribute('style')) {\r\n _apply_rule(muse.userData.domEl, muse);\r\n }\r\n}\r\n\r\n/**\r\n * Apply constant :active rules each frame for flagged convicts.\r\n *\r\n * @param {THREE.Object3D} muse\r\n */\r\nexport function paintConstantMuse(muse) {\r\n getObjectClassSelectors(muse).forEach(cls => {\r\n const rule = getCSSRule(`.${cls}:active`);\r\n if (rule) _apply_rule(rule, muse);\r\n });\r\n if (muse.userData.domId) {\r\n const rule = getCSSRule(`#${muse.userData.domId}:active`);\r\n if (rule) _apply_rule(rule, muse);\r\n }\r\n}\r\n","// NoScope.js\r\n//\r\n// Centralised event handling.\r\n// Shared THREE.Raycaster + NDC pointer for all cells; all pickable\r\n// objects live on layer 3.\r\n\r\nimport * as THREE from 'three';\nimport { paintSpecificMuse } from './artist.js';\nimport { fastRemove_arry } from './utils.js';\n\r\nconst raycaster = new THREE.Raycaster();\r\nconst ndcPointer = new THREE.Vector2();\r\n\r\n// Only objects on layer 3 are considered pickable.\r\nraycaster.layers.set(3);\r\n\r\n/* Flag helpers */\r\n\r\nfunction addFlag(arr, flag) {\n if (arr.includes(flag)) return false;\n arr.push(flag);\n return true;\n}\n\nfunction delFlag(arr, flag) {\n const hadFlag = arr.includes(flag);\n if (!hadFlag) return false;\n fastRemove_arry(arr, flag);\n return true;\n}\n\n/* Public handlers */\n\nfunction _flushPendingPointerMove(cell) {\n if (!cell?._pointerMoveRaf || !cell._pendingPointerMoveEvt) return;\n cancelAnimationFrame(cell._pointerMoveRaf);\n cell._pointerMoveRaf = 0;\n const evt = cell._pendingPointerMoveEvt;\n cell._pendingPointerMoveEvt = null;\n _processPointerMove(evt, cell);\n}\n\nexport function default_onCellClick_method(domEvt, cell) {\n _flushPendingPointerMove(cell);\n const hit = cell._last_cast_caught;\n if (!hit) return;\n\n const focusChanged = addFlag(hit.userData.extraParams, ':focus');\n\r\n const synth = {\r\n type: 'cellclick',\r\n originalEvt: domEvt,\r\n target3d: hit,\r\n targetCell: cell,\r\n targetElement: hit.userData.domEl,\r\n pointerPosition: cell._lastHitPosition\r\n };\r\n\n hit.userData.domEl.onclick?.call(hit.userData.domEl, synth);\n if (focusChanged) paintSpecificMuse(hit);\n}\n\nexport function default_onCellPointerMove_method(domEvt, cell) {\n if (!cell.focusedCamera) return;\n\n cell._pendingPointerMoveEvt = domEvt;\n if (cell._pointerMoveRaf) return;\n\n cell._pointerMoveRaf = requestAnimationFrame(() => {\n const evt = cell._pendingPointerMoveEvt;\n cell._pendingPointerMoveEvt = null;\n cell._pointerMoveRaf = 0;\n if (!evt || !cell._running) return;\n _processPointerMove(evt, cell);\n });\n}\n\nfunction _processPointerMove(domEvt, cell) {\n _raycast(domEvt, cell.focusedCamera, cell.cellElm);\n\n const hitResult = raycaster.intersectObjects(cell.loadedScene.children, true)[0];\n const lastHit = cell._last_cast_caught;\n\n if (hitResult) {\n const hitObject = hitResult.object;\n let shouldRepaintCurrent = false;\n\n if (hitObject !== lastHit) {\n if (lastHit) {\n const hoverRemoved = delFlag(lastHit.userData.extraParams, ':hover');\n lastHit.userData.domEl.onmouseleave?.call(lastHit.userData.domEl, {\n type: 'cellmouseleave',\n originalEvt: domEvt,\n target3d: lastHit,\r\n targetCell: cell,\r\n targetElement: lastHit.userData.domEl,\r\n pointerPosition: cell._lastHitPosition\n });\n if (hoverRemoved) paintSpecificMuse(lastHit);\n }\n\n cell._last_cast_caught = hitObject;\n\r\n hitObject.userData.domEl.onmouseenter?.call(hitObject.userData.domEl, {\n type: 'cellmouseenter',\n originalEvt: domEvt,\n target3d: hitObject,\n targetCell: cell,\n targetElement: hitObject.userData.domEl,\n pointerPosition: hitResult.point\n });\n shouldRepaintCurrent = true;\n }\n\n if (addFlag(hitObject.userData.extraParams, ':hover')) {\n shouldRepaintCurrent = true;\n }\n cell._lastHitPosition = hitResult.point;\n\r\n hitObject.userData.domEl.onmouseover?.call(hitObject.userData.domEl, {\r\n type: 'cellhover',\r\n originalEvt: domEvt,\r\n target3d: hitObject,\r\n targetCell: cell,\r\n targetElement: hitObject.userData.domEl,\r\n pointerPosition: hitResult.point\n });\n\n if (shouldRepaintCurrent) paintSpecificMuse(hitObject);\n } else if (lastHit) {\n const hoverRemoved = delFlag(lastHit.userData.extraParams, ':hover');\n lastHit.userData.domEl.onmouseleave?.call(lastHit.userData.domEl, {\n type: 'cellmouseleave',\n originalEvt: domEvt,\n target3d: lastHit,\r\n targetCell: cell,\r\n targetElement: lastHit.userData.domEl,\r\n pointerPosition: cell._lastHitPosition\n });\n if (hoverRemoved) paintSpecificMuse(lastHit);\n cell._last_cast_caught = null;\n }\n}\n\nexport function default_onCellMouseDown_method(domEvt, cell) {\n _flushPendingPointerMove(cell);\n const hit = cell._last_cast_caught;\n if (!hit) return;\n\n const activeChanged = addFlag(hit.userData.extraParams, ':active');\n\r\n const synth = {\r\n type: 'celldown',\r\n originalEvt: domEvt,\r\n target3d: hit,\r\n targetCell: cell,\r\n targetElement: hit.userData.domEl,\r\n pointerPosition: cell._lastHitPosition\r\n };\r\n\n hit.userData.domEl.onmousedown?.call(hit.userData.domEl, synth);\n if (activeChanged) paintSpecificMuse(hit);\n}\n\nexport function default_onCellMouseUp_method(domEvt, cell) {\n _flushPendingPointerMove(cell);\n const hit = cell._last_cast_caught;\n if (!hit) return;\n\n const activeChanged = delFlag(hit.userData.extraParams, ':active');\n\r\n const synth = {\r\n type: 'cellup',\r\n originalEvt: domEvt,\r\n target3d: hit,\r\n targetCell: cell,\r\n targetElement: hit.userData.domEl,\r\n pointerPosition: cell._lastHitPosition\r\n };\r\n\n hit.userData.domEl.onmouseup?.call(hit.userData.domEl, synth);\n if (activeChanged) paintSpecificMuse(hit);\n}\n\nexport function default_onCellDoubleClick_method(domEvt, cell) {\n _flushPendingPointerMove(cell);\n const hit = cell._last_cast_caught;\n if (!hit) return;\n\n const focusChanged = addFlag(hit.userData.extraParams, ':focus');\n\r\n const synth = {\r\n type: 'celldblclick',\r\n originalEvt: domEvt,\r\n target3d: hit,\r\n targetCell: cell,\r\n targetElement: hit.userData.domEl,\r\n pointerPosition: cell._lastHitPosition\r\n };\r\n\n hit.userData.domEl.ondblclick?.call(hit.userData.domEl, synth);\n if (focusChanged) paintSpecificMuse(hit);\n}\n\nexport function default_onCellContextMenu_method(domEvt, cell) {\n _flushPendingPointerMove(cell);\n const hit = cell._last_cast_caught;\n if (!hit) return;\n\r\n const synth = {\r\n type: 'cellcontextmenu',\r\n originalEvt: domEvt,\r\n target3d: hit,\r\n targetCell: cell,\r\n targetElement: hit.userData.domEl,\r\n pointerPosition: cell._lastHitPosition\r\n };\r\n\n hit.userData.domEl.oncontextmenu?.call(hit.userData.domEl, synth);\n}\n\r\n/* Internal raycast helper */\r\n\r\n/**\r\n * @param {MouseEvent} domEvt\r\n * @param {THREE.Camera} camera\r\n * @param {HTMLElement} referenceEl\r\n */\r\nfunction _raycast(domEvt, camera, referenceEl) {\r\n if (!camera) return;\r\n\r\n const targetEl = referenceEl || domEvt.currentTarget || domEvt.target;\r\n const rect = targetEl.getBoundingClientRect();\r\n\r\n camera.updateMatrixWorld();\r\n\r\n ndcPointer.set(\r\n ((domEvt.clientX - rect.left) / rect.width) * 2 - 1,\r\n (-(domEvt.clientY - rect.top) / rect.height) * 2 + 1\r\n );\r\n\r\n raycaster.setFromCamera(ndcPointer, camera);\r\n}\r\n","// cell.js\r\n//\r\n// The Cell class drives a single <cell> element:\r\n// - DOM → Three.js object conversion\r\n// - Event wiring / raycasting integration\r\n// - CSS → object painting\r\n// - Mutation observers (DOM + <style> changes)\r\n// - Per-frame update callbacks\r\n\r\nimport * as THREE from 'three';\nimport { getClassMap } from './utils.js';\nimport {\n paintCell,\n paintConvict,\n paintSpecificMuse\n} from './artist.js';\nimport { markGlobalStyleCacheDirty } from './styleCache.js';\nimport {\r\n default_onCellClick_method,\r\n default_onCellPointerMove_method,\r\n default_onCellMouseDown_method,\r\n default_onCellMouseUp_method,\r\n default_onCellDoubleClick_method,\r\n default_onCellContextMenu_method\r\n} from './NoScope.js';\r\n\r\nclass Cell {\r\n static allCells = new WeakMap();\r\n\r\n /**\r\n * Retrieve an existing Cell for a <cell> element.\r\n *\r\n * @param {HTMLElement} element\r\n * @returns {Cell|null}\r\n */\r\n static getCell(element) {\r\n if (Cell.allCells.has(element)) {\r\n return Cell.allCells.get(element);\r\n }\r\n console.error('No Cell found with the element:', element);\r\n return null;\r\n }\r\n\r\n /**\r\n * @param {HTMLElement} cellElm\r\n * @param {THREE.WebGLRenderer} renderer\r\n * @param {THREE.Scene} scene\r\n * @param {THREE.Camera|null} [camera=null]\r\n * @param {Function|null} [_MainAnimMethod=null]\r\n */\r\n constructor(cellElm, renderer, scene, camera = null, _MainAnimMethod = null) {\r\n this.cellElm = cellElm;\r\n Object.defineProperty(cellElm, 'cell', {\r\n value: this,\r\n enumerable: false\r\n });\r\n\r\n this.threeRenderer = renderer;\n this.loadedScene = scene;\n this.focusedCamera = camera;\n\n this.classyConvicts = new Set();\n this.namedConvicts = new Set();\n this._allConvictsByDom = new WeakMap();\n this._convictsById = new Map();\n this._convictsByClass = new Map();\n\n this.updateFunds = [];\n this._observedStyleElements = new WeakSet();\n this._pendingStyleRepaint = false;\n this._pointerMoveRaf = 0;\n this._pendingPointerMoveEvt = null;\n\r\n this._last_cast_caught = null;\r\n this._lastHitPosition = null;\r\n Cell.allCells.set(cellElm, this);\r\n\r\n // initial scan\r\n this._ScanCell();\r\n\r\n // bind DOM event handlers\r\n this._boundPointerMove = evt => {\r\n default_onCellPointerMove_method(evt, this);\r\n };\r\n this._boundClick = evt => {\r\n default_onCellClick_method(evt, this);\r\n };\r\n this._boundMouseDown = evt => {\r\n default_onCellMouseDown_method(evt, this);\r\n };\r\n this._boundMouseUp = evt => {\r\n default_onCellMouseUp_method(evt, this);\r\n };\r\n this._boundDoubleClick = evt => {\r\n default_onCellDoubleClick_method(evt, this);\r\n };\r\n this._boundContextMenu = evt => {\r\n evt.preventDefault();\r\n default_onCellContextMenu_method(evt, this);\r\n };\r\n\r\n cellElm.addEventListener('mousemove', this._boundPointerMove);\r\n cellElm.addEventListener('click', this._boundClick);\r\n cellElm.addEventListener('mousedown', this._boundMouseDown);\r\n cellElm.addEventListener('mouseup', this._boundMouseUp);\r\n cellElm.addEventListener('dblclick', this._boundDoubleClick);\r\n cellElm.addEventListener('contextmenu', this._boundContextMenu);\r\n\r\n // initial paint\r\n paintCell(this);\r\n\r\n // Observe <style> content so keyframes / rules updates repaint\r\n this._styleElemObserver = new MutationObserver(() => {\n if (this._pendingStyleRepaint) return;\n markGlobalStyleCacheDirty();\n this._pendingStyleRepaint = true;\n requestAnimationFrame(() => {\n this._pendingStyleRepaint = false;\n paintCell(this);\n this._repaintKnownConvicts();\n });\n });\n\r\n this._observeStyleElements = root => {\r\n if (!root) return;\r\n const targets = [];\r\n if (root.nodeName === 'STYLE') {\r\n targets.push(root);\r\n } else if (typeof root.querySelectorAll === 'function') {\r\n targets.push(...root.querySelectorAll('style'));\r\n }\r\n targets.forEach(styleEl => {\r\n if (this._observedStyleElements.has(styleEl)) return;\r\n this._observedStyleElements.add(styleEl);\r\n this._styleElemObserver.observe(styleEl, {\r\n childList: true,\r\n characterData: true,\r\n subtree: true\r\n });\r\n });\r\n };\r\n\r\n this._styleHostObserver = new MutationObserver(mutationList => {\n mutationList.forEach(mutation => {\n let styleTreeChanged = false;\n mutation.addedNodes.forEach(node => {\n if (node.nodeType === Node.ELEMENT_NODE && node.nodeName === 'STYLE') {\n this._observeStyleElements(node);\n styleTreeChanged = true;\n } else if (node.nodeType === Node.ELEMENT_NODE && typeof node.querySelector === 'function' && node.querySelector('style')) {\n this._observeStyleElements(node);\n styleTreeChanged = true;\n }\n });\n mutation.removedNodes.forEach(node => {\n if (node.nodeType === Node.ELEMENT_NODE && (node.nodeName === 'STYLE' || (typeof node.querySelector === 'function' && node.querySelector('style')))) {\n styleTreeChanged = true;\n }\n });\n if (styleTreeChanged) {\n markGlobalStyleCacheDirty();\n this._scheduleFullRepaint();\n }\n });\n });\n\r\n this._observeStyleElements(this.cellElm);\r\n if (document.head) {\r\n this._observeStyleElements(document.head);\r\n this._styleHostObserver.observe(document.head, {\r\n childList: true,\r\n subtree: true\r\n });\r\n }\r\n\r\n // Observe inline style/id/class changes and child mutations\r\n this._styleObserver = new MutationObserver(mutationList => {\r\n mutationList.forEach(mutation => {\r\n if (mutation.target.nodeName === 'CANVAS') return;\r\n\r\n switch (mutation.type) {\r\n case 'childList': {\r\n for (let i = 0; i < mutation.addedNodes.length; i++) {\r\n const node = mutation.addedNodes[i];\r\n if (node.nodeType === Node.ELEMENT_NODE && node.nodeName !== 'CANVAS') {\r\n if (node.nodeName === 'STYLE') {\n this._observeStyleElements(node);\n markGlobalStyleCacheDirty();\n this._scheduleFullRepaint();\n } else {\n this.ScanElement(node);\n const convict = this.getConvictByDom(node);\n if (convict) {\r\n paintSpecificMuse(convict);\r\n }\r\n }\r\n }\r\n }\r\n for (let i = 0; i < mutation.removedNodes.length; i++) {\n const node = mutation.removedNodes[i];\n if (node.nodeType === Node.ELEMENT_NODE && node.nodeName !== 'CANVAS') {\n if (node.nodeName === 'STYLE' || (typeof node.querySelector === 'function' && node.querySelector('style'))) {\n markGlobalStyleCacheDirty();\n this._scheduleFullRepaint();\n }\n this.removeConvict(this._allConvictsByDom.get(node));\n }\n }\n break;\r\n }\r\n case 'attributes': {\r\n const target = mutation.target;\r\n const convict = target.convict;\r\n if (!convict) break;\r\n\n if (mutation.attributeName === 'id') {\n this._syncConvictIdentity(convict, target);\n paintSpecificMuse(convict);\n } else if (mutation.attributeName === 'class') {\n this._syncConvictIdentity(convict, target);\n paintSpecificMuse(convict);\n } else if (mutation.attributeName === 'style') {\n // inline style changed; repaint this convict\n paintConvict(target, this);\n }\r\n break;\r\n }\r\n }\r\n });\r\n });\r\n\r\n this._styleObserver.observe(this.cellElm, {\r\n attributes: true,\r\n childList: true,\r\n attributeFilter: ['style', 'id', 'class'],\r\n subtree: true\r\n });\r\n\r\n // Animation loop\r\n this._running = true;\r\n this._anim = _MainAnimMethod\r\n ? _MainAnimMethod.bind(this)\r\n : () => {\r\n if (!this._running) return;\r\n this.updateFunds.forEach(update => update());\r\n requestAnimationFrame(this._anim);\r\n if (this.focusedCamera) {\r\n this.threeRenderer.render(this.loadedScene, this.focusedCamera);\r\n }\r\n };\r\n\r\n // Resize handling\r\n this._resizeObserver = new ResizeObserver(entries => {\r\n for (const e of entries) {\r\n const { width, height } = e.contentRect;\r\n const dpr = window.devicePixelRatio || 1;\r\n this.threeRenderer.setPixelRatio(dpr);\r\n\r\n const safeWidth = Math.max(width, 1);\r\n const safeHeight = Math.max(height, 1);\r\n this.threeRenderer.setSize(safeWidth, safeHeight, false);\r\n\r\n if (this.focusedCamera && this.focusedCamera.isPerspectiveCamera) {\r\n this.focusedCamera.aspect = safeWidth / safeHeight;\r\n }\r\n if (this.focusedCamera) {\r\n this.focusedCamera.updateProjectionMatrix();\r\n }\r\n }\r\n });\r\n this._resizeObserver.observe(this.cellElm);\r\n\r\n this._anim();\n }\n\n _scheduleFullRepaint() {\n if (this._pendingStyleRepaint) return;\n this._pendingStyleRepaint = true;\n requestAnimationFrame(() => {\n this._pendingStyleRepaint = false;\n paintCell(this);\n this._repaintKnownConvicts();\n });\n }\n\n _repaintKnownConvicts() {\n const visited = new Set();\n for (const convict of this.classyConvicts) {\n if (!visited.has(convict)) {\n visited.add(convict);\n paintSpecificMuse(convict);\n }\n }\n for (const convict of this.namedConvicts) {\n if (!visited.has(convict)) {\n visited.add(convict);\n paintSpecificMuse(convict);\n }\n }\n }\n\n _normalizeClassList(input) {\n if (Array.isArray(input)) return input.filter(Boolean).map(String);\n if (typeof input === 'string') return input.split(/\\s+/).filter(Boolean);\n if (input && typeof input[Symbol.iterator] === 'function') {\n return Array.from(input).filter(Boolean).map(String);\n }\n return [];\n }\n\n _ensureConvictClassAlias(convict) {\n if (Object.prototype.hasOwnProperty.call(convict, 'classList')) return;\n Object.defineProperty(convict, 'classList', {\n enumerable: false,\n configurable: true,\n get() {\n return this.userData.classList;\n },\n set(value) {\n let next = [];\n if (Array.isArray(value)) {\n next = value.filter(Boolean).map(String);\n } else if (typeof value === 'string') {\n next = value.split(/\\s+/).filter(Boolean);\n } else if (value && typeof value[Symbol.iterator] === 'function') {\n next = Array.from(value).filter(Boolean).map(String);\n }\n const domEl = this.userData?.domEl;\n if (domEl && domEl.className !== next.join(' ')) {\n domEl.className = next.join(' ');\n return;\n }\n this.userData.classList = next;\n }\n });\n }\n\n _removeClassIndex(convict, className) {\n const bucket = this._convictsByClass.get(className);\n if (!bucket) return;\n bucket.delete(convict);\n if (bucket.size === 0) {\n this._convictsByClass.delete(className);\n }\n }\n\n _syncConvictIdentity(convict, elm) {\n if (!convict || !elm) return;\n\n const prevId = convict.userData.domId || '';\n const prevClasses = Array.isArray(convict.userData.classList)\n ? convict.userData.classList\n : [];\n\n const nextId = elm.id || '';\n const nextClasses = this._normalizeClassList(elm.classList);\n\n if (prevId && this._convictsById.get(prevId) === convict) {\n this._convictsById.delete(prevId);\n }\n for (const cls of prevClasses) {\n this._removeClassIndex(convict, cls);\n }\n\n convict.userData.domId = nextId;\n convict.userData.classList = nextClasses;\n if (nextId) {\n convict.name = nextId;\n } else if (convict.name === prevId) {\n convict.name = '';\n }\n\n if (nextId) {\n this._convictsById.set(nextId, convict);\n this.namedConvicts.add(convict);\n } else {\n this.namedConvicts.delete(convict);\n }\n\n if (nextClasses.length) {\n this.classyConvicts.add(convict);\n for (const cls of nextClasses) {\n let bucket = this._convictsByClass.get(cls);\n if (!bucket) {\n bucket = new Set();\n this._convictsByClass.set(cls, bucket);\n }\n bucket.add(convict);\n }\n } else {\n this.classyConvicts.delete(convict);\n }\n }\n\n /**\n * Initial scan of cell children.\n * @private\n */\n _ScanCell() {\r\n for (let i = 0; i < this.cellElm.children.length; i++) {\r\n const convictElm = this.cellElm.children[i];\r\n this.ScanElement(convictElm);\r\n }\r\n }\r\n\r\n /**\r\n * Convert a DOM element into a Three.js object and wire it up.\r\n *\r\n * @param {HTMLElement} elm\r\n */\r\n ScanElement(elm) {\r\n if (this._allConvictsByDom.has(elm)) return;\r\n\r\n const parentObj = this.getConvictByDom(elm.parentElement) || this.loadedScene;\r\n const instance = this.ConvertDomToObject(elm);\r\n\r\n if (instance === null) {\r\n // still recurse children\r\n for (let i = 0; i < elm.children.length; i++) {\r\n this.ScanElement(elm.children[i]);\r\n }\r\n return;\r\n }\r\n\r\n // Camera tags: configure projection\r\n if (elm.tagName.includes('CAMERA')) {\r\n const rect = this.cellElm.getBoundingClientRect();\r\n const aspect = rect.height ? rect.width / rect.height : 1;\r\n\r\n if (elm.tagName === 'PERSPECTIVECAMERA') {\r\n instance.fov = 75;\r\n instance.aspect = aspect;\r\n instance.far = 1000;\r\n instance.near = 0.1;\r\n } else {\r\n const frustumSize = 20;\r\n instance.frustumSize = frustumSize;\r\n instance.aspect = aspect;\r\n instance.left = (-frustumSize * aspect) / 2;\r\n instance.right = (frustumSize * aspect) / 2;\r\n instance.top = frustumSize / 2;\r\n instance.bottom = -frustumSize / 2;\r\n instance.refreshLook = fSize => {\r\n instance.frustumSize = fSize;\r\n instance.left = (-fSize * instance.aspect) / 2;\r\n instance.right = (fSize * instance.aspect) / 2;\r\n instance.top = fSize / 2;\r\n instance.bottom = -fSize / 2;\r\n instance.updateProjectionMatrix();\r\n };\r\n }\r\n\r\n const rectW = rect.width || 1;\r\n const rectH = rect.height || 1;\r\n\r\n if (elm.hasAttribute('render')) {\r\n this.focusedCamera = instance;\r\n this.focusedCamera.updateProjectionMatrix();\r\n this.threeRenderer.setPixelRatio(window.devicePixelRatio || 1);\r\n this.threeRenderer.setSize(rectW, rectH, false);\r\n } else if (!this.focusedCamera) {\r\n this.focusedCamera = instance;\r\n this.focusedCamera.updateProjectionMatrix();\r\n }\r\n }\r\n\r\n instance.userData.domEl = elm;\n instance.userData.extraParams = [];\n instance.userData.domId = '';\n instance.userData.classList = [];\n instance.transition = null;\n this._ensureConvictClassAlias(instance);\n\n parentObj.add(instance);\n\n this._allConvictsByDom.set(elm, instance);\n this._syncConvictIdentity(instance, elm);\n\n for (let i = 0; i < elm.children.length; i++) {\n this.ScanElement(elm.children[i]);\n }\r\n\r\n if (!Object.prototype.hasOwnProperty.call(elm, 'convict')) {\r\n Object.defineProperty(elm, 'convict', {\r\n value: this.getConvictByDom(elm),\r\n enumerable: false\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Tag → THREE.Object3D constructor.\r\n *\r\n * @param {HTMLElement} elm\r\n * @returns {THREE.Object3D|null}\r\n */\r\n ConvertDomToObject(elm) {\r\n if (elm.tagName === 'CANVAS') return null;\r\n\r\n const key = elm.tagName.replace(/-/g, '');\r\n const Ctor = getClassMap()[key];\r\n if (!Ctor) {\r\n console.warn(`Unknown THREE class for <${elm.tagName.toLowerCase()}>`);\r\n return null;\r\n }\r\n return new Ctor();\r\n }\r\n\r\n /**\r\n * Remove a convict and its children.\r\n *\r\n * @param {THREE.Object3D|null} convict\r\n */\r\n removeConvict(convict) {\r\n if (!convict) return;\r\n\r\n convict.children.slice().forEach(child => {\n const domNode = child.userData?.domEl;\r\n if (domNode) {\r\n this.removeConvict(this._allConvictsByDom.get(domNode));\r\n } else {\r\n this.removeConvict(child);\r\n }\r\n });\n\n const domId = convict.userData?.domId;\n if (domId && this._convictsById.get(domId) === convict) {\n this._convictsById.delete(domId);\n }\n const classes = Array.isArray(convict.userData?.classList) ? convict.userData.classList : [];\n for (const cls of classes) {\n this._removeClassIndex(convict, cls);\n }\n this.classyConvicts.delete(convict);\n this.namedConvicts.delete(convict);\n\n if (convict.userData.domEl) {\n this._allConvictsByDom.delete(convict.userData.domEl);\n convict.userData.domEl.remove();\r\n }\r\n\r\n if (convict.parent) {\r\n convict.parent.remove(convict);\r\n }\r\n }\r\n\r\n /**\r\n * Get convict by DOM element.\r\n *\r\n * @param {HTMLElement} element\r\n */\r\n getConvictByDom(element) {\r\n return this._allConvictsByDom.get(element);\r\n }\r\n\r\n /**\r\n * Get convict by DOM id (global document lookup).\r\n *\r\n * @param {string} id\r\n */\r\n getConvictById(id) {\n return this._convictsById.get(id);\n }\n\r\n /**\r\n * Get all convicts with a given class.\r\n *\r\n * @param {string} className\r\n * @returns {Array<THREE.Object3D>}\r\n */\r\n getConvictsByClass(className) {\n return Array.from(this._convictsByClass.get(className) || []);\n }\n\r\n /**\r\n * Register a per-frame callback.\r\n *\r\n * @param {Function} fn\r\n */\r\n addUpdateFunction(fn) {\r\n if (typeof fn === 'function') {\r\n const bound = fn.bind(this);\r\n bound.originalFn = fn;\r\n this.updateFunds.push(bound);\r\n }\r\n }\r\n\r\n /**\r\n * Remove a previously registered per-frame callback.\r\n *\r\n * @param {Function} fn\r\n */\r\n removeUpdateFunction(fn) {\r\n const idx = this.updateFunds.findIndex(item => item?.originalFn === fn);\r\n if (idx >= 0) {\r\n this.updateFunds.splice(idx, 1);\r\n }\r\n }\r\n\r\n /**\r\n * Tear down observers, handlers and canvas.\r\n */\r\n dispose() {\r\n this._running = false;\r\n\r\n this._resizeObserver.disconnect();\r\n this._styleObserver.disconnect();\r\n this._styleElemObserver.disconnect();\r\n this._styleHostObserver.disconnect();\n\n if (this._pointerMoveRaf) {\n cancelAnimationFrame(this._pointerMoveRaf);\n this._pointerMoveRaf = 0;\n }\n this._pendingPointerMoveEvt = null;\n\r\n this.cellElm.removeEventListener('mousemove', this._boundPointerMove);\r\n this.cellElm.removeEventListener('click', this._boundClick);\r\n this.cellElm.removeEventListener('mousedown', this._boundMouseDown);\r\n this.cellElm.removeEventListener('mouseup', this._boundMouseUp);\r\n this.cellElm.removeEventListener('dblclick', this._boundDoubleClick);\r\n this.cellElm.removeEventListener('contextmenu', this._boundContextMenu);\r\n\r\n const canvas = this.threeRenderer.domElement;\r\n if (canvas && canvas.parentNode) {\r\n canvas.parentNode.removeChild(canvas);\r\n }\r\n }\r\n}\r\n\r\nexport default Cell;\r\n","// main.js\r\n//\r\n// JThree facade: finds <cell> elements, bootstraps renderer/scene/cell\r\n// for each, and keeps a WeakMap of created Cell instances.\r\n\r\nimport * as THREE from 'three';\r\nimport Cell from './cell.js';\r\n\r\nclass JTHREE {\r\n static __Loaded_Cells__ = new WeakMap();\r\n static __StyleTag__ = null;\r\n\r\n /**\r\n * Convert all <cell> elements in the document.\r\n */\r\n static init_convert() {\r\n if (!JTHREE.__StyleTag__ && document.head) {\r\n const styleSheet = document.createElement('style');\r\n styleSheet.textContent = `\r\n cell > :not(canvas) {\r\n display: none;\r\n }\r\n `;\r\n document.head.appendChild(styleSheet);\r\n JTHREE.__StyleTag__ = styleSheet;\r\n }\r\n\r\n document.querySelectorAll('cell').forEach(el => {\r\n if (JTHREE.__Loaded_Cells__.has(el)) return;\r\n JTHREE.create_THREEJSRENDERER(el);\r\n });\r\n }\r\n\r\n /**\r\n * Legacy alias.\r\n */\r\n static _convert_init_() {\r\n return JTHREE.init_convert();\r\n }\r\n\r\n /**\r\n * Create renderer + scene for a given <cell> element.\r\n *\r\n * @param {HTMLElement} cellEl\r\n * @returns {Cell}\r\n */\r\n static create_THREEJSRENDERER(cellEl) {\r\n if (JTHREE.__Loaded_Cells__.has(cellEl)) {\r\n return JTHREE.__Loaded_Cells__.get(cellEl);\r\n }\r\n\r\n const { canvas, width, height, dpr } = createWebGLOverlay(cellEl);\r\n const safeWidth = width || 1;\r\n const safeHeight = height || 1;\r\n\r\n const renderer = new THREE.WebGLRenderer({ canvas, antialias: true });\r\n renderer.setPixelRatio(dpr);\r\n renderer.setSize(safeWidth, safeHeight, false);\r\n renderer.setClearColor(0x000000, 1);\r\n\r\n const scene = new THREE.Scene();\r\n\r\n // Find explicit cameras\r\n const regex = /camera/i;\r\n const foundCameraElms = Array.from(cellEl.children).filter(child =>\r\n regex.test(child.tagName) ||\r\n regex.test(child.id) ||\r\n regex.test(child.className)\r\n );\r\n\r\n let camera = null;\r\n if (foundCameraElms.length === 0) {\r\n camera = new THREE.PerspectiveCamera(75, safeWidth / safeHeight, 0.1, 1000);\r\n console.warn('No camera found for', cellEl, '. Creating a default camera.');\r\n }\r\n\r\n const cell = new Cell(cellEl, renderer, scene, camera || null);\r\n JTHREE.__Loaded_Cells__.set(cellEl, cell);\r\n\r\n cellEl.dispatchEvent(\r\n new CustomEvent('OnStart', { detail: { cell, CellEl: cellEl } })\r\n );\r\n\r\n return cell;\r\n }\r\n}\r\n\r\n/**\r\n * Create a WebGL canvas overlay on a host element.\r\n *\r\n * @param {HTMLElement} hostEl\r\n * @param {Object} [glOptions={}]\r\n * @returns {{canvas:HTMLCanvasElement, gl:WebGLRenderingContext, width:number, height:number, dpr:number}}\r\n */\r\nfunction createWebGLOverlay(hostEl, glOptions = {}) {\r\n const { width, height } = hostEl.getBoundingClientRect();\r\n const dpr = window.devicePixelRatio || 1;\r\n\r\n if (getComputedStyle(hostEl).position === 'static') {\r\n hostEl.style.position = 'relative';\r\n }\r\n\r\n const canvas = document.createElement('canvas');\r\n canvas.width = Math.max(1, Math.round(width * dpr));\r\n canvas.height = Math.max(1, Math.round(height * dpr));\r\n Object.assign(canvas.style, {\r\n position: 'absolute',\r\n top: '0',\r\n left: '0',\r\n width: `${width}px`,\r\n height: `${height}px`,\r\n pointerEvents: 'none',\r\n //zIndex: '-999'\r\n });\r\n\r\n hostEl.appendChild(canvas);\r\n\r\n const gl =\r\n canvas.getContext('webgl2', glOptions) ||\r\n canvas.getContext('webgl', glOptions) ||\r\n canvas.getContext('experimental-webgl', glOptions);\r\n\r\n if (!gl) {\r\n throw new Error('Your browser doesn’t support WebGL.');\r\n }\r\n\r\n gl.viewport(0, 0, canvas.width, canvas.height);\r\n return { canvas, gl, width, height, dpr };\r\n}\r\n\r\n// Auto-initialise on import.\r\nJTHREE.init_convert();\r\nwindow.JThree = JTHREE;\r\n\r\nexport { JTHREE };\r\nexport default JTHREE;\r\n"],"names":["_a"],"mappings":"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"}
|
|
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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"}
|