@dataimago/hub-chrome 0.2.0-alpha.3 → 0.2.0-alpha.4

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.cjs CHANGED
@@ -95,7 +95,7 @@ function PlatformNav({
95
95
  href
96
96
  ) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_link.default, { href, className: "btn-ghost hidden sm:inline-flex", children: label }, href)
97
97
  ),
98
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_link.default, { href: cta.href, className: "btn-primary", children: cta.label }),
98
+ cta && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_link.default, { href: cta.href, className: "btn-primary", children: cta.label }),
99
99
  rightSlot
100
100
  ] })
101
101
  ]
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/PlatformNav.tsx","../src/GitHubNavButton.tsx","../src/SiteFooter.tsx","../src/MinimalFooter.tsx","../src/PhilosophyFooter.tsx"],"sourcesContent":["/**\n * @dataimago/hub-chrome — public surface barrel.\n *\n * All three chrome components are named exports. The original apps/hub\n * versions were default exports; the package exposes them as named exports\n * for tree-shaking and to keep the import surface symmetric with\n * @dataimago/ui and @dataimago/interview.\n */\nexport { PlatformNav } from './PlatformNav';\nexport { GitHubNavButton } from './GitHubNavButton';\nexport { SiteFooter } from './SiteFooter';\nexport { MinimalFooter } from './MinimalFooter';\nexport { PhilosophyFooter } from './PhilosophyFooter';\n\nexport type {\n NavLink,\n FooterColumn,\n EditorialPair,\n PullQuote,\n BrandMark,\n NavbarMark,\n AiMonogram,\n PlatformNavProps,\n GitHubNavButtonProps,\n SiteFooterProps,\n MinimalFooterProps,\n PhilosophyFooterProps,\n} from './types';\n","'use client';\n\nimport Link from 'next/link';\nimport { Logo, NavbarLogo } from '@dataimago/ui';\nimport type { PlatformNavProps } from './types';\n\n/**\n * Platform navigation — sticky header with the property's brand mark + nav cluster.\n *\n * The property mark is rendered by height (so any aspect fits the nav). By default\n * it's the static `@dataimago/brand` wordmark via `<Logo>` (font-free, IoU-locked,\n * `currentColor`). When `navbarMark` is set it becomes the ANIMATED `<NavbarLogo>`\n * (the a/i assemble toggle for L2 marks, lift+wash for L1) — falling back to the\n * static `<Logo brandMark>` otherwise, so pre-navbar consumers are unaffected.\n *\n * `aiMonogram` adds the dataimago `ai-monogram` icon button to the LEFT of the\n * property mark (a 48px touch target; lift+washes to the brand-mark red on hover).\n *\n * Extracted from apps/hub into @dataimago/hub-chrome during iteration-3-B.2\n * (2026-05-11); `navbarMark`/`aiMonogram` added in iteration-4 (the navbar logo\n * system). All props default to the Level-1 hub configuration.\n */\n\nconst DEFAULT_LINKS = [\n { href: '/ecosystem', label: 'Ecosystem' },\n { href: '/philosophy', label: 'Philosophy' },\n];\n\nconst DEFAULT_CTA = { href: '/onboard', label: 'Begin' };\n\n/** Height-based sizing for the property mark (the navbar norm — ~30% larger letters). */\nconst MARK_CLASS = '[&_svg]:h-7 [&_svg]:w-auto sm:[&_svg]:h-8';\n\n/** The optional ai-monogram icon button — a 48px touch target (ready-to-hand floor). */\nconst AI_BUTTON_CLASS =\n 'inline-flex min-h-[48px] min-w-[48px] items-center justify-center rounded-xl ' +\n 'border border-stone-200 bg-stone-50 text-stone-900 transition hover:bg-stone-100';\n\nexport function PlatformNav({\n brandMark = 'dataimago_ai_OVERLAP',\n navbarMark,\n aiMonogram,\n brandLabel = 'dataimago.ai home',\n links = DEFAULT_LINKS,\n cta = DEFAULT_CTA,\n rightSlot,\n navLabel = 'Primary',\n homeHref = '/',\n}: PlatformNavProps) {\n const propertyMark = navbarMark ? (\n <NavbarLogo name={navbarMark} aria-hidden className={MARK_CLASS} />\n ) : (\n <Logo name={brandMark} variant=\"PATH\" aria-hidden className={MARK_CLASS} />\n );\n\n const aiHref = typeof aiMonogram === 'object' ? aiMonogram.href : undefined;\n const aiLabel =\n typeof aiMonogram === 'object' ? (aiMonogram.label ?? 'dataimago') : 'dataimago';\n\n return (\n <header className=\"sticky top-0 z-40 border-b border-stone-200 bg-stone-100/95 backdrop-blur-sm\">\n <nav\n className=\"mx-auto flex max-w-7xl items-center justify-between px-6 py-4\"\n aria-label={navLabel}\n >\n <div className=\"flex items-center gap-2 sm:gap-3\">\n {aiMonogram &&\n (aiHref ? (\n <Link href={aiHref} aria-label={aiLabel} className={AI_BUTTON_CLASS}>\n <NavbarLogo name=\"ai-monogram\" aria-hidden className=\"[&_svg]:h-6 [&_svg]:w-auto\" />\n </Link>\n ) : (\n <span className={AI_BUTTON_CLASS} aria-hidden>\n <NavbarLogo name=\"ai-monogram\" aria-hidden className=\"[&_svg]:h-6 [&_svg]:w-auto\" />\n </span>\n ))}\n <Link\n href={homeHref}\n className=\"inline-flex min-h-[48px] items-center text-stone-900 transition hover:opacity-80\"\n aria-label={brandLabel}\n >\n {propertyMark}\n </Link>\n </div>\n\n <div className=\"flex items-center gap-2 sm:gap-6\">\n {links.map(({ href, label, external }) =>\n external ? (\n <a\n key={href}\n href={href}\n className=\"btn-ghost hidden sm:inline-flex\"\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {label}\n </a>\n ) : (\n <Link key={href} href={href} className=\"btn-ghost hidden sm:inline-flex\">\n {label}\n </Link>\n )\n )}\n <Link href={cta.href} className=\"btn-primary\">\n {cta.label}\n </Link>\n {rightSlot}\n </div>\n </nav>\n </header>\n );\n}\n","import type { GitHubNavButtonProps } from './types';\n\n/**\n * The unified GitHub account control for the nav's right slot — the canonical\n * login affordance + login-state indicator shared across every L1/L2 dataimago\n * app (rendered into `PlatformNav`'s `rightSlot`).\n *\n * Fully presentational and **stateless** — it reads no auth itself; the consumer\n * feeds it. Uses a native `<details>` disclosure for the signed-in menu, so it\n * needs no client JS and works whether rendered on the server (a server parent\n * injecting the avatar) or the client.\n *\n * - `mode=\"auth\"` (default): the login-state indicator.\n * - `status=\"unauthed\"` → a GET link to `signInHref` (start OAuth) showing the\n * GitHub mark + a login glyph.\n * - `status=\"authed\"` → the GitHub mark + the user's avatar, opening a menu\n * (profile link + a POST sign-out form to `signOutAction`).\n * - `mode=\"link\"`: a plain GitHub→`orgHref` link (L1, which has no auth).\n *\n * Icons are inlined (the GitHub mark + a lucide-style \"log-in\" glyph) to keep the\n * shared package free of an icon-library peer dependency.\n */\n\n// The 48px touch-target floor (the ready-to-hand dignity gate); colours resolve\n// from the consuming app's dataimago palette. The global `*:focus-visible` rule\n// supplies the focus ring.\nconst SHELL =\n 'inline-flex min-h-[48px] items-center gap-2 rounded-xl border border-stone-200 ' +\n 'bg-stone-50 px-3 text-stone-900 transition hover:bg-stone-100';\n\nconst MENU_ITEM =\n 'flex min-h-[48px] w-full items-center rounded px-2 text-left text-sm ' +\n 'text-stone-900 transition hover:bg-stone-100';\n\nfunction GithubMark() {\n return (\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" className=\"h-5 w-5 shrink-0\" fill=\"currentColor\">\n <path d=\"M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23a11.5 11.5 0 0 1 3.003-.404c1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222 0 1.606-.014 2.898-.014 3.293 0 .322.216.694.825.576C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12\" />\n </svg>\n );\n}\n\nfunction LoginGlyph() {\n // lucide \"log-in\" (ISC), inlined.\n return (\n <svg\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n className=\"h-5 w-5 shrink-0\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M15 3h4a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-4\" />\n <polyline points=\"10 17 15 12 10 7\" />\n <line x1=\"15\" x2=\"3\" y1=\"12\" y2=\"12\" />\n </svg>\n );\n}\n\nexport function GitHubNavButton({\n mode = 'auth',\n status = 'unauthed',\n login,\n avatarUrl,\n signInHref,\n profileHref,\n signOutAction,\n orgHref,\n defaultOpen,\n}: GitHubNavButtonProps) {\n // L1 mode: a plain GitHub→org link (no auth).\n if (mode === 'link') {\n return (\n <a\n href={orgHref}\n target=\"_blank\"\n rel=\"noreferrer\"\n className={SHELL}\n aria-label=\"dataimago on GitHub\"\n >\n <GithubMark />\n </a>\n );\n }\n\n // Signed out: a GET link that starts the OAuth flow.\n if (status !== 'authed') {\n return (\n <a href={signInHref} className={SHELL} aria-label=\"Sign in with GitHub\">\n <GithubMark />\n <LoginGlyph />\n </a>\n );\n }\n\n // Signed in: the GitHub mark + the user's avatar, with a native-disclosure menu.\n return (\n <details className=\"relative\" open={defaultOpen}>\n <summary\n className={`${SHELL} cursor-pointer list-none [&::-webkit-details-marker]:hidden`}\n aria-label={`GitHub account — signed in as ${login ?? 'your account'}`}\n >\n <GithubMark />\n {avatarUrl ? (\n <img\n src={avatarUrl}\n alt=\"\"\n className=\"h-7 w-7 rounded-full border border-stone-200\"\n width={28}\n height={28}\n />\n ) : (\n <span className=\"text-sm font-medium\">@{login}</span>\n )}\n </summary>\n <div className=\"absolute right-0 z-50 mt-2 w-60 rounded-lg border border-stone-200 bg-stone-50 p-2 shadow-lg\">\n <p className=\"px-2 py-1 text-sm text-stone-700\">\n Signed in as <span className=\"font-medium text-stone-900\">@{login}</span>\n </p>\n {profileHref && (\n <a href={profileHref} target=\"_blank\" rel=\"noreferrer\" className={MENU_ITEM}>\n View your GitHub profile\n </a>\n )}\n {signOutAction && (\n <form method=\"POST\" action={signOutAction}>\n <button type=\"submit\" className={MENU_ITEM}>\n Sign out\n </button>\n </form>\n )}\n </div>\n </details>\n );\n}\n","'use client';\n\nimport Link from 'next/link';\nimport { Logo } from '@dataimago/ui';\nimport type { SiteFooterProps } from './types';\n\n/**\n * Site footer — the Level-1 hub footer: dark surface, dataimago wordmark + a\n * trimmed nav column grid.\n *\n * The wordmark is the `dataimago` brand mark via `<Logo>` (font-free, in a light\n * `currentColor` on the dark surface) — no backplate, no hardcoded \".ai\" span.\n *\n * Extracted from apps/hub into @dataimago/hub-chrome during iteration-3-B.2\n * (2026-05-11). The defaults drop the former \"Legacy\" column + the critical-theory\n * closing statement (the philosophical-basis editorial lives on the PhilosophyFooter,\n * which is Level-1-only). Level-2 verticals use `MinimalFooter` instead.\n */\n\nconst DEFAULT_TAGLINE = 'A living AI-native application ecosystem.';\n\nconst DEFAULT_COLUMNS = [\n {\n heading: 'Platform',\n links: [\n { href: '/onboard', label: 'Begin a project' },\n { href: '/ecosystem', label: 'Ecosystem' },\n { href: '/philosophy', label: 'Philosophy' },\n ],\n },\n {\n heading: 'Framework',\n links: [\n {\n href: 'https://github.com/dataimago/dataimago-design',\n label: 'dataimago-design',\n external: true,\n },\n {\n href: 'https://github.com/dataimago/dataimago-rpkg',\n label: 'dataimago-rpkg',\n external: true,\n },\n {\n href: 'https://github.com/dataimago/dataimago-ai',\n label: 'dataimago-ai',\n external: true,\n },\n ],\n },\n];\n\nexport function SiteFooter({\n tagline = DEFAULT_TAGLINE,\n columns = DEFAULT_COLUMNS,\n closingStatement,\n}: SiteFooterProps) {\n return (\n <footer\n className=\"border-t border-stone-800 bg-stone-900 text-stone-400\"\n data-bs-theme=\"dark\"\n >\n <div className=\"mx-auto max-w-6xl px-6 py-12\">\n <div className=\"grid gap-8 md:grid-cols-4\">\n <div>\n <Link\n href=\"/\"\n className=\"inline-flex items-center text-stone-100 transition hover:opacity-80\"\n aria-label=\"dataimago\"\n >\n <Logo\n name=\"dataimago\"\n variant=\"PATH\"\n aria-hidden\n className=\"[&_svg]:h-7 [&_svg]:w-auto\"\n />\n </Link>\n <p className=\"mt-3 text-xs text-stone-400\">{tagline}</p>\n </div>\n\n {columns.map((col) => (\n <div key={col.heading}>\n <h4 className=\"font-mono text-xs uppercase tracking-wider text-accent-300\">\n {col.heading}\n </h4>\n <ul className=\"mt-3 space-y-2 text-sm\">\n {col.links.map(({ href, label, external }) => (\n <li key={label}>\n {!href ? (\n label\n ) : external ? (\n <a\n href={href}\n className=\"hover:text-paper-100\"\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {label}\n </a>\n ) : (\n <Link href={href} className=\"hover:text-paper-100\">\n {label}\n </Link>\n )}\n </li>\n ))}\n </ul>\n </div>\n ))}\n </div>\n\n {closingStatement ? (\n <div className=\"mt-12 border-t border-stone-800 pt-6 text-xs text-stone-400\">\n <p>{closingStatement}</p>\n </div>\n ) : null}\n </div>\n </footer>\n );\n}\n","'use client';\n\nimport Link from 'next/link';\nimport { Logo } from '@dataimago/ui';\nimport type { MinimalFooterProps } from './types';\n\n/**\n * MinimalFooter — the Level-2 vertical footer.\n *\n * A Level-2 vertical (dissertation.ai, future rpkg.ai / sgpc.ai) is \"an embodiment\n * of dataimago\": the footer shows the parent `dataimago` wordmark linking UP to\n * dataimago.ai, the embodiment line, a compact links row, and a copyright line.\n * No nav columns, no philosophy — those belong to the Level-1 hub (SiteFooter +\n * PhilosophyFooter). See dataimago-design wiki/patterns/hub-hero-anatomy.\n */\n\nconst DEFAULT_BRAND_HREF = 'https://dataimago.ai';\nconst DEFAULT_EMBODIMENT = 'An embodiment of dataimago';\n\nexport function MinimalFooter({\n brandHref = DEFAULT_BRAND_HREF,\n embodimentLabel = DEFAULT_EMBODIMENT,\n links = [],\n copyright,\n}: MinimalFooterProps) {\n return (\n <footer\n className=\"border-t border-stone-800 bg-stone-900 text-stone-400\"\n data-bs-theme=\"dark\"\n >\n <div className=\"mx-auto flex max-w-6xl flex-col items-center gap-4 px-6 py-10 text-center\">\n <a\n href={brandHref}\n className=\"inline-flex flex-col items-center gap-2 text-stone-100 transition hover:opacity-80\"\n target=\"_blank\"\n rel=\"noreferrer\"\n aria-label={`${embodimentLabel} — visit dataimago.ai`}\n >\n <Logo\n name=\"dataimago\"\n variant=\"PATH\"\n aria-hidden\n className=\"[&_svg]:h-7 [&_svg]:w-auto\"\n />\n <span className=\"text-sm text-stone-400\">{embodimentLabel}</span>\n </a>\n\n {links.length > 0 ? (\n <nav\n className=\"flex flex-wrap items-center justify-center gap-x-6 gap-y-2 text-sm\"\n aria-label=\"Footer\"\n >\n {links.map(({ href, label, external }) =>\n !href ? (\n <span key={label} className=\"text-stone-400\">\n {label}\n </span>\n ) : external ? (\n <a\n key={label}\n href={href}\n className=\"text-stone-300 hover:text-paper-100\"\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {label}\n </a>\n ) : (\n <Link key={label} href={href} className=\"text-stone-300 hover:text-paper-100\">\n {label}\n </Link>\n )\n )}\n </nav>\n ) : null}\n\n {copyright ? <p className=\"text-xs text-stone-400\">{copyright}</p> : null}\n </div>\n </footer>\n );\n}\n","'use client';\n\nimport type { PhilosophyFooterProps } from './types';\n\n/**\n * Philosophy footer — the platform's moral weight, rendered as a dark\n * editorial section with three belief/mission/vision pairs and a pull-quote.\n *\n * Iteration-1 visual identity (Phase B.3, 2026-05-06):\n * Dark-surface chrome with text-accent-500 eyebrows, font-display body, and\n * the Baudrillard blockquote with border-copper-500 (preserved-decorative-\n * copper per iteration-1 §5.2 governance).\n *\n * Iteration-2 role-shift (2026-05-07): text-accent-500 eyebrows resolve to\n * sky-blue accent-300 (#3498DB) on this dark surface via mode-aware mapping —\n * 5.41:1 on stone-900 (was 3.23:1 AA-large only with copper). The\n * border-copper-500 blockquote frame survives untouched. \"Two warmths\"\n * coexist: cool sky-blue on editorial eyebrows, warm copper on the\n * philosophical-quote frame.\n *\n * Extracted from apps/hub into @dataimago/hub-chrome during iteration-3-B.2\n * (2026-05-11). The `pairs`, `quote`, and `closingStatement` props allow\n * per-vertical adaptation; all props default to the Level-1 hub content.\n */\n\nconst DEFAULT_PAIRS = [\n {\n eyebrow: 'our belief',\n body: 'AI can enable virtuous cycles of improvement in the world.',\n },\n {\n eyebrow: 'our mission',\n body: 'The emancipation of humanity through ai super-alignment.',\n },\n {\n eyebrow: 'our vision',\n body: 'Super-alignment embeds ai in culture, not culture in ai.',\n },\n];\n\nconst DEFAULT_QUOTE = {\n text: `If men create intelligent machines, or fantasize about them, it is either because they secretly despair of their own intelligence or because they are in danger of succumbing to the weight of a monstrous and useless intelligence which they seek to exorcize by transferring it to machines, where they can play with it and make fun of it. By entrusting this burdensome intelligence to machines we are released from any responsibility to knowledge.`,\n attribution: 'Jean Baudrillard',\n work: 'Xerox and Infinity',\n year: 1988,\n};\n\nconst DEFAULT_CLOSING =\n 'dataimago is the structural answer to this critique. Every architectural choice — R as source of truth, editorial authority with the domain expert, the non-destructive retrofit principle, the ecosystem-as-commons — refuses to release the scholar from responsibility to their own knowledge. The AI serves the culture; the culture governs the AI.';\n\nexport function PhilosophyFooter({\n pairs = DEFAULT_PAIRS,\n quote = DEFAULT_QUOTE,\n closingStatement = DEFAULT_CLOSING,\n}: PhilosophyFooterProps) {\n return (\n <section\n aria-labelledby=\"philosophy-heading\"\n className=\"border-t border-stone-200 bg-stone-900 py-20 text-paper-100 sm:py-28\"\n >\n <div className=\"mx-auto max-w-6xl px-6\">\n <div className=\"grid gap-12 lg:grid-cols-3\">\n {pairs.map((pair, i) => (\n <div key={i}>\n <p className=\"font-mono text-xs uppercase tracking-wider text-accent-500\">\n {pair.eyebrow}\n </p>\n {i === 0 ? (\n <h3\n id=\"philosophy-heading\"\n className=\"mt-2 font-display text-xl text-paper-100\"\n >\n {pair.body}\n </h3>\n ) : (\n <p className=\"mt-2 font-display text-xl text-paper-100\">\n {pair.body}\n </p>\n )}\n </div>\n ))}\n </div>\n\n {/* Pull-quote — border-copper-500 PRESERVED: decorative-emphasis\n blockquote frame per iteration-1 §5.2 preserved-decorative-copper\n governance. */}\n <blockquote className=\"mt-16 max-w-prose-wide border-l-2 border-copper-500 pl-6 font-display italic text-paper-100\">\n <p className=\"text-base leading-relaxed\">{quote.text}</p>\n <footer className=\"mt-4 text-sm not-italic text-stone-400\">\n — {quote.attribution}, <cite>{quote.work}</cite> ({quote.year})\n </footer>\n </blockquote>\n\n <p className=\"mt-8 max-w-prose-wide text-sm text-stone-400\">\n {closingStatement}\n </p>\n </div>\n </section>\n );\n}\n"],"mappings":"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","names":["Link","import_jsx_runtime","import_link","import_ui","import_jsx_runtime","Link","import_link","import_ui","import_jsx_runtime","Link","import_jsx_runtime"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/PlatformNav.tsx","../src/GitHubNavButton.tsx","../src/SiteFooter.tsx","../src/MinimalFooter.tsx","../src/PhilosophyFooter.tsx"],"sourcesContent":["/**\n * @dataimago/hub-chrome — public surface barrel.\n *\n * All three chrome components are named exports. The original apps/hub\n * versions were default exports; the package exposes them as named exports\n * for tree-shaking and to keep the import surface symmetric with\n * @dataimago/ui and @dataimago/interview.\n */\nexport { PlatformNav } from './PlatformNav';\nexport { GitHubNavButton } from './GitHubNavButton';\nexport { SiteFooter } from './SiteFooter';\nexport { MinimalFooter } from './MinimalFooter';\nexport { PhilosophyFooter } from './PhilosophyFooter';\n\nexport type {\n NavLink,\n FooterColumn,\n EditorialPair,\n PullQuote,\n BrandMark,\n NavbarMark,\n AiMonogram,\n PlatformNavProps,\n GitHubNavButtonProps,\n SiteFooterProps,\n MinimalFooterProps,\n PhilosophyFooterProps,\n} from './types';\n","'use client';\n\nimport Link from 'next/link';\nimport { Logo, NavbarLogo } from '@dataimago/ui';\nimport type { PlatformNavProps } from './types';\n\n/**\n * Platform navigation — sticky header with the property's brand mark + nav cluster.\n *\n * The property mark is rendered by height (so any aspect fits the nav). By default\n * it's the static `@dataimago/brand` wordmark via `<Logo>` (font-free, IoU-locked,\n * `currentColor`). When `navbarMark` is set it becomes the ANIMATED `<NavbarLogo>`\n * (the a/i assemble toggle for L2 marks, lift+wash for L1) — falling back to the\n * static `<Logo brandMark>` otherwise, so pre-navbar consumers are unaffected.\n *\n * `aiMonogram` adds the dataimago `ai-monogram` icon button to the LEFT of the\n * property mark (a 48px touch target; lift+washes to the brand-mark red on hover).\n *\n * Extracted from apps/hub into @dataimago/hub-chrome during iteration-3-B.2\n * (2026-05-11); `navbarMark`/`aiMonogram` added in iteration-4 (the navbar logo\n * system). All props default to the Level-1 hub configuration.\n */\n\nconst DEFAULT_LINKS = [\n { href: '/ecosystem', label: 'Ecosystem' },\n { href: '/philosophy', label: 'Philosophy' },\n];\n\nconst DEFAULT_CTA = { href: '/onboard', label: 'Begin' };\n\n/** Height-based sizing for the property mark (the navbar norm — ~30% larger letters). */\nconst MARK_CLASS = '[&_svg]:h-7 [&_svg]:w-auto sm:[&_svg]:h-8';\n\n/** The optional ai-monogram icon button — a 48px touch target (ready-to-hand floor). */\nconst AI_BUTTON_CLASS =\n 'inline-flex min-h-[48px] min-w-[48px] items-center justify-center rounded-xl ' +\n 'border border-stone-200 bg-stone-50 text-stone-900 transition hover:bg-stone-100';\n\nexport function PlatformNav({\n brandMark = 'dataimago_ai_OVERLAP',\n navbarMark,\n aiMonogram,\n brandLabel = 'dataimago.ai home',\n links = DEFAULT_LINKS,\n cta = DEFAULT_CTA,\n rightSlot,\n navLabel = 'Primary',\n homeHref = '/',\n}: PlatformNavProps) {\n const propertyMark = navbarMark ? (\n <NavbarLogo name={navbarMark} aria-hidden className={MARK_CLASS} />\n ) : (\n <Logo name={brandMark} variant=\"PATH\" aria-hidden className={MARK_CLASS} />\n );\n\n const aiHref = typeof aiMonogram === 'object' ? aiMonogram.href : undefined;\n const aiLabel =\n typeof aiMonogram === 'object' ? (aiMonogram.label ?? 'dataimago') : 'dataimago';\n\n return (\n <header className=\"sticky top-0 z-40 border-b border-stone-200 bg-stone-100/95 backdrop-blur-sm\">\n <nav\n className=\"mx-auto flex max-w-7xl items-center justify-between px-6 py-4\"\n aria-label={navLabel}\n >\n <div className=\"flex items-center gap-2 sm:gap-3\">\n {aiMonogram &&\n (aiHref ? (\n <Link href={aiHref} aria-label={aiLabel} className={AI_BUTTON_CLASS}>\n <NavbarLogo name=\"ai-monogram\" aria-hidden className=\"[&_svg]:h-6 [&_svg]:w-auto\" />\n </Link>\n ) : (\n <span className={AI_BUTTON_CLASS} aria-hidden>\n <NavbarLogo name=\"ai-monogram\" aria-hidden className=\"[&_svg]:h-6 [&_svg]:w-auto\" />\n </span>\n ))}\n <Link\n href={homeHref}\n className=\"inline-flex min-h-[48px] items-center text-stone-900 transition hover:opacity-80\"\n aria-label={brandLabel}\n >\n {propertyMark}\n </Link>\n </div>\n\n <div className=\"flex items-center gap-2 sm:gap-6\">\n {links.map(({ href, label, external }) =>\n external ? (\n <a\n key={href}\n href={href}\n className=\"btn-ghost hidden sm:inline-flex\"\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {label}\n </a>\n ) : (\n <Link key={href} href={href} className=\"btn-ghost hidden sm:inline-flex\">\n {label}\n </Link>\n )\n )}\n {cta && (\n <Link href={cta.href} className=\"btn-primary\">\n {cta.label}\n </Link>\n )}\n {rightSlot}\n </div>\n </nav>\n </header>\n );\n}\n","import type { GitHubNavButtonProps } from './types';\n\n/**\n * The unified GitHub account control for the nav's right slot — the canonical\n * login affordance + login-state indicator shared across every L1/L2 dataimago\n * app (rendered into `PlatformNav`'s `rightSlot`).\n *\n * Fully presentational and **stateless** — it reads no auth itself; the consumer\n * feeds it. Uses a native `<details>` disclosure for the signed-in menu, so it\n * needs no client JS and works whether rendered on the server (a server parent\n * injecting the avatar) or the client.\n *\n * - `mode=\"auth\"` (default): the login-state indicator.\n * - `status=\"unauthed\"` → a GET link to `signInHref` (start OAuth) showing the\n * GitHub mark + a login glyph.\n * - `status=\"authed\"` → the GitHub mark + the user's avatar, opening a menu\n * (profile link + a POST sign-out form to `signOutAction`).\n * - `mode=\"link\"`: a plain GitHub→`orgHref` link (L1, which has no auth).\n *\n * Icons are inlined (the GitHub mark + a lucide-style \"log-in\" glyph) to keep the\n * shared package free of an icon-library peer dependency.\n */\n\n// The 48px touch-target floor (the ready-to-hand dignity gate); colours resolve\n// from the consuming app's dataimago palette. The global `*:focus-visible` rule\n// supplies the focus ring.\nconst SHELL =\n 'inline-flex min-h-[48px] items-center gap-2 rounded-xl border border-stone-200 ' +\n 'bg-stone-50 px-3 text-stone-900 transition hover:bg-stone-100';\n\nconst MENU_ITEM =\n 'flex min-h-[48px] w-full items-center rounded px-2 text-left text-sm ' +\n 'text-stone-900 transition hover:bg-stone-100';\n\nfunction GithubMark() {\n return (\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" className=\"h-5 w-5 shrink-0\" fill=\"currentColor\">\n <path d=\"M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23a11.5 11.5 0 0 1 3.003-.404c1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222 0 1.606-.014 2.898-.014 3.293 0 .322.216.694.825.576C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12\" />\n </svg>\n );\n}\n\nfunction LoginGlyph() {\n // lucide \"log-in\" (ISC), inlined.\n return (\n <svg\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n className=\"h-5 w-5 shrink-0\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M15 3h4a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-4\" />\n <polyline points=\"10 17 15 12 10 7\" />\n <line x1=\"15\" x2=\"3\" y1=\"12\" y2=\"12\" />\n </svg>\n );\n}\n\nexport function GitHubNavButton({\n mode = 'auth',\n status = 'unauthed',\n login,\n avatarUrl,\n signInHref,\n profileHref,\n signOutAction,\n orgHref,\n defaultOpen,\n}: GitHubNavButtonProps) {\n // L1 mode: a plain GitHub→org link (no auth).\n if (mode === 'link') {\n return (\n <a\n href={orgHref}\n target=\"_blank\"\n rel=\"noreferrer\"\n className={SHELL}\n aria-label=\"dataimago on GitHub\"\n >\n <GithubMark />\n </a>\n );\n }\n\n // Signed out: a GET link that starts the OAuth flow.\n if (status !== 'authed') {\n return (\n <a href={signInHref} className={SHELL} aria-label=\"Sign in with GitHub\">\n <GithubMark />\n <LoginGlyph />\n </a>\n );\n }\n\n // Signed in: the GitHub mark + the user's avatar, with a native-disclosure menu.\n return (\n <details className=\"relative\" open={defaultOpen}>\n <summary\n className={`${SHELL} cursor-pointer list-none [&::-webkit-details-marker]:hidden`}\n aria-label={`GitHub account — signed in as ${login ?? 'your account'}`}\n >\n <GithubMark />\n {avatarUrl ? (\n <img\n src={avatarUrl}\n alt=\"\"\n className=\"h-7 w-7 rounded-full border border-stone-200\"\n width={28}\n height={28}\n />\n ) : (\n <span className=\"text-sm font-medium\">@{login}</span>\n )}\n </summary>\n <div className=\"absolute right-0 z-50 mt-2 w-60 rounded-lg border border-stone-200 bg-stone-50 p-2 shadow-lg\">\n <p className=\"px-2 py-1 text-sm text-stone-700\">\n Signed in as <span className=\"font-medium text-stone-900\">@{login}</span>\n </p>\n {profileHref && (\n <a href={profileHref} target=\"_blank\" rel=\"noreferrer\" className={MENU_ITEM}>\n View your GitHub profile\n </a>\n )}\n {signOutAction && (\n <form method=\"POST\" action={signOutAction}>\n <button type=\"submit\" className={MENU_ITEM}>\n Sign out\n </button>\n </form>\n )}\n </div>\n </details>\n );\n}\n","'use client';\n\nimport Link from 'next/link';\nimport { Logo } from '@dataimago/ui';\nimport type { SiteFooterProps } from './types';\n\n/**\n * Site footer — the Level-1 hub footer: dark surface, dataimago wordmark + a\n * trimmed nav column grid.\n *\n * The wordmark is the `dataimago` brand mark via `<Logo>` (font-free, in a light\n * `currentColor` on the dark surface) — no backplate, no hardcoded \".ai\" span.\n *\n * Extracted from apps/hub into @dataimago/hub-chrome during iteration-3-B.2\n * (2026-05-11). The defaults drop the former \"Legacy\" column + the critical-theory\n * closing statement (the philosophical-basis editorial lives on the PhilosophyFooter,\n * which is Level-1-only). Level-2 verticals use `MinimalFooter` instead.\n */\n\nconst DEFAULT_TAGLINE = 'A living AI-native application ecosystem.';\n\nconst DEFAULT_COLUMNS = [\n {\n heading: 'Platform',\n links: [\n { href: '/onboard', label: 'Begin a project' },\n { href: '/ecosystem', label: 'Ecosystem' },\n { href: '/philosophy', label: 'Philosophy' },\n ],\n },\n {\n heading: 'Framework',\n links: [\n {\n href: 'https://github.com/dataimago/dataimago-design',\n label: 'dataimago-design',\n external: true,\n },\n {\n href: 'https://github.com/dataimago/dataimago-rpkg',\n label: 'dataimago-rpkg',\n external: true,\n },\n {\n href: 'https://github.com/dataimago/dataimago-ai',\n label: 'dataimago-ai',\n external: true,\n },\n ],\n },\n];\n\nexport function SiteFooter({\n tagline = DEFAULT_TAGLINE,\n columns = DEFAULT_COLUMNS,\n closingStatement,\n}: SiteFooterProps) {\n return (\n <footer\n className=\"border-t border-stone-800 bg-stone-900 text-stone-400\"\n data-bs-theme=\"dark\"\n >\n <div className=\"mx-auto max-w-6xl px-6 py-12\">\n <div className=\"grid gap-8 md:grid-cols-4\">\n <div>\n <Link\n href=\"/\"\n className=\"inline-flex items-center text-stone-100 transition hover:opacity-80\"\n aria-label=\"dataimago\"\n >\n <Logo\n name=\"dataimago\"\n variant=\"PATH\"\n aria-hidden\n className=\"[&_svg]:h-7 [&_svg]:w-auto\"\n />\n </Link>\n <p className=\"mt-3 text-xs text-stone-400\">{tagline}</p>\n </div>\n\n {columns.map((col) => (\n <div key={col.heading}>\n <h4 className=\"font-mono text-xs uppercase tracking-wider text-accent-300\">\n {col.heading}\n </h4>\n <ul className=\"mt-3 space-y-2 text-sm\">\n {col.links.map(({ href, label, external }) => (\n <li key={label}>\n {!href ? (\n label\n ) : external ? (\n <a\n href={href}\n className=\"hover:text-paper-100\"\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {label}\n </a>\n ) : (\n <Link href={href} className=\"hover:text-paper-100\">\n {label}\n </Link>\n )}\n </li>\n ))}\n </ul>\n </div>\n ))}\n </div>\n\n {closingStatement ? (\n <div className=\"mt-12 border-t border-stone-800 pt-6 text-xs text-stone-400\">\n <p>{closingStatement}</p>\n </div>\n ) : null}\n </div>\n </footer>\n );\n}\n","'use client';\n\nimport Link from 'next/link';\nimport { Logo } from '@dataimago/ui';\nimport type { MinimalFooterProps } from './types';\n\n/**\n * MinimalFooter — the Level-2 vertical footer.\n *\n * A Level-2 vertical (dissertation.ai, future rpkg.ai / sgpc.ai) is \"an embodiment\n * of dataimago\": the footer shows the parent `dataimago` wordmark linking UP to\n * dataimago.ai, the embodiment line, a compact links row, and a copyright line.\n * No nav columns, no philosophy — those belong to the Level-1 hub (SiteFooter +\n * PhilosophyFooter). See dataimago-design wiki/patterns/hub-hero-anatomy.\n */\n\nconst DEFAULT_BRAND_HREF = 'https://dataimago.ai';\nconst DEFAULT_EMBODIMENT = 'An embodiment of dataimago';\n\nexport function MinimalFooter({\n brandHref = DEFAULT_BRAND_HREF,\n embodimentLabel = DEFAULT_EMBODIMENT,\n links = [],\n copyright,\n}: MinimalFooterProps) {\n return (\n <footer\n className=\"border-t border-stone-800 bg-stone-900 text-stone-400\"\n data-bs-theme=\"dark\"\n >\n <div className=\"mx-auto flex max-w-6xl flex-col items-center gap-4 px-6 py-10 text-center\">\n <a\n href={brandHref}\n className=\"inline-flex flex-col items-center gap-2 text-stone-100 transition hover:opacity-80\"\n target=\"_blank\"\n rel=\"noreferrer\"\n aria-label={`${embodimentLabel} — visit dataimago.ai`}\n >\n <Logo\n name=\"dataimago\"\n variant=\"PATH\"\n aria-hidden\n className=\"[&_svg]:h-7 [&_svg]:w-auto\"\n />\n <span className=\"text-sm text-stone-400\">{embodimentLabel}</span>\n </a>\n\n {links.length > 0 ? (\n <nav\n className=\"flex flex-wrap items-center justify-center gap-x-6 gap-y-2 text-sm\"\n aria-label=\"Footer\"\n >\n {links.map(({ href, label, external }) =>\n !href ? (\n <span key={label} className=\"text-stone-400\">\n {label}\n </span>\n ) : external ? (\n <a\n key={label}\n href={href}\n className=\"text-stone-300 hover:text-paper-100\"\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {label}\n </a>\n ) : (\n <Link key={label} href={href} className=\"text-stone-300 hover:text-paper-100\">\n {label}\n </Link>\n )\n )}\n </nav>\n ) : null}\n\n {copyright ? <p className=\"text-xs text-stone-400\">{copyright}</p> : null}\n </div>\n </footer>\n );\n}\n","'use client';\n\nimport type { PhilosophyFooterProps } from './types';\n\n/**\n * Philosophy footer — the platform's moral weight, rendered as a dark\n * editorial section with three belief/mission/vision pairs and a pull-quote.\n *\n * Iteration-1 visual identity (Phase B.3, 2026-05-06):\n * Dark-surface chrome with text-accent-500 eyebrows, font-display body, and\n * the Baudrillard blockquote with border-copper-500 (preserved-decorative-\n * copper per iteration-1 §5.2 governance).\n *\n * Iteration-2 role-shift (2026-05-07): text-accent-500 eyebrows resolve to\n * sky-blue accent-300 (#3498DB) on this dark surface via mode-aware mapping —\n * 5.41:1 on stone-900 (was 3.23:1 AA-large only with copper). The\n * border-copper-500 blockquote frame survives untouched. \"Two warmths\"\n * coexist: cool sky-blue on editorial eyebrows, warm copper on the\n * philosophical-quote frame.\n *\n * Extracted from apps/hub into @dataimago/hub-chrome during iteration-3-B.2\n * (2026-05-11). The `pairs`, `quote`, and `closingStatement` props allow\n * per-vertical adaptation; all props default to the Level-1 hub content.\n */\n\nconst DEFAULT_PAIRS = [\n {\n eyebrow: 'our belief',\n body: 'AI can enable virtuous cycles of improvement in the world.',\n },\n {\n eyebrow: 'our mission',\n body: 'The emancipation of humanity through ai super-alignment.',\n },\n {\n eyebrow: 'our vision',\n body: 'Super-alignment embeds ai in culture, not culture in ai.',\n },\n];\n\nconst DEFAULT_QUOTE = {\n text: `If men create intelligent machines, or fantasize about them, it is either because they secretly despair of their own intelligence or because they are in danger of succumbing to the weight of a monstrous and useless intelligence which they seek to exorcize by transferring it to machines, where they can play with it and make fun of it. By entrusting this burdensome intelligence to machines we are released from any responsibility to knowledge.`,\n attribution: 'Jean Baudrillard',\n work: 'Xerox and Infinity',\n year: 1988,\n};\n\nconst DEFAULT_CLOSING =\n 'dataimago is the structural answer to this critique. Every architectural choice — R as source of truth, editorial authority with the domain expert, the non-destructive retrofit principle, the ecosystem-as-commons — refuses to release the scholar from responsibility to their own knowledge. The AI serves the culture; the culture governs the AI.';\n\nexport function PhilosophyFooter({\n pairs = DEFAULT_PAIRS,\n quote = DEFAULT_QUOTE,\n closingStatement = DEFAULT_CLOSING,\n}: PhilosophyFooterProps) {\n return (\n <section\n aria-labelledby=\"philosophy-heading\"\n className=\"border-t border-stone-200 bg-stone-900 py-20 text-paper-100 sm:py-28\"\n >\n <div className=\"mx-auto max-w-6xl px-6\">\n <div className=\"grid gap-12 lg:grid-cols-3\">\n {pairs.map((pair, i) => (\n <div key={i}>\n <p className=\"font-mono text-xs uppercase tracking-wider text-accent-500\">\n {pair.eyebrow}\n </p>\n {i === 0 ? (\n <h3\n id=\"philosophy-heading\"\n className=\"mt-2 font-display text-xl text-paper-100\"\n >\n {pair.body}\n </h3>\n ) : (\n <p className=\"mt-2 font-display text-xl text-paper-100\">\n {pair.body}\n </p>\n )}\n </div>\n ))}\n </div>\n\n {/* Pull-quote — border-copper-500 PRESERVED: decorative-emphasis\n blockquote frame per iteration-1 §5.2 preserved-decorative-copper\n governance. */}\n <blockquote className=\"mt-16 max-w-prose-wide border-l-2 border-copper-500 pl-6 font-display italic text-paper-100\">\n <p className=\"text-base leading-relaxed\">{quote.text}</p>\n <footer className=\"mt-4 text-sm not-italic text-stone-400\">\n — {quote.attribution}, <cite>{quote.work}</cite> ({quote.year})\n </footer>\n </blockquote>\n\n <p className=\"mt-8 max-w-prose-wide text-sm text-stone-400\">\n {closingStatement}\n </p>\n </div>\n </section>\n );\n}\n"],"mappings":"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","names":["Link","import_jsx_runtime","import_link","import_ui","import_jsx_runtime","Link","import_link","import_ui","import_jsx_runtime","Link","import_jsx_runtime"]}
package/dist/index.d.cts CHANGED
@@ -82,12 +82,14 @@ interface PlatformNavProps {
82
82
  href: string;
83
83
  })[];
84
84
  /**
85
- * Primary call-to-action button.
86
- * Defaults to { href: '/onboard', label: 'Begin' }.
85
+ * Primary call-to-action button. Defaults to { href: '/onboard', label:
86
+ * 'Begin' }. Pass `null` to omit it entirely — for a nav that shows just the
87
+ * unified minimum (links + the GitHub `rightSlot`), with the primary CTA living
88
+ * elsewhere (e.g. the hero).
87
89
  */
88
- cta?: NavLink & {
90
+ cta?: (NavLink & {
89
91
  href: string;
90
- };
92
+ }) | null;
91
93
  /**
92
94
  * An app-supplied control rendered at the FAR RIGHT of the nav cluster, after
93
95
  * the cta — the slot the unified GitHub account button occupies. A `ReactNode`
package/dist/index.d.ts CHANGED
@@ -82,12 +82,14 @@ interface PlatformNavProps {
82
82
  href: string;
83
83
  })[];
84
84
  /**
85
- * Primary call-to-action button.
86
- * Defaults to { href: '/onboard', label: 'Begin' }.
85
+ * Primary call-to-action button. Defaults to { href: '/onboard', label:
86
+ * 'Begin' }. Pass `null` to omit it entirely — for a nav that shows just the
87
+ * unified minimum (links + the GitHub `rightSlot`), with the primary CTA living
88
+ * elsewhere (e.g. the hero).
87
89
  */
88
- cta?: NavLink & {
90
+ cta?: (NavLink & {
89
91
  href: string;
90
- };
92
+ }) | null;
91
93
  /**
92
94
  * An app-supplied control rendered at the FAR RIGHT of the nav cluster, after
93
95
  * the cta — the slot the unified GitHub account button occupies. A `ReactNode`
package/dist/index.js CHANGED
@@ -55,7 +55,7 @@ function PlatformNav({
55
55
  href
56
56
  ) : /* @__PURE__ */ jsx(Link, { href, className: "btn-ghost hidden sm:inline-flex", children: label }, href)
57
57
  ),
58
- /* @__PURE__ */ jsx(Link, { href: cta.href, className: "btn-primary", children: cta.label }),
58
+ cta && /* @__PURE__ */ jsx(Link, { href: cta.href, className: "btn-primary", children: cta.label }),
59
59
  rightSlot
60
60
  ] })
61
61
  ]
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/PlatformNav.tsx","../src/GitHubNavButton.tsx","../src/SiteFooter.tsx","../src/MinimalFooter.tsx","../src/PhilosophyFooter.tsx"],"sourcesContent":["'use client';\n\nimport Link from 'next/link';\nimport { Logo, NavbarLogo } from '@dataimago/ui';\nimport type { PlatformNavProps } from './types';\n\n/**\n * Platform navigation — sticky header with the property's brand mark + nav cluster.\n *\n * The property mark is rendered by height (so any aspect fits the nav). By default\n * it's the static `@dataimago/brand` wordmark via `<Logo>` (font-free, IoU-locked,\n * `currentColor`). When `navbarMark` is set it becomes the ANIMATED `<NavbarLogo>`\n * (the a/i assemble toggle for L2 marks, lift+wash for L1) — falling back to the\n * static `<Logo brandMark>` otherwise, so pre-navbar consumers are unaffected.\n *\n * `aiMonogram` adds the dataimago `ai-monogram` icon button to the LEFT of the\n * property mark (a 48px touch target; lift+washes to the brand-mark red on hover).\n *\n * Extracted from apps/hub into @dataimago/hub-chrome during iteration-3-B.2\n * (2026-05-11); `navbarMark`/`aiMonogram` added in iteration-4 (the navbar logo\n * system). All props default to the Level-1 hub configuration.\n */\n\nconst DEFAULT_LINKS = [\n { href: '/ecosystem', label: 'Ecosystem' },\n { href: '/philosophy', label: 'Philosophy' },\n];\n\nconst DEFAULT_CTA = { href: '/onboard', label: 'Begin' };\n\n/** Height-based sizing for the property mark (the navbar norm — ~30% larger letters). */\nconst MARK_CLASS = '[&_svg]:h-7 [&_svg]:w-auto sm:[&_svg]:h-8';\n\n/** The optional ai-monogram icon button — a 48px touch target (ready-to-hand floor). */\nconst AI_BUTTON_CLASS =\n 'inline-flex min-h-[48px] min-w-[48px] items-center justify-center rounded-xl ' +\n 'border border-stone-200 bg-stone-50 text-stone-900 transition hover:bg-stone-100';\n\nexport function PlatformNav({\n brandMark = 'dataimago_ai_OVERLAP',\n navbarMark,\n aiMonogram,\n brandLabel = 'dataimago.ai home',\n links = DEFAULT_LINKS,\n cta = DEFAULT_CTA,\n rightSlot,\n navLabel = 'Primary',\n homeHref = '/',\n}: PlatformNavProps) {\n const propertyMark = navbarMark ? (\n <NavbarLogo name={navbarMark} aria-hidden className={MARK_CLASS} />\n ) : (\n <Logo name={brandMark} variant=\"PATH\" aria-hidden className={MARK_CLASS} />\n );\n\n const aiHref = typeof aiMonogram === 'object' ? aiMonogram.href : undefined;\n const aiLabel =\n typeof aiMonogram === 'object' ? (aiMonogram.label ?? 'dataimago') : 'dataimago';\n\n return (\n <header className=\"sticky top-0 z-40 border-b border-stone-200 bg-stone-100/95 backdrop-blur-sm\">\n <nav\n className=\"mx-auto flex max-w-7xl items-center justify-between px-6 py-4\"\n aria-label={navLabel}\n >\n <div className=\"flex items-center gap-2 sm:gap-3\">\n {aiMonogram &&\n (aiHref ? (\n <Link href={aiHref} aria-label={aiLabel} className={AI_BUTTON_CLASS}>\n <NavbarLogo name=\"ai-monogram\" aria-hidden className=\"[&_svg]:h-6 [&_svg]:w-auto\" />\n </Link>\n ) : (\n <span className={AI_BUTTON_CLASS} aria-hidden>\n <NavbarLogo name=\"ai-monogram\" aria-hidden className=\"[&_svg]:h-6 [&_svg]:w-auto\" />\n </span>\n ))}\n <Link\n href={homeHref}\n className=\"inline-flex min-h-[48px] items-center text-stone-900 transition hover:opacity-80\"\n aria-label={brandLabel}\n >\n {propertyMark}\n </Link>\n </div>\n\n <div className=\"flex items-center gap-2 sm:gap-6\">\n {links.map(({ href, label, external }) =>\n external ? (\n <a\n key={href}\n href={href}\n className=\"btn-ghost hidden sm:inline-flex\"\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {label}\n </a>\n ) : (\n <Link key={href} href={href} className=\"btn-ghost hidden sm:inline-flex\">\n {label}\n </Link>\n )\n )}\n <Link href={cta.href} className=\"btn-primary\">\n {cta.label}\n </Link>\n {rightSlot}\n </div>\n </nav>\n </header>\n );\n}\n","import type { GitHubNavButtonProps } from './types';\n\n/**\n * The unified GitHub account control for the nav's right slot — the canonical\n * login affordance + login-state indicator shared across every L1/L2 dataimago\n * app (rendered into `PlatformNav`'s `rightSlot`).\n *\n * Fully presentational and **stateless** — it reads no auth itself; the consumer\n * feeds it. Uses a native `<details>` disclosure for the signed-in menu, so it\n * needs no client JS and works whether rendered on the server (a server parent\n * injecting the avatar) or the client.\n *\n * - `mode=\"auth\"` (default): the login-state indicator.\n * - `status=\"unauthed\"` → a GET link to `signInHref` (start OAuth) showing the\n * GitHub mark + a login glyph.\n * - `status=\"authed\"` → the GitHub mark + the user's avatar, opening a menu\n * (profile link + a POST sign-out form to `signOutAction`).\n * - `mode=\"link\"`: a plain GitHub→`orgHref` link (L1, which has no auth).\n *\n * Icons are inlined (the GitHub mark + a lucide-style \"log-in\" glyph) to keep the\n * shared package free of an icon-library peer dependency.\n */\n\n// The 48px touch-target floor (the ready-to-hand dignity gate); colours resolve\n// from the consuming app's dataimago palette. The global `*:focus-visible` rule\n// supplies the focus ring.\nconst SHELL =\n 'inline-flex min-h-[48px] items-center gap-2 rounded-xl border border-stone-200 ' +\n 'bg-stone-50 px-3 text-stone-900 transition hover:bg-stone-100';\n\nconst MENU_ITEM =\n 'flex min-h-[48px] w-full items-center rounded px-2 text-left text-sm ' +\n 'text-stone-900 transition hover:bg-stone-100';\n\nfunction GithubMark() {\n return (\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" className=\"h-5 w-5 shrink-0\" fill=\"currentColor\">\n <path d=\"M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23a11.5 11.5 0 0 1 3.003-.404c1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222 0 1.606-.014 2.898-.014 3.293 0 .322.216.694.825.576C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12\" />\n </svg>\n );\n}\n\nfunction LoginGlyph() {\n // lucide \"log-in\" (ISC), inlined.\n return (\n <svg\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n className=\"h-5 w-5 shrink-0\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M15 3h4a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-4\" />\n <polyline points=\"10 17 15 12 10 7\" />\n <line x1=\"15\" x2=\"3\" y1=\"12\" y2=\"12\" />\n </svg>\n );\n}\n\nexport function GitHubNavButton({\n mode = 'auth',\n status = 'unauthed',\n login,\n avatarUrl,\n signInHref,\n profileHref,\n signOutAction,\n orgHref,\n defaultOpen,\n}: GitHubNavButtonProps) {\n // L1 mode: a plain GitHub→org link (no auth).\n if (mode === 'link') {\n return (\n <a\n href={orgHref}\n target=\"_blank\"\n rel=\"noreferrer\"\n className={SHELL}\n aria-label=\"dataimago on GitHub\"\n >\n <GithubMark />\n </a>\n );\n }\n\n // Signed out: a GET link that starts the OAuth flow.\n if (status !== 'authed') {\n return (\n <a href={signInHref} className={SHELL} aria-label=\"Sign in with GitHub\">\n <GithubMark />\n <LoginGlyph />\n </a>\n );\n }\n\n // Signed in: the GitHub mark + the user's avatar, with a native-disclosure menu.\n return (\n <details className=\"relative\" open={defaultOpen}>\n <summary\n className={`${SHELL} cursor-pointer list-none [&::-webkit-details-marker]:hidden`}\n aria-label={`GitHub account — signed in as ${login ?? 'your account'}`}\n >\n <GithubMark />\n {avatarUrl ? (\n <img\n src={avatarUrl}\n alt=\"\"\n className=\"h-7 w-7 rounded-full border border-stone-200\"\n width={28}\n height={28}\n />\n ) : (\n <span className=\"text-sm font-medium\">@{login}</span>\n )}\n </summary>\n <div className=\"absolute right-0 z-50 mt-2 w-60 rounded-lg border border-stone-200 bg-stone-50 p-2 shadow-lg\">\n <p className=\"px-2 py-1 text-sm text-stone-700\">\n Signed in as <span className=\"font-medium text-stone-900\">@{login}</span>\n </p>\n {profileHref && (\n <a href={profileHref} target=\"_blank\" rel=\"noreferrer\" className={MENU_ITEM}>\n View your GitHub profile\n </a>\n )}\n {signOutAction && (\n <form method=\"POST\" action={signOutAction}>\n <button type=\"submit\" className={MENU_ITEM}>\n Sign out\n </button>\n </form>\n )}\n </div>\n </details>\n );\n}\n","'use client';\n\nimport Link from 'next/link';\nimport { Logo } from '@dataimago/ui';\nimport type { SiteFooterProps } from './types';\n\n/**\n * Site footer — the Level-1 hub footer: dark surface, dataimago wordmark + a\n * trimmed nav column grid.\n *\n * The wordmark is the `dataimago` brand mark via `<Logo>` (font-free, in a light\n * `currentColor` on the dark surface) — no backplate, no hardcoded \".ai\" span.\n *\n * Extracted from apps/hub into @dataimago/hub-chrome during iteration-3-B.2\n * (2026-05-11). The defaults drop the former \"Legacy\" column + the critical-theory\n * closing statement (the philosophical-basis editorial lives on the PhilosophyFooter,\n * which is Level-1-only). Level-2 verticals use `MinimalFooter` instead.\n */\n\nconst DEFAULT_TAGLINE = 'A living AI-native application ecosystem.';\n\nconst DEFAULT_COLUMNS = [\n {\n heading: 'Platform',\n links: [\n { href: '/onboard', label: 'Begin a project' },\n { href: '/ecosystem', label: 'Ecosystem' },\n { href: '/philosophy', label: 'Philosophy' },\n ],\n },\n {\n heading: 'Framework',\n links: [\n {\n href: 'https://github.com/dataimago/dataimago-design',\n label: 'dataimago-design',\n external: true,\n },\n {\n href: 'https://github.com/dataimago/dataimago-rpkg',\n label: 'dataimago-rpkg',\n external: true,\n },\n {\n href: 'https://github.com/dataimago/dataimago-ai',\n label: 'dataimago-ai',\n external: true,\n },\n ],\n },\n];\n\nexport function SiteFooter({\n tagline = DEFAULT_TAGLINE,\n columns = DEFAULT_COLUMNS,\n closingStatement,\n}: SiteFooterProps) {\n return (\n <footer\n className=\"border-t border-stone-800 bg-stone-900 text-stone-400\"\n data-bs-theme=\"dark\"\n >\n <div className=\"mx-auto max-w-6xl px-6 py-12\">\n <div className=\"grid gap-8 md:grid-cols-4\">\n <div>\n <Link\n href=\"/\"\n className=\"inline-flex items-center text-stone-100 transition hover:opacity-80\"\n aria-label=\"dataimago\"\n >\n <Logo\n name=\"dataimago\"\n variant=\"PATH\"\n aria-hidden\n className=\"[&_svg]:h-7 [&_svg]:w-auto\"\n />\n </Link>\n <p className=\"mt-3 text-xs text-stone-400\">{tagline}</p>\n </div>\n\n {columns.map((col) => (\n <div key={col.heading}>\n <h4 className=\"font-mono text-xs uppercase tracking-wider text-accent-300\">\n {col.heading}\n </h4>\n <ul className=\"mt-3 space-y-2 text-sm\">\n {col.links.map(({ href, label, external }) => (\n <li key={label}>\n {!href ? (\n label\n ) : external ? (\n <a\n href={href}\n className=\"hover:text-paper-100\"\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {label}\n </a>\n ) : (\n <Link href={href} className=\"hover:text-paper-100\">\n {label}\n </Link>\n )}\n </li>\n ))}\n </ul>\n </div>\n ))}\n </div>\n\n {closingStatement ? (\n <div className=\"mt-12 border-t border-stone-800 pt-6 text-xs text-stone-400\">\n <p>{closingStatement}</p>\n </div>\n ) : null}\n </div>\n </footer>\n );\n}\n","'use client';\n\nimport Link from 'next/link';\nimport { Logo } from '@dataimago/ui';\nimport type { MinimalFooterProps } from './types';\n\n/**\n * MinimalFooter — the Level-2 vertical footer.\n *\n * A Level-2 vertical (dissertation.ai, future rpkg.ai / sgpc.ai) is \"an embodiment\n * of dataimago\": the footer shows the parent `dataimago` wordmark linking UP to\n * dataimago.ai, the embodiment line, a compact links row, and a copyright line.\n * No nav columns, no philosophy — those belong to the Level-1 hub (SiteFooter +\n * PhilosophyFooter). See dataimago-design wiki/patterns/hub-hero-anatomy.\n */\n\nconst DEFAULT_BRAND_HREF = 'https://dataimago.ai';\nconst DEFAULT_EMBODIMENT = 'An embodiment of dataimago';\n\nexport function MinimalFooter({\n brandHref = DEFAULT_BRAND_HREF,\n embodimentLabel = DEFAULT_EMBODIMENT,\n links = [],\n copyright,\n}: MinimalFooterProps) {\n return (\n <footer\n className=\"border-t border-stone-800 bg-stone-900 text-stone-400\"\n data-bs-theme=\"dark\"\n >\n <div className=\"mx-auto flex max-w-6xl flex-col items-center gap-4 px-6 py-10 text-center\">\n <a\n href={brandHref}\n className=\"inline-flex flex-col items-center gap-2 text-stone-100 transition hover:opacity-80\"\n target=\"_blank\"\n rel=\"noreferrer\"\n aria-label={`${embodimentLabel} — visit dataimago.ai`}\n >\n <Logo\n name=\"dataimago\"\n variant=\"PATH\"\n aria-hidden\n className=\"[&_svg]:h-7 [&_svg]:w-auto\"\n />\n <span className=\"text-sm text-stone-400\">{embodimentLabel}</span>\n </a>\n\n {links.length > 0 ? (\n <nav\n className=\"flex flex-wrap items-center justify-center gap-x-6 gap-y-2 text-sm\"\n aria-label=\"Footer\"\n >\n {links.map(({ href, label, external }) =>\n !href ? (\n <span key={label} className=\"text-stone-400\">\n {label}\n </span>\n ) : external ? (\n <a\n key={label}\n href={href}\n className=\"text-stone-300 hover:text-paper-100\"\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {label}\n </a>\n ) : (\n <Link key={label} href={href} className=\"text-stone-300 hover:text-paper-100\">\n {label}\n </Link>\n )\n )}\n </nav>\n ) : null}\n\n {copyright ? <p className=\"text-xs text-stone-400\">{copyright}</p> : null}\n </div>\n </footer>\n );\n}\n","'use client';\n\nimport type { PhilosophyFooterProps } from './types';\n\n/**\n * Philosophy footer — the platform's moral weight, rendered as a dark\n * editorial section with three belief/mission/vision pairs and a pull-quote.\n *\n * Iteration-1 visual identity (Phase B.3, 2026-05-06):\n * Dark-surface chrome with text-accent-500 eyebrows, font-display body, and\n * the Baudrillard blockquote with border-copper-500 (preserved-decorative-\n * copper per iteration-1 §5.2 governance).\n *\n * Iteration-2 role-shift (2026-05-07): text-accent-500 eyebrows resolve to\n * sky-blue accent-300 (#3498DB) on this dark surface via mode-aware mapping —\n * 5.41:1 on stone-900 (was 3.23:1 AA-large only with copper). The\n * border-copper-500 blockquote frame survives untouched. \"Two warmths\"\n * coexist: cool sky-blue on editorial eyebrows, warm copper on the\n * philosophical-quote frame.\n *\n * Extracted from apps/hub into @dataimago/hub-chrome during iteration-3-B.2\n * (2026-05-11). The `pairs`, `quote`, and `closingStatement` props allow\n * per-vertical adaptation; all props default to the Level-1 hub content.\n */\n\nconst DEFAULT_PAIRS = [\n {\n eyebrow: 'our belief',\n body: 'AI can enable virtuous cycles of improvement in the world.',\n },\n {\n eyebrow: 'our mission',\n body: 'The emancipation of humanity through ai super-alignment.',\n },\n {\n eyebrow: 'our vision',\n body: 'Super-alignment embeds ai in culture, not culture in ai.',\n },\n];\n\nconst DEFAULT_QUOTE = {\n text: `If men create intelligent machines, or fantasize about them, it is either because they secretly despair of their own intelligence or because they are in danger of succumbing to the weight of a monstrous and useless intelligence which they seek to exorcize by transferring it to machines, where they can play with it and make fun of it. By entrusting this burdensome intelligence to machines we are released from any responsibility to knowledge.`,\n attribution: 'Jean Baudrillard',\n work: 'Xerox and Infinity',\n year: 1988,\n};\n\nconst DEFAULT_CLOSING =\n 'dataimago is the structural answer to this critique. Every architectural choice — R as source of truth, editorial authority with the domain expert, the non-destructive retrofit principle, the ecosystem-as-commons — refuses to release the scholar from responsibility to their own knowledge. The AI serves the culture; the culture governs the AI.';\n\nexport function PhilosophyFooter({\n pairs = DEFAULT_PAIRS,\n quote = DEFAULT_QUOTE,\n closingStatement = DEFAULT_CLOSING,\n}: PhilosophyFooterProps) {\n return (\n <section\n aria-labelledby=\"philosophy-heading\"\n className=\"border-t border-stone-200 bg-stone-900 py-20 text-paper-100 sm:py-28\"\n >\n <div className=\"mx-auto max-w-6xl px-6\">\n <div className=\"grid gap-12 lg:grid-cols-3\">\n {pairs.map((pair, i) => (\n <div key={i}>\n <p className=\"font-mono text-xs uppercase tracking-wider text-accent-500\">\n {pair.eyebrow}\n </p>\n {i === 0 ? (\n <h3\n id=\"philosophy-heading\"\n className=\"mt-2 font-display text-xl text-paper-100\"\n >\n {pair.body}\n </h3>\n ) : (\n <p className=\"mt-2 font-display text-xl text-paper-100\">\n {pair.body}\n </p>\n )}\n </div>\n ))}\n </div>\n\n {/* Pull-quote — border-copper-500 PRESERVED: decorative-emphasis\n blockquote frame per iteration-1 §5.2 preserved-decorative-copper\n governance. */}\n <blockquote className=\"mt-16 max-w-prose-wide border-l-2 border-copper-500 pl-6 font-display italic text-paper-100\">\n <p className=\"text-base leading-relaxed\">{quote.text}</p>\n <footer className=\"mt-4 text-sm not-italic text-stone-400\">\n — {quote.attribution}, <cite>{quote.work}</cite> ({quote.year})\n </footer>\n </blockquote>\n\n <p className=\"mt-8 max-w-prose-wide text-sm text-stone-400\">\n {closingStatement}\n </p>\n </div>\n </section>\n );\n}\n"],"mappings":";AAEA,OAAO,UAAU;AACjB,SAAS,MAAM,kBAAkB;AA+C7B,cAeI,YAfJ;AA3BJ,IAAM,gBAAgB;AAAA,EACpB,EAAE,MAAM,cAAc,OAAO,YAAY;AAAA,EACzC,EAAE,MAAM,eAAe,OAAO,aAAa;AAC7C;AAEA,IAAM,cAAc,EAAE,MAAM,YAAY,OAAO,QAAQ;AAGvD,IAAM,aAAa;AAGnB,IAAM,kBACJ;AAGK,SAAS,YAAY;AAAA,EAC1B,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb,QAAQ;AAAA,EACR,MAAM;AAAA,EACN;AAAA,EACA,WAAW;AAAA,EACX,WAAW;AACb,GAAqB;AACnB,QAAM,eAAe,aACnB,oBAAC,cAAW,MAAM,YAAY,eAAW,MAAC,WAAW,YAAY,IAEjE,oBAAC,QAAK,MAAM,WAAW,SAAQ,QAAO,eAAW,MAAC,WAAW,YAAY;AAG3E,QAAM,SAAS,OAAO,eAAe,WAAW,WAAW,OAAO;AAClE,QAAM,UACJ,OAAO,eAAe,WAAY,WAAW,SAAS,cAAe;AAEvE,SACE,oBAAC,YAAO,WAAU,gFAChB;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,cAAY;AAAA,MAEZ;AAAA,6BAAC,SAAI,WAAU,oCACZ;AAAA,yBACE,SACC,oBAAC,QAAK,MAAM,QAAQ,cAAY,SAAS,WAAW,iBAClD,8BAAC,cAAW,MAAK,eAAc,eAAW,MAAC,WAAU,8BAA6B,GACpF,IAEA,oBAAC,UAAK,WAAW,iBAAiB,eAAW,MAC3C,8BAAC,cAAW,MAAK,eAAc,eAAW,MAAC,WAAU,8BAA6B,GACpF;AAAA,UAEJ;AAAA,YAAC;AAAA;AAAA,cACC,MAAM;AAAA,cACN,WAAU;AAAA,cACV,cAAY;AAAA,cAEX;AAAA;AAAA,UACH;AAAA,WACF;AAAA,QAEA,qBAAC,SAAI,WAAU,oCACZ;AAAA,gBAAM;AAAA,YAAI,CAAC,EAAE,MAAM,OAAO,SAAS,MAClC,WACE;AAAA,cAAC;AAAA;AAAA,gBAEC;AAAA,gBACA,WAAU;AAAA,gBACV,QAAO;AAAA,gBACP,KAAI;AAAA,gBAEH;AAAA;AAAA,cANI;AAAA,YAOP,IAEA,oBAAC,QAAgB,MAAY,WAAU,mCACpC,mBADQ,IAEX;AAAA,UAEJ;AAAA,UACA,oBAAC,QAAK,MAAM,IAAI,MAAM,WAAU,eAC7B,cAAI,OACP;AAAA,UACC;AAAA,WACH;AAAA;AAAA;AAAA,EACF,GACF;AAEJ;;;AC1EM,gBAAAA,MAQF,QAAAC,aARE;AAXN,IAAM,QACJ;AAGF,IAAM,YACJ;AAGF,SAAS,aAAa;AACpB,SACE,gBAAAD,KAAC,SAAI,SAAQ,aAAY,eAAY,QAAO,WAAU,oBAAmB,MAAK,gBAC5E,0BAAAA,KAAC,UAAK,GAAE,0uBAAyuB,GACnvB;AAEJ;AAEA,SAAS,aAAa;AAEpB,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,SAAQ;AAAA,MACR,eAAY;AAAA,MACZ,WAAU;AAAA,MACV,MAAK;AAAA,MACL,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,eAAc;AAAA,MACd,gBAAe;AAAA,MAEf;AAAA,wBAAAD,KAAC,UAAK,GAAE,6CAA4C;AAAA,QACpD,gBAAAA,KAAC,cAAS,QAAO,oBAAmB;AAAA,QACpC,gBAAAA,KAAC,UAAK,IAAG,MAAK,IAAG,KAAI,IAAG,MAAK,IAAG,MAAK;AAAA;AAAA;AAAA,EACvC;AAEJ;AAEO,SAAS,gBAAgB;AAAA,EAC9B,OAAO;AAAA,EACP,SAAS;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAyB;AAEvB,MAAI,SAAS,QAAQ;AACnB,WACE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAM;AAAA,QACN,QAAO;AAAA,QACP,KAAI;AAAA,QACJ,WAAW;AAAA,QACX,cAAW;AAAA,QAEX,0BAAAA,KAAC,cAAW;AAAA;AAAA,IACd;AAAA,EAEJ;AAGA,MAAI,WAAW,UAAU;AACvB,WACE,gBAAAC,MAAC,OAAE,MAAM,YAAY,WAAW,OAAO,cAAW,uBAChD;AAAA,sBAAAD,KAAC,cAAW;AAAA,MACZ,gBAAAA,KAAC,cAAW;AAAA,OACd;AAAA,EAEJ;AAGA,SACE,gBAAAC,MAAC,aAAQ,WAAU,YAAW,MAAM,aAClC;AAAA,oBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,GAAG,KAAK;AAAA,QACnB,cAAY,sCAAiC,SAAS,cAAc;AAAA,QAEpE;AAAA,0BAAAD,KAAC,cAAW;AAAA,UACX,YACC,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,KAAK;AAAA,cACL,KAAI;AAAA,cACJ,WAAU;AAAA,cACV,OAAO;AAAA,cACP,QAAQ;AAAA;AAAA,UACV,IAEA,gBAAAC,MAAC,UAAK,WAAU,uBAAsB;AAAA;AAAA,YAAE;AAAA,aAAM;AAAA;AAAA;AAAA,IAElD;AAAA,IACA,gBAAAA,MAAC,SAAI,WAAU,gGACb;AAAA,sBAAAA,MAAC,OAAE,WAAU,oCAAmC;AAAA;AAAA,QACjC,gBAAAA,MAAC,UAAK,WAAU,8BAA6B;AAAA;AAAA,UAAE;AAAA,WAAM;AAAA,SACpE;AAAA,MACC,eACC,gBAAAD,KAAC,OAAE,MAAM,aAAa,QAAO,UAAS,KAAI,cAAa,WAAW,WAAW,sCAE7E;AAAA,MAED,iBACC,gBAAAA,KAAC,UAAK,QAAO,QAAO,QAAQ,eAC1B,0BAAAA,KAAC,YAAO,MAAK,UAAS,WAAW,WAAW,sBAE5C,GACF;AAAA,OAEJ;AAAA,KACF;AAEJ;;;ACvIA,OAAOE,WAAU;AACjB,SAAS,QAAAC,aAAY;AA6DX,SAMI,OAAAC,MANJ,QAAAC,aAAA;AA7CV,IAAM,kBAAkB;AAExB,IAAM,kBAAkB;AAAA,EACtB;AAAA,IACE,SAAS;AAAA,IACT,OAAO;AAAA,MACL,EAAE,MAAM,YAAY,OAAO,kBAAkB;AAAA,MAC7C,EAAE,MAAM,cAAc,OAAO,YAAY;AAAA,MACzC,EAAE,MAAM,eAAe,OAAO,aAAa;AAAA,IAC7C;AAAA,EACF;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,OAAO;AAAA,MACL;AAAA,QACE,MAAM;AAAA,QACN,OAAO;AAAA,QACP,UAAU;AAAA,MACZ;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,OAAO;AAAA,QACP,UAAU;AAAA,MACZ;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,OAAO;AAAA,QACP,UAAU;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,WAAW;AAAA,EACzB,UAAU;AAAA,EACV,UAAU;AAAA,EACV;AACF,GAAoB;AAClB,SACE,gBAAAD;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,iBAAc;AAAA,MAEd,0BAAAC,MAAC,SAAI,WAAU,gCACb;AAAA,wBAAAA,MAAC,SAAI,WAAU,6BACb;AAAA,0BAAAA,MAAC,SACC;AAAA,4BAAAD;AAAA,cAACF;AAAA,cAAA;AAAA,gBACC,MAAK;AAAA,gBACL,WAAU;AAAA,gBACV,cAAW;AAAA,gBAEX,0BAAAE;AAAA,kBAACD;AAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL,SAAQ;AAAA,oBACR,eAAW;AAAA,oBACX,WAAU;AAAA;AAAA,gBACZ;AAAA;AAAA,YACF;AAAA,YACA,gBAAAC,KAAC,OAAE,WAAU,+BAA+B,mBAAQ;AAAA,aACtD;AAAA,UAEC,QAAQ,IAAI,CAAC,QACZ,gBAAAC,MAAC,SACC;AAAA,4BAAAD,KAAC,QAAG,WAAU,8DACX,cAAI,SACP;AAAA,YACA,gBAAAA,KAAC,QAAG,WAAU,0BACX,cAAI,MAAM,IAAI,CAAC,EAAE,MAAM,OAAO,SAAS,MACtC,gBAAAA,KAAC,QACE,WAAC,OACA,QACE,WACF,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC;AAAA,gBACA,WAAU;AAAA,gBACV,QAAO;AAAA,gBACP,KAAI;AAAA,gBAEH;AAAA;AAAA,YACH,IAEA,gBAAAA,KAACF,OAAA,EAAK,MAAY,WAAU,wBACzB,iBACH,KAfK,KAiBT,CACD,GACH;AAAA,eAzBQ,IAAI,OA0Bd,CACD;AAAA,WACH;AAAA,QAEC,mBACC,gBAAAE,KAAC,SAAI,WAAU,+DACb,0BAAAA,KAAC,OAAG,4BAAiB,GACvB,IACE;AAAA,SACN;AAAA;AAAA,EACF;AAEJ;;;ACrHA,OAAOE,WAAU;AACjB,SAAS,QAAAC,aAAY;AA4Bb,SAOE,OAAAC,MAPF,QAAAC,aAAA;AAfR,IAAM,qBAAqB;AAC3B,IAAM,qBAAqB;AAEpB,SAAS,cAAc;AAAA,EAC5B,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,QAAQ,CAAC;AAAA,EACT;AACF,GAAuB;AACrB,SACE,gBAAAD;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,iBAAc;AAAA,MAEd,0BAAAC,MAAC,SAAI,WAAU,6EACb;AAAA,wBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAM;AAAA,YACN,WAAU;AAAA,YACV,QAAO;AAAA,YACP,KAAI;AAAA,YACJ,cAAY,GAAG,eAAe;AAAA,YAE9B;AAAA,8BAAAD;AAAA,gBAACD;AAAA,gBAAA;AAAA,kBACC,MAAK;AAAA,kBACL,SAAQ;AAAA,kBACR,eAAW;AAAA,kBACX,WAAU;AAAA;AAAA,cACZ;AAAA,cACA,gBAAAC,KAAC,UAAK,WAAU,0BAA0B,2BAAgB;AAAA;AAAA;AAAA,QAC5D;AAAA,QAEC,MAAM,SAAS,IACd,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,cAAW;AAAA,YAEV,gBAAM;AAAA,cAAI,CAAC,EAAE,MAAM,OAAO,SAAS,MAClC,CAAC,OACC,gBAAAA,KAAC,UAAiB,WAAU,kBACzB,mBADQ,KAEX,IACE,WACF,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBAEC;AAAA,kBACA,WAAU;AAAA,kBACV,QAAO;AAAA,kBACP,KAAI;AAAA,kBAEH;AAAA;AAAA,gBANI;AAAA,cAOP,IAEA,gBAAAA,KAACF,OAAA,EAAiB,MAAY,WAAU,uCACrC,mBADQ,KAEX;AAAA,YAEJ;AAAA;AAAA,QACF,IACE;AAAA,QAEH,YAAY,gBAAAE,KAAC,OAAE,WAAU,0BAA0B,qBAAU,IAAO;AAAA,SACvE;AAAA;AAAA,EACF;AAEJ;;;ACjBY,SACE,OAAAE,MADF,QAAAC,aAAA;AAtCZ,IAAM,gBAAgB;AAAA,EACpB;AAAA,IACE,SAAS;AAAA,IACT,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,MAAM;AAAA,EACR;AACF;AAEA,IAAM,gBAAgB;AAAA,EACpB,MAAM;AAAA,EACN,aAAa;AAAA,EACb,MAAM;AAAA,EACN,MAAM;AACR;AAEA,IAAM,kBACJ;AAEK,SAAS,iBAAiB;AAAA,EAC/B,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,mBAAmB;AACrB,GAA0B;AACxB,SACE,gBAAAD;AAAA,IAAC;AAAA;AAAA,MACC,mBAAgB;AAAA,MAChB,WAAU;AAAA,MAEV,0BAAAC,MAAC,SAAI,WAAU,0BACb;AAAA,wBAAAD,KAAC,SAAI,WAAU,8BACZ,gBAAM,IAAI,CAAC,MAAM,MAChB,gBAAAC,MAAC,SACC;AAAA,0BAAAD,KAAC,OAAE,WAAU,8DACV,eAAK,SACR;AAAA,UACC,MAAM,IACL,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,IAAG;AAAA,cACH,WAAU;AAAA,cAET,eAAK;AAAA;AAAA,UACR,IAEA,gBAAAA,KAAC,OAAE,WAAU,4CACV,eAAK,MACR;AAAA,aAdM,CAgBV,CACD,GACH;AAAA,QAKA,gBAAAC,MAAC,gBAAW,WAAU,+FACpB;AAAA,0BAAAD,KAAC,OAAE,WAAU,6BAA6B,gBAAM,MAAK;AAAA,UACrD,gBAAAC,MAAC,YAAO,WAAU,0CAAyC;AAAA;AAAA,YACtD,MAAM;AAAA,YAAY;AAAA,YAAE,gBAAAD,KAAC,UAAM,gBAAM,MAAK;AAAA,YAAO;AAAA,YAAG,MAAM;AAAA,YAAK;AAAA,aAChE;AAAA,WACF;AAAA,QAEA,gBAAAA,KAAC,OAAE,WAAU,gDACV,4BACH;AAAA,SACF;AAAA;AAAA,EACF;AAEJ;","names":["jsx","jsxs","Link","Logo","jsx","jsxs","Link","Logo","jsx","jsxs","jsx","jsxs"]}
1
+ {"version":3,"sources":["../src/PlatformNav.tsx","../src/GitHubNavButton.tsx","../src/SiteFooter.tsx","../src/MinimalFooter.tsx","../src/PhilosophyFooter.tsx"],"sourcesContent":["'use client';\n\nimport Link from 'next/link';\nimport { Logo, NavbarLogo } from '@dataimago/ui';\nimport type { PlatformNavProps } from './types';\n\n/**\n * Platform navigation — sticky header with the property's brand mark + nav cluster.\n *\n * The property mark is rendered by height (so any aspect fits the nav). By default\n * it's the static `@dataimago/brand` wordmark via `<Logo>` (font-free, IoU-locked,\n * `currentColor`). When `navbarMark` is set it becomes the ANIMATED `<NavbarLogo>`\n * (the a/i assemble toggle for L2 marks, lift+wash for L1) — falling back to the\n * static `<Logo brandMark>` otherwise, so pre-navbar consumers are unaffected.\n *\n * `aiMonogram` adds the dataimago `ai-monogram` icon button to the LEFT of the\n * property mark (a 48px touch target; lift+washes to the brand-mark red on hover).\n *\n * Extracted from apps/hub into @dataimago/hub-chrome during iteration-3-B.2\n * (2026-05-11); `navbarMark`/`aiMonogram` added in iteration-4 (the navbar logo\n * system). All props default to the Level-1 hub configuration.\n */\n\nconst DEFAULT_LINKS = [\n { href: '/ecosystem', label: 'Ecosystem' },\n { href: '/philosophy', label: 'Philosophy' },\n];\n\nconst DEFAULT_CTA = { href: '/onboard', label: 'Begin' };\n\n/** Height-based sizing for the property mark (the navbar norm — ~30% larger letters). */\nconst MARK_CLASS = '[&_svg]:h-7 [&_svg]:w-auto sm:[&_svg]:h-8';\n\n/** The optional ai-monogram icon button — a 48px touch target (ready-to-hand floor). */\nconst AI_BUTTON_CLASS =\n 'inline-flex min-h-[48px] min-w-[48px] items-center justify-center rounded-xl ' +\n 'border border-stone-200 bg-stone-50 text-stone-900 transition hover:bg-stone-100';\n\nexport function PlatformNav({\n brandMark = 'dataimago_ai_OVERLAP',\n navbarMark,\n aiMonogram,\n brandLabel = 'dataimago.ai home',\n links = DEFAULT_LINKS,\n cta = DEFAULT_CTA,\n rightSlot,\n navLabel = 'Primary',\n homeHref = '/',\n}: PlatformNavProps) {\n const propertyMark = navbarMark ? (\n <NavbarLogo name={navbarMark} aria-hidden className={MARK_CLASS} />\n ) : (\n <Logo name={brandMark} variant=\"PATH\" aria-hidden className={MARK_CLASS} />\n );\n\n const aiHref = typeof aiMonogram === 'object' ? aiMonogram.href : undefined;\n const aiLabel =\n typeof aiMonogram === 'object' ? (aiMonogram.label ?? 'dataimago') : 'dataimago';\n\n return (\n <header className=\"sticky top-0 z-40 border-b border-stone-200 bg-stone-100/95 backdrop-blur-sm\">\n <nav\n className=\"mx-auto flex max-w-7xl items-center justify-between px-6 py-4\"\n aria-label={navLabel}\n >\n <div className=\"flex items-center gap-2 sm:gap-3\">\n {aiMonogram &&\n (aiHref ? (\n <Link href={aiHref} aria-label={aiLabel} className={AI_BUTTON_CLASS}>\n <NavbarLogo name=\"ai-monogram\" aria-hidden className=\"[&_svg]:h-6 [&_svg]:w-auto\" />\n </Link>\n ) : (\n <span className={AI_BUTTON_CLASS} aria-hidden>\n <NavbarLogo name=\"ai-monogram\" aria-hidden className=\"[&_svg]:h-6 [&_svg]:w-auto\" />\n </span>\n ))}\n <Link\n href={homeHref}\n className=\"inline-flex min-h-[48px] items-center text-stone-900 transition hover:opacity-80\"\n aria-label={brandLabel}\n >\n {propertyMark}\n </Link>\n </div>\n\n <div className=\"flex items-center gap-2 sm:gap-6\">\n {links.map(({ href, label, external }) =>\n external ? (\n <a\n key={href}\n href={href}\n className=\"btn-ghost hidden sm:inline-flex\"\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {label}\n </a>\n ) : (\n <Link key={href} href={href} className=\"btn-ghost hidden sm:inline-flex\">\n {label}\n </Link>\n )\n )}\n {cta && (\n <Link href={cta.href} className=\"btn-primary\">\n {cta.label}\n </Link>\n )}\n {rightSlot}\n </div>\n </nav>\n </header>\n );\n}\n","import type { GitHubNavButtonProps } from './types';\n\n/**\n * The unified GitHub account control for the nav's right slot — the canonical\n * login affordance + login-state indicator shared across every L1/L2 dataimago\n * app (rendered into `PlatformNav`'s `rightSlot`).\n *\n * Fully presentational and **stateless** — it reads no auth itself; the consumer\n * feeds it. Uses a native `<details>` disclosure for the signed-in menu, so it\n * needs no client JS and works whether rendered on the server (a server parent\n * injecting the avatar) or the client.\n *\n * - `mode=\"auth\"` (default): the login-state indicator.\n * - `status=\"unauthed\"` → a GET link to `signInHref` (start OAuth) showing the\n * GitHub mark + a login glyph.\n * - `status=\"authed\"` → the GitHub mark + the user's avatar, opening a menu\n * (profile link + a POST sign-out form to `signOutAction`).\n * - `mode=\"link\"`: a plain GitHub→`orgHref` link (L1, which has no auth).\n *\n * Icons are inlined (the GitHub mark + a lucide-style \"log-in\" glyph) to keep the\n * shared package free of an icon-library peer dependency.\n */\n\n// The 48px touch-target floor (the ready-to-hand dignity gate); colours resolve\n// from the consuming app's dataimago palette. The global `*:focus-visible` rule\n// supplies the focus ring.\nconst SHELL =\n 'inline-flex min-h-[48px] items-center gap-2 rounded-xl border border-stone-200 ' +\n 'bg-stone-50 px-3 text-stone-900 transition hover:bg-stone-100';\n\nconst MENU_ITEM =\n 'flex min-h-[48px] w-full items-center rounded px-2 text-left text-sm ' +\n 'text-stone-900 transition hover:bg-stone-100';\n\nfunction GithubMark() {\n return (\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" className=\"h-5 w-5 shrink-0\" fill=\"currentColor\">\n <path d=\"M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23a11.5 11.5 0 0 1 3.003-.404c1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222 0 1.606-.014 2.898-.014 3.293 0 .322.216.694.825.576C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12\" />\n </svg>\n );\n}\n\nfunction LoginGlyph() {\n // lucide \"log-in\" (ISC), inlined.\n return (\n <svg\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n className=\"h-5 w-5 shrink-0\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M15 3h4a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-4\" />\n <polyline points=\"10 17 15 12 10 7\" />\n <line x1=\"15\" x2=\"3\" y1=\"12\" y2=\"12\" />\n </svg>\n );\n}\n\nexport function GitHubNavButton({\n mode = 'auth',\n status = 'unauthed',\n login,\n avatarUrl,\n signInHref,\n profileHref,\n signOutAction,\n orgHref,\n defaultOpen,\n}: GitHubNavButtonProps) {\n // L1 mode: a plain GitHub→org link (no auth).\n if (mode === 'link') {\n return (\n <a\n href={orgHref}\n target=\"_blank\"\n rel=\"noreferrer\"\n className={SHELL}\n aria-label=\"dataimago on GitHub\"\n >\n <GithubMark />\n </a>\n );\n }\n\n // Signed out: a GET link that starts the OAuth flow.\n if (status !== 'authed') {\n return (\n <a href={signInHref} className={SHELL} aria-label=\"Sign in with GitHub\">\n <GithubMark />\n <LoginGlyph />\n </a>\n );\n }\n\n // Signed in: the GitHub mark + the user's avatar, with a native-disclosure menu.\n return (\n <details className=\"relative\" open={defaultOpen}>\n <summary\n className={`${SHELL} cursor-pointer list-none [&::-webkit-details-marker]:hidden`}\n aria-label={`GitHub account — signed in as ${login ?? 'your account'}`}\n >\n <GithubMark />\n {avatarUrl ? (\n <img\n src={avatarUrl}\n alt=\"\"\n className=\"h-7 w-7 rounded-full border border-stone-200\"\n width={28}\n height={28}\n />\n ) : (\n <span className=\"text-sm font-medium\">@{login}</span>\n )}\n </summary>\n <div className=\"absolute right-0 z-50 mt-2 w-60 rounded-lg border border-stone-200 bg-stone-50 p-2 shadow-lg\">\n <p className=\"px-2 py-1 text-sm text-stone-700\">\n Signed in as <span className=\"font-medium text-stone-900\">@{login}</span>\n </p>\n {profileHref && (\n <a href={profileHref} target=\"_blank\" rel=\"noreferrer\" className={MENU_ITEM}>\n View your GitHub profile\n </a>\n )}\n {signOutAction && (\n <form method=\"POST\" action={signOutAction}>\n <button type=\"submit\" className={MENU_ITEM}>\n Sign out\n </button>\n </form>\n )}\n </div>\n </details>\n );\n}\n","'use client';\n\nimport Link from 'next/link';\nimport { Logo } from '@dataimago/ui';\nimport type { SiteFooterProps } from './types';\n\n/**\n * Site footer — the Level-1 hub footer: dark surface, dataimago wordmark + a\n * trimmed nav column grid.\n *\n * The wordmark is the `dataimago` brand mark via `<Logo>` (font-free, in a light\n * `currentColor` on the dark surface) — no backplate, no hardcoded \".ai\" span.\n *\n * Extracted from apps/hub into @dataimago/hub-chrome during iteration-3-B.2\n * (2026-05-11). The defaults drop the former \"Legacy\" column + the critical-theory\n * closing statement (the philosophical-basis editorial lives on the PhilosophyFooter,\n * which is Level-1-only). Level-2 verticals use `MinimalFooter` instead.\n */\n\nconst DEFAULT_TAGLINE = 'A living AI-native application ecosystem.';\n\nconst DEFAULT_COLUMNS = [\n {\n heading: 'Platform',\n links: [\n { href: '/onboard', label: 'Begin a project' },\n { href: '/ecosystem', label: 'Ecosystem' },\n { href: '/philosophy', label: 'Philosophy' },\n ],\n },\n {\n heading: 'Framework',\n links: [\n {\n href: 'https://github.com/dataimago/dataimago-design',\n label: 'dataimago-design',\n external: true,\n },\n {\n href: 'https://github.com/dataimago/dataimago-rpkg',\n label: 'dataimago-rpkg',\n external: true,\n },\n {\n href: 'https://github.com/dataimago/dataimago-ai',\n label: 'dataimago-ai',\n external: true,\n },\n ],\n },\n];\n\nexport function SiteFooter({\n tagline = DEFAULT_TAGLINE,\n columns = DEFAULT_COLUMNS,\n closingStatement,\n}: SiteFooterProps) {\n return (\n <footer\n className=\"border-t border-stone-800 bg-stone-900 text-stone-400\"\n data-bs-theme=\"dark\"\n >\n <div className=\"mx-auto max-w-6xl px-6 py-12\">\n <div className=\"grid gap-8 md:grid-cols-4\">\n <div>\n <Link\n href=\"/\"\n className=\"inline-flex items-center text-stone-100 transition hover:opacity-80\"\n aria-label=\"dataimago\"\n >\n <Logo\n name=\"dataimago\"\n variant=\"PATH\"\n aria-hidden\n className=\"[&_svg]:h-7 [&_svg]:w-auto\"\n />\n </Link>\n <p className=\"mt-3 text-xs text-stone-400\">{tagline}</p>\n </div>\n\n {columns.map((col) => (\n <div key={col.heading}>\n <h4 className=\"font-mono text-xs uppercase tracking-wider text-accent-300\">\n {col.heading}\n </h4>\n <ul className=\"mt-3 space-y-2 text-sm\">\n {col.links.map(({ href, label, external }) => (\n <li key={label}>\n {!href ? (\n label\n ) : external ? (\n <a\n href={href}\n className=\"hover:text-paper-100\"\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {label}\n </a>\n ) : (\n <Link href={href} className=\"hover:text-paper-100\">\n {label}\n </Link>\n )}\n </li>\n ))}\n </ul>\n </div>\n ))}\n </div>\n\n {closingStatement ? (\n <div className=\"mt-12 border-t border-stone-800 pt-6 text-xs text-stone-400\">\n <p>{closingStatement}</p>\n </div>\n ) : null}\n </div>\n </footer>\n );\n}\n","'use client';\n\nimport Link from 'next/link';\nimport { Logo } from '@dataimago/ui';\nimport type { MinimalFooterProps } from './types';\n\n/**\n * MinimalFooter — the Level-2 vertical footer.\n *\n * A Level-2 vertical (dissertation.ai, future rpkg.ai / sgpc.ai) is \"an embodiment\n * of dataimago\": the footer shows the parent `dataimago` wordmark linking UP to\n * dataimago.ai, the embodiment line, a compact links row, and a copyright line.\n * No nav columns, no philosophy — those belong to the Level-1 hub (SiteFooter +\n * PhilosophyFooter). See dataimago-design wiki/patterns/hub-hero-anatomy.\n */\n\nconst DEFAULT_BRAND_HREF = 'https://dataimago.ai';\nconst DEFAULT_EMBODIMENT = 'An embodiment of dataimago';\n\nexport function MinimalFooter({\n brandHref = DEFAULT_BRAND_HREF,\n embodimentLabel = DEFAULT_EMBODIMENT,\n links = [],\n copyright,\n}: MinimalFooterProps) {\n return (\n <footer\n className=\"border-t border-stone-800 bg-stone-900 text-stone-400\"\n data-bs-theme=\"dark\"\n >\n <div className=\"mx-auto flex max-w-6xl flex-col items-center gap-4 px-6 py-10 text-center\">\n <a\n href={brandHref}\n className=\"inline-flex flex-col items-center gap-2 text-stone-100 transition hover:opacity-80\"\n target=\"_blank\"\n rel=\"noreferrer\"\n aria-label={`${embodimentLabel} — visit dataimago.ai`}\n >\n <Logo\n name=\"dataimago\"\n variant=\"PATH\"\n aria-hidden\n className=\"[&_svg]:h-7 [&_svg]:w-auto\"\n />\n <span className=\"text-sm text-stone-400\">{embodimentLabel}</span>\n </a>\n\n {links.length > 0 ? (\n <nav\n className=\"flex flex-wrap items-center justify-center gap-x-6 gap-y-2 text-sm\"\n aria-label=\"Footer\"\n >\n {links.map(({ href, label, external }) =>\n !href ? (\n <span key={label} className=\"text-stone-400\">\n {label}\n </span>\n ) : external ? (\n <a\n key={label}\n href={href}\n className=\"text-stone-300 hover:text-paper-100\"\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {label}\n </a>\n ) : (\n <Link key={label} href={href} className=\"text-stone-300 hover:text-paper-100\">\n {label}\n </Link>\n )\n )}\n </nav>\n ) : null}\n\n {copyright ? <p className=\"text-xs text-stone-400\">{copyright}</p> : null}\n </div>\n </footer>\n );\n}\n","'use client';\n\nimport type { PhilosophyFooterProps } from './types';\n\n/**\n * Philosophy footer — the platform's moral weight, rendered as a dark\n * editorial section with three belief/mission/vision pairs and a pull-quote.\n *\n * Iteration-1 visual identity (Phase B.3, 2026-05-06):\n * Dark-surface chrome with text-accent-500 eyebrows, font-display body, and\n * the Baudrillard blockquote with border-copper-500 (preserved-decorative-\n * copper per iteration-1 §5.2 governance).\n *\n * Iteration-2 role-shift (2026-05-07): text-accent-500 eyebrows resolve to\n * sky-blue accent-300 (#3498DB) on this dark surface via mode-aware mapping —\n * 5.41:1 on stone-900 (was 3.23:1 AA-large only with copper). The\n * border-copper-500 blockquote frame survives untouched. \"Two warmths\"\n * coexist: cool sky-blue on editorial eyebrows, warm copper on the\n * philosophical-quote frame.\n *\n * Extracted from apps/hub into @dataimago/hub-chrome during iteration-3-B.2\n * (2026-05-11). The `pairs`, `quote`, and `closingStatement` props allow\n * per-vertical adaptation; all props default to the Level-1 hub content.\n */\n\nconst DEFAULT_PAIRS = [\n {\n eyebrow: 'our belief',\n body: 'AI can enable virtuous cycles of improvement in the world.',\n },\n {\n eyebrow: 'our mission',\n body: 'The emancipation of humanity through ai super-alignment.',\n },\n {\n eyebrow: 'our vision',\n body: 'Super-alignment embeds ai in culture, not culture in ai.',\n },\n];\n\nconst DEFAULT_QUOTE = {\n text: `If men create intelligent machines, or fantasize about them, it is either because they secretly despair of their own intelligence or because they are in danger of succumbing to the weight of a monstrous and useless intelligence which they seek to exorcize by transferring it to machines, where they can play with it and make fun of it. By entrusting this burdensome intelligence to machines we are released from any responsibility to knowledge.`,\n attribution: 'Jean Baudrillard',\n work: 'Xerox and Infinity',\n year: 1988,\n};\n\nconst DEFAULT_CLOSING =\n 'dataimago is the structural answer to this critique. Every architectural choice — R as source of truth, editorial authority with the domain expert, the non-destructive retrofit principle, the ecosystem-as-commons — refuses to release the scholar from responsibility to their own knowledge. The AI serves the culture; the culture governs the AI.';\n\nexport function PhilosophyFooter({\n pairs = DEFAULT_PAIRS,\n quote = DEFAULT_QUOTE,\n closingStatement = DEFAULT_CLOSING,\n}: PhilosophyFooterProps) {\n return (\n <section\n aria-labelledby=\"philosophy-heading\"\n className=\"border-t border-stone-200 bg-stone-900 py-20 text-paper-100 sm:py-28\"\n >\n <div className=\"mx-auto max-w-6xl px-6\">\n <div className=\"grid gap-12 lg:grid-cols-3\">\n {pairs.map((pair, i) => (\n <div key={i}>\n <p className=\"font-mono text-xs uppercase tracking-wider text-accent-500\">\n {pair.eyebrow}\n </p>\n {i === 0 ? (\n <h3\n id=\"philosophy-heading\"\n className=\"mt-2 font-display text-xl text-paper-100\"\n >\n {pair.body}\n </h3>\n ) : (\n <p className=\"mt-2 font-display text-xl text-paper-100\">\n {pair.body}\n </p>\n )}\n </div>\n ))}\n </div>\n\n {/* Pull-quote — border-copper-500 PRESERVED: decorative-emphasis\n blockquote frame per iteration-1 §5.2 preserved-decorative-copper\n governance. */}\n <blockquote className=\"mt-16 max-w-prose-wide border-l-2 border-copper-500 pl-6 font-display italic text-paper-100\">\n <p className=\"text-base leading-relaxed\">{quote.text}</p>\n <footer className=\"mt-4 text-sm not-italic text-stone-400\">\n — {quote.attribution}, <cite>{quote.work}</cite> ({quote.year})\n </footer>\n </blockquote>\n\n <p className=\"mt-8 max-w-prose-wide text-sm text-stone-400\">\n {closingStatement}\n </p>\n </div>\n </section>\n );\n}\n"],"mappings":"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","names":["jsx","jsxs","Link","Logo","jsx","jsxs","Link","Logo","jsx","jsxs","jsx","jsxs"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dataimago/hub-chrome",
3
- "version": "0.2.0-alpha.3",
3
+ "version": "0.2.0-alpha.4",
4
4
  "description": "Configurable hub chrome components — PlatformNav, SiteFooter, PhilosophyFooter — with dataimago house defaults and props for per-vertical adaptation. Extracted from dataimago-ai/apps/hub during iteration-3-B.2 (2026-05-11). Consumed by both the Level-1 dataimago.ai hub and Level-2 verticals (dissertation.ai, future sgpc.ai / rpkg.ai).",
5
5
  "license": "MIT",
6
6
  "repository": {