Commit multilingual editorial frontend work

This commit is contained in:
2026-04-07 07:36:27 +02:00
parent 0eae030142
commit 77f57cf528
119 changed files with 5255 additions and 220 deletions
+59
View File
@@ -0,0 +1,59 @@
export const familyLabFeature = {
eyebrow: "Family laboratory / private test issue",
title: "A pataphysical family atlas built from one unruly folder and a boy called Dave Jr.",
lede:
"Not a neutral gallery. Not a cold database. A bright proof-sheet salon for father-and-son evidence, Villanova weather, sleep-heavy domestic grace, and the gentle bureaucratic miracle of naming things before they vanish.",
note:
"This first pass keeps the captions honest, lets the images breathe, and treats the archive as material for a future family desk rather than a pile of uploads.",
};
export const familyLabStats = [
{
value: "94",
label: "unique frames",
note: "The duplicates are folded away so the room reads like an edit, not an export.",
},
{
value: "Dave Jr",
label: "central orbit",
note: "Your son is the emotional anchor, which is why the named files lead the composition.",
},
{
value: "Moustache era",
label: "authenticated",
note: "The father-and-son images stay explicit so the archive starts with recognisable truth.",
},
];
export const familyLabFeaturedFilenames = [
"0meanddave1.jpg",
"meAndDave.jpg",
"jr_nova.jpg",
"villanova1.jpg",
"withGrandma.jpg",
"fireman.jpg",
];
export const familyLabNotes = [
{
title: "Poster logic, not gallery logic",
body: "The first screen behaves like a cover: one big emotional claim, then a controlled spill of proof.",
},
{
title: "Named frames first",
body: "Files with human names carry the warmth, while the Facebook hashes recede into the archive layer.",
},
{
title: "Private by temperament",
body: "The design can mature into a family-only desk, but this test page already gives the photographs dignity.",
},
];
export const familyLabFilters = [
{ key: "all", label: "All frames" },
{ key: "named", label: "Named files" },
{ key: "dave-jr", label: "Dave Jr" },
{ key: "dave", label: "Father and son" },
{ key: "villanova", label: "Villanova weather" },
{ key: "family", label: "Family orbit" },
];
+336
View File
@@ -0,0 +1,336 @@
export type LocaleCode = "en" | "fr" | "nb";
export const localeOrder: LocaleCode[] = ["en", "fr", "nb"];
export const localeMeta: Record<LocaleCode, { label: string; switcher: string; note: string }> = {
en: {
label: "English",
switcher: "EN edition",
note: "The interface changes language first. Long-form features stay in their original edition until translated.",
},
fr: {
label: "Francais",
switcher: "Cahier FR",
note: "L'interface change de langue d'abord. Les longs articles restent dans leur edition d'origine pour l'instant.",
},
nb: {
label: "Norsk bokmal",
switcher: "NB utgave",
note: "Grensesnittet skifter sprak forst. Langartiklene blir staende i originalutgaven til de er oversatt.",
},
};
export const localizedSections: Record<
string,
Record<LocaleCode, { title: string; tone: string }>
> = {
business: {
en: { title: "Business", tone: "Sharp, practical, anti-buzzword." },
fr: { title: "Affaires", tone: "Net, pratique, allergique au jargon." },
nb: { title: "Naeringsliv", tone: "Skarpt, praktisk og anti-buzzword." },
},
education: {
en: { title: "Education", tone: "Curious, rigorous, lightly mischievous." },
fr: { title: "Etudes", tone: "Curieux, rigoureux, legerement malicieux." },
nb: { title: "Utdanning", tone: "Nysgjerrig, grundig og litt rampete." },
},
family: {
en: { title: "Family", tone: "Private-minded, generous, alive." },
fr: { title: "Famille", tone: "Prive, genereux, bien vivant." },
nb: { title: "Familie", tone: "Privat, varm og levende." },
},
"fun-postings": {
en: { title: "Fun Postings", tone: "Playful, deadpan, collectible." },
fr: { title: "Annonces Delicieuses", tone: "Ludique, pince-sans-rire, a collectionner." },
nb: { title: "Leken Oppslagstavle", tone: "Leken, torrr og samleverdig." },
},
writing: {
en: { title: "Writing", tone: "Literary, international, smoky." },
fr: { title: "Ecriture", tone: "Litteraire, international, fumeux dans le bon sens." },
nb: { title: "Skriving", tone: "Litteraer, internasjonal og litt roykfylt." },
},
"jazz-music": {
en: { title: "Jazz and Music", tone: "Velvet, brassy, precise." },
fr: { title: "Jazz et Musique", tone: "Velours, cuivre, precision." },
nb: { title: "Jazz og Musikk", tone: "Fløyel, messing og presisjon." },
},
languages: {
en: { title: "Languages", tone: "Polyglot, sly, welcoming." },
fr: { title: "Langues", tone: "Polyglotte, malin, accueillant." },
nb: { title: "Sprak", tone: "Polyglott, lur og inkluderende." },
},
"ai-lab": {
en: { title: "AI Lab", tone: "Forward-looking, grounded, open source friendly." },
fr: { title: "Laboratoire IA", tone: "Tourne vers l'avenir, solide, ami de l'open source." },
nb: { title: "AI-lab", tone: "Fremtidsrettet, jordnaer og vennlig mot apen kildekode." },
},
norway: {
en: { title: "Norway", tone: "Observant, civic, place-aware." },
fr: { title: "Norvege", tone: "Observateur, civique, attentif au lieu." },
nb: { title: "Norge", tone: "Observant, samfunnsbevisst og stedsnart." },
},
projects: {
en: { title: "Projects", tone: "Builder energy, clean receipts." },
fr: { title: "Projets", tone: "Energie d'atelier, comptes propres." },
nb: { title: "Prosjekter", tone: "Byggerenergi og ryddige spor." },
},
cv: {
en: { title: "CV", tone: "Professional, legible, confident." },
fr: { title: "CV", tone: "Professionnel, lisible, assure." },
nb: { title: "CV", tone: "Profesjonell, lesbar og trygg." },
},
"family-lab": {
en: { title: "Family Lab", tone: "Private archive, atlas, memory room." },
fr: { title: "Laboratoire Familial", tone: "Archive privee, atlas, chambre de memoire." },
nb: { title: "Familielab", tone: "Privat arkiv, atlas og minnerom." },
},
};
type ChromeContext = {
activeSlug: string;
issueDate: Record<LocaleCode, string>;
articleKey?: "norway" | "jazz" | "projects" | null;
};
const articleLabels: Record<string, Record<LocaleCode, { label: string; note: string }>> = {
norway: {
en: { label: "Article / Norway desk", note: "Field report / family life / fathers / immigrants" },
fr: { label: "Article / Cahier Norvege", note: "Reportage / famille / peres / immigration" },
nb: { label: "Artikkel / Norge-desk", note: "Feltrapport / familieliv / fedre / innvandring" },
},
jazz: {
en: { label: "Article / Jazz and Music", note: "Field report / Kongsberg x Paris" },
fr: { label: "Article / Jazz et Musique", note: "Reportage / Kongsberg x Paris" },
nb: { label: "Artikkel / Jazz og Musikk", note: "Feltrapport / Kongsberg x Paris" },
},
projects: {
en: { label: "Article / Projects desk", note: "Field report / music trivia / Blue Note Rhino / April build" },
fr: { label: "Article / Cahier Projets", note: "Reportage / quiz musical / Blue Note Rhino / chantier d'avril" },
nb: { label: "Artikkel / Prosjekt-desk", note: "Feltrapport / musikktrivia / Blue Note Rhino / aprilbygg" },
},
};
export function getChromeCopy({ activeSlug, issueDate, articleKey }: ChromeContext) {
const currentSection = localizedSections[activeSlug];
const article = articleKey ? articleLabels[articleKey] : null;
const sectionOrder = {
business: "01",
education: "02",
family: "03",
"fun-postings": "04",
writing: "05",
"jazz-music": "06",
languages: "07",
"ai-lab": "08",
norway: "09",
projects: "10",
cv: "11",
"family-lab": "12",
} as const;
const sectionNumber = sectionOrder[activeSlug as keyof typeof sectionOrder];
return {
ribbonIssue: {
en: `Founding issue / ${issueDate.en}`,
fr: `Numero fondateur / ${issueDate.fr}`,
nb: `Grunnutgave / ${issueDate.nb}`,
},
ribbonNote: currentSection
? {
en: currentSection.en.tone,
fr: currentSection.fr.tone,
nb: currentSection.nb.tone,
}
: article
? {
en: article.en.note,
fr: article.fr.note,
nb: article.nb.note,
}
: {
en: "Ringwood / Villanova / Brussels / Paris / Krakow / Oslo / Kongsberg",
fr: "Ringwood / Villanova / Bruxelles / Paris / Cracovie / Oslo / Kongsberg",
nb: "Ringwood / Villanova / Brussel / Paris / Krakow / Oslo / Kongsberg",
},
issueLabel: currentSection
? {
en: `Section ${sectionNumber} / ${currentSection.en.title}`,
fr: `Section ${sectionNumber} / ${currentSection.fr.title}`,
nb: `Seksjon ${sectionNumber} / ${currentSection.nb.title}`,
}
: article
? {
en: article.en.label,
fr: article.fr.label,
nb: article.nb.label,
}
: {
en: "Founding issue / Personal edition",
fr: "Numero fondateur / Edition personnelle",
nb: "Grunnutgave / Personlig utgave",
},
mastheadLine: {
en: "Jazz desk / machine room / family archive / pataphysical bulletin",
fr: "Cahier jazz / salle des machines / archive familiale / bulletin pataphysique",
nb: "Jazzdesk / maskinrom / familiearkiv / pataphysisk bulletin",
},
domainPrompt: {
en: "Private AI. Jazz rooms. Civic weather. Pataphysical field notes.",
fr: "IA privee. Salles de jazz. Meteo civique. Notes de terrain pataphysiques.",
nb: "Privat AI. Jazzrom. Samfunnsvaer. Pataphysiske feltnotater.",
},
domainLede: {
en: "A bright retro paper for machine rooms, multilingual weather, Norway, family rights, live culture, and the deliberate misuse of the impossible.",
fr: "Un journal retro-lumineux pour les salles des machines, le temps multilingue, la Norvege, les droits familiaux, la culture vivante et l'usage delibere de l'impossible.",
nb: "Et lyst retroblad for maskinrom, flerspraklig vaer, Norge, familierett, levende kultur og bevisst misbruk av det umulige.",
},
languageNote: {
en: localeMeta.en.note,
fr: localeMeta.fr.note,
nb: localeMeta.nb.note,
},
footerHeadline: {
en: "Jazz desk, machine room, civic archive, and practical impossibility.",
fr: "Cahier jazz, salle des machines, archive civique et impossibilite pratique.",
nb: "Jazzdesk, maskinrom, samfunnsarkiv og praktisk umulighet.",
},
footerBody: {
en: "Built in Astro with React islands, backed by PHP and SQL, and edited like a proper newspaper rather than a consultant PDF with lipstick.",
fr: "Construit avec Astro et des ilots React, soutenu par PHP et SQL, puis edite comme un vrai journal plutot qu'un PDF de conseil maquille.",
nb: "Bygget i Astro med React-oyer, drevet av PHP og SQL, og redigert som en ordentlig avis i stedet for en konsulent-PDF med leppestift.",
},
footerNoteLeft: {
en: "Astro + React islands + PHP + SQL",
fr: "Astro + ilots React + PHP + SQL",
nb: "Astro + React-oyer + PHP + SQL",
},
footerNoteRight: {
en: "Blue Note Logic / Gilligan TECH / Kongsberg / multilingual edition",
fr: "Blue Note Logic / Gilligan TECH / Kongsberg / edition multilingue",
nb: "Blue Note Logic / Gilligan TECH / Kongsberg / flerspraklig utgave",
},
};
}
export const footerCallouts = {
blueNoteLogic: {
href: "https://bluenotelogic.com/",
label: {
en: "Blue Note Logic",
fr: "Blue Note Logic",
nb: "Blue Note Logic",
},
title: {
en: "Private AI and document intelligence with a real memory.",
fr: "IA privee et intelligence documentaire avec une vraie memoire.",
nb: "Privat AI og dokumentintelligens med ekte hukommelse.",
},
body: {
en: "Blue Note Logic frames AI as owned infrastructure: strategy, deployment, document intelligence, and source-aware systems that keep working knowledge inside the firm.",
fr: "Blue Note Logic traite l'IA comme une infrastructure possedee : strategie, deploiement, intelligence documentaire et systemes cites a la source qui gardent la connaissance dans l'entreprise.",
nb: "Blue Note Logic behandler AI som eid infrastruktur: strategi, utrulling, dokumentintelligens og kildebevisste systemer som holder kunnskapen i virksomheten.",
},
},
gilliganTech: {
href: "https://gilligan.tech/",
label: {
en: "Gilligan TECH",
fr: "Gilligan TECH",
nb: "Gilligan TECH",
},
title: {
en: "Kongsberg-side systems engineering for Nordic SMBs.",
fr: "Ingenierie de systemes depuis Kongsberg pour les PME nordiques.",
nb: "Systemingeniorarbeid fra Kongsberg for nordiske SMB-er.",
},
body: {
en: "Gilligan Tech is the Norwegian operating arm: AI audits, system builds, fractional CTO work, and sovereign European delivery for companies that want results before theatre.",
fr: "Gilligan Tech est le bras norvegien d'operation : audits IA, constructions de systemes, travail de CTO fractionnaire et livraison souveraine europeenne pour les entreprises qui veulent des resultats avant le theatre.",
nb: "Gilligan Tech er den norske operasjonsarmen: AI-audits, systembygging, fractional CTO-arbeid og suveren europeisk levering for selskaper som vil ha resultater foran teater.",
},
},
};
export const policyLinkCopy = {
privacy: {
href: "/privacy",
title: {
en: "Privacy policy",
fr: "Politique de confidentialite",
nb: "Personvern",
},
body: {
en: "How the site handles accounts, family access, forms, and first-party data.",
fr: "Comment le site gere les comptes, l'acces familial, les formulaires et les donnees de premiere main.",
nb: "Hvordan nettstedet handterer kontoer, familieadgang, skjemaer og forstepartsdata.",
},
},
cookies: {
href: "/cookies",
title: {
en: "Cookie policy",
fr: "Politique de cookies",
nb: "Cookiepolicy",
},
body: {
en: "Essential-first consent, optional analytics later, and external embeds only after permission.",
fr: "Consentement essential d'abord, analyses optionnelles ensuite, et contenus externes seulement apres permission.",
nb: "Forst essensielle cookies, valgfri analyse senere, og eksterne innbygginger bare etter samtykke.",
},
},
};
export const cookieBannerCopy = {
eyebrow: {
en: "Privacy desk / local build",
fr: "Cahier vie privee / build local",
nb: "Personverndesk / lokal bygg",
},
title: {
en: "This paper keeps optional tracking turned off until you say yes.",
fr: "Ce journal laisse le pistage optionnel eteint tant que vous ne dites pas oui.",
nb: "Denne avisen holder valgfri sporing av til du sier ja.",
},
body: {
en: "Essential cookies keep sign-in, family access, and language choice working. Analytics and future third-party embeds stay off by default.",
fr: "Les cookies essentiels maintiennent la connexion, l'acces familial et le choix de langue. Les analyses et les futurs contenus tiers restent desactives par defaut.",
nb: "Nodvendige cookies holder innlogging, familieadgang og sprakvalg i gang. Analyse og fremtidige tredjepartsinnbygginger er av som standard.",
},
acceptAll: {
en: "Accept all",
fr: "Tout accepter",
nb: "Godta alt",
},
essentialOnly: {
en: "Essential only",
fr: "Essentiels seulement",
nb: "Bare nodvendige",
},
customize: {
en: "Customize",
fr: "Personnaliser",
nb: "Tilpass",
},
save: {
en: "Save choices",
fr: "Enregistrer les choix",
nb: "Lagre valgene",
},
categories: {
essential: {
en: "Essential site operations",
fr: "Fonctions essentielles du site",
nb: "Essensiell drift",
},
analytics: {
en: "Anonymous analytics later",
fr: "Analyses anonymes plus tard",
nb: "Anonym analyse senere",
},
embeds: {
en: "External media embeds",
fr: "Integrations medias externes",
nb: "Eksterne medieinnbygginger",
},
},
};
+51 -8
View File
@@ -27,6 +27,10 @@ export type VentureSignal = {
strap: string;
summary: string;
href: string;
imageSrc: string;
imageAlt: string;
imageNote: string;
external?: boolean;
};
export type CollageImage = {
@@ -54,9 +58,10 @@ export const routeStops: RouteStop[] = [
{ place: "Columbia, South Carolina", note: "business school orbit" },
{ place: "Paris, France", note: "international MBA" },
{ place: "Washington, DC", note: "capital interval" },
{ place: "New York", note: "city tempo" },
{ place: "Manhattan, New York", note: "city tempo" },
{ place: "Hamilton, Bermuda", note: "Atlantic detour" },
{ place: "the Midwest", note: "American middle distance" },
{ place: "Washington, DC", note: "federal coda" },
{ place: "Brooklyn, New York", note: "borough voltage" },
{ place: "Krakow, Poland", note: "EU studies" },
{ place: "Oslo, Norway", note: "Nordic transition" },
{ place: "Kongsberg, Norway", note: "current desk" },
@@ -113,11 +118,27 @@ export const ventureDesk: Venture[] = [
export const ventureSignals: VentureSignal[] = [
{
name: "Trivia & Tunes",
strap: "live-hosted games and music-led connection",
name: "Blue Note Logic",
strap: "private AI, document intelligence, and source-cited memory",
summary:
"A cultural desk for knowledge, playlists, rooms full of people, and the social engineering of a good night.",
href: "https://triviaandtunes.com/",
"The machine room behind the paper: owned infrastructure, private corpora, multilingual controls, and AI that keeps its receipts.",
href: "https://ai.bluenotelogic.com/",
imageSrc: "/images/ai-lab/hero-lab.svg",
imageAlt: "Illustrated AI lab diagram for Blue Note Logic.",
imageNote: "Private corpus / cited answers / EU hosting",
external: true,
},
{
name: "Trivia & Tunes",
strap: "live-hosted games, music rounds, and true AI in the loop",
summary:
"A culture product with venue instincts: playlists, game craft, AI grading, and voice features edging toward the microphone.",
href: "https://triviaandtunes.no/",
imageSrc:
"https://commons.wikimedia.org/wiki/Special:Redirect/file/Level_42_Kongsberg_Jazzfestival_2017_%28214257%29.jpg",
imageAlt: "Crowd-facing stage image from Kongsberg Jazzfestival.",
imageNote: "Live rooms / music energy / quiz-night voltage",
external: true,
},
{
name: "Do Better Norge",
@@ -125,6 +146,22 @@ export const ventureSignals: VentureSignal[] = [
summary:
"A civic and advocacy desk grounded in primary sources, practical guidance, and a refusal to treat children as procedural debris.",
href: "https://dobetternorge.no/",
imageSrc: "https://commons.wikimedia.org/wiki/Special:Redirect/file/Kongsberg_IMG_0357.JPG",
imageAlt: "Riverfront view in Kongsberg, Norway.",
imageNote: "Norway desk / family life / civic weather",
external: true,
},
{
name: "School dossier",
strap: "Brussels, Krakow, Paris, Villanova, and the long route north",
summary:
"The education issue turns institutions into chapters, cities into footnotes, and degrees into a proper migration story.",
href: "/education",
imageSrc:
"https://commons.wikimedia.org/wiki/Special:Redirect/file/Grand-Place,_Brussels_%2839528722772%29.jpg",
imageAlt: "Grand-Place in Brussels.",
imageNote: "Brussels / multilingual weather / first European chapter",
external: false,
},
];
@@ -218,7 +255,7 @@ export const aiLabSources: SourceCredit[] = [
},
{
label: "Trivia & Tunes",
url: "https://triviaandtunes.com/",
url: "https://triviaandtunes.no/",
note:
"Used for the live-hosted trivia and music angle on the homepage culture desk.",
},
@@ -226,6 +263,12 @@ export const aiLabSources: SourceCredit[] = [
label: "Do Better Norge",
url: "https://dobetternorge.no/",
note:
"Used for the advocacy and childrens-rights positioning on the homepage civic desk.",
"Used for the advocacy and children's-rights positioning on the homepage civic desk.",
},
{
label: "Wikimedia Commons",
url: "https://commons.wikimedia.org/",
note:
"Used for the public-domain and openly licensed city, campus, and festival images woven through the homepage and section cards.",
},
];
+30 -26
View File
@@ -21,12 +21,12 @@ export type SchoolDossier = {
};
export const hero = {
kicker: "Blue Note Logic presents",
title: "Dave Gilligan, a literary jazz magazine disguised as a personal site.",
kicker: "Pataphysical bulletin / Kongsberg edition",
title: "A high-tech newsmagazine disguised as one man's improbable paper trail.",
lede:
"Writing, technology, music, languages, family history, consulting, and a little applied pataphysics, arranged as a bright editorial salon rather than a brochure.",
"Private AI, jazz basements, multilingual weather, family rights, and systems work from Ringwood to Kongsberg, edited with equal parts brass, evidence, and deliberate mischief.",
sublede:
"Built for essays, dossiers, dispatches, experiments, job postings, and AI-assisted editions that can move between English, Norwegian, and French without losing their mood.",
"Inside this issue: Blue Note Logic in the machine room, Gilligan Tech in the field, Do Better Norge in the civic file, Trivia & Tunes in the live-wire culture pages, and school dossiers written like contraband literature.",
};
export const launchSections: LaunchSection[] = [
@@ -34,7 +34,7 @@ export const launchSections: LaunchSection[] = [
slug: "business",
label: "01",
title: "Business",
summary: "Consulting notes, operator essays, client stories, and strategy with sleeves rolled up.",
summary: "Consulting notes, AI architecture, and operator essays for people who prefer working systems to rented theater.",
tone: "Sharp, practical, anti-buzzword.",
strap: "Operator studies for adults who are tired of consultant vapor.",
coverline: "The anti-buzzword ledger.",
@@ -56,7 +56,7 @@ export const launchSections: LaunchSection[] = [
slug: "family",
label: "03",
title: "Family",
summary: "A warmer archive for memory, milestones, and the people who keep the music human.",
summary: "A warmer archive for memory, milestones, and the private weather that keeps the machinery worth running.",
tone: "Private-minded, generous, alive.",
strap: "The soft archive, still edited like it matters.",
coverline: "Domestic front pages.",
@@ -67,7 +67,7 @@ export const launchSections: LaunchSection[] = [
slug: "fun-postings",
label: "04",
title: "Fun Postings",
summary: "Odd notices, cultural flyers, side projects, and delightfully unnecessary announcements.",
summary: "Odd notices, cultural flyers, side projects, and the sort of elegant nonsense that deserves proper typesetting.",
tone: "Playful, deadpan, collectible.",
strap: "The classified page gets strange and starts wearing cologne.",
coverline: "Useful nonsense, neatly set.",
@@ -78,18 +78,22 @@ export const launchSections: LaunchSection[] = [
slug: "writing",
label: "05",
title: "Writing",
summary: "Features, columns, notebooks, and dispatches for readers who like style with backbone.",
summary: "This month's writing desk runs on Boris Vian: novels with trapdoors, Vernon Sullivan weather, Saint-Germain smoke, and bibliography arranged like a contraband route.",
tone: "Literary, international, smoky.",
strap: "Columns with brass in the lungs and data in the pockets.",
coverline: "Smoke, syntax, and reportage.",
motif: "Essays, dispatches, notebook pages.",
samples: ["On systems and sorrow", "Nordic field notes", "Paris after the spreadsheet"],
strap: "A low-lit file on Boris Vian, jazz syntax, and the exact science of glorious exception.",
coverline: "Boris Vian in the side door.",
motif: "Novels, jazz, pataphysics, counterfeit signatures, and Paris after midnight.",
samples: [
"The engineer of exceptions",
"Five doors into Boris Vian",
"Why Saint-Germain still leaks into the prose",
],
},
{
slug: "jazz-music",
label: "06",
title: "Jazz and Music",
summary: "Listening notes, deep cuts, rhythm studies, and the low-lit logic of serious groove.",
summary: "Listening notes, Kongsberg nights, Caveau memories, and the low-lit logic of serious groove.",
tone: "Velvet, brassy, precise.",
strap: "For records, rooms, and players who understand that rhythm is governance.",
coverline: "Blue notes and side doors.",
@@ -100,7 +104,7 @@ export const launchSections: LaunchSection[] = [
slug: "languages",
label: "07",
title: "Languages",
summary: "Translation, vocabulary, cross-border humor, and the pleasures of switching registers.",
summary: "English, French, and Norwegian switching places without losing the joke, the seduction, or the filing detail.",
tone: "Polyglot, sly, welcoming.",
strap: "A section for mistranslation, seduction, and grammatical diplomacy.",
coverline: "The multilingual cabinet.",
@@ -111,7 +115,7 @@ export const launchSections: LaunchSection[] = [
slug: "ai-lab",
label: "08",
title: "AI Lab",
summary: "Built-in tools, experiments, prompt systems, and practical machine intelligence with taste.",
summary: "Private corpora, cited answers, multilingual agents, and practical machine intelligence with actual memory.",
tone: "Forward-looking, grounded, open source friendly.",
strap: "Machine intelligence without the conference lanyard.",
coverline: "The atelier for useful futures.",
@@ -122,7 +126,7 @@ export const launchSections: LaunchSection[] = [
slug: "norway",
label: "09",
title: "Norway",
summary: "Kongsberg dispatches, civic notes, local texture, and Scandinavian reality at street level.",
summary: "Kongsberg dispatches, civic reporting, immigrant-family realities, and Norwegian life observed without brochure language.",
tone: "Observant, civic, place-aware.",
strap: "A local paper for one town and several realities.",
coverline: "Kongsberg, correctly observed.",
@@ -133,7 +137,7 @@ export const launchSections: LaunchSection[] = [
slug: "projects",
label: "10",
title: "Projects",
summary: "Things launched, repaired, modernized, or imagined into being across code, content, and data.",
summary: "Things launched, repaired, modernized, or made slightly dangerous across code, content, venues, and data.",
tone: "Builder energy, clean receipts.",
strap: "The workshop floor, but art directed.",
coverline: "Built, fixed, and shipped.",
@@ -207,21 +211,21 @@ export const schoolDossiers: SchoolDossier[] = [
];
export const fieldNotes = [
"AI-backed edition controls for English, Norwegian, and French.",
"A magazine structure ready for essays, archives, member access, and dossiers.",
"A future-facing front end sitting on top of PHP, SQL, and role-based permissions.",
"Blue Note Logic keeps the machine room full of private AI, cited answers, and document intelligence that behaves like evidence instead of theater.",
"Trivia & Tunes is now a living product story: venue-grade quiz nights, real AI in the game loop, and voice layers warming up for live testing.",
"Do Better Norge keeps the civic file open on family life, immigrant fathers, due process, and the legal weather in contemporary Norway.",
];
export const editorialPromises = [
"Keep the light background and the page breathable.",
"Make AI visible as a craft tool, not a gimmick.",
"Treat the CV, the essays, and the family archive with equal design seriousness.",
"Keep the paper light, breathable, and a little dangerous around the edges.",
"Make AI visible as a craft tool, a newsroom instrument, and never a plastic gimmick.",
"Treat the CV, the jazz notebook, the civic archive, and the family pages with equal design seriousness.",
];
export const coverLines = [
"A literary technology salon with jazz smoke in the margins.",
"Five school dossiers, each signed with a clearly counterfeit blessing.",
"AI in the machinery, not sprayed on top like fresh cologne.",
"A pataphysical field paper with jazz smoke in the margins and SQL under the floorboards.",
"Five school dossiers, each signed with a clearly counterfeit blessing and a straight face.",
"AI in the machinery, not sprayed on top like fresh conference cologne.",
];
export function getSectionHref(section: LaunchSection) {