@chuzi/shared 1.3.49 → 1.3.51
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.
|
@@ -179,10 +179,14 @@ interface DistributeOptions {
|
|
|
179
179
|
* sessions.
|
|
180
180
|
*/
|
|
181
181
|
declare function distributeStars(count: number, options?: DistributeOptions): Vec3[];
|
|
182
|
-
/** World-space gap between parent and child along
|
|
183
|
-
declare const COSMOS_SCENE_LEVEL_SPACING =
|
|
182
|
+
/** World-space gap between parent and child along −Z (away from the viewer). */
|
|
183
|
+
declare const COSMOS_SCENE_LEVEL_SPACING = 7;
|
|
184
184
|
/** Lateral gap between sibling branches at the same parent. */
|
|
185
|
-
declare const COSMOS_BRANCH_SIBLING_SPACING =
|
|
185
|
+
declare const COSMOS_BRANCH_SIBLING_SPACING = 5.5;
|
|
186
|
+
/** Minimum clearance between scene star centers in the XZ plane. */
|
|
187
|
+
declare const COSMOS_MIN_NODE_CLEARANCE = 5;
|
|
188
|
+
/** Minimum clearance between unrelated edge segments in the XZ plane. */
|
|
189
|
+
declare const COSMOS_MIN_EDGE_CLEARANCE = 2.2;
|
|
186
190
|
/** @deprecated API x multiplier — 3D layout uses parent-relative BFS instead. */
|
|
187
191
|
declare const COSMOS_SCENE_BRANCH_SPACING = 1.6;
|
|
188
192
|
/** Maximum distance between two connected scene stars (fallback spine only). */
|
|
@@ -229,9 +233,8 @@ interface ConstellationAnchorOptions {
|
|
|
229
233
|
}
|
|
230
234
|
/**
|
|
231
235
|
* Scene positions relative to the title star at the constellation anchor.
|
|
232
|
-
*
|
|
233
|
-
*
|
|
234
|
-
* fallback spine.
|
|
236
|
+
* The title sits closest to the viewer (+Z); the story recedes along −Z with
|
|
237
|
+
* organic lateral spread. Without edges, scenes use a golden-angle spine.
|
|
235
238
|
*/
|
|
236
239
|
declare function computeConstellationScenePositions(scenes: ConstellationLayoutScene[], graph: ConstellationLayoutGraph | undefined, anchor?: Vec3): Map<string, Vec3>;
|
|
237
240
|
/** Bounding radius from the title anchor to the outermost scene plus visual padding. */
|
|
@@ -260,4 +263,4 @@ interface StarBillboardProps {
|
|
|
260
263
|
*/
|
|
261
264
|
declare function StarBillboard({ label, appearance, previewImageUrl, previewContent, dimmed, focused, visible, controlsSlot, }: StarBillboardProps): react_jsx_runtime.JSX.Element | null;
|
|
262
265
|
|
|
263
|
-
export { COSMOS_BRANCH_SIBLING_SPACING, COSMOS_CONSTELLATION_GAP_SCENES, COSMOS_CONSTELLATION_VISUAL_PADDING, COSMOS_DEFAULT_FOOTPRINT_RADIUS, COSMOS_MAX_SCENE_EDGE_LENGTH, COSMOS_SCENE_BRANCH_SPACING, COSMOS_SCENE_LEVEL_SPACING, Constellation, type ConstellationAnchorInput, type ConstellationAnchorOptions, ConstellationAppearance, type ConstellationBounds, ConstellationEdge, type ConstellationEdgeEntry, type ConstellationEdgeProps, type ConstellationLayoutEdge, type ConstellationLayoutGraph, type ConstellationLayoutNode, type ConstellationLayoutScene, type ConstellationProps, type ConstellationSceneEntry, type ConstellationStoryOverlay, ConstellationTitle, type ConstellationTitleProps, CosmosSandbox, type CosmosSandboxProps, type DistributeOptions, Star, StarBillboard, type StarBillboardProps, type StarProps, type Vec3, World, type WorldProps, computeConstellationBounds, computeConstellationScenePositions, constellationFootprintRadius, distributeConstellationAnchors, distributeStars };
|
|
266
|
+
export { COSMOS_BRANCH_SIBLING_SPACING, COSMOS_CONSTELLATION_GAP_SCENES, COSMOS_CONSTELLATION_VISUAL_PADDING, COSMOS_DEFAULT_FOOTPRINT_RADIUS, COSMOS_MAX_SCENE_EDGE_LENGTH, COSMOS_MIN_EDGE_CLEARANCE, COSMOS_MIN_NODE_CLEARANCE, COSMOS_SCENE_BRANCH_SPACING, COSMOS_SCENE_LEVEL_SPACING, Constellation, type ConstellationAnchorInput, type ConstellationAnchorOptions, ConstellationAppearance, type ConstellationBounds, ConstellationEdge, type ConstellationEdgeEntry, type ConstellationEdgeProps, type ConstellationLayoutEdge, type ConstellationLayoutGraph, type ConstellationLayoutNode, type ConstellationLayoutScene, type ConstellationProps, type ConstellationSceneEntry, type ConstellationStoryOverlay, ConstellationTitle, type ConstellationTitleProps, CosmosSandbox, type CosmosSandboxProps, type DistributeOptions, Star, StarBillboard, type StarBillboardProps, type StarProps, type Vec3, World, type WorldProps, computeConstellationBounds, computeConstellationScenePositions, constellationFootprintRadius, distributeConstellationAnchors, distributeStars };
|
|
@@ -764,8 +764,10 @@ function mulberry32(seed) {
|
|
|
764
764
|
return ((t ^ t >>> 14) >>> 0) / 4294967296;
|
|
765
765
|
};
|
|
766
766
|
}
|
|
767
|
-
var COSMOS_SCENE_LEVEL_SPACING =
|
|
768
|
-
var COSMOS_BRANCH_SIBLING_SPACING =
|
|
767
|
+
var COSMOS_SCENE_LEVEL_SPACING = 7;
|
|
768
|
+
var COSMOS_BRANCH_SIBLING_SPACING = 5.5;
|
|
769
|
+
var COSMOS_MIN_NODE_CLEARANCE = 5;
|
|
770
|
+
var COSMOS_MIN_EDGE_CLEARANCE = 2.2;
|
|
769
771
|
var COSMOS_SCENE_BRANCH_SPACING = 1.6;
|
|
770
772
|
var COSMOS_MAX_SCENE_EDGE_LENGTH = 14;
|
|
771
773
|
var COSMOS_CONSTELLATION_GAP_SCENES = 2;
|
|
@@ -842,28 +844,185 @@ function buildChildrenByParent(edges) {
|
|
|
842
844
|
}
|
|
843
845
|
return childrenByParent;
|
|
844
846
|
}
|
|
845
|
-
function
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
847
|
+
function sceneLevelJitter(sceneId) {
|
|
848
|
+
return (hashSceneId(sceneId, "y") - 0.5) * 1.2;
|
|
849
|
+
}
|
|
850
|
+
function distPointSegment2D(px, pz, ax, az, bx, bz) {
|
|
851
|
+
const dx = bx - ax;
|
|
852
|
+
const dz = bz - az;
|
|
853
|
+
const lenSq = dx * dx + dz * dz;
|
|
854
|
+
if (lenSq === 0) return Math.hypot(px - ax, pz - az);
|
|
855
|
+
const t = Math.max(0, Math.min(1, ((px - ax) * dx + (pz - az) * dz) / lenSq));
|
|
856
|
+
const cx = ax + t * dx;
|
|
857
|
+
const cz = az + t * dz;
|
|
858
|
+
return Math.hypot(px - cx, pz - cz);
|
|
859
|
+
}
|
|
860
|
+
function distSegmentSegment2D(a, b) {
|
|
861
|
+
if (a.ax === a.bx && a.az === a.bz || b.ax === b.bx && b.az === b.bz) {
|
|
862
|
+
const pointSeg = a.ax === a.bx && a.az === a.bz ? b : a;
|
|
863
|
+
const px = a.ax === a.bx && a.az === a.bz ? a.ax : b.ax;
|
|
864
|
+
const pz = a.ax === a.bx && a.az === a.bz ? a.az : b.az;
|
|
865
|
+
return distPointSegment2D(
|
|
866
|
+
px,
|
|
867
|
+
pz,
|
|
868
|
+
pointSeg.ax,
|
|
869
|
+
pointSeg.az,
|
|
870
|
+
pointSeg.bx,
|
|
871
|
+
pointSeg.bz
|
|
872
|
+
);
|
|
873
|
+
}
|
|
874
|
+
const checks = [
|
|
875
|
+
distPointSegment2D(a.ax, a.az, b.ax, b.az, b.bx, b.bz),
|
|
876
|
+
distPointSegment2D(a.bx, a.bz, b.ax, b.az, b.bx, b.bz),
|
|
877
|
+
distPointSegment2D(b.ax, b.az, a.ax, a.az, a.bx, a.bz),
|
|
878
|
+
distPointSegment2D(b.bx, b.bz, a.ax, a.az, a.bx, a.bz)
|
|
879
|
+
];
|
|
880
|
+
return Math.min(...checks);
|
|
881
|
+
}
|
|
882
|
+
function collectEdgeSegments(positions, edges, exclude) {
|
|
883
|
+
const segments = [];
|
|
884
|
+
for (const edge of edges) {
|
|
885
|
+
if (exclude && edge.source === exclude.source && edge.target === exclude.target) {
|
|
886
|
+
continue;
|
|
887
|
+
}
|
|
888
|
+
const src = positions.get(edge.source);
|
|
889
|
+
const tgt = positions.get(edge.target);
|
|
890
|
+
if (!src || !tgt) continue;
|
|
891
|
+
segments.push({ ax: src[0], az: src[2], bx: tgt[0], bz: tgt[2] });
|
|
892
|
+
}
|
|
893
|
+
return segments;
|
|
894
|
+
}
|
|
895
|
+
function edgeClearanceOk(positions, edges, sourceId, targetId, minClearance) {
|
|
896
|
+
const src = positions.get(sourceId);
|
|
897
|
+
const tgt = positions.get(targetId);
|
|
898
|
+
if (!src || !tgt) return true;
|
|
899
|
+
const candidate = {
|
|
900
|
+
ax: src[0],
|
|
901
|
+
az: src[2],
|
|
902
|
+
bx: tgt[0],
|
|
903
|
+
bz: tgt[2]
|
|
904
|
+
};
|
|
905
|
+
const existing = collectEdgeSegments(positions, edges, {
|
|
906
|
+
source: sourceId,
|
|
907
|
+
target: targetId
|
|
852
908
|
});
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
909
|
+
return existing.every(
|
|
910
|
+
(seg) => distSegmentSegment2D(candidate, seg) >= minClearance || seg.ax === candidate.ax && seg.az === candidate.az && seg.bx === candidate.bx && seg.bz === candidate.bz
|
|
911
|
+
);
|
|
912
|
+
}
|
|
913
|
+
function nodeClearanceOk(positions, sceneId, pos, minClearance) {
|
|
914
|
+
for (const [otherId, otherPos] of positions) {
|
|
915
|
+
if (otherId === sceneId) continue;
|
|
916
|
+
if (Math.hypot(pos[0] - otherPos[0], pos[2] - otherPos[2]) < minClearance) {
|
|
917
|
+
return false;
|
|
856
918
|
}
|
|
857
919
|
}
|
|
858
|
-
return
|
|
920
|
+
return true;
|
|
859
921
|
}
|
|
860
|
-
function
|
|
861
|
-
|
|
922
|
+
function organicChildOffset(parentId, childId, childIndex, siblingCount, nodeCount) {
|
|
923
|
+
const fanSpread = Math.min(
|
|
924
|
+
Math.PI * 0.9,
|
|
925
|
+
0.28 * siblingCount + 0.22 * Math.sqrt(nodeCount)
|
|
926
|
+
);
|
|
927
|
+
const mid = (siblingCount - 1) / 2;
|
|
928
|
+
const baseAngle = hashSceneId(parentId, "fan") * Math.PI * 2 + (childIndex - mid) * (fanSpread / Math.max(siblingCount - 1, 1));
|
|
929
|
+
const reach = COSMOS_BRANCH_SIBLING_SPACING * (0.75 + hashSceneId(childId, "reach") * 0.65 + Math.min(nodeCount, 8) * 0.04);
|
|
930
|
+
return [Math.cos(baseAngle) * reach, Math.sin(baseAngle) * reach * 0.18];
|
|
931
|
+
}
|
|
932
|
+
function placeChildScene(parentPos, parentId, childId, childIndex, siblingCount, nodeCount) {
|
|
933
|
+
const depthStep = COSMOS_SCENE_LEVEL_SPACING * (0.82 + hashSceneId(childId, "depth") * 0.28);
|
|
934
|
+
const [ox, oz] = organicChildOffset(
|
|
935
|
+
parentId,
|
|
936
|
+
childId,
|
|
937
|
+
childIndex,
|
|
938
|
+
siblingCount,
|
|
939
|
+
nodeCount
|
|
940
|
+
);
|
|
941
|
+
return [
|
|
942
|
+
parentPos[0] + ox,
|
|
943
|
+
parentPos[1] + sceneLevelJitter(childId),
|
|
944
|
+
parentPos[2] - depthStep + oz
|
|
945
|
+
];
|
|
946
|
+
}
|
|
947
|
+
function resolveNodeOverlaps(positions, minClearance, pinnedIds = /* @__PURE__ */ new Set()) {
|
|
948
|
+
const ids = [...positions.keys()];
|
|
949
|
+
for (let pass = 0; pass < 6; pass++) {
|
|
950
|
+
let moved = false;
|
|
951
|
+
for (let i = 0; i < ids.length; i++) {
|
|
952
|
+
for (let j = i + 1; j < ids.length; j++) {
|
|
953
|
+
const aId = ids[i];
|
|
954
|
+
const bId = ids[j];
|
|
955
|
+
const a = positions.get(aId);
|
|
956
|
+
const b = positions.get(bId);
|
|
957
|
+
const dx = b[0] - a[0];
|
|
958
|
+
const dz = b[2] - a[2];
|
|
959
|
+
const dist = Math.hypot(dx, dz);
|
|
960
|
+
if (dist >= minClearance || dist === 0) continue;
|
|
961
|
+
const push = (minClearance - dist) * 0.55;
|
|
962
|
+
const nx = dx / (dist || 1);
|
|
963
|
+
const nz = dz / (dist || 1);
|
|
964
|
+
if (!pinnedIds.has(aId)) {
|
|
965
|
+
positions.set(aId, [a[0] - nx * push, a[1], a[2] - nz * push]);
|
|
966
|
+
}
|
|
967
|
+
if (!pinnedIds.has(bId)) {
|
|
968
|
+
positions.set(bId, [b[0] + nx * push, b[1], b[2] + nz * push]);
|
|
969
|
+
}
|
|
970
|
+
moved = true;
|
|
971
|
+
}
|
|
972
|
+
}
|
|
973
|
+
if (!moved) break;
|
|
974
|
+
}
|
|
975
|
+
}
|
|
976
|
+
function resolveEdgeOverlaps(positions, edges, minClearance) {
|
|
977
|
+
for (let pass = 0; pass < 4; pass++) {
|
|
978
|
+
let adjusted = false;
|
|
979
|
+
for (const edge of edges) {
|
|
980
|
+
const src = positions.get(edge.source);
|
|
981
|
+
const tgt = positions.get(edge.target);
|
|
982
|
+
if (!src || !tgt) continue;
|
|
983
|
+
const candidate = {
|
|
984
|
+
ax: src[0],
|
|
985
|
+
az: src[2],
|
|
986
|
+
bx: tgt[0],
|
|
987
|
+
bz: tgt[2]
|
|
988
|
+
};
|
|
989
|
+
const others = collectEdgeSegments(positions, edges, edge);
|
|
990
|
+
for (const other of others) {
|
|
991
|
+
if (distSegmentSegment2D(candidate, other) >= minClearance) continue;
|
|
992
|
+
const nudge = (hashSceneId(edge.target, `edge-${pass}`) - 0.5) * COSMOS_BRANCH_SIBLING_SPACING * 0.35;
|
|
993
|
+
positions.set(edge.target, [
|
|
994
|
+
tgt[0] + nudge,
|
|
995
|
+
tgt[1],
|
|
996
|
+
tgt[2] - minClearance * 0.15
|
|
997
|
+
]);
|
|
998
|
+
adjusted = true;
|
|
999
|
+
break;
|
|
1000
|
+
}
|
|
1001
|
+
}
|
|
1002
|
+
if (!adjusted) break;
|
|
1003
|
+
}
|
|
1004
|
+
}
|
|
1005
|
+
function placeEndScenes(ordered, positions, anchor) {
|
|
1006
|
+
let deepestZ = anchor[2];
|
|
1007
|
+
for (const pos of positions.values()) {
|
|
1008
|
+
deepestZ = Math.min(deepestZ, pos[2]);
|
|
1009
|
+
}
|
|
1010
|
+
const endScenes = ordered.filter((scene) => scene.is_end);
|
|
1011
|
+
endScenes.forEach((scene, idx) => {
|
|
1012
|
+
const endAngle = hashSceneId(scene.id, "end") * Math.PI * 2 + idx * GOLDEN_ANGLE * 0.35;
|
|
1013
|
+
const endSpread = COSMOS_BRANCH_SIBLING_SPACING * (1.4 + hashSceneId(scene.id, "end-r") * 0.8);
|
|
1014
|
+
positions.set(scene.id, [
|
|
1015
|
+
anchor[0] + Math.cos(endAngle) * endSpread,
|
|
1016
|
+
anchor[1] + sceneLevelJitter(scene.id),
|
|
1017
|
+
deepestZ - COSMOS_SCENE_LEVEL_SPACING
|
|
1018
|
+
]);
|
|
1019
|
+
});
|
|
862
1020
|
}
|
|
863
1021
|
function layoutFromGraphEdges(ordered, edges, root, anchor) {
|
|
864
1022
|
const positions = /* @__PURE__ */ new Map();
|
|
865
1023
|
const sceneById = new Map(ordered.map((scene) => [scene.id, scene]));
|
|
866
1024
|
const orderIndex = new Map(ordered.map((scene, idx) => [scene.id, idx]));
|
|
1025
|
+
const nodeCount = ordered.length;
|
|
867
1026
|
positions.set(root.id, [anchor[0], anchor[1], anchor[2]]);
|
|
868
1027
|
const childrenByParent = buildChildrenByParent(edges);
|
|
869
1028
|
for (const kids of childrenByParent.values()) {
|
|
@@ -877,42 +1036,65 @@ function layoutFromGraphEdges(ordered, edges, root, anchor) {
|
|
|
877
1036
|
const parentId = queue.shift();
|
|
878
1037
|
const parentPos = positions.get(parentId);
|
|
879
1038
|
if (!parentPos) continue;
|
|
880
|
-
const kids = childrenByParent.get(parentId) ?? []
|
|
1039
|
+
const kids = (childrenByParent.get(parentId) ?? []).filter(
|
|
1040
|
+
(childId) => sceneById.has(childId) && !sceneById.get(childId)?.is_end
|
|
1041
|
+
);
|
|
881
1042
|
kids.forEach((childId, idx) => {
|
|
882
|
-
if (visited.has(childId)
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
1043
|
+
if (visited.has(childId)) return;
|
|
1044
|
+
let candidate = placeChildScene(
|
|
1045
|
+
parentPos,
|
|
1046
|
+
parentId,
|
|
1047
|
+
childId,
|
|
1048
|
+
idx,
|
|
1049
|
+
kids.length,
|
|
1050
|
+
nodeCount
|
|
1051
|
+
);
|
|
1052
|
+
for (let attempt = 0; attempt < 10; attempt++) {
|
|
1053
|
+
const attemptAngle = hashSceneId(childId, `try-${attempt}`) * Math.PI * 2;
|
|
1054
|
+
if (attempt > 0) {
|
|
1055
|
+
const reach = COSMOS_BRANCH_SIBLING_SPACING * (0.6 + attempt * 0.12);
|
|
1056
|
+
candidate = [
|
|
1057
|
+
parentPos[0] + Math.cos(attemptAngle) * reach,
|
|
1058
|
+
parentPos[1] + sceneLevelJitter(childId),
|
|
1059
|
+
parentPos[2] - COSMOS_SCENE_LEVEL_SPACING * (0.85 + hashSceneId(childId, `d-${attempt}`) * 0.25)
|
|
1060
|
+
];
|
|
1061
|
+
}
|
|
1062
|
+
const trial = new Map(positions);
|
|
1063
|
+
trial.set(childId, candidate);
|
|
1064
|
+
if (nodeClearanceOk(positions, childId, candidate, COSMOS_MIN_NODE_CLEARANCE) && edgeClearanceOk(
|
|
1065
|
+
trial,
|
|
1066
|
+
edges,
|
|
1067
|
+
parentId,
|
|
1068
|
+
childId,
|
|
1069
|
+
COSMOS_MIN_EDGE_CLEARANCE
|
|
1070
|
+
)) {
|
|
1071
|
+
break;
|
|
1072
|
+
}
|
|
1073
|
+
}
|
|
1074
|
+
positions.set(childId, candidate);
|
|
889
1075
|
visited.add(childId);
|
|
890
1076
|
queue.push(childId);
|
|
891
1077
|
});
|
|
892
1078
|
}
|
|
893
|
-
|
|
894
|
-
for (const [sceneId, pos] of positions) {
|
|
895
|
-
if (sceneById.get(sceneId)?.is_end) continue;
|
|
896
|
-
maxContentZ = Math.max(maxContentZ, pos[2]);
|
|
897
|
-
}
|
|
898
|
-
for (const scene of ordered) {
|
|
899
|
-
if (!scene.is_end) continue;
|
|
900
|
-
positions.set(scene.id, [
|
|
901
|
-
anchor[0],
|
|
902
|
-
anchor[1] + sceneLevelJitter(scene.id),
|
|
903
|
-
maxContentZ + COSMOS_SCENE_LEVEL_SPACING
|
|
904
|
-
]);
|
|
905
|
-
}
|
|
1079
|
+
placeEndScenes(ordered, positions, anchor);
|
|
906
1080
|
let spineLevel = 0;
|
|
907
1081
|
for (const scene of ordered) {
|
|
908
1082
|
if (positions.has(scene.id)) continue;
|
|
909
1083
|
spineLevel += 1;
|
|
1084
|
+
const angle = spineLevel * GOLDEN_ANGLE + hashSceneId(scene.id) * 0.55;
|
|
1085
|
+
const reach = COSMOS_BRANCH_SIBLING_SPACING * (0.8 + hashSceneId(scene.id, "spine") * 0.7);
|
|
910
1086
|
positions.set(scene.id, [
|
|
911
|
-
anchor[0],
|
|
1087
|
+
anchor[0] + Math.cos(angle) * reach,
|
|
912
1088
|
anchor[1] + sceneLevelJitter(scene.id),
|
|
913
|
-
anchor[2]
|
|
1089
|
+
anchor[2] - spineLevel * COSMOS_SCENE_LEVEL_SPACING
|
|
914
1090
|
]);
|
|
915
1091
|
}
|
|
1092
|
+
resolveNodeOverlaps(
|
|
1093
|
+
positions,
|
|
1094
|
+
COSMOS_MIN_NODE_CLEARANCE,
|
|
1095
|
+
/* @__PURE__ */ new Set([root.id])
|
|
1096
|
+
);
|
|
1097
|
+
resolveEdgeOverlaps(positions, edges, COSMOS_MIN_EDGE_CLEARANCE);
|
|
916
1098
|
return positions;
|
|
917
1099
|
}
|
|
918
1100
|
function computeConstellationScenePositions(scenes, graph, anchor = [0, 0, 0]) {
|
|
@@ -925,45 +1107,35 @@ function computeConstellationScenePositions(scenes, graph, anchor = [0, 0, 0]) {
|
|
|
925
1107
|
return layoutFromGraphEdges(ordered, edges, root, anchor);
|
|
926
1108
|
}
|
|
927
1109
|
positions.set(root.id, [anchor[0], anchor[1], anchor[2]]);
|
|
928
|
-
const
|
|
1110
|
+
const nodeCount = ordered.length;
|
|
929
1111
|
let spineIndex = 0;
|
|
930
1112
|
for (const scene of ordered) {
|
|
931
1113
|
if (scene.id === root.id) continue;
|
|
932
|
-
|
|
933
|
-
if (!parentId || !positions.has(parentId)) {
|
|
934
|
-
const prevScene = ordered[spineIndex] ?? root;
|
|
935
|
-
parentId = prevScene.id;
|
|
936
|
-
}
|
|
937
|
-
const parentPos = positions.get(parentId) ?? [anchor[0], anchor[1], anchor[2]];
|
|
1114
|
+
if (scene.is_end) continue;
|
|
938
1115
|
const angle = spineIndex * GOLDEN_ANGLE + hashSceneId(scene.id) * 0.55;
|
|
939
|
-
const
|
|
940
|
-
const
|
|
1116
|
+
const reach = COSMOS_BRANCH_SIBLING_SPACING * (0.85 + hashSceneId(scene.id, "d") * 0.75 + Math.min(nodeCount, 8) * 0.05);
|
|
1117
|
+
const depthStep = COSMOS_SCENE_LEVEL_SPACING * (0.85 + hashSceneId(scene.id, "depth") * 0.25);
|
|
941
1118
|
positions.set(scene.id, [
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
1119
|
+
anchor[0] + Math.cos(angle) * reach,
|
|
1120
|
+
anchor[1] + sceneLevelJitter(scene.id),
|
|
1121
|
+
anchor[2] - (spineIndex + 1) * depthStep
|
|
945
1122
|
]);
|
|
946
1123
|
spineIndex += 1;
|
|
947
1124
|
}
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
}
|
|
957
|
-
} else {
|
|
958
|
-
for (let i = 1; i < ordered.length; i++) {
|
|
959
|
-
clampEdgeLength(
|
|
960
|
-
positions,
|
|
961
|
-
ordered[i - 1].id,
|
|
962
|
-
ordered[i].id,
|
|
963
|
-
COSMOS_MAX_SCENE_EDGE_LENGTH
|
|
964
|
-
);
|
|
965
|
-
}
|
|
1125
|
+
placeEndScenes(ordered, positions, anchor);
|
|
1126
|
+
for (let i = 1; i < ordered.length; i++) {
|
|
1127
|
+
clampEdgeLength(
|
|
1128
|
+
positions,
|
|
1129
|
+
ordered[i - 1].id,
|
|
1130
|
+
ordered[i].id,
|
|
1131
|
+
COSMOS_MAX_SCENE_EDGE_LENGTH
|
|
1132
|
+
);
|
|
966
1133
|
}
|
|
1134
|
+
resolveNodeOverlaps(
|
|
1135
|
+
positions,
|
|
1136
|
+
COSMOS_MIN_NODE_CLEARANCE,
|
|
1137
|
+
/* @__PURE__ */ new Set([root.id])
|
|
1138
|
+
);
|
|
967
1139
|
return positions;
|
|
968
1140
|
}
|
|
969
1141
|
function constellationFootprintRadius(localPositions, padding = COSMOS_CONSTELLATION_VISUAL_PADDING) {
|
|
@@ -1030,6 +1202,6 @@ function CosmosSandbox({
|
|
|
1030
1202
|
)) });
|
|
1031
1203
|
}
|
|
1032
1204
|
|
|
1033
|
-
export { COSMOS_BRANCH_SIBLING_SPACING, COSMOS_CONSTELLATION_GAP_SCENES, COSMOS_CONSTELLATION_VISUAL_PADDING, COSMOS_DEFAULT_FOOTPRINT_RADIUS, COSMOS_MAX_SCENE_EDGE_LENGTH, COSMOS_SCENE_BRANCH_SPACING, COSMOS_SCENE_LEVEL_SPACING, Constellation, ConstellationEdge, ConstellationTitle, CosmosSandbox, DEFAULT_CONSTELLATION_APPEARANCE, Star, StarBillboard, World, computeConstellationBounds, computeConstellationScenePositions, constellationFootprintRadius, distributeConstellationAnchors, distributeStars, mergeConstellationAppearance };
|
|
1205
|
+
export { COSMOS_BRANCH_SIBLING_SPACING, COSMOS_CONSTELLATION_GAP_SCENES, COSMOS_CONSTELLATION_VISUAL_PADDING, COSMOS_DEFAULT_FOOTPRINT_RADIUS, COSMOS_MAX_SCENE_EDGE_LENGTH, COSMOS_MIN_EDGE_CLEARANCE, COSMOS_MIN_NODE_CLEARANCE, COSMOS_SCENE_BRANCH_SPACING, COSMOS_SCENE_LEVEL_SPACING, Constellation, ConstellationEdge, ConstellationTitle, CosmosSandbox, DEFAULT_CONSTELLATION_APPEARANCE, Star, StarBillboard, World, computeConstellationBounds, computeConstellationScenePositions, constellationFootprintRadius, distributeConstellationAnchors, distributeStars, mergeConstellationAppearance };
|
|
1034
1206
|
//# sourceMappingURL=index.js.map
|
|
1035
1207
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/themes/index.ts","../../../../src/realms/cosmos/components/World.tsx","../../../../src/realms/cosmos/components/Star.tsx","../../../../src/realms/cosmos/appearance.ts","../../../../src/realms/cosmos/components/ConstellationEdge.tsx","../../../../src/realms/cosmos/components/ConstellationTitle.tsx","../../../../src/realms/cosmos/components/StarBillboard.tsx","../../../../src/realms/cosmos/components/Constellation.tsx","../../../../src/realms/cosmos/index.ts","../../../../src/realms/cosmos/components/layout.ts","../../../../src/realms/cosmos/components/CosmosSandbox.tsx"],"names":["DreiStars","jsxs","jsx","Html","useMemo"],"mappings":"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","file":"index.js","sourcesContent":["import type { RealmId } from \"../types/index.js\";\n\n/**\n * CSS custom property tokens, mirroring public/css/chuzi-realms.css.\n * Use these for any non-DOM rendering (e.g. React Native, canvas).\n */\nexport interface RealmThemeTokens {\n bgDeep: string;\n bgMid: string;\n accent: string;\n accentSoft: string;\n text: string;\n muted: string;\n effectLine: string;\n}\n\nexport const THEME_TOKENS: Record<RealmId, RealmThemeTokens> = {\n cosmos: {\n bgDeep: \"#04070d\",\n bgMid: \"#0a1020\",\n accent: \"#7eb8ff\",\n accentSoft: \"rgba(126, 184, 255, 0.35)\",\n text: \"#e8f0ff\",\n muted: \"rgba(232, 240, 255, 0.65)\",\n effectLine: \"#ffb347\",\n },\n wilds: {\n bgDeep: \"#0d120c\",\n bgMid: \"#152018\",\n accent: \"#7bc96f\",\n accentSoft: \"rgba(123, 201, 111, 0.35)\",\n text: \"#eef6ea\",\n muted: \"rgba(238, 246, 234, 0.7)\",\n effectLine: \"#b78aff\",\n },\n};\n\n/**\n * Scene tree visualization theme, mirroring the THEMES object in\n * resources/js/scene-tree-viewer.js.\n */\nexport interface SceneTreeTheme {\n bg: string;\n edgeChoice: string;\n edgeGoto: string;\n nodeDefault: string;\n nodeActive: string;\n borderDefault: string;\n borderActive: string;\n labelDefault: string;\n labelActive: string;\n nodeLockedFill: string;\n nodeLockedBorder: string;\n labelLocked: string;\n nodeShape: \"star\" | \"rect\";\n rectRx: number;\n}\n\nexport const SCENE_TREE_THEMES: Record<RealmId, SceneTreeTheme> = {\n cosmos: {\n bg: \"#020408\",\n edgeChoice: \"#e8f0ff\",\n edgeGoto: \"#4a9fff\",\n nodeDefault: \"#ffffff\",\n nodeActive: \"#ffd47e\",\n borderDefault: \"#3a5080\",\n borderActive: \"#fff6d0\",\n labelDefault: \"rgba(220, 232, 255, 0.92)\",\n labelActive: \"rgba(255, 246, 220, 0.98)\",\n nodeLockedFill: \"#151a28\",\n nodeLockedBorder: \"#2a3348\",\n labelLocked: \"rgba(200, 210, 230, 0.35)\",\n nodeShape: \"star\",\n rectRx: 2,\n },\n wilds: {\n bg: \"#04070d\",\n edgeChoice: \"#ffffff\",\n edgeGoto: \"#6ecf7a\",\n nodeDefault: \"#e8f5e4\",\n nodeActive: \"#d31e2f\",\n borderDefault: \"#2d4a32\",\n borderActive: \"#ff9ea8\",\n labelDefault: \"rgba(232, 245, 228, 0.92)\",\n labelActive: \"rgba(255, 214, 219, 0.98)\",\n nodeLockedFill: \"#1a221c\",\n nodeLockedBorder: \"#2a3d30\",\n labelLocked: \"rgba(200, 220, 200, 0.38)\",\n nodeShape: \"rect\",\n rectRx: 3,\n },\n};\n\n/**\n * Get theme tokens for a realm, defaulting to wilds.\n */\nexport function getThemeTokens(realmId: RealmId | null | undefined): RealmThemeTokens {\n return THEME_TOKENS[realmId ?? \"wilds\"] ?? THEME_TOKENS.wilds;\n}\n\n/**\n * Get scene tree theme for a realm, defaulting to wilds.\n */\nexport function getSceneTreeTheme(realmId: RealmId | null | undefined): SceneTreeTheme {\n return SCENE_TREE_THEMES[realmId ?? \"wilds\"] ?? SCENE_TREE_THEMES.wilds;\n}\n","import { Canvas } from \"@react-three/fiber\";\nimport { OrbitControls, Stars as DreiStars } from \"@react-three/drei\";\nimport type { ReactNode } from \"react\";\nimport { THEME_TOKENS } from \"../../../themes/index.js\";\n\nexport interface WorldProps {\n children: ReactNode;\n /** Pixel device ratio cap. Default 2 — keeps perf bounded on retina laptops. */\n dpr?: number | [number, number];\n}\n\n/**\n * Cosmos environment shell. Wraps an r3f Canvas with deep-space background,\n * ambient starfield (drei <Stars> for the *backdrop* — distinct from our\n * film-stars), and a placeholder OrbitControls camera. The real NavRig\n * (consuming an IntentSource and doing focus-snap on dpad) replaces\n * OrbitControls in a follow-up package.\n */\nexport function World({ children, dpr = [1, 2] }: WorldProps) {\n return (\n <Canvas\n camera={{ position: [0, 6, 32], fov: 60, near: 0.1, far: 500 }}\n dpr={dpr}\n gl={{ antialias: true }}\n >\n <color attach=\"background\" args={[THEME_TOKENS.cosmos.bgDeep]} />\n <ambientLight intensity={0.15} />\n <DreiStars\n radius={120}\n depth={60}\n count={3000}\n factor={4}\n fade\n saturation={0.4}\n />\n <OrbitControls enablePan={false} maxDistance={80} minDistance={4} />\n {children}\n </Canvas>\n );\n}\n","import { useRef } from \"react\";\nimport { useFrame } from \"@react-three/fiber\";\nimport type { Mesh } from \"three\";\nimport type { AtomVisualProps } from \"../../index.js\";\n\nexport interface StarProps {\n visual: AtomVisualProps;\n onSelect?: () => void;\n /** Reduce brightness and saturation to indicate an unwatched scene. */\n dimmed?: boolean;\n /** Non-navigable — suppresses click and lowers brightness further. */\n locked?: boolean;\n}\n\n/**\n * One film as a star. Color is HSL-derived from the realm mapping's hue +\n * intensity. Each star pulses on its own phase so a thousand of them don't\n * breathe in lockstep — gives the field life without per-star animation\n * state.\n */\nexport function Star({ visual, onSelect, dimmed, locked }: StarProps) {\n const ref = useRef<Mesh>(null);\n\n useFrame(({ clock }) => {\n if (!ref.current) return;\n const phase = visual.position[0] * 0.7 + visual.position[2] * 0.3;\n const pulse = 1 + Math.sin(clock.elapsedTime * 0.8 + phase) * 0.05;\n ref.current.scale.setScalar(visual.scale * pulse);\n });\n\n const saturation = dimmed || locked ? 25 : 75;\n const lightness = dimmed || locked\n ? 25 + visual.intensity * 10\n : 50 + visual.intensity * 25;\n const color = `hsl(${visual.hue}, ${saturation}%, ${lightness}%)`;\n\n const handleClick = locked\n ? undefined\n : onSelect\n ? (e: any) => {\n e.stopPropagation();\n onSelect();\n }\n : undefined;\n\n return (\n <mesh\n ref={ref}\n position={visual.position}\n onClick={handleClick}\n >\n <sphereGeometry args={[0.5, 16, 16]} />\n <meshBasicMaterial\n color={color}\n toneMapped={false}\n transparent={!!(dimmed || locked)}\n opacity={dimmed ? 0.35 : locked ? 0.25 : 1}\n />\n </mesh>\n );\n}\n","/**\n * Constellation presentation tokens — consumed by the cosmos realm camera,\n * star billboards, and ghost title typography. Admins can override via\n * saved experience / appearance templates.\n */\nexport interface ConstellationAppearance {\n /** Rainbow arc title above the constellation (SVG px). */\n titleFontSize: number;\n titleOpacity: number;\n titleColor: string;\n titleLetterSpacing: number;\n /** World-space lift above constellation center. */\n titleYOffset: number;\n /** Html distance factor for the arc title billboard. */\n titleDistanceFactor: number;\n /** DOM z-index ceiling for constellation Html overlays (keep below editor). */\n htmlZIndexRange: [number, number];\n\n /** Per-star preview card + label. */\n previewWidth: number;\n previewHeight: number;\n previewOffsetY: number;\n labelFontSize: number;\n labelLetterSpacing: number;\n /** Max width for scene labels beneath preview cards (px). */\n labelMaxWidth: number;\n labelGap: number;\n /** Reserved space below preview for the 2×2 HUD control grid (px). */\n controlsGridHeight: number;\n billboardDistanceFactor: number;\n\n /** Camera — floating-in-space slide between stars. */\n cameraDefaultOffset: [number, number, number];\n cameraTargetOffset: [number, number, number];\n /** 0–1 lerp factor per frame while gliding (lower = smoother / pressurized). */\n cameraSlideLerp: number;\n cameraArrivalThreshold: number;\n}\n\nexport const DEFAULT_CONSTELLATION_APPEARANCE: ConstellationAppearance = {\n titleFontSize: 34,\n titleOpacity: 0.82,\n titleColor: \"#c8dce8\",\n titleLetterSpacing: 6,\n titleYOffset: 16,\n titleDistanceFactor: 12,\n htmlZIndexRange: [8, 0],\n\n previewWidth: 148,\n previewHeight: 96,\n previewOffsetY: 2.4,\n labelFontSize: 13,\n labelLetterSpacing: 1.2,\n labelMaxWidth: 240,\n labelGap: 10,\n controlsGridHeight: 92,\n billboardDistanceFactor: 10,\n\n cameraDefaultOffset: [0, 4, 12],\n cameraTargetOffset: [0, 0, 0],\n cameraSlideLerp: 0.035,\n cameraArrivalThreshold: 0.08,\n};\n\nexport function mergeConstellationAppearance(\n overrides?: Partial<ConstellationAppearance>,\n): ConstellationAppearance {\n return { ...DEFAULT_CONSTELLATION_APPEARANCE, ...overrides };\n}\n","import { useMemo } from \"react\";\nimport { Line } from \"@react-three/drei\";\nimport * as THREE from \"three\";\n\nexport type ConstellationEdgeVariant = \"solid\" | \"dotted\";\n\nexport interface ConstellationEdgeProps {\n from: [number, number, number];\n to: [number, number, number];\n hueA: number;\n hueB: number;\n /** Inward gap so the line doesn't touch the star spheres. */\n gap?: number;\n intensityA?: number;\n intensityB?: number;\n /** Reduce opacity to indicate an unwatched connection. */\n dimmed?: boolean;\n /** @deprecated All edges render as soft solid glow; variant is ignored. */\n variant?: ConstellationEdgeVariant;\n}\n\n/**\n * A luminous line connecting two stars in a constellation. Endpoints are\n * pulled inward so the line floats between the stars rather than touching\n * them. Color interpolates from hueA to hueB via vertex colors.\n */\nexport function ConstellationEdge({\n from,\n to,\n hueA,\n hueB,\n gap = 0.55,\n intensityA = 0.5,\n intensityB = 0.5,\n dimmed,\n}: ConstellationEdgeProps) {\n const { points, colorA, colorB, glowA, glowB } = useMemo(() => {\n const a = new THREE.Vector3(...from);\n const b = new THREE.Vector3(...to);\n const dir = b.clone().sub(a);\n const len = dir.length();\n\n if (len < gap * 2.5) {\n return { points: null, colorA: null, colorB: null, glowA: null, glowB: null };\n }\n\n dir.normalize();\n const start = a.clone().add(dir.clone().multiplyScalar(gap));\n const end = b.clone().sub(dir.clone().multiplyScalar(gap));\n\n const lA = 55 + intensityA * 20;\n const lB = 55 + intensityB * 20;\n\n const cA = new THREE.Color(`hsl(${hueA}, 70%, ${lA}%)`);\n const cB = new THREE.Color(`hsl(${hueB}, 70%, ${lB}%)`);\n\n const gA = new THREE.Color(`hsl(${hueA}, 50%, ${lA + 10}%)`);\n const gB = new THREE.Color(`hsl(${hueB}, 50%, ${lB + 10}%)`);\n\n return {\n points: [start, end] as [THREE.Vector3, THREE.Vector3],\n colorA: cA,\n colorB: cB,\n glowA: gA,\n glowB: gB,\n };\n }, [from, to, hueA, hueB, gap, intensityA, intensityB]);\n\n if (!points || !colorA || !colorB || !glowA || !glowB) return null;\n\n const glowOpacity = dimmed ? 0.04 : 0.12;\n const coreOpacity = dimmed ? 0.15 : 0.6;\n\n return (\n <group>\n <Line\n points={points}\n vertexColors={[glowA, glowB]}\n lineWidth={4}\n transparent\n opacity={glowOpacity}\n toneMapped={false}\n />\n <Line\n points={points}\n vertexColors={[colorA, colorB]}\n lineWidth={1.5}\n transparent\n opacity={coreOpacity}\n toneMapped={false}\n />\n </group>\n );\n}\n","import { useId, type ReactNode } from \"react\";\nimport { Billboard, Html } from \"@react-three/drei\";\nimport type { ConstellationAppearance } from \"../appearance.js\";\n\nexport interface ConstellationBounds {\n center: [number, number, number];\n spanX: number;\n spanZ: number;\n}\n\nexport function computeConstellationBounds(\n positions: [number, number, number][],\n): ConstellationBounds | null {\n if (positions.length === 0) return null;\n\n let minX = Infinity;\n let maxX = -Infinity;\n let minZ = Infinity;\n let maxZ = -Infinity;\n let sumY = 0;\n\n for (const [x, y, z] of positions) {\n minX = Math.min(minX, x);\n maxX = Math.max(maxX, x);\n minZ = Math.min(minZ, z);\n maxZ = Math.max(maxZ, z);\n sumY += y;\n }\n\n return {\n center: [(minX + maxX) / 2, sumY / positions.length, (minZ + maxZ) / 2],\n spanX: Math.max(10, maxX - minX + 6),\n spanZ: Math.max(8, maxZ - minZ + 5),\n };\n}\n\nexport interface ConstellationStoryOverlay {\n /** Localized prefix, e.g. \"Chosen by\". */\n chosenByPrefix: string;\n directorName?: string | null;\n directorAvatarUrl?: string | null;\n /** Procedural avatar when no uploaded photo (e.g. constellation seal). */\n directorAvatarFallback?: ReactNode;\n contentRating?: string | null;\n genre?: string | null;\n /** Shown between rating and genre. */\n ratingGenreSeparator?: string;\n /** When true the arched title is clickable. */\n editable?: boolean;\n onEditClick?: () => void;\n /** Accessible label for the editable title control. */\n editAriaLabel?: string;\n}\n\nexport interface ConstellationTitleProps {\n title: string;\n bounds: ConstellationBounds;\n appearance: ConstellationAppearance;\n /** World position of the title (first) scene — arc starts here. */\n arcFrom?: [number, number, number];\n /** World position of the end scene — arc ends here. */\n arcTo?: [number, number, number];\n storyOverlay?: ConstellationStoryOverlay;\n}\n\nconst WORLD_TO_SVG = 58;\nconst ARC_HORIZONTAL_PAD = 72;\n\n/** Rough path length needed for arched uppercase title typography. */\nfunction estimateTitlePathWidth(\n title: string,\n fontSize: number,\n letterSpacing: number,\n): number {\n const chars = title.trim().length;\n if (chars === 0) return 0;\n const glyphWidth = fontSize * 0.62;\n return chars * glyphWidth + Math.max(0, chars - 1) * letterSpacing + 56;\n}\n\n/**\n * Vintage cartography-style ocean label arcing from title scene to end scene.\n */\nexport function ConstellationTitle({\n title,\n bounds,\n appearance,\n arcFrom,\n arcTo,\n storyOverlay,\n}: ConstellationTitleProps) {\n const gradientId = useId().replace(/:/g, \"\");\n const pathId = `arc-${gradientId}`;\n\n if (!title.trim()) return null;\n\n const titlePos = arcFrom ?? bounds.center;\n const minArcSpan = Math.max(\n 300,\n estimateTitlePathWidth(\n title,\n appearance.titleFontSize,\n appearance.titleLetterSpacing,\n ),\n );\n\n const endOffsetX =\n arcFrom && arcTo ? (arcTo[0] - arcFrom[0]) * WORLD_TO_SVG : 0;\n const arcSpanNeeded = Math.max(minArcSpan, Math.abs(endOffsetX) + 48);\n const svgWidth = Math.max(\n 420,\n Math.ceil(arcSpanNeeded + ARC_HORIZONTAL_PAD * 2),\n );\n const svgHeight = 110;\n const viewPadX = 28;\n const viewPadY = 10;\n\n const centerX = svgWidth / 2;\n const arcY = svgHeight * 0.88;\n const arcPeak = svgHeight * 0.06;\n\n let arcStartX = centerX - minArcSpan / 2;\n let arcEndX = centerX + minArcSpan / 2;\n\n if (arcFrom && arcTo) {\n arcStartX = centerX;\n arcEndX = centerX + endOffsetX;\n if (arcStartX > arcEndX) {\n const swap = arcStartX;\n arcStartX = arcEndX;\n arcEndX = swap;\n }\n\n if (arcEndX - arcStartX < minArcSpan) {\n const mid = (arcStartX + arcEndX) / 2;\n arcStartX = mid - minArcSpan / 2;\n arcEndX = mid + minArcSpan / 2;\n }\n }\n\n const arcMargin = ARC_HORIZONTAL_PAD / 2;\n arcStartX = Math.max(arcMargin, arcStartX);\n arcEndX = Math.min(svgWidth - arcMargin, arcEndX);\n if (arcEndX - arcStartX < minArcSpan) {\n arcStartX = centerX - minArcSpan / 2;\n arcEndX = centerX + minArcSpan / 2;\n }\n\n const arcMidX = (arcStartX + arcEndX) / 2;\n const arcPath = `M ${arcStartX} ${arcY} Q ${arcMidX} ${arcPeak} ${arcEndX} ${arcY}`;\n\n const editable = !!(storyOverlay?.editable && storyOverlay.onEditClick);\n const hasDirector = !!(\n storyOverlay?.directorName && storyOverlay.directorName.trim()\n );\n const hasRatingGenre = !!(\n storyOverlay?.contentRating || storyOverlay?.genre\n );\n const showOverlay = hasDirector || hasRatingGenre;\n\n const titleControl = (\n <svg\n width={svgWidth}\n height={svgHeight}\n viewBox={`${-viewPadX} ${-viewPadY} ${svgWidth + viewPadX * 2} ${svgHeight + viewPadY}`}\n style={{\n overflow: \"visible\",\n display: \"block\",\n cursor: editable ? \"pointer\" : undefined,\n }}\n aria-hidden={editable ? undefined : true}\n role={editable ? \"button\" : undefined}\n tabIndex={editable ? 0 : undefined}\n aria-label={editable ? storyOverlay?.editAriaLabel : undefined}\n onClick={editable ? storyOverlay?.onEditClick : undefined}\n onKeyDown={\n editable\n ? (e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n storyOverlay?.onEditClick?.();\n }\n }\n : undefined\n }\n >\n <defs>\n <linearGradient id={gradientId} x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"0%\">\n <stop offset=\"0%\" stopColor=\"#8ab4c8\" />\n <stop offset=\"35%\" stopColor=\"#c8d8e4\" />\n <stop offset=\"65%\" stopColor=\"#e8dcc8\" />\n <stop offset=\"100%\" stopColor=\"#8ab4c8\" />\n </linearGradient>\n <path id={pathId} d={arcPath} fill=\"none\" />\n </defs>\n <text\n fill={`url(#${gradientId})`}\n fontFamily=\"'Palatino Linotype', Palatino, 'Book Antiqua', Georgia, serif\"\n fontSize={appearance.titleFontSize}\n fontWeight={700}\n fontStyle=\"italic\"\n letterSpacing={appearance.titleLetterSpacing}\n opacity={appearance.titleOpacity}\n stroke=\"rgba(20,40,60,0.35)\"\n strokeWidth={0.6}\n paintOrder=\"stroke fill\"\n style={{ pointerEvents: \"none\" }}\n >\n <textPath href={`#${pathId}`} startOffset=\"50%\" textAnchor=\"middle\">\n {title.toUpperCase()}\n </textPath>\n </text>\n </svg>\n );\n\n return (\n <Billboard\n position={[\n titlePos[0],\n titlePos[1] + appearance.titleYOffset,\n titlePos[2],\n ]}\n >\n <Html\n center\n transform\n distanceFactor={appearance.titleDistanceFactor}\n zIndexRange={appearance.htmlZIndexRange}\n occlude={false}\n style={{\n pointerEvents: editable ? \"auto\" : \"none\",\n userSelect: \"none\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n gap: 8,\n marginTop: 4,\n }}\n >\n {titleControl}\n\n {showOverlay ? (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n gap: 6,\n maxWidth: svgWidth,\n marginTop: 6,\n pointerEvents: \"none\",\n }}\n >\n {hasDirector ? (\n <DirectorCredit\n prefix={storyOverlay!.chosenByPrefix}\n name={storyOverlay!.directorName!}\n avatarUrl={storyOverlay!.directorAvatarUrl ?? null}\n avatarFallback={storyOverlay!.directorAvatarFallback}\n />\n ) : null}\n\n {hasRatingGenre ? (\n <RatingGenreLine\n contentRating={storyOverlay!.contentRating ?? null}\n genre={storyOverlay!.genre ?? null}\n separator={storyOverlay!.ratingGenreSeparator ?? \" · \"}\n />\n ) : null}\n </div>\n ) : null}\n </div>\n </Html>\n </Billboard>\n );\n}\n\nfunction DirectorCredit({\n prefix,\n name,\n avatarUrl,\n avatarFallback,\n}: {\n prefix: string;\n name: string;\n avatarUrl: string | null;\n avatarFallback?: ReactNode;\n}) {\n const initial = name.trim().charAt(0).toUpperCase() || \"?\";\n\n return (\n <div\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 6,\n fontSize: 11,\n color: \"rgba(232,240,255,0.72)\",\n letterSpacing: 0.35,\n textShadow: \"0 1px 8px rgba(0,0,0,0.95)\",\n whiteSpace: \"nowrap\",\n }}\n >\n <span style={{ opacity: 0.85 }}>{prefix}</span>\n <span\n style={{\n width: 20,\n height: 20,\n borderRadius: \"50%\",\n overflow: \"hidden\",\n flexShrink: 0,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n background: \"rgba(255,255,255,0.1)\",\n border: \"1px solid rgba(126,184,255,0.35)\",\n fontSize: 9,\n fontWeight: 700,\n color: \"rgba(232,240,255,0.9)\",\n }}\n >\n {avatarUrl ? (\n <img\n src={avatarUrl}\n alt=\"\"\n style={{ width: \"100%\", height: \"100%\", objectFit: \"cover\" }}\n />\n ) : avatarFallback ? (\n avatarFallback\n ) : (\n initial\n )}\n </span>\n <span style={{ fontWeight: 600 }}>{name}</span>\n </div>\n );\n}\n\nfunction RatingGenreLine({\n contentRating,\n genre,\n separator,\n}: {\n contentRating: string | null;\n genre: string | null;\n separator: string;\n}) {\n const parts: ReactNode[] = [];\n if (contentRating) {\n parts.push(\n <span key=\"rating\" style={{ fontWeight: 700 }}>\n {contentRating}\n </span>,\n );\n }\n if (genre) {\n parts.push(<span key=\"genre\">{genre}</span>);\n }\n if (parts.length === 0) return null;\n\n return (\n <div\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 0,\n fontSize: 10,\n letterSpacing: 0.5,\n textTransform: \"uppercase\",\n color: \"rgba(232,240,255,0.55)\",\n textShadow: \"0 1px 6px rgba(0,0,0,0.95)\",\n }}\n >\n {parts.map((part, i) => (\n <span key={i}>\n {i > 0 ? separator : null}\n {part}\n </span>\n ))}\n </div>\n );\n}\n","import { Html } from \"@react-three/drei\";\nimport type { ReactNode } from \"react\";\nimport type { ConstellationAppearance } from \"../appearance.js\";\n\nexport interface StarBillboardProps {\n label: string;\n appearance: ConstellationAppearance;\n previewImageUrl?: string | null;\n previewContent?: ReactNode;\n dimmed?: boolean;\n focused?: boolean;\n visible?: boolean;\n /** Control strip rendered flush beneath the preview when focused. */\n controlsSlot?: ReactNode;\n}\n\n/**\n * Floating preview card and scene label above a star. Unfocused previews\n * are dimmed; labels stay prominent. Anchor sits at preview bottom-center\n * so attached controls align with the card edge.\n */\nexport function StarBillboard({\n label,\n appearance,\n previewImageUrl,\n previewContent,\n dimmed,\n focused,\n visible = true,\n controlsSlot,\n}: StarBillboardProps) {\n if (!visible) return null;\n\n const borderColor = focused\n ? \"rgba(126,184,255,0.75)\"\n : \"rgba(126,184,255,0.22)\";\n const previewOpacity = focused ? 1 : dimmed ? 0.22 : 0.34;\n const previewFilter = focused\n ? \"brightness(1.08) saturate(1.1)\"\n : \"brightness(0.72) saturate(0.65)\";\n const hasControls = !!(focused && controlsSlot);\n\n return (\n <Html\n position={[0, appearance.previewOffsetY, 0]}\n center\n transform\n distanceFactor={appearance.billboardDistanceFactor}\n zIndexRange={appearance.htmlZIndexRange}\n occlude={false}\n style={{\n pointerEvents: \"none\",\n userSelect: \"none\",\n }}\n >\n <style>{`\n @keyframes chuziPreviewFocusIn {\n 0% { opacity: 0.4; transform: scale(0.9); filter: brightness(0.8) saturate(0.7); }\n 55% { opacity: 1; transform: scale(1.05); filter: brightness(1.12) saturate(1.15); }\n 100% { opacity: 1; transform: scale(1); filter: brightness(1.08) saturate(1.1); }\n }\n @keyframes chuziPreviewFocusOut {\n 0% { opacity: 1; transform: scale(1); }\n 100% { opacity: ${previewOpacity}; transform: scale(0.96); }\n }\n `}</style>\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n transform: `translateY(-${appearance.previewHeight / 2}px)`,\n }}\n >\n <div\n key={focused ? \"focused\" : \"unfocused\"}\n style={{\n width: appearance.previewWidth,\n height: appearance.previewHeight,\n borderRadius: hasControls ? \"8px 8px 0 0\" : 8,\n overflow: \"hidden\",\n border: `1px solid ${borderColor}`,\n borderBottom: hasControls ? \"none\" : `1px solid ${borderColor}`,\n background: \"rgba(4,7,13,0.92)\",\n boxShadow: focused\n ? \"0 0 28px rgba(126,184,255,0.45), 0 4px 24px rgba(0,0,0,0.5)\"\n : \"0 4px 20px rgba(0,0,0,0.55)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n opacity: previewOpacity,\n filter: previewFilter,\n transition: \"border-color 0.35s ease, box-shadow 0.35s ease\",\n animation: focused\n ? \"chuziPreviewFocusIn 0.48s cubic-bezier(0.34, 1.45, 0.64, 1) forwards\"\n : \"chuziPreviewFocusOut 0.32s ease forwards\",\n }}\n >\n {previewImageUrl ? (\n <img\n src={previewImageUrl}\n alt=\"\"\n style={{\n width: \"100%\",\n height: \"100%\",\n objectFit: \"cover\",\n display: \"block\",\n }}\n />\n ) : (\n previewContent ?? (\n <div\n style={{\n width: \"100%\",\n height: \"100%\",\n background:\n \"radial-gradient(ellipse at 30% 20%, rgba(80,120,200,0.2) 0%, rgba(10,14,30,0.95) 70%)\",\n }}\n />\n )\n )}\n </div>\n\n {hasControls ? (\n <div\n style={{\n width: appearance.previewWidth,\n pointerEvents: \"auto\",\n flexShrink: 0,\n }}\n >\n {controlsSlot}\n </div>\n ) : null}\n\n <div\n style={{\n marginTop: appearance.labelGap,\n fontSize: appearance.labelFontSize,\n fontWeight: 700,\n letterSpacing: appearance.labelLetterSpacing,\n textTransform: \"uppercase\",\n color: \"rgba(232,240,255,0.96)\",\n textAlign: \"center\",\n textShadow:\n \"0 0 18px rgba(0,0,0,0.95), 0 2px 12px rgba(0,0,0,0.95), 0 0 6px rgba(126,184,255,0.25)\",\n whiteSpace: \"normal\",\n lineHeight: 1.2,\n maxWidth: appearance.labelMaxWidth,\n overflow: \"hidden\",\n display: \"-webkit-box\",\n WebkitLineClamp: 2,\n WebkitBoxOrient: \"vertical\",\n }}\n >\n {label}\n </div>\n </div>\n </Html>\n );\n}\n","import type { ReactNode } from \"react\";\nimport type { AtomVisualProps } from \"../../index.js\";\nimport {\n mergeConstellationAppearance,\n type ConstellationAppearance,\n} from \"../appearance.js\";\nimport { Star } from \"./Star.js\";\nimport { ConstellationEdge } from \"./ConstellationEdge.js\";\nimport {\n ConstellationTitle,\n computeConstellationBounds,\n type ConstellationStoryOverlay,\n} from \"./ConstellationTitle.js\";\nimport { StarBillboard } from \"./StarBillboard.js\";\n\nexport interface ConstellationSceneEntry {\n id: string;\n /** Visual with final position already computed by the consumer. */\n visual: AtomVisualProps;\n /** Title scene — arc starts here. */\n isTitle?: boolean;\n /** End scene — arc ends here. */\n isEnd?: boolean;\n /** Scene label shown beneath the preview card. */\n label?: string;\n /** Static preview image (coverbox, poster frame, etc.). */\n previewImageUrl?: string | null;\n /** Custom preview when no image URL is available. */\n previewContent?: ReactNode;\n /** When true the star renders at reduced brightness/saturation. */\n dimmed?: boolean;\n /** When true the star is non-navigable (click suppressed). */\n locked?: boolean;\n /** Highlight this star's billboard (focused traversal). */\n focused?: boolean;\n /** Control strip slot — rendered beneath preview when focused. */\n controlsSlot?: ReactNode;\n}\n\nexport interface ConstellationEdgeEntry {\n source: string;\n target: string;\n type: \"choice\" | \"go_to_scene\" | \"sequential\";\n}\n\nexport interface ConstellationProps {\n /** Scene entries with positions already computed by the consumer. */\n scenes: ConstellationSceneEntry[];\n /** Film title rendered as ghost typography across the group. */\n storyTitle?: string;\n /** Director credit, rating, and genre beneath the arched title. */\n storyOverlay?: ConstellationStoryOverlay;\n /** Explicit story-flow edges (goto + choice). No implicit sequential links. */\n edges?: ConstellationEdgeEntry[];\n appearance?: Partial<ConstellationAppearance>;\n /** When false, hide Html billboards and arc title (e.g. while editor is open). */\n showOverlays?: boolean;\n onSceneSelect?: (index: number) => void;\n}\n\n/**\n * A single story rendered as a constellation: scene-stars connected by\n * luminous gradient edges. This is the cosmos realm's `Group` component —\n * identical rendering for own and others' stories.\n */\nexport function Constellation({\n scenes,\n storyTitle,\n storyOverlay,\n edges = [],\n appearance: appearanceOverrides,\n showOverlays = true,\n onSceneSelect,\n}: ConstellationProps) {\n const appearance = mergeConstellationAppearance(appearanceOverrides);\n const sceneMap = new Map(scenes.map((s, i) => [s.id, { entry: s, index: i }]));\n const bounds = computeConstellationBounds(\n scenes.map((s) => s.visual.position),\n );\n\n const titleScene =\n scenes.find((s) => s.isTitle) ?? scenes[0];\n const endScene =\n scenes.find((s) => s.isEnd) ??\n scenes[scenes.length - 1];\n\n const resolvedEdges: {\n from: ConstellationSceneEntry;\n to: ConstellationSceneEntry;\n type: ConstellationEdgeEntry[\"type\"];\n }[] = [];\n\n for (const edge of edges) {\n const src = sceneMap.get(edge.source);\n const tgt = sceneMap.get(edge.target);\n if (src && tgt) {\n resolvedEdges.push({ from: src.entry, to: tgt.entry, type: edge.type });\n }\n }\n\n return (\n <group>\n {showOverlays && storyTitle && bounds ? (\n <ConstellationTitle\n title={storyTitle}\n bounds={bounds}\n appearance={appearance}\n arcFrom={titleScene?.visual.position}\n arcTo={endScene?.visual.position}\n storyOverlay={storyOverlay}\n />\n ) : null}\n\n {scenes.map((entry, i) => (\n <group key={entry.id} position={entry.visual.position}>\n <Star\n visual={{ ...entry.visual, position: [0, 0, 0] }}\n dimmed={entry.dimmed}\n locked={entry.locked}\n onSelect={onSceneSelect ? () => onSceneSelect(i) : undefined}\n />\n\n {showOverlays &&\n (entry.label || entry.previewImageUrl || entry.previewContent) ? (\n <StarBillboard\n label={entry.label ?? \"\"}\n appearance={appearance}\n previewImageUrl={entry.previewImageUrl}\n previewContent={entry.previewContent}\n dimmed={entry.dimmed}\n focused={entry.focused}\n controlsSlot={entry.controlsSlot}\n visible={showOverlays}\n />\n ) : null}\n </group>\n ))}\n\n {resolvedEdges.map(({ from, to, type }) => {\n const edgeDimmed = !!(from.dimmed || to.dimmed);\n return (\n <ConstellationEdge\n key={`edge-${from.id}-${to.id}-${type}`}\n from={from.visual.position}\n to={to.visual.position}\n hueA={from.visual.hue}\n hueB={to.visual.hue}\n intensityA={from.visual.intensity}\n intensityB={to.visual.intensity}\n dimmed={edgeDimmed}\n />\n );\n })}\n </group>\n );\n}\n\n","import type { StoryListItem } from \"../../types/index.js\";\nimport type { AtomMapping, AtomState, AudioPalette, MotionTokens } from \"../index.js\";\n\n/**\n * COSMOS realm — pure-data layer. The 3D components (World, Star, NavRig,\n * EngageTransition) live in a follow-up package once the JSX build is\n * wired up; this file owns the realm's mapping and tuning constants so\n * they can be consumed today by any non-3D surface (catalog list, search,\n * preview cards, sound design tooling).\n *\n * Mapping rationale:\n * runtime → scale (longer film = bigger star)\n * popularity → intensity (more watches = brighter)\n * mood → hue (warm/cool palette by tone)\n * genre → spectral hint (small offset on top of mood, reads as\n * \"stellar class\" — drama is yellow-G,\n * thriller is blue-O, romance is red-M).\n * state → orbit-ring rendering (handled by Atom component).\n */\n\nconst GENRE_HUE_OFFSET: Record<string, number> = {\n drama: 50,\n thriller: 220,\n horror: 0,\n comedy: 35,\n romance: 340,\n scifi: 200,\n documentary: 180,\n animation: 280,\n};\n\nconst MOOD_HUE: Record<string, number> = {\n bright: 50,\n warm: 25,\n bittersweet: 290,\n somber: 230,\n tense: 210,\n playful: 110,\n melancholy: 250,\n};\n\nfunction clamp01(n: number): number {\n return Math.max(0, Math.min(1, n));\n}\n\nfunction popularityToIntensity(film: StoryListItem): number {\n // Log-compress: a 100x more-watched film should not be 100x brighter.\n const watches = Math.max(0, film.watch_starts_count);\n const log = Math.log10(1 + watches);\n // Rough cap at ~6 (1M watches saturates the scale).\n return clamp01(log / 6);\n}\n\nfunction deriveScale(film: StoryListItem): number {\n // We don't have runtime in StoryListItem yet; proxy with scenes_count.\n // Caps the starfield from going visually noisy.\n const scenes = film.scenes_count ?? 1;\n return clamp01(0.25 + Math.log10(1 + scenes) / 4);\n}\n\nfunction deriveHue(film: StoryListItem): number {\n const genreKey = (film.genre ?? \"\").toLowerCase().replace(/[^a-z]/g, \"\");\n const moodKey = \"\";\n const moodHue = MOOD_HUE[moodKey];\n const genreOffset = GENRE_HUE_OFFSET[genreKey];\n if (moodHue !== undefined) return moodHue;\n if (genreOffset !== undefined) return genreOffset;\n return 210;\n}\n\nfunction deriveState(film: StoryListItem): AtomState {\n // Without per-user progress threaded through, default; the consuming\n // app will overlay state from CatalogResponse.meta.progress.\n return film.published ? \"default\" : \"new\";\n}\n\nexport const cosmosMapping: AtomMapping = (film) => ({\n position: [0, 0, 0], // assigned by the realm's spatial layouter\n scale: deriveScale(film),\n hue: deriveHue(film),\n intensity: popularityToIntensity(film),\n state: deriveState(film),\n metadata: {\n title: film.title,\n popularity: film.watch_starts_count,\n genre: film.genre,\n },\n});\n\nexport const cosmosMotion: MotionTokens = {\n flightAcceleration: 14,\n flightDamping: 0.92,\n focusEaseMs: 380,\n engageDurationMs: 900,\n backDurationMs: 900,\n};\n\nexport {\n DEFAULT_CONSTELLATION_APPEARANCE,\n mergeConstellationAppearance,\n} from \"./appearance.js\";\nexport type { ConstellationAppearance } from \"./appearance.js\";\n\nexport const cosmosAudio: AudioPalette = {\n // Asset paths are resolved by the host app's asset bundler; chuzi-shared\n // only declares the contract. Replace with CDN URLs at integration time.\n ambientLoop: \"audio/cosmos/ambient-deep.ogg\",\n focusChime: \"audio/cosmos/focus-shimmer.ogg\",\n engageImpact: \"audio/cosmos/dolly-in.ogg\",\n backWhoosh: \"audio/cosmos/dolly-out.ogg\",\n};\n","/**\n * Spatial distribution helpers for the cosmos realm. Kept as a stand-alone\n * module so non-3D surfaces (search overlays, accessibility list view,\n * minimap) can compute and reuse positions without pulling in three.js.\n */\n\nexport type Vec3 = [number, number, number];\n\nexport interface DistributeOptions {\n /** Outer radius of the disk in world units. */\n radius?: number;\n /** Vertical jitter band (±). Larger values flatten the disk less. */\n thickness?: number;\n /** Deterministic seed; identical seeds produce identical layouts. */\n seed?: number;\n}\n\n/**\n * Galaxy-disk distribution: stars cluster denser toward the center\n * (sqrt-r weighting), with a vertical jitter band. Deterministic when a\n * seed is provided so the same catalog produces the same starfield across\n * sessions.\n */\nexport function distributeStars(\n count: number,\n options: DistributeOptions = {},\n): Vec3[] {\n const radius = options.radius ?? 25;\n const thickness = options.thickness ?? 4;\n const random = options.seed !== undefined ? mulberry32(options.seed) : Math.random;\n\n const positions: Vec3[] = [];\n for (let i = 0; i < count; i++) {\n const r = Math.sqrt(random()) * radius;\n const theta = random() * Math.PI * 2;\n const y = (random() - 0.5) * thickness;\n positions.push([Math.cos(theta) * r, y, Math.sin(theta) * r]);\n }\n return positions;\n}\n\nfunction mulberry32(seed: number): () => number {\n let s = seed >>> 0;\n return () => {\n s = (s + 0x6d2b79f5) >>> 0;\n let t = s;\n t = Math.imul(t ^ (t >>> 15), t | 1);\n t ^= t + Math.imul(t ^ (t >>> 7), t | 61);\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n };\n}\n\n/** World-space gap between parent and child along +Z (chronological depth). */\nexport const COSMOS_SCENE_LEVEL_SPACING = 6;\n\n/** Lateral gap between sibling branches at the same parent. */\nexport const COSMOS_BRANCH_SIBLING_SPACING = 4;\n\n/** @deprecated API x multiplier — 3D layout uses parent-relative BFS instead. */\nexport const COSMOS_SCENE_BRANCH_SPACING = 1.6;\n\n/** Maximum distance between two connected scene stars (fallback spine only). */\nexport const COSMOS_MAX_SCENE_EDGE_LENGTH = 14;\n\n/** Minimum empty space between constellation bounds, in scene spacings. */\nexport const COSMOS_CONSTELLATION_GAP_SCENES = 2;\n\n/** Halo around a lone title star before scenes load. */\nexport const COSMOS_DEFAULT_FOOTPRINT_RADIUS = 10;\n\n/** Extra world units around the outermost scene for billboards / focus glow. */\nexport const COSMOS_CONSTELLATION_VISUAL_PADDING = 6;\n\nconst GOLDEN_ANGLE = 2.399963229728653;\n\nexport interface ConstellationLayoutScene {\n id: string;\n is_title?: boolean;\n is_end?: boolean;\n order?: number;\n created_at?: string;\n}\n\nexport interface ConstellationLayoutEdge {\n source: string;\n target: string;\n}\n\nexport interface ConstellationLayoutNode {\n id: string;\n level: number;\n x: number;\n index?: number;\n}\n\nexport interface ConstellationLayoutGraph {\n nodes: ConstellationLayoutNode[];\n edges?: ConstellationLayoutEdge[];\n meta?: { root_id?: string | null };\n}\n\nexport interface ConstellationAnchorInput {\n id: string;\n footprintRadius: number;\n}\n\nexport interface ConstellationAnchorOptions {\n /** Gap between constellation bounds in scene spacings (default 2). */\n minGapScenes?: number;\n levelSpacing?: number;\n visualPadding?: number;\n}\n\nfunction sortScenesForConstellationLayout(\n sceneList: ConstellationLayoutScene[],\n): ConstellationLayoutScene[] {\n return [...sceneList].sort((a, b) => {\n if (a.is_title !== b.is_title) return a.is_title ? -1 : 1;\n if (a.is_end !== b.is_end) return a.is_end ? 1 : -1;\n const orderA = a.order ?? 0;\n const orderB = b.order ?? 0;\n if (orderA !== orderB) return orderA - orderB;\n return (a.created_at ?? \"\").localeCompare(b.created_at ?? \"\");\n });\n}\n\nfunction orderScenesForConstellationLayout(\n sceneList: ConstellationLayoutScene[],\n graph: ConstellationLayoutGraph | undefined,\n): ConstellationLayoutScene[] {\n if (!graph?.nodes?.length) return sortScenesForConstellationLayout(sceneList);\n\n const sceneById = new Map(sceneList.map((scene) => [scene.id, scene]));\n const ordered: ConstellationLayoutScene[] = [];\n const seen = new Set<string>();\n\n const sortedNodes = [...graph.nodes].sort((a, b) => {\n if (a.level !== b.level) return a.level - b.level;\n if (a.x !== b.x) return a.x - b.x;\n return (a.index ?? 0) - (b.index ?? 0);\n });\n\n for (const node of sortedNodes) {\n const scene = sceneById.get(node.id);\n if (scene && !seen.has(scene.id)) {\n ordered.push(scene);\n seen.add(scene.id);\n }\n }\n\n for (const scene of sortScenesForConstellationLayout(sceneList)) {\n if (!seen.has(scene.id)) {\n ordered.push(scene);\n seen.add(scene.id);\n }\n }\n\n return ordered;\n}\n\nfunction hashSceneId(id: string, salt = \"\"): number {\n let h = 0;\n const key = id + salt;\n for (let i = 0; i < key.length; i++) {\n h = (h * 31 + key.charCodeAt(i)) >>> 0;\n }\n return h / 4294967296;\n}\n\nfunction clampEdgeLength(\n positions: Map<string, Vec3>,\n sourceId: string,\n targetId: string,\n maxLength: number,\n): void {\n const src = positions.get(sourceId);\n const tgt = positions.get(targetId);\n if (!src || !tgt) return;\n\n const dx = tgt[0] - src[0];\n const dy = tgt[1] - src[1];\n const dz = tgt[2] - src[2];\n const len = Math.hypot(dx, dy, dz);\n if (len <= maxLength || len === 0) return;\n\n const scale = maxLength / len;\n positions.set(targetId, [\n src[0] + dx * scale,\n src[1] + dy * scale,\n src[2] + dz * scale,\n ]);\n}\n\nfunction buildChildrenByParent(\n edges: ConstellationLayoutEdge[],\n): Map<string, string[]> {\n const childrenByParent = new Map<string, string[]>();\n\n for (const edge of edges) {\n const kids = childrenByParent.get(edge.source) ?? [];\n if (!kids.includes(edge.target)) {\n kids.push(edge.target);\n }\n childrenByParent.set(edge.source, kids);\n }\n\n return childrenByParent;\n}\n\nfunction buildParentByChild(\n ordered: ConstellationLayoutScene[],\n edges: ConstellationLayoutEdge[],\n): Map<string, string> {\n const parentByChild = new Map<string, string>();\n const orderIndex = new Map(ordered.map((scene, idx) => [scene.id, idx]));\n\n const sortedEdges = [...edges].sort((a, b) => {\n const aIdx = orderIndex.get(a.target) ?? Number.MAX_SAFE_INTEGER;\n const bIdx = orderIndex.get(b.target) ?? Number.MAX_SAFE_INTEGER;\n return aIdx - bIdx;\n });\n\n for (const edge of sortedEdges) {\n if (!parentByChild.has(edge.target)) {\n parentByChild.set(edge.target, edge.source);\n }\n }\n\n return parentByChild;\n}\n\nfunction sceneLevelJitter(sceneId: string): number {\n return (hashSceneId(sceneId, \"y\") - 0.5) * 1.2;\n}\n\nfunction layoutFromGraphEdges(\n ordered: ConstellationLayoutScene[],\n edges: ConstellationLayoutEdge[],\n root: ConstellationLayoutScene,\n anchor: Vec3,\n): Map<string, Vec3> {\n const positions = new Map<string, Vec3>();\n const sceneById = new Map(ordered.map((scene) => [scene.id, scene]));\n const orderIndex = new Map(ordered.map((scene, idx) => [scene.id, idx]));\n\n positions.set(root.id, [anchor[0], anchor[1], anchor[2]]);\n\n const childrenByParent = buildChildrenByParent(edges);\n for (const kids of childrenByParent.values()) {\n kids.sort(\n (a, b) => (orderIndex.get(a) ?? 0) - (orderIndex.get(b) ?? 0),\n );\n }\n\n const visited = new Set<string>([root.id]);\n const queue = [root.id];\n\n while (queue.length > 0) {\n const parentId = queue.shift()!;\n const parentPos = positions.get(parentId);\n if (!parentPos) continue;\n\n const kids = childrenByParent.get(parentId) ?? [];\n kids.forEach((childId, idx) => {\n if (visited.has(childId) || !sceneById.has(childId)) return;\n\n const branchOffset =\n (idx - (kids.length - 1) / 2) * COSMOS_BRANCH_SIBLING_SPACING;\n positions.set(childId, [\n parentPos[0] + branchOffset,\n parentPos[1] + sceneLevelJitter(childId),\n parentPos[2] + COSMOS_SCENE_LEVEL_SPACING,\n ]);\n visited.add(childId);\n queue.push(childId);\n });\n }\n\n let maxContentZ = anchor[2];\n for (const [sceneId, pos] of positions) {\n if (sceneById.get(sceneId)?.is_end) continue;\n maxContentZ = Math.max(maxContentZ, pos[2]);\n }\n\n for (const scene of ordered) {\n if (!scene.is_end) continue;\n positions.set(scene.id, [\n anchor[0],\n anchor[1] + sceneLevelJitter(scene.id),\n maxContentZ + COSMOS_SCENE_LEVEL_SPACING,\n ]);\n }\n\n let spineLevel = 0;\n for (const scene of ordered) {\n if (positions.has(scene.id)) continue;\n spineLevel += 1;\n positions.set(scene.id, [\n anchor[0],\n anchor[1] + sceneLevelJitter(scene.id),\n anchor[2] + spineLevel * COSMOS_SCENE_LEVEL_SPACING,\n ]);\n }\n\n return positions;\n}\n\n/**\n * Scene positions relative to the title star at the constellation anchor.\n * When story-flow edges exist, each child sits one +Z step from its parent\n * with compact sibling spread on X. Without edges, scenes use a golden-angle\n * fallback spine.\n */\nexport function computeConstellationScenePositions(\n scenes: ConstellationLayoutScene[],\n graph: ConstellationLayoutGraph | undefined,\n anchor: Vec3 = [0, 0, 0],\n): Map<string, Vec3> {\n const positions = new Map<string, Vec3>();\n const ordered = orderScenesForConstellationLayout(scenes, graph);\n if (ordered.length === 0) return positions;\n\n const root =\n ordered.find((scene) => scene.is_title) ??\n ordered[0];\n\n const edges = graph?.edges ?? [];\n if (edges.length > 0) {\n return layoutFromGraphEdges(ordered, edges, root, anchor);\n }\n\n positions.set(root.id, [anchor[0], anchor[1], anchor[2]]);\n const parentByChild = edges.length > 0\n ? buildParentByChild(ordered, edges)\n : new Map<string, string>();\n\n let spineIndex = 0;\n for (const scene of ordered) {\n if (scene.id === root.id) continue;\n\n let parentId = parentByChild.get(scene.id);\n if (!parentId || !positions.has(parentId)) {\n const prevScene = ordered[spineIndex] ?? root;\n parentId = prevScene.id;\n }\n\n const parentPos = positions.get(parentId) ?? [anchor[0], anchor[1], anchor[2]];\n const angle = spineIndex * GOLDEN_ANGLE + hashSceneId(scene.id) * 0.55;\n const dist =\n COSMOS_MAX_SCENE_EDGE_LENGTH * (0.9 + hashSceneId(scene.id, \"d\") * 0.1);\n const yJitter = sceneLevelJitter(scene.id);\n\n positions.set(scene.id, [\n parentPos[0] + Math.cos(angle) * dist,\n parentPos[1] + yJitter,\n parentPos[2] + Math.sin(angle) * dist,\n ]);\n spineIndex += 1;\n }\n\n if (edges.length > 0) {\n for (const edge of edges) {\n clampEdgeLength(\n positions,\n edge.source,\n edge.target,\n COSMOS_MAX_SCENE_EDGE_LENGTH,\n );\n }\n } else {\n for (let i = 1; i < ordered.length; i++) {\n clampEdgeLength(\n positions,\n ordered[i - 1].id,\n ordered[i].id,\n COSMOS_MAX_SCENE_EDGE_LENGTH,\n );\n }\n }\n\n return positions;\n}\n\n/** Bounding radius from the title anchor to the outermost scene plus visual padding. */\nexport function constellationFootprintRadius(\n localPositions: Map<string, Vec3>,\n padding: number = COSMOS_CONSTELLATION_VISUAL_PADDING,\n): number {\n let maxReach = COSMOS_DEFAULT_FOOTPRINT_RADIUS;\n for (const [x, , z] of localPositions.values()) {\n maxReach = Math.max(maxReach, Math.hypot(x, z) + padding);\n }\n return maxReach;\n}\n\nfunction circlesSeparated(\n ax: number,\n az: number,\n aRadius: number,\n bx: number,\n bz: number,\n bRadius: number,\n minGap: number,\n): boolean {\n return Math.hypot(ax - bx, az - bz) >= aRadius + bRadius + minGap;\n}\n\nfunction findConstellationAnchor(\n footprintRadius: number,\n placed: Array<{ x: number; z: number; radius: number }>,\n minGap: number,\n): Vec3 {\n if (placed.length === 0) return [0, 0, 0];\n\n let angle = 0;\n let radius = 0;\n const angleStep = 0.62;\n const radiusGrowth = minGap * 0.75;\n\n for (let attempt = 0; attempt < 8000; attempt++) {\n angle += angleStep;\n radius += radiusGrowth / (2 * Math.PI);\n const cx = Math.cos(angle) * radius;\n const cz = Math.sin(angle) * radius;\n const ok = placed.every((other) =>\n circlesSeparated(cx, cz, footprintRadius, other.x, other.z, other.radius, minGap),\n );\n if (ok) return [cx, 0, cz];\n }\n\n const fallback = placed.length * (minGap + footprintRadius * 2);\n return [fallback, 0, 0];\n}\n\n/**\n * Place constellation anchors so each title star stays outside other\n * constellations, with at least `minGapScenes` scene spacings between bounds.\n */\nexport function distributeConstellationAnchors(\n items: ConstellationAnchorInput[],\n options: ConstellationAnchorOptions = {},\n): Map<string, Vec3> {\n const minGapScenes = options.minGapScenes ?? COSMOS_CONSTELLATION_GAP_SCENES;\n const levelSpacing = options.levelSpacing ?? COSMOS_SCENE_LEVEL_SPACING;\n const minGap = minGapScenes * levelSpacing;\n\n const anchors = new Map<string, Vec3>();\n const placed: Array<{ x: number; z: number; radius: number }> = [];\n\n for (const item of items) {\n const [x, , z] = findConstellationAnchor(item.footprintRadius, placed, minGap);\n anchors.set(item.id, [x, 0, z]);\n placed.push({ x, z, radius: item.footprintRadius });\n }\n\n return anchors;\n}\n","import { useMemo } from \"react\";\nimport type { StoryListItem } from \"../../../types/index.js\";\nimport { cosmosMapping } from \"../index.js\";\nimport { Star } from \"./Star.js\";\nimport { World } from \"./World.js\";\nimport { distributeStars, type Vec3 } from \"./layout.js\";\n\nexport interface CosmosSandboxProps {\n films: StoryListItem[];\n onFilmSelect?: (film: StoryListItem) => void;\n /** Layout seed — same seed + same films = same layout. */\n seed?: number;\n}\n\n/**\n * Drop-in 3D sandbox. Hands a list of films, gets back a navigable\n * starfield where each star is a film. Useful for: integration tests, the\n * realm-picker preview thumbnail, the editor's \"preview as star\" mode, and\n * as the smoke-test entry while migrating chuzi-web off Laravel.\n */\nexport function CosmosSandbox({\n films,\n onFilmSelect,\n seed = 1,\n}: CosmosSandboxProps) {\n const placed = useMemo(() => {\n const positions: Vec3[] = distributeStars(films.length, { seed });\n return films.map((film, i) => ({\n film,\n visual: { ...cosmosMapping(film), position: positions[i] },\n }));\n }, [films, seed]);\n\n return (\n <World>\n {placed.map(({ film, visual }) => (\n <Star\n key={film.id}\n visual={visual}\n onSelect={onFilmSelect ? () => onFilmSelect(film) : undefined}\n />\n ))}\n </World>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/themes/index.ts","../../../../src/realms/cosmos/components/World.tsx","../../../../src/realms/cosmos/components/Star.tsx","../../../../src/realms/cosmos/appearance.ts","../../../../src/realms/cosmos/components/ConstellationEdge.tsx","../../../../src/realms/cosmos/components/ConstellationTitle.tsx","../../../../src/realms/cosmos/components/StarBillboard.tsx","../../../../src/realms/cosmos/components/Constellation.tsx","../../../../src/realms/cosmos/index.ts","../../../../src/realms/cosmos/components/layout.ts","../../../../src/realms/cosmos/components/CosmosSandbox.tsx"],"names":["DreiStars","jsxs","jsx","Html","useMemo"],"mappings":"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","file":"index.js","sourcesContent":["import type { RealmId } from \"../types/index.js\";\n\n/**\n * CSS custom property tokens, mirroring public/css/chuzi-realms.css.\n * Use these for any non-DOM rendering (e.g. React Native, canvas).\n */\nexport interface RealmThemeTokens {\n bgDeep: string;\n bgMid: string;\n accent: string;\n accentSoft: string;\n text: string;\n muted: string;\n effectLine: string;\n}\n\nexport const THEME_TOKENS: Record<RealmId, RealmThemeTokens> = {\n cosmos: {\n bgDeep: \"#04070d\",\n bgMid: \"#0a1020\",\n accent: \"#7eb8ff\",\n accentSoft: \"rgba(126, 184, 255, 0.35)\",\n text: \"#e8f0ff\",\n muted: \"rgba(232, 240, 255, 0.65)\",\n effectLine: \"#ffb347\",\n },\n wilds: {\n bgDeep: \"#0d120c\",\n bgMid: \"#152018\",\n accent: \"#7bc96f\",\n accentSoft: \"rgba(123, 201, 111, 0.35)\",\n text: \"#eef6ea\",\n muted: \"rgba(238, 246, 234, 0.7)\",\n effectLine: \"#b78aff\",\n },\n};\n\n/**\n * Scene tree visualization theme, mirroring the THEMES object in\n * resources/js/scene-tree-viewer.js.\n */\nexport interface SceneTreeTheme {\n bg: string;\n edgeChoice: string;\n edgeGoto: string;\n nodeDefault: string;\n nodeActive: string;\n borderDefault: string;\n borderActive: string;\n labelDefault: string;\n labelActive: string;\n nodeLockedFill: string;\n nodeLockedBorder: string;\n labelLocked: string;\n nodeShape: \"star\" | \"rect\";\n rectRx: number;\n}\n\nexport const SCENE_TREE_THEMES: Record<RealmId, SceneTreeTheme> = {\n cosmos: {\n bg: \"#020408\",\n edgeChoice: \"#e8f0ff\",\n edgeGoto: \"#4a9fff\",\n nodeDefault: \"#ffffff\",\n nodeActive: \"#ffd47e\",\n borderDefault: \"#3a5080\",\n borderActive: \"#fff6d0\",\n labelDefault: \"rgba(220, 232, 255, 0.92)\",\n labelActive: \"rgba(255, 246, 220, 0.98)\",\n nodeLockedFill: \"#151a28\",\n nodeLockedBorder: \"#2a3348\",\n labelLocked: \"rgba(200, 210, 230, 0.35)\",\n nodeShape: \"star\",\n rectRx: 2,\n },\n wilds: {\n bg: \"#04070d\",\n edgeChoice: \"#ffffff\",\n edgeGoto: \"#6ecf7a\",\n nodeDefault: \"#e8f5e4\",\n nodeActive: \"#d31e2f\",\n borderDefault: \"#2d4a32\",\n borderActive: \"#ff9ea8\",\n labelDefault: \"rgba(232, 245, 228, 0.92)\",\n labelActive: \"rgba(255, 214, 219, 0.98)\",\n nodeLockedFill: \"#1a221c\",\n nodeLockedBorder: \"#2a3d30\",\n labelLocked: \"rgba(200, 220, 200, 0.38)\",\n nodeShape: \"rect\",\n rectRx: 3,\n },\n};\n\n/**\n * Get theme tokens for a realm, defaulting to wilds.\n */\nexport function getThemeTokens(realmId: RealmId | null | undefined): RealmThemeTokens {\n return THEME_TOKENS[realmId ?? \"wilds\"] ?? THEME_TOKENS.wilds;\n}\n\n/**\n * Get scene tree theme for a realm, defaulting to wilds.\n */\nexport function getSceneTreeTheme(realmId: RealmId | null | undefined): SceneTreeTheme {\n return SCENE_TREE_THEMES[realmId ?? \"wilds\"] ?? SCENE_TREE_THEMES.wilds;\n}\n","import { Canvas } from \"@react-three/fiber\";\nimport { OrbitControls, Stars as DreiStars } from \"@react-three/drei\";\nimport type { ReactNode } from \"react\";\nimport { THEME_TOKENS } from \"../../../themes/index.js\";\n\nexport interface WorldProps {\n children: ReactNode;\n /** Pixel device ratio cap. Default 2 — keeps perf bounded on retina laptops. */\n dpr?: number | [number, number];\n}\n\n/**\n * Cosmos environment shell. Wraps an r3f Canvas with deep-space background,\n * ambient starfield (drei <Stars> for the *backdrop* — distinct from our\n * film-stars), and a placeholder OrbitControls camera. The real NavRig\n * (consuming an IntentSource and doing focus-snap on dpad) replaces\n * OrbitControls in a follow-up package.\n */\nexport function World({ children, dpr = [1, 2] }: WorldProps) {\n return (\n <Canvas\n camera={{ position: [0, 6, 32], fov: 60, near: 0.1, far: 500 }}\n dpr={dpr}\n gl={{ antialias: true }}\n >\n <color attach=\"background\" args={[THEME_TOKENS.cosmos.bgDeep]} />\n <ambientLight intensity={0.15} />\n <DreiStars\n radius={120}\n depth={60}\n count={3000}\n factor={4}\n fade\n saturation={0.4}\n />\n <OrbitControls enablePan={false} maxDistance={80} minDistance={4} />\n {children}\n </Canvas>\n );\n}\n","import { useRef } from \"react\";\nimport { useFrame } from \"@react-three/fiber\";\nimport type { Mesh } from \"three\";\nimport type { AtomVisualProps } from \"../../index.js\";\n\nexport interface StarProps {\n visual: AtomVisualProps;\n onSelect?: () => void;\n /** Reduce brightness and saturation to indicate an unwatched scene. */\n dimmed?: boolean;\n /** Non-navigable — suppresses click and lowers brightness further. */\n locked?: boolean;\n}\n\n/**\n * One film as a star. Color is HSL-derived from the realm mapping's hue +\n * intensity. Each star pulses on its own phase so a thousand of them don't\n * breathe in lockstep — gives the field life without per-star animation\n * state.\n */\nexport function Star({ visual, onSelect, dimmed, locked }: StarProps) {\n const ref = useRef<Mesh>(null);\n\n useFrame(({ clock }) => {\n if (!ref.current) return;\n const phase = visual.position[0] * 0.7 + visual.position[2] * 0.3;\n const pulse = 1 + Math.sin(clock.elapsedTime * 0.8 + phase) * 0.05;\n ref.current.scale.setScalar(visual.scale * pulse);\n });\n\n const saturation = dimmed || locked ? 25 : 75;\n const lightness = dimmed || locked\n ? 25 + visual.intensity * 10\n : 50 + visual.intensity * 25;\n const color = `hsl(${visual.hue}, ${saturation}%, ${lightness}%)`;\n\n const handleClick = locked\n ? undefined\n : onSelect\n ? (e: any) => {\n e.stopPropagation();\n onSelect();\n }\n : undefined;\n\n return (\n <mesh\n ref={ref}\n position={visual.position}\n onClick={handleClick}\n >\n <sphereGeometry args={[0.5, 16, 16]} />\n <meshBasicMaterial\n color={color}\n toneMapped={false}\n transparent={!!(dimmed || locked)}\n opacity={dimmed ? 0.35 : locked ? 0.25 : 1}\n />\n </mesh>\n );\n}\n","/**\n * Constellation presentation tokens — consumed by the cosmos realm camera,\n * star billboards, and ghost title typography. Admins can override via\n * saved experience / appearance templates.\n */\nexport interface ConstellationAppearance {\n /** Rainbow arc title above the constellation (SVG px). */\n titleFontSize: number;\n titleOpacity: number;\n titleColor: string;\n titleLetterSpacing: number;\n /** World-space lift above constellation center. */\n titleYOffset: number;\n /** Html distance factor for the arc title billboard. */\n titleDistanceFactor: number;\n /** DOM z-index ceiling for constellation Html overlays (keep below editor). */\n htmlZIndexRange: [number, number];\n\n /** Per-star preview card + label. */\n previewWidth: number;\n previewHeight: number;\n previewOffsetY: number;\n labelFontSize: number;\n labelLetterSpacing: number;\n /** Max width for scene labels beneath preview cards (px). */\n labelMaxWidth: number;\n labelGap: number;\n /** Reserved space below preview for the 2×2 HUD control grid (px). */\n controlsGridHeight: number;\n billboardDistanceFactor: number;\n\n /** Camera — floating-in-space slide between stars. */\n cameraDefaultOffset: [number, number, number];\n cameraTargetOffset: [number, number, number];\n /** 0–1 lerp factor per frame while gliding (lower = smoother / pressurized). */\n cameraSlideLerp: number;\n cameraArrivalThreshold: number;\n}\n\nexport const DEFAULT_CONSTELLATION_APPEARANCE: ConstellationAppearance = {\n titleFontSize: 34,\n titleOpacity: 0.82,\n titleColor: \"#c8dce8\",\n titleLetterSpacing: 6,\n titleYOffset: 16,\n titleDistanceFactor: 12,\n htmlZIndexRange: [8, 0],\n\n previewWidth: 148,\n previewHeight: 96,\n previewOffsetY: 2.4,\n labelFontSize: 13,\n labelLetterSpacing: 1.2,\n labelMaxWidth: 240,\n labelGap: 10,\n controlsGridHeight: 92,\n billboardDistanceFactor: 10,\n\n cameraDefaultOffset: [0, 4, 12],\n cameraTargetOffset: [0, 0, 0],\n cameraSlideLerp: 0.035,\n cameraArrivalThreshold: 0.08,\n};\n\nexport function mergeConstellationAppearance(\n overrides?: Partial<ConstellationAppearance>,\n): ConstellationAppearance {\n return { ...DEFAULT_CONSTELLATION_APPEARANCE, ...overrides };\n}\n","import { useMemo } from \"react\";\nimport { Line } from \"@react-three/drei\";\nimport * as THREE from \"three\";\n\nexport type ConstellationEdgeVariant = \"solid\" | \"dotted\";\n\nexport interface ConstellationEdgeProps {\n from: [number, number, number];\n to: [number, number, number];\n hueA: number;\n hueB: number;\n /** Inward gap so the line doesn't touch the star spheres. */\n gap?: number;\n intensityA?: number;\n intensityB?: number;\n /** Reduce opacity to indicate an unwatched connection. */\n dimmed?: boolean;\n /** @deprecated All edges render as soft solid glow; variant is ignored. */\n variant?: ConstellationEdgeVariant;\n}\n\n/**\n * A luminous line connecting two stars in a constellation. Endpoints are\n * pulled inward so the line floats between the stars rather than touching\n * them. Color interpolates from hueA to hueB via vertex colors.\n */\nexport function ConstellationEdge({\n from,\n to,\n hueA,\n hueB,\n gap = 0.55,\n intensityA = 0.5,\n intensityB = 0.5,\n dimmed,\n}: ConstellationEdgeProps) {\n const { points, colorA, colorB, glowA, glowB } = useMemo(() => {\n const a = new THREE.Vector3(...from);\n const b = new THREE.Vector3(...to);\n const dir = b.clone().sub(a);\n const len = dir.length();\n\n if (len < gap * 2.5) {\n return { points: null, colorA: null, colorB: null, glowA: null, glowB: null };\n }\n\n dir.normalize();\n const start = a.clone().add(dir.clone().multiplyScalar(gap));\n const end = b.clone().sub(dir.clone().multiplyScalar(gap));\n\n const lA = 55 + intensityA * 20;\n const lB = 55 + intensityB * 20;\n\n const cA = new THREE.Color(`hsl(${hueA}, 70%, ${lA}%)`);\n const cB = new THREE.Color(`hsl(${hueB}, 70%, ${lB}%)`);\n\n const gA = new THREE.Color(`hsl(${hueA}, 50%, ${lA + 10}%)`);\n const gB = new THREE.Color(`hsl(${hueB}, 50%, ${lB + 10}%)`);\n\n return {\n points: [start, end] as [THREE.Vector3, THREE.Vector3],\n colorA: cA,\n colorB: cB,\n glowA: gA,\n glowB: gB,\n };\n }, [from, to, hueA, hueB, gap, intensityA, intensityB]);\n\n if (!points || !colorA || !colorB || !glowA || !glowB) return null;\n\n const glowOpacity = dimmed ? 0.04 : 0.12;\n const coreOpacity = dimmed ? 0.15 : 0.6;\n\n return (\n <group>\n <Line\n points={points}\n vertexColors={[glowA, glowB]}\n lineWidth={4}\n transparent\n opacity={glowOpacity}\n toneMapped={false}\n />\n <Line\n points={points}\n vertexColors={[colorA, colorB]}\n lineWidth={1.5}\n transparent\n opacity={coreOpacity}\n toneMapped={false}\n />\n </group>\n );\n}\n","import { useId, type ReactNode } from \"react\";\nimport { Billboard, Html } from \"@react-three/drei\";\nimport type { ConstellationAppearance } from \"../appearance.js\";\n\nexport interface ConstellationBounds {\n center: [number, number, number];\n spanX: number;\n spanZ: number;\n}\n\nexport function computeConstellationBounds(\n positions: [number, number, number][],\n): ConstellationBounds | null {\n if (positions.length === 0) return null;\n\n let minX = Infinity;\n let maxX = -Infinity;\n let minZ = Infinity;\n let maxZ = -Infinity;\n let sumY = 0;\n\n for (const [x, y, z] of positions) {\n minX = Math.min(minX, x);\n maxX = Math.max(maxX, x);\n minZ = Math.min(minZ, z);\n maxZ = Math.max(maxZ, z);\n sumY += y;\n }\n\n return {\n center: [(minX + maxX) / 2, sumY / positions.length, (minZ + maxZ) / 2],\n spanX: Math.max(10, maxX - minX + 6),\n spanZ: Math.max(8, maxZ - minZ + 5),\n };\n}\n\nexport interface ConstellationStoryOverlay {\n /** Localized prefix, e.g. \"Chosen by\". */\n chosenByPrefix: string;\n directorName?: string | null;\n directorAvatarUrl?: string | null;\n /** Procedural avatar when no uploaded photo (e.g. constellation seal). */\n directorAvatarFallback?: ReactNode;\n contentRating?: string | null;\n genre?: string | null;\n /** Shown between rating and genre. */\n ratingGenreSeparator?: string;\n /** When true the arched title is clickable. */\n editable?: boolean;\n onEditClick?: () => void;\n /** Accessible label for the editable title control. */\n editAriaLabel?: string;\n}\n\nexport interface ConstellationTitleProps {\n title: string;\n bounds: ConstellationBounds;\n appearance: ConstellationAppearance;\n /** World position of the title (first) scene — arc starts here. */\n arcFrom?: [number, number, number];\n /** World position of the end scene — arc ends here. */\n arcTo?: [number, number, number];\n storyOverlay?: ConstellationStoryOverlay;\n}\n\nconst WORLD_TO_SVG = 58;\nconst ARC_HORIZONTAL_PAD = 72;\n\n/** Rough path length needed for arched uppercase title typography. */\nfunction estimateTitlePathWidth(\n title: string,\n fontSize: number,\n letterSpacing: number,\n): number {\n const chars = title.trim().length;\n if (chars === 0) return 0;\n const glyphWidth = fontSize * 0.62;\n return chars * glyphWidth + Math.max(0, chars - 1) * letterSpacing + 56;\n}\n\n/**\n * Vintage cartography-style ocean label arcing from title scene to end scene.\n */\nexport function ConstellationTitle({\n title,\n bounds,\n appearance,\n arcFrom,\n arcTo,\n storyOverlay,\n}: ConstellationTitleProps) {\n const gradientId = useId().replace(/:/g, \"\");\n const pathId = `arc-${gradientId}`;\n\n if (!title.trim()) return null;\n\n const titlePos = arcFrom ?? bounds.center;\n const minArcSpan = Math.max(\n 300,\n estimateTitlePathWidth(\n title,\n appearance.titleFontSize,\n appearance.titleLetterSpacing,\n ),\n );\n\n const endOffsetX =\n arcFrom && arcTo ? (arcTo[0] - arcFrom[0]) * WORLD_TO_SVG : 0;\n const arcSpanNeeded = Math.max(minArcSpan, Math.abs(endOffsetX) + 48);\n const svgWidth = Math.max(\n 420,\n Math.ceil(arcSpanNeeded + ARC_HORIZONTAL_PAD * 2),\n );\n const svgHeight = 110;\n const viewPadX = 28;\n const viewPadY = 10;\n\n const centerX = svgWidth / 2;\n const arcY = svgHeight * 0.88;\n const arcPeak = svgHeight * 0.06;\n\n let arcStartX = centerX - minArcSpan / 2;\n let arcEndX = centerX + minArcSpan / 2;\n\n if (arcFrom && arcTo) {\n arcStartX = centerX;\n arcEndX = centerX + endOffsetX;\n if (arcStartX > arcEndX) {\n const swap = arcStartX;\n arcStartX = arcEndX;\n arcEndX = swap;\n }\n\n if (arcEndX - arcStartX < minArcSpan) {\n const mid = (arcStartX + arcEndX) / 2;\n arcStartX = mid - minArcSpan / 2;\n arcEndX = mid + minArcSpan / 2;\n }\n }\n\n const arcMargin = ARC_HORIZONTAL_PAD / 2;\n arcStartX = Math.max(arcMargin, arcStartX);\n arcEndX = Math.min(svgWidth - arcMargin, arcEndX);\n if (arcEndX - arcStartX < minArcSpan) {\n arcStartX = centerX - minArcSpan / 2;\n arcEndX = centerX + minArcSpan / 2;\n }\n\n const arcMidX = (arcStartX + arcEndX) / 2;\n const arcPath = `M ${arcStartX} ${arcY} Q ${arcMidX} ${arcPeak} ${arcEndX} ${arcY}`;\n\n const editable = !!(storyOverlay?.editable && storyOverlay.onEditClick);\n const hasDirector = !!(\n storyOverlay?.directorName && storyOverlay.directorName.trim()\n );\n const hasRatingGenre = !!(\n storyOverlay?.contentRating || storyOverlay?.genre\n );\n const showOverlay = hasDirector || hasRatingGenre;\n\n const titleControl = (\n <svg\n width={svgWidth}\n height={svgHeight}\n viewBox={`${-viewPadX} ${-viewPadY} ${svgWidth + viewPadX * 2} ${svgHeight + viewPadY}`}\n style={{\n overflow: \"visible\",\n display: \"block\",\n cursor: editable ? \"pointer\" : undefined,\n }}\n aria-hidden={editable ? undefined : true}\n role={editable ? \"button\" : undefined}\n tabIndex={editable ? 0 : undefined}\n aria-label={editable ? storyOverlay?.editAriaLabel : undefined}\n onClick={editable ? storyOverlay?.onEditClick : undefined}\n onKeyDown={\n editable\n ? (e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n storyOverlay?.onEditClick?.();\n }\n }\n : undefined\n }\n >\n <defs>\n <linearGradient id={gradientId} x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"0%\">\n <stop offset=\"0%\" stopColor=\"#8ab4c8\" />\n <stop offset=\"35%\" stopColor=\"#c8d8e4\" />\n <stop offset=\"65%\" stopColor=\"#e8dcc8\" />\n <stop offset=\"100%\" stopColor=\"#8ab4c8\" />\n </linearGradient>\n <path id={pathId} d={arcPath} fill=\"none\" />\n </defs>\n <text\n fill={`url(#${gradientId})`}\n fontFamily=\"'Palatino Linotype', Palatino, 'Book Antiqua', Georgia, serif\"\n fontSize={appearance.titleFontSize}\n fontWeight={700}\n fontStyle=\"italic\"\n letterSpacing={appearance.titleLetterSpacing}\n opacity={appearance.titleOpacity}\n stroke=\"rgba(20,40,60,0.35)\"\n strokeWidth={0.6}\n paintOrder=\"stroke fill\"\n style={{ pointerEvents: \"none\" }}\n >\n <textPath href={`#${pathId}`} startOffset=\"50%\" textAnchor=\"middle\">\n {title.toUpperCase()}\n </textPath>\n </text>\n </svg>\n );\n\n return (\n <Billboard\n position={[\n titlePos[0],\n titlePos[1] + appearance.titleYOffset,\n titlePos[2],\n ]}\n >\n <Html\n center\n transform\n distanceFactor={appearance.titleDistanceFactor}\n zIndexRange={appearance.htmlZIndexRange}\n occlude={false}\n style={{\n pointerEvents: editable ? \"auto\" : \"none\",\n userSelect: \"none\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n gap: 8,\n marginTop: 4,\n }}\n >\n {titleControl}\n\n {showOverlay ? (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n gap: 6,\n maxWidth: svgWidth,\n marginTop: 6,\n pointerEvents: \"none\",\n }}\n >\n {hasDirector ? (\n <DirectorCredit\n prefix={storyOverlay!.chosenByPrefix}\n name={storyOverlay!.directorName!}\n avatarUrl={storyOverlay!.directorAvatarUrl ?? null}\n avatarFallback={storyOverlay!.directorAvatarFallback}\n />\n ) : null}\n\n {hasRatingGenre ? (\n <RatingGenreLine\n contentRating={storyOverlay!.contentRating ?? null}\n genre={storyOverlay!.genre ?? null}\n separator={storyOverlay!.ratingGenreSeparator ?? \" · \"}\n />\n ) : null}\n </div>\n ) : null}\n </div>\n </Html>\n </Billboard>\n );\n}\n\nfunction DirectorCredit({\n prefix,\n name,\n avatarUrl,\n avatarFallback,\n}: {\n prefix: string;\n name: string;\n avatarUrl: string | null;\n avatarFallback?: ReactNode;\n}) {\n const initial = name.trim().charAt(0).toUpperCase() || \"?\";\n\n return (\n <div\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 6,\n fontSize: 11,\n color: \"rgba(232,240,255,0.72)\",\n letterSpacing: 0.35,\n textShadow: \"0 1px 8px rgba(0,0,0,0.95)\",\n whiteSpace: \"nowrap\",\n }}\n >\n <span style={{ opacity: 0.85 }}>{prefix}</span>\n <span\n style={{\n width: 20,\n height: 20,\n borderRadius: \"50%\",\n overflow: \"hidden\",\n flexShrink: 0,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n background: \"rgba(255,255,255,0.1)\",\n border: \"1px solid rgba(126,184,255,0.35)\",\n fontSize: 9,\n fontWeight: 700,\n color: \"rgba(232,240,255,0.9)\",\n }}\n >\n {avatarUrl ? (\n <img\n src={avatarUrl}\n alt=\"\"\n style={{ width: \"100%\", height: \"100%\", objectFit: \"cover\" }}\n />\n ) : avatarFallback ? (\n avatarFallback\n ) : (\n initial\n )}\n </span>\n <span style={{ fontWeight: 600 }}>{name}</span>\n </div>\n );\n}\n\nfunction RatingGenreLine({\n contentRating,\n genre,\n separator,\n}: {\n contentRating: string | null;\n genre: string | null;\n separator: string;\n}) {\n const parts: ReactNode[] = [];\n if (contentRating) {\n parts.push(\n <span key=\"rating\" style={{ fontWeight: 700 }}>\n {contentRating}\n </span>,\n );\n }\n if (genre) {\n parts.push(<span key=\"genre\">{genre}</span>);\n }\n if (parts.length === 0) return null;\n\n return (\n <div\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 0,\n fontSize: 10,\n letterSpacing: 0.5,\n textTransform: \"uppercase\",\n color: \"rgba(232,240,255,0.55)\",\n textShadow: \"0 1px 6px rgba(0,0,0,0.95)\",\n }}\n >\n {parts.map((part, i) => (\n <span key={i}>\n {i > 0 ? separator : null}\n {part}\n </span>\n ))}\n </div>\n );\n}\n","import { Html } from \"@react-three/drei\";\nimport type { ReactNode } from \"react\";\nimport type { ConstellationAppearance } from \"../appearance.js\";\n\nexport interface StarBillboardProps {\n label: string;\n appearance: ConstellationAppearance;\n previewImageUrl?: string | null;\n previewContent?: ReactNode;\n dimmed?: boolean;\n focused?: boolean;\n visible?: boolean;\n /** Control strip rendered flush beneath the preview when focused. */\n controlsSlot?: ReactNode;\n}\n\n/**\n * Floating preview card and scene label above a star. Unfocused previews\n * are dimmed; labels stay prominent. Anchor sits at preview bottom-center\n * so attached controls align with the card edge.\n */\nexport function StarBillboard({\n label,\n appearance,\n previewImageUrl,\n previewContent,\n dimmed,\n focused,\n visible = true,\n controlsSlot,\n}: StarBillboardProps) {\n if (!visible) return null;\n\n const borderColor = focused\n ? \"rgba(126,184,255,0.75)\"\n : \"rgba(126,184,255,0.22)\";\n const previewOpacity = focused ? 1 : dimmed ? 0.22 : 0.34;\n const previewFilter = focused\n ? \"brightness(1.08) saturate(1.1)\"\n : \"brightness(0.72) saturate(0.65)\";\n const hasControls = !!(focused && controlsSlot);\n\n return (\n <Html\n position={[0, appearance.previewOffsetY, 0]}\n center\n transform\n distanceFactor={appearance.billboardDistanceFactor}\n zIndexRange={appearance.htmlZIndexRange}\n occlude={false}\n style={{\n pointerEvents: \"none\",\n userSelect: \"none\",\n }}\n >\n <style>{`\n @keyframes chuziPreviewFocusIn {\n 0% { opacity: 0.4; transform: scale(0.9); filter: brightness(0.8) saturate(0.7); }\n 55% { opacity: 1; transform: scale(1.05); filter: brightness(1.12) saturate(1.15); }\n 100% { opacity: 1; transform: scale(1); filter: brightness(1.08) saturate(1.1); }\n }\n @keyframes chuziPreviewFocusOut {\n 0% { opacity: 1; transform: scale(1); }\n 100% { opacity: ${previewOpacity}; transform: scale(0.96); }\n }\n `}</style>\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n transform: `translateY(-${appearance.previewHeight / 2}px)`,\n }}\n >\n <div\n key={focused ? \"focused\" : \"unfocused\"}\n style={{\n width: appearance.previewWidth,\n height: appearance.previewHeight,\n borderRadius: hasControls ? \"8px 8px 0 0\" : 8,\n overflow: \"hidden\",\n border: `1px solid ${borderColor}`,\n borderBottom: hasControls ? \"none\" : `1px solid ${borderColor}`,\n background: \"rgba(4,7,13,0.92)\",\n boxShadow: focused\n ? \"0 0 28px rgba(126,184,255,0.45), 0 4px 24px rgba(0,0,0,0.5)\"\n : \"0 4px 20px rgba(0,0,0,0.55)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n opacity: previewOpacity,\n filter: previewFilter,\n transition: \"border-color 0.35s ease, box-shadow 0.35s ease\",\n animation: focused\n ? \"chuziPreviewFocusIn 0.48s cubic-bezier(0.34, 1.45, 0.64, 1) forwards\"\n : \"chuziPreviewFocusOut 0.32s ease forwards\",\n }}\n >\n {previewImageUrl ? (\n <img\n src={previewImageUrl}\n alt=\"\"\n style={{\n width: \"100%\",\n height: \"100%\",\n objectFit: \"cover\",\n display: \"block\",\n }}\n />\n ) : (\n previewContent ?? (\n <div\n style={{\n width: \"100%\",\n height: \"100%\",\n background:\n \"radial-gradient(ellipse at 30% 20%, rgba(80,120,200,0.2) 0%, rgba(10,14,30,0.95) 70%)\",\n }}\n />\n )\n )}\n </div>\n\n {hasControls ? (\n <div\n style={{\n width: appearance.previewWidth,\n pointerEvents: \"auto\",\n flexShrink: 0,\n }}\n >\n {controlsSlot}\n </div>\n ) : null}\n\n <div\n style={{\n marginTop: appearance.labelGap,\n fontSize: appearance.labelFontSize,\n fontWeight: 700,\n letterSpacing: appearance.labelLetterSpacing,\n textTransform: \"uppercase\",\n color: \"rgba(232,240,255,0.96)\",\n textAlign: \"center\",\n textShadow:\n \"0 0 18px rgba(0,0,0,0.95), 0 2px 12px rgba(0,0,0,0.95), 0 0 6px rgba(126,184,255,0.25)\",\n whiteSpace: \"normal\",\n lineHeight: 1.2,\n maxWidth: appearance.labelMaxWidth,\n overflow: \"hidden\",\n display: \"-webkit-box\",\n WebkitLineClamp: 2,\n WebkitBoxOrient: \"vertical\",\n }}\n >\n {label}\n </div>\n </div>\n </Html>\n );\n}\n","import type { ReactNode } from \"react\";\nimport type { AtomVisualProps } from \"../../index.js\";\nimport {\n mergeConstellationAppearance,\n type ConstellationAppearance,\n} from \"../appearance.js\";\nimport { Star } from \"./Star.js\";\nimport { ConstellationEdge } from \"./ConstellationEdge.js\";\nimport {\n ConstellationTitle,\n computeConstellationBounds,\n type ConstellationStoryOverlay,\n} from \"./ConstellationTitle.js\";\nimport { StarBillboard } from \"./StarBillboard.js\";\n\nexport interface ConstellationSceneEntry {\n id: string;\n /** Visual with final position already computed by the consumer. */\n visual: AtomVisualProps;\n /** Title scene — arc starts here. */\n isTitle?: boolean;\n /** End scene — arc ends here. */\n isEnd?: boolean;\n /** Scene label shown beneath the preview card. */\n label?: string;\n /** Static preview image (coverbox, poster frame, etc.). */\n previewImageUrl?: string | null;\n /** Custom preview when no image URL is available. */\n previewContent?: ReactNode;\n /** When true the star renders at reduced brightness/saturation. */\n dimmed?: boolean;\n /** When true the star is non-navigable (click suppressed). */\n locked?: boolean;\n /** Highlight this star's billboard (focused traversal). */\n focused?: boolean;\n /** Control strip slot — rendered beneath preview when focused. */\n controlsSlot?: ReactNode;\n}\n\nexport interface ConstellationEdgeEntry {\n source: string;\n target: string;\n type: \"choice\" | \"go_to_scene\" | \"sequential\";\n}\n\nexport interface ConstellationProps {\n /** Scene entries with positions already computed by the consumer. */\n scenes: ConstellationSceneEntry[];\n /** Film title rendered as ghost typography across the group. */\n storyTitle?: string;\n /** Director credit, rating, and genre beneath the arched title. */\n storyOverlay?: ConstellationStoryOverlay;\n /** Explicit story-flow edges (goto + choice). No implicit sequential links. */\n edges?: ConstellationEdgeEntry[];\n appearance?: Partial<ConstellationAppearance>;\n /** When false, hide Html billboards and arc title (e.g. while editor is open). */\n showOverlays?: boolean;\n onSceneSelect?: (index: number) => void;\n}\n\n/**\n * A single story rendered as a constellation: scene-stars connected by\n * luminous gradient edges. This is the cosmos realm's `Group` component —\n * identical rendering for own and others' stories.\n */\nexport function Constellation({\n scenes,\n storyTitle,\n storyOverlay,\n edges = [],\n appearance: appearanceOverrides,\n showOverlays = true,\n onSceneSelect,\n}: ConstellationProps) {\n const appearance = mergeConstellationAppearance(appearanceOverrides);\n const sceneMap = new Map(scenes.map((s, i) => [s.id, { entry: s, index: i }]));\n const bounds = computeConstellationBounds(\n scenes.map((s) => s.visual.position),\n );\n\n const titleScene =\n scenes.find((s) => s.isTitle) ?? scenes[0];\n const endScene =\n scenes.find((s) => s.isEnd) ??\n scenes[scenes.length - 1];\n\n const resolvedEdges: {\n from: ConstellationSceneEntry;\n to: ConstellationSceneEntry;\n type: ConstellationEdgeEntry[\"type\"];\n }[] = [];\n\n for (const edge of edges) {\n const src = sceneMap.get(edge.source);\n const tgt = sceneMap.get(edge.target);\n if (src && tgt) {\n resolvedEdges.push({ from: src.entry, to: tgt.entry, type: edge.type });\n }\n }\n\n return (\n <group>\n {showOverlays && storyTitle && bounds ? (\n <ConstellationTitle\n title={storyTitle}\n bounds={bounds}\n appearance={appearance}\n arcFrom={titleScene?.visual.position}\n arcTo={endScene?.visual.position}\n storyOverlay={storyOverlay}\n />\n ) : null}\n\n {scenes.map((entry, i) => (\n <group key={entry.id} position={entry.visual.position}>\n <Star\n visual={{ ...entry.visual, position: [0, 0, 0] }}\n dimmed={entry.dimmed}\n locked={entry.locked}\n onSelect={onSceneSelect ? () => onSceneSelect(i) : undefined}\n />\n\n {showOverlays &&\n (entry.label || entry.previewImageUrl || entry.previewContent) ? (\n <StarBillboard\n label={entry.label ?? \"\"}\n appearance={appearance}\n previewImageUrl={entry.previewImageUrl}\n previewContent={entry.previewContent}\n dimmed={entry.dimmed}\n focused={entry.focused}\n controlsSlot={entry.controlsSlot}\n visible={showOverlays}\n />\n ) : null}\n </group>\n ))}\n\n {resolvedEdges.map(({ from, to, type }) => {\n const edgeDimmed = !!(from.dimmed || to.dimmed);\n return (\n <ConstellationEdge\n key={`edge-${from.id}-${to.id}-${type}`}\n from={from.visual.position}\n to={to.visual.position}\n hueA={from.visual.hue}\n hueB={to.visual.hue}\n intensityA={from.visual.intensity}\n intensityB={to.visual.intensity}\n dimmed={edgeDimmed}\n />\n );\n })}\n </group>\n );\n}\n\n","import type { StoryListItem } from \"../../types/index.js\";\nimport type { AtomMapping, AtomState, AudioPalette, MotionTokens } from \"../index.js\";\n\n/**\n * COSMOS realm — pure-data layer. The 3D components (World, Star, NavRig,\n * EngageTransition) live in a follow-up package once the JSX build is\n * wired up; this file owns the realm's mapping and tuning constants so\n * they can be consumed today by any non-3D surface (catalog list, search,\n * preview cards, sound design tooling).\n *\n * Mapping rationale:\n * runtime → scale (longer film = bigger star)\n * popularity → intensity (more watches = brighter)\n * mood → hue (warm/cool palette by tone)\n * genre → spectral hint (small offset on top of mood, reads as\n * \"stellar class\" — drama is yellow-G,\n * thriller is blue-O, romance is red-M).\n * state → orbit-ring rendering (handled by Atom component).\n */\n\nconst GENRE_HUE_OFFSET: Record<string, number> = {\n drama: 50,\n thriller: 220,\n horror: 0,\n comedy: 35,\n romance: 340,\n scifi: 200,\n documentary: 180,\n animation: 280,\n};\n\nconst MOOD_HUE: Record<string, number> = {\n bright: 50,\n warm: 25,\n bittersweet: 290,\n somber: 230,\n tense: 210,\n playful: 110,\n melancholy: 250,\n};\n\nfunction clamp01(n: number): number {\n return Math.max(0, Math.min(1, n));\n}\n\nfunction popularityToIntensity(film: StoryListItem): number {\n // Log-compress: a 100x more-watched film should not be 100x brighter.\n const watches = Math.max(0, film.watch_starts_count);\n const log = Math.log10(1 + watches);\n // Rough cap at ~6 (1M watches saturates the scale).\n return clamp01(log / 6);\n}\n\nfunction deriveScale(film: StoryListItem): number {\n // We don't have runtime in StoryListItem yet; proxy with scenes_count.\n // Caps the starfield from going visually noisy.\n const scenes = film.scenes_count ?? 1;\n return clamp01(0.25 + Math.log10(1 + scenes) / 4);\n}\n\nfunction deriveHue(film: StoryListItem): number {\n const genreKey = (film.genre ?? \"\").toLowerCase().replace(/[^a-z]/g, \"\");\n const moodKey = \"\";\n const moodHue = MOOD_HUE[moodKey];\n const genreOffset = GENRE_HUE_OFFSET[genreKey];\n if (moodHue !== undefined) return moodHue;\n if (genreOffset !== undefined) return genreOffset;\n return 210;\n}\n\nfunction deriveState(film: StoryListItem): AtomState {\n // Without per-user progress threaded through, default; the consuming\n // app will overlay state from CatalogResponse.meta.progress.\n return film.published ? \"default\" : \"new\";\n}\n\nexport const cosmosMapping: AtomMapping = (film) => ({\n position: [0, 0, 0], // assigned by the realm's spatial layouter\n scale: deriveScale(film),\n hue: deriveHue(film),\n intensity: popularityToIntensity(film),\n state: deriveState(film),\n metadata: {\n title: film.title,\n popularity: film.watch_starts_count,\n genre: film.genre,\n },\n});\n\nexport const cosmosMotion: MotionTokens = {\n flightAcceleration: 14,\n flightDamping: 0.92,\n focusEaseMs: 380,\n engageDurationMs: 900,\n backDurationMs: 900,\n};\n\nexport {\n DEFAULT_CONSTELLATION_APPEARANCE,\n mergeConstellationAppearance,\n} from \"./appearance.js\";\nexport type { ConstellationAppearance } from \"./appearance.js\";\n\nexport const cosmosAudio: AudioPalette = {\n // Asset paths are resolved by the host app's asset bundler; chuzi-shared\n // only declares the contract. Replace with CDN URLs at integration time.\n ambientLoop: \"audio/cosmos/ambient-deep.ogg\",\n focusChime: \"audio/cosmos/focus-shimmer.ogg\",\n engageImpact: \"audio/cosmos/dolly-in.ogg\",\n backWhoosh: \"audio/cosmos/dolly-out.ogg\",\n};\n","/**\n * Spatial distribution helpers for the cosmos realm. Kept as a stand-alone\n * module so non-3D surfaces (search overlays, accessibility list view,\n * minimap) can compute and reuse positions without pulling in three.js.\n */\n\nexport type Vec3 = [number, number, number];\n\nexport interface DistributeOptions {\n /** Outer radius of the disk in world units. */\n radius?: number;\n /** Vertical jitter band (±). Larger values flatten the disk less. */\n thickness?: number;\n /** Deterministic seed; identical seeds produce identical layouts. */\n seed?: number;\n}\n\n/**\n * Galaxy-disk distribution: stars cluster denser toward the center\n * (sqrt-r weighting), with a vertical jitter band. Deterministic when a\n * seed is provided so the same catalog produces the same starfield across\n * sessions.\n */\nexport function distributeStars(\n count: number,\n options: DistributeOptions = {},\n): Vec3[] {\n const radius = options.radius ?? 25;\n const thickness = options.thickness ?? 4;\n const random = options.seed !== undefined ? mulberry32(options.seed) : Math.random;\n\n const positions: Vec3[] = [];\n for (let i = 0; i < count; i++) {\n const r = Math.sqrt(random()) * radius;\n const theta = random() * Math.PI * 2;\n const y = (random() - 0.5) * thickness;\n positions.push([Math.cos(theta) * r, y, Math.sin(theta) * r]);\n }\n return positions;\n}\n\nfunction mulberry32(seed: number): () => number {\n let s = seed >>> 0;\n return () => {\n s = (s + 0x6d2b79f5) >>> 0;\n let t = s;\n t = Math.imul(t ^ (t >>> 15), t | 1);\n t ^= t + Math.imul(t ^ (t >>> 7), t | 61);\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n };\n}\n\n/** World-space gap between parent and child along −Z (away from the viewer). */\nexport const COSMOS_SCENE_LEVEL_SPACING = 7;\n\n/** Lateral gap between sibling branches at the same parent. */\nexport const COSMOS_BRANCH_SIBLING_SPACING = 5.5;\n\n/** Minimum clearance between scene star centers in the XZ plane. */\nexport const COSMOS_MIN_NODE_CLEARANCE = 5;\n\n/** Minimum clearance between unrelated edge segments in the XZ plane. */\nexport const COSMOS_MIN_EDGE_CLEARANCE = 2.2;\n\n/** @deprecated API x multiplier — 3D layout uses parent-relative BFS instead. */\nexport const COSMOS_SCENE_BRANCH_SPACING = 1.6;\n\n/** Maximum distance between two connected scene stars (fallback spine only). */\nexport const COSMOS_MAX_SCENE_EDGE_LENGTH = 14;\n\n/** Minimum empty space between constellation bounds, in scene spacings. */\nexport const COSMOS_CONSTELLATION_GAP_SCENES = 2;\n\n/** Halo around a lone title star before scenes load. */\nexport const COSMOS_DEFAULT_FOOTPRINT_RADIUS = 10;\n\n/** Extra world units around the outermost scene for billboards / focus glow. */\nexport const COSMOS_CONSTELLATION_VISUAL_PADDING = 6;\n\nconst GOLDEN_ANGLE = 2.399963229728653;\n\nexport interface ConstellationLayoutScene {\n id: string;\n is_title?: boolean;\n is_end?: boolean;\n order?: number;\n created_at?: string;\n}\n\nexport interface ConstellationLayoutEdge {\n source: string;\n target: string;\n}\n\nexport interface ConstellationLayoutNode {\n id: string;\n level: number;\n x: number;\n index?: number;\n}\n\nexport interface ConstellationLayoutGraph {\n nodes: ConstellationLayoutNode[];\n edges?: ConstellationLayoutEdge[];\n meta?: { root_id?: string | null };\n}\n\nexport interface ConstellationAnchorInput {\n id: string;\n footprintRadius: number;\n}\n\nexport interface ConstellationAnchorOptions {\n /** Gap between constellation bounds in scene spacings (default 2). */\n minGapScenes?: number;\n levelSpacing?: number;\n visualPadding?: number;\n}\n\nfunction sortScenesForConstellationLayout(\n sceneList: ConstellationLayoutScene[],\n): ConstellationLayoutScene[] {\n return [...sceneList].sort((a, b) => {\n if (a.is_title !== b.is_title) return a.is_title ? -1 : 1;\n if (a.is_end !== b.is_end) return a.is_end ? 1 : -1;\n const orderA = a.order ?? 0;\n const orderB = b.order ?? 0;\n if (orderA !== orderB) return orderA - orderB;\n return (a.created_at ?? \"\").localeCompare(b.created_at ?? \"\");\n });\n}\n\nfunction orderScenesForConstellationLayout(\n sceneList: ConstellationLayoutScene[],\n graph: ConstellationLayoutGraph | undefined,\n): ConstellationLayoutScene[] {\n if (!graph?.nodes?.length) return sortScenesForConstellationLayout(sceneList);\n\n const sceneById = new Map(sceneList.map((scene) => [scene.id, scene]));\n const ordered: ConstellationLayoutScene[] = [];\n const seen = new Set<string>();\n\n const sortedNodes = [...graph.nodes].sort((a, b) => {\n if (a.level !== b.level) return a.level - b.level;\n if (a.x !== b.x) return a.x - b.x;\n return (a.index ?? 0) - (b.index ?? 0);\n });\n\n for (const node of sortedNodes) {\n const scene = sceneById.get(node.id);\n if (scene && !seen.has(scene.id)) {\n ordered.push(scene);\n seen.add(scene.id);\n }\n }\n\n for (const scene of sortScenesForConstellationLayout(sceneList)) {\n if (!seen.has(scene.id)) {\n ordered.push(scene);\n seen.add(scene.id);\n }\n }\n\n return ordered;\n}\n\nfunction hashSceneId(id: string, salt = \"\"): number {\n let h = 0;\n const key = id + salt;\n for (let i = 0; i < key.length; i++) {\n h = (h * 31 + key.charCodeAt(i)) >>> 0;\n }\n return h / 4294967296;\n}\n\nfunction clampEdgeLength(\n positions: Map<string, Vec3>,\n sourceId: string,\n targetId: string,\n maxLength: number,\n): void {\n const src = positions.get(sourceId);\n const tgt = positions.get(targetId);\n if (!src || !tgt) return;\n\n const dx = tgt[0] - src[0];\n const dy = tgt[1] - src[1];\n const dz = tgt[2] - src[2];\n const len = Math.hypot(dx, dy, dz);\n if (len <= maxLength || len === 0) return;\n\n const scale = maxLength / len;\n positions.set(targetId, [\n src[0] + dx * scale,\n src[1] + dy * scale,\n src[2] + dz * scale,\n ]);\n}\n\nfunction buildChildrenByParent(\n edges: ConstellationLayoutEdge[],\n): Map<string, string[]> {\n const childrenByParent = new Map<string, string[]>();\n\n for (const edge of edges) {\n const kids = childrenByParent.get(edge.source) ?? [];\n if (!kids.includes(edge.target)) {\n kids.push(edge.target);\n }\n childrenByParent.set(edge.source, kids);\n }\n\n return childrenByParent;\n}\n\nfunction sceneLevelJitter(sceneId: string): number {\n return (hashSceneId(sceneId, \"y\") - 0.5) * 1.2;\n}\n\ntype Segment2D = { ax: number; az: number; bx: number; bz: number };\n\nfunction distPointSegment2D(\n px: number,\n pz: number,\n ax: number,\n az: number,\n bx: number,\n bz: number,\n): number {\n const dx = bx - ax;\n const dz = bz - az;\n const lenSq = dx * dx + dz * dz;\n if (lenSq === 0) return Math.hypot(px - ax, pz - az);\n const t = Math.max(0, Math.min(1, ((px - ax) * dx + (pz - az) * dz) / lenSq));\n const cx = ax + t * dx;\n const cz = az + t * dz;\n return Math.hypot(px - cx, pz - cz);\n}\n\nfunction distSegmentSegment2D(a: Segment2D, b: Segment2D): number {\n if (\n (a.ax === a.bx && a.az === a.bz) ||\n (b.ax === b.bx && b.az === b.bz)\n ) {\n const pointSeg = a.ax === a.bx && a.az === a.bz ? b : a;\n const px = a.ax === a.bx && a.az === a.bz ? a.ax : b.ax;\n const pz = a.ax === a.bx && a.az === a.bz ? a.az : b.az;\n return distPointSegment2D(\n px,\n pz,\n pointSeg.ax,\n pointSeg.az,\n pointSeg.bx,\n pointSeg.bz,\n );\n }\n\n const checks = [\n distPointSegment2D(a.ax, a.az, b.ax, b.az, b.bx, b.bz),\n distPointSegment2D(a.bx, a.bz, b.ax, b.az, b.bx, b.bz),\n distPointSegment2D(b.ax, b.az, a.ax, a.az, a.bx, a.bz),\n distPointSegment2D(b.bx, b.bz, a.ax, a.az, a.bx, a.bz),\n ];\n return Math.min(...checks);\n}\n\nfunction collectEdgeSegments(\n positions: Map<string, Vec3>,\n edges: ConstellationLayoutEdge[],\n exclude?: { source: string; target: string },\n): Segment2D[] {\n const segments: Segment2D[] = [];\n for (const edge of edges) {\n if (\n exclude &&\n edge.source === exclude.source &&\n edge.target === exclude.target\n ) {\n continue;\n }\n const src = positions.get(edge.source);\n const tgt = positions.get(edge.target);\n if (!src || !tgt) continue;\n segments.push({ ax: src[0], az: src[2], bx: tgt[0], bz: tgt[2] });\n }\n return segments;\n}\n\nfunction edgeClearanceOk(\n positions: Map<string, Vec3>,\n edges: ConstellationLayoutEdge[],\n sourceId: string,\n targetId: string,\n minClearance: number,\n): boolean {\n const src = positions.get(sourceId);\n const tgt = positions.get(targetId);\n if (!src || !tgt) return true;\n\n const candidate: Segment2D = {\n ax: src[0],\n az: src[2],\n bx: tgt[0],\n bz: tgt[2],\n };\n const existing = collectEdgeSegments(positions, edges, {\n source: sourceId,\n target: targetId,\n });\n\n return existing.every(\n (seg) =>\n distSegmentSegment2D(candidate, seg) >= minClearance ||\n (seg.ax === candidate.ax &&\n seg.az === candidate.az &&\n seg.bx === candidate.bx &&\n seg.bz === candidate.bz),\n );\n}\n\nfunction nodeClearanceOk(\n positions: Map<string, Vec3>,\n sceneId: string,\n pos: Vec3,\n minClearance: number,\n): boolean {\n for (const [otherId, otherPos] of positions) {\n if (otherId === sceneId) continue;\n if (Math.hypot(pos[0] - otherPos[0], pos[2] - otherPos[2]) < minClearance) {\n return false;\n }\n }\n return true;\n}\n\nfunction organicChildOffset(\n parentId: string,\n childId: string,\n childIndex: number,\n siblingCount: number,\n nodeCount: number,\n): [number, number] {\n const fanSpread = Math.min(\n Math.PI * 0.9,\n 0.28 * siblingCount + 0.22 * Math.sqrt(nodeCount),\n );\n const mid = (siblingCount - 1) / 2;\n const baseAngle =\n hashSceneId(parentId, \"fan\") * Math.PI * 2 +\n (childIndex - mid) * (fanSpread / Math.max(siblingCount - 1, 1));\n const reach =\n COSMOS_BRANCH_SIBLING_SPACING *\n (0.75 + hashSceneId(childId, \"reach\") * 0.65 + Math.min(nodeCount, 8) * 0.04);\n return [Math.cos(baseAngle) * reach, Math.sin(baseAngle) * reach * 0.18];\n}\n\nfunction placeChildScene(\n parentPos: Vec3,\n parentId: string,\n childId: string,\n childIndex: number,\n siblingCount: number,\n nodeCount: number,\n): Vec3 {\n const depthStep =\n COSMOS_SCENE_LEVEL_SPACING *\n (0.82 + hashSceneId(childId, \"depth\") * 0.28);\n const [ox, oz] = organicChildOffset(\n parentId,\n childId,\n childIndex,\n siblingCount,\n nodeCount,\n );\n\n return [\n parentPos[0] + ox,\n parentPos[1] + sceneLevelJitter(childId),\n parentPos[2] - depthStep + oz,\n ];\n}\n\nfunction resolveNodeOverlaps(\n positions: Map<string, Vec3>,\n minClearance: number,\n pinnedIds: ReadonlySet<string> = new Set(),\n): void {\n const ids = [...positions.keys()];\n for (let pass = 0; pass < 6; pass++) {\n let moved = false;\n for (let i = 0; i < ids.length; i++) {\n for (let j = i + 1; j < ids.length; j++) {\n const aId = ids[i];\n const bId = ids[j];\n const a = positions.get(aId)!;\n const b = positions.get(bId)!;\n const dx = b[0] - a[0];\n const dz = b[2] - a[2];\n const dist = Math.hypot(dx, dz);\n if (dist >= minClearance || dist === 0) continue;\n\n const push = (minClearance - dist) * 0.55;\n const nx = dx / (dist || 1);\n const nz = dz / (dist || 1);\n if (!pinnedIds.has(aId)) {\n positions.set(aId, [a[0] - nx * push, a[1], a[2] - nz * push]);\n }\n if (!pinnedIds.has(bId)) {\n positions.set(bId, [b[0] + nx * push, b[1], b[2] + nz * push]);\n }\n moved = true;\n }\n }\n if (!moved) break;\n }\n}\n\nfunction resolveEdgeOverlaps(\n positions: Map<string, Vec3>,\n edges: ConstellationLayoutEdge[],\n minClearance: number,\n): void {\n for (let pass = 0; pass < 4; pass++) {\n let adjusted = false;\n for (const edge of edges) {\n const src = positions.get(edge.source);\n const tgt = positions.get(edge.target);\n if (!src || !tgt) continue;\n\n const candidate: Segment2D = {\n ax: src[0],\n az: src[2],\n bx: tgt[0],\n bz: tgt[2],\n };\n const others = collectEdgeSegments(positions, edges, edge);\n\n for (const other of others) {\n if (distSegmentSegment2D(candidate, other) >= minClearance) continue;\n\n const nudge =\n (hashSceneId(edge.target, `edge-${pass}`) - 0.5) *\n COSMOS_BRANCH_SIBLING_SPACING *\n 0.35;\n positions.set(edge.target, [\n tgt[0] + nudge,\n tgt[1],\n tgt[2] - minClearance * 0.15,\n ]);\n adjusted = true;\n break;\n }\n }\n if (!adjusted) break;\n }\n}\n\nfunction placeEndScenes(\n ordered: ConstellationLayoutScene[],\n positions: Map<string, Vec3>,\n anchor: Vec3,\n): void {\n let deepestZ = anchor[2];\n for (const pos of positions.values()) {\n deepestZ = Math.min(deepestZ, pos[2]);\n }\n\n const endScenes = ordered.filter((scene) => scene.is_end);\n endScenes.forEach((scene, idx) => {\n const endAngle =\n hashSceneId(scene.id, \"end\") * Math.PI * 2 +\n idx * GOLDEN_ANGLE * 0.35;\n const endSpread =\n COSMOS_BRANCH_SIBLING_SPACING *\n (1.4 + hashSceneId(scene.id, \"end-r\") * 0.8);\n positions.set(scene.id, [\n anchor[0] + Math.cos(endAngle) * endSpread,\n anchor[1] + sceneLevelJitter(scene.id),\n deepestZ - COSMOS_SCENE_LEVEL_SPACING,\n ]);\n });\n}\n\nfunction layoutFromGraphEdges(\n ordered: ConstellationLayoutScene[],\n edges: ConstellationLayoutEdge[],\n root: ConstellationLayoutScene,\n anchor: Vec3,\n): Map<string, Vec3> {\n const positions = new Map<string, Vec3>();\n const sceneById = new Map(ordered.map((scene) => [scene.id, scene]));\n const orderIndex = new Map(ordered.map((scene, idx) => [scene.id, idx]));\n const nodeCount = ordered.length;\n\n positions.set(root.id, [anchor[0], anchor[1], anchor[2]]);\n\n const childrenByParent = buildChildrenByParent(edges);\n for (const kids of childrenByParent.values()) {\n kids.sort(\n (a, b) => (orderIndex.get(a) ?? 0) - (orderIndex.get(b) ?? 0),\n );\n }\n\n const visited = new Set<string>([root.id]);\n const queue = [root.id];\n\n while (queue.length > 0) {\n const parentId = queue.shift()!;\n const parentPos = positions.get(parentId);\n if (!parentPos) continue;\n\n const kids = (childrenByParent.get(parentId) ?? []).filter(\n (childId) => sceneById.has(childId) && !sceneById.get(childId)?.is_end,\n );\n\n kids.forEach((childId, idx) => {\n if (visited.has(childId)) return;\n\n let candidate = placeChildScene(\n parentPos,\n parentId,\n childId,\n idx,\n kids.length,\n nodeCount,\n );\n\n for (let attempt = 0; attempt < 10; attempt++) {\n const attemptAngle =\n hashSceneId(childId, `try-${attempt}`) * Math.PI * 2;\n if (attempt > 0) {\n const reach = COSMOS_BRANCH_SIBLING_SPACING * (0.6 + attempt * 0.12);\n candidate = [\n parentPos[0] + Math.cos(attemptAngle) * reach,\n parentPos[1] + sceneLevelJitter(childId),\n parentPos[2] -\n COSMOS_SCENE_LEVEL_SPACING *\n (0.85 + hashSceneId(childId, `d-${attempt}`) * 0.25),\n ];\n }\n\n const trial = new Map(positions);\n trial.set(childId, candidate);\n if (\n nodeClearanceOk(positions, childId, candidate, COSMOS_MIN_NODE_CLEARANCE) &&\n edgeClearanceOk(\n trial,\n edges,\n parentId,\n childId,\n COSMOS_MIN_EDGE_CLEARANCE,\n )\n ) {\n break;\n }\n }\n\n positions.set(childId, candidate);\n visited.add(childId);\n queue.push(childId);\n });\n }\n\n placeEndScenes(ordered, positions, anchor);\n\n let spineLevel = 0;\n for (const scene of ordered) {\n if (positions.has(scene.id)) continue;\n spineLevel += 1;\n const angle = spineLevel * GOLDEN_ANGLE + hashSceneId(scene.id) * 0.55;\n const reach =\n COSMOS_BRANCH_SIBLING_SPACING *\n (0.8 + hashSceneId(scene.id, \"spine\") * 0.7);\n positions.set(scene.id, [\n anchor[0] + Math.cos(angle) * reach,\n anchor[1] + sceneLevelJitter(scene.id),\n anchor[2] - spineLevel * COSMOS_SCENE_LEVEL_SPACING,\n ]);\n }\n\n resolveNodeOverlaps(\n positions,\n COSMOS_MIN_NODE_CLEARANCE,\n new Set([root.id]),\n );\n resolveEdgeOverlaps(positions, edges, COSMOS_MIN_EDGE_CLEARANCE);\n\n return positions;\n}\n\n/**\n * Scene positions relative to the title star at the constellation anchor.\n * The title sits closest to the viewer (+Z); the story recedes along −Z with\n * organic lateral spread. Without edges, scenes use a golden-angle spine.\n */\nexport function computeConstellationScenePositions(\n scenes: ConstellationLayoutScene[],\n graph: ConstellationLayoutGraph | undefined,\n anchor: Vec3 = [0, 0, 0],\n): Map<string, Vec3> {\n const positions = new Map<string, Vec3>();\n const ordered = orderScenesForConstellationLayout(scenes, graph);\n if (ordered.length === 0) return positions;\n\n const root =\n ordered.find((scene) => scene.is_title) ??\n ordered[0];\n\n const edges = graph?.edges ?? [];\n if (edges.length > 0) {\n return layoutFromGraphEdges(ordered, edges, root, anchor);\n }\n\n positions.set(root.id, [anchor[0], anchor[1], anchor[2]]);\n const nodeCount = ordered.length;\n\n let spineIndex = 0;\n for (const scene of ordered) {\n if (scene.id === root.id) continue;\n if (scene.is_end) continue;\n\n const angle = spineIndex * GOLDEN_ANGLE + hashSceneId(scene.id) * 0.55;\n const reach =\n COSMOS_BRANCH_SIBLING_SPACING *\n (0.85 + hashSceneId(scene.id, \"d\") * 0.75 + Math.min(nodeCount, 8) * 0.05);\n const depthStep =\n COSMOS_SCENE_LEVEL_SPACING *\n (0.85 + hashSceneId(scene.id, \"depth\") * 0.25);\n\n positions.set(scene.id, [\n anchor[0] + Math.cos(angle) * reach,\n anchor[1] + sceneLevelJitter(scene.id),\n anchor[2] - (spineIndex + 1) * depthStep,\n ]);\n spineIndex += 1;\n }\n\n placeEndScenes(ordered, positions, anchor);\n\n for (let i = 1; i < ordered.length; i++) {\n clampEdgeLength(\n positions,\n ordered[i - 1].id,\n ordered[i].id,\n COSMOS_MAX_SCENE_EDGE_LENGTH,\n );\n }\n\n resolveNodeOverlaps(\n positions,\n COSMOS_MIN_NODE_CLEARANCE,\n new Set([root.id]),\n );\n\n return positions;\n}\n\n/** Bounding radius from the title anchor to the outermost scene plus visual padding. */\nexport function constellationFootprintRadius(\n localPositions: Map<string, Vec3>,\n padding: number = COSMOS_CONSTELLATION_VISUAL_PADDING,\n): number {\n let maxReach = COSMOS_DEFAULT_FOOTPRINT_RADIUS;\n for (const [x, , z] of localPositions.values()) {\n maxReach = Math.max(maxReach, Math.hypot(x, z) + padding);\n }\n return maxReach;\n}\n\nfunction circlesSeparated(\n ax: number,\n az: number,\n aRadius: number,\n bx: number,\n bz: number,\n bRadius: number,\n minGap: number,\n): boolean {\n return Math.hypot(ax - bx, az - bz) >= aRadius + bRadius + minGap;\n}\n\nfunction findConstellationAnchor(\n footprintRadius: number,\n placed: Array<{ x: number; z: number; radius: number }>,\n minGap: number,\n): Vec3 {\n if (placed.length === 0) return [0, 0, 0];\n\n let angle = 0;\n let radius = 0;\n const angleStep = 0.62;\n const radiusGrowth = minGap * 0.75;\n\n for (let attempt = 0; attempt < 8000; attempt++) {\n angle += angleStep;\n radius += radiusGrowth / (2 * Math.PI);\n const cx = Math.cos(angle) * radius;\n const cz = Math.sin(angle) * radius;\n const ok = placed.every((other) =>\n circlesSeparated(cx, cz, footprintRadius, other.x, other.z, other.radius, minGap),\n );\n if (ok) return [cx, 0, cz];\n }\n\n const fallback = placed.length * (minGap + footprintRadius * 2);\n return [fallback, 0, 0];\n}\n\n/**\n * Place constellation anchors so each title star stays outside other\n * constellations, with at least `minGapScenes` scene spacings between bounds.\n */\nexport function distributeConstellationAnchors(\n items: ConstellationAnchorInput[],\n options: ConstellationAnchorOptions = {},\n): Map<string, Vec3> {\n const minGapScenes = options.minGapScenes ?? COSMOS_CONSTELLATION_GAP_SCENES;\n const levelSpacing = options.levelSpacing ?? COSMOS_SCENE_LEVEL_SPACING;\n const minGap = minGapScenes * levelSpacing;\n\n const anchors = new Map<string, Vec3>();\n const placed: Array<{ x: number; z: number; radius: number }> = [];\n\n for (const item of items) {\n const [x, , z] = findConstellationAnchor(item.footprintRadius, placed, minGap);\n anchors.set(item.id, [x, 0, z]);\n placed.push({ x, z, radius: item.footprintRadius });\n }\n\n return anchors;\n}\n","import { useMemo } from \"react\";\nimport type { StoryListItem } from \"../../../types/index.js\";\nimport { cosmosMapping } from \"../index.js\";\nimport { Star } from \"./Star.js\";\nimport { World } from \"./World.js\";\nimport { distributeStars, type Vec3 } from \"./layout.js\";\n\nexport interface CosmosSandboxProps {\n films: StoryListItem[];\n onFilmSelect?: (film: StoryListItem) => void;\n /** Layout seed — same seed + same films = same layout. */\n seed?: number;\n}\n\n/**\n * Drop-in 3D sandbox. Hands a list of films, gets back a navigable\n * starfield where each star is a film. Useful for: integration tests, the\n * realm-picker preview thumbnail, the editor's \"preview as star\" mode, and\n * as the smoke-test entry while migrating chuzi-web off Laravel.\n */\nexport function CosmosSandbox({\n films,\n onFilmSelect,\n seed = 1,\n}: CosmosSandboxProps) {\n const placed = useMemo(() => {\n const positions: Vec3[] = distributeStars(films.length, { seed });\n return films.map((film, i) => ({\n film,\n visual: { ...cosmosMapping(film), position: positions[i] },\n }));\n }, [films, seed]);\n\n return (\n <World>\n {placed.map(({ film, visual }) => (\n <Star\n key={film.id}\n visual={visual}\n onSelect={onFilmSelect ? () => onFilmSelect(film) : undefined}\n />\n ))}\n </World>\n );\n}\n"]}
|
package/package.json
CHANGED