@chuzi/shared 1.3.38 → 1.3.40

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.
@@ -35,6 +35,42 @@ interface StarProps {
35
35
  */
36
36
  declare function Star({ visual, onSelect, dimmed, locked }: StarProps): react_jsx_runtime.JSX.Element;
37
37
 
38
+ interface ConstellationBounds {
39
+ center: [number, number, number];
40
+ spanX: number;
41
+ spanZ: number;
42
+ }
43
+ declare function computeConstellationBounds(positions: [number, number, number][]): ConstellationBounds | null;
44
+ interface ConstellationStoryOverlay {
45
+ /** Localized prefix, e.g. "Chosen by". */
46
+ chosenByPrefix: string;
47
+ directorName?: string | null;
48
+ directorAvatarUrl?: string | null;
49
+ contentRating?: string | null;
50
+ genre?: string | null;
51
+ /** Shown between rating and genre. */
52
+ ratingGenreSeparator?: string;
53
+ /** When true the arched title is clickable. */
54
+ editable?: boolean;
55
+ onEditClick?: () => void;
56
+ /** Accessible label for the editable title control. */
57
+ editAriaLabel?: string;
58
+ }
59
+ interface ConstellationTitleProps {
60
+ title: string;
61
+ bounds: ConstellationBounds;
62
+ appearance: ConstellationAppearance;
63
+ /** World position of the title (first) scene — arc starts here. */
64
+ arcFrom?: [number, number, number];
65
+ /** World position of the end scene — arc ends here. */
66
+ arcTo?: [number, number, number];
67
+ storyOverlay?: ConstellationStoryOverlay;
68
+ }
69
+ /**
70
+ * Vintage cartography-style ocean label arcing from title scene to end scene.
71
+ */
72
+ declare function ConstellationTitle({ title, bounds, appearance, arcFrom, arcTo, storyOverlay, }: ConstellationTitleProps): react_jsx_runtime.JSX.Element | null;
73
+
38
74
  interface ConstellationSceneEntry {
39
75
  id: string;
40
76
  /** Visual with final position already computed by the consumer. */
@@ -64,6 +100,8 @@ interface ConstellationProps {
64
100
  scenes: ConstellationSceneEntry[];
65
101
  /** Film title rendered as ghost typography across the group. */
66
102
  storyTitle?: string;
103
+ /** Director credit, rating, and genre beneath the arched title. */
104
+ storyOverlay?: ConstellationStoryOverlay;
67
105
  /** Explicit story-flow edges (goto + choice). No implicit sequential links. */
68
106
  edges?: ConstellationEdgeEntry[];
69
107
  appearance?: Partial<ConstellationAppearance>;
@@ -76,7 +114,7 @@ interface ConstellationProps {
76
114
  * luminous gradient edges. This is the cosmos realm's `Group` component —
77
115
  * identical rendering for own and others' stories.
78
116
  */
79
- declare function Constellation({ scenes, storyTitle, edges, appearance: appearanceOverrides, showOverlays, onSceneSelect, }: ConstellationProps): react_jsx_runtime.JSX.Element;
117
+ declare function Constellation({ scenes, storyTitle, storyOverlay, edges, appearance: appearanceOverrides, showOverlays, onSceneSelect, }: ConstellationProps): react_jsx_runtime.JSX.Element;
80
118
 
81
119
  type ConstellationEdgeVariant = "solid" | "dotted";
82
120
  interface ConstellationEdgeProps {
@@ -136,26 +174,6 @@ interface DistributeOptions {
136
174
  */
137
175
  declare function distributeStars(count: number, options?: DistributeOptions): Vec3[];
138
176
 
139
- interface ConstellationBounds {
140
- center: [number, number, number];
141
- spanX: number;
142
- spanZ: number;
143
- }
144
- declare function computeConstellationBounds(positions: [number, number, number][]): ConstellationBounds | null;
145
- interface ConstellationTitleProps {
146
- title: string;
147
- bounds: ConstellationBounds;
148
- appearance: ConstellationAppearance;
149
- /** World position of the title (first) scene — arc starts here. */
150
- arcFrom?: [number, number, number];
151
- /** World position of the end scene — arc ends here. */
152
- arcTo?: [number, number, number];
153
- }
154
- /**
155
- * Vintage cartography-style ocean label arcing from title scene to end scene.
156
- */
157
- declare function ConstellationTitle({ title, bounds, appearance, arcFrom, arcTo, }: ConstellationTitleProps): react_jsx_runtime.JSX.Element | null;
158
-
159
177
  interface StarBillboardProps {
160
178
  label: string;
161
179
  appearance: ConstellationAppearance;
@@ -174,4 +192,4 @@ interface StarBillboardProps {
174
192
  */
175
193
  declare function StarBillboard({ label, appearance, previewImageUrl, previewContent, dimmed, focused, visible, controlsSlot, }: StarBillboardProps): react_jsx_runtime.JSX.Element | null;
176
194
 
177
- export { Constellation, ConstellationAppearance, type ConstellationBounds, ConstellationEdge, type ConstellationEdgeEntry, type ConstellationEdgeProps, type ConstellationProps, type ConstellationSceneEntry, ConstellationTitle, type ConstellationTitleProps, CosmosSandbox, type CosmosSandboxProps, type DistributeOptions, Star, StarBillboard, type StarBillboardProps, type StarProps, type Vec3, World, type WorldProps, computeConstellationBounds, distributeStars };
195
+ export { Constellation, ConstellationAppearance, type ConstellationBounds, ConstellationEdge, type ConstellationEdgeEntry, type ConstellationEdgeProps, 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, distributeStars };
@@ -188,7 +188,8 @@ function ConstellationTitle({
188
188
  bounds,
189
189
  appearance,
190
190
  arcFrom,
191
- arcTo
191
+ arcTo,
192
+ storyOverlay
192
193
  }) {
193
194
  const gradientId = useId().replace(/:/g, "");
194
195
  const pathId = `arc-${gradientId}`;
@@ -216,6 +217,62 @@ function ConstellationTitle({
216
217
  }
217
218
  const arcMidX = (arcStartX + arcEndX) / 2;
218
219
  const arcPath = `M ${arcStartX} ${arcY} Q ${arcMidX} ${arcPeak} ${arcEndX} ${arcY}`;
220
+ const editable = !!(storyOverlay?.editable && storyOverlay.onEditClick);
221
+ const hasDirector = !!(storyOverlay?.directorName && storyOverlay.directorName.trim());
222
+ const hasRatingGenre = !!(storyOverlay?.contentRating || storyOverlay?.genre);
223
+ const showOverlay = hasDirector || hasRatingGenre;
224
+ const titleControl = /* @__PURE__ */ jsxs(
225
+ "svg",
226
+ {
227
+ width: svgWidth,
228
+ height: svgHeight,
229
+ viewBox: `0 0 ${svgWidth} ${svgHeight}`,
230
+ style: {
231
+ overflow: "visible",
232
+ display: "block",
233
+ cursor: editable ? "pointer" : void 0
234
+ },
235
+ "aria-hidden": editable ? void 0 : true,
236
+ role: editable ? "button" : void 0,
237
+ tabIndex: editable ? 0 : void 0,
238
+ "aria-label": editable ? storyOverlay?.editAriaLabel : void 0,
239
+ onClick: editable ? storyOverlay?.onEditClick : void 0,
240
+ onKeyDown: editable ? (e) => {
241
+ if (e.key === "Enter" || e.key === " ") {
242
+ e.preventDefault();
243
+ storyOverlay?.onEditClick?.();
244
+ }
245
+ } : void 0,
246
+ children: [
247
+ /* @__PURE__ */ jsxs("defs", { children: [
248
+ /* @__PURE__ */ jsxs("linearGradient", { id: gradientId, x1: "0%", y1: "0%", x2: "100%", y2: "0%", children: [
249
+ /* @__PURE__ */ jsx("stop", { offset: "0%", stopColor: "#8ab4c8" }),
250
+ /* @__PURE__ */ jsx("stop", { offset: "35%", stopColor: "#c8d8e4" }),
251
+ /* @__PURE__ */ jsx("stop", { offset: "65%", stopColor: "#e8dcc8" }),
252
+ /* @__PURE__ */ jsx("stop", { offset: "100%", stopColor: "#8ab4c8" })
253
+ ] }),
254
+ /* @__PURE__ */ jsx("path", { id: pathId, d: arcPath, fill: "none" })
255
+ ] }),
256
+ /* @__PURE__ */ jsx(
257
+ "text",
258
+ {
259
+ fill: `url(#${gradientId})`,
260
+ fontFamily: "'Palatino Linotype', Palatino, 'Book Antiqua', Georgia, serif",
261
+ fontSize: appearance.titleFontSize,
262
+ fontWeight: 700,
263
+ fontStyle: "italic",
264
+ letterSpacing: appearance.titleLetterSpacing,
265
+ opacity: appearance.titleOpacity,
266
+ stroke: "rgba(20,40,60,0.35)",
267
+ strokeWidth: 0.6,
268
+ paintOrder: "stroke fill",
269
+ style: { pointerEvents: "none" },
270
+ children: /* @__PURE__ */ jsx("textPath", { href: `#${pathId}`, startOffset: "50%", textAnchor: "middle", children: title.toUpperCase() })
271
+ }
272
+ )
273
+ ]
274
+ }
275
+ );
219
276
  return /* @__PURE__ */ jsx(
220
277
  Billboard,
221
278
  {
@@ -232,41 +289,52 @@ function ConstellationTitle({
232
289
  distanceFactor: appearance.titleDistanceFactor,
233
290
  zIndexRange: appearance.htmlZIndexRange,
234
291
  occlude: false,
235
- style: { pointerEvents: "none", userSelect: "none" },
292
+ style: {
293
+ pointerEvents: editable ? "auto" : "none",
294
+ userSelect: "none"
295
+ },
236
296
  children: /* @__PURE__ */ jsxs(
237
- "svg",
297
+ "div",
238
298
  {
239
- width: svgWidth,
240
- height: svgHeight,
241
- viewBox: `0 0 ${svgWidth} ${svgHeight}`,
242
- style: { overflow: "visible", display: "block" },
243
- "aria-hidden": true,
299
+ style: {
300
+ display: "flex",
301
+ flexDirection: "column",
302
+ alignItems: "center",
303
+ gap: 6
304
+ },
244
305
  children: [
245
- /* @__PURE__ */ jsxs("defs", { children: [
246
- /* @__PURE__ */ jsxs("linearGradient", { id: gradientId, x1: "0%", y1: "0%", x2: "100%", y2: "0%", children: [
247
- /* @__PURE__ */ jsx("stop", { offset: "0%", stopColor: "#8ab4c8" }),
248
- /* @__PURE__ */ jsx("stop", { offset: "35%", stopColor: "#c8d8e4" }),
249
- /* @__PURE__ */ jsx("stop", { offset: "65%", stopColor: "#e8dcc8" }),
250
- /* @__PURE__ */ jsx("stop", { offset: "100%", stopColor: "#8ab4c8" })
251
- ] }),
252
- /* @__PURE__ */ jsx("path", { id: pathId, d: arcPath, fill: "none" })
253
- ] }),
254
- /* @__PURE__ */ jsx(
255
- "text",
306
+ titleControl,
307
+ showOverlay ? /* @__PURE__ */ jsxs(
308
+ "div",
256
309
  {
257
- fill: `url(#${gradientId})`,
258
- fontFamily: "'Palatino Linotype', Palatino, 'Book Antiqua', Georgia, serif",
259
- fontSize: appearance.titleFontSize,
260
- fontWeight: 700,
261
- fontStyle: "italic",
262
- letterSpacing: appearance.titleLetterSpacing,
263
- opacity: appearance.titleOpacity,
264
- stroke: "rgba(20,40,60,0.35)",
265
- strokeWidth: 0.6,
266
- paintOrder: "stroke fill",
267
- children: /* @__PURE__ */ jsx("textPath", { href: `#${pathId}`, startOffset: "50%", textAnchor: "middle", children: title.toUpperCase() })
310
+ style: {
311
+ display: "flex",
312
+ flexDirection: "column",
313
+ alignItems: "center",
314
+ gap: 4,
315
+ maxWidth: svgWidth,
316
+ pointerEvents: "none"
317
+ },
318
+ children: [
319
+ hasDirector ? /* @__PURE__ */ jsx(
320
+ DirectorCredit,
321
+ {
322
+ prefix: storyOverlay.chosenByPrefix,
323
+ name: storyOverlay.directorName,
324
+ avatarUrl: storyOverlay.directorAvatarUrl ?? null
325
+ }
326
+ ) : null,
327
+ hasRatingGenre ? /* @__PURE__ */ jsx(
328
+ RatingGenreLine,
329
+ {
330
+ contentRating: storyOverlay.contentRating ?? null,
331
+ genre: storyOverlay.genre ?? null,
332
+ separator: storyOverlay.ratingGenreSeparator ?? " \xB7 "
333
+ }
334
+ ) : null
335
+ ]
268
336
  }
269
- )
337
+ ) : null
270
338
  ]
271
339
  }
272
340
  )
@@ -275,6 +343,95 @@ function ConstellationTitle({
275
343
  }
276
344
  );
277
345
  }
346
+ function DirectorCredit({
347
+ prefix,
348
+ name,
349
+ avatarUrl
350
+ }) {
351
+ const initial = name.trim().charAt(0).toUpperCase() || "?";
352
+ return /* @__PURE__ */ jsxs(
353
+ "div",
354
+ {
355
+ style: {
356
+ display: "inline-flex",
357
+ alignItems: "center",
358
+ gap: 6,
359
+ fontSize: 11,
360
+ color: "rgba(232,240,255,0.72)",
361
+ letterSpacing: 0.35,
362
+ textShadow: "0 1px 8px rgba(0,0,0,0.95)",
363
+ whiteSpace: "nowrap"
364
+ },
365
+ children: [
366
+ /* @__PURE__ */ jsx("span", { style: { opacity: 0.85 }, children: prefix }),
367
+ /* @__PURE__ */ jsx(
368
+ "span",
369
+ {
370
+ style: {
371
+ width: 20,
372
+ height: 20,
373
+ borderRadius: "50%",
374
+ overflow: "hidden",
375
+ flexShrink: 0,
376
+ display: "flex",
377
+ alignItems: "center",
378
+ justifyContent: "center",
379
+ background: "rgba(255,255,255,0.1)",
380
+ border: "1px solid rgba(126,184,255,0.35)",
381
+ fontSize: 9,
382
+ fontWeight: 700,
383
+ color: "rgba(232,240,255,0.9)"
384
+ },
385
+ children: avatarUrl ? /* @__PURE__ */ jsx(
386
+ "img",
387
+ {
388
+ src: avatarUrl,
389
+ alt: "",
390
+ style: { width: "100%", height: "100%", objectFit: "cover" }
391
+ }
392
+ ) : initial
393
+ }
394
+ ),
395
+ /* @__PURE__ */ jsx("span", { style: { fontWeight: 600 }, children: name })
396
+ ]
397
+ }
398
+ );
399
+ }
400
+ function RatingGenreLine({
401
+ contentRating,
402
+ genre,
403
+ separator
404
+ }) {
405
+ const parts = [];
406
+ if (contentRating) {
407
+ parts.push(
408
+ /* @__PURE__ */ jsx("span", { style: { fontWeight: 700 }, children: contentRating }, "rating")
409
+ );
410
+ }
411
+ if (genre) {
412
+ parts.push(/* @__PURE__ */ jsx("span", { children: genre }, "genre"));
413
+ }
414
+ if (parts.length === 0) return null;
415
+ return /* @__PURE__ */ jsx(
416
+ "div",
417
+ {
418
+ style: {
419
+ display: "inline-flex",
420
+ alignItems: "center",
421
+ gap: 0,
422
+ fontSize: 10,
423
+ letterSpacing: 0.5,
424
+ textTransform: "uppercase",
425
+ color: "rgba(232,240,255,0.55)",
426
+ textShadow: "0 1px 6px rgba(0,0,0,0.95)"
427
+ },
428
+ children: parts.map((part, i) => /* @__PURE__ */ jsxs("span", { children: [
429
+ i > 0 ? separator : null,
430
+ part
431
+ ] }, i))
432
+ }
433
+ );
434
+ }
278
435
  function StarBillboard({
279
436
  label,
280
437
  appearance,
@@ -411,6 +568,7 @@ function StarBillboard({
411
568
  function Constellation({
412
569
  scenes,
413
570
  storyTitle,
571
+ storyOverlay,
414
572
  edges = [],
415
573
  appearance: appearanceOverrides,
416
574
  showOverlays = true,
@@ -437,7 +595,8 @@ function Constellation({
437
595
  bounds,
438
596
  appearance,
439
597
  arcFrom: scenes[0]?.visual.position,
440
- arcTo: scenes[scenes.length - 1]?.visual.position
598
+ arcTo: scenes[scenes.length - 1]?.visual.position,
599
+ storyOverlay
441
600
  }
442
601
  ) : null,
443
602
  scenes.map((entry, i) => /* @__PURE__ */ jsxs("group", { position: entry.visual.position, children: [
@@ -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 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: 8,\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 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 } 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(6, maxX - minX + 4),\n spanZ: Math.max(4, maxZ - minZ + 3),\n };\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}\n\nconst WORLD_TO_SVG = 58;\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}: ConstellationTitleProps) {\n const gradientId = useId().replace(/:/g, \"\");\n const pathId = `arc-${gradientId}`;\n\n if (!title.trim()) return null;\n\n const span = Math.max(bounds.spanX, bounds.spanZ);\n const svgWidth = Math.max(420, Math.round(span * WORLD_TO_SVG + 80));\n const svgHeight = 110;\n\n const centerX = svgWidth / 2;\n const arcY = svgHeight * 0.88;\n const arcPeak = svgHeight * 0.06;\n\n let arcStartX = svgWidth * 0.04;\n let arcEndX = svgWidth * 0.96;\n\n if (arcFrom && arcTo) {\n const [fromX] = arcFrom;\n const [toX] = arcTo;\n arcStartX = centerX + (fromX - bounds.center[0]) * WORLD_TO_SVG;\n arcEndX = centerX + (toX - bounds.center[0]) * WORLD_TO_SVG;\n arcStartX = Math.max(12, Math.min(arcStartX, svgWidth - 12));\n arcEndX = Math.max(12, Math.min(arcEndX, svgWidth - 12));\n if (arcStartX > arcEndX) {\n const swap = arcStartX;\n arcStartX = arcEndX;\n arcEndX = swap;\n }\n }\n\n const arcMidX = (arcStartX + arcEndX) / 2;\n const arcPath = `M ${arcStartX} ${arcY} Q ${arcMidX} ${arcPeak} ${arcEndX} ${arcY}`;\n\n return (\n <Billboard\n position={[\n bounds.center[0],\n bounds.center[1] + appearance.titleYOffset,\n bounds.center[2],\n ]}\n >\n <Html\n center\n transform\n distanceFactor={appearance.titleDistanceFactor}\n zIndexRange={appearance.htmlZIndexRange}\n occlude={false}\n style={{ pointerEvents: \"none\", userSelect: \"none\" }}\n >\n <svg\n width={svgWidth}\n height={svgHeight}\n viewBox={`0 0 ${svgWidth} ${svgHeight}`}\n style={{ overflow: \"visible\", display: \"block\" }}\n aria-hidden\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 >\n <textPath href={`#${pathId}`} startOffset=\"50%\" textAnchor=\"middle\">\n {title.toUpperCase()}\n </textPath>\n </text>\n </svg>\n </Html>\n </Billboard>\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: \"nowrap\",\n maxWidth: appearance.previewWidth + 48,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\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} 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 /** 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 /** 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 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 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={scenes[0]?.visual.position}\n arcTo={scenes[scenes.length - 1]?.visual.position}\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","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 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: 8,\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 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(6, maxX - minX + 4),\n spanZ: Math.max(4, maxZ - minZ + 3),\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 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;\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 span = Math.max(bounds.spanX, bounds.spanZ);\n const svgWidth = Math.max(420, Math.round(span * WORLD_TO_SVG + 80));\n const svgHeight = 110;\n\n const centerX = svgWidth / 2;\n const arcY = svgHeight * 0.88;\n const arcPeak = svgHeight * 0.06;\n\n let arcStartX = svgWidth * 0.04;\n let arcEndX = svgWidth * 0.96;\n\n if (arcFrom && arcTo) {\n const [fromX] = arcFrom;\n const [toX] = arcTo;\n arcStartX = centerX + (fromX - bounds.center[0]) * WORLD_TO_SVG;\n arcEndX = centerX + (toX - bounds.center[0]) * WORLD_TO_SVG;\n arcStartX = Math.max(12, Math.min(arcStartX, svgWidth - 12));\n arcEndX = Math.max(12, Math.min(arcEndX, svgWidth - 12));\n if (arcStartX > arcEndX) {\n const swap = arcStartX;\n arcStartX = arcEndX;\n arcEndX = swap;\n }\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={`0 0 ${svgWidth} ${svgHeight}`}\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 bounds.center[0],\n bounds.center[1] + appearance.titleYOffset,\n bounds.center[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: 6,\n }}\n >\n {titleControl}\n\n {showOverlay ? (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n gap: 4,\n maxWidth: svgWidth,\n pointerEvents: \"none\",\n }}\n >\n {hasDirector ? (\n <DirectorCredit\n prefix={storyOverlay!.chosenByPrefix}\n name={storyOverlay!.directorName!}\n avatarUrl={storyOverlay!.directorAvatarUrl ?? null}\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}: {\n prefix: string;\n name: string;\n avatarUrl: string | null;\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 ) : (\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: \"nowrap\",\n maxWidth: appearance.previewWidth + 48,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\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 /** 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 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={scenes[0]?.visual.position}\n arcTo={scenes[scenes.length - 1]?.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","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"]}