@dataimago/hub-chrome 0.2.0-alpha.0 → 0.2.0-alpha.2

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
@@ -30,6 +30,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
30
30
  // src/index.ts
31
31
  var index_exports = {};
32
32
  __export(index_exports, {
33
+ MinimalFooter: () => MinimalFooter,
33
34
  PhilosophyFooter: () => PhilosophyFooter,
34
35
  PlatformNav: () => PlatformNav,
35
36
  SiteFooter: () => SiteFooter
@@ -45,37 +46,39 @@ var DEFAULT_LINKS = [
45
46
  { href: "/philosophy", label: "Philosophy" }
46
47
  ];
47
48
  var DEFAULT_CTA = { href: "/onboard", label: "Begin" };
49
+ var MARK_CLASS = "[&_svg]:h-7 [&_svg]:w-auto sm:[&_svg]:h-8";
50
+ var AI_BUTTON_CLASS = "inline-flex min-h-[48px] min-w-[48px] items-center justify-center rounded-xl border border-stone-200 bg-stone-50 text-stone-900 transition hover:bg-stone-100";
48
51
  function PlatformNav({
52
+ brandMark = "dataimago_ai_OVERLAP",
53
+ navbarMark,
54
+ aiMonogram,
55
+ brandLabel = "dataimago.ai home",
49
56
  links = DEFAULT_LINKS,
50
57
  cta = DEFAULT_CTA,
51
58
  navLabel = "Primary",
52
59
  homeHref = "/"
53
60
  }) {
61
+ const propertyMark = navbarMark ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_ui.NavbarLogo, { name: navbarMark, "aria-hidden": true, className: MARK_CLASS }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_ui.Logo, { name: brandMark, variant: "PATH", "aria-hidden": true, className: MARK_CLASS });
62
+ const aiHref = typeof aiMonogram === "object" ? aiMonogram.href : void 0;
63
+ const aiLabel = typeof aiMonogram === "object" ? aiMonogram.label ?? "dataimago" : "dataimago";
54
64
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("header", { className: "sticky top-0 z-40 border-b border-stone-200 bg-stone-100/95 backdrop-blur-sm", children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
55
65
  "nav",
56
66
  {
57
67
  className: "mx-auto flex max-w-7xl items-center justify-between px-6 py-4",
58
68
  "aria-label": navLabel,
59
69
  children: [
60
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
61
- import_link.default,
62
- {
63
- href: homeHref,
64
- className: "group flex items-center gap-1.5 hover:[--color-interactive-accent:#154d6f]",
65
- "aria-label": "dataimago.ai home",
66
- children: [
67
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
68
- import_ui.LogoMonogramBg,
69
- {
70
- className: "h-8 w-8 sm:h-9 sm:w-9",
71
- "aria-hidden": true,
72
- title: void 0
73
- }
74
- ),
75
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "font-mono text-sm text-stone-500", children: ".ai" })
76
- ]
77
- }
78
- ),
70
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center gap-2 sm:gap-3", children: [
71
+ aiMonogram && (aiHref ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_link.default, { href: aiHref, "aria-label": aiLabel, className: AI_BUTTON_CLASS, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_ui.NavbarLogo, { name: "ai-monogram", "aria-hidden": true, className: "[&_svg]:h-6 [&_svg]:w-auto" }) }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: AI_BUTTON_CLASS, "aria-hidden": true, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_ui.NavbarLogo, { name: "ai-monogram", "aria-hidden": true, className: "[&_svg]:h-6 [&_svg]:w-auto" }) })),
72
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
73
+ import_link.default,
74
+ {
75
+ href: homeHref,
76
+ className: "inline-flex min-h-[48px] items-center text-stone-900 transition hover:opacity-80",
77
+ "aria-label": brandLabel,
78
+ children: propertyMark
79
+ }
80
+ )
81
+ ] }),
79
82
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center gap-2 sm:gap-6", children: [
80
83
  links.map(
81
84
  ({ href, label, external }) => external ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
@@ -130,21 +133,12 @@ var DEFAULT_COLUMNS = [
130
133
  external: true
131
134
  }
132
135
  ]
133
- },
134
- {
135
- heading: "Legacy",
136
- links: [
137
- { label: "super-alignment" },
138
- { label: "human-centered ai" },
139
- { label: "critical transformation" }
140
- ]
141
136
  }
142
137
  ];
143
- var DEFAULT_CLOSING = '"dataimago is the instantiation of critical theory in software."';
144
138
  function SiteFooter({
145
139
  tagline = DEFAULT_TAGLINE,
146
140
  columns = DEFAULT_COLUMNS,
147
- closingStatement = DEFAULT_CLOSING
141
+ closingStatement
148
142
  }) {
149
143
  return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
150
144
  "footer",
@@ -154,14 +148,27 @@ function SiteFooter({
154
148
  children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "mx-auto max-w-6xl px-6 py-12", children: [
155
149
  /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "grid gap-8 md:grid-cols-4", children: [
156
150
  /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { children: [
157
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_link2.default, { href: "/", className: "inline-flex items-center gap-1.5", children: [
158
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.LogoWordmark, { className: "w-32 sm:w-36", "aria-label": "dataimago" }),
159
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "font-mono text-xs text-stone-500", children: ".ai" })
160
- ] }),
151
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
152
+ import_link2.default,
153
+ {
154
+ href: "/",
155
+ className: "inline-flex items-center text-stone-100 transition hover:opacity-80",
156
+ "aria-label": "dataimago",
157
+ children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
158
+ import_ui2.Logo,
159
+ {
160
+ name: "dataimago",
161
+ variant: "PATH",
162
+ "aria-hidden": true,
163
+ className: "[&_svg]:h-7 [&_svg]:w-auto"
164
+ }
165
+ )
166
+ }
167
+ ),
161
168
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "mt-3 text-xs text-stone-400", children: tagline })
162
169
  ] }),
163
170
  columns.map((col) => /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { children: [
164
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("h4", { className: "font-mono text-xs uppercase tracking-wider text-accent-500", children: col.heading }),
171
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("h4", { className: "font-mono text-xs uppercase tracking-wider text-accent-300", children: col.heading }),
165
172
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("ul", { className: "mt-3 space-y-2 text-sm", children: col.links.map(({ href, label, external }) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("li", { children: !href ? label : external ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
166
173
  "a",
167
174
  {
@@ -174,14 +181,80 @@ function SiteFooter({
174
181
  ) : /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_link2.default, { href, className: "hover:text-paper-100", children: label }) }, label)) })
175
182
  ] }, col.heading))
176
183
  ] }),
177
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "mt-12 border-t border-stone-800 pt-6 text-xs text-stone-400", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { children: closingStatement }) })
184
+ closingStatement ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "mt-12 border-t border-stone-800 pt-6 text-xs text-stone-400", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { children: closingStatement }) }) : null
178
185
  ] })
179
186
  }
180
187
  );
181
188
  }
182
189
 
183
- // src/PhilosophyFooter.tsx
190
+ // src/MinimalFooter.tsx
191
+ var import_link3 = __toESM(require("next/link"), 1);
192
+ var import_ui3 = require("@dataimago/ui");
184
193
  var import_jsx_runtime3 = require("react/jsx-runtime");
194
+ var DEFAULT_BRAND_HREF = "https://dataimago.ai";
195
+ var DEFAULT_EMBODIMENT = "An embodiment of dataimago";
196
+ function MinimalFooter({
197
+ brandHref = DEFAULT_BRAND_HREF,
198
+ embodimentLabel = DEFAULT_EMBODIMENT,
199
+ links = [],
200
+ copyright
201
+ }) {
202
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
203
+ "footer",
204
+ {
205
+ className: "border-t border-stone-800 bg-stone-900 text-stone-400",
206
+ "data-bs-theme": "dark",
207
+ children: /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "mx-auto flex max-w-6xl flex-col items-center gap-4 px-6 py-10 text-center", children: [
208
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
209
+ "a",
210
+ {
211
+ href: brandHref,
212
+ className: "inline-flex flex-col items-center gap-2 text-stone-100 transition hover:opacity-80",
213
+ target: "_blank",
214
+ rel: "noreferrer",
215
+ "aria-label": `${embodimentLabel} \u2014 visit dataimago.ai`,
216
+ children: [
217
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
218
+ import_ui3.Logo,
219
+ {
220
+ name: "dataimago",
221
+ variant: "PATH",
222
+ "aria-hidden": true,
223
+ className: "[&_svg]:h-7 [&_svg]:w-auto"
224
+ }
225
+ ),
226
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: "text-sm text-stone-400", children: embodimentLabel })
227
+ ]
228
+ }
229
+ ),
230
+ links.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
231
+ "nav",
232
+ {
233
+ className: "flex flex-wrap items-center justify-center gap-x-6 gap-y-2 text-sm",
234
+ "aria-label": "Footer",
235
+ children: links.map(
236
+ ({ href, label, external }) => !href ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: "text-stone-400", children: label }, label) : external ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
237
+ "a",
238
+ {
239
+ href,
240
+ className: "text-stone-300 hover:text-paper-100",
241
+ target: "_blank",
242
+ rel: "noreferrer",
243
+ children: label
244
+ },
245
+ label
246
+ ) : /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_link3.default, { href, className: "text-stone-300 hover:text-paper-100", children: label }, label)
247
+ )
248
+ }
249
+ ) : null,
250
+ copyright ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("p", { className: "text-xs text-stone-400", children: copyright }) : null
251
+ ] })
252
+ }
253
+ );
254
+ }
255
+
256
+ // src/PhilosophyFooter.tsx
257
+ var import_jsx_runtime4 = require("react/jsx-runtime");
185
258
  var DEFAULT_PAIRS = [
186
259
  {
187
260
  eyebrow: "our belief",
@@ -202,48 +275,49 @@ var DEFAULT_QUOTE = {
202
275
  work: "Xerox and Infinity",
203
276
  year: 1988
204
277
  };
205
- var DEFAULT_CLOSING2 = "dataimago is the structural answer to this critique. Every architectural choice \u2014 R as source of truth, editorial authority with the domain expert, the non-destructive retrofit principle, the ecosystem-as-commons \u2014 refuses to release the scholar from responsibility to their own knowledge. The AI serves the culture; the culture governs the AI.";
278
+ var DEFAULT_CLOSING = "dataimago is the structural answer to this critique. Every architectural choice \u2014 R as source of truth, editorial authority with the domain expert, the non-destructive retrofit principle, the ecosystem-as-commons \u2014 refuses to release the scholar from responsibility to their own knowledge. The AI serves the culture; the culture governs the AI.";
206
279
  function PhilosophyFooter({
207
280
  pairs = DEFAULT_PAIRS,
208
281
  quote = DEFAULT_QUOTE,
209
- closingStatement = DEFAULT_CLOSING2
282
+ closingStatement = DEFAULT_CLOSING
210
283
  }) {
211
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
284
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
212
285
  "section",
213
286
  {
214
287
  "aria-labelledby": "philosophy-heading",
215
288
  className: "border-t border-stone-200 bg-stone-900 py-20 text-paper-100 sm:py-28",
216
- children: /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "mx-auto max-w-6xl px-6", children: [
217
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: "grid gap-12 lg:grid-cols-3", children: pairs.map((pair, i) => /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { children: [
218
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("p", { className: "font-mono text-xs uppercase tracking-wider text-accent-500", children: pair.eyebrow }),
219
- i === 0 ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
289
+ children: /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "mx-auto max-w-6xl px-6", children: [
290
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "grid gap-12 lg:grid-cols-3", children: pairs.map((pair, i) => /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { children: [
291
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("p", { className: "font-mono text-xs uppercase tracking-wider text-accent-500", children: pair.eyebrow }),
292
+ i === 0 ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
220
293
  "h3",
221
294
  {
222
295
  id: "philosophy-heading",
223
296
  className: "mt-2 font-display text-xl text-paper-100",
224
297
  children: pair.body
225
298
  }
226
- ) : /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("p", { className: "mt-2 font-display text-xl text-paper-100", children: pair.body })
299
+ ) : /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("p", { className: "mt-2 font-display text-xl text-paper-100", children: pair.body })
227
300
  ] }, i)) }),
228
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("blockquote", { className: "mt-16 max-w-prose-wide border-l-2 border-copper-500 pl-6 font-display italic text-paper-100", children: [
229
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("p", { className: "text-base leading-relaxed", children: quote.text }),
230
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("footer", { className: "mt-4 text-sm not-italic text-stone-400", children: [
301
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("blockquote", { className: "mt-16 max-w-prose-wide border-l-2 border-copper-500 pl-6 font-display italic text-paper-100", children: [
302
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("p", { className: "text-base leading-relaxed", children: quote.text }),
303
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("footer", { className: "mt-4 text-sm not-italic text-stone-400", children: [
231
304
  "\u2014 ",
232
305
  quote.attribution,
233
306
  ", ",
234
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("cite", { children: quote.work }),
307
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("cite", { children: quote.work }),
235
308
  " (",
236
309
  quote.year,
237
310
  ")"
238
311
  ] })
239
312
  ] }),
240
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("p", { className: "mt-8 max-w-prose-wide text-sm text-stone-400", children: closingStatement })
313
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("p", { className: "mt-8 max-w-prose-wide text-sm text-stone-400", children: closingStatement })
241
314
  ] })
242
315
  }
243
316
  );
244
317
  }
245
318
  // Annotate the CommonJS export names for ESM import in node:
246
319
  0 && (module.exports = {
320
+ MinimalFooter,
247
321
  PhilosophyFooter,
248
322
  PlatformNav,
249
323
  SiteFooter
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/PlatformNav.tsx","../src/SiteFooter.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 { SiteFooter } from './SiteFooter';\nexport { PhilosophyFooter } from './PhilosophyFooter';\n\nexport type {\n NavLink,\n FooterColumn,\n EditorialPair,\n PullQuote,\n PlatformNavProps,\n SiteFooterProps,\n PhilosophyFooterProps,\n} from './types';\n","'use client';\n\nimport Link from 'next/link';\nimport { LogoMonogramBg } from '@dataimago/ui';\nimport type { PlatformNavProps } from './types';\n\n/**\n * Platform navigation — sticky header with logo + nav link cluster.\n *\n * Iteration-2-tail (Plan A, 2026-05-07):\n * The wordmark is the LogoMonogramBg badge — the 'ai' SVG monogram on a\n * sky-blue rounded accent backplate sourced from @dataimago/ui — paired\n * with a \".ai\" mono span. Hover shifts the backplate from accent-500 to\n * accent-600 via a scoped CSS-variable override on the Link's group.\n *\n * Extracted from apps/hub into @dataimago/hub-chrome during iteration-3-B.2\n * (2026-05-11) to make the chrome available to Level-2 verticals. The\n * `links` and `cta` props allow per-vertical nav customization; all props\n * 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\nexport function PlatformNav({\n links = DEFAULT_LINKS,\n cta = DEFAULT_CTA,\n navLabel = 'Primary',\n homeHref = '/',\n}: PlatformNavProps) {\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 <Link\n href={homeHref}\n className=\"group flex items-center gap-1.5 hover:[--color-interactive-accent:#154d6f]\"\n aria-label=\"dataimago.ai home\"\n >\n <LogoMonogramBg\n className=\"h-8 w-8 sm:h-9 sm:w-9\"\n aria-hidden\n title={undefined}\n />\n <span className=\"font-mono text-sm text-stone-500\">.ai</span>\n </Link>\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 </div>\n </nav>\n </header>\n );\n}\n","'use client';\n\nimport Link from 'next/link';\nimport { LogoWordmark } from '@dataimago/ui';\nimport type { SiteFooterProps } from './types';\n\n/**\n * Site footer — dark-surface footer with wordmark + nav column grid.\n *\n * Iteration-2-tail (Plan A, 2026-05-07):\n * The wordmark is the LogoWordmark SVG on a sky-blue backplate, scoped to\n * dark-surface token resolution via data-bs-theme=\"dark\". The backplate\n * resolves to accent-300 (#3498DB) on bg-stone-900 at 5.41:1 AA.\n *\n * Extracted from apps/hub into @dataimago/hub-chrome during iteration-3-B.2\n * (2026-05-11). The `tagline` and `columns` props allow per-vertical\n * customization; all props default to the Level-1 hub configuration.\n *\n * Note (open regression from iteration-2): text-accent-500 column eyebrows\n * render at 2.56:1 on stone-900 because Tailwind's static class binds to the\n * absolute color, not the mode-aware role. Migration to text-accent-300 or a\n * CSS-variable consumer closes the gap. Deferred to iteration-3 candidate.\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 heading: 'Legacy',\n links: [\n { label: 'super-alignment' },\n { label: 'human-centered ai' },\n { label: 'critical transformation' },\n ],\n },\n];\n\nconst DEFAULT_CLOSING =\n '\"dataimago is the instantiation of critical theory in software.\"';\n\nexport function SiteFooter({\n tagline = DEFAULT_TAGLINE,\n columns = DEFAULT_COLUMNS,\n closingStatement = DEFAULT_CLOSING,\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 href=\"/\" className=\"inline-flex items-center gap-1.5\">\n <LogoWordmark className=\"w-32 sm:w-36\" aria-label=\"dataimago\" />\n <span className=\"font-mono text-xs text-stone-500\">.ai</span>\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-500\">\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 <div className=\"mt-12 border-t border-stone-800 pt-6 text-xs text-stone-400\">\n <p>{closingStatement}</p>\n </div>\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_link","import_ui","import_jsx_runtime","Link","import_jsx_runtime","DEFAULT_CLOSING"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/PlatformNav.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 { 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 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 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 </div>\n </nav>\n </header>\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_link","import_ui","import_jsx_runtime","Link","import_link","import_ui","import_jsx_runtime","Link","import_jsx_runtime"]}
package/dist/index.d.cts CHANGED
@@ -1,4 +1,5 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { LogoProps, NavbarLogoProps } from '@dataimago/ui';
2
3
 
3
4
  /**
4
5
  * @dataimago/hub-chrome — configuration type surface.
@@ -7,6 +8,21 @@ import * as react_jsx_runtime from 'react/jsx-runtime';
7
8
  * component. Verticals (dissertation.ai, sgpc.ai, rpkg.ai) override
8
9
  * whichever values differ from the hub defaults.
9
10
  */
11
+
12
+ /** A canonical @dataimago/brand mark id (e.g. `dataimago_ai_OVERLAP`). */
13
+ type BrandMark = LogoProps['name'];
14
+ /** An animated navbar mark id (e.g. `dissertation-ai`). See @dataimago/brand navbar.json. */
15
+ type NavbarMark = NavbarLogoProps['name'];
16
+ /**
17
+ * Optional `ai-monogram` icon button placed to the LEFT of the property mark
18
+ * (the dataimago "ai" signature, lift+washing to the brand-mark red on hover).
19
+ * `true` renders a non-interactive mark; an object makes it a link (e.g. up to
20
+ * the Level-1 hub).
21
+ */
22
+ type AiMonogram = boolean | {
23
+ href: string;
24
+ label?: string;
25
+ };
10
26
  /** A single navigation link or plain-text label (when href is omitted). */
11
27
  interface NavLink {
12
28
  /** Omit to render as a non-interactive text label (e.g. legacy items). */
@@ -33,6 +49,29 @@ interface PullQuote {
33
49
  year: number;
34
50
  }
35
51
  interface PlatformNavProps {
52
+ /**
53
+ * The brand mark rendered in the header, by `@dataimago/brand` id.
54
+ * Defaults to the Level-1 house mark `dataimago_ai_OVERLAP`; Level-2
55
+ * verticals pass their own (e.g. `dissertation_ai_OVERLAP`).
56
+ */
57
+ brandMark?: BrandMark;
58
+ /**
59
+ * When set, the home link renders the ANIMATED `<NavbarLogo>` for this navbar
60
+ * mark id (the a/i assemble toggle for L2 marks, lift+wash for L1) instead of
61
+ * the static `<Logo brandMark>`. Falls back to `brandMark` when omitted, so
62
+ * existing consumers are unaffected.
63
+ */
64
+ navbarMark?: NavbarMark;
65
+ /**
66
+ * Render an `ai-monogram` lift-wash icon button to the LEFT of the property
67
+ * mark (the dataimago "ai" signature). Omit/false to hide.
68
+ */
69
+ aiMonogram?: AiMonogram;
70
+ /**
71
+ * Accessible name for the logo/home link.
72
+ * Defaults to "dataimago.ai home".
73
+ */
74
+ brandLabel?: string;
36
75
  /**
37
76
  * Secondary nav links rendered in the header's right-side cluster.
38
77
  * Defaults to the Level-1 hub links: Ecosystem, Philosophy.
@@ -64,15 +103,31 @@ interface SiteFooterProps {
64
103
  tagline?: string;
65
104
  /**
66
105
  * Nav columns rendered in the footer grid.
67
- * Defaults to the hub's Platform / Framework / Legacy columns.
106
+ * Defaults to the hub's Platform / Framework columns.
68
107
  */
69
108
  columns?: FooterColumn[];
70
109
  /**
71
- * Closing statement in the dark strip below the nav grid.
72
- * Defaults to the Baudrillard framing quote from the hub.
110
+ * Optional closing statement in the dark strip below the nav grid.
111
+ * When omitted, the closing strip is not rendered.
73
112
  */
74
113
  closingStatement?: string;
75
114
  }
115
+ /**
116
+ * MinimalFooter — the Level-2 vertical footer. A vertical is "an embodiment of
117
+ * dataimago": it shows the parent `dataimago` wordmark linking up to dataimago.ai,
118
+ * the embodiment line, a compact links row, and a copyright line. No nav columns,
119
+ * no philosophy — those live on the Level-1 hub.
120
+ */
121
+ interface MinimalFooterProps {
122
+ /** Where the dataimago wordmark links (the parent hub). Defaults to https://dataimago.ai. */
123
+ brandHref?: string;
124
+ /** The embodiment line. Defaults to "An embodiment of dataimago". */
125
+ embodimentLabel?: string;
126
+ /** A compact row of essential links. */
127
+ links?: NavLink[];
128
+ /** Optional copyright / fine-print line. */
129
+ copyright?: string;
130
+ }
76
131
  interface PhilosophyFooterProps {
77
132
  /**
78
133
  * The three editorial pairs (belief / mission / vision or equivalent).
@@ -91,10 +146,12 @@ interface PhilosophyFooterProps {
91
146
  closingStatement?: string;
92
147
  }
93
148
 
94
- declare function PlatformNav({ links, cta, navLabel, homeHref, }: PlatformNavProps): react_jsx_runtime.JSX.Element;
149
+ declare function PlatformNav({ brandMark, navbarMark, aiMonogram, brandLabel, links, cta, navLabel, homeHref, }: PlatformNavProps): react_jsx_runtime.JSX.Element;
95
150
 
96
151
  declare function SiteFooter({ tagline, columns, closingStatement, }: SiteFooterProps): react_jsx_runtime.JSX.Element;
97
152
 
153
+ declare function MinimalFooter({ brandHref, embodimentLabel, links, copyright, }: MinimalFooterProps): react_jsx_runtime.JSX.Element;
154
+
98
155
  declare function PhilosophyFooter({ pairs, quote, closingStatement, }: PhilosophyFooterProps): react_jsx_runtime.JSX.Element;
99
156
 
100
- export { type EditorialPair, type FooterColumn, type NavLink, PhilosophyFooter, type PhilosophyFooterProps, PlatformNav, type PlatformNavProps, type PullQuote, SiteFooter, type SiteFooterProps };
157
+ export { type AiMonogram, type BrandMark, type EditorialPair, type FooterColumn, MinimalFooter, type MinimalFooterProps, type NavLink, type NavbarMark, PhilosophyFooter, type PhilosophyFooterProps, PlatformNav, type PlatformNavProps, type PullQuote, SiteFooter, type SiteFooterProps };
package/dist/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { LogoProps, NavbarLogoProps } from '@dataimago/ui';
2
3
 
3
4
  /**
4
5
  * @dataimago/hub-chrome — configuration type surface.
@@ -7,6 +8,21 @@ import * as react_jsx_runtime from 'react/jsx-runtime';
7
8
  * component. Verticals (dissertation.ai, sgpc.ai, rpkg.ai) override
8
9
  * whichever values differ from the hub defaults.
9
10
  */
11
+
12
+ /** A canonical @dataimago/brand mark id (e.g. `dataimago_ai_OVERLAP`). */
13
+ type BrandMark = LogoProps['name'];
14
+ /** An animated navbar mark id (e.g. `dissertation-ai`). See @dataimago/brand navbar.json. */
15
+ type NavbarMark = NavbarLogoProps['name'];
16
+ /**
17
+ * Optional `ai-monogram` icon button placed to the LEFT of the property mark
18
+ * (the dataimago "ai" signature, lift+washing to the brand-mark red on hover).
19
+ * `true` renders a non-interactive mark; an object makes it a link (e.g. up to
20
+ * the Level-1 hub).
21
+ */
22
+ type AiMonogram = boolean | {
23
+ href: string;
24
+ label?: string;
25
+ };
10
26
  /** A single navigation link or plain-text label (when href is omitted). */
11
27
  interface NavLink {
12
28
  /** Omit to render as a non-interactive text label (e.g. legacy items). */
@@ -33,6 +49,29 @@ interface PullQuote {
33
49
  year: number;
34
50
  }
35
51
  interface PlatformNavProps {
52
+ /**
53
+ * The brand mark rendered in the header, by `@dataimago/brand` id.
54
+ * Defaults to the Level-1 house mark `dataimago_ai_OVERLAP`; Level-2
55
+ * verticals pass their own (e.g. `dissertation_ai_OVERLAP`).
56
+ */
57
+ brandMark?: BrandMark;
58
+ /**
59
+ * When set, the home link renders the ANIMATED `<NavbarLogo>` for this navbar
60
+ * mark id (the a/i assemble toggle for L2 marks, lift+wash for L1) instead of
61
+ * the static `<Logo brandMark>`. Falls back to `brandMark` when omitted, so
62
+ * existing consumers are unaffected.
63
+ */
64
+ navbarMark?: NavbarMark;
65
+ /**
66
+ * Render an `ai-monogram` lift-wash icon button to the LEFT of the property
67
+ * mark (the dataimago "ai" signature). Omit/false to hide.
68
+ */
69
+ aiMonogram?: AiMonogram;
70
+ /**
71
+ * Accessible name for the logo/home link.
72
+ * Defaults to "dataimago.ai home".
73
+ */
74
+ brandLabel?: string;
36
75
  /**
37
76
  * Secondary nav links rendered in the header's right-side cluster.
38
77
  * Defaults to the Level-1 hub links: Ecosystem, Philosophy.
@@ -64,15 +103,31 @@ interface SiteFooterProps {
64
103
  tagline?: string;
65
104
  /**
66
105
  * Nav columns rendered in the footer grid.
67
- * Defaults to the hub's Platform / Framework / Legacy columns.
106
+ * Defaults to the hub's Platform / Framework columns.
68
107
  */
69
108
  columns?: FooterColumn[];
70
109
  /**
71
- * Closing statement in the dark strip below the nav grid.
72
- * Defaults to the Baudrillard framing quote from the hub.
110
+ * Optional closing statement in the dark strip below the nav grid.
111
+ * When omitted, the closing strip is not rendered.
73
112
  */
74
113
  closingStatement?: string;
75
114
  }
115
+ /**
116
+ * MinimalFooter — the Level-2 vertical footer. A vertical is "an embodiment of
117
+ * dataimago": it shows the parent `dataimago` wordmark linking up to dataimago.ai,
118
+ * the embodiment line, a compact links row, and a copyright line. No nav columns,
119
+ * no philosophy — those live on the Level-1 hub.
120
+ */
121
+ interface MinimalFooterProps {
122
+ /** Where the dataimago wordmark links (the parent hub). Defaults to https://dataimago.ai. */
123
+ brandHref?: string;
124
+ /** The embodiment line. Defaults to "An embodiment of dataimago". */
125
+ embodimentLabel?: string;
126
+ /** A compact row of essential links. */
127
+ links?: NavLink[];
128
+ /** Optional copyright / fine-print line. */
129
+ copyright?: string;
130
+ }
76
131
  interface PhilosophyFooterProps {
77
132
  /**
78
133
  * The three editorial pairs (belief / mission / vision or equivalent).
@@ -91,10 +146,12 @@ interface PhilosophyFooterProps {
91
146
  closingStatement?: string;
92
147
  }
93
148
 
94
- declare function PlatformNav({ links, cta, navLabel, homeHref, }: PlatformNavProps): react_jsx_runtime.JSX.Element;
149
+ declare function PlatformNav({ brandMark, navbarMark, aiMonogram, brandLabel, links, cta, navLabel, homeHref, }: PlatformNavProps): react_jsx_runtime.JSX.Element;
95
150
 
96
151
  declare function SiteFooter({ tagline, columns, closingStatement, }: SiteFooterProps): react_jsx_runtime.JSX.Element;
97
152
 
153
+ declare function MinimalFooter({ brandHref, embodimentLabel, links, copyright, }: MinimalFooterProps): react_jsx_runtime.JSX.Element;
154
+
98
155
  declare function PhilosophyFooter({ pairs, quote, closingStatement, }: PhilosophyFooterProps): react_jsx_runtime.JSX.Element;
99
156
 
100
- export { type EditorialPair, type FooterColumn, type NavLink, PhilosophyFooter, type PhilosophyFooterProps, PlatformNav, type PlatformNavProps, type PullQuote, SiteFooter, type SiteFooterProps };
157
+ export { type AiMonogram, type BrandMark, type EditorialPair, type FooterColumn, MinimalFooter, type MinimalFooterProps, type NavLink, type NavbarMark, PhilosophyFooter, type PhilosophyFooterProps, PlatformNav, type PlatformNavProps, type PullQuote, SiteFooter, type SiteFooterProps };
package/dist/index.js CHANGED
@@ -1,43 +1,45 @@
1
1
  // src/PlatformNav.tsx
2
2
  import Link from "next/link";
3
- import { LogoMonogramBg } from "@dataimago/ui";
3
+ import { Logo, NavbarLogo } from "@dataimago/ui";
4
4
  import { jsx, jsxs } from "react/jsx-runtime";
5
5
  var DEFAULT_LINKS = [
6
6
  { href: "/ecosystem", label: "Ecosystem" },
7
7
  { href: "/philosophy", label: "Philosophy" }
8
8
  ];
9
9
  var DEFAULT_CTA = { href: "/onboard", label: "Begin" };
10
+ var MARK_CLASS = "[&_svg]:h-7 [&_svg]:w-auto sm:[&_svg]:h-8";
11
+ var AI_BUTTON_CLASS = "inline-flex min-h-[48px] min-w-[48px] items-center justify-center rounded-xl border border-stone-200 bg-stone-50 text-stone-900 transition hover:bg-stone-100";
10
12
  function PlatformNav({
13
+ brandMark = "dataimago_ai_OVERLAP",
14
+ navbarMark,
15
+ aiMonogram,
16
+ brandLabel = "dataimago.ai home",
11
17
  links = DEFAULT_LINKS,
12
18
  cta = DEFAULT_CTA,
13
19
  navLabel = "Primary",
14
20
  homeHref = "/"
15
21
  }) {
22
+ const propertyMark = navbarMark ? /* @__PURE__ */ jsx(NavbarLogo, { name: navbarMark, "aria-hidden": true, className: MARK_CLASS }) : /* @__PURE__ */ jsx(Logo, { name: brandMark, variant: "PATH", "aria-hidden": true, className: MARK_CLASS });
23
+ const aiHref = typeof aiMonogram === "object" ? aiMonogram.href : void 0;
24
+ const aiLabel = typeof aiMonogram === "object" ? aiMonogram.label ?? "dataimago" : "dataimago";
16
25
  return /* @__PURE__ */ jsx("header", { className: "sticky top-0 z-40 border-b border-stone-200 bg-stone-100/95 backdrop-blur-sm", children: /* @__PURE__ */ jsxs(
17
26
  "nav",
18
27
  {
19
28
  className: "mx-auto flex max-w-7xl items-center justify-between px-6 py-4",
20
29
  "aria-label": navLabel,
21
30
  children: [
22
- /* @__PURE__ */ jsxs(
23
- Link,
24
- {
25
- href: homeHref,
26
- className: "group flex items-center gap-1.5 hover:[--color-interactive-accent:#154d6f]",
27
- "aria-label": "dataimago.ai home",
28
- children: [
29
- /* @__PURE__ */ jsx(
30
- LogoMonogramBg,
31
- {
32
- className: "h-8 w-8 sm:h-9 sm:w-9",
33
- "aria-hidden": true,
34
- title: void 0
35
- }
36
- ),
37
- /* @__PURE__ */ jsx("span", { className: "font-mono text-sm text-stone-500", children: ".ai" })
38
- ]
39
- }
40
- ),
31
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 sm:gap-3", children: [
32
+ aiMonogram && (aiHref ? /* @__PURE__ */ jsx(Link, { href: aiHref, "aria-label": aiLabel, className: AI_BUTTON_CLASS, children: /* @__PURE__ */ jsx(NavbarLogo, { name: "ai-monogram", "aria-hidden": true, className: "[&_svg]:h-6 [&_svg]:w-auto" }) }) : /* @__PURE__ */ jsx("span", { className: AI_BUTTON_CLASS, "aria-hidden": true, children: /* @__PURE__ */ jsx(NavbarLogo, { name: "ai-monogram", "aria-hidden": true, className: "[&_svg]:h-6 [&_svg]:w-auto" }) })),
33
+ /* @__PURE__ */ jsx(
34
+ Link,
35
+ {
36
+ href: homeHref,
37
+ className: "inline-flex min-h-[48px] items-center text-stone-900 transition hover:opacity-80",
38
+ "aria-label": brandLabel,
39
+ children: propertyMark
40
+ }
41
+ )
42
+ ] }),
41
43
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 sm:gap-6", children: [
42
44
  links.map(
43
45
  ({ href, label, external }) => external ? /* @__PURE__ */ jsx(
@@ -61,7 +63,7 @@ function PlatformNav({
61
63
 
62
64
  // src/SiteFooter.tsx
63
65
  import Link2 from "next/link";
64
- import { LogoWordmark } from "@dataimago/ui";
66
+ import { Logo as Logo2 } from "@dataimago/ui";
65
67
  import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
66
68
  var DEFAULT_TAGLINE = "A living AI-native application ecosystem.";
67
69
  var DEFAULT_COLUMNS = [
@@ -92,21 +94,12 @@ var DEFAULT_COLUMNS = [
92
94
  external: true
93
95
  }
94
96
  ]
95
- },
96
- {
97
- heading: "Legacy",
98
- links: [
99
- { label: "super-alignment" },
100
- { label: "human-centered ai" },
101
- { label: "critical transformation" }
102
- ]
103
97
  }
104
98
  ];
105
- var DEFAULT_CLOSING = '"dataimago is the instantiation of critical theory in software."';
106
99
  function SiteFooter({
107
100
  tagline = DEFAULT_TAGLINE,
108
101
  columns = DEFAULT_COLUMNS,
109
- closingStatement = DEFAULT_CLOSING
102
+ closingStatement
110
103
  }) {
111
104
  return /* @__PURE__ */ jsx2(
112
105
  "footer",
@@ -116,14 +109,27 @@ function SiteFooter({
116
109
  children: /* @__PURE__ */ jsxs2("div", { className: "mx-auto max-w-6xl px-6 py-12", children: [
117
110
  /* @__PURE__ */ jsxs2("div", { className: "grid gap-8 md:grid-cols-4", children: [
118
111
  /* @__PURE__ */ jsxs2("div", { children: [
119
- /* @__PURE__ */ jsxs2(Link2, { href: "/", className: "inline-flex items-center gap-1.5", children: [
120
- /* @__PURE__ */ jsx2(LogoWordmark, { className: "w-32 sm:w-36", "aria-label": "dataimago" }),
121
- /* @__PURE__ */ jsx2("span", { className: "font-mono text-xs text-stone-500", children: ".ai" })
122
- ] }),
112
+ /* @__PURE__ */ jsx2(
113
+ Link2,
114
+ {
115
+ href: "/",
116
+ className: "inline-flex items-center text-stone-100 transition hover:opacity-80",
117
+ "aria-label": "dataimago",
118
+ children: /* @__PURE__ */ jsx2(
119
+ Logo2,
120
+ {
121
+ name: "dataimago",
122
+ variant: "PATH",
123
+ "aria-hidden": true,
124
+ className: "[&_svg]:h-7 [&_svg]:w-auto"
125
+ }
126
+ )
127
+ }
128
+ ),
123
129
  /* @__PURE__ */ jsx2("p", { className: "mt-3 text-xs text-stone-400", children: tagline })
124
130
  ] }),
125
131
  columns.map((col) => /* @__PURE__ */ jsxs2("div", { children: [
126
- /* @__PURE__ */ jsx2("h4", { className: "font-mono text-xs uppercase tracking-wider text-accent-500", children: col.heading }),
132
+ /* @__PURE__ */ jsx2("h4", { className: "font-mono text-xs uppercase tracking-wider text-accent-300", children: col.heading }),
127
133
  /* @__PURE__ */ jsx2("ul", { className: "mt-3 space-y-2 text-sm", children: col.links.map(({ href, label, external }) => /* @__PURE__ */ jsx2("li", { children: !href ? label : external ? /* @__PURE__ */ jsx2(
128
134
  "a",
129
135
  {
@@ -136,14 +142,80 @@ function SiteFooter({
136
142
  ) : /* @__PURE__ */ jsx2(Link2, { href, className: "hover:text-paper-100", children: label }) }, label)) })
137
143
  ] }, col.heading))
138
144
  ] }),
139
- /* @__PURE__ */ jsx2("div", { className: "mt-12 border-t border-stone-800 pt-6 text-xs text-stone-400", children: /* @__PURE__ */ jsx2("p", { children: closingStatement }) })
145
+ closingStatement ? /* @__PURE__ */ jsx2("div", { className: "mt-12 border-t border-stone-800 pt-6 text-xs text-stone-400", children: /* @__PURE__ */ jsx2("p", { children: closingStatement }) }) : null
140
146
  ] })
141
147
  }
142
148
  );
143
149
  }
144
150
 
145
- // src/PhilosophyFooter.tsx
151
+ // src/MinimalFooter.tsx
152
+ import Link3 from "next/link";
153
+ import { Logo as Logo3 } from "@dataimago/ui";
146
154
  import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
155
+ var DEFAULT_BRAND_HREF = "https://dataimago.ai";
156
+ var DEFAULT_EMBODIMENT = "An embodiment of dataimago";
157
+ function MinimalFooter({
158
+ brandHref = DEFAULT_BRAND_HREF,
159
+ embodimentLabel = DEFAULT_EMBODIMENT,
160
+ links = [],
161
+ copyright
162
+ }) {
163
+ return /* @__PURE__ */ jsx3(
164
+ "footer",
165
+ {
166
+ className: "border-t border-stone-800 bg-stone-900 text-stone-400",
167
+ "data-bs-theme": "dark",
168
+ children: /* @__PURE__ */ jsxs3("div", { className: "mx-auto flex max-w-6xl flex-col items-center gap-4 px-6 py-10 text-center", children: [
169
+ /* @__PURE__ */ jsxs3(
170
+ "a",
171
+ {
172
+ href: brandHref,
173
+ className: "inline-flex flex-col items-center gap-2 text-stone-100 transition hover:opacity-80",
174
+ target: "_blank",
175
+ rel: "noreferrer",
176
+ "aria-label": `${embodimentLabel} \u2014 visit dataimago.ai`,
177
+ children: [
178
+ /* @__PURE__ */ jsx3(
179
+ Logo3,
180
+ {
181
+ name: "dataimago",
182
+ variant: "PATH",
183
+ "aria-hidden": true,
184
+ className: "[&_svg]:h-7 [&_svg]:w-auto"
185
+ }
186
+ ),
187
+ /* @__PURE__ */ jsx3("span", { className: "text-sm text-stone-400", children: embodimentLabel })
188
+ ]
189
+ }
190
+ ),
191
+ links.length > 0 ? /* @__PURE__ */ jsx3(
192
+ "nav",
193
+ {
194
+ className: "flex flex-wrap items-center justify-center gap-x-6 gap-y-2 text-sm",
195
+ "aria-label": "Footer",
196
+ children: links.map(
197
+ ({ href, label, external }) => !href ? /* @__PURE__ */ jsx3("span", { className: "text-stone-400", children: label }, label) : external ? /* @__PURE__ */ jsx3(
198
+ "a",
199
+ {
200
+ href,
201
+ className: "text-stone-300 hover:text-paper-100",
202
+ target: "_blank",
203
+ rel: "noreferrer",
204
+ children: label
205
+ },
206
+ label
207
+ ) : /* @__PURE__ */ jsx3(Link3, { href, className: "text-stone-300 hover:text-paper-100", children: label }, label)
208
+ )
209
+ }
210
+ ) : null,
211
+ copyright ? /* @__PURE__ */ jsx3("p", { className: "text-xs text-stone-400", children: copyright }) : null
212
+ ] })
213
+ }
214
+ );
215
+ }
216
+
217
+ // src/PhilosophyFooter.tsx
218
+ import { jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
147
219
  var DEFAULT_PAIRS = [
148
220
  {
149
221
  eyebrow: "our belief",
@@ -164,47 +236,48 @@ var DEFAULT_QUOTE = {
164
236
  work: "Xerox and Infinity",
165
237
  year: 1988
166
238
  };
167
- var DEFAULT_CLOSING2 = "dataimago is the structural answer to this critique. Every architectural choice \u2014 R as source of truth, editorial authority with the domain expert, the non-destructive retrofit principle, the ecosystem-as-commons \u2014 refuses to release the scholar from responsibility to their own knowledge. The AI serves the culture; the culture governs the AI.";
239
+ var DEFAULT_CLOSING = "dataimago is the structural answer to this critique. Every architectural choice \u2014 R as source of truth, editorial authority with the domain expert, the non-destructive retrofit principle, the ecosystem-as-commons \u2014 refuses to release the scholar from responsibility to their own knowledge. The AI serves the culture; the culture governs the AI.";
168
240
  function PhilosophyFooter({
169
241
  pairs = DEFAULT_PAIRS,
170
242
  quote = DEFAULT_QUOTE,
171
- closingStatement = DEFAULT_CLOSING2
243
+ closingStatement = DEFAULT_CLOSING
172
244
  }) {
173
- return /* @__PURE__ */ jsx3(
245
+ return /* @__PURE__ */ jsx4(
174
246
  "section",
175
247
  {
176
248
  "aria-labelledby": "philosophy-heading",
177
249
  className: "border-t border-stone-200 bg-stone-900 py-20 text-paper-100 sm:py-28",
178
- children: /* @__PURE__ */ jsxs3("div", { className: "mx-auto max-w-6xl px-6", children: [
179
- /* @__PURE__ */ jsx3("div", { className: "grid gap-12 lg:grid-cols-3", children: pairs.map((pair, i) => /* @__PURE__ */ jsxs3("div", { children: [
180
- /* @__PURE__ */ jsx3("p", { className: "font-mono text-xs uppercase tracking-wider text-accent-500", children: pair.eyebrow }),
181
- i === 0 ? /* @__PURE__ */ jsx3(
250
+ children: /* @__PURE__ */ jsxs4("div", { className: "mx-auto max-w-6xl px-6", children: [
251
+ /* @__PURE__ */ jsx4("div", { className: "grid gap-12 lg:grid-cols-3", children: pairs.map((pair, i) => /* @__PURE__ */ jsxs4("div", { children: [
252
+ /* @__PURE__ */ jsx4("p", { className: "font-mono text-xs uppercase tracking-wider text-accent-500", children: pair.eyebrow }),
253
+ i === 0 ? /* @__PURE__ */ jsx4(
182
254
  "h3",
183
255
  {
184
256
  id: "philosophy-heading",
185
257
  className: "mt-2 font-display text-xl text-paper-100",
186
258
  children: pair.body
187
259
  }
188
- ) : /* @__PURE__ */ jsx3("p", { className: "mt-2 font-display text-xl text-paper-100", children: pair.body })
260
+ ) : /* @__PURE__ */ jsx4("p", { className: "mt-2 font-display text-xl text-paper-100", children: pair.body })
189
261
  ] }, i)) }),
190
- /* @__PURE__ */ jsxs3("blockquote", { className: "mt-16 max-w-prose-wide border-l-2 border-copper-500 pl-6 font-display italic text-paper-100", children: [
191
- /* @__PURE__ */ jsx3("p", { className: "text-base leading-relaxed", children: quote.text }),
192
- /* @__PURE__ */ jsxs3("footer", { className: "mt-4 text-sm not-italic text-stone-400", children: [
262
+ /* @__PURE__ */ jsxs4("blockquote", { className: "mt-16 max-w-prose-wide border-l-2 border-copper-500 pl-6 font-display italic text-paper-100", children: [
263
+ /* @__PURE__ */ jsx4("p", { className: "text-base leading-relaxed", children: quote.text }),
264
+ /* @__PURE__ */ jsxs4("footer", { className: "mt-4 text-sm not-italic text-stone-400", children: [
193
265
  "\u2014 ",
194
266
  quote.attribution,
195
267
  ", ",
196
- /* @__PURE__ */ jsx3("cite", { children: quote.work }),
268
+ /* @__PURE__ */ jsx4("cite", { children: quote.work }),
197
269
  " (",
198
270
  quote.year,
199
271
  ")"
200
272
  ] })
201
273
  ] }),
202
- /* @__PURE__ */ jsx3("p", { className: "mt-8 max-w-prose-wide text-sm text-stone-400", children: closingStatement })
274
+ /* @__PURE__ */ jsx4("p", { className: "mt-8 max-w-prose-wide text-sm text-stone-400", children: closingStatement })
203
275
  ] })
204
276
  }
205
277
  );
206
278
  }
207
279
  export {
280
+ MinimalFooter,
208
281
  PhilosophyFooter,
209
282
  PlatformNav,
210
283
  SiteFooter
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/PlatformNav.tsx","../src/SiteFooter.tsx","../src/PhilosophyFooter.tsx"],"sourcesContent":["'use client';\n\nimport Link from 'next/link';\nimport { LogoMonogramBg } from '@dataimago/ui';\nimport type { PlatformNavProps } from './types';\n\n/**\n * Platform navigation — sticky header with logo + nav link cluster.\n *\n * Iteration-2-tail (Plan A, 2026-05-07):\n * The wordmark is the LogoMonogramBg badge — the 'ai' SVG monogram on a\n * sky-blue rounded accent backplate sourced from @dataimago/ui — paired\n * with a \".ai\" mono span. Hover shifts the backplate from accent-500 to\n * accent-600 via a scoped CSS-variable override on the Link's group.\n *\n * Extracted from apps/hub into @dataimago/hub-chrome during iteration-3-B.2\n * (2026-05-11) to make the chrome available to Level-2 verticals. The\n * `links` and `cta` props allow per-vertical nav customization; all props\n * 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\nexport function PlatformNav({\n links = DEFAULT_LINKS,\n cta = DEFAULT_CTA,\n navLabel = 'Primary',\n homeHref = '/',\n}: PlatformNavProps) {\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 <Link\n href={homeHref}\n className=\"group flex items-center gap-1.5 hover:[--color-interactive-accent:#154d6f]\"\n aria-label=\"dataimago.ai home\"\n >\n <LogoMonogramBg\n className=\"h-8 w-8 sm:h-9 sm:w-9\"\n aria-hidden\n title={undefined}\n />\n <span className=\"font-mono text-sm text-stone-500\">.ai</span>\n </Link>\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 </div>\n </nav>\n </header>\n );\n}\n","'use client';\n\nimport Link from 'next/link';\nimport { LogoWordmark } from '@dataimago/ui';\nimport type { SiteFooterProps } from './types';\n\n/**\n * Site footer — dark-surface footer with wordmark + nav column grid.\n *\n * Iteration-2-tail (Plan A, 2026-05-07):\n * The wordmark is the LogoWordmark SVG on a sky-blue backplate, scoped to\n * dark-surface token resolution via data-bs-theme=\"dark\". The backplate\n * resolves to accent-300 (#3498DB) on bg-stone-900 at 5.41:1 AA.\n *\n * Extracted from apps/hub into @dataimago/hub-chrome during iteration-3-B.2\n * (2026-05-11). The `tagline` and `columns` props allow per-vertical\n * customization; all props default to the Level-1 hub configuration.\n *\n * Note (open regression from iteration-2): text-accent-500 column eyebrows\n * render at 2.56:1 on stone-900 because Tailwind's static class binds to the\n * absolute color, not the mode-aware role. Migration to text-accent-300 or a\n * CSS-variable consumer closes the gap. Deferred to iteration-3 candidate.\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 heading: 'Legacy',\n links: [\n { label: 'super-alignment' },\n { label: 'human-centered ai' },\n { label: 'critical transformation' },\n ],\n },\n];\n\nconst DEFAULT_CLOSING =\n '\"dataimago is the instantiation of critical theory in software.\"';\n\nexport function SiteFooter({\n tagline = DEFAULT_TAGLINE,\n columns = DEFAULT_COLUMNS,\n closingStatement = DEFAULT_CLOSING,\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 href=\"/\" className=\"inline-flex items-center gap-1.5\">\n <LogoWordmark className=\"w-32 sm:w-36\" aria-label=\"dataimago\" />\n <span className=\"font-mono text-xs text-stone-500\">.ai</span>\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-500\">\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 <div className=\"mt-12 border-t border-stone-800 pt-6 text-xs text-stone-400\">\n <p>{closingStatement}</p>\n </div>\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","jsx","jsxs","jsx","jsxs","DEFAULT_CLOSING"]}
1
+ {"version":3,"sources":["../src/PlatformNav.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 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 </div>\n </nav>\n </header>\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","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.0",
3
+ "version": "0.2.0-alpha.2",
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": {
@@ -36,13 +36,15 @@
36
36
  "README.md"
37
37
  ],
38
38
  "peerDependencies": {
39
- "@dataimago/ui": ">=0.1.0-alpha.4",
39
+ "@dataimago/brand": ">=0.1.0-alpha.3",
40
+ "@dataimago/ui": ">=0.1.0-alpha.8",
40
41
  "next": ">=14",
41
42
  "react": "^18.2.0",
42
43
  "react-dom": "^18.2.0"
43
44
  },
44
45
  "devDependencies": {
45
- "@dataimago/ui": "^0.1.0-alpha.4",
46
+ "@dataimago/brand": "^0.1.0-alpha.3",
47
+ "@dataimago/ui": "^0.1.0-alpha.8",
46
48
  "@types/react": "^18.2.43",
47
49
  "@types/react-dom": "^18.2.17",
48
50
  "lucide-react": "^0.344.0",