@chuzi/shared 1.1.0 → 1.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/index.d.ts +37 -5
- package/dist/api/index.js +23 -0
- package/dist/api/index.js.map +1 -1
- package/dist/config/index.js +105 -3
- package/dist/config/index.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +128 -3
- package/dist/index.js.map +1 -1
- package/dist/realms/cosmos/components/index.d.ts +41 -1
- package/dist/realms/cosmos/components/index.js +94 -2
- package/dist/realms/cosmos/components/index.js.map +1 -1
- package/dist/types/index.d.ts +146 -1
- package/dist/ui/index.js +105 -3
- package/dist/ui/index.js.map +1 -1
- package/package.json +22 -8
package/dist/index.js
CHANGED
|
@@ -124,7 +124,41 @@ var REALMS = {
|
|
|
124
124
|
select_content_rating: "Select audience class",
|
|
125
125
|
unrated: "Unclassified",
|
|
126
126
|
viewer_credits: "Fuel Cells",
|
|
127
|
-
creator_credits: "Stardust"
|
|
127
|
+
creator_credits: "Stardust",
|
|
128
|
+
editor_media_upload: "Upload Transmission",
|
|
129
|
+
editor_media_preview: "Transmission Preview",
|
|
130
|
+
editor_alt_media: "Additional Transmission",
|
|
131
|
+
editor_choices: "Trajectories",
|
|
132
|
+
editor_scene_settings: "Planet Settings",
|
|
133
|
+
editor_title_scene: "Title Planet",
|
|
134
|
+
editor_ending_scene: "Final Orbit",
|
|
135
|
+
editor_play: "Engage",
|
|
136
|
+
editor_pause: "Hold",
|
|
137
|
+
editor_prev_frame: "Previous Frame",
|
|
138
|
+
editor_next_frame: "Next Frame",
|
|
139
|
+
editor_seek: "Seek",
|
|
140
|
+
editor_no_media: "No transmission assigned",
|
|
141
|
+
editor_uploading: "Transmitting\u2026",
|
|
142
|
+
editor_drop_media: "Drop transmission here",
|
|
143
|
+
editor_scene_type: "Planet Type",
|
|
144
|
+
editor_save: "Lock In",
|
|
145
|
+
editor_scene_color: "Planet Hue",
|
|
146
|
+
editor_ai_generate: "Generate Transmission",
|
|
147
|
+
editor_ai_generating: "Transmitting Signal\u2026",
|
|
148
|
+
editor_ai_mood_question: "What energy should this planet radiate?",
|
|
149
|
+
editor_ai_style_question: "What vision style for this transmission?",
|
|
150
|
+
editor_ai_prompt_question: "Describe this planet\u2019s landscape",
|
|
151
|
+
editor_ai_accept: "Lock Transmission",
|
|
152
|
+
editor_ai_reject: "Reject Signal",
|
|
153
|
+
editor_ai_retry: "Retransmit",
|
|
154
|
+
editor_ai_feedback_prompt: "How should we adjust the signal?",
|
|
155
|
+
editor_ai_credit_cost: "1 Stardust per signal",
|
|
156
|
+
editor_ai_generating_scene: "Planet forming\u2026",
|
|
157
|
+
editor_ai_style_badge: "Signal Style",
|
|
158
|
+
editor_ai_failed: "Signal lost. Try retransmitting.",
|
|
159
|
+
constellation_no_coverbox: "Uncharted",
|
|
160
|
+
hud_edit_control: "Engage",
|
|
161
|
+
hud_delete_control: "Jettison"
|
|
128
162
|
},
|
|
129
163
|
locales: {
|
|
130
164
|
es: {
|
|
@@ -220,7 +254,41 @@ var REALMS = {
|
|
|
220
254
|
select_content_rating: "Select field guide",
|
|
221
255
|
unrated: "Unmarked",
|
|
222
256
|
viewer_credits: "Sap",
|
|
223
|
-
creator_credits: "Pollen"
|
|
257
|
+
creator_credits: "Pollen",
|
|
258
|
+
editor_media_upload: "Upload Bloom",
|
|
259
|
+
editor_media_preview: "Bloom Preview",
|
|
260
|
+
editor_alt_media: "Additional Bloom",
|
|
261
|
+
editor_choices: "Trails",
|
|
262
|
+
editor_scene_settings: "Clearing Settings",
|
|
263
|
+
editor_title_scene: "Title Clearing",
|
|
264
|
+
editor_ending_scene: "Roots",
|
|
265
|
+
editor_play: "Unfurl",
|
|
266
|
+
editor_pause: "Rest",
|
|
267
|
+
editor_prev_frame: "Previous Frame",
|
|
268
|
+
editor_next_frame: "Next Frame",
|
|
269
|
+
editor_seek: "Seek",
|
|
270
|
+
editor_no_media: "No bloom assigned",
|
|
271
|
+
editor_uploading: "Blooming\u2026",
|
|
272
|
+
editor_drop_media: "Drop bloom here",
|
|
273
|
+
editor_scene_type: "Clearing Type",
|
|
274
|
+
editor_save: "Engrave",
|
|
275
|
+
editor_scene_color: "Clearing Tint",
|
|
276
|
+
editor_ai_generate: "Grow Bloom",
|
|
277
|
+
editor_ai_generating: "Seed Sprouting\u2026",
|
|
278
|
+
editor_ai_mood_question: "What feeling should this clearing evoke?",
|
|
279
|
+
editor_ai_style_question: "What growth pattern for this bloom?",
|
|
280
|
+
editor_ai_prompt_question: "Describe this clearing",
|
|
281
|
+
editor_ai_accept: "Root Bloom",
|
|
282
|
+
editor_ai_reject: "Prune Bloom",
|
|
283
|
+
editor_ai_retry: "Regrow",
|
|
284
|
+
editor_ai_feedback_prompt: "How should we reshape the growth?",
|
|
285
|
+
editor_ai_credit_cost: "1 Pollen per bloom",
|
|
286
|
+
editor_ai_generating_scene: "Clearing emerging\u2026",
|
|
287
|
+
editor_ai_style_badge: "Growth Style",
|
|
288
|
+
editor_ai_failed: "Growth withered. Try regrowing.",
|
|
289
|
+
constellation_no_coverbox: "Unseen",
|
|
290
|
+
hud_edit_control: "Tend",
|
|
291
|
+
hud_delete_control: "Uproot"
|
|
224
292
|
},
|
|
225
293
|
locales: {
|
|
226
294
|
es: {
|
|
@@ -314,7 +382,41 @@ var FALLBACK_LEXICON = {
|
|
|
314
382
|
select_content_rating: "Select rating",
|
|
315
383
|
unrated: "Not Rated",
|
|
316
384
|
viewer_credits: "Viewer Credits",
|
|
317
|
-
creator_credits: "Creator Credits"
|
|
385
|
+
creator_credits: "Creator Credits",
|
|
386
|
+
editor_media_upload: "Upload Media",
|
|
387
|
+
editor_media_preview: "Media Preview",
|
|
388
|
+
editor_alt_media: "Additional Media",
|
|
389
|
+
editor_choices: "Choices",
|
|
390
|
+
editor_scene_settings: "Scene Settings",
|
|
391
|
+
editor_title_scene: "Title Scene",
|
|
392
|
+
editor_ending_scene: "Ending Scene",
|
|
393
|
+
editor_play: "Play",
|
|
394
|
+
editor_pause: "Pause",
|
|
395
|
+
editor_prev_frame: "Previous Frame",
|
|
396
|
+
editor_next_frame: "Next Frame",
|
|
397
|
+
editor_seek: "Seek",
|
|
398
|
+
editor_no_media: "No media assigned",
|
|
399
|
+
editor_uploading: "Uploading\u2026",
|
|
400
|
+
editor_drop_media: "Drop media here",
|
|
401
|
+
editor_scene_type: "Scene Type",
|
|
402
|
+
editor_save: "Save",
|
|
403
|
+
editor_scene_color: "Scene Color",
|
|
404
|
+
editor_ai_generate: "Generate with AI",
|
|
405
|
+
editor_ai_generating: "Generating\u2026",
|
|
406
|
+
editor_ai_mood_question: "What mood should this scene convey?",
|
|
407
|
+
editor_ai_style_question: "What visual style do you want?",
|
|
408
|
+
editor_ai_prompt_question: "Describe this scene",
|
|
409
|
+
editor_ai_accept: "Accept",
|
|
410
|
+
editor_ai_reject: "Reject",
|
|
411
|
+
editor_ai_retry: "Try Again",
|
|
412
|
+
editor_ai_feedback_prompt: "What should we change?",
|
|
413
|
+
editor_ai_credit_cost: "1 credit per generation",
|
|
414
|
+
editor_ai_generating_scene: "Scene generating\u2026",
|
|
415
|
+
editor_ai_style_badge: "Style",
|
|
416
|
+
editor_ai_failed: "Generation failed. Please try again.",
|
|
417
|
+
constellation_no_coverbox: "No cover",
|
|
418
|
+
hud_edit_control: "Edit",
|
|
419
|
+
hud_delete_control: "Delete"
|
|
318
420
|
};
|
|
319
421
|
var FALLBACK_LOCALES = {
|
|
320
422
|
es: {
|
|
@@ -542,6 +644,22 @@ function createChuziClient(config) {
|
|
|
542
644
|
create: (req) => request("POST", "/api/v1/stories", { body: req }),
|
|
543
645
|
destroy: (id) => request("DELETE", `/api/v1/stories/${encodeURIComponent(id)}`)
|
|
544
646
|
},
|
|
647
|
+
scenes: {
|
|
648
|
+
index: (storyId, opts) => request("GET", "/api/v1/scenes", {
|
|
649
|
+
signal: opts?.signal,
|
|
650
|
+
query: { story_id: storyId }
|
|
651
|
+
}),
|
|
652
|
+
show: (id, opts) => request("GET", `/api/v1/scenes/${encodeURIComponent(id)}`, opts),
|
|
653
|
+
create: (req) => request("POST", "/api/v1/scenes", { body: req }),
|
|
654
|
+
update: (id, req) => request("PATCH", `/api/v1/scenes/${encodeURIComponent(id)}`, { body: req })
|
|
655
|
+
},
|
|
656
|
+
media: {
|
|
657
|
+
uploadUrl: (req) => request("POST", "/api/v1/media/upload-url", { body: req }),
|
|
658
|
+
register: (req) => request("POST", "/api/v1/media/register", { body: req }),
|
|
659
|
+
transcode: (req) => request("POST", "/api/v1/media/transcode", { body: req }),
|
|
660
|
+
playUrl: (id, opts) => request("GET", `/api/v1/media/${encodeURIComponent(id)}/play`, opts),
|
|
661
|
+
sourceUrl: (id, opts) => request("GET", `/api/v1/media/${encodeURIComponent(id)}/source-url`, opts)
|
|
662
|
+
},
|
|
545
663
|
watch: {
|
|
546
664
|
sceneMap: (storyId, opts) => request("GET", `/api/v1/stories/${encodeURIComponent(storyId)}/scene-map`, opts),
|
|
547
665
|
trackEngagement: (storyId, req) => request("POST", `/api/v1/stories/${encodeURIComponent(storyId)}/engagement`, { body: req }),
|
|
@@ -561,6 +679,13 @@ function createChuziClient(config) {
|
|
|
561
679
|
query: { cursor: opts?.cursor, limit: opts?.limit }
|
|
562
680
|
}),
|
|
563
681
|
packs: (opts) => request("GET", "/api/v1/credits/packs", opts)
|
|
682
|
+
},
|
|
683
|
+
ai: {
|
|
684
|
+
generateImage: (req) => request("POST", "/api/v1/ai/generate-image", { body: req }),
|
|
685
|
+
show: (id, opts) => request("GET", `/api/v1/ai/generations/${encodeURIComponent(id)}`, opts),
|
|
686
|
+
accept: (id, req) => request("POST", `/api/v1/ai/generations/${encodeURIComponent(id)}/accept`, { body: req }),
|
|
687
|
+
reject: (id, req) => request("POST", `/api/v1/ai/generations/${encodeURIComponent(id)}/reject`, { body: req }),
|
|
688
|
+
storyStyle: (storyId, opts) => request("GET", `/api/v1/ai/stories/${encodeURIComponent(storyId)}/style`, opts)
|
|
564
689
|
}
|
|
565
690
|
};
|
|
566
691
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/config/index.ts","../src/themes/index.ts","../src/api/index.ts","../src/input/index.ts","../src/realms/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type {\n RealmId,\n RealmDefinition,\n ContentRating,\n ContentRatingDefinition,\n LocaleId,\n} from \"../types/index.js\";\n\nexport const REALM_IDS: readonly RealmId[] = [\"cosmos\", \"wilds\"] as const;\n\nexport const SUPPORTED_LOCALES: readonly LocaleId[] = [\n \"en\",\n \"es\",\n \"fr\",\n \"de\",\n \"pt\",\n] as const;\n\nexport const LOCALE_LABELS: Record<LocaleId, string> = {\n en: \"English\",\n es: \"Español\",\n fr: \"Français\",\n de: \"Deutsch\",\n pt: \"Português\",\n};\n\nexport const DEFAULT_LOCALE: LocaleId = \"en\";\n\nexport function isSupportedLocale(value: unknown): value is LocaleId {\n return (\n typeof value === \"string\" &&\n SUPPORTED_LOCALES.includes(value as LocaleId)\n );\n}\n\n/**\n * Normalize a raw locale tag (e.g. \"en-US\", \"pt_BR\") to a supported LocaleId,\n * matching the PHP `LocaleResolver::normalize` behavior.\n */\nexport function normalizeLocale(value: string | null | undefined): LocaleId | null {\n if (!value) return null;\n const lower = value.toLowerCase().trim();\n if (isSupportedLocale(lower)) return lower;\n const base = lower.split(/[-_]/, 1)[0];\n return isSupportedLocale(base) ? base : null;\n}\n\n/**\n * Pick the best supported locale from a browser Accept-Language string.\n * Mirrors PHP `LocaleResolver::matchAcceptLanguage` (q-value aware).\n */\nexport function matchAcceptLanguage(\n accept: string | null | undefined\n): LocaleId | null {\n if (!accept) return null;\n const tags = accept\n .split(\",\")\n .map((part) => {\n const [tag, ...params] = part.trim().split(\";\");\n const qParam = params.find((p) => p.trim().startsWith(\"q=\"));\n const q = qParam ? parseFloat(qParam.split(\"=\")[1]) || 0 : 1;\n return { tag: tag.trim(), q };\n })\n .filter((c) => c.tag && c.tag !== \"*\")\n .sort((a, b) => b.q - a.q);\n\n for (const c of tags) {\n const normalized = normalizeLocale(c.tag);\n if (normalized) return normalized;\n }\n return null;\n}\n\nexport const CONTENT_RATING_IDS: readonly ContentRating[] = [\n \"G\",\n \"PG\",\n \"PG-13\",\n \"R\",\n \"NC-17\",\n] as const;\n\nexport const CONTENT_RATINGS: Record<ContentRating, ContentRatingDefinition> = {\n G: {\n id: \"G\",\n label: \"G\",\n description: \"General Audiences — all ages admitted.\",\n },\n PG: {\n id: \"PG\",\n label: \"PG\",\n description: \"Parental Guidance Suggested — some material may not be suitable for children.\",\n },\n \"PG-13\": {\n id: \"PG-13\",\n label: \"PG-13\",\n description: \"Parents Strongly Cautioned — some material may be inappropriate for children under 13.\",\n },\n R: {\n id: \"R\",\n label: \"R\",\n description: \"Restricted — under 17 requires accompanying parent or adult guardian.\",\n },\n \"NC-17\": {\n id: \"NC-17\",\n label: \"NC-17\",\n description: \"Adults Only — no one 17 and under admitted.\",\n },\n};\n\nexport function isContentRating(value: unknown): value is ContentRating {\n return typeof value === \"string\" && CONTENT_RATING_IDS.includes(value as ContentRating);\n}\n\nexport const REALMS: Record<RealmId, RealmDefinition> = {\n cosmos: {\n label: \"CHUZI COSMOS\",\n short_label: \"Cosmos\",\n lexicon: {\n genre: \"Galaxy\",\n story: \"Star System\",\n scene: \"Planet\",\n scene_choice: \"Trajectory\",\n node: \"Signal\",\n node_type_choice: \"Trajectory\",\n node_type_media: \"Transmission\",\n node_type_go_to_scene: \"Warp\",\n player: \"Voyager\",\n library: \"Star Chart\",\n library_open: \"Open Star Chart\",\n library_close: \"Close Star Chart\",\n editor: \"Mission Control\",\n publish: \"Launch\",\n the_end: \"Final Orbit\",\n media_pool: \"Cargo Bay\",\n scene_graph: \"Star Chart\",\n watch_path: \"Your trajectory\",\n untitled_story: \"Untitled Star System\",\n unknown_genre: \"Unknown Galaxy\",\n scenes_count: \"planets\",\n choices_count: \"trajectories\",\n drafts_published: \"Drafts + Launched\",\n published_ver: \"Launched ver.\",\n draft: \"Draft\",\n no_scenes_yet: \"No planets in this chart yet.\",\n no_path_yet: \"No trajectory to show yet.\",\n menu_empty_drafts: \"No star systems yet. Chart one to begin.\",\n menu_empty_published: \"No launched systems in the chart.\",\n menu_published_heading: \"Launched constellations\",\n menu_create_story: \"New star system\",\n menu_create_film: \"Create film\",\n film_title_placeholder: \"Star system title\",\n select_genre: \"Select galaxy\",\n genre_field_aria: \"Galaxy\",\n delete_story_verb: \"Delete star system\",\n title_scene_default: \"Title planet\",\n choices_made_stat: \"trajectories taken\",\n content_rating: \"Audience Class\",\n content_rating_field_aria: \"Audience class\",\n select_content_rating: \"Select audience class\",\n unrated: \"Unclassified\",\n viewer_credits: \"Fuel Cells\",\n creator_credits: \"Stardust\",\n },\n locales: {\n es: {\n genre: \"Galaxia\",\n story: \"Sistema Estelar\",\n scene: \"Planeta\",\n scene_choice: \"Trayectoria\",\n player: \"Viajero\",\n library: \"Carta Estelar\",\n editor: \"Control de Misión\",\n publish: \"Lanzar\",\n the_end: \"Órbita Final\",\n untitled_story: \"Sistema Estelar sin título\",\n menu_create_story: \"Nuevo sistema estelar\",\n film_title_placeholder: \"Título del sistema estelar\",\n select_genre: \"Seleccionar galaxia\",\n },\n fr: {\n genre: \"Galaxie\",\n story: \"Système Stellaire\",\n scene: \"Planète\",\n scene_choice: \"Trajectoire\",\n player: \"Voyageur\",\n library: \"Carte Stellaire\",\n editor: \"Contrôle de Mission\",\n publish: \"Lancer\",\n the_end: \"Orbite Finale\",\n untitled_story: \"Système stellaire sans titre\",\n menu_create_story: \"Nouveau système stellaire\",\n film_title_placeholder: \"Titre du système stellaire\",\n select_genre: \"Sélectionner une galaxie\",\n },\n de: {\n genre: \"Galaxie\",\n story: \"Sternsystem\",\n scene: \"Planet\",\n player: \"Reisender\",\n publish: \"Starten\",\n },\n pt: {\n genre: \"Galáxia\",\n story: \"Sistema Estelar\",\n scene: \"Planeta\",\n player: \"Viajante\",\n publish: \"Lançar\",\n },\n },\n },\n wilds: {\n label: \"CHUZI WILDS\",\n short_label: \"Wilds\",\n lexicon: {\n genre: \"Biome\",\n story: \"Grove\",\n scene: \"Clearing\",\n scene_choice: \"Trail\",\n node: \"Seed\",\n node_type_choice: \"Trail\",\n node_type_media: \"Bloom\",\n node_type_go_to_scene: \"Crossing\",\n player: \"Wanderer\",\n library: \"Canopy\",\n library_open: \"Open Canopy\",\n library_close: \"Close Canopy\",\n editor: \"Heartwood\",\n publish: \"Plant\",\n the_end: \"Roots\",\n media_pool: \"Undergrowth\",\n scene_graph: \"Canopy\",\n watch_path: \"Your trail\",\n untitled_story: \"Untitled Grove\",\n unknown_genre: \"Unknown Biome\",\n scenes_count: \"clearings\",\n choices_count: \"trails\",\n drafts_published: \"Drafts + Planted\",\n published_ver: \"Planted ver.\",\n draft: \"Draft\",\n no_scenes_yet: \"No clearings in this canopy yet.\",\n no_path_yet: \"No trail to show yet.\",\n menu_empty_drafts: \"No groves yet. Plant one to begin.\",\n menu_empty_published: \"No planted groves in the canopy.\",\n menu_published_heading: \"Planted groves\",\n menu_create_story: \"New grove\",\n menu_create_film: \"Create film\",\n film_title_placeholder: \"Grove title\",\n select_genre: \"Select biome\",\n genre_field_aria: \"Biome\",\n delete_story_verb: \"Delete grove\",\n title_scene_default: \"Title clearing\",\n choices_made_stat: \"trails taken\",\n content_rating: \"Field Guide\",\n content_rating_field_aria: \"Field guide\",\n select_content_rating: \"Select field guide\",\n unrated: \"Unmarked\",\n viewer_credits: \"Sap\",\n creator_credits: \"Pollen\",\n },\n locales: {\n es: {\n genre: \"Bioma\",\n story: \"Arboleda\",\n scene: \"Claro\",\n scene_choice: \"Sendero\",\n player: \"Errante\",\n library: \"Dosel\",\n editor: \"Duramen\",\n publish: \"Plantar\",\n the_end: \"Raíces\",\n untitled_story: \"Arboleda sin título\",\n menu_create_story: \"Nueva arboleda\",\n film_title_placeholder: \"Título de la arboleda\",\n select_genre: \"Seleccionar bioma\",\n },\n fr: {\n genre: \"Biome\",\n story: \"Bosquet\",\n scene: \"Clairière\",\n scene_choice: \"Sentier\",\n player: \"Vagabond\",\n library: \"Canopée\",\n editor: \"Cœur de bois\",\n publish: \"Planter\",\n the_end: \"Racines\",\n untitled_story: \"Bosquet sans titre\",\n menu_create_story: \"Nouveau bosquet\",\n film_title_placeholder: \"Titre du bosquet\",\n select_genre: \"Sélectionner un biome\",\n },\n de: {\n genre: \"Biom\",\n story: \"Hain\",\n scene: \"Lichtung\",\n player: \"Wanderer\",\n publish: \"Pflanzen\",\n },\n pt: {\n genre: \"Bioma\",\n story: \"Bosque\",\n scene: \"Clareira\",\n player: \"Andarilho\",\n publish: \"Plantar\",\n },\n },\n },\n};\n\nexport const FALLBACK_LEXICON: Record<string, string> = {\n genre: \"Genre\",\n story: \"Story\",\n scene: \"Scene\",\n scene_choice: \"Choice\",\n node: \"Node\",\n node_type_choice: \"Choice\",\n node_type_media: \"Media\",\n node_type_go_to_scene: \"Go to scene\",\n player: \"Player\",\n library: \"Library\",\n library_open: \"Open scene tree\",\n library_close: \"Close scene tree\",\n editor: \"Editor\",\n publish: \"Publish\",\n the_end: \"The End\",\n media_pool: \"Media Pool\",\n scene_graph: \"Scene tree\",\n watch_path: \"Your path\",\n untitled_story: \"Untitled Story\",\n unknown_genre: \"Unknown Genre\",\n scenes_count: \"scenes\",\n choices_count: \"choices\",\n drafts_published: \"Drafts + Published\",\n published_ver: \"Published ver.\",\n draft: \"Draft\",\n no_scenes_yet: \"No scenes available yet.\",\n no_path_yet: \"No path to show yet.\",\n menu_empty_drafts: \"No films yet. Create one to get started.\",\n menu_empty_published: \"No published films found.\",\n menu_published_heading: \"Published Films\",\n menu_create_story: \"Create Story\",\n menu_create_film: \"Create Film\",\n film_title_placeholder: \"Film title\",\n select_genre: \"Select genre\",\n genre_field_aria: \"Film genre\",\n delete_story_verb: \"Delete film\",\n title_scene_default: \"Title Scene\",\n choices_made_stat: \"choices made\",\n content_rating: \"Rating\",\n content_rating_field_aria: \"Content rating\",\n select_content_rating: \"Select rating\",\n unrated: \"Not Rated\",\n viewer_credits: \"Viewer Credits\",\n creator_credits: \"Creator Credits\",\n};\n\n/**\n * Per-locale overrides for FALLBACK_LEXICON. Missing keys fall through to\n * the English fallback. Mirrors PHP `chuzi_realms.fallback_locales`.\n */\nexport const FALLBACK_LOCALES: Partial<\n Record<LocaleId, Record<string, string>>\n> = {\n es: {\n genre: \"Género\",\n story: \"Historia\",\n scene: \"Escena\",\n scene_choice: \"Elección\",\n player: \"Reproductor\",\n library: \"Biblioteca\",\n editor: \"Editor\",\n publish: \"Publicar\",\n the_end: \"Fin\",\n untitled_story: \"Historia sin título\",\n menu_create_story: \"Crear historia\",\n menu_create_film: \"Crear película\",\n film_title_placeholder: \"Título de la película\",\n select_genre: \"Seleccionar género\",\n delete_story_verb: \"Eliminar película\",\n },\n fr: {\n genre: \"Genre\",\n story: \"Histoire\",\n scene: \"Scène\",\n scene_choice: \"Choix\",\n player: \"Lecteur\",\n library: \"Bibliothèque\",\n editor: \"Éditeur\",\n publish: \"Publier\",\n the_end: \"Fin\",\n untitled_story: \"Histoire sans titre\",\n menu_create_story: \"Créer une histoire\",\n menu_create_film: \"Créer un film\",\n film_title_placeholder: \"Titre du film\",\n select_genre: \"Sélectionner un genre\",\n delete_story_verb: \"Supprimer le film\",\n },\n de: {\n genre: \"Genre\",\n story: \"Geschichte\",\n scene: \"Szene\",\n publish: \"Veröffentlichen\",\n the_end: \"Ende\",\n untitled_story: \"Unbenannte Geschichte\",\n menu_create_story: \"Geschichte erstellen\",\n film_title_placeholder: \"Filmtitel\",\n select_genre: \"Genre auswählen\",\n },\n pt: {\n genre: \"Gênero\",\n story: \"História\",\n scene: \"Cena\",\n publish: \"Publicar\",\n the_end: \"Fim\",\n untitled_story: \"História sem título\",\n menu_create_story: \"Criar história\",\n film_title_placeholder: \"Título do filme\",\n select_genre: \"Selecionar gênero\",\n },\n};\n\nfunction resolveFallback(locale: LocaleId | null | undefined): Record<string, string> {\n const overrides = locale && FALLBACK_LOCALES[locale];\n return overrides ? { ...FALLBACK_LEXICON, ...overrides } : { ...FALLBACK_LEXICON };\n}\n\nfunction resolveRealm(\n realmId: RealmId,\n locale: LocaleId | null | undefined\n): Record<string, string> {\n const realm = REALMS[realmId];\n const overrides = locale && realm.locales ? realm.locales[locale] : undefined;\n return overrides ? { ...realm.lexicon, ...overrides } : { ...realm.lexicon };\n}\n\n/**\n * Get a lexicon value for a realm + locale, falling back to the neutral\n * lexicon (which itself respects locale).\n */\nexport function t(\n realmId: RealmId | null | undefined,\n key: string,\n fallback = \"\",\n locale: LocaleId | null | undefined = null\n): string {\n if (realmId && REALMS[realmId]) {\n const realmLex = resolveRealm(realmId, locale);\n if (realmLex[key] !== undefined) return realmLex[key];\n }\n const fb = resolveFallback(locale);\n return fb[key] ?? fallback;\n}\n\n/**\n * Get the full merged lexicon for a realm + locale (realm lexicon on top of\n * locale-aware fallback).\n */\nexport function lexiconForRealm(\n realmId: RealmId | null | undefined,\n locale: LocaleId | null | undefined = null\n): Record<string, string> {\n const fb = resolveFallback(locale);\n if (!realmId || !REALMS[realmId]) {\n return fb;\n }\n return { ...fb, ...resolveRealm(realmId, locale) };\n}\n","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}\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 },\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 },\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 type {\n BookmarkListResponse,\n BookmarkResponse,\n CatalogResponse,\n CreateStoryRequest,\n EngagementResponse,\n LocaleId,\n LoginRequest,\n LoginResponse,\n PaginatedResponse,\n RealmConfigResponse,\n SaveBookmarkRequest,\n SceneMapResponse,\n StoryListItem,\n TrackEngagementRequest,\n UpdateLocaleRequest,\n UpdateLocaleResponse,\n UpdateProfileRequest,\n UpdateProfileResponse,\n UpdateRealmRequest,\n UpdateRealmResponse,\n UserProfile,\n} from \"../types/index.js\";\n\n/**\n * Token resolver returned by the host app. Called on every request; may be\n * synchronous (in-memory) or async (SecureStore on RN-tvOS, AsyncStorage on\n * RN). Return null when the user is unauthenticated.\n */\nexport type TokenResolver = () => string | null | Promise<string | null>;\n\nexport interface ChuziClientConfig {\n /** Base URL of the CHUZI API — no trailing slash required. */\n baseUrl: string;\n /** Returns the current bearer token, or null if unauthenticated. */\n getToken?: TokenResolver;\n /** Override fetch for testing or RN polyfills. Defaults to globalThis.fetch. */\n fetch?: typeof fetch;\n /** Sent as User-Agent (web), or X-Client header (RN). Optional. */\n client?: string;\n}\n\nexport class ChuziApiError extends Error {\n constructor(\n public status: number,\n public body: unknown,\n message?: string,\n ) {\n super(message ?? `chuzi-api ${status}`);\n this.name = \"ChuziApiError\";\n }\n}\n\ninterface RequestOptions {\n query?: Record<string, string | number | boolean | undefined>;\n body?: unknown;\n signal?: AbortSignal;\n}\n\nfunction buildQuery(query: RequestOptions[\"query\"]): string {\n if (!query) return \"\";\n const params = new URLSearchParams();\n for (const [k, v] of Object.entries(query)) {\n if (v === undefined) continue;\n params.set(k, String(v));\n }\n const s = params.toString();\n return s ? `?${s}` : \"\";\n}\n\nfunction makeRequester(config: ChuziClientConfig) {\n const fetchFn = config.fetch ?? globalThis.fetch;\n const baseUrl = config.baseUrl.replace(/\\/+$/, \"\");\n\n return async function request<T>(\n method: string,\n path: string,\n opts: RequestOptions = {},\n ): Promise<T> {\n const headers: Record<string, string> = {\n Accept: \"application/json\",\n };\n if (config.client) headers[\"X-Chuzi-Client\"] = config.client;\n if (config.getToken) {\n const token = await config.getToken();\n if (token) headers[\"Authorization\"] = `Bearer ${token}`;\n }\n if (opts.body !== undefined) headers[\"Content-Type\"] = \"application/json\";\n\n const res = await fetchFn(`${baseUrl}${path}${buildQuery(opts.query)}`, {\n method,\n headers,\n body: opts.body !== undefined ? JSON.stringify(opts.body) : undefined,\n signal: opts.signal,\n });\n\n if (res.status === 204) return undefined as T;\n\n let parsed: unknown = null;\n const text = await res.text();\n if (text.length > 0) {\n try {\n parsed = JSON.parse(text);\n } catch {\n parsed = text;\n }\n }\n\n if (!res.ok) {\n throw new ChuziApiError(res.status, parsed);\n }\n return parsed as T;\n };\n}\n\nexport interface ChuziClient {\n auth: {\n login(req: LoginRequest): Promise<LoginResponse>;\n register(req: LoginRequest & { name: string }): Promise<LoginResponse>;\n logout(): Promise<void>;\n forgotPassword(req: { email: string }): Promise<{ status: string }>;\n resetPassword(req: {\n token: string;\n email: string;\n password: string;\n password_confirmation: string;\n }): Promise<{ status: string }>;\n user(): Promise<UserProfile>;\n };\n catalog: {\n index(opts?: { signal?: AbortSignal }): Promise<CatalogResponse>;\n };\n config: {\n realms(opts?: { locale?: LocaleId; signal?: AbortSignal }): Promise<RealmConfigResponse>;\n };\n stories: {\n index(opts?: { signal?: AbortSignal }): Promise<PaginatedResponse<StoryListItem>>;\n show(id: string, opts?: { signal?: AbortSignal }): Promise<StoryListItem>;\n mine(opts?: { signal?: AbortSignal }): Promise<PaginatedResponse<StoryListItem>>;\n create(req: CreateStoryRequest): Promise<{ data: StoryListItem }>;\n destroy(id: string): Promise<void>;\n };\n watch: {\n sceneMap(storyId: string, opts?: { signal?: AbortSignal }): Promise<SceneMapResponse>;\n trackEngagement(storyId: string, req: TrackEngagementRequest): Promise<EngagementResponse>;\n saveBookmark(storyId: string, req: SaveBookmarkRequest): Promise<BookmarkResponse>;\n listBookmarks(storyId: string, opts?: { signal?: AbortSignal }): Promise<BookmarkListResponse>;\n };\n user: {\n profile(opts?: { signal?: AbortSignal }): Promise<UserProfile>;\n updateRealm(req: UpdateRealmRequest): Promise<UpdateRealmResponse>;\n updateLocale(req: UpdateLocaleRequest): Promise<UpdateLocaleResponse>;\n updateProfile(req: UpdateProfileRequest): Promise<UpdateProfileResponse>;\n };\n credits: {\n balance(opts?: { signal?: AbortSignal }): Promise<{ balance: number }>;\n ledger(opts?: {\n signal?: AbortSignal;\n cursor?: string;\n limit?: number;\n }): Promise<{ data: unknown[]; next_cursor: string | null }>;\n packs(opts?: { signal?: AbortSignal }): Promise<{ data: unknown[] }>;\n };\n}\n\n/**\n * Construct a typed CHUZI API client. Bearer-token auth via Authorization\n * header (works for web/SPA and native apps). The host owns token storage\n * and lifecycle — pass `getToken` to plug in localStorage / AsyncStorage /\n * SecureStore as appropriate.\n *\n * Surfaces not yet wired: scenes, scene-actions, media, exports, admin,\n * reports. Add them here as the migration reaches each surface; the route\n * shapes are documented in chuzi-api/routes/api.php.\n */\nexport function createChuziClient(config: ChuziClientConfig): ChuziClient {\n const request = makeRequester(config);\n\n return {\n auth: {\n login: (req) => request(\"POST\", \"/api/v1/auth/login\", { body: req }),\n register: (req) => request(\"POST\", \"/api/v1/auth/register\", { body: req }),\n logout: () => request(\"POST\", \"/api/v1/auth/logout\"),\n forgotPassword: (req) => request(\"POST\", \"/api/v1/auth/forgot-password\", { body: req }),\n resetPassword: (req) => request(\"POST\", \"/api/v1/auth/reset-password\", { body: req }),\n user: () => request(\"GET\", \"/api/v1/auth/user\"),\n },\n catalog: {\n index: (opts) => request(\"GET\", \"/api/v1/catalog\", opts),\n },\n config: {\n realms: (opts) =>\n request(\"GET\", \"/api/v1/config/realms\", {\n signal: opts?.signal,\n query: opts?.locale ? { locale: opts.locale } : undefined,\n }),\n },\n stories: {\n index: (opts) => request(\"GET\", \"/api/v1/stories\", opts),\n show: (id, opts) => request(\"GET\", `/api/v1/stories/${encodeURIComponent(id)}`, opts),\n mine: (opts) => request(\"GET\", \"/api/v1/stories/mine\", opts),\n create: (req) => request(\"POST\", \"/api/v1/stories\", { body: req }),\n destroy: (id) => request(\"DELETE\", `/api/v1/stories/${encodeURIComponent(id)}`),\n },\n watch: {\n sceneMap: (storyId, opts) =>\n request(\"GET\", `/api/v1/stories/${encodeURIComponent(storyId)}/scene-map`, opts),\n trackEngagement: (storyId, req) =>\n request(\"POST\", `/api/v1/stories/${encodeURIComponent(storyId)}/engagement`, { body: req }),\n saveBookmark: (storyId, req) =>\n request(\"POST\", `/api/v1/stories/${encodeURIComponent(storyId)}/bookmark`, { body: req }),\n listBookmarks: (storyId, opts) =>\n request(\"GET\", `/api/v1/stories/${encodeURIComponent(storyId)}/bookmarks`, opts),\n },\n user: {\n profile: (opts) => request(\"GET\", \"/api/v1/user/profile\", opts),\n updateRealm: (req) => request(\"PUT\", \"/api/v1/user/realm\", { body: req }),\n updateLocale: (req) => request(\"PUT\", \"/api/v1/user/locale\", { body: req }),\n updateProfile: (req) => request(\"PUT\", \"/api/v1/user/profile\", { body: req }),\n },\n credits: {\n balance: (opts) => request(\"GET\", \"/api/v1/credits/balance\", opts),\n ledger: (opts) =>\n request(\"GET\", \"/api/v1/credits/ledger\", {\n signal: opts?.signal,\n query: { cursor: opts?.cursor, limit: opts?.limit },\n }),\n packs: (opts) => request(\"GET\", \"/api/v1/credits/packs\", opts),\n },\n };\n}\n","/**\n * Input abstraction. Pointer / touch / D-pad / accessibility nav all emit\n * the *same* `IntentEvent` stream. Realm components and the navigation rig\n * consume intents only — they never know which physical device produced\n * them.\n *\n * This is the load-bearing primitive for cross-platform UX: the TV D-pad\n * does focus-snap, the mouse does free flight, but both speak `MOVE`.\n */\n\nexport const Intent = {\n /** Free-flight delta (pointer/touch) OR discrete direction-snap (dpad). */\n MOVE: \"MOVE\",\n /** Engage the focused atom — open the player / detail view. */\n ENGAGE: \"ENGAGE\",\n /** Pop one level (close detail, exit search, leave realm-switcher). */\n BACK: \"BACK\",\n /** Open filter / search overlay. */\n FILTER: \"FILTER\",\n /** Hold-to-peek: preview detail without committing to ENGAGE. */\n PEEK: \"PEEK\",\n /** Pull camera back to a wider zoom level. */\n ZOOM_OUT: \"ZOOM_OUT\",\n /** Push camera forward to a tighter zoom level. */\n ZOOM_IN: \"ZOOM_IN\",\n /** Move focus to next/prev atom in current group (sibling cycling). */\n CYCLE_NEXT: \"CYCLE_NEXT\",\n CYCLE_PREV: \"CYCLE_PREV\",\n /** Auto-tour: fly between matches/recommendations hands-free. */\n TOUR_START: \"TOUR_START\",\n TOUR_STOP: \"TOUR_STOP\",\n} as const;\n\nexport type IntentName = (typeof Intent)[keyof typeof Intent];\n\nexport type InputMode = \"pointer\" | \"touch\" | \"dpad\" | \"a11y\";\n\nexport type Direction = \"up\" | \"down\" | \"left\" | \"right\";\n\nexport interface IntentEvent {\n intent: IntentName;\n /** For pointer/touch MOVE: continuous look/thrust delta in normalized units. */\n delta?: { x: number; y: number; z?: number };\n /** For ZOOM_IN/ZOOM_OUT: amount in normalized units. */\n amount?: number;\n /** For dpad MOVE: discrete direction. */\n direction?: Direction;\n /** Which physical device produced this intent. */\n source: InputMode;\n /** performance.now() at emission, for timing-sensitive consumers. */\n at: number;\n}\n\n/**\n * Bridge between a physical input (pointerlock, touch handlers, key events,\n * D-pad on remote, screen reader) and the realm's nav rig. Implementations\n * own their own listeners; consumers only subscribe.\n */\nexport interface IntentSource {\n subscribe(handler: (e: IntentEvent) => void): () => void;\n /** Begin listening to the underlying physical input (called by host). */\n start?(): void;\n /** Tear down listeners (called when realm or app unmounts). */\n stop?(): void;\n}\n\n/**\n * Compose multiple sources into one. Useful for surfaces that accept both\n * pointer and gamepad input simultaneously (e.g. desktop dev mode).\n */\nexport function mergeIntentSources(...sources: IntentSource[]): IntentSource {\n return {\n subscribe(handler) {\n const unsubs = sources.map((s) => s.subscribe(handler));\n return () => unsubs.forEach((u) => u());\n },\n start() {\n sources.forEach((s) => s.start?.());\n },\n stop() {\n sources.forEach((s) => s.stop?.());\n },\n };\n}\n","import type { RealmId, StoryListItem } from \"../types/index.js\";\n\n/**\n * Realm rendering contract. Each realm (cosmos, wilds, future depths/etc)\n * implements this interface and ships as a self-contained subpath module\n * (`@chuzi/shared/realms/cosmos`, `@chuzi/shared/realms/wilds`, ...).\n *\n * Apps don't import realms directly — they read `user.realm`, then dynamic-\n * import the matching module. Adding a new realm is a one-package change\n * with zero modifications to app code.\n *\n * The `Component` generic is left abstract so this contract works for any\n * renderer. Web/TV apps satisfy it with `React.ComponentType`; React Native\n * apps satisfy it with their own component type. chuzi-shared itself stays\n * dependency-free.\n */\n\n/** State badge applied to an atom regardless of realm. Realms render it\n * in their own visual language (orbit ring, marker post, glow, etc.). */\nexport type AtomState = \"default\" | \"watched\" | \"bookmarked\" | \"in_progress\" | \"new\";\n\n/** Continuous zoom levels. Camera flies smoothly between them; LOD swaps\n * geometry/asset quality as it crosses thresholds. */\nexport type ZoomLevel = \"overview\" | \"sector\" | \"atom\";\n\nexport interface AtomVisualProps {\n /** Position in realm-space (the realm decides the coordinate convention). */\n position: [number, number, number];\n /** Relative scale, 0–1 normalized. Realms map this to height/girth/etc. */\n scale: number;\n /** Realm-interpretable hue, 0–360. Cosmos: stellar class. Wilds: foliage. */\n hue: number;\n /** Realm-interpretable intensity, 0–1. Cosmos: luminosity. Wilds: density. */\n intensity: number;\n /** Cross-realm state badge. */\n state: AtomState;\n /** Pass-through metadata for realm-specific rendering. */\n metadata: {\n title: string;\n runtime?: number;\n popularity?: number;\n mood?: string;\n genre?: string | null;\n };\n}\n\nexport type AtomMapping = (film: StoryListItem) => AtomVisualProps;\n\nexport interface AudioPalette {\n /** Looping ambient bed (deep-space rumble, forest wind, ocean swell, ...). */\n ambientLoop?: string;\n /** Plays when focus moves to a new atom. */\n focusChime?: string;\n /** Plays during the engage transition into the player. */\n engageImpact?: string;\n /** Plays during the back transition out of the player. */\n backWhoosh?: string;\n}\n\nexport interface MotionTokens {\n /** Free-flight responsiveness (pointer/touch). */\n flightAcceleration: number;\n flightDamping: number;\n /** D-pad / focus-snap easing duration in ms. */\n focusEaseMs: number;\n /** Length of the engage transition (atom → player) in ms. */\n engageDurationMs: number;\n /** Length of the back transition (player → atom) in ms. Should equal\n * engageDurationMs by default — symmetric transitions feel grounded. */\n backDurationMs: number;\n}\n\n/** A geometric atom in realm-space, used by `focusSnap` to compute the\n * best neighbor in a given direction. Realms get the bare minimum and\n * decide how to weight (e.g. cosmos prefers angular alignment, wilds\n * prefers walking distance along the floor plane). */\nexport interface AtomLocation {\n id: string;\n position: [number, number, number];\n}\n\nexport type FocusSnap = (\n currentId: string,\n direction: \"up\" | \"down\" | \"left\" | \"right\",\n atoms: AtomLocation[],\n) => string | null;\n\n/**\n * The full realm module. `Component` is whatever component type the host\n * renderer expects (see file-level doc).\n */\nexport interface RealmModule<Component = unknown> {\n id: RealmId;\n\n /** The environment: skybox / canopy / ocean / city. */\n World: Component;\n /** A single film embodied (Star, Tree, Bioluminescent organism, ...). */\n Atom: Component;\n /** A curated grouping (Constellation, Grove, Reef, ...). */\n Group: Component;\n /** Camera + motion controller. Receives an `IntentSource` prop and\n * maps intents to realm-specific motion. */\n NavRig: Component;\n /** The signature transition: atom expands to fill the screen and\n * hands off to the player surface. Reverses on close. */\n EngageTransition: Component;\n\n /** Maps shared catalog data → realm-specific visual props. */\n mapping: AtomMapping;\n\n /** Realm-specific audio bed and stingers. */\n audio: AudioPalette;\n\n /** Realm-specific timing/easing constants. */\n motion: MotionTokens;\n\n /** D-pad neighbor selection algorithm. Realms own the spatial weighting. */\n focusSnap: FocusSnap;\n}\n\n/**\n * Default focus-snap implementation: pick the atom closest to a 60°\n * directional cone from the current atom. Realms can replace this when\n * their geometry calls for different weighting.\n */\nexport function defaultFocusSnap(\n currentId: string,\n direction: \"up\" | \"down\" | \"left\" | \"right\",\n atoms: AtomLocation[],\n): string | null {\n const current = atoms.find((a) => a.id === currentId);\n if (!current) return null;\n\n const dirVec: [number, number] =\n direction === \"left\" ? [-1, 0]\n : direction === \"right\" ? [1, 0]\n : direction === \"up\" ? [0, 1]\n : [0, -1];\n\n let best: { id: string; score: number } | null = null;\n for (const a of atoms) {\n if (a.id === currentId) continue;\n const dx = a.position[0] - current.position[0];\n const dy = a.position[1] - current.position[1];\n const dist = Math.hypot(dx, dy);\n if (dist === 0) continue;\n const dot = (dx * dirVec[0] + dy * dirVec[1]) / dist;\n // Cone of acceptance: dot > 0.5 ≈ within 60° of direction.\n if (dot < 0.5) continue;\n // Score: closer is better, more aligned is better.\n const score = dist / Math.max(dot, 0.001);\n if (!best || score < best.score) best = { id: a.id, score };\n }\n return best?.id ?? null;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/config/index.ts","../src/themes/index.ts","../src/api/index.ts","../src/input/index.ts","../src/realms/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type {\n RealmId,\n RealmDefinition,\n ContentRating,\n ContentRatingDefinition,\n LocaleId,\n} from \"../types/index.js\";\n\nexport const REALM_IDS: readonly RealmId[] = [\"cosmos\", \"wilds\"] as const;\n\nexport const SUPPORTED_LOCALES: readonly LocaleId[] = [\n \"en\",\n \"es\",\n \"fr\",\n \"de\",\n \"pt\",\n] as const;\n\nexport const LOCALE_LABELS: Record<LocaleId, string> = {\n en: \"English\",\n es: \"Español\",\n fr: \"Français\",\n de: \"Deutsch\",\n pt: \"Português\",\n};\n\nexport const DEFAULT_LOCALE: LocaleId = \"en\";\n\nexport function isSupportedLocale(value: unknown): value is LocaleId {\n return (\n typeof value === \"string\" &&\n SUPPORTED_LOCALES.includes(value as LocaleId)\n );\n}\n\n/**\n * Normalize a raw locale tag (e.g. \"en-US\", \"pt_BR\") to a supported LocaleId,\n * matching the PHP `LocaleResolver::normalize` behavior.\n */\nexport function normalizeLocale(value: string | null | undefined): LocaleId | null {\n if (!value) return null;\n const lower = value.toLowerCase().trim();\n if (isSupportedLocale(lower)) return lower;\n const base = lower.split(/[-_]/, 1)[0];\n return isSupportedLocale(base) ? base : null;\n}\n\n/**\n * Pick the best supported locale from a browser Accept-Language string.\n * Mirrors PHP `LocaleResolver::matchAcceptLanguage` (q-value aware).\n */\nexport function matchAcceptLanguage(\n accept: string | null | undefined\n): LocaleId | null {\n if (!accept) return null;\n const tags = accept\n .split(\",\")\n .map((part) => {\n const [tag, ...params] = part.trim().split(\";\");\n const qParam = params.find((p) => p.trim().startsWith(\"q=\"));\n const q = qParam ? parseFloat(qParam.split(\"=\")[1]) || 0 : 1;\n return { tag: tag.trim(), q };\n })\n .filter((c) => c.tag && c.tag !== \"*\")\n .sort((a, b) => b.q - a.q);\n\n for (const c of tags) {\n const normalized = normalizeLocale(c.tag);\n if (normalized) return normalized;\n }\n return null;\n}\n\nexport const CONTENT_RATING_IDS: readonly ContentRating[] = [\n \"G\",\n \"PG\",\n \"PG-13\",\n \"R\",\n \"NC-17\",\n] as const;\n\nexport const CONTENT_RATINGS: Record<ContentRating, ContentRatingDefinition> = {\n G: {\n id: \"G\",\n label: \"G\",\n description: \"General Audiences — all ages admitted.\",\n },\n PG: {\n id: \"PG\",\n label: \"PG\",\n description: \"Parental Guidance Suggested — some material may not be suitable for children.\",\n },\n \"PG-13\": {\n id: \"PG-13\",\n label: \"PG-13\",\n description: \"Parents Strongly Cautioned — some material may be inappropriate for children under 13.\",\n },\n R: {\n id: \"R\",\n label: \"R\",\n description: \"Restricted — under 17 requires accompanying parent or adult guardian.\",\n },\n \"NC-17\": {\n id: \"NC-17\",\n label: \"NC-17\",\n description: \"Adults Only — no one 17 and under admitted.\",\n },\n};\n\nexport function isContentRating(value: unknown): value is ContentRating {\n return typeof value === \"string\" && CONTENT_RATING_IDS.includes(value as ContentRating);\n}\n\nexport const REALMS: Record<RealmId, RealmDefinition> = {\n cosmos: {\n label: \"CHUZI COSMOS\",\n short_label: \"Cosmos\",\n lexicon: {\n genre: \"Galaxy\",\n story: \"Star System\",\n scene: \"Planet\",\n scene_choice: \"Trajectory\",\n node: \"Signal\",\n node_type_choice: \"Trajectory\",\n node_type_media: \"Transmission\",\n node_type_go_to_scene: \"Warp\",\n player: \"Voyager\",\n library: \"Star Chart\",\n library_open: \"Open Star Chart\",\n library_close: \"Close Star Chart\",\n editor: \"Mission Control\",\n publish: \"Launch\",\n the_end: \"Final Orbit\",\n media_pool: \"Cargo Bay\",\n scene_graph: \"Star Chart\",\n watch_path: \"Your trajectory\",\n untitled_story: \"Untitled Star System\",\n unknown_genre: \"Unknown Galaxy\",\n scenes_count: \"planets\",\n choices_count: \"trajectories\",\n drafts_published: \"Drafts + Launched\",\n published_ver: \"Launched ver.\",\n draft: \"Draft\",\n no_scenes_yet: \"No planets in this chart yet.\",\n no_path_yet: \"No trajectory to show yet.\",\n menu_empty_drafts: \"No star systems yet. Chart one to begin.\",\n menu_empty_published: \"No launched systems in the chart.\",\n menu_published_heading: \"Launched constellations\",\n menu_create_story: \"New star system\",\n menu_create_film: \"Create film\",\n film_title_placeholder: \"Star system title\",\n select_genre: \"Select galaxy\",\n genre_field_aria: \"Galaxy\",\n delete_story_verb: \"Delete star system\",\n title_scene_default: \"Title planet\",\n choices_made_stat: \"trajectories taken\",\n content_rating: \"Audience Class\",\n content_rating_field_aria: \"Audience class\",\n select_content_rating: \"Select audience class\",\n unrated: \"Unclassified\",\n viewer_credits: \"Fuel Cells\",\n creator_credits: \"Stardust\",\n editor_media_upload: \"Upload Transmission\",\n editor_media_preview: \"Transmission Preview\",\n editor_alt_media: \"Additional Transmission\",\n editor_choices: \"Trajectories\",\n editor_scene_settings: \"Planet Settings\",\n editor_title_scene: \"Title Planet\",\n editor_ending_scene: \"Final Orbit\",\n editor_play: \"Engage\",\n editor_pause: \"Hold\",\n editor_prev_frame: \"Previous Frame\",\n editor_next_frame: \"Next Frame\",\n editor_seek: \"Seek\",\n editor_no_media: \"No transmission assigned\",\n editor_uploading: \"Transmitting\\u2026\",\n editor_drop_media: \"Drop transmission here\",\n editor_scene_type: \"Planet Type\",\n editor_save: \"Lock In\",\n editor_scene_color: \"Planet Hue\",\n editor_ai_generate: \"Generate Transmission\",\n editor_ai_generating: \"Transmitting Signal\\u2026\",\n editor_ai_mood_question: \"What energy should this planet radiate?\",\n editor_ai_style_question: \"What vision style for this transmission?\",\n editor_ai_prompt_question: \"Describe this planet\\u2019s landscape\",\n editor_ai_accept: \"Lock Transmission\",\n editor_ai_reject: \"Reject Signal\",\n editor_ai_retry: \"Retransmit\",\n editor_ai_feedback_prompt: \"How should we adjust the signal?\",\n editor_ai_credit_cost: \"1 Stardust per signal\",\n editor_ai_generating_scene: \"Planet forming\\u2026\",\n editor_ai_style_badge: \"Signal Style\",\n editor_ai_failed: \"Signal lost. Try retransmitting.\",\n constellation_no_coverbox: \"Uncharted\",\n hud_edit_control: \"Engage\",\n hud_delete_control: \"Jettison\",\n },\n locales: {\n es: {\n genre: \"Galaxia\",\n story: \"Sistema Estelar\",\n scene: \"Planeta\",\n scene_choice: \"Trayectoria\",\n player: \"Viajero\",\n library: \"Carta Estelar\",\n editor: \"Control de Misión\",\n publish: \"Lanzar\",\n the_end: \"Órbita Final\",\n untitled_story: \"Sistema Estelar sin título\",\n menu_create_story: \"Nuevo sistema estelar\",\n film_title_placeholder: \"Título del sistema estelar\",\n select_genre: \"Seleccionar galaxia\",\n },\n fr: {\n genre: \"Galaxie\",\n story: \"Système Stellaire\",\n scene: \"Planète\",\n scene_choice: \"Trajectoire\",\n player: \"Voyageur\",\n library: \"Carte Stellaire\",\n editor: \"Contrôle de Mission\",\n publish: \"Lancer\",\n the_end: \"Orbite Finale\",\n untitled_story: \"Système stellaire sans titre\",\n menu_create_story: \"Nouveau système stellaire\",\n film_title_placeholder: \"Titre du système stellaire\",\n select_genre: \"Sélectionner une galaxie\",\n },\n de: {\n genre: \"Galaxie\",\n story: \"Sternsystem\",\n scene: \"Planet\",\n player: \"Reisender\",\n publish: \"Starten\",\n },\n pt: {\n genre: \"Galáxia\",\n story: \"Sistema Estelar\",\n scene: \"Planeta\",\n player: \"Viajante\",\n publish: \"Lançar\",\n },\n },\n },\n wilds: {\n label: \"CHUZI WILDS\",\n short_label: \"Wilds\",\n lexicon: {\n genre: \"Biome\",\n story: \"Grove\",\n scene: \"Clearing\",\n scene_choice: \"Trail\",\n node: \"Seed\",\n node_type_choice: \"Trail\",\n node_type_media: \"Bloom\",\n node_type_go_to_scene: \"Crossing\",\n player: \"Wanderer\",\n library: \"Canopy\",\n library_open: \"Open Canopy\",\n library_close: \"Close Canopy\",\n editor: \"Heartwood\",\n publish: \"Plant\",\n the_end: \"Roots\",\n media_pool: \"Undergrowth\",\n scene_graph: \"Canopy\",\n watch_path: \"Your trail\",\n untitled_story: \"Untitled Grove\",\n unknown_genre: \"Unknown Biome\",\n scenes_count: \"clearings\",\n choices_count: \"trails\",\n drafts_published: \"Drafts + Planted\",\n published_ver: \"Planted ver.\",\n draft: \"Draft\",\n no_scenes_yet: \"No clearings in this canopy yet.\",\n no_path_yet: \"No trail to show yet.\",\n menu_empty_drafts: \"No groves yet. Plant one to begin.\",\n menu_empty_published: \"No planted groves in the canopy.\",\n menu_published_heading: \"Planted groves\",\n menu_create_story: \"New grove\",\n menu_create_film: \"Create film\",\n film_title_placeholder: \"Grove title\",\n select_genre: \"Select biome\",\n genre_field_aria: \"Biome\",\n delete_story_verb: \"Delete grove\",\n title_scene_default: \"Title clearing\",\n choices_made_stat: \"trails taken\",\n content_rating: \"Field Guide\",\n content_rating_field_aria: \"Field guide\",\n select_content_rating: \"Select field guide\",\n unrated: \"Unmarked\",\n viewer_credits: \"Sap\",\n creator_credits: \"Pollen\",\n editor_media_upload: \"Upload Bloom\",\n editor_media_preview: \"Bloom Preview\",\n editor_alt_media: \"Additional Bloom\",\n editor_choices: \"Trails\",\n editor_scene_settings: \"Clearing Settings\",\n editor_title_scene: \"Title Clearing\",\n editor_ending_scene: \"Roots\",\n editor_play: \"Unfurl\",\n editor_pause: \"Rest\",\n editor_prev_frame: \"Previous Frame\",\n editor_next_frame: \"Next Frame\",\n editor_seek: \"Seek\",\n editor_no_media: \"No bloom assigned\",\n editor_uploading: \"Blooming\\u2026\",\n editor_drop_media: \"Drop bloom here\",\n editor_scene_type: \"Clearing Type\",\n editor_save: \"Engrave\",\n editor_scene_color: \"Clearing Tint\",\n editor_ai_generate: \"Grow Bloom\",\n editor_ai_generating: \"Seed Sprouting\\u2026\",\n editor_ai_mood_question: \"What feeling should this clearing evoke?\",\n editor_ai_style_question: \"What growth pattern for this bloom?\",\n editor_ai_prompt_question: \"Describe this clearing\",\n editor_ai_accept: \"Root Bloom\",\n editor_ai_reject: \"Prune Bloom\",\n editor_ai_retry: \"Regrow\",\n editor_ai_feedback_prompt: \"How should we reshape the growth?\",\n editor_ai_credit_cost: \"1 Pollen per bloom\",\n editor_ai_generating_scene: \"Clearing emerging\\u2026\",\n editor_ai_style_badge: \"Growth Style\",\n editor_ai_failed: \"Growth withered. Try regrowing.\",\n constellation_no_coverbox: \"Unseen\",\n hud_edit_control: \"Tend\",\n hud_delete_control: \"Uproot\",\n },\n locales: {\n es: {\n genre: \"Bioma\",\n story: \"Arboleda\",\n scene: \"Claro\",\n scene_choice: \"Sendero\",\n player: \"Errante\",\n library: \"Dosel\",\n editor: \"Duramen\",\n publish: \"Plantar\",\n the_end: \"Raíces\",\n untitled_story: \"Arboleda sin título\",\n menu_create_story: \"Nueva arboleda\",\n film_title_placeholder: \"Título de la arboleda\",\n select_genre: \"Seleccionar bioma\",\n },\n fr: {\n genre: \"Biome\",\n story: \"Bosquet\",\n scene: \"Clairière\",\n scene_choice: \"Sentier\",\n player: \"Vagabond\",\n library: \"Canopée\",\n editor: \"Cœur de bois\",\n publish: \"Planter\",\n the_end: \"Racines\",\n untitled_story: \"Bosquet sans titre\",\n menu_create_story: \"Nouveau bosquet\",\n film_title_placeholder: \"Titre du bosquet\",\n select_genre: \"Sélectionner un biome\",\n },\n de: {\n genre: \"Biom\",\n story: \"Hain\",\n scene: \"Lichtung\",\n player: \"Wanderer\",\n publish: \"Pflanzen\",\n },\n pt: {\n genre: \"Bioma\",\n story: \"Bosque\",\n scene: \"Clareira\",\n player: \"Andarilho\",\n publish: \"Plantar\",\n },\n },\n },\n};\n\nexport const FALLBACK_LEXICON: Record<string, string> = {\n genre: \"Genre\",\n story: \"Story\",\n scene: \"Scene\",\n scene_choice: \"Choice\",\n node: \"Node\",\n node_type_choice: \"Choice\",\n node_type_media: \"Media\",\n node_type_go_to_scene: \"Go to scene\",\n player: \"Player\",\n library: \"Library\",\n library_open: \"Open scene tree\",\n library_close: \"Close scene tree\",\n editor: \"Editor\",\n publish: \"Publish\",\n the_end: \"The End\",\n media_pool: \"Media Pool\",\n scene_graph: \"Scene tree\",\n watch_path: \"Your path\",\n untitled_story: \"Untitled Story\",\n unknown_genre: \"Unknown Genre\",\n scenes_count: \"scenes\",\n choices_count: \"choices\",\n drafts_published: \"Drafts + Published\",\n published_ver: \"Published ver.\",\n draft: \"Draft\",\n no_scenes_yet: \"No scenes available yet.\",\n no_path_yet: \"No path to show yet.\",\n menu_empty_drafts: \"No films yet. Create one to get started.\",\n menu_empty_published: \"No published films found.\",\n menu_published_heading: \"Published Films\",\n menu_create_story: \"Create Story\",\n menu_create_film: \"Create Film\",\n film_title_placeholder: \"Film title\",\n select_genre: \"Select genre\",\n genre_field_aria: \"Film genre\",\n delete_story_verb: \"Delete film\",\n title_scene_default: \"Title Scene\",\n choices_made_stat: \"choices made\",\n content_rating: \"Rating\",\n content_rating_field_aria: \"Content rating\",\n select_content_rating: \"Select rating\",\n unrated: \"Not Rated\",\n viewer_credits: \"Viewer Credits\",\n creator_credits: \"Creator Credits\",\n editor_media_upload: \"Upload Media\",\n editor_media_preview: \"Media Preview\",\n editor_alt_media: \"Additional Media\",\n editor_choices: \"Choices\",\n editor_scene_settings: \"Scene Settings\",\n editor_title_scene: \"Title Scene\",\n editor_ending_scene: \"Ending Scene\",\n editor_play: \"Play\",\n editor_pause: \"Pause\",\n editor_prev_frame: \"Previous Frame\",\n editor_next_frame: \"Next Frame\",\n editor_seek: \"Seek\",\n editor_no_media: \"No media assigned\",\n editor_uploading: \"Uploading\\u2026\",\n editor_drop_media: \"Drop media here\",\n editor_scene_type: \"Scene Type\",\n editor_save: \"Save\",\n editor_scene_color: \"Scene Color\",\n editor_ai_generate: \"Generate with AI\",\n editor_ai_generating: \"Generating\\u2026\",\n editor_ai_mood_question: \"What mood should this scene convey?\",\n editor_ai_style_question: \"What visual style do you want?\",\n editor_ai_prompt_question: \"Describe this scene\",\n editor_ai_accept: \"Accept\",\n editor_ai_reject: \"Reject\",\n editor_ai_retry: \"Try Again\",\n editor_ai_feedback_prompt: \"What should we change?\",\n editor_ai_credit_cost: \"1 credit per generation\",\n editor_ai_generating_scene: \"Scene generating\\u2026\",\n editor_ai_style_badge: \"Style\",\n editor_ai_failed: \"Generation failed. Please try again.\",\n constellation_no_coverbox: \"No cover\",\n hud_edit_control: \"Edit\",\n hud_delete_control: \"Delete\",\n};\n\n/**\n * Per-locale overrides for FALLBACK_LEXICON. Missing keys fall through to\n * the English fallback. Mirrors PHP `chuzi_realms.fallback_locales`.\n */\nexport const FALLBACK_LOCALES: Partial<\n Record<LocaleId, Record<string, string>>\n> = {\n es: {\n genre: \"Género\",\n story: \"Historia\",\n scene: \"Escena\",\n scene_choice: \"Elección\",\n player: \"Reproductor\",\n library: \"Biblioteca\",\n editor: \"Editor\",\n publish: \"Publicar\",\n the_end: \"Fin\",\n untitled_story: \"Historia sin título\",\n menu_create_story: \"Crear historia\",\n menu_create_film: \"Crear película\",\n film_title_placeholder: \"Título de la película\",\n select_genre: \"Seleccionar género\",\n delete_story_verb: \"Eliminar película\",\n },\n fr: {\n genre: \"Genre\",\n story: \"Histoire\",\n scene: \"Scène\",\n scene_choice: \"Choix\",\n player: \"Lecteur\",\n library: \"Bibliothèque\",\n editor: \"Éditeur\",\n publish: \"Publier\",\n the_end: \"Fin\",\n untitled_story: \"Histoire sans titre\",\n menu_create_story: \"Créer une histoire\",\n menu_create_film: \"Créer un film\",\n film_title_placeholder: \"Titre du film\",\n select_genre: \"Sélectionner un genre\",\n delete_story_verb: \"Supprimer le film\",\n },\n de: {\n genre: \"Genre\",\n story: \"Geschichte\",\n scene: \"Szene\",\n publish: \"Veröffentlichen\",\n the_end: \"Ende\",\n untitled_story: \"Unbenannte Geschichte\",\n menu_create_story: \"Geschichte erstellen\",\n film_title_placeholder: \"Filmtitel\",\n select_genre: \"Genre auswählen\",\n },\n pt: {\n genre: \"Gênero\",\n story: \"História\",\n scene: \"Cena\",\n publish: \"Publicar\",\n the_end: \"Fim\",\n untitled_story: \"História sem título\",\n menu_create_story: \"Criar história\",\n film_title_placeholder: \"Título do filme\",\n select_genre: \"Selecionar gênero\",\n },\n};\n\nfunction resolveFallback(locale: LocaleId | null | undefined): Record<string, string> {\n const overrides = locale && FALLBACK_LOCALES[locale];\n return overrides ? { ...FALLBACK_LEXICON, ...overrides } : { ...FALLBACK_LEXICON };\n}\n\nfunction resolveRealm(\n realmId: RealmId,\n locale: LocaleId | null | undefined\n): Record<string, string> {\n const realm = REALMS[realmId];\n const overrides = locale && realm.locales ? realm.locales[locale] : undefined;\n return overrides ? { ...realm.lexicon, ...overrides } : { ...realm.lexicon };\n}\n\n/**\n * Get a lexicon value for a realm + locale, falling back to the neutral\n * lexicon (which itself respects locale).\n */\nexport function t(\n realmId: RealmId | null | undefined,\n key: string,\n fallback = \"\",\n locale: LocaleId | null | undefined = null\n): string {\n if (realmId && REALMS[realmId]) {\n const realmLex = resolveRealm(realmId, locale);\n if (realmLex[key] !== undefined) return realmLex[key];\n }\n const fb = resolveFallback(locale);\n return fb[key] ?? fallback;\n}\n\n/**\n * Get the full merged lexicon for a realm + locale (realm lexicon on top of\n * locale-aware fallback).\n */\nexport function lexiconForRealm(\n realmId: RealmId | null | undefined,\n locale: LocaleId | null | undefined = null\n): Record<string, string> {\n const fb = resolveFallback(locale);\n if (!realmId || !REALMS[realmId]) {\n return fb;\n }\n return { ...fb, ...resolveRealm(realmId, locale) };\n}\n","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}\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 },\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 },\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 type {\n AcceptGenerationRequest,\n AcceptGenerationResponse,\n AiGenerationShowResponse,\n BookmarkListResponse,\n BookmarkResponse,\n CatalogResponse,\n CreateSceneRequest,\n CreateStoryRequest,\n EngagementResponse,\n GenerateImageRequest,\n GenerateImageResponse,\n LocaleId,\n LoginRequest,\n LoginResponse,\n MediaItem,\n MineResponse,\n PaginatedResponse,\n PlayUrlResponse,\n RealmConfigResponse,\n RegisterMediaRequest,\n RegisterMediaResponse,\n RejectGenerationRequest,\n RejectGenerationResponse,\n SaveBookmarkRequest,\n SceneListItem,\n SceneMapResponse,\n SourceUrlResponse,\n StoryListItem,\n StoryStyleResponse,\n TrackEngagementRequest,\n TranscodeRequest,\n TranscodeResponse,\n UpdateLocaleRequest,\n UpdateLocaleResponse,\n UpdateProfileRequest,\n UpdateProfileResponse,\n UpdateRealmRequest,\n UpdateRealmResponse,\n UpdateSceneRequest,\n UploadUrlRequest,\n UploadUrlResponse,\n UserProfile,\n} from \"../types/index.js\";\n\n/**\n * Token resolver returned by the host app. Called on every request; may be\n * synchronous (in-memory) or async (SecureStore on RN-tvOS, AsyncStorage on\n * RN). Return null when the user is unauthenticated.\n */\nexport type TokenResolver = () => string | null | Promise<string | null>;\n\nexport interface ChuziClientConfig {\n /** Base URL of the CHUZI API — no trailing slash required. */\n baseUrl: string;\n /** Returns the current bearer token, or null if unauthenticated. */\n getToken?: TokenResolver;\n /** Override fetch for testing or RN polyfills. Defaults to globalThis.fetch. */\n fetch?: typeof fetch;\n /** Sent as User-Agent (web), or X-Client header (RN). Optional. */\n client?: string;\n}\n\nexport class ChuziApiError extends Error {\n constructor(\n public status: number,\n public body: unknown,\n message?: string,\n ) {\n super(message ?? `chuzi-api ${status}`);\n this.name = \"ChuziApiError\";\n }\n}\n\ninterface RequestOptions {\n query?: Record<string, string | number | boolean | undefined>;\n body?: unknown;\n signal?: AbortSignal;\n}\n\nfunction buildQuery(query: RequestOptions[\"query\"]): string {\n if (!query) return \"\";\n const params = new URLSearchParams();\n for (const [k, v] of Object.entries(query)) {\n if (v === undefined) continue;\n params.set(k, String(v));\n }\n const s = params.toString();\n return s ? `?${s}` : \"\";\n}\n\nfunction makeRequester(config: ChuziClientConfig) {\n const fetchFn = config.fetch ?? globalThis.fetch;\n const baseUrl = config.baseUrl.replace(/\\/+$/, \"\");\n\n return async function request<T>(\n method: string,\n path: string,\n opts: RequestOptions = {},\n ): Promise<T> {\n const headers: Record<string, string> = {\n Accept: \"application/json\",\n };\n if (config.client) headers[\"X-Chuzi-Client\"] = config.client;\n if (config.getToken) {\n const token = await config.getToken();\n if (token) headers[\"Authorization\"] = `Bearer ${token}`;\n }\n if (opts.body !== undefined) headers[\"Content-Type\"] = \"application/json\";\n\n const res = await fetchFn(`${baseUrl}${path}${buildQuery(opts.query)}`, {\n method,\n headers,\n body: opts.body !== undefined ? JSON.stringify(opts.body) : undefined,\n signal: opts.signal,\n });\n\n if (res.status === 204) return undefined as T;\n\n let parsed: unknown = null;\n const text = await res.text();\n if (text.length > 0) {\n try {\n parsed = JSON.parse(text);\n } catch {\n parsed = text;\n }\n }\n\n if (!res.ok) {\n throw new ChuziApiError(res.status, parsed);\n }\n return parsed as T;\n };\n}\n\nexport interface ChuziClient {\n auth: {\n login(req: LoginRequest): Promise<LoginResponse>;\n register(req: LoginRequest & { name: string }): Promise<LoginResponse>;\n logout(): Promise<void>;\n forgotPassword(req: { email: string }): Promise<{ status: string }>;\n resetPassword(req: {\n token: string;\n email: string;\n password: string;\n password_confirmation: string;\n }): Promise<{ status: string }>;\n user(): Promise<UserProfile>;\n };\n catalog: {\n index(opts?: { signal?: AbortSignal }): Promise<CatalogResponse>;\n };\n config: {\n realms(opts?: { locale?: LocaleId; signal?: AbortSignal }): Promise<RealmConfigResponse>;\n };\n stories: {\n index(opts?: { signal?: AbortSignal }): Promise<PaginatedResponse<StoryListItem>>;\n show(id: string, opts?: { signal?: AbortSignal }): Promise<StoryListItem>;\n mine(opts?: { signal?: AbortSignal }): Promise<MineResponse>;\n create(req: CreateStoryRequest): Promise<{ data: StoryListItem }>;\n destroy(id: string): Promise<void>;\n };\n scenes: {\n index(storyId: string, opts?: { signal?: AbortSignal }): Promise<SceneListItem[]>;\n show(id: string, opts?: { signal?: AbortSignal }): Promise<SceneListItem>;\n create(req: CreateSceneRequest): Promise<SceneListItem>;\n update(id: string, req: UpdateSceneRequest): Promise<SceneListItem>;\n };\n media: {\n uploadUrl(req: UploadUrlRequest): Promise<UploadUrlResponse>;\n register(req: RegisterMediaRequest): Promise<RegisterMediaResponse>;\n transcode(req: TranscodeRequest): Promise<TranscodeResponse>;\n playUrl(id: string, opts?: { signal?: AbortSignal }): Promise<PlayUrlResponse>;\n sourceUrl(id: string, opts?: { signal?: AbortSignal }): Promise<SourceUrlResponse>;\n };\n watch: {\n sceneMap(storyId: string, opts?: { signal?: AbortSignal }): Promise<SceneMapResponse>;\n trackEngagement(storyId: string, req: TrackEngagementRequest): Promise<EngagementResponse>;\n saveBookmark(storyId: string, req: SaveBookmarkRequest): Promise<BookmarkResponse>;\n listBookmarks(storyId: string, opts?: { signal?: AbortSignal }): Promise<BookmarkListResponse>;\n };\n user: {\n profile(opts?: { signal?: AbortSignal }): Promise<UserProfile>;\n updateRealm(req: UpdateRealmRequest): Promise<UpdateRealmResponse>;\n updateLocale(req: UpdateLocaleRequest): Promise<UpdateLocaleResponse>;\n updateProfile(req: UpdateProfileRequest): Promise<UpdateProfileResponse>;\n };\n credits: {\n balance(opts?: { signal?: AbortSignal }): Promise<{ balance: number }>;\n ledger(opts?: {\n signal?: AbortSignal;\n cursor?: string;\n limit?: number;\n }): Promise<{ data: unknown[]; next_cursor: string | null }>;\n packs(opts?: { signal?: AbortSignal }): Promise<{ data: unknown[] }>;\n };\n ai: {\n generateImage(req: GenerateImageRequest): Promise<GenerateImageResponse>;\n show(id: string, opts?: { signal?: AbortSignal }): Promise<AiGenerationShowResponse>;\n accept(id: string, req: AcceptGenerationRequest): Promise<AcceptGenerationResponse>;\n reject(id: string, req: RejectGenerationRequest): Promise<RejectGenerationResponse>;\n storyStyle(storyId: string, opts?: { signal?: AbortSignal }): Promise<StoryStyleResponse>;\n };\n}\n\n/**\n * Construct a typed CHUZI API client. Bearer-token auth via Authorization\n * header (works for web/SPA and native apps). The host owns token storage\n * and lifecycle — pass `getToken` to plug in localStorage / AsyncStorage /\n * SecureStore as appropriate.\n *\n * Surfaces not yet wired: scene-actions, exports, admin, reports.\n * Add them here as the migration reaches each surface; the route shapes\n * are documented in chuzi-api/routes/api.php.\n */\nexport function createChuziClient(config: ChuziClientConfig): ChuziClient {\n const request = makeRequester(config);\n\n return {\n auth: {\n login: (req) => request(\"POST\", \"/api/v1/auth/login\", { body: req }),\n register: (req) => request(\"POST\", \"/api/v1/auth/register\", { body: req }),\n logout: () => request(\"POST\", \"/api/v1/auth/logout\"),\n forgotPassword: (req) => request(\"POST\", \"/api/v1/auth/forgot-password\", { body: req }),\n resetPassword: (req) => request(\"POST\", \"/api/v1/auth/reset-password\", { body: req }),\n user: () => request(\"GET\", \"/api/v1/auth/user\"),\n },\n catalog: {\n index: (opts) => request(\"GET\", \"/api/v1/catalog\", opts),\n },\n config: {\n realms: (opts) =>\n request(\"GET\", \"/api/v1/config/realms\", {\n signal: opts?.signal,\n query: opts?.locale ? { locale: opts.locale } : undefined,\n }),\n },\n stories: {\n index: (opts) => request(\"GET\", \"/api/v1/stories\", opts),\n show: (id, opts) => request(\"GET\", `/api/v1/stories/${encodeURIComponent(id)}`, opts),\n mine: (opts) => request(\"GET\", \"/api/v1/stories/mine\", opts),\n create: (req) => request(\"POST\", \"/api/v1/stories\", { body: req }),\n destroy: (id) => request(\"DELETE\", `/api/v1/stories/${encodeURIComponent(id)}`),\n },\n scenes: {\n index: (storyId, opts) =>\n request(\"GET\", \"/api/v1/scenes\", {\n signal: opts?.signal,\n query: { story_id: storyId },\n }),\n show: (id, opts) =>\n request(\"GET\", `/api/v1/scenes/${encodeURIComponent(id)}`, opts),\n create: (req) =>\n request(\"POST\", \"/api/v1/scenes\", { body: req }),\n update: (id, req) =>\n request(\"PATCH\", `/api/v1/scenes/${encodeURIComponent(id)}`, { body: req }),\n },\n media: {\n uploadUrl: (req) =>\n request(\"POST\", \"/api/v1/media/upload-url\", { body: req }),\n register: (req) =>\n request(\"POST\", \"/api/v1/media/register\", { body: req }),\n transcode: (req) =>\n request(\"POST\", \"/api/v1/media/transcode\", { body: req }),\n playUrl: (id, opts) =>\n request(\"GET\", `/api/v1/media/${encodeURIComponent(id)}/play`, opts),\n sourceUrl: (id, opts) =>\n request(\"GET\", `/api/v1/media/${encodeURIComponent(id)}/source-url`, opts),\n },\n watch: {\n sceneMap: (storyId, opts) =>\n request(\"GET\", `/api/v1/stories/${encodeURIComponent(storyId)}/scene-map`, opts),\n trackEngagement: (storyId, req) =>\n request(\"POST\", `/api/v1/stories/${encodeURIComponent(storyId)}/engagement`, { body: req }),\n saveBookmark: (storyId, req) =>\n request(\"POST\", `/api/v1/stories/${encodeURIComponent(storyId)}/bookmark`, { body: req }),\n listBookmarks: (storyId, opts) =>\n request(\"GET\", `/api/v1/stories/${encodeURIComponent(storyId)}/bookmarks`, opts),\n },\n user: {\n profile: (opts) => request(\"GET\", \"/api/v1/user/profile\", opts),\n updateRealm: (req) => request(\"PUT\", \"/api/v1/user/realm\", { body: req }),\n updateLocale: (req) => request(\"PUT\", \"/api/v1/user/locale\", { body: req }),\n updateProfile: (req) => request(\"PUT\", \"/api/v1/user/profile\", { body: req }),\n },\n credits: {\n balance: (opts) => request(\"GET\", \"/api/v1/credits/balance\", opts),\n ledger: (opts) =>\n request(\"GET\", \"/api/v1/credits/ledger\", {\n signal: opts?.signal,\n query: { cursor: opts?.cursor, limit: opts?.limit },\n }),\n packs: (opts) => request(\"GET\", \"/api/v1/credits/packs\", opts),\n },\n ai: {\n generateImage: (req) =>\n request(\"POST\", \"/api/v1/ai/generate-image\", { body: req }),\n show: (id, opts) =>\n request(\"GET\", `/api/v1/ai/generations/${encodeURIComponent(id)}`, opts),\n accept: (id, req) =>\n request(\"POST\", `/api/v1/ai/generations/${encodeURIComponent(id)}/accept`, { body: req }),\n reject: (id, req) =>\n request(\"POST\", `/api/v1/ai/generations/${encodeURIComponent(id)}/reject`, { body: req }),\n storyStyle: (storyId, opts) =>\n request(\"GET\", `/api/v1/ai/stories/${encodeURIComponent(storyId)}/style`, opts),\n },\n };\n}\n","/**\n * Input abstraction. Pointer / touch / D-pad / accessibility nav all emit\n * the *same* `IntentEvent` stream. Realm components and the navigation rig\n * consume intents only — they never know which physical device produced\n * them.\n *\n * This is the load-bearing primitive for cross-platform UX: the TV D-pad\n * does focus-snap, the mouse does free flight, but both speak `MOVE`.\n */\n\nexport const Intent = {\n /** Free-flight delta (pointer/touch) OR discrete direction-snap (dpad). */\n MOVE: \"MOVE\",\n /** Engage the focused atom — open the player / detail view. */\n ENGAGE: \"ENGAGE\",\n /** Pop one level (close detail, exit search, leave realm-switcher). */\n BACK: \"BACK\",\n /** Open filter / search overlay. */\n FILTER: \"FILTER\",\n /** Hold-to-peek: preview detail without committing to ENGAGE. */\n PEEK: \"PEEK\",\n /** Pull camera back to a wider zoom level. */\n ZOOM_OUT: \"ZOOM_OUT\",\n /** Push camera forward to a tighter zoom level. */\n ZOOM_IN: \"ZOOM_IN\",\n /** Move focus to next/prev atom in current group (sibling cycling). */\n CYCLE_NEXT: \"CYCLE_NEXT\",\n CYCLE_PREV: \"CYCLE_PREV\",\n /** Auto-tour: fly between matches/recommendations hands-free. */\n TOUR_START: \"TOUR_START\",\n TOUR_STOP: \"TOUR_STOP\",\n} as const;\n\nexport type IntentName = (typeof Intent)[keyof typeof Intent];\n\nexport type InputMode = \"pointer\" | \"touch\" | \"dpad\" | \"a11y\";\n\nexport type Direction = \"up\" | \"down\" | \"left\" | \"right\";\n\nexport interface IntentEvent {\n intent: IntentName;\n /** For pointer/touch MOVE: continuous look/thrust delta in normalized units. */\n delta?: { x: number; y: number; z?: number };\n /** For ZOOM_IN/ZOOM_OUT: amount in normalized units. */\n amount?: number;\n /** For dpad MOVE: discrete direction. */\n direction?: Direction;\n /** Which physical device produced this intent. */\n source: InputMode;\n /** performance.now() at emission, for timing-sensitive consumers. */\n at: number;\n}\n\n/**\n * Bridge between a physical input (pointerlock, touch handlers, key events,\n * D-pad on remote, screen reader) and the realm's nav rig. Implementations\n * own their own listeners; consumers only subscribe.\n */\nexport interface IntentSource {\n subscribe(handler: (e: IntentEvent) => void): () => void;\n /** Begin listening to the underlying physical input (called by host). */\n start?(): void;\n /** Tear down listeners (called when realm or app unmounts). */\n stop?(): void;\n}\n\n/**\n * Compose multiple sources into one. Useful for surfaces that accept both\n * pointer and gamepad input simultaneously (e.g. desktop dev mode).\n */\nexport function mergeIntentSources(...sources: IntentSource[]): IntentSource {\n return {\n subscribe(handler) {\n const unsubs = sources.map((s) => s.subscribe(handler));\n return () => unsubs.forEach((u) => u());\n },\n start() {\n sources.forEach((s) => s.start?.());\n },\n stop() {\n sources.forEach((s) => s.stop?.());\n },\n };\n}\n","import type { RealmId, StoryListItem } from \"../types/index.js\";\n\n/**\n * Realm rendering contract. Each realm (cosmos, wilds, future depths/etc)\n * implements this interface and ships as a self-contained subpath module\n * (`@chuzi/shared/realms/cosmos`, `@chuzi/shared/realms/wilds`, ...).\n *\n * Apps don't import realms directly — they read `user.realm`, then dynamic-\n * import the matching module. Adding a new realm is a one-package change\n * with zero modifications to app code.\n *\n * The `Component` generic is left abstract so this contract works for any\n * renderer. Web/TV apps satisfy it with `React.ComponentType`; React Native\n * apps satisfy it with their own component type. chuzi-shared itself stays\n * dependency-free.\n */\n\n/** State badge applied to an atom regardless of realm. Realms render it\n * in their own visual language (orbit ring, marker post, glow, etc.). */\nexport type AtomState = \"default\" | \"watched\" | \"bookmarked\" | \"in_progress\" | \"new\";\n\n/** Continuous zoom levels. Camera flies smoothly between them; LOD swaps\n * geometry/asset quality as it crosses thresholds. */\nexport type ZoomLevel = \"overview\" | \"sector\" | \"atom\";\n\nexport interface AtomVisualProps {\n /** Position in realm-space (the realm decides the coordinate convention). */\n position: [number, number, number];\n /** Relative scale, 0–1 normalized. Realms map this to height/girth/etc. */\n scale: number;\n /** Realm-interpretable hue, 0–360. Cosmos: stellar class. Wilds: foliage. */\n hue: number;\n /** Realm-interpretable intensity, 0–1. Cosmos: luminosity. Wilds: density. */\n intensity: number;\n /** Cross-realm state badge. */\n state: AtomState;\n /** Pass-through metadata for realm-specific rendering. */\n metadata: {\n title: string;\n runtime?: number;\n popularity?: number;\n mood?: string;\n genre?: string | null;\n };\n}\n\nexport type AtomMapping = (film: StoryListItem) => AtomVisualProps;\n\nexport interface AudioPalette {\n /** Looping ambient bed (deep-space rumble, forest wind, ocean swell, ...). */\n ambientLoop?: string;\n /** Plays when focus moves to a new atom. */\n focusChime?: string;\n /** Plays during the engage transition into the player. */\n engageImpact?: string;\n /** Plays during the back transition out of the player. */\n backWhoosh?: string;\n}\n\nexport interface MotionTokens {\n /** Free-flight responsiveness (pointer/touch). */\n flightAcceleration: number;\n flightDamping: number;\n /** D-pad / focus-snap easing duration in ms. */\n focusEaseMs: number;\n /** Length of the engage transition (atom → player) in ms. */\n engageDurationMs: number;\n /** Length of the back transition (player → atom) in ms. Should equal\n * engageDurationMs by default — symmetric transitions feel grounded. */\n backDurationMs: number;\n}\n\n/** A geometric atom in realm-space, used by `focusSnap` to compute the\n * best neighbor in a given direction. Realms get the bare minimum and\n * decide how to weight (e.g. cosmos prefers angular alignment, wilds\n * prefers walking distance along the floor plane). */\nexport interface AtomLocation {\n id: string;\n position: [number, number, number];\n}\n\nexport type FocusSnap = (\n currentId: string,\n direction: \"up\" | \"down\" | \"left\" | \"right\",\n atoms: AtomLocation[],\n) => string | null;\n\n/**\n * The full realm module. `Component` is whatever component type the host\n * renderer expects (see file-level doc).\n */\nexport interface RealmModule<Component = unknown> {\n id: RealmId;\n\n /** The environment: skybox / canopy / ocean / city. */\n World: Component;\n /** A single film embodied (Star, Tree, Bioluminescent organism, ...). */\n Atom: Component;\n /** A curated grouping (Constellation, Grove, Reef, ...). */\n Group: Component;\n /** Camera + motion controller. Receives an `IntentSource` prop and\n * maps intents to realm-specific motion. */\n NavRig: Component;\n /** The signature transition: atom expands to fill the screen and\n * hands off to the player surface. Reverses on close. */\n EngageTransition: Component;\n\n /** Maps shared catalog data → realm-specific visual props. */\n mapping: AtomMapping;\n\n /** Realm-specific audio bed and stingers. */\n audio: AudioPalette;\n\n /** Realm-specific timing/easing constants. */\n motion: MotionTokens;\n\n /** D-pad neighbor selection algorithm. Realms own the spatial weighting. */\n focusSnap: FocusSnap;\n}\n\n/**\n * Default focus-snap implementation: pick the atom closest to a 60°\n * directional cone from the current atom. Realms can replace this when\n * their geometry calls for different weighting.\n */\nexport function defaultFocusSnap(\n currentId: string,\n direction: \"up\" | \"down\" | \"left\" | \"right\",\n atoms: AtomLocation[],\n): string | null {\n const current = atoms.find((a) => a.id === currentId);\n if (!current) return null;\n\n const dirVec: [number, number] =\n direction === \"left\" ? [-1, 0]\n : direction === \"right\" ? [1, 0]\n : direction === \"up\" ? [0, 1]\n : [0, -1];\n\n let best: { id: string; score: number } | null = null;\n for (const a of atoms) {\n if (a.id === currentId) continue;\n const dx = a.position[0] - current.position[0];\n const dy = a.position[1] - current.position[1];\n const dist = Math.hypot(dx, dy);\n if (dist === 0) continue;\n const dot = (dx * dirVec[0] + dy * dirVec[1]) / dist;\n // Cone of acceptance: dot > 0.5 ≈ within 60° of direction.\n if (dot < 0.5) continue;\n // Score: closer is better, more aligned is better.\n const score = dist / Math.max(dot, 0.001);\n if (!best || score < best.score) best = { id: a.id, score };\n }\n return best?.id ?? null;\n}\n"]}
|
|
@@ -29,6 +29,46 @@ interface StarProps {
|
|
|
29
29
|
*/
|
|
30
30
|
declare function Star({ visual, onSelect }: StarProps): react_jsx_runtime.JSX.Element;
|
|
31
31
|
|
|
32
|
+
interface ConstellationSceneEntry {
|
|
33
|
+
id: string;
|
|
34
|
+
/** Visual with final position already computed by the consumer. */
|
|
35
|
+
visual: AtomVisualProps;
|
|
36
|
+
}
|
|
37
|
+
interface ConstellationProps {
|
|
38
|
+
/** Scene entries in order (title first, end last), already positioned. */
|
|
39
|
+
scenes: ConstellationSceneEntry[];
|
|
40
|
+
onSceneSelect?: (index: number) => void;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* A single story rendered as a constellation: scene-stars connected by
|
|
44
|
+
* luminous gradient edges. This is the cosmos realm's `Group` component —
|
|
45
|
+
* identical rendering for own and others' stories.
|
|
46
|
+
*
|
|
47
|
+
* The consumer provides scenes with positions already computed so that
|
|
48
|
+
* overlay logic (camera targeting, focus rings) can use the same positions.
|
|
49
|
+
*/
|
|
50
|
+
declare function Constellation({ scenes, onSceneSelect, }: ConstellationProps): react_jsx_runtime.JSX.Element;
|
|
51
|
+
|
|
52
|
+
interface ConstellationEdgeProps {
|
|
53
|
+
from: [number, number, number];
|
|
54
|
+
to: [number, number, number];
|
|
55
|
+
hueA: number;
|
|
56
|
+
hueB: number;
|
|
57
|
+
/** Inward gap so the line doesn't touch the star spheres. */
|
|
58
|
+
gap?: number;
|
|
59
|
+
intensityA?: number;
|
|
60
|
+
intensityB?: number;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* A luminous line connecting two stars in a constellation. Endpoints are
|
|
64
|
+
* pulled inward so the line floats between the stars rather than touching
|
|
65
|
+
* them. Color interpolates from hueA to hueB via vertex colors.
|
|
66
|
+
*
|
|
67
|
+
* Two overlapping lines produce the glow: a thin bright core and a wider
|
|
68
|
+
* soft bloom behind it.
|
|
69
|
+
*/
|
|
70
|
+
declare function ConstellationEdge({ from, to, hueA, hueB, gap, intensityA, intensityB, }: ConstellationEdgeProps): react_jsx_runtime.JSX.Element | null;
|
|
71
|
+
|
|
32
72
|
interface CosmosSandboxProps {
|
|
33
73
|
films: StoryListItem[];
|
|
34
74
|
onFilmSelect?: (film: StoryListItem) => void;
|
|
@@ -65,4 +105,4 @@ interface DistributeOptions {
|
|
|
65
105
|
*/
|
|
66
106
|
declare function distributeStars(count: number, options?: DistributeOptions): Vec3[];
|
|
67
107
|
|
|
68
|
-
export { CosmosSandbox, type CosmosSandboxProps, type DistributeOptions, Star, type StarProps, type Vec3, World, type WorldProps, distributeStars };
|
|
108
|
+
export { Constellation, ConstellationEdge, type ConstellationEdgeProps, type ConstellationProps, type ConstellationSceneEntry, CosmosSandbox, type CosmosSandboxProps, type DistributeOptions, Star, type StarProps, type Vec3, World, type WorldProps, distributeStars };
|