@chuzi/shared 0.2.0

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.
Files changed (39) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +52 -0
  3. package/dist/api/index.d.ts +122 -0
  4. package/dist/api/index.js +108 -0
  5. package/dist/api/index.js.map +1 -0
  6. package/dist/config/index.d.ts +39 -0
  7. package/dist/config/index.js +404 -0
  8. package/dist/config/index.js.map +1 -0
  9. package/dist/index.d.ts +6 -0
  10. package/dist/index.js +627 -0
  11. package/dist/index.js.map +1 -0
  12. package/dist/input/index.d.ts +70 -0
  13. package/dist/input/index.js +41 -0
  14. package/dist/input/index.js.map +1 -0
  15. package/dist/realms/cosmos/components/index.d.ts +68 -0
  16. package/dist/realms/cosmos/components/index.js +172 -0
  17. package/dist/realms/cosmos/components/index.js.map +1 -0
  18. package/dist/realms/cosmos/index.d.ts +8 -0
  19. package/dist/realms/cosmos/index.js +76 -0
  20. package/dist/realms/cosmos/index.js.map +1 -0
  21. package/dist/realms/index.d.ts +109 -0
  22. package/dist/realms/index.js +23 -0
  23. package/dist/realms/index.js.map +1 -0
  24. package/dist/realms/wilds/components/index.d.ts +88 -0
  25. package/dist/realms/wilds/components/index.js +359 -0
  26. package/dist/realms/wilds/components/index.js.map +1 -0
  27. package/dist/realms/wilds/index.d.ts +8 -0
  28. package/dist/realms/wilds/index.js +70 -0
  29. package/dist/realms/wilds/index.js.map +1 -0
  30. package/dist/themes/index.d.ts +46 -0
  31. package/dist/themes/index.js +63 -0
  32. package/dist/themes/index.js.map +1 -0
  33. package/dist/types/index.d.ts +292 -0
  34. package/dist/types/index.js +3 -0
  35. package/dist/types/index.js.map +1 -0
  36. package/dist/ui/index.d.ts +71 -0
  37. package/dist/ui/index.js +551 -0
  38. package/dist/ui/index.js.map +1 -0
  39. package/package.json +107 -0
@@ -0,0 +1,404 @@
1
+ // src/config/index.ts
2
+ var REALM_IDS = ["cosmos", "wilds"];
3
+ var SUPPORTED_LOCALES = [
4
+ "en",
5
+ "es",
6
+ "fr",
7
+ "de",
8
+ "pt"
9
+ ];
10
+ var LOCALE_LABELS = {
11
+ en: "English",
12
+ es: "Espa\xF1ol",
13
+ fr: "Fran\xE7ais",
14
+ de: "Deutsch",
15
+ pt: "Portugu\xEAs"
16
+ };
17
+ var DEFAULT_LOCALE = "en";
18
+ function isSupportedLocale(value) {
19
+ return typeof value === "string" && SUPPORTED_LOCALES.includes(value);
20
+ }
21
+ function normalizeLocale(value) {
22
+ if (!value) return null;
23
+ const lower = value.toLowerCase().trim();
24
+ if (isSupportedLocale(lower)) return lower;
25
+ const base = lower.split(/[-_]/, 1)[0];
26
+ return isSupportedLocale(base) ? base : null;
27
+ }
28
+ function matchAcceptLanguage(accept) {
29
+ if (!accept) return null;
30
+ const tags = accept.split(",").map((part) => {
31
+ const [tag, ...params] = part.trim().split(";");
32
+ const qParam = params.find((p) => p.trim().startsWith("q="));
33
+ const q = qParam ? parseFloat(qParam.split("=")[1]) || 0 : 1;
34
+ return { tag: tag.trim(), q };
35
+ }).filter((c) => c.tag && c.tag !== "*").sort((a, b) => b.q - a.q);
36
+ for (const c of tags) {
37
+ const normalized = normalizeLocale(c.tag);
38
+ if (normalized) return normalized;
39
+ }
40
+ return null;
41
+ }
42
+ var CONTENT_RATING_IDS = [
43
+ "G",
44
+ "PG",
45
+ "PG-13",
46
+ "R",
47
+ "NC-17"
48
+ ];
49
+ var CONTENT_RATINGS = {
50
+ G: {
51
+ id: "G",
52
+ label: "G",
53
+ description: "General Audiences \u2014 all ages admitted."
54
+ },
55
+ PG: {
56
+ id: "PG",
57
+ label: "PG",
58
+ description: "Parental Guidance Suggested \u2014 some material may not be suitable for children."
59
+ },
60
+ "PG-13": {
61
+ id: "PG-13",
62
+ label: "PG-13",
63
+ description: "Parents Strongly Cautioned \u2014 some material may be inappropriate for children under 13."
64
+ },
65
+ R: {
66
+ id: "R",
67
+ label: "R",
68
+ description: "Restricted \u2014 under 17 requires accompanying parent or adult guardian."
69
+ },
70
+ "NC-17": {
71
+ id: "NC-17",
72
+ label: "NC-17",
73
+ description: "Adults Only \u2014 no one 17 and under admitted."
74
+ }
75
+ };
76
+ function isContentRating(value) {
77
+ return typeof value === "string" && CONTENT_RATING_IDS.includes(value);
78
+ }
79
+ var REALMS = {
80
+ cosmos: {
81
+ label: "CHUZI COSMOS",
82
+ short_label: "Cosmos",
83
+ lexicon: {
84
+ genre: "Galaxy",
85
+ story: "Star System",
86
+ scene: "Planet",
87
+ scene_choice: "Trajectory",
88
+ node: "Signal",
89
+ node_type_choice: "Trajectory",
90
+ node_type_media: "Transmission",
91
+ node_type_go_to_scene: "Warp",
92
+ player: "Voyager",
93
+ library: "Star Chart",
94
+ library_open: "Open Star Chart",
95
+ library_close: "Close Star Chart",
96
+ editor: "Mission Control",
97
+ publish: "Launch",
98
+ the_end: "Final Orbit",
99
+ media_pool: "Cargo Bay",
100
+ scene_graph: "Star Chart",
101
+ watch_path: "Your trajectory",
102
+ untitled_story: "Untitled Star System",
103
+ unknown_genre: "Unknown Galaxy",
104
+ scenes_count: "planets",
105
+ choices_count: "trajectories",
106
+ drafts_published: "Drafts + Launched",
107
+ published_ver: "Launched ver.",
108
+ draft: "Draft",
109
+ no_scenes_yet: "No planets in this chart yet.",
110
+ no_path_yet: "No trajectory to show yet.",
111
+ menu_empty_drafts: "No star systems yet. Chart one to begin.",
112
+ menu_empty_published: "No launched systems in the chart.",
113
+ menu_published_heading: "Launched constellations",
114
+ menu_create_story: "New star system",
115
+ menu_create_film: "Create film",
116
+ film_title_placeholder: "Star system title",
117
+ select_genre: "Select galaxy",
118
+ genre_field_aria: "Galaxy",
119
+ delete_story_verb: "Delete star system",
120
+ title_scene_default: "Title planet",
121
+ choices_made_stat: "trajectories taken",
122
+ content_rating: "Audience Class",
123
+ content_rating_field_aria: "Audience class",
124
+ select_content_rating: "Select audience class",
125
+ unrated: "Unclassified",
126
+ viewer_credits: "Fuel Cells",
127
+ creator_credits: "Stardust"
128
+ },
129
+ locales: {
130
+ es: {
131
+ genre: "Galaxia",
132
+ story: "Sistema Estelar",
133
+ scene: "Planeta",
134
+ scene_choice: "Trayectoria",
135
+ player: "Viajero",
136
+ library: "Carta Estelar",
137
+ editor: "Control de Misi\xF3n",
138
+ publish: "Lanzar",
139
+ the_end: "\xD3rbita Final",
140
+ untitled_story: "Sistema Estelar sin t\xEDtulo",
141
+ menu_create_story: "Nuevo sistema estelar",
142
+ film_title_placeholder: "T\xEDtulo del sistema estelar",
143
+ select_genre: "Seleccionar galaxia"
144
+ },
145
+ fr: {
146
+ genre: "Galaxie",
147
+ story: "Syst\xE8me Stellaire",
148
+ scene: "Plan\xE8te",
149
+ scene_choice: "Trajectoire",
150
+ player: "Voyageur",
151
+ library: "Carte Stellaire",
152
+ editor: "Contr\xF4le de Mission",
153
+ publish: "Lancer",
154
+ the_end: "Orbite Finale",
155
+ untitled_story: "Syst\xE8me stellaire sans titre",
156
+ menu_create_story: "Nouveau syst\xE8me stellaire",
157
+ film_title_placeholder: "Titre du syst\xE8me stellaire",
158
+ select_genre: "S\xE9lectionner une galaxie"
159
+ },
160
+ de: {
161
+ genre: "Galaxie",
162
+ story: "Sternsystem",
163
+ scene: "Planet",
164
+ player: "Reisender",
165
+ publish: "Starten"
166
+ },
167
+ pt: {
168
+ genre: "Gal\xE1xia",
169
+ story: "Sistema Estelar",
170
+ scene: "Planeta",
171
+ player: "Viajante",
172
+ publish: "Lan\xE7ar"
173
+ }
174
+ }
175
+ },
176
+ wilds: {
177
+ label: "CHUZI WILDS",
178
+ short_label: "Wilds",
179
+ lexicon: {
180
+ genre: "Biome",
181
+ story: "Grove",
182
+ scene: "Clearing",
183
+ scene_choice: "Trail",
184
+ node: "Seed",
185
+ node_type_choice: "Trail",
186
+ node_type_media: "Bloom",
187
+ node_type_go_to_scene: "Crossing",
188
+ player: "Wanderer",
189
+ library: "Canopy",
190
+ library_open: "Open Canopy",
191
+ library_close: "Close Canopy",
192
+ editor: "Heartwood",
193
+ publish: "Plant",
194
+ the_end: "Roots",
195
+ media_pool: "Undergrowth",
196
+ scene_graph: "Canopy",
197
+ watch_path: "Your trail",
198
+ untitled_story: "Untitled Grove",
199
+ unknown_genre: "Unknown Biome",
200
+ scenes_count: "clearings",
201
+ choices_count: "trails",
202
+ drafts_published: "Drafts + Planted",
203
+ published_ver: "Planted ver.",
204
+ draft: "Draft",
205
+ no_scenes_yet: "No clearings in this canopy yet.",
206
+ no_path_yet: "No trail to show yet.",
207
+ menu_empty_drafts: "No groves yet. Plant one to begin.",
208
+ menu_empty_published: "No planted groves in the canopy.",
209
+ menu_published_heading: "Planted groves",
210
+ menu_create_story: "New grove",
211
+ menu_create_film: "Create film",
212
+ film_title_placeholder: "Grove title",
213
+ select_genre: "Select biome",
214
+ genre_field_aria: "Biome",
215
+ delete_story_verb: "Delete grove",
216
+ title_scene_default: "Title clearing",
217
+ choices_made_stat: "trails taken",
218
+ content_rating: "Field Guide",
219
+ content_rating_field_aria: "Field guide",
220
+ select_content_rating: "Select field guide",
221
+ unrated: "Unmarked",
222
+ viewer_credits: "Sap",
223
+ creator_credits: "Pollen"
224
+ },
225
+ locales: {
226
+ es: {
227
+ genre: "Bioma",
228
+ story: "Arboleda",
229
+ scene: "Claro",
230
+ scene_choice: "Sendero",
231
+ player: "Errante",
232
+ library: "Dosel",
233
+ editor: "Duramen",
234
+ publish: "Plantar",
235
+ the_end: "Ra\xEDces",
236
+ untitled_story: "Arboleda sin t\xEDtulo",
237
+ menu_create_story: "Nueva arboleda",
238
+ film_title_placeholder: "T\xEDtulo de la arboleda",
239
+ select_genre: "Seleccionar bioma"
240
+ },
241
+ fr: {
242
+ genre: "Biome",
243
+ story: "Bosquet",
244
+ scene: "Clairi\xE8re",
245
+ scene_choice: "Sentier",
246
+ player: "Vagabond",
247
+ library: "Canop\xE9e",
248
+ editor: "C\u0153ur de bois",
249
+ publish: "Planter",
250
+ the_end: "Racines",
251
+ untitled_story: "Bosquet sans titre",
252
+ menu_create_story: "Nouveau bosquet",
253
+ film_title_placeholder: "Titre du bosquet",
254
+ select_genre: "S\xE9lectionner un biome"
255
+ },
256
+ de: {
257
+ genre: "Biom",
258
+ story: "Hain",
259
+ scene: "Lichtung",
260
+ player: "Wanderer",
261
+ publish: "Pflanzen"
262
+ },
263
+ pt: {
264
+ genre: "Bioma",
265
+ story: "Bosque",
266
+ scene: "Clareira",
267
+ player: "Andarilho",
268
+ publish: "Plantar"
269
+ }
270
+ }
271
+ }
272
+ };
273
+ var FALLBACK_LEXICON = {
274
+ genre: "Genre",
275
+ story: "Story",
276
+ scene: "Scene",
277
+ scene_choice: "Choice",
278
+ node: "Node",
279
+ node_type_choice: "Choice",
280
+ node_type_media: "Media",
281
+ node_type_go_to_scene: "Go to scene",
282
+ player: "Player",
283
+ library: "Library",
284
+ library_open: "Open scene tree",
285
+ library_close: "Close scene tree",
286
+ editor: "Editor",
287
+ publish: "Publish",
288
+ the_end: "The End",
289
+ media_pool: "Media Pool",
290
+ scene_graph: "Scene tree",
291
+ watch_path: "Your path",
292
+ untitled_story: "Untitled Story",
293
+ unknown_genre: "Unknown Genre",
294
+ scenes_count: "scenes",
295
+ choices_count: "choices",
296
+ drafts_published: "Drafts + Published",
297
+ published_ver: "Published ver.",
298
+ draft: "Draft",
299
+ no_scenes_yet: "No scenes available yet.",
300
+ no_path_yet: "No path to show yet.",
301
+ menu_empty_drafts: "No films yet. Create one to get started.",
302
+ menu_empty_published: "No published films found.",
303
+ menu_published_heading: "Published Films",
304
+ menu_create_story: "Create Story",
305
+ menu_create_film: "Create Film",
306
+ film_title_placeholder: "Film title",
307
+ select_genre: "Select genre",
308
+ genre_field_aria: "Film genre",
309
+ delete_story_verb: "Delete film",
310
+ title_scene_default: "Title Scene",
311
+ choices_made_stat: "choices made",
312
+ content_rating: "Rating",
313
+ content_rating_field_aria: "Content rating",
314
+ select_content_rating: "Select rating",
315
+ unrated: "Not Rated",
316
+ viewer_credits: "Viewer Credits",
317
+ creator_credits: "Creator Credits"
318
+ };
319
+ var FALLBACK_LOCALES = {
320
+ es: {
321
+ genre: "G\xE9nero",
322
+ story: "Historia",
323
+ scene: "Escena",
324
+ scene_choice: "Elecci\xF3n",
325
+ player: "Reproductor",
326
+ library: "Biblioteca",
327
+ editor: "Editor",
328
+ publish: "Publicar",
329
+ the_end: "Fin",
330
+ untitled_story: "Historia sin t\xEDtulo",
331
+ menu_create_story: "Crear historia",
332
+ menu_create_film: "Crear pel\xEDcula",
333
+ film_title_placeholder: "T\xEDtulo de la pel\xEDcula",
334
+ select_genre: "Seleccionar g\xE9nero",
335
+ delete_story_verb: "Eliminar pel\xEDcula"
336
+ },
337
+ fr: {
338
+ genre: "Genre",
339
+ story: "Histoire",
340
+ scene: "Sc\xE8ne",
341
+ scene_choice: "Choix",
342
+ player: "Lecteur",
343
+ library: "Biblioth\xE8que",
344
+ editor: "\xC9diteur",
345
+ publish: "Publier",
346
+ the_end: "Fin",
347
+ untitled_story: "Histoire sans titre",
348
+ menu_create_story: "Cr\xE9er une histoire",
349
+ menu_create_film: "Cr\xE9er un film",
350
+ film_title_placeholder: "Titre du film",
351
+ select_genre: "S\xE9lectionner un genre",
352
+ delete_story_verb: "Supprimer le film"
353
+ },
354
+ de: {
355
+ genre: "Genre",
356
+ story: "Geschichte",
357
+ scene: "Szene",
358
+ publish: "Ver\xF6ffentlichen",
359
+ the_end: "Ende",
360
+ untitled_story: "Unbenannte Geschichte",
361
+ menu_create_story: "Geschichte erstellen",
362
+ film_title_placeholder: "Filmtitel",
363
+ select_genre: "Genre ausw\xE4hlen"
364
+ },
365
+ pt: {
366
+ genre: "G\xEAnero",
367
+ story: "Hist\xF3ria",
368
+ scene: "Cena",
369
+ publish: "Publicar",
370
+ the_end: "Fim",
371
+ untitled_story: "Hist\xF3ria sem t\xEDtulo",
372
+ menu_create_story: "Criar hist\xF3ria",
373
+ film_title_placeholder: "T\xEDtulo do filme",
374
+ select_genre: "Selecionar g\xEAnero"
375
+ }
376
+ };
377
+ function resolveFallback(locale) {
378
+ const overrides = locale && FALLBACK_LOCALES[locale];
379
+ return overrides ? { ...FALLBACK_LEXICON, ...overrides } : { ...FALLBACK_LEXICON };
380
+ }
381
+ function resolveRealm(realmId, locale) {
382
+ const realm = REALMS[realmId];
383
+ const overrides = locale && realm.locales ? realm.locales[locale] : void 0;
384
+ return overrides ? { ...realm.lexicon, ...overrides } : { ...realm.lexicon };
385
+ }
386
+ function t(realmId, key, fallback = "", locale = null) {
387
+ if (realmId && REALMS[realmId]) {
388
+ const realmLex = resolveRealm(realmId, locale);
389
+ if (realmLex[key] !== void 0) return realmLex[key];
390
+ }
391
+ const fb = resolveFallback(locale);
392
+ return fb[key] ?? fallback;
393
+ }
394
+ function lexiconForRealm(realmId, locale = null) {
395
+ const fb = resolveFallback(locale);
396
+ if (!realmId || !REALMS[realmId]) {
397
+ return fb;
398
+ }
399
+ return { ...fb, ...resolveRealm(realmId, locale) };
400
+ }
401
+
402
+ export { CONTENT_RATINGS, CONTENT_RATING_IDS, DEFAULT_LOCALE, FALLBACK_LEXICON, FALLBACK_LOCALES, LOCALE_LABELS, REALMS, REALM_IDS, SUPPORTED_LOCALES, isContentRating, isSupportedLocale, lexiconForRealm, matchAcceptLanguage, normalizeLocale, t };
403
+ //# sourceMappingURL=index.js.map
404
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/config/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"]}
@@ -0,0 +1,6 @@
1
+ export { BookmarkListItem, BookmarkListResponse, BookmarkResponse, CatalogResponse, ContentRating, ContentRatingDefinition, CreateStoryRequest, EngagementResponse, HistoryEntry, LocaleId, LoginRequest, LoginResponse, PaginatedLink, PaginatedResponse, PopularChoice, RealmConfigResponse, RealmDefinition, RealmId, SaveBookmarkRequest, SceneChoice, SceneMapEntry, SceneMapResponse, SceneNode, StateUpdate, StoryListItem, StoryPreview, StoryProgress, TrackEngagementRequest, TreeGraph, TreeGraphEdge, TreeGraphNode, UpdateLocaleRequest, UpdateLocaleResponse, UpdateProfileRequest, UpdateProfileResponse, UpdateRealmRequest, UpdateRealmResponse, UserProfile, VisibilityCondition, VisibilityRules, WatchSnapshot } from './types/index.js';
2
+ export { CONTENT_RATINGS, CONTENT_RATING_IDS, DEFAULT_LOCALE, FALLBACK_LEXICON, FALLBACK_LOCALES, LOCALE_LABELS, REALMS, REALM_IDS, SUPPORTED_LOCALES, isContentRating, isSupportedLocale, lexiconForRealm, matchAcceptLanguage, normalizeLocale, t } from './config/index.js';
3
+ export { RealmThemeTokens, SCENE_TREE_THEMES, SceneTreeTheme, THEME_TOKENS, getSceneTreeTheme, getThemeTokens } from './themes/index.js';
4
+ export { ChuziApiError, ChuziClient, ChuziClientConfig, TokenResolver, createChuziClient } from './api/index.js';
5
+ export { Direction, InputMode, Intent, IntentEvent, IntentName, IntentSource, mergeIntentSources } from './input/index.js';
6
+ export { AtomLocation, AtomMapping, AtomState, AtomVisualProps, AudioPalette, FocusSnap, MotionTokens, RealmModule, ZoomLevel, defaultFocusSnap } from './realms/index.js';