@krizaka/org 0.2.0 → 0.3.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.
- package/dist/index.d.ts +48 -2
- package/dist/index.js +48 -2
- package/dist/index.js.map +1 -1
- package/dist/org.json +2 -1
- package/dist/org.schema.json +15 -0
- package/package.json +2 -2
package/dist/index.d.ts
CHANGED
|
@@ -40,6 +40,8 @@ interface OrgDefaultItem {
|
|
|
40
40
|
id: string;
|
|
41
41
|
/** What the picture shows, in both languages (never who). */
|
|
42
42
|
alt: Localized;
|
|
43
|
+
/** Withdrawn from the set: still listed in the JSON, and its files stay served (a versioned URL never changes), but `listDefaults` and `defaultFor` skip it. */
|
|
44
|
+
disabled?: true;
|
|
43
45
|
urls: {
|
|
44
46
|
/** The vector, for the sets drawn from the code. */
|
|
45
47
|
svg?: string;
|
|
@@ -145,13 +147,54 @@ declare const APP_SCHEMA_URL = "https://krizaka-assets.b-cdn.net/org/v1/app.sche
|
|
|
145
147
|
/** The runtime config a mobile app may know, per live product. The app reads it at start, with a copy built into the binary as fallback. */
|
|
146
148
|
declare const apps: Record<string, AppConfig>;
|
|
147
149
|
|
|
150
|
+
/** The products that have a demo cast. */
|
|
151
|
+
type CastProduct = "yomizaka" | "akinaza";
|
|
152
|
+
/** What a persona does in the app: a member, a shop owner or a customer of one, an administrator. */
|
|
153
|
+
type CastRole = "member" | "admin" | "owner" | "client";
|
|
154
|
+
/** One fictitious person of the demo cast. No e-mail domain and no password: those come from the environment, through the secrets map. */
|
|
155
|
+
interface CastPersona {
|
|
156
|
+
/** Stable key, unique in its product: `eric`, `camille`. Seeds, recordings and tests name the persona by it. */
|
|
157
|
+
readonly id: string;
|
|
158
|
+
readonly product: CastProduct;
|
|
159
|
+
readonly firstName: string;
|
|
160
|
+
/** The name every screen, demo and recording shows: never « qa » nor « admin ». */
|
|
161
|
+
readonly displayName: string;
|
|
162
|
+
readonly role: CastRole;
|
|
163
|
+
readonly locale: "fr" | "en";
|
|
164
|
+
/** Id of a `person` default of the org defaults JSON (`defaults/v1/person/<id>`). */
|
|
165
|
+
readonly avatar: string;
|
|
166
|
+
/** Id of a `banner` default, for the personas whose page has one. */
|
|
167
|
+
readonly banner?: string;
|
|
168
|
+
/** The demo workspace the persona belongs to (a key the app's seed knows: a set of folders, a shop). */
|
|
169
|
+
readonly workspace: string;
|
|
170
|
+
}
|
|
171
|
+
/** The versioned cast. Change it here, then re-run each app's `seed --cast`: every environment gets the same people. */
|
|
172
|
+
declare const CAST_VERSION = 1;
|
|
173
|
+
declare const CAST: readonly CastPersona[];
|
|
174
|
+
/** The personas of a product, in cast order. */
|
|
175
|
+
declare const castOf: (product: CastProduct) => readonly CastPersona[];
|
|
176
|
+
/** One persona by product and id; throws on an unknown one (a seed or a recording naming a person the cast lacks is a bug). */
|
|
177
|
+
declare function persona(product: CastProduct, id: string): CastPersona;
|
|
178
|
+
/** The first persona of a role in a product (the member to sign in as, the administrator). */
|
|
179
|
+
declare function personaByRole(product: CastProduct, role: CastRole): CastPersona;
|
|
180
|
+
/** The avatar and banner URLs of a persona, from the org defaults (Bunny, versioned): never typed in an app. */
|
|
181
|
+
declare function castMedia(p: CastPersona, size?: number): {
|
|
182
|
+
avatar: string;
|
|
183
|
+
banner?: string;
|
|
184
|
+
};
|
|
185
|
+
/**
|
|
186
|
+
* The fingerprint of what a seed must leave in a database: counts per table, in a stable order. The seed prints it and
|
|
187
|
+
* a check after the deploy compares the local one with the dev one (same cast and same code give the same string).
|
|
188
|
+
*/
|
|
189
|
+
declare function seedFingerprint(counts: Readonly<Record<string, number>>): string;
|
|
190
|
+
|
|
148
191
|
/** The kinds of entity that have a default set, in the order the JSON lists them. */
|
|
149
192
|
declare const DEFAULT_KINDS: readonly ["person", "folder", "organisation", "shop", "banner"];
|
|
150
193
|
/** The `defaults` section of the org JSON: the central sets on Bunny (`defaults/v1/<kind>/<id>-<size>.<ext>`), written by krizaka-ui `tools/export-defaults.mjs`. */
|
|
151
194
|
declare const defaults: OrgDefaults;
|
|
152
195
|
/** 32-bit FNV-1a of a seed: stable across runs, devices and products (the same one `@krizaka/ui`'s default avatars use). */
|
|
153
196
|
declare function seedHash(seed: string | number): number;
|
|
154
|
-
/** The items of a kind, in the order of the JSON. A source other than the bundled one is the JSON an app fetched. */
|
|
197
|
+
/** The items of a kind that can be picked, in the order of the JSON (a withdrawn one is skipped). A source other than the bundled one is the JSON an app fetched. */
|
|
155
198
|
declare function listDefaults(kind: OrgDefaultKind, source?: OrgDefaults): readonly OrgDefaultItem[];
|
|
156
199
|
/** The item of a kind for a seed (an entity's id): deterministic, so a folder keeps its picture everywhere. `undefined` only when the kind's list is empty. */
|
|
157
200
|
declare function defaultFor(kind: OrgDefaultKind, seed: string | number, source?: OrgDefaults): OrgDefaultItem | undefined;
|
|
@@ -562,6 +605,9 @@ declare const orgSchema: {
|
|
|
562
605
|
};
|
|
563
606
|
};
|
|
564
607
|
};
|
|
608
|
+
readonly disabled: {
|
|
609
|
+
readonly const: true;
|
|
610
|
+
};
|
|
565
611
|
readonly urls: {
|
|
566
612
|
readonly type: "object";
|
|
567
613
|
readonly additionalProperties: false;
|
|
@@ -813,4 +859,4 @@ declare const localized: (text: Localized, locale: string) => string;
|
|
|
813
859
|
/** The footer line of the family, « Une entreprise de Technologies Krizaka · Fait à Montréal ». */
|
|
814
860
|
declare const footerLine: (locale: string) => string;
|
|
815
861
|
|
|
816
|
-
export { APP_SCHEMA_URL, type AppConfig, type AppEnvironment, CDN, DEFAULT_KINDS, type Localized, ORG_SCHEMA_URL, ORG_URL, type Org, type OrgAvatar, type OrgBanner, type OrgDefaultItem, type OrgDefaultKind, type OrgDefaults, type OrgMark, type OrgProduct, type OrgSite, type ProductStatus, appSchema, apps, defaultFor, defaultUrl, defaults, fetchDefaults, footerLine, listDefaults, localized, org, orgSchema, seedHash };
|
|
862
|
+
export { APP_SCHEMA_URL, type AppConfig, type AppEnvironment, CAST, CAST_VERSION, CDN, type CastPersona, type CastProduct, type CastRole, DEFAULT_KINDS, type Localized, ORG_SCHEMA_URL, ORG_URL, type Org, type OrgAvatar, type OrgBanner, type OrgDefaultItem, type OrgDefaultKind, type OrgDefaults, type OrgMark, type OrgProduct, type OrgSite, type ProductStatus, appSchema, apps, castMedia, castOf, defaultFor, defaultUrl, defaults, fetchDefaults, footerLine, listDefaults, localized, org, orgSchema, persona, personaByRole, seedFingerprint, seedHash };
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// package.json
|
|
2
2
|
var package_default = {
|
|
3
3
|
name: "@krizaka/org",
|
|
4
|
-
version: "0.
|
|
4
|
+
version: "0.3.0",
|
|
5
5
|
description: "The public facts about Krizaka, in one validated JSON that every footer, site and app reads: legal name, NEQ, \xAB Fait \xE0 Montr\xE9al \xBB in French and English, brand marks, default avatars and banners, the live products and sites, the public contact, the footer line and the mobile apps' public runtime config. Typed data, JSON Schema, and the files published on the CDN.",
|
|
6
6
|
keywords: [
|
|
7
7
|
"krizaka",
|
|
@@ -66,9 +66,11 @@ var package_default = {
|
|
|
66
66
|
var BASE = "https://krizaka-assets.b-cdn.net/defaults/v1";
|
|
67
67
|
var DEFAULT_KINDS = ["person", "folder", "organisation", "shop", "banner"];
|
|
68
68
|
var SIZES = { person: [256, 512, 1024], folder: [256, 512, 1024], organisation: [256, 512, 1024], shop: [256, 512, 1024], banner: [960, 1920] };
|
|
69
|
+
var DISABLED_DEFAULTS = /* @__PURE__ */ new Set(["banner/the-neon-flamingo"]);
|
|
69
70
|
var item = (kind, id, alt, drawn) => ({
|
|
70
71
|
id,
|
|
71
72
|
alt,
|
|
73
|
+
...DISABLED_DEFAULTS.has(`${kind}/${id}`) ? { disabled: true } : {},
|
|
72
74
|
urls: {
|
|
73
75
|
...drawn ? { svg: `${BASE}/${kind}/${id}.svg` } : {},
|
|
74
76
|
webp: Object.fromEntries(SIZES[kind].map((size) => [String(size), `${BASE}/${kind}/${id}-${size}.webp`]))
|
|
@@ -133,7 +135,7 @@ function seedHash(seed) {
|
|
|
133
135
|
return h;
|
|
134
136
|
}
|
|
135
137
|
function listDefaults(kind, source = defaults) {
|
|
136
|
-
return source.kinds[kind] ?? [];
|
|
138
|
+
return (source.kinds[kind] ?? []).filter((entry) => entry.disabled !== true);
|
|
137
139
|
}
|
|
138
140
|
function defaultFor(kind, seed, source = defaults) {
|
|
139
141
|
const items = listDefaults(kind, source);
|
|
@@ -252,6 +254,42 @@ var apps = {
|
|
|
252
254
|
akinaza: app("akinaza", "https://dev.akinaza.com")
|
|
253
255
|
};
|
|
254
256
|
|
|
257
|
+
// src/cast.ts
|
|
258
|
+
var CAST_VERSION = 1;
|
|
259
|
+
var CAST = [
|
|
260
|
+
{ id: "eric", product: "yomizaka", firstName: "\xC9ric", displayName: "\xC9ric Tremblay", role: "member", locale: "fr", avatar: "community-lead", workspace: "rosemont-villeray" },
|
|
261
|
+
{ id: "marie-eve", product: "yomizaka", firstName: "Marie-\xC8ve", displayName: "Marie-\xC8ve Bouchard", role: "admin", locale: "fr", avatar: "wise-auditor", workspace: "administration" },
|
|
262
|
+
{ id: "lea", product: "akinaza", firstName: "L\xE9a", displayName: "L\xE9a Beaulieu", role: "owner", locale: "fr", avatar: "studio-maker", banner: "cafe-maker-studio", workspace: "saint-henri" },
|
|
263
|
+
{ id: "camille", product: "akinaza", firstName: "Camille", displayName: "Camille Tremblay", role: "client", locale: "fr", avatar: "visual-artist", workspace: "saint-henri" },
|
|
264
|
+
{ id: "jordan", product: "akinaza", firstName: "Jordan", displayName: "Jordan Lee", role: "client", locale: "en", avatar: "tech-architect", workspace: "saint-henri" },
|
|
265
|
+
{ id: "nadia", product: "akinaza", firstName: "Nadia", displayName: "Nadia Benali", role: "client", locale: "fr", avatar: "digital-creator", workspace: "saint-henri" },
|
|
266
|
+
{ id: "etienne", product: "akinaza", firstName: "\xC9tienne", displayName: "\xC9tienne Gagnon", role: "client", locale: "fr", avatar: "boom-bap", workspace: "saint-henri" },
|
|
267
|
+
{ id: "sofia", product: "akinaza", firstName: "Sofia", displayName: "Sofia Rossi", role: "client", locale: "en", avatar: "salon-tattoo-maker", workspace: "saint-henri" },
|
|
268
|
+
{ id: "simon", product: "akinaza", firstName: "Simon", displayName: "Simon Roy", role: "admin", locale: "fr", avatar: "ai-builder", workspace: "administration" }
|
|
269
|
+
];
|
|
270
|
+
var castOf = (product) => CAST.filter((p) => p.product === product);
|
|
271
|
+
function persona(product, id) {
|
|
272
|
+
const found = CAST.find((p) => p.product === product && p.id === id);
|
|
273
|
+
if (!found) throw new Error(`cast: no persona "${id}" in ${product} (known: ${castOf(product).map((p) => p.id).join(", ")})`);
|
|
274
|
+
return found;
|
|
275
|
+
}
|
|
276
|
+
function personaByRole(product, role) {
|
|
277
|
+
const found = castOf(product).find((p) => p.role === role);
|
|
278
|
+
if (!found) throw new Error(`cast: no ${role} in ${product}`);
|
|
279
|
+
return found;
|
|
280
|
+
}
|
|
281
|
+
var urlOf = (kind, id, size) => {
|
|
282
|
+
const entry = listDefaults(kind).find((d) => d.id === id);
|
|
283
|
+
if (!entry) throw new Error(`cast: no ${kind} default "${id}" in the org defaults`);
|
|
284
|
+
return defaultUrl(entry, size);
|
|
285
|
+
};
|
|
286
|
+
function castMedia(p, size = 512) {
|
|
287
|
+
return { avatar: urlOf("person", p.avatar, size), ...p.banner ? { banner: urlOf("banner", p.banner, 960) } : {} };
|
|
288
|
+
}
|
|
289
|
+
function seedFingerprint(counts) {
|
|
290
|
+
return Object.keys(counts).sort((a, b) => a < b ? -1 : a > b ? 1 : 0).map((table) => `${table}=${counts[table]}`).join(";");
|
|
291
|
+
}
|
|
292
|
+
|
|
255
293
|
// src/schema.ts
|
|
256
294
|
var localized = {
|
|
257
295
|
type: "object",
|
|
@@ -281,6 +319,7 @@ var defaultItems = {
|
|
|
281
319
|
properties: {
|
|
282
320
|
id: slug,
|
|
283
321
|
alt: localized,
|
|
322
|
+
disabled: { const: true },
|
|
284
323
|
urls: {
|
|
285
324
|
type: "object",
|
|
286
325
|
additionalProperties: false,
|
|
@@ -431,12 +470,16 @@ var localized2 = (text, locale) => locale === "fr" ? text.fr : text.en;
|
|
|
431
470
|
var footerLine = (locale) => localized2(org.footer.line, locale);
|
|
432
471
|
export {
|
|
433
472
|
APP_SCHEMA_URL,
|
|
473
|
+
CAST,
|
|
474
|
+
CAST_VERSION,
|
|
434
475
|
CDN,
|
|
435
476
|
DEFAULT_KINDS,
|
|
436
477
|
ORG_SCHEMA_URL,
|
|
437
478
|
ORG_URL,
|
|
438
479
|
appSchema,
|
|
439
480
|
apps,
|
|
481
|
+
castMedia,
|
|
482
|
+
castOf,
|
|
440
483
|
defaultFor,
|
|
441
484
|
defaultUrl,
|
|
442
485
|
defaults,
|
|
@@ -446,6 +489,9 @@ export {
|
|
|
446
489
|
localized2 as localized,
|
|
447
490
|
org,
|
|
448
491
|
orgSchema,
|
|
492
|
+
persona,
|
|
493
|
+
personaByRole,
|
|
494
|
+
seedFingerprint,
|
|
449
495
|
seedHash
|
|
450
496
|
};
|
|
451
497
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../package.json","../src/defaults.ts","../src/org.ts","../src/apps.ts","../src/schema.ts","../src/index.ts"],"sourcesContent":["{\n \"name\": \"@krizaka/org\",\n \"version\": \"0.2.0\",\n \"description\": \"The public facts about Krizaka, in one validated JSON that every footer, site and app reads: legal name, NEQ, « Fait à Montréal » in French and English, brand marks, default avatars and banners, the live products and sites, the public contact, the footer line and the mobile apps' public runtime config. Typed data, JSON Schema, and the files published on the CDN.\",\n \"keywords\": [\n \"krizaka\",\n \"organization\",\n \"footer\",\n \"brand\",\n \"json-schema\"\n ],\n \"homepage\": \"https://ts.krizaka.com/org\",\n \"bugs\": \"https://github.com/krizaka/krizaka-ts/issues\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/krizaka/krizaka-ts.git\",\n \"directory\": \"packages/org\"\n },\n \"license\": \"Apache-2.0\",\n \"author\": \"Krizaka (https://www.krizaka.com)\",\n \"type\": \"module\",\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\"\n },\n \"./org.json\": \"./dist/org.json\",\n \"./org.schema.json\": \"./dist/org.schema.json\",\n \"./apps/*.json\": \"./dist/apps/*.json\",\n \"./package.json\": \"./package.json\"\n },\n \"files\": [\n \"dist\",\n \"README.md\",\n \"LICENSE\"\n ],\n \"sideEffects\": false,\n \"scripts\": {\n \"build\": \"node -e \\\"require('node:fs').rmSync('dist',{recursive:true,force:true})\\\" && tsup && node scripts/emit.mjs\",\n \"lint\": \"eslint . --max-warnings 0 && tsc --noEmit\",\n \"typecheck\": \"tsc --noEmit\",\n \"test\": \"vitest run\",\n \"check\": \"pnpm run lint && pnpm run test && pnpm run build\",\n \"publish:cdn\": \"node scripts/publish.mjs\",\n \"prepublishOnly\": \"pnpm run build\"\n },\n \"engines\": {\n \"node\": \">=22\"\n },\n \"devDependencies\": {\n \"@krizaka/config\": \"workspace:^\",\n \"@types/node\": \"^22.10.0\",\n \"ajv\": \"^8.17.0\",\n \"eslint\": \"^9.39.0\",\n \"tsup\": \"^8.5.0\",\n \"typescript\": \"^5.9.3\",\n \"vitest\": \"^4.1.11\"\n }\n}\n","import type { Localized, OrgDefaultItem, OrgDefaultKind, OrgDefaults } from \"./org.types\";\n\n/** The pull zone that serves the sets. Declared here, not imported from `org.ts`, so `org.ts` can build its section from this file. */\nconst BASE = \"https://krizaka-assets.b-cdn.net/defaults/v1\";\n\n/** The kinds of entity that have a default set, in the order the JSON lists them. */\nexport const DEFAULT_KINDS = [\"person\", \"folder\", \"organisation\", \"shop\", \"banner\"] as const satisfies readonly OrgDefaultKind[];\n\n/** The sizes (px) each kind is served in: squares for the pictures, widths for the banners (3:1). */\nconst SIZES: Record<OrgDefaultKind, readonly number[]> = { person: [256, 512, 1024], folder: [256, 512, 1024], organisation: [256, 512, 1024], shop: [256, 512, 1024], banner: [960, 1920] };\n\nconst item = (kind: OrgDefaultKind, id: string, alt: Localized, drawn: boolean): OrgDefaultItem => ({\n id,\n alt,\n urls: {\n ...(drawn ? { svg: `${BASE}/${kind}/${id}.svg` } : {}),\n webp: Object.fromEntries(SIZES[kind].map((size) => [String(size), `${BASE}/${kind}/${id}-${size}.webp`])),\n },\n});\n\nconst tones = (kind: OrgDefaultKind, id: string, alt: (n: number) => Localized): OrgDefaultItem[] => Array.from({ length: 6 }, (_, i) => item(kind, `${id}-${i + 1}`, alt(i + 1), true));\n\n/** The founder's illustrated people (`defaults/v1/person/<id>-<size>.webp`). Alt texts say what the picture shows, never who. */\nconst PEOPLE: [string, Localized][] = [\n [\"boom-bap\", { en: \"Illustration: a rapper in a denim jacket and beanie, microphone in hand, in a rainy Montréal alley at night\", fr: \"Illustration : un rappeur en veste de jean et tuque, micro à la main, dans une ruelle de Montréal sous la pluie, la nuit\" }],\n [\"rasta-creative\", { en: \"A smiling man with long dreadlocks in a paint-stained denim jacket, in an artist's workshop\", fr: \"Un homme souriant aux longues dreadlocks, en veste de jean tachée de peinture, dans un atelier d'artiste\" }],\n [\"mile-end-hipster\", { en: \"A smiling person with round glasses and an orange beanie at a leatherworking bench, in a brick workshop\", fr: \"Une personne souriante à lunettes rondes et tuque orange, à son établi de cuir, dans un atelier de briques\" }],\n [\"tech-architect\", { en: \"A person in a dark hoodie typing at a keyboard, between screens of code and a server rack\", fr: \"Une personne en chandail à capuchon sombre qui tape au clavier, entre des écrans de code et une baie de serveurs\" }],\n [\"electronic-dj\", { en: \"A DJ with headphones behind synthesizers and a mixing desk, in a club with violet lights\", fr: \"Un DJ casque aux oreilles derrière des synthétiseurs et une table de mixage, dans un club aux lumières violettes\" }],\n [\"visual-artist\", { en: \"A smiling painter with violet hair and big glasses, palette in hand, in a studio full of canvases\", fr: \"Une peintre souriante aux cheveux violets et aux grosses lunettes, palette à la main, dans un atelier plein de toiles\" }],\n [\"salon-tattoo-maker\", { en: \"A tattoo artist with tattooed arms working on a client in a warm shop with wooden shelves\", fr: \"Une tatoueuse aux bras tatoués au travail sur un client, dans un salon chaleureux aux étagères de bois\" }],\n [\"wise-auditor\", { en: \"A grey-haired person with glasses at a desk of old books and a lamp, a pen over open notes\", fr: \"Une personne aux cheveux gris et à lunettes à un bureau de vieux livres et de lampe, un stylo sur des notes ouvertes\" }],\n [\"digital-creator\", { en: \"A laughing streamer with a microphone in a purple-lit studio under a neon « Creator Zone » sign\", fr: \"Une diffuseuse qui rit devant un micro, dans un studio violet sous une enseigne néon « Creator Zone »\" }],\n [\"studio-maker\", { en: \"A potter in a linen apron holding a clay bowl, in a bright ceramics studio with plants\", fr: \"Une potière en tablier de lin tenant un bol d'argile, dans un atelier de céramique lumineux et plein de plantes\" }],\n [\"community-lead\", { en: \"A smiling person with curly hair and a grey coat at a wooden table, a community space behind them\", fr: \"Une personne souriante aux cheveux bouclés et au manteau gris, à une table de bois, devant un espace communautaire\" }],\n [\"ai-builder\", { en: \"A thoughtful person with blue-tinted glasses at a desk, screens of a neural network and code behind\", fr: \"Une personne pensive aux lunettes teintées de bleu à son bureau, devant des écrans de réseau neuronal et de code\" }],\n];\n\n/** The founder's banners, 3:1 (`defaults/v1/banner/<id>-<width>.webp`). */\nconst BANNERS: [string, Localized][] = [\n [\"montreal-winter-night\", { en: \"Illustration: a snowy night in downtown Montréal, lit shop fronts and walkers\", fr: \"Illustration : une nuit de neige au centre-ville de Montréal, devantures éclairées et passants\" }],\n [\"industrial-heritage\", { en: \"Dark blue skyline of old brick buildings with lit orange windows under a full moon\", fr: \"Silhouette bleu nuit de vieux immeubles de briques aux fenêtres orangées, sous la pleine lune\" }],\n [\"creator-loft-studio\", { en: \"A dark loft desk with a plant, a code window and a mixing board\", fr: \"Un bureau de loft sombre avec une plante, une fenêtre de code et une table de mixage\" }],\n [\"abstract-digital-flow\", { en: \"Flowing teal, violet and orange lines linking glowing points on a dark background\", fr: \"Des lignes ondulantes turquoise, violettes et orange reliant des points lumineux sur fond sombre\" }],\n [\"paperwork-and-ink\", { en: \"Two dark document cards with colored stamps on a night-blue grid\", fr: \"Deux cartes de documents sombres tamponnées de couleur sur une grille bleu nuit\" }],\n [\"nightlife-music-visual\", { en: \"A large glowing vinyl record with a pink label beside a small level meter, in violet light\", fr: \"Un grand disque vinyle lumineux à l'étiquette rose près d'un petit indicateur de niveau, en lumière violette\" }],\n [\"the-mascot-flock\", { en: \"The Krizaka mascots — an owl, a beaver and a flamingo — standing on a shelf in the dark\", fr: \"Les mascottes de Krizaka — un hibou, un castor et un flamant — debout sur une étagère dans le noir\" }],\n [\"abstract-stripes\", { en: \"Diagonal teal, indigo, violet and orange stripes with a white star and « Montréal // 514 »\", fr: \"Des bandes diagonales turquoise, indigo, violettes et orange avec une étoile blanche et « Montréal // 514 »\" }],\n [\"open-source-horizon\", { en: \"A dark terminal window on a grid, a faint horizon behind\", fr: \"Une fenêtre de terminal sombre sur une grille, un horizon pâle derrière\" }],\n [\"cafe-maker-studio\", { en: \"A warm dark brown scene with a card reading « Fabriqué à Montréal »\", fr: \"Une scène brun foncé chaleureuse avec une carte « Fabriqué à Montréal »\" }],\n [\"the-neon-flamingo\", { en: \"A pink neon flamingo outline on black, with a violet halo\", fr: \"Le contour d'un flamant rose en néon sur fond noir, avec un halo violet\" }],\n [\"cooperative-network\", { en: \"Small linked glowing points over a dark hill at dusk\", fr: \"De petits points lumineux reliés au-dessus d'une colline sombre au crépuscule\" }],\n];\n\nconst GLYPH_ALT = {\n person: (n: number): Localized => ({ en: `Default profile picture: a silhouette, tone ${n}`, fr: `Photo de profil par défaut : une silhouette, teinte ${n}` }),\n folder: (n: number): Localized => ({ en: `Default folder picture: a folder, tone ${n}`, fr: `Image de dossier par défaut : un dossier, teinte ${n}` }),\n organisation: (n: number): Localized => ({ en: `Default organisation picture: a building, tone ${n}`, fr: `Image d'organisation par défaut : un immeuble, teinte ${n}` }),\n shop: (n: number): Localized => ({ en: `Default shop picture: a storefront, tone ${n}`, fr: `Image de boutique par défaut : une devanture, teinte ${n}` }),\n};\n\n/** The `defaults` section of the org JSON: the central sets on Bunny (`defaults/v1/<kind>/<id>-<size>.<ext>`), written by krizaka-ui `tools/export-defaults.mjs`. */\nexport const defaults: OrgDefaults = {\n version: \"v1\",\n base: BASE,\n rule: {\n pick: \"fnv1a32-modulo\",\n description: \"defaultFor(kind, seed) = items[fnv1a32(String(seed)) mod items.length] of the kind's list, in the order of the JSON; the same seed always gives the same item, in every app.\",\n },\n kinds: {\n person: [...tones(\"person\", \"silhouette\", GLYPH_ALT.person), ...PEOPLE.map(([id, alt]) => item(\"person\", id, alt, false))],\n folder: tones(\"folder\", \"folder\", GLYPH_ALT.folder),\n organisation: tones(\"organisation\", \"organisation\", GLYPH_ALT.organisation),\n shop: tones(\"shop\", \"shop\", GLYPH_ALT.shop),\n banner: BANNERS.map(([id, alt]) => item(\"banner\", id, alt, false)),\n },\n};\n\n// ---- reading -------------------------------------------------------------------------------------------------------\n\n/** 32-bit FNV-1a of a seed: stable across runs, devices and products (the same one `@krizaka/ui`'s default avatars use). */\nexport function seedHash(seed: string | number): number {\n let h = 0x811c9dc5;\n for (const ch of String(seed)) {\n h ^= ch.codePointAt(0) ?? 0;\n h = Math.imul(h, 0x01000193) >>> 0;\n }\n return h;\n}\n\n/** The items of a kind, in the order of the JSON. A source other than the bundled one is the JSON an app fetched. */\nexport function listDefaults(kind: OrgDefaultKind, source: OrgDefaults = defaults): readonly OrgDefaultItem[] {\n return source.kinds[kind] ?? [];\n}\n\n/** The item of a kind for a seed (an entity's id): deterministic, so a folder keeps its picture everywhere. `undefined` only when the kind's list is empty. */\nexport function defaultFor(kind: OrgDefaultKind, seed: string | number, source: OrgDefaults = defaults): OrgDefaultItem | undefined {\n const items = listDefaults(kind, source);\n return items.length === 0 ? undefined : items[seedHash(seed) % items.length];\n}\n\n/** The URL of an item at the smallest size that is at least `size` px (or the largest there is); `svg` when the item has a vector and `format` says so. */\nexport function defaultUrl(entry: OrgDefaultItem, size: number, format: \"webp\" | \"svg\" = \"webp\"): string {\n if (format === \"svg\" && entry.urls.svg) return entry.urls.svg;\n const sizes = Object.keys(entry.urls.webp).map(Number).sort((a, b) => a - b);\n const chosen = sizes.find((s) => s >= size) ?? sizes[sizes.length - 1];\n return entry.urls.webp[String(chosen)] ?? \"\";\n}\n\n/** Reads the section from the published JSON (`ORG_URL`), for an app that does not bundle this package. */\nexport async function fetchDefaults(url: string, fetchImpl: typeof fetch = fetch): Promise<OrgDefaults> {\n const res = await fetchImpl(url, { headers: { Accept: \"application/json\" } });\n if (!res.ok) throw new Error(`${url} answered ${res.status}`);\n const json = (await res.json()) as { defaults?: OrgDefaults };\n if (!json.defaults) throw new Error(`${url} has no \\`defaults\\` section`);\n return json.defaults;\n}\n","import pkg from \"../package.json\" with { type: \"json\" };\nimport { defaults as centralDefaults } from \"./defaults\";\nimport type { Localized, Org, OrgAvatar, OrgMark } from \"./org.types\";\n\n/** The pull zone that serves the brand files and this JSON. */\nexport const CDN = \"https://krizaka-assets.b-cdn.net\";\nexport const ORG_URL = `${CDN}/org/v1/org.json`;\nexport const ORG_SCHEMA_URL = `${CDN}/org/v1/org.schema.json`;\n\nconst cdn = (path: string) => `${CDN}/${path}`;\n\nconst mark = (kind: \"logo\" | \"mark\", theme: \"dark\" | \"light\"): OrgMark => ({\n svg: cdn(`brand/krizaka/${kind}-${theme}.svg`),\n png64: cdn(`brand/krizaka/${kind}-${theme}-64.png`),\n png256: cdn(`brand/krizaka/${kind}-${theme}-256.png`),\n png512: cdn(`brand/krizaka/${kind}-${theme}-512.png`),\n png1024: cdn(`brand/krizaka/${kind}-${theme}-1024.png`),\n});\n\nconst TONES = [1, 2, 3, 4, 5, 6] as const;\n\nconst avatarAlt = (kind: \"person\" | \"plain\", n: number): Localized =>\n kind === \"person\"\n ? { fr: `Photo de profil par défaut : silhouette, teinte ${n}`, en: `Default profile picture: silhouette, tone ${n}` }\n : { fr: `Photo de profil par défaut : disque uni, teinte ${n}`, en: `Default profile picture: plain disc, tone ${n}` };\n\n/** The default profile pictures a product shows when a person has no photo (`people/defaults/v1`, krizaka-ui `tools/export-brand.mjs`). */\nconst defaults: OrgAvatar[] = ([\"person\", \"plain\"] as const).flatMap((kind) =>\n TONES.map((n) => ({\n id: `${kind}-${n}`,\n kind,\n svg: cdn(`people/defaults/v1/krizaka/${kind}-${n}.svg`),\n webp256: cdn(`people/defaults/v1/krizaka/${kind}-${n}-256.webp`),\n webp512: cdn(`people/defaults/v1/krizaka/${kind}-${n}-512.webp`),\n alt: avatarAlt(kind, n),\n })),\n);\n\n/** The public facts about Krizaka. Reviewed by pull request; changing a fact is one PR here and a release. */\nexport const org: Org = {\n $schema: ORG_SCHEMA_URL,\n schemaVersion: 2,\n version: pkg.version,\n updatedAt: \"2026-10-26\",\n company: {\n legalName: \"Technologies Krizaka Inc.\",\n tradeName: \"Krizaka\",\n neq: \"1182652231\",\n city: \"Montréal\",\n region: \"Québec\",\n country: \"CA\",\n license: \"Apache-2.0\",\n madeIn: { fr: \"Fait à Montréal\", en: \"Made in Montréal\" },\n },\n brand: {\n name: \"Krizaka\",\n logo: { dark: mark(\"logo\", \"dark\"), light: mark(\"logo\", \"light\") },\n mark: { dark: mark(\"mark\", \"dark\"), light: mark(\"mark\", \"light\") },\n favicon: cdn(\"brand/krizaka/favicon.svg\"),\n appleTouchIcon: cdn(\"brand/krizaka/apple-touch-icon.png\"),\n socialPreview: cdn(\"brand/krizaka/social-preview-1280x640.png\"),\n manifest: cdn(\"brand/manifest.json\"),\n },\n people: {\n defaults,\n // No banner is published on the CDN yet; the set joins here with its alts when it is.\n banners: [],\n },\n defaults: centralDefaults,\n products: [\n { id: \"orazaka\", name: \"Orazaka\", status: \"devPreview\", url: \"https://dev.orazaka.com\", repo: \"https://github.com/krizaka/orazaka\" },\n { id: \"yomizaka\", name: \"Yomizaka\", status: \"development\", url: \"https://dev.yomizaka.com\", repo: \"https://github.com/krizaka/yomizaka\" },\n { id: \"akinaza\", name: \"Akinaza\", status: \"development\", url: \"https://dev.akinaza.com\", repo: \"https://github.com/krizaka/akinaza\" },\n ],\n sites: [\n { id: \"www\", name: \"krizaka.com\", url: \"https://www.krizaka.com\" },\n { id: \"ui\", name: \"Krizaka UI\", url: \"https://ui.krizaka.com\" },\n { id: \"java\", name: \"Krizaka Java\", url: \"https://java.krizaka.com\" },\n { id: \"ts\", name: \"Krizaka TS\", url: \"https://ts.krizaka.com\" },\n { id: \"motion\", name: \"Krizaka Motion\", url: \"https://motion.krizaka.com\" },\n { id: \"blog\", name: \"Blog\", url: \"https://blog.krizaka.com\" },\n ],\n contact: {\n page: { fr: \"https://www.krizaka.com/fr/contact\", en: \"https://www.krizaka.com/en/contact\" },\n email: null,\n },\n footer: {\n line: { fr: \"Une entreprise de Technologies Krizaka · Fait à Montréal\", en: \"A Technologies Krizaka company · Made in Montréal\" },\n legal: [\n { id: \"privacy\", label: { fr: \"Confidentialité\", en: \"Privacy\" }, url: { fr: \"https://www.krizaka.com/fr/privacy\", en: \"https://www.krizaka.com/en/privacy\" } },\n { id: \"terms\", label: { fr: \"Conditions\", en: \"Terms\" }, url: { fr: \"https://www.krizaka.com/fr/terms\", en: \"https://www.krizaka.com/en/terms\" } },\n ],\n },\n};\n","import { CDN } from \"./org\";\nimport type { AppConfig } from \"./org.types\";\n\nexport const APP_SCHEMA_URL = `${CDN}/org/v1/app.schema.json`;\nconst UPDATED = \"2026-10-26\";\n\nconst app = (id: string, devUrl: string): AppConfig => ({\n $schema: APP_SCHEMA_URL,\n schemaVersion: 1,\n app: id,\n // Public by nature: an address a client calls. No key, no token, no internal host.\n apiBaseUrl: { dev: devUrl, production: null },\n features: {},\n minAppVersion: \"0.0.0\",\n updatedAt: UPDATED,\n});\n\n/** The runtime config a mobile app may know, per live product. The app reads it at start, with a copy built into the binary as fallback. */\nexport const apps: Record<string, AppConfig> = {\n orazaka: app(\"orazaka\", \"https://dev.orazaka.com\"),\n yomizaka: app(\"yomizaka\", \"https://dev.yomizaka.com\"),\n akinaza: app(\"akinaza\", \"https://dev.akinaza.com\"),\n};\n","import { CDN, ORG_SCHEMA_URL } from \"./org\";\n\nconst localized = {\n type: \"object\",\n additionalProperties: false,\n required: [\"fr\", \"en\"],\n properties: { fr: { type: \"string\", minLength: 1 }, en: { type: \"string\", minLength: 1 } },\n} as const;\nconst httpsUrl = { type: \"string\", format: \"uri\", pattern: \"^https://\" } as const;\nconst mark = {\n type: \"object\",\n additionalProperties: false,\n required: [\"svg\", \"png64\", \"png256\", \"png512\", \"png1024\"],\n properties: { svg: httpsUrl, png64: httpsUrl, png256: httpsUrl, png512: httpsUrl, png1024: httpsUrl },\n} as const;\nconst slug = { type: \"string\", pattern: \"^[a-z0-9]+(-[a-z0-9]+)*$\" } as const;\nconst themed = { type: \"object\", additionalProperties: false, required: [\"dark\", \"light\"], properties: { dark: mark, light: mark } } as const;\nconst date = { type: \"string\", pattern: \"^\\\\d{4}-\\\\d{2}-\\\\d{2}$\" } as const;\nconst semver = { type: \"string\", pattern: \"^\\\\d+\\\\.\\\\d+\\\\.\\\\d+$\" } as const;\n\nconst defaultItems = {\n type: \"array\",\n minItems: 1,\n uniqueItems: true,\n items: {\n type: \"object\",\n additionalProperties: false,\n required: [\"id\", \"alt\", \"urls\"],\n properties: {\n id: slug,\n alt: localized,\n urls: {\n type: \"object\",\n additionalProperties: false,\n required: [\"webp\"],\n properties: { svg: httpsUrl, webp: { type: \"object\", minProperties: 1, propertyNames: { pattern: \"^\\\\d+$\" }, additionalProperties: httpsUrl } },\n },\n },\n },\n} as const;\n\n/** The JSON Schema of `org/v1/org.json`. Nothing outside it is allowed (`additionalProperties: false` everywhere): a new fact is a new line here first. */\nexport const orgSchema = {\n $schema: \"https://json-schema.org/draft/2020-12/schema\",\n $id: ORG_SCHEMA_URL,\n title: \"Krizaka organisation — public facts\",\n type: \"object\",\n additionalProperties: false,\n required: [\"$schema\", \"schemaVersion\", \"version\", \"updatedAt\", \"company\", \"brand\", \"people\", \"defaults\", \"products\", \"sites\", \"contact\", \"footer\"],\n properties: {\n $schema: { type: \"string\" },\n schemaVersion: { enum: [1, 2] },\n version: semver,\n updatedAt: date,\n company: {\n type: \"object\",\n additionalProperties: false,\n required: [\"legalName\", \"tradeName\", \"neq\", \"city\", \"region\", \"country\", \"license\", \"madeIn\"],\n properties: {\n legalName: { type: \"string\", minLength: 1 },\n tradeName: { type: \"string\", minLength: 1 },\n neq: { type: \"string\", pattern: \"^\\\\d{10}$\" },\n city: { type: \"string\", minLength: 1 },\n region: { type: \"string\", minLength: 1 },\n country: { type: \"string\", pattern: \"^[A-Z]{2}$\" },\n license: { type: \"string\", minLength: 1 },\n madeIn: localized,\n },\n },\n brand: {\n type: \"object\",\n additionalProperties: false,\n required: [\"name\", \"logo\", \"mark\", \"favicon\", \"appleTouchIcon\", \"socialPreview\", \"manifest\"],\n properties: { name: { type: \"string\", minLength: 1 }, logo: themed, mark: themed, favicon: httpsUrl, appleTouchIcon: httpsUrl, socialPreview: httpsUrl, manifest: httpsUrl },\n },\n people: {\n type: \"object\",\n additionalProperties: false,\n required: [\"defaults\", \"banners\"],\n properties: {\n defaults: {\n type: \"array\",\n items: {\n type: \"object\",\n additionalProperties: false,\n required: [\"id\", \"kind\", \"svg\", \"webp256\", \"webp512\", \"alt\"],\n properties: { id: slug, kind: { enum: [\"person\", \"plain\"] }, svg: httpsUrl, webp256: httpsUrl, webp512: httpsUrl, alt: localized },\n },\n },\n banners: {\n type: \"array\",\n items: { type: \"object\", additionalProperties: false, required: [\"id\", \"url\", \"alt\"], properties: { id: slug, url: httpsUrl, alt: localized } },\n },\n },\n },\n defaults: {\n type: \"object\",\n additionalProperties: false,\n required: [\"version\", \"base\", \"rule\", \"kinds\"],\n properties: {\n version: { type: \"string\", pattern: \"^v\\\\d+$\" },\n base: httpsUrl,\n rule: { type: \"object\", additionalProperties: false, required: [\"pick\", \"description\"], properties: { pick: { const: \"fnv1a32-modulo\" }, description: { type: \"string\", minLength: 1 } } },\n kinds: {\n type: \"object\",\n additionalProperties: false,\n required: [\"person\", \"folder\", \"organisation\", \"shop\", \"banner\"],\n properties: Object.fromEntries([\"person\", \"folder\", \"organisation\", \"shop\", \"banner\"].map((kind) => [kind, defaultItems])),\n },\n },\n },\n products: {\n type: \"array\",\n minItems: 1,\n items: {\n type: \"object\",\n additionalProperties: false,\n required: [\"id\", \"name\", \"status\", \"url\", \"repo\"],\n properties: { id: slug, name: { type: \"string\", minLength: 1 }, status: { enum: [\"development\", \"devPreview\"] }, url: httpsUrl, repo: httpsUrl },\n },\n },\n sites: {\n type: \"array\",\n minItems: 1,\n items: { type: \"object\", additionalProperties: false, required: [\"id\", \"name\", \"url\"], properties: { id: slug, name: { type: \"string\", minLength: 1 }, url: httpsUrl } },\n },\n contact: {\n type: \"object\",\n additionalProperties: false,\n required: [\"page\", \"email\"],\n properties: {\n page: { type: \"object\", additionalProperties: false, required: [\"fr\", \"en\"], properties: { fr: httpsUrl, en: httpsUrl } },\n email: { type: [\"string\", \"null\"], format: \"email\" },\n },\n },\n footer: {\n type: \"object\",\n additionalProperties: false,\n required: [\"line\", \"legal\"],\n properties: {\n line: localized,\n legal: {\n type: \"array\",\n minItems: 1,\n items: {\n type: \"object\",\n additionalProperties: false,\n required: [\"id\", \"label\", \"url\"],\n properties: { id: { enum: [\"privacy\", \"terms\"] }, label: localized, url: { type: \"object\", additionalProperties: false, required: [\"fr\", \"en\"], properties: { fr: httpsUrl, en: httpsUrl } } },\n },\n },\n },\n },\n },\n} as const;\n\n/** The JSON Schema of `apps/<product>.json`. */\nexport const appSchema = {\n $schema: \"https://json-schema.org/draft/2020-12/schema\",\n $id: `${CDN}/org/v1/app.schema.json`,\n title: \"Krizaka mobile app — public runtime config\",\n type: \"object\",\n additionalProperties: false,\n required: [\"$schema\", \"schemaVersion\", \"app\", \"apiBaseUrl\", \"features\", \"minAppVersion\", \"updatedAt\"],\n properties: {\n $schema: { type: \"string\" },\n schemaVersion: { const: 1 },\n app: slug,\n apiBaseUrl: {\n type: \"object\",\n additionalProperties: false,\n required: [\"dev\", \"production\"],\n properties: { dev: { anyOf: [httpsUrl, { type: \"null\" }] }, production: { anyOf: [httpsUrl, { type: \"null\" }] } },\n },\n features: { type: \"object\", additionalProperties: { type: \"boolean\" } },\n minAppVersion: semver,\n updatedAt: date,\n },\n} as const;\n","export { APP_SCHEMA_URL,apps } from \"./apps\";\nexport { DEFAULT_KINDS, defaultFor, defaults, defaultUrl, fetchDefaults, listDefaults, seedHash } from \"./defaults\";\nexport { CDN, org, ORG_SCHEMA_URL, ORG_URL } from \"./org\";\nexport type { AppConfig, AppEnvironment, Localized, Org, OrgAvatar, OrgBanner, OrgDefaultItem, OrgDefaultKind, OrgDefaults, OrgMark, OrgProduct, OrgSite, ProductStatus } from \"./org.types\";\nexport { appSchema, orgSchema } from \"./schema\";\n\nimport { org } from \"./org\";\nimport type { Localized } from \"./org.types\";\n\n/** The text of a localized pair for a language (`fr` or `en`; anything else reads English). */\nexport const localized = (text: Localized, locale: string): string => (locale === \"fr\" ? text.fr : text.en);\n\n/** The footer line of the family, « Une entreprise de Technologies Krizaka · Fait à Montréal ». */\nexport const footerLine = (locale: string): string => localized(org.footer.line, locale);\n"],"mappings":"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","names":["defaults","mark","localized"]}
|
|
1
|
+
{"version":3,"sources":["../package.json","../src/defaults.ts","../src/org.ts","../src/apps.ts","../src/cast.ts","../src/schema.ts","../src/index.ts"],"sourcesContent":["{\n \"name\": \"@krizaka/org\",\n \"version\": \"0.3.0\",\n \"description\": \"The public facts about Krizaka, in one validated JSON that every footer, site and app reads: legal name, NEQ, « Fait à Montréal » in French and English, brand marks, default avatars and banners, the live products and sites, the public contact, the footer line and the mobile apps' public runtime config. Typed data, JSON Schema, and the files published on the CDN.\",\n \"keywords\": [\n \"krizaka\",\n \"organization\",\n \"footer\",\n \"brand\",\n \"json-schema\"\n ],\n \"homepage\": \"https://ts.krizaka.com/org\",\n \"bugs\": \"https://github.com/krizaka/krizaka-ts/issues\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/krizaka/krizaka-ts.git\",\n \"directory\": \"packages/org\"\n },\n \"license\": \"Apache-2.0\",\n \"author\": \"Krizaka (https://www.krizaka.com)\",\n \"type\": \"module\",\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\"\n },\n \"./org.json\": \"./dist/org.json\",\n \"./org.schema.json\": \"./dist/org.schema.json\",\n \"./apps/*.json\": \"./dist/apps/*.json\",\n \"./package.json\": \"./package.json\"\n },\n \"files\": [\n \"dist\",\n \"README.md\",\n \"LICENSE\"\n ],\n \"sideEffects\": false,\n \"scripts\": {\n \"build\": \"node -e \\\"require('node:fs').rmSync('dist',{recursive:true,force:true})\\\" && tsup && node scripts/emit.mjs\",\n \"lint\": \"eslint . --max-warnings 0 && tsc --noEmit\",\n \"typecheck\": \"tsc --noEmit\",\n \"test\": \"vitest run\",\n \"check\": \"pnpm run lint && pnpm run test && pnpm run build\",\n \"publish:cdn\": \"node scripts/publish.mjs\",\n \"prepublishOnly\": \"pnpm run build\"\n },\n \"engines\": {\n \"node\": \">=22\"\n },\n \"devDependencies\": {\n \"@krizaka/config\": \"workspace:^\",\n \"@types/node\": \"^22.10.0\",\n \"ajv\": \"^8.17.0\",\n \"eslint\": \"^9.39.0\",\n \"tsup\": \"^8.5.0\",\n \"typescript\": \"^5.9.3\",\n \"vitest\": \"^4.1.11\"\n }\n}\n","import type { Localized, OrgDefaultItem, OrgDefaultKind, OrgDefaults } from \"./org.types\";\n\n/** The pull zone that serves the sets. Declared here, not imported from `org.ts`, so `org.ts` can build its section from this file. */\nconst BASE = \"https://krizaka-assets.b-cdn.net/defaults/v1\";\n\n/** The kinds of entity that have a default set, in the order the JSON lists them. */\nexport const DEFAULT_KINDS = [\"person\", \"folder\", \"organisation\", \"shop\", \"banner\"] as const satisfies readonly OrgDefaultKind[];\n\n/** The sizes (px) each kind is served in: squares for the pictures, widths for the banners (3:1). */\nconst SIZES: Record<OrgDefaultKind, readonly number[]> = { person: [256, 512, 1024], folder: [256, 512, 1024], organisation: [256, 512, 1024], shop: [256, 512, 1024], banner: [960, 1920] };\n\n/** Withdrawn pictures, `<kind>/<id>`: kept in the JSON and on the CDN, never picked. The neon flamingo carries the wordmark of a paused product. */\nexport const DISABLED_DEFAULTS: ReadonlySet<string> = new Set([\"banner/the-neon-flamingo\"]);\n\nconst item = (kind: OrgDefaultKind, id: string, alt: Localized, drawn: boolean): OrgDefaultItem => ({\n id,\n alt,\n ...(DISABLED_DEFAULTS.has(`${kind}/${id}`) ? { disabled: true as const } : {}),\n urls: {\n ...(drawn ? { svg: `${BASE}/${kind}/${id}.svg` } : {}),\n webp: Object.fromEntries(SIZES[kind].map((size) => [String(size), `${BASE}/${kind}/${id}-${size}.webp`])),\n },\n});\n\nconst tones = (kind: OrgDefaultKind, id: string, alt: (n: number) => Localized): OrgDefaultItem[] => Array.from({ length: 6 }, (_, i) => item(kind, `${id}-${i + 1}`, alt(i + 1), true));\n\n/** The founder's illustrated people (`defaults/v1/person/<id>-<size>.webp`). Alt texts say what the picture shows, never who. */\nconst PEOPLE: [string, Localized][] = [\n [\"boom-bap\", { en: \"Illustration: a rapper in a denim jacket and beanie, microphone in hand, in a rainy Montréal alley at night\", fr: \"Illustration : un rappeur en veste de jean et tuque, micro à la main, dans une ruelle de Montréal sous la pluie, la nuit\" }],\n [\"rasta-creative\", { en: \"A smiling man with long dreadlocks in a paint-stained denim jacket, in an artist's workshop\", fr: \"Un homme souriant aux longues dreadlocks, en veste de jean tachée de peinture, dans un atelier d'artiste\" }],\n [\"mile-end-hipster\", { en: \"A smiling person with round glasses and an orange beanie at a leatherworking bench, in a brick workshop\", fr: \"Une personne souriante à lunettes rondes et tuque orange, à son établi de cuir, dans un atelier de briques\" }],\n [\"tech-architect\", { en: \"A person in a dark hoodie typing at a keyboard, between screens of code and a server rack\", fr: \"Une personne en chandail à capuchon sombre qui tape au clavier, entre des écrans de code et une baie de serveurs\" }],\n [\"electronic-dj\", { en: \"A DJ with headphones behind synthesizers and a mixing desk, in a club with violet lights\", fr: \"Un DJ casque aux oreilles derrière des synthétiseurs et une table de mixage, dans un club aux lumières violettes\" }],\n [\"visual-artist\", { en: \"A smiling painter with violet hair and big glasses, palette in hand, in a studio full of canvases\", fr: \"Une peintre souriante aux cheveux violets et aux grosses lunettes, palette à la main, dans un atelier plein de toiles\" }],\n [\"salon-tattoo-maker\", { en: \"A tattoo artist with tattooed arms working on a client in a warm shop with wooden shelves\", fr: \"Une tatoueuse aux bras tatoués au travail sur un client, dans un salon chaleureux aux étagères de bois\" }],\n [\"wise-auditor\", { en: \"A grey-haired person with glasses at a desk of old books and a lamp, a pen over open notes\", fr: \"Une personne aux cheveux gris et à lunettes à un bureau de vieux livres et de lampe, un stylo sur des notes ouvertes\" }],\n [\"digital-creator\", { en: \"A laughing streamer with a microphone in a purple-lit studio under a neon « Creator Zone » sign\", fr: \"Une diffuseuse qui rit devant un micro, dans un studio violet sous une enseigne néon « Creator Zone »\" }],\n [\"studio-maker\", { en: \"A potter in a linen apron holding a clay bowl, in a bright ceramics studio with plants\", fr: \"Une potière en tablier de lin tenant un bol d'argile, dans un atelier de céramique lumineux et plein de plantes\" }],\n [\"community-lead\", { en: \"A smiling person with curly hair and a grey coat at a wooden table, a community space behind them\", fr: \"Une personne souriante aux cheveux bouclés et au manteau gris, à une table de bois, devant un espace communautaire\" }],\n [\"ai-builder\", { en: \"A thoughtful person with blue-tinted glasses at a desk, screens of a neural network and code behind\", fr: \"Une personne pensive aux lunettes teintées de bleu à son bureau, devant des écrans de réseau neuronal et de code\" }],\n];\n\n/** The founder's banners, 3:1 (`defaults/v1/banner/<id>-<width>.webp`). */\nconst BANNERS: [string, Localized][] = [\n [\"montreal-winter-night\", { en: \"Illustration: a snowy night in downtown Montréal, lit shop fronts and walkers\", fr: \"Illustration : une nuit de neige au centre-ville de Montréal, devantures éclairées et passants\" }],\n [\"industrial-heritage\", { en: \"Dark blue skyline of old brick buildings with lit orange windows under a full moon\", fr: \"Silhouette bleu nuit de vieux immeubles de briques aux fenêtres orangées, sous la pleine lune\" }],\n [\"creator-loft-studio\", { en: \"A dark loft desk with a plant, a code window and a mixing board\", fr: \"Un bureau de loft sombre avec une plante, une fenêtre de code et une table de mixage\" }],\n [\"abstract-digital-flow\", { en: \"Flowing teal, violet and orange lines linking glowing points on a dark background\", fr: \"Des lignes ondulantes turquoise, violettes et orange reliant des points lumineux sur fond sombre\" }],\n [\"paperwork-and-ink\", { en: \"Two dark document cards with colored stamps on a night-blue grid\", fr: \"Deux cartes de documents sombres tamponnées de couleur sur une grille bleu nuit\" }],\n [\"nightlife-music-visual\", { en: \"A large glowing vinyl record with a pink label beside a small level meter, in violet light\", fr: \"Un grand disque vinyle lumineux à l'étiquette rose près d'un petit indicateur de niveau, en lumière violette\" }],\n [\"the-mascot-flock\", { en: \"The Krizaka mascots — an owl, a beaver and a flamingo — standing on a shelf in the dark\", fr: \"Les mascottes de Krizaka — un hibou, un castor et un flamant — debout sur une étagère dans le noir\" }],\n [\"abstract-stripes\", { en: \"Diagonal teal, indigo, violet and orange stripes with a white star and « Montréal // 514 »\", fr: \"Des bandes diagonales turquoise, indigo, violettes et orange avec une étoile blanche et « Montréal // 514 »\" }],\n [\"open-source-horizon\", { en: \"A dark terminal window on a grid, a faint horizon behind\", fr: \"Une fenêtre de terminal sombre sur une grille, un horizon pâle derrière\" }],\n [\"cafe-maker-studio\", { en: \"A warm dark brown scene with a card reading « Fabriqué à Montréal »\", fr: \"Une scène brun foncé chaleureuse avec une carte « Fabriqué à Montréal »\" }],\n [\"the-neon-flamingo\", { en: \"A pink neon flamingo outline on black, with a violet halo\", fr: \"Le contour d'un flamant rose en néon sur fond noir, avec un halo violet\" }],\n [\"cooperative-network\", { en: \"Small linked glowing points over a dark hill at dusk\", fr: \"De petits points lumineux reliés au-dessus d'une colline sombre au crépuscule\" }],\n];\n\nconst GLYPH_ALT = {\n person: (n: number): Localized => ({ en: `Default profile picture: a silhouette, tone ${n}`, fr: `Photo de profil par défaut : une silhouette, teinte ${n}` }),\n folder: (n: number): Localized => ({ en: `Default folder picture: a folder, tone ${n}`, fr: `Image de dossier par défaut : un dossier, teinte ${n}` }),\n organisation: (n: number): Localized => ({ en: `Default organisation picture: a building, tone ${n}`, fr: `Image d'organisation par défaut : un immeuble, teinte ${n}` }),\n shop: (n: number): Localized => ({ en: `Default shop picture: a storefront, tone ${n}`, fr: `Image de boutique par défaut : une devanture, teinte ${n}` }),\n};\n\n/** The `defaults` section of the org JSON: the central sets on Bunny (`defaults/v1/<kind>/<id>-<size>.<ext>`), written by krizaka-ui `tools/export-defaults.mjs`. */\nexport const defaults: OrgDefaults = {\n version: \"v1\",\n base: BASE,\n rule: {\n pick: \"fnv1a32-modulo\",\n description: \"defaultFor(kind, seed) = items[fnv1a32(String(seed)) mod items.length] of the kind's list, in the order of the JSON; the same seed always gives the same item, in every app.\",\n },\n kinds: {\n person: [...tones(\"person\", \"silhouette\", GLYPH_ALT.person), ...PEOPLE.map(([id, alt]) => item(\"person\", id, alt, false))],\n folder: tones(\"folder\", \"folder\", GLYPH_ALT.folder),\n organisation: tones(\"organisation\", \"organisation\", GLYPH_ALT.organisation),\n shop: tones(\"shop\", \"shop\", GLYPH_ALT.shop),\n banner: BANNERS.map(([id, alt]) => item(\"banner\", id, alt, false)),\n },\n};\n\n// ---- reading -------------------------------------------------------------------------------------------------------\n\n/** 32-bit FNV-1a of a seed: stable across runs, devices and products (the same one `@krizaka/ui`'s default avatars use). */\nexport function seedHash(seed: string | number): number {\n let h = 0x811c9dc5;\n for (const ch of String(seed)) {\n h ^= ch.codePointAt(0) ?? 0;\n h = Math.imul(h, 0x01000193) >>> 0;\n }\n return h;\n}\n\n/** The items of a kind that can be picked, in the order of the JSON (a withdrawn one is skipped). A source other than the bundled one is the JSON an app fetched. */\nexport function listDefaults(kind: OrgDefaultKind, source: OrgDefaults = defaults): readonly OrgDefaultItem[] {\n return (source.kinds[kind] ?? []).filter((entry) => entry.disabled !== true);\n}\n\n/** The item of a kind for a seed (an entity's id): deterministic, so a folder keeps its picture everywhere. `undefined` only when the kind's list is empty. */\nexport function defaultFor(kind: OrgDefaultKind, seed: string | number, source: OrgDefaults = defaults): OrgDefaultItem | undefined {\n const items = listDefaults(kind, source);\n return items.length === 0 ? undefined : items[seedHash(seed) % items.length];\n}\n\n/** The URL of an item at the smallest size that is at least `size` px (or the largest there is); `svg` when the item has a vector and `format` says so. */\nexport function defaultUrl(entry: OrgDefaultItem, size: number, format: \"webp\" | \"svg\" = \"webp\"): string {\n if (format === \"svg\" && entry.urls.svg) return entry.urls.svg;\n const sizes = Object.keys(entry.urls.webp).map(Number).sort((a, b) => a - b);\n const chosen = sizes.find((s) => s >= size) ?? sizes[sizes.length - 1];\n return entry.urls.webp[String(chosen)] ?? \"\";\n}\n\n/** Reads the section from the published JSON (`ORG_URL`), for an app that does not bundle this package. */\nexport async function fetchDefaults(url: string, fetchImpl: typeof fetch = fetch): Promise<OrgDefaults> {\n const res = await fetchImpl(url, { headers: { Accept: \"application/json\" } });\n if (!res.ok) throw new Error(`${url} answered ${res.status}`);\n const json = (await res.json()) as { defaults?: OrgDefaults };\n if (!json.defaults) throw new Error(`${url} has no \\`defaults\\` section`);\n return json.defaults;\n}\n","import pkg from \"../package.json\" with { type: \"json\" };\nimport { defaults as centralDefaults } from \"./defaults\";\nimport type { Localized, Org, OrgAvatar, OrgMark } from \"./org.types\";\n\n/** The pull zone that serves the brand files and this JSON. */\nexport const CDN = \"https://krizaka-assets.b-cdn.net\";\nexport const ORG_URL = `${CDN}/org/v1/org.json`;\nexport const ORG_SCHEMA_URL = `${CDN}/org/v1/org.schema.json`;\n\nconst cdn = (path: string) => `${CDN}/${path}`;\n\nconst mark = (kind: \"logo\" | \"mark\", theme: \"dark\" | \"light\"): OrgMark => ({\n svg: cdn(`brand/krizaka/${kind}-${theme}.svg`),\n png64: cdn(`brand/krizaka/${kind}-${theme}-64.png`),\n png256: cdn(`brand/krizaka/${kind}-${theme}-256.png`),\n png512: cdn(`brand/krizaka/${kind}-${theme}-512.png`),\n png1024: cdn(`brand/krizaka/${kind}-${theme}-1024.png`),\n});\n\nconst TONES = [1, 2, 3, 4, 5, 6] as const;\n\nconst avatarAlt = (kind: \"person\" | \"plain\", n: number): Localized =>\n kind === \"person\"\n ? { fr: `Photo de profil par défaut : silhouette, teinte ${n}`, en: `Default profile picture: silhouette, tone ${n}` }\n : { fr: `Photo de profil par défaut : disque uni, teinte ${n}`, en: `Default profile picture: plain disc, tone ${n}` };\n\n/** The default profile pictures a product shows when a person has no photo (`people/defaults/v1`, krizaka-ui `tools/export-brand.mjs`). */\nconst defaults: OrgAvatar[] = ([\"person\", \"plain\"] as const).flatMap((kind) =>\n TONES.map((n) => ({\n id: `${kind}-${n}`,\n kind,\n svg: cdn(`people/defaults/v1/krizaka/${kind}-${n}.svg`),\n webp256: cdn(`people/defaults/v1/krizaka/${kind}-${n}-256.webp`),\n webp512: cdn(`people/defaults/v1/krizaka/${kind}-${n}-512.webp`),\n alt: avatarAlt(kind, n),\n })),\n);\n\n/** The public facts about Krizaka. Reviewed by pull request; changing a fact is one PR here and a release. */\nexport const org: Org = {\n $schema: ORG_SCHEMA_URL,\n schemaVersion: 2,\n version: pkg.version,\n updatedAt: \"2026-10-26\",\n company: {\n legalName: \"Technologies Krizaka Inc.\",\n tradeName: \"Krizaka\",\n neq: \"1182652231\",\n city: \"Montréal\",\n region: \"Québec\",\n country: \"CA\",\n license: \"Apache-2.0\",\n madeIn: { fr: \"Fait à Montréal\", en: \"Made in Montréal\" },\n },\n brand: {\n name: \"Krizaka\",\n logo: { dark: mark(\"logo\", \"dark\"), light: mark(\"logo\", \"light\") },\n mark: { dark: mark(\"mark\", \"dark\"), light: mark(\"mark\", \"light\") },\n favicon: cdn(\"brand/krizaka/favicon.svg\"),\n appleTouchIcon: cdn(\"brand/krizaka/apple-touch-icon.png\"),\n socialPreview: cdn(\"brand/krizaka/social-preview-1280x640.png\"),\n manifest: cdn(\"brand/manifest.json\"),\n },\n people: {\n defaults,\n // No banner is published on the CDN yet; the set joins here with its alts when it is.\n banners: [],\n },\n defaults: centralDefaults,\n products: [\n { id: \"orazaka\", name: \"Orazaka\", status: \"devPreview\", url: \"https://dev.orazaka.com\", repo: \"https://github.com/krizaka/orazaka\" },\n { id: \"yomizaka\", name: \"Yomizaka\", status: \"development\", url: \"https://dev.yomizaka.com\", repo: \"https://github.com/krizaka/yomizaka\" },\n { id: \"akinaza\", name: \"Akinaza\", status: \"development\", url: \"https://dev.akinaza.com\", repo: \"https://github.com/krizaka/akinaza\" },\n ],\n sites: [\n { id: \"www\", name: \"krizaka.com\", url: \"https://www.krizaka.com\" },\n { id: \"ui\", name: \"Krizaka UI\", url: \"https://ui.krizaka.com\" },\n { id: \"java\", name: \"Krizaka Java\", url: \"https://java.krizaka.com\" },\n { id: \"ts\", name: \"Krizaka TS\", url: \"https://ts.krizaka.com\" },\n { id: \"motion\", name: \"Krizaka Motion\", url: \"https://motion.krizaka.com\" },\n { id: \"blog\", name: \"Blog\", url: \"https://blog.krizaka.com\" },\n ],\n contact: {\n page: { fr: \"https://www.krizaka.com/fr/contact\", en: \"https://www.krizaka.com/en/contact\" },\n email: null,\n },\n footer: {\n line: { fr: \"Une entreprise de Technologies Krizaka · Fait à Montréal\", en: \"A Technologies Krizaka company · Made in Montréal\" },\n legal: [\n { id: \"privacy\", label: { fr: \"Confidentialité\", en: \"Privacy\" }, url: { fr: \"https://www.krizaka.com/fr/privacy\", en: \"https://www.krizaka.com/en/privacy\" } },\n { id: \"terms\", label: { fr: \"Conditions\", en: \"Terms\" }, url: { fr: \"https://www.krizaka.com/fr/terms\", en: \"https://www.krizaka.com/en/terms\" } },\n ],\n },\n};\n","import { CDN } from \"./org\";\nimport type { AppConfig } from \"./org.types\";\n\nexport const APP_SCHEMA_URL = `${CDN}/org/v1/app.schema.json`;\nconst UPDATED = \"2026-10-26\";\n\nconst app = (id: string, devUrl: string): AppConfig => ({\n $schema: APP_SCHEMA_URL,\n schemaVersion: 1,\n app: id,\n // Public by nature: an address a client calls. No key, no token, no internal host.\n apiBaseUrl: { dev: devUrl, production: null },\n features: {},\n minAppVersion: \"0.0.0\",\n updatedAt: UPDATED,\n});\n\n/** The runtime config a mobile app may know, per live product. The app reads it at start, with a copy built into the binary as fallback. */\nexport const apps: Record<string, AppConfig> = {\n orazaka: app(\"orazaka\", \"https://dev.orazaka.com\"),\n yomizaka: app(\"yomizaka\", \"https://dev.yomizaka.com\"),\n akinaza: app(\"akinaza\", \"https://dev.akinaza.com\"),\n};\n","import { defaultUrl, listDefaults } from \"./defaults\";\nimport type { OrgDefaultItem } from \"./org.types\";\n\n/** The products that have a demo cast. */\nexport type CastProduct = \"yomizaka\" | \"akinaza\";\n\n/** What a persona does in the app: a member, a shop owner or a customer of one, an administrator. */\nexport type CastRole = \"member\" | \"admin\" | \"owner\" | \"client\";\n\n/** One fictitious person of the demo cast. No e-mail domain and no password: those come from the environment, through the secrets map. */\nexport interface CastPersona {\n /** Stable key, unique in its product: `eric`, `camille`. Seeds, recordings and tests name the persona by it. */\n readonly id: string;\n readonly product: CastProduct;\n readonly firstName: string;\n /** The name every screen, demo and recording shows: never « qa » nor « admin ». */\n readonly displayName: string;\n readonly role: CastRole;\n readonly locale: \"fr\" | \"en\";\n /** Id of a `person` default of the org defaults JSON (`defaults/v1/person/<id>`). */\n readonly avatar: string;\n /** Id of a `banner` default, for the personas whose page has one. */\n readonly banner?: string;\n /** The demo workspace the persona belongs to (a key the app's seed knows: a set of folders, a shop). */\n readonly workspace: string;\n}\n\n/** The versioned cast. Change it here, then re-run each app's `seed --cast`: every environment gets the same people. */\n// @fixed: a schema version of the cast, bumped by hand when its shape changes\nexport const CAST_VERSION = 1;\n\nexport const CAST: readonly CastPersona[] = [\n { id: \"eric\", product: \"yomizaka\", firstName: \"Éric\", displayName: \"Éric Tremblay\", role: \"member\", locale: \"fr\", avatar: \"community-lead\", workspace: \"rosemont-villeray\" },\n { id: \"marie-eve\", product: \"yomizaka\", firstName: \"Marie-Ève\", displayName: \"Marie-Ève Bouchard\", role: \"admin\", locale: \"fr\", avatar: \"wise-auditor\", workspace: \"administration\" },\n { id: \"lea\", product: \"akinaza\", firstName: \"Léa\", displayName: \"Léa Beaulieu\", role: \"owner\", locale: \"fr\", avatar: \"studio-maker\", banner: \"cafe-maker-studio\", workspace: \"saint-henri\" },\n { id: \"camille\", product: \"akinaza\", firstName: \"Camille\", displayName: \"Camille Tremblay\", role: \"client\", locale: \"fr\", avatar: \"visual-artist\", workspace: \"saint-henri\" },\n { id: \"jordan\", product: \"akinaza\", firstName: \"Jordan\", displayName: \"Jordan Lee\", role: \"client\", locale: \"en\", avatar: \"tech-architect\", workspace: \"saint-henri\" },\n { id: \"nadia\", product: \"akinaza\", firstName: \"Nadia\", displayName: \"Nadia Benali\", role: \"client\", locale: \"fr\", avatar: \"digital-creator\", workspace: \"saint-henri\" },\n { id: \"etienne\", product: \"akinaza\", firstName: \"Étienne\", displayName: \"Étienne Gagnon\", role: \"client\", locale: \"fr\", avatar: \"boom-bap\", workspace: \"saint-henri\" },\n { id: \"sofia\", product: \"akinaza\", firstName: \"Sofia\", displayName: \"Sofia Rossi\", role: \"client\", locale: \"en\", avatar: \"salon-tattoo-maker\", workspace: \"saint-henri\" },\n { id: \"simon\", product: \"akinaza\", firstName: \"Simon\", displayName: \"Simon Roy\", role: \"admin\", locale: \"fr\", avatar: \"ai-builder\", workspace: \"administration\" },\n];\n\n/** The personas of a product, in cast order. */\nexport const castOf = (product: CastProduct): readonly CastPersona[] => CAST.filter((p) => p.product === product);\n\n/** One persona by product and id; throws on an unknown one (a seed or a recording naming a person the cast lacks is a bug). */\nexport function persona(product: CastProduct, id: string): CastPersona {\n const found = CAST.find((p) => p.product === product && p.id === id);\n if (!found) throw new Error(`cast: no persona \"${id}\" in ${product} (known: ${castOf(product).map((p) => p.id).join(\", \")})`);\n return found;\n}\n\n/** The first persona of a role in a product (the member to sign in as, the administrator). */\nexport function personaByRole(product: CastProduct, role: CastRole): CastPersona {\n const found = castOf(product).find((p) => p.role === role);\n if (!found) throw new Error(`cast: no ${role} in ${product}`);\n return found;\n}\n\nconst urlOf = (kind: \"person\" | \"banner\", id: string, size: number): string => {\n const entry: OrgDefaultItem | undefined = listDefaults(kind).find((d) => d.id === id);\n if (!entry) throw new Error(`cast: no ${kind} default \"${id}\" in the org defaults`);\n return defaultUrl(entry, size);\n};\n\n/** The avatar and banner URLs of a persona, from the org defaults (Bunny, versioned): never typed in an app. */\nexport function castMedia(p: CastPersona, size = 512): { avatar: string; banner?: string } {\n return { avatar: urlOf(\"person\", p.avatar, size), ...(p.banner ? { banner: urlOf(\"banner\", p.banner, 960) } : {}) };\n}\n\n/**\n * The fingerprint of what a seed must leave in a database: counts per table, in a stable order. The seed prints it and\n * a check after the deploy compares the local one with the dev one (same cast and same code give the same string).\n */\nexport function seedFingerprint(counts: Readonly<Record<string, number>>): string {\n return Object.keys(counts)\n .sort((a, b) => (a < b ? -1 : a > b ? 1 : 0)) // by code point, never by locale: the same string on every machine\n .map((table) => `${table}=${counts[table]}`)\n .join(\";\");\n}\n","import { CDN, ORG_SCHEMA_URL } from \"./org\";\n\nconst localized = {\n type: \"object\",\n additionalProperties: false,\n required: [\"fr\", \"en\"],\n properties: { fr: { type: \"string\", minLength: 1 }, en: { type: \"string\", minLength: 1 } },\n} as const;\nconst httpsUrl = { type: \"string\", format: \"uri\", pattern: \"^https://\" } as const;\nconst mark = {\n type: \"object\",\n additionalProperties: false,\n required: [\"svg\", \"png64\", \"png256\", \"png512\", \"png1024\"],\n properties: { svg: httpsUrl, png64: httpsUrl, png256: httpsUrl, png512: httpsUrl, png1024: httpsUrl },\n} as const;\nconst slug = { type: \"string\", pattern: \"^[a-z0-9]+(-[a-z0-9]+)*$\" } as const;\nconst themed = { type: \"object\", additionalProperties: false, required: [\"dark\", \"light\"], properties: { dark: mark, light: mark } } as const;\nconst date = { type: \"string\", pattern: \"^\\\\d{4}-\\\\d{2}-\\\\d{2}$\" } as const;\nconst semver = { type: \"string\", pattern: \"^\\\\d+\\\\.\\\\d+\\\\.\\\\d+$\" } as const;\n\nconst defaultItems = {\n type: \"array\",\n minItems: 1,\n uniqueItems: true,\n items: {\n type: \"object\",\n additionalProperties: false,\n required: [\"id\", \"alt\", \"urls\"],\n properties: {\n id: slug,\n alt: localized,\n disabled: { const: true },\n urls: {\n type: \"object\",\n additionalProperties: false,\n required: [\"webp\"],\n properties: { svg: httpsUrl, webp: { type: \"object\", minProperties: 1, propertyNames: { pattern: \"^\\\\d+$\" }, additionalProperties: httpsUrl } },\n },\n },\n },\n} as const;\n\n/** The JSON Schema of `org/v1/org.json`. Nothing outside it is allowed (`additionalProperties: false` everywhere): a new fact is a new line here first. */\nexport const orgSchema = {\n $schema: \"https://json-schema.org/draft/2020-12/schema\",\n $id: ORG_SCHEMA_URL,\n title: \"Krizaka organisation — public facts\",\n type: \"object\",\n additionalProperties: false,\n required: [\"$schema\", \"schemaVersion\", \"version\", \"updatedAt\", \"company\", \"brand\", \"people\", \"defaults\", \"products\", \"sites\", \"contact\", \"footer\"],\n properties: {\n $schema: { type: \"string\" },\n schemaVersion: { enum: [1, 2] },\n version: semver,\n updatedAt: date,\n company: {\n type: \"object\",\n additionalProperties: false,\n required: [\"legalName\", \"tradeName\", \"neq\", \"city\", \"region\", \"country\", \"license\", \"madeIn\"],\n properties: {\n legalName: { type: \"string\", minLength: 1 },\n tradeName: { type: \"string\", minLength: 1 },\n neq: { type: \"string\", pattern: \"^\\\\d{10}$\" },\n city: { type: \"string\", minLength: 1 },\n region: { type: \"string\", minLength: 1 },\n country: { type: \"string\", pattern: \"^[A-Z]{2}$\" },\n license: { type: \"string\", minLength: 1 },\n madeIn: localized,\n },\n },\n brand: {\n type: \"object\",\n additionalProperties: false,\n required: [\"name\", \"logo\", \"mark\", \"favicon\", \"appleTouchIcon\", \"socialPreview\", \"manifest\"],\n properties: { name: { type: \"string\", minLength: 1 }, logo: themed, mark: themed, favicon: httpsUrl, appleTouchIcon: httpsUrl, socialPreview: httpsUrl, manifest: httpsUrl },\n },\n people: {\n type: \"object\",\n additionalProperties: false,\n required: [\"defaults\", \"banners\"],\n properties: {\n defaults: {\n type: \"array\",\n items: {\n type: \"object\",\n additionalProperties: false,\n required: [\"id\", \"kind\", \"svg\", \"webp256\", \"webp512\", \"alt\"],\n properties: { id: slug, kind: { enum: [\"person\", \"plain\"] }, svg: httpsUrl, webp256: httpsUrl, webp512: httpsUrl, alt: localized },\n },\n },\n banners: {\n type: \"array\",\n items: { type: \"object\", additionalProperties: false, required: [\"id\", \"url\", \"alt\"], properties: { id: slug, url: httpsUrl, alt: localized } },\n },\n },\n },\n defaults: {\n type: \"object\",\n additionalProperties: false,\n required: [\"version\", \"base\", \"rule\", \"kinds\"],\n properties: {\n version: { type: \"string\", pattern: \"^v\\\\d+$\" },\n base: httpsUrl,\n rule: { type: \"object\", additionalProperties: false, required: [\"pick\", \"description\"], properties: { pick: { const: \"fnv1a32-modulo\" }, description: { type: \"string\", minLength: 1 } } },\n kinds: {\n type: \"object\",\n additionalProperties: false,\n required: [\"person\", \"folder\", \"organisation\", \"shop\", \"banner\"],\n properties: Object.fromEntries([\"person\", \"folder\", \"organisation\", \"shop\", \"banner\"].map((kind) => [kind, defaultItems])),\n },\n },\n },\n products: {\n type: \"array\",\n minItems: 1,\n items: {\n type: \"object\",\n additionalProperties: false,\n required: [\"id\", \"name\", \"status\", \"url\", \"repo\"],\n properties: { id: slug, name: { type: \"string\", minLength: 1 }, status: { enum: [\"development\", \"devPreview\"] }, url: httpsUrl, repo: httpsUrl },\n },\n },\n sites: {\n type: \"array\",\n minItems: 1,\n items: { type: \"object\", additionalProperties: false, required: [\"id\", \"name\", \"url\"], properties: { id: slug, name: { type: \"string\", minLength: 1 }, url: httpsUrl } },\n },\n contact: {\n type: \"object\",\n additionalProperties: false,\n required: [\"page\", \"email\"],\n properties: {\n page: { type: \"object\", additionalProperties: false, required: [\"fr\", \"en\"], properties: { fr: httpsUrl, en: httpsUrl } },\n email: { type: [\"string\", \"null\"], format: \"email\" },\n },\n },\n footer: {\n type: \"object\",\n additionalProperties: false,\n required: [\"line\", \"legal\"],\n properties: {\n line: localized,\n legal: {\n type: \"array\",\n minItems: 1,\n items: {\n type: \"object\",\n additionalProperties: false,\n required: [\"id\", \"label\", \"url\"],\n properties: { id: { enum: [\"privacy\", \"terms\"] }, label: localized, url: { type: \"object\", additionalProperties: false, required: [\"fr\", \"en\"], properties: { fr: httpsUrl, en: httpsUrl } } },\n },\n },\n },\n },\n },\n} as const;\n\n/** The JSON Schema of `apps/<product>.json`. */\nexport const appSchema = {\n $schema: \"https://json-schema.org/draft/2020-12/schema\",\n $id: `${CDN}/org/v1/app.schema.json`,\n title: \"Krizaka mobile app — public runtime config\",\n type: \"object\",\n additionalProperties: false,\n required: [\"$schema\", \"schemaVersion\", \"app\", \"apiBaseUrl\", \"features\", \"minAppVersion\", \"updatedAt\"],\n properties: {\n $schema: { type: \"string\" },\n schemaVersion: { const: 1 },\n app: slug,\n apiBaseUrl: {\n type: \"object\",\n additionalProperties: false,\n required: [\"dev\", \"production\"],\n properties: { dev: { anyOf: [httpsUrl, { type: \"null\" }] }, production: { anyOf: [httpsUrl, { type: \"null\" }] } },\n },\n features: { type: \"object\", additionalProperties: { type: \"boolean\" } },\n minAppVersion: semver,\n updatedAt: date,\n },\n} as const;\n","export { APP_SCHEMA_URL,apps } from \"./apps\";\nexport type { CastPersona, CastProduct, CastRole } from \"./cast\";\nexport { CAST, CAST_VERSION, castMedia, castOf, persona, personaByRole, seedFingerprint } from \"./cast\";\nexport { DEFAULT_KINDS, defaultFor, defaults, defaultUrl, fetchDefaults, listDefaults, seedHash } from \"./defaults\";\nexport { CDN, org, ORG_SCHEMA_URL, ORG_URL } from \"./org\";\nexport type { AppConfig, AppEnvironment, Localized, Org, OrgAvatar, OrgBanner, OrgDefaultItem, OrgDefaultKind, OrgDefaults, OrgMark, OrgProduct, OrgSite, ProductStatus } from \"./org.types\";\nexport { appSchema, orgSchema } from \"./schema\";\n\nimport { org } from \"./org\";\nimport type { Localized } from \"./org.types\";\n\n/** The text of a localized pair for a language (`fr` or `en`; anything else reads English). */\nexport const localized = (text: Localized, locale: string): string => (locale === \"fr\" ? text.fr : text.en);\n\n/** The footer line of the family, « Une entreprise de Technologies Krizaka · Fait à Montréal ». */\nexport const footerLine = (locale: string): string => localized(org.footer.line, locale);\n"],"mappings":";AAAA;AAAA,EACE,MAAQ;AAAA,EACR,SAAW;AAAA,EACX,aAAe;AAAA,EACf,UAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,UAAY;AAAA,EACZ,MAAQ;AAAA,EACR,YAAc;AAAA,IACZ,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,WAAa;AAAA,EACf;AAAA,EACA,SAAW;AAAA,EACX,QAAU;AAAA,EACV,MAAQ;AAAA,EACR,MAAQ;AAAA,EACR,QAAU;AAAA,EACV,OAAS;AAAA,EACT,SAAW;AAAA,IACT,KAAK;AAAA,MACH,OAAS;AAAA,MACT,QAAU;AAAA,IACZ;AAAA,IACA,cAAc;AAAA,IACd,qBAAqB;AAAA,IACrB,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,EACpB;AAAA,EACA,OAAS;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,aAAe;AAAA,EACf,SAAW;AAAA,IACT,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,eAAe;AAAA,IACf,gBAAkB;AAAA,EACpB;AAAA,EACA,SAAW;AAAA,IACT,MAAQ;AAAA,EACV;AAAA,EACA,iBAAmB;AAAA,IACjB,mBAAmB;AAAA,IACnB,eAAe;AAAA,IACf,KAAO;AAAA,IACP,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,YAAc;AAAA,IACd,QAAU;AAAA,EACZ;AACF;;;AC1DA,IAAM,OAAO;AAGN,IAAM,gBAAgB,CAAC,UAAU,UAAU,gBAAgB,QAAQ,QAAQ;AAGlF,IAAM,QAAmD,EAAE,QAAQ,CAAC,KAAK,KAAK,IAAI,GAAG,QAAQ,CAAC,KAAK,KAAK,IAAI,GAAG,cAAc,CAAC,KAAK,KAAK,IAAI,GAAG,MAAM,CAAC,KAAK,KAAK,IAAI,GAAG,QAAQ,CAAC,KAAK,IAAI,EAAE;AAGpL,IAAM,oBAAyC,oBAAI,IAAI,CAAC,0BAA0B,CAAC;AAE1F,IAAM,OAAO,CAAC,MAAsB,IAAY,KAAgB,WAAoC;AAAA,EAClG;AAAA,EACA;AAAA,EACA,GAAI,kBAAkB,IAAI,GAAG,IAAI,IAAI,EAAE,EAAE,IAAI,EAAE,UAAU,KAAc,IAAI,CAAC;AAAA,EAC5E,MAAM;AAAA,IACJ,GAAI,QAAQ,EAAE,KAAK,GAAG,IAAI,IAAI,IAAI,IAAI,EAAE,OAAO,IAAI,CAAC;AAAA,IACpD,MAAM,OAAO,YAAY,MAAM,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,OAAO,CAAC,CAAC;AAAA,EAC1G;AACF;AAEA,IAAM,QAAQ,CAAC,MAAsB,IAAY,QAAoD,MAAM,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,GAAG,MAAM,KAAK,MAAM,GAAG,EAAE,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC;AAGvL,IAAM,SAAgC;AAAA,EACpC,CAAC,YAAY,EAAE,IAAI,kHAA+G,IAAI,iIAA2H,CAAC;AAAA,EAClQ,CAAC,kBAAkB,EAAE,IAAI,+FAA+F,IAAI,8GAA2G,CAAC;AAAA,EACxO,CAAC,oBAAoB,EAAE,IAAI,2GAA2G,IAAI,sHAA6G,CAAC;AAAA,EACxP,CAAC,kBAAkB,EAAE,IAAI,6FAA6F,IAAI,yHAAmH,CAAC;AAAA,EAC9O,CAAC,iBAAiB,EAAE,IAAI,4FAA4F,IAAI,4HAAmH,CAAC;AAAA,EAC5O,CAAC,iBAAiB,EAAE,IAAI,qGAAqG,IAAI,2HAAwH,CAAC;AAAA,EAC1P,CAAC,sBAAsB,EAAE,IAAI,6FAA6F,IAAI,kHAAyG,CAAC;AAAA,EACxO,CAAC,gBAAgB,EAAE,IAAI,8FAA8F,IAAI,6HAAuH,CAAC;AAAA,EACjP,CAAC,mBAAmB,EAAE,IAAI,yGAAmG,IAAI,iHAAwG,CAAC;AAAA,EAC1O,CAAC,gBAAgB,EAAE,IAAI,0FAA0F,IAAI,wHAAkH,CAAC;AAAA,EACxO,CAAC,kBAAkB,EAAE,IAAI,qGAAqG,IAAI,2HAAqH,CAAC;AAAA,EACxP,CAAC,cAAc,EAAE,IAAI,uGAAuG,IAAI,+HAAmH,CAAC;AACtP;AAGA,IAAM,UAAiC;AAAA,EACrC,CAAC,yBAAyB,EAAE,IAAI,oFAAiF,IAAI,0GAAiG,CAAC;AAAA,EACvN,CAAC,uBAAuB,EAAE,IAAI,sFAAsF,IAAI,sGAAgG,CAAC;AAAA,EACzN,CAAC,uBAAuB,EAAE,IAAI,mEAAmE,IAAI,0FAAuF,CAAC;AAAA,EAC7L,CAAC,yBAAyB,EAAE,IAAI,qFAAqF,IAAI,mGAAmG,CAAC;AAAA,EAC7N,CAAC,qBAAqB,EAAE,IAAI,oEAAoE,IAAI,qFAAkF,CAAC;AAAA,EACvL,CAAC,0BAA0B,EAAE,IAAI,8FAA8F,IAAI,2HAA+G,CAAC;AAAA,EACnP,CAAC,oBAAoB,EAAE,IAAI,qGAA2F,IAAI,qHAAqG,CAAC;AAAA,EAChO,CAAC,oBAAoB,EAAE,IAAI,uGAA8F,IAAI,0HAA8G,CAAC;AAAA,EAC5O,CAAC,uBAAuB,EAAE,IAAI,4DAA4D,IAAI,mFAA0E,CAAC;AAAA,EACzK,CAAC,qBAAqB,EAAE,IAAI,sFAAuE,IAAI,+FAA0E,CAAC;AAAA,EAClL,CAAC,qBAAqB,EAAE,IAAI,6DAA6D,IAAI,6EAA0E,CAAC;AAAA,EACxK,CAAC,uBAAuB,EAAE,IAAI,wDAAwD,IAAI,sFAAgF,CAAC;AAC7K;AAEA,IAAM,YAAY;AAAA,EAChB,QAAQ,CAAC,OAA0B,EAAE,IAAI,+CAA+C,CAAC,IAAI,IAAI,0DAAuD,CAAC,GAAG;AAAA,EAC5J,QAAQ,CAAC,OAA0B,EAAE,IAAI,0CAA0C,CAAC,IAAI,IAAI,uDAAoD,CAAC,GAAG;AAAA,EACpJ,cAAc,CAAC,OAA0B,EAAE,IAAI,kDAAkD,CAAC,IAAI,IAAI,4DAAyD,CAAC,GAAG;AAAA,EACvK,MAAM,CAAC,OAA0B,EAAE,IAAI,4CAA4C,CAAC,IAAI,IAAI,2DAAwD,CAAC,GAAG;AAC1J;AAGO,IAAM,WAAwB;AAAA,EACnC,SAAS;AAAA,EACT,MAAM;AAAA,EACN,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,OAAO;AAAA,IACL,QAAQ,CAAC,GAAG,MAAM,UAAU,cAAc,UAAU,MAAM,GAAG,GAAG,OAAO,IAAI,CAAC,CAAC,IAAI,GAAG,MAAM,KAAK,UAAU,IAAI,KAAK,KAAK,CAAC,CAAC;AAAA,IACzH,QAAQ,MAAM,UAAU,UAAU,UAAU,MAAM;AAAA,IAClD,cAAc,MAAM,gBAAgB,gBAAgB,UAAU,YAAY;AAAA,IAC1E,MAAM,MAAM,QAAQ,QAAQ,UAAU,IAAI;AAAA,IAC1C,QAAQ,QAAQ,IAAI,CAAC,CAAC,IAAI,GAAG,MAAM,KAAK,UAAU,IAAI,KAAK,KAAK,CAAC;AAAA,EACnE;AACF;AAKO,SAAS,SAAS,MAA+B;AACtD,MAAI,IAAI;AACR,aAAW,MAAM,OAAO,IAAI,GAAG;AAC7B,SAAK,GAAG,YAAY,CAAC,KAAK;AAC1B,QAAI,KAAK,KAAK,GAAG,QAAU,MAAM;AAAA,EACnC;AACA,SAAO;AACT;AAGO,SAAS,aAAa,MAAsB,SAAsB,UAAqC;AAC5G,UAAQ,OAAO,MAAM,IAAI,KAAK,CAAC,GAAG,OAAO,CAAC,UAAU,MAAM,aAAa,IAAI;AAC7E;AAGO,SAAS,WAAW,MAAsB,MAAuB,SAAsB,UAAsC;AAClI,QAAM,QAAQ,aAAa,MAAM,MAAM;AACvC,SAAO,MAAM,WAAW,IAAI,SAAY,MAAM,SAAS,IAAI,IAAI,MAAM,MAAM;AAC7E;AAGO,SAAS,WAAW,OAAuB,MAAc,SAAyB,QAAgB;AACvG,MAAI,WAAW,SAAS,MAAM,KAAK,IAAK,QAAO,MAAM,KAAK;AAC1D,QAAM,QAAQ,OAAO,KAAK,MAAM,KAAK,IAAI,EAAE,IAAI,MAAM,EAAE,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AAC3E,QAAM,SAAS,MAAM,KAAK,CAAC,MAAM,KAAK,IAAI,KAAK,MAAM,MAAM,SAAS,CAAC;AACrE,SAAO,MAAM,KAAK,KAAK,OAAO,MAAM,CAAC,KAAK;AAC5C;AAGA,eAAsB,cAAc,KAAa,YAA0B,OAA6B;AACtG,QAAM,MAAM,MAAM,UAAU,KAAK,EAAE,SAAS,EAAE,QAAQ,mBAAmB,EAAE,CAAC;AAC5E,MAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,GAAG,GAAG,aAAa,IAAI,MAAM,EAAE;AAC5D,QAAM,OAAQ,MAAM,IAAI,KAAK;AAC7B,MAAI,CAAC,KAAK,SAAU,OAAM,IAAI,MAAM,GAAG,GAAG,8BAA8B;AACxE,SAAO,KAAK;AACd;;;ACnHO,IAAM,MAAM;AACZ,IAAM,UAAU,GAAG,GAAG;AACtB,IAAM,iBAAiB,GAAG,GAAG;AAEpC,IAAM,MAAM,CAAC,SAAiB,GAAG,GAAG,IAAI,IAAI;AAE5C,IAAM,OAAO,CAAC,MAAuB,WAAsC;AAAA,EACzE,KAAK,IAAI,iBAAiB,IAAI,IAAI,KAAK,MAAM;AAAA,EAC7C,OAAO,IAAI,iBAAiB,IAAI,IAAI,KAAK,SAAS;AAAA,EAClD,QAAQ,IAAI,iBAAiB,IAAI,IAAI,KAAK,UAAU;AAAA,EACpD,QAAQ,IAAI,iBAAiB,IAAI,IAAI,KAAK,UAAU;AAAA,EACpD,SAAS,IAAI,iBAAiB,IAAI,IAAI,KAAK,WAAW;AACxD;AAEA,IAAM,QAAQ,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAE/B,IAAM,YAAY,CAAC,MAA0B,MAC3C,SAAS,WACL,EAAE,IAAI,sDAAmD,CAAC,IAAI,IAAI,6CAA6C,CAAC,GAAG,IACnH,EAAE,IAAI,sDAAmD,CAAC,IAAI,IAAI,6CAA6C,CAAC,GAAG;AAGzH,IAAMA,YAAyB,CAAC,UAAU,OAAO,EAAY;AAAA,EAAQ,CAAC,SACpE,MAAM,IAAI,CAAC,OAAO;AAAA,IAChB,IAAI,GAAG,IAAI,IAAI,CAAC;AAAA,IAChB;AAAA,IACA,KAAK,IAAI,8BAA8B,IAAI,IAAI,CAAC,MAAM;AAAA,IACtD,SAAS,IAAI,8BAA8B,IAAI,IAAI,CAAC,WAAW;AAAA,IAC/D,SAAS,IAAI,8BAA8B,IAAI,IAAI,CAAC,WAAW;AAAA,IAC/D,KAAK,UAAU,MAAM,CAAC;AAAA,EACxB,EAAE;AACJ;AAGO,IAAM,MAAW;AAAA,EACtB,SAAS;AAAA,EACT,eAAe;AAAA,EACf,SAAS,gBAAI;AAAA,EACb,WAAW;AAAA,EACX,SAAS;AAAA,IACP,WAAW;AAAA,IACX,WAAW;AAAA,IACX,KAAK;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,SAAS;AAAA,IACT,QAAQ,EAAE,IAAI,yBAAmB,IAAI,sBAAmB;AAAA,EAC1D;AAAA,EACA,OAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM,EAAE,MAAM,KAAK,QAAQ,MAAM,GAAG,OAAO,KAAK,QAAQ,OAAO,EAAE;AAAA,IACjE,MAAM,EAAE,MAAM,KAAK,QAAQ,MAAM,GAAG,OAAO,KAAK,QAAQ,OAAO,EAAE;AAAA,IACjE,SAAS,IAAI,2BAA2B;AAAA,IACxC,gBAAgB,IAAI,oCAAoC;AAAA,IACxD,eAAe,IAAI,2CAA2C;AAAA,IAC9D,UAAU,IAAI,qBAAqB;AAAA,EACrC;AAAA,EACA,QAAQ;AAAA,IACN,UAAAA;AAAA;AAAA,IAEA,SAAS,CAAC;AAAA,EACZ;AAAA,EACA;AAAA,EACA,UAAU;AAAA,IACR,EAAE,IAAI,WAAW,MAAM,WAAW,QAAQ,cAAc,KAAK,2BAA2B,MAAM,qCAAqC;AAAA,IACnI,EAAE,IAAI,YAAY,MAAM,YAAY,QAAQ,eAAe,KAAK,4BAA4B,MAAM,sCAAsC;AAAA,IACxI,EAAE,IAAI,WAAW,MAAM,WAAW,QAAQ,eAAe,KAAK,2BAA2B,MAAM,qCAAqC;AAAA,EACtI;AAAA,EACA,OAAO;AAAA,IACL,EAAE,IAAI,OAAO,MAAM,eAAe,KAAK,0BAA0B;AAAA,IACjE,EAAE,IAAI,MAAM,MAAM,cAAc,KAAK,yBAAyB;AAAA,IAC9D,EAAE,IAAI,QAAQ,MAAM,gBAAgB,KAAK,2BAA2B;AAAA,IACpE,EAAE,IAAI,MAAM,MAAM,cAAc,KAAK,yBAAyB;AAAA,IAC9D,EAAE,IAAI,UAAU,MAAM,kBAAkB,KAAK,6BAA6B;AAAA,IAC1E,EAAE,IAAI,QAAQ,MAAM,QAAQ,KAAK,2BAA2B;AAAA,EAC9D;AAAA,EACA,SAAS;AAAA,IACP,MAAM,EAAE,IAAI,sCAAsC,IAAI,qCAAqC;AAAA,IAC3F,OAAO;AAAA,EACT;AAAA,EACA,QAAQ;AAAA,IACN,MAAM,EAAE,IAAI,qEAA4D,IAAI,0DAAoD;AAAA,IAChI,OAAO;AAAA,MACL,EAAE,IAAI,WAAW,OAAO,EAAE,IAAI,sBAAmB,IAAI,UAAU,GAAG,KAAK,EAAE,IAAI,sCAAsC,IAAI,qCAAqC,EAAE;AAAA,MAC9J,EAAE,IAAI,SAAS,OAAO,EAAE,IAAI,cAAc,IAAI,QAAQ,GAAG,KAAK,EAAE,IAAI,oCAAoC,IAAI,mCAAmC,EAAE;AAAA,IACnJ;AAAA,EACF;AACF;;;AC1FO,IAAM,iBAAiB,GAAG,GAAG;AACpC,IAAM,UAAU;AAEhB,IAAM,MAAM,CAAC,IAAY,YAA+B;AAAA,EACtD,SAAS;AAAA,EACT,eAAe;AAAA,EACf,KAAK;AAAA;AAAA,EAEL,YAAY,EAAE,KAAK,QAAQ,YAAY,KAAK;AAAA,EAC5C,UAAU,CAAC;AAAA,EACX,eAAe;AAAA,EACf,WAAW;AACb;AAGO,IAAM,OAAkC;AAAA,EAC7C,SAAS,IAAI,WAAW,yBAAyB;AAAA,EACjD,UAAU,IAAI,YAAY,0BAA0B;AAAA,EACpD,SAAS,IAAI,WAAW,yBAAyB;AACnD;;;ACOO,IAAM,eAAe;AAErB,IAAM,OAA+B;AAAA,EAC1C,EAAE,IAAI,QAAQ,SAAS,YAAY,WAAW,WAAQ,aAAa,oBAAiB,MAAM,UAAU,QAAQ,MAAM,QAAQ,kBAAkB,WAAW,oBAAoB;AAAA,EAC3K,EAAE,IAAI,aAAa,SAAS,YAAY,WAAW,gBAAa,aAAa,yBAAsB,MAAM,SAAS,QAAQ,MAAM,QAAQ,gBAAgB,WAAW,iBAAiB;AAAA,EACpL,EAAE,IAAI,OAAO,SAAS,WAAW,WAAW,UAAO,aAAa,mBAAgB,MAAM,SAAS,QAAQ,MAAM,QAAQ,gBAAgB,QAAQ,qBAAqB,WAAW,cAAc;AAAA,EAC3L,EAAE,IAAI,WAAW,SAAS,WAAW,WAAW,WAAW,aAAa,oBAAoB,MAAM,UAAU,QAAQ,MAAM,QAAQ,iBAAiB,WAAW,cAAc;AAAA,EAC5K,EAAE,IAAI,UAAU,SAAS,WAAW,WAAW,UAAU,aAAa,cAAc,MAAM,UAAU,QAAQ,MAAM,QAAQ,kBAAkB,WAAW,cAAc;AAAA,EACrK,EAAE,IAAI,SAAS,SAAS,WAAW,WAAW,SAAS,aAAa,gBAAgB,MAAM,UAAU,QAAQ,MAAM,QAAQ,mBAAmB,WAAW,cAAc;AAAA,EACtK,EAAE,IAAI,WAAW,SAAS,WAAW,WAAW,cAAW,aAAa,qBAAkB,MAAM,UAAU,QAAQ,MAAM,QAAQ,YAAY,WAAW,cAAc;AAAA,EACrK,EAAE,IAAI,SAAS,SAAS,WAAW,WAAW,SAAS,aAAa,eAAe,MAAM,UAAU,QAAQ,MAAM,QAAQ,sBAAsB,WAAW,cAAc;AAAA,EACxK,EAAE,IAAI,SAAS,SAAS,WAAW,WAAW,SAAS,aAAa,aAAa,MAAM,SAAS,QAAQ,MAAM,QAAQ,cAAc,WAAW,iBAAiB;AAClK;AAGO,IAAM,SAAS,CAAC,YAAiD,KAAK,OAAO,CAAC,MAAM,EAAE,YAAY,OAAO;AAGzG,SAAS,QAAQ,SAAsB,IAAyB;AACrE,QAAM,QAAQ,KAAK,KAAK,CAAC,MAAM,EAAE,YAAY,WAAW,EAAE,OAAO,EAAE;AACnE,MAAI,CAAC,MAAO,OAAM,IAAI,MAAM,qBAAqB,EAAE,QAAQ,OAAO,YAAY,OAAO,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,KAAK,IAAI,CAAC,GAAG;AAC5H,SAAO;AACT;AAGO,SAAS,cAAc,SAAsB,MAA6B;AAC/E,QAAM,QAAQ,OAAO,OAAO,EAAE,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI;AACzD,MAAI,CAAC,MAAO,OAAM,IAAI,MAAM,YAAY,IAAI,OAAO,OAAO,EAAE;AAC5D,SAAO;AACT;AAEA,IAAM,QAAQ,CAAC,MAA2B,IAAY,SAAyB;AAC7E,QAAM,QAAoC,aAAa,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AACpF,MAAI,CAAC,MAAO,OAAM,IAAI,MAAM,YAAY,IAAI,aAAa,EAAE,uBAAuB;AAClF,SAAO,WAAW,OAAO,IAAI;AAC/B;AAGO,SAAS,UAAU,GAAgB,OAAO,KAA0C;AACzF,SAAO,EAAE,QAAQ,MAAM,UAAU,EAAE,QAAQ,IAAI,GAAG,GAAI,EAAE,SAAS,EAAE,QAAQ,MAAM,UAAU,EAAE,QAAQ,GAAG,EAAE,IAAI,CAAC,EAAG;AACpH;AAMO,SAAS,gBAAgB,QAAkD;AAChF,SAAO,OAAO,KAAK,MAAM,EACtB,KAAK,CAAC,GAAG,MAAO,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,CAAE,EAC3C,IAAI,CAAC,UAAU,GAAG,KAAK,IAAI,OAAO,KAAK,CAAC,EAAE,EAC1C,KAAK,GAAG;AACb;;;AC9EA,IAAM,YAAY;AAAA,EAChB,MAAM;AAAA,EACN,sBAAsB;AAAA,EACtB,UAAU,CAAC,MAAM,IAAI;AAAA,EACrB,YAAY,EAAE,IAAI,EAAE,MAAM,UAAU,WAAW,EAAE,GAAG,IAAI,EAAE,MAAM,UAAU,WAAW,EAAE,EAAE;AAC3F;AACA,IAAM,WAAW,EAAE,MAAM,UAAU,QAAQ,OAAO,SAAS,YAAY;AACvE,IAAMC,QAAO;AAAA,EACX,MAAM;AAAA,EACN,sBAAsB;AAAA,EACtB,UAAU,CAAC,OAAO,SAAS,UAAU,UAAU,SAAS;AAAA,EACxD,YAAY,EAAE,KAAK,UAAU,OAAO,UAAU,QAAQ,UAAU,QAAQ,UAAU,SAAS,SAAS;AACtG;AACA,IAAM,OAAO,EAAE,MAAM,UAAU,SAAS,2BAA2B;AACnE,IAAM,SAAS,EAAE,MAAM,UAAU,sBAAsB,OAAO,UAAU,CAAC,QAAQ,OAAO,GAAG,YAAY,EAAE,MAAMA,OAAM,OAAOA,MAAK,EAAE;AACnI,IAAM,OAAO,EAAE,MAAM,UAAU,SAAS,yBAAyB;AACjE,IAAM,SAAS,EAAE,MAAM,UAAU,SAAS,uBAAuB;AAEjE,IAAM,eAAe;AAAA,EACnB,MAAM;AAAA,EACN,UAAU;AAAA,EACV,aAAa;AAAA,EACb,OAAO;AAAA,IACL,MAAM;AAAA,IACN,sBAAsB;AAAA,IACtB,UAAU,CAAC,MAAM,OAAO,MAAM;AAAA,IAC9B,YAAY;AAAA,MACV,IAAI;AAAA,MACJ,KAAK;AAAA,MACL,UAAU,EAAE,OAAO,KAAK;AAAA,MACxB,MAAM;AAAA,QACJ,MAAM;AAAA,QACN,sBAAsB;AAAA,QACtB,UAAU,CAAC,MAAM;AAAA,QACjB,YAAY,EAAE,KAAK,UAAU,MAAM,EAAE,MAAM,UAAU,eAAe,GAAG,eAAe,EAAE,SAAS,SAAS,GAAG,sBAAsB,SAAS,EAAE;AAAA,MAChJ;AAAA,IACF;AAAA,EACF;AACF;AAGO,IAAM,YAAY;AAAA,EACvB,SAAS;AAAA,EACT,KAAK;AAAA,EACL,OAAO;AAAA,EACP,MAAM;AAAA,EACN,sBAAsB;AAAA,EACtB,UAAU,CAAC,WAAW,iBAAiB,WAAW,aAAa,WAAW,SAAS,UAAU,YAAY,YAAY,SAAS,WAAW,QAAQ;AAAA,EACjJ,YAAY;AAAA,IACV,SAAS,EAAE,MAAM,SAAS;AAAA,IAC1B,eAAe,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE;AAAA,IAC9B,SAAS;AAAA,IACT,WAAW;AAAA,IACX,SAAS;AAAA,MACP,MAAM;AAAA,MACN,sBAAsB;AAAA,MACtB,UAAU,CAAC,aAAa,aAAa,OAAO,QAAQ,UAAU,WAAW,WAAW,QAAQ;AAAA,MAC5F,YAAY;AAAA,QACV,WAAW,EAAE,MAAM,UAAU,WAAW,EAAE;AAAA,QAC1C,WAAW,EAAE,MAAM,UAAU,WAAW,EAAE;AAAA,QAC1C,KAAK,EAAE,MAAM,UAAU,SAAS,YAAY;AAAA,QAC5C,MAAM,EAAE,MAAM,UAAU,WAAW,EAAE;AAAA,QACrC,QAAQ,EAAE,MAAM,UAAU,WAAW,EAAE;AAAA,QACvC,SAAS,EAAE,MAAM,UAAU,SAAS,aAAa;AAAA,QACjD,SAAS,EAAE,MAAM,UAAU,WAAW,EAAE;AAAA,QACxC,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,IACA,OAAO;AAAA,MACL,MAAM;AAAA,MACN,sBAAsB;AAAA,MACtB,UAAU,CAAC,QAAQ,QAAQ,QAAQ,WAAW,kBAAkB,iBAAiB,UAAU;AAAA,MAC3F,YAAY,EAAE,MAAM,EAAE,MAAM,UAAU,WAAW,EAAE,GAAG,MAAM,QAAQ,MAAM,QAAQ,SAAS,UAAU,gBAAgB,UAAU,eAAe,UAAU,UAAU,SAAS;AAAA,IAC7K;AAAA,IACA,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,sBAAsB;AAAA,MACtB,UAAU,CAAC,YAAY,SAAS;AAAA,MAChC,YAAY;AAAA,QACV,UAAU;AAAA,UACR,MAAM;AAAA,UACN,OAAO;AAAA,YACL,MAAM;AAAA,YACN,sBAAsB;AAAA,YACtB,UAAU,CAAC,MAAM,QAAQ,OAAO,WAAW,WAAW,KAAK;AAAA,YAC3D,YAAY,EAAE,IAAI,MAAM,MAAM,EAAE,MAAM,CAAC,UAAU,OAAO,EAAE,GAAG,KAAK,UAAU,SAAS,UAAU,SAAS,UAAU,KAAK,UAAU;AAAA,UACnI;AAAA,QACF;AAAA,QACA,SAAS;AAAA,UACP,MAAM;AAAA,UACN,OAAO,EAAE,MAAM,UAAU,sBAAsB,OAAO,UAAU,CAAC,MAAM,OAAO,KAAK,GAAG,YAAY,EAAE,IAAI,MAAM,KAAK,UAAU,KAAK,UAAU,EAAE;AAAA,QAChJ;AAAA,MACF;AAAA,IACF;AAAA,IACA,UAAU;AAAA,MACR,MAAM;AAAA,MACN,sBAAsB;AAAA,MACtB,UAAU,CAAC,WAAW,QAAQ,QAAQ,OAAO;AAAA,MAC7C,YAAY;AAAA,QACV,SAAS,EAAE,MAAM,UAAU,SAAS,UAAU;AAAA,QAC9C,MAAM;AAAA,QACN,MAAM,EAAE,MAAM,UAAU,sBAAsB,OAAO,UAAU,CAAC,QAAQ,aAAa,GAAG,YAAY,EAAE,MAAM,EAAE,OAAO,iBAAiB,GAAG,aAAa,EAAE,MAAM,UAAU,WAAW,EAAE,EAAE,EAAE;AAAA,QACzL,OAAO;AAAA,UACL,MAAM;AAAA,UACN,sBAAsB;AAAA,UACtB,UAAU,CAAC,UAAU,UAAU,gBAAgB,QAAQ,QAAQ;AAAA,UAC/D,YAAY,OAAO,YAAY,CAAC,UAAU,UAAU,gBAAgB,QAAQ,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,YAAY,CAAC,CAAC;AAAA,QAC3H;AAAA,MACF;AAAA,IACF;AAAA,IACA,UAAU;AAAA,MACR,MAAM;AAAA,MACN,UAAU;AAAA,MACV,OAAO;AAAA,QACL,MAAM;AAAA,QACN,sBAAsB;AAAA,QACtB,UAAU,CAAC,MAAM,QAAQ,UAAU,OAAO,MAAM;AAAA,QAChD,YAAY,EAAE,IAAI,MAAM,MAAM,EAAE,MAAM,UAAU,WAAW,EAAE,GAAG,QAAQ,EAAE,MAAM,CAAC,eAAe,YAAY,EAAE,GAAG,KAAK,UAAU,MAAM,SAAS;AAAA,MACjJ;AAAA,IACF;AAAA,IACA,OAAO;AAAA,MACL,MAAM;AAAA,MACN,UAAU;AAAA,MACV,OAAO,EAAE,MAAM,UAAU,sBAAsB,OAAO,UAAU,CAAC,MAAM,QAAQ,KAAK,GAAG,YAAY,EAAE,IAAI,MAAM,MAAM,EAAE,MAAM,UAAU,WAAW,EAAE,GAAG,KAAK,SAAS,EAAE;AAAA,IACzK;AAAA,IACA,SAAS;AAAA,MACP,MAAM;AAAA,MACN,sBAAsB;AAAA,MACtB,UAAU,CAAC,QAAQ,OAAO;AAAA,MAC1B,YAAY;AAAA,QACV,MAAM,EAAE,MAAM,UAAU,sBAAsB,OAAO,UAAU,CAAC,MAAM,IAAI,GAAG,YAAY,EAAE,IAAI,UAAU,IAAI,SAAS,EAAE;AAAA,QACxH,OAAO,EAAE,MAAM,CAAC,UAAU,MAAM,GAAG,QAAQ,QAAQ;AAAA,MACrD;AAAA,IACF;AAAA,IACA,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,sBAAsB;AAAA,MACtB,UAAU,CAAC,QAAQ,OAAO;AAAA,MAC1B,YAAY;AAAA,QACV,MAAM;AAAA,QACN,OAAO;AAAA,UACL,MAAM;AAAA,UACN,UAAU;AAAA,UACV,OAAO;AAAA,YACL,MAAM;AAAA,YACN,sBAAsB;AAAA,YACtB,UAAU,CAAC,MAAM,SAAS,KAAK;AAAA,YAC/B,YAAY,EAAE,IAAI,EAAE,MAAM,CAAC,WAAW,OAAO,EAAE,GAAG,OAAO,WAAW,KAAK,EAAE,MAAM,UAAU,sBAAsB,OAAO,UAAU,CAAC,MAAM,IAAI,GAAG,YAAY,EAAE,IAAI,UAAU,IAAI,SAAS,EAAE,EAAE;AAAA,UAC/L;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAGO,IAAM,YAAY;AAAA,EACvB,SAAS;AAAA,EACT,KAAK,GAAG,GAAG;AAAA,EACX,OAAO;AAAA,EACP,MAAM;AAAA,EACN,sBAAsB;AAAA,EACtB,UAAU,CAAC,WAAW,iBAAiB,OAAO,cAAc,YAAY,iBAAiB,WAAW;AAAA,EACpG,YAAY;AAAA,IACV,SAAS,EAAE,MAAM,SAAS;AAAA,IAC1B,eAAe,EAAE,OAAO,EAAE;AAAA,IAC1B,KAAK;AAAA,IACL,YAAY;AAAA,MACV,MAAM;AAAA,MACN,sBAAsB;AAAA,MACtB,UAAU,CAAC,OAAO,YAAY;AAAA,MAC9B,YAAY,EAAE,KAAK,EAAE,OAAO,CAAC,UAAU,EAAE,MAAM,OAAO,CAAC,EAAE,GAAG,YAAY,EAAE,OAAO,CAAC,UAAU,EAAE,MAAM,OAAO,CAAC,EAAE,EAAE;AAAA,IAClH;AAAA,IACA,UAAU,EAAE,MAAM,UAAU,sBAAsB,EAAE,MAAM,UAAU,EAAE;AAAA,IACtE,eAAe;AAAA,IACf,WAAW;AAAA,EACb;AACF;;;ACvKO,IAAMC,aAAY,CAAC,MAAiB,WAA4B,WAAW,OAAO,KAAK,KAAK,KAAK;AAGjG,IAAM,aAAa,CAAC,WAA2BA,WAAU,IAAI,OAAO,MAAM,MAAM;","names":["defaults","mark","localized"]}
|
package/dist/org.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://krizaka-assets.b-cdn.net/org/v1/org.schema.json",
|
|
3
3
|
"schemaVersion": 2,
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.3.0",
|
|
5
5
|
"updatedAt": "2026-10-26",
|
|
6
6
|
"company": {
|
|
7
7
|
"legalName": "Technologies Krizaka Inc.",
|
|
@@ -873,6 +873,7 @@
|
|
|
873
873
|
"en": "A pink neon flamingo outline on black, with a violet halo",
|
|
874
874
|
"fr": "Le contour d'un flamant rose en néon sur fond noir, avec un halo violet"
|
|
875
875
|
},
|
|
876
|
+
"disabled": true,
|
|
876
877
|
"urls": {
|
|
877
878
|
"webp": {
|
|
878
879
|
"960": "https://krizaka-assets.b-cdn.net/defaults/v1/banner/the-neon-flamingo-960.webp",
|
package/dist/org.schema.json
CHANGED
|
@@ -502,6 +502,9 @@
|
|
|
502
502
|
}
|
|
503
503
|
}
|
|
504
504
|
},
|
|
505
|
+
"disabled": {
|
|
506
|
+
"const": true
|
|
507
|
+
},
|
|
505
508
|
"urls": {
|
|
506
509
|
"type": "object",
|
|
507
510
|
"additionalProperties": false,
|
|
@@ -566,6 +569,9 @@
|
|
|
566
569
|
}
|
|
567
570
|
}
|
|
568
571
|
},
|
|
572
|
+
"disabled": {
|
|
573
|
+
"const": true
|
|
574
|
+
},
|
|
569
575
|
"urls": {
|
|
570
576
|
"type": "object",
|
|
571
577
|
"additionalProperties": false,
|
|
@@ -630,6 +636,9 @@
|
|
|
630
636
|
}
|
|
631
637
|
}
|
|
632
638
|
},
|
|
639
|
+
"disabled": {
|
|
640
|
+
"const": true
|
|
641
|
+
},
|
|
633
642
|
"urls": {
|
|
634
643
|
"type": "object",
|
|
635
644
|
"additionalProperties": false,
|
|
@@ -694,6 +703,9 @@
|
|
|
694
703
|
}
|
|
695
704
|
}
|
|
696
705
|
},
|
|
706
|
+
"disabled": {
|
|
707
|
+
"const": true
|
|
708
|
+
},
|
|
697
709
|
"urls": {
|
|
698
710
|
"type": "object",
|
|
699
711
|
"additionalProperties": false,
|
|
@@ -758,6 +770,9 @@
|
|
|
758
770
|
}
|
|
759
771
|
}
|
|
760
772
|
},
|
|
773
|
+
"disabled": {
|
|
774
|
+
"const": true
|
|
775
|
+
},
|
|
761
776
|
"urls": {
|
|
762
777
|
"type": "object",
|
|
763
778
|
"additionalProperties": false,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@krizaka/org",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "The public facts about Krizaka, in one validated JSON that every footer, site and app reads: legal name, NEQ, « Fait à Montréal » in French and English, brand marks, default avatars and banners, the live products and sites, the public contact, the footer line and the mobile apps' public runtime config. Typed data, JSON Schema, and the files published on the CDN.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"krizaka",
|
|
@@ -48,7 +48,7 @@
|
|
|
48
48
|
"tsup": "^8.5.0",
|
|
49
49
|
"typescript": "^5.9.3",
|
|
50
50
|
"vitest": "^4.1.11",
|
|
51
|
-
"@krizaka/config": "^0.
|
|
51
|
+
"@krizaka/config": "^0.14.0"
|
|
52
52
|
},
|
|
53
53
|
"scripts": {
|
|
54
54
|
"build": "node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\" && tsup && node scripts/emit.mjs",
|