@dataimago/hub-chrome 0.2.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs ADDED
@@ -0,0 +1,251 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/index.ts
31
+ var index_exports = {};
32
+ __export(index_exports, {
33
+ PhilosophyFooter: () => PhilosophyFooter,
34
+ PlatformNav: () => PlatformNav,
35
+ SiteFooter: () => SiteFooter
36
+ });
37
+ module.exports = __toCommonJS(index_exports);
38
+
39
+ // src/PlatformNav.tsx
40
+ var import_link = __toESM(require("next/link"), 1);
41
+ var import_ui = require("@dataimago/ui");
42
+ var import_jsx_runtime = require("react/jsx-runtime");
43
+ var DEFAULT_LINKS = [
44
+ { href: "/ecosystem", label: "Ecosystem" },
45
+ { href: "/philosophy", label: "Philosophy" }
46
+ ];
47
+ var DEFAULT_CTA = { href: "/onboard", label: "Begin" };
48
+ function PlatformNav({
49
+ links = DEFAULT_LINKS,
50
+ cta = DEFAULT_CTA,
51
+ navLabel = "Primary",
52
+ homeHref = "/"
53
+ }) {
54
+ 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
+ "nav",
56
+ {
57
+ className: "mx-auto flex max-w-7xl items-center justify-between px-6 py-4",
58
+ "aria-label": navLabel,
59
+ 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
+ ),
79
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center gap-2 sm:gap-6", children: [
80
+ links.map(
81
+ ({ href, label, external }) => external ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
82
+ "a",
83
+ {
84
+ href,
85
+ className: "btn-ghost hidden sm:inline-flex",
86
+ target: "_blank",
87
+ rel: "noreferrer",
88
+ children: label
89
+ },
90
+ href
91
+ ) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_link.default, { href, className: "btn-ghost hidden sm:inline-flex", children: label }, href)
92
+ ),
93
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_link.default, { href: cta.href, className: "btn-primary", children: cta.label })
94
+ ] })
95
+ ]
96
+ }
97
+ ) });
98
+ }
99
+
100
+ // src/SiteFooter.tsx
101
+ var import_link2 = __toESM(require("next/link"), 1);
102
+ var import_ui2 = require("@dataimago/ui");
103
+ var import_jsx_runtime2 = require("react/jsx-runtime");
104
+ var DEFAULT_TAGLINE = "A living AI-native application ecosystem.";
105
+ var DEFAULT_COLUMNS = [
106
+ {
107
+ heading: "Platform",
108
+ links: [
109
+ { href: "/onboard", label: "Begin a project" },
110
+ { href: "/ecosystem", label: "Ecosystem" },
111
+ { href: "/philosophy", label: "Philosophy" }
112
+ ]
113
+ },
114
+ {
115
+ heading: "Framework",
116
+ links: [
117
+ {
118
+ href: "https://github.com/dataimago/dataimago-design",
119
+ label: "dataimago-design",
120
+ external: true
121
+ },
122
+ {
123
+ href: "https://github.com/dataimago/dataimago-rpkg",
124
+ label: "dataimago-rpkg",
125
+ external: true
126
+ },
127
+ {
128
+ href: "https://github.com/dataimago/dataimago-ai",
129
+ label: "dataimago-ai",
130
+ external: true
131
+ }
132
+ ]
133
+ },
134
+ {
135
+ heading: "Legacy",
136
+ links: [
137
+ { label: "super-alignment" },
138
+ { label: "human-centered ai" },
139
+ { label: "critical transformation" }
140
+ ]
141
+ }
142
+ ];
143
+ var DEFAULT_CLOSING = '"dataimago is the instantiation of critical theory in software."';
144
+ function SiteFooter({
145
+ tagline = DEFAULT_TAGLINE,
146
+ columns = DEFAULT_COLUMNS,
147
+ closingStatement = DEFAULT_CLOSING
148
+ }) {
149
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
150
+ "footer",
151
+ {
152
+ className: "border-t border-stone-800 bg-stone-900 text-stone-400",
153
+ "data-bs-theme": "dark",
154
+ children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "mx-auto max-w-6xl px-6 py-12", children: [
155
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "grid gap-8 md:grid-cols-4", children: [
156
+ /* @__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
+ ] }),
161
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "mt-3 text-xs text-stone-400", children: tagline })
162
+ ] }),
163
+ 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 }),
165
+ /* @__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
+ "a",
167
+ {
168
+ href,
169
+ className: "hover:text-paper-100",
170
+ target: "_blank",
171
+ rel: "noreferrer",
172
+ children: label
173
+ }
174
+ ) : /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_link2.default, { href, className: "hover:text-paper-100", children: label }) }, label)) })
175
+ ] }, col.heading))
176
+ ] }),
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 }) })
178
+ ] })
179
+ }
180
+ );
181
+ }
182
+
183
+ // src/PhilosophyFooter.tsx
184
+ var import_jsx_runtime3 = require("react/jsx-runtime");
185
+ var DEFAULT_PAIRS = [
186
+ {
187
+ eyebrow: "our belief",
188
+ body: "AI can enable virtuous cycles of improvement in the world."
189
+ },
190
+ {
191
+ eyebrow: "our mission",
192
+ body: "The emancipation of humanity through ai super-alignment."
193
+ },
194
+ {
195
+ eyebrow: "our vision",
196
+ body: "Super-alignment embeds ai in culture, not culture in ai."
197
+ }
198
+ ];
199
+ var DEFAULT_QUOTE = {
200
+ 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.`,
201
+ attribution: "Jean Baudrillard",
202
+ work: "Xerox and Infinity",
203
+ year: 1988
204
+ };
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.";
206
+ function PhilosophyFooter({
207
+ pairs = DEFAULT_PAIRS,
208
+ quote = DEFAULT_QUOTE,
209
+ closingStatement = DEFAULT_CLOSING2
210
+ }) {
211
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
212
+ "section",
213
+ {
214
+ "aria-labelledby": "philosophy-heading",
215
+ 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)(
220
+ "h3",
221
+ {
222
+ id: "philosophy-heading",
223
+ className: "mt-2 font-display text-xl text-paper-100",
224
+ children: pair.body
225
+ }
226
+ ) : /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("p", { className: "mt-2 font-display text-xl text-paper-100", children: pair.body })
227
+ ] }, 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: [
231
+ "\u2014 ",
232
+ quote.attribution,
233
+ ", ",
234
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("cite", { children: quote.work }),
235
+ " (",
236
+ quote.year,
237
+ ")"
238
+ ] })
239
+ ] }),
240
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("p", { className: "mt-8 max-w-prose-wide text-sm text-stone-400", children: closingStatement })
241
+ ] })
242
+ }
243
+ );
244
+ }
245
+ // Annotate the CommonJS export names for ESM import in node:
246
+ 0 && (module.exports = {
247
+ PhilosophyFooter,
248
+ PlatformNav,
249
+ SiteFooter
250
+ });
251
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +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"]}
@@ -0,0 +1,100 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ /**
4
+ * @dataimago/hub-chrome — configuration type surface.
5
+ *
6
+ * All props are optional with hub-specific defaults baked into each
7
+ * component. Verticals (dissertation.ai, sgpc.ai, rpkg.ai) override
8
+ * whichever values differ from the hub defaults.
9
+ */
10
+ /** A single navigation link or plain-text label (when href is omitted). */
11
+ interface NavLink {
12
+ /** Omit to render as a non-interactive text label (e.g. legacy items). */
13
+ href?: string;
14
+ label: string;
15
+ /** External links open in a new tab with rel="noreferrer". */
16
+ external?: boolean;
17
+ }
18
+ /** A single column in SiteFooter's nav grid. */
19
+ interface FooterColumn {
20
+ heading: string;
21
+ links: NavLink[];
22
+ }
23
+ /** A belief / mission / vision editorial pair in PhilosophyFooter. */
24
+ interface EditorialPair {
25
+ eyebrow: string;
26
+ body: string;
27
+ }
28
+ /** A pull-quote with full citation metadata. */
29
+ interface PullQuote {
30
+ text: string;
31
+ attribution: string;
32
+ work: string;
33
+ year: number;
34
+ }
35
+ interface PlatformNavProps {
36
+ /**
37
+ * Secondary nav links rendered in the header's right-side cluster.
38
+ * Defaults to the Level-1 hub links: Ecosystem, Philosophy.
39
+ * href is required for navigation links (unlike footer labels).
40
+ */
41
+ links?: (NavLink & {
42
+ href: string;
43
+ })[];
44
+ /**
45
+ * Primary call-to-action button.
46
+ * Defaults to { href: '/onboard', label: 'Begin' }.
47
+ */
48
+ cta?: NavLink & {
49
+ href: string;
50
+ };
51
+ /**
52
+ * Accessible label for the <nav> landmark.
53
+ * Defaults to "Primary".
54
+ */
55
+ navLabel?: string;
56
+ /**
57
+ * href for the logo/home link.
58
+ * Defaults to "/".
59
+ */
60
+ homeHref?: string;
61
+ }
62
+ interface SiteFooterProps {
63
+ /** One-line vertical tagline below the wordmark. */
64
+ tagline?: string;
65
+ /**
66
+ * Nav columns rendered in the footer grid.
67
+ * Defaults to the hub's Platform / Framework / Legacy columns.
68
+ */
69
+ columns?: FooterColumn[];
70
+ /**
71
+ * Closing statement in the dark strip below the nav grid.
72
+ * Defaults to the Baudrillard framing quote from the hub.
73
+ */
74
+ closingStatement?: string;
75
+ }
76
+ interface PhilosophyFooterProps {
77
+ /**
78
+ * The three editorial pairs (belief / mission / vision or equivalent).
79
+ * Defaults to the hub's emancipation-themed trio.
80
+ */
81
+ pairs?: EditorialPair[];
82
+ /**
83
+ * The pull-quote anchoring the section.
84
+ * Defaults to the Baudrillard "Xerox and Infinity" excerpt.
85
+ */
86
+ quote?: PullQuote;
87
+ /**
88
+ * Closing prose paragraph below the pull-quote.
89
+ * Defaults to the hub's dataimago structural-answer paragraph.
90
+ */
91
+ closingStatement?: string;
92
+ }
93
+
94
+ declare function PlatformNav({ links, cta, navLabel, homeHref, }: PlatformNavProps): react_jsx_runtime.JSX.Element;
95
+
96
+ declare function SiteFooter({ tagline, columns, closingStatement, }: SiteFooterProps): react_jsx_runtime.JSX.Element;
97
+
98
+ declare function PhilosophyFooter({ pairs, quote, closingStatement, }: PhilosophyFooterProps): react_jsx_runtime.JSX.Element;
99
+
100
+ export { type EditorialPair, type FooterColumn, type NavLink, PhilosophyFooter, type PhilosophyFooterProps, PlatformNav, type PlatformNavProps, type PullQuote, SiteFooter, type SiteFooterProps };
@@ -0,0 +1,100 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ /**
4
+ * @dataimago/hub-chrome — configuration type surface.
5
+ *
6
+ * All props are optional with hub-specific defaults baked into each
7
+ * component. Verticals (dissertation.ai, sgpc.ai, rpkg.ai) override
8
+ * whichever values differ from the hub defaults.
9
+ */
10
+ /** A single navigation link or plain-text label (when href is omitted). */
11
+ interface NavLink {
12
+ /** Omit to render as a non-interactive text label (e.g. legacy items). */
13
+ href?: string;
14
+ label: string;
15
+ /** External links open in a new tab with rel="noreferrer". */
16
+ external?: boolean;
17
+ }
18
+ /** A single column in SiteFooter's nav grid. */
19
+ interface FooterColumn {
20
+ heading: string;
21
+ links: NavLink[];
22
+ }
23
+ /** A belief / mission / vision editorial pair in PhilosophyFooter. */
24
+ interface EditorialPair {
25
+ eyebrow: string;
26
+ body: string;
27
+ }
28
+ /** A pull-quote with full citation metadata. */
29
+ interface PullQuote {
30
+ text: string;
31
+ attribution: string;
32
+ work: string;
33
+ year: number;
34
+ }
35
+ interface PlatformNavProps {
36
+ /**
37
+ * Secondary nav links rendered in the header's right-side cluster.
38
+ * Defaults to the Level-1 hub links: Ecosystem, Philosophy.
39
+ * href is required for navigation links (unlike footer labels).
40
+ */
41
+ links?: (NavLink & {
42
+ href: string;
43
+ })[];
44
+ /**
45
+ * Primary call-to-action button.
46
+ * Defaults to { href: '/onboard', label: 'Begin' }.
47
+ */
48
+ cta?: NavLink & {
49
+ href: string;
50
+ };
51
+ /**
52
+ * Accessible label for the <nav> landmark.
53
+ * Defaults to "Primary".
54
+ */
55
+ navLabel?: string;
56
+ /**
57
+ * href for the logo/home link.
58
+ * Defaults to "/".
59
+ */
60
+ homeHref?: string;
61
+ }
62
+ interface SiteFooterProps {
63
+ /** One-line vertical tagline below the wordmark. */
64
+ tagline?: string;
65
+ /**
66
+ * Nav columns rendered in the footer grid.
67
+ * Defaults to the hub's Platform / Framework / Legacy columns.
68
+ */
69
+ columns?: FooterColumn[];
70
+ /**
71
+ * Closing statement in the dark strip below the nav grid.
72
+ * Defaults to the Baudrillard framing quote from the hub.
73
+ */
74
+ closingStatement?: string;
75
+ }
76
+ interface PhilosophyFooterProps {
77
+ /**
78
+ * The three editorial pairs (belief / mission / vision or equivalent).
79
+ * Defaults to the hub's emancipation-themed trio.
80
+ */
81
+ pairs?: EditorialPair[];
82
+ /**
83
+ * The pull-quote anchoring the section.
84
+ * Defaults to the Baudrillard "Xerox and Infinity" excerpt.
85
+ */
86
+ quote?: PullQuote;
87
+ /**
88
+ * Closing prose paragraph below the pull-quote.
89
+ * Defaults to the hub's dataimago structural-answer paragraph.
90
+ */
91
+ closingStatement?: string;
92
+ }
93
+
94
+ declare function PlatformNav({ links, cta, navLabel, homeHref, }: PlatformNavProps): react_jsx_runtime.JSX.Element;
95
+
96
+ declare function SiteFooter({ tagline, columns, closingStatement, }: SiteFooterProps): react_jsx_runtime.JSX.Element;
97
+
98
+ declare function PhilosophyFooter({ pairs, quote, closingStatement, }: PhilosophyFooterProps): react_jsx_runtime.JSX.Element;
99
+
100
+ export { type EditorialPair, type FooterColumn, type NavLink, PhilosophyFooter, type PhilosophyFooterProps, PlatformNav, type PlatformNavProps, type PullQuote, SiteFooter, type SiteFooterProps };
package/dist/index.js ADDED
@@ -0,0 +1,212 @@
1
+ // src/PlatformNav.tsx
2
+ import Link from "next/link";
3
+ import { LogoMonogramBg } from "@dataimago/ui";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ var DEFAULT_LINKS = [
6
+ { href: "/ecosystem", label: "Ecosystem" },
7
+ { href: "/philosophy", label: "Philosophy" }
8
+ ];
9
+ var DEFAULT_CTA = { href: "/onboard", label: "Begin" };
10
+ function PlatformNav({
11
+ links = DEFAULT_LINKS,
12
+ cta = DEFAULT_CTA,
13
+ navLabel = "Primary",
14
+ homeHref = "/"
15
+ }) {
16
+ 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
+ "nav",
18
+ {
19
+ className: "mx-auto flex max-w-7xl items-center justify-between px-6 py-4",
20
+ "aria-label": navLabel,
21
+ 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
+ ),
41
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 sm:gap-6", children: [
42
+ links.map(
43
+ ({ href, label, external }) => external ? /* @__PURE__ */ jsx(
44
+ "a",
45
+ {
46
+ href,
47
+ className: "btn-ghost hidden sm:inline-flex",
48
+ target: "_blank",
49
+ rel: "noreferrer",
50
+ children: label
51
+ },
52
+ href
53
+ ) : /* @__PURE__ */ jsx(Link, { href, className: "btn-ghost hidden sm:inline-flex", children: label }, href)
54
+ ),
55
+ /* @__PURE__ */ jsx(Link, { href: cta.href, className: "btn-primary", children: cta.label })
56
+ ] })
57
+ ]
58
+ }
59
+ ) });
60
+ }
61
+
62
+ // src/SiteFooter.tsx
63
+ import Link2 from "next/link";
64
+ import { LogoWordmark } from "@dataimago/ui";
65
+ import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
66
+ var DEFAULT_TAGLINE = "A living AI-native application ecosystem.";
67
+ var DEFAULT_COLUMNS = [
68
+ {
69
+ heading: "Platform",
70
+ links: [
71
+ { href: "/onboard", label: "Begin a project" },
72
+ { href: "/ecosystem", label: "Ecosystem" },
73
+ { href: "/philosophy", label: "Philosophy" }
74
+ ]
75
+ },
76
+ {
77
+ heading: "Framework",
78
+ links: [
79
+ {
80
+ href: "https://github.com/dataimago/dataimago-design",
81
+ label: "dataimago-design",
82
+ external: true
83
+ },
84
+ {
85
+ href: "https://github.com/dataimago/dataimago-rpkg",
86
+ label: "dataimago-rpkg",
87
+ external: true
88
+ },
89
+ {
90
+ href: "https://github.com/dataimago/dataimago-ai",
91
+ label: "dataimago-ai",
92
+ external: true
93
+ }
94
+ ]
95
+ },
96
+ {
97
+ heading: "Legacy",
98
+ links: [
99
+ { label: "super-alignment" },
100
+ { label: "human-centered ai" },
101
+ { label: "critical transformation" }
102
+ ]
103
+ }
104
+ ];
105
+ var DEFAULT_CLOSING = '"dataimago is the instantiation of critical theory in software."';
106
+ function SiteFooter({
107
+ tagline = DEFAULT_TAGLINE,
108
+ columns = DEFAULT_COLUMNS,
109
+ closingStatement = DEFAULT_CLOSING
110
+ }) {
111
+ return /* @__PURE__ */ jsx2(
112
+ "footer",
113
+ {
114
+ className: "border-t border-stone-800 bg-stone-900 text-stone-400",
115
+ "data-bs-theme": "dark",
116
+ children: /* @__PURE__ */ jsxs2("div", { className: "mx-auto max-w-6xl px-6 py-12", children: [
117
+ /* @__PURE__ */ jsxs2("div", { className: "grid gap-8 md:grid-cols-4", children: [
118
+ /* @__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
+ ] }),
123
+ /* @__PURE__ */ jsx2("p", { className: "mt-3 text-xs text-stone-400", children: tagline })
124
+ ] }),
125
+ 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 }),
127
+ /* @__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
+ "a",
129
+ {
130
+ href,
131
+ className: "hover:text-paper-100",
132
+ target: "_blank",
133
+ rel: "noreferrer",
134
+ children: label
135
+ }
136
+ ) : /* @__PURE__ */ jsx2(Link2, { href, className: "hover:text-paper-100", children: label }) }, label)) })
137
+ ] }, col.heading))
138
+ ] }),
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 }) })
140
+ ] })
141
+ }
142
+ );
143
+ }
144
+
145
+ // src/PhilosophyFooter.tsx
146
+ import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
147
+ var DEFAULT_PAIRS = [
148
+ {
149
+ eyebrow: "our belief",
150
+ body: "AI can enable virtuous cycles of improvement in the world."
151
+ },
152
+ {
153
+ eyebrow: "our mission",
154
+ body: "The emancipation of humanity through ai super-alignment."
155
+ },
156
+ {
157
+ eyebrow: "our vision",
158
+ body: "Super-alignment embeds ai in culture, not culture in ai."
159
+ }
160
+ ];
161
+ var DEFAULT_QUOTE = {
162
+ 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.`,
163
+ attribution: "Jean Baudrillard",
164
+ work: "Xerox and Infinity",
165
+ year: 1988
166
+ };
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.";
168
+ function PhilosophyFooter({
169
+ pairs = DEFAULT_PAIRS,
170
+ quote = DEFAULT_QUOTE,
171
+ closingStatement = DEFAULT_CLOSING2
172
+ }) {
173
+ return /* @__PURE__ */ jsx3(
174
+ "section",
175
+ {
176
+ "aria-labelledby": "philosophy-heading",
177
+ 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(
182
+ "h3",
183
+ {
184
+ id: "philosophy-heading",
185
+ className: "mt-2 font-display text-xl text-paper-100",
186
+ children: pair.body
187
+ }
188
+ ) : /* @__PURE__ */ jsx3("p", { className: "mt-2 font-display text-xl text-paper-100", children: pair.body })
189
+ ] }, 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: [
193
+ "\u2014 ",
194
+ quote.attribution,
195
+ ", ",
196
+ /* @__PURE__ */ jsx3("cite", { children: quote.work }),
197
+ " (",
198
+ quote.year,
199
+ ")"
200
+ ] })
201
+ ] }),
202
+ /* @__PURE__ */ jsx3("p", { className: "mt-8 max-w-prose-wide text-sm text-stone-400", children: closingStatement })
203
+ ] })
204
+ }
205
+ );
206
+ }
207
+ export {
208
+ PhilosophyFooter,
209
+ PlatformNav,
210
+ SiteFooter
211
+ };
212
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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"]}
package/package.json ADDED
@@ -0,0 +1,61 @@
1
+ {
2
+ "name": "@dataimago/hub-chrome",
3
+ "version": "0.2.0-alpha.0",
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
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "https://github.com/dataimago/dataimago-ai.git",
9
+ "directory": "packages/hub-chrome"
10
+ },
11
+ "publishConfig": {
12
+ "access": "public",
13
+ "registry": "https://registry.npmjs.org/"
14
+ },
15
+ "keywords": [
16
+ "dataimago",
17
+ "hub-chrome",
18
+ "react",
19
+ "next-js",
20
+ "design-system"
21
+ ],
22
+ "type": "module",
23
+ "main": "./dist/index.cjs",
24
+ "module": "./dist/index.js",
25
+ "types": "./dist/index.d.ts",
26
+ "exports": {
27
+ ".": {
28
+ "types": "./dist/index.d.ts",
29
+ "import": "./dist/index.js",
30
+ "require": "./dist/index.cjs"
31
+ },
32
+ "./package.json": "./package.json"
33
+ },
34
+ "files": [
35
+ "dist",
36
+ "README.md"
37
+ ],
38
+ "peerDependencies": {
39
+ "@dataimago/ui": ">=0.1.0-alpha.4",
40
+ "next": ">=14",
41
+ "react": "^18.2.0",
42
+ "react-dom": "^18.2.0"
43
+ },
44
+ "devDependencies": {
45
+ "@dataimago/ui": "^0.1.0-alpha.4",
46
+ "@types/react": "^18.2.43",
47
+ "@types/react-dom": "^18.2.17",
48
+ "lucide-react": "^0.344.0",
49
+ "next": "^14.1.0",
50
+ "react": "^18.2.0",
51
+ "react-dom": "^18.2.0",
52
+ "tsup": "^8.3.0",
53
+ "typescript": "^5.3.3"
54
+ },
55
+ "scripts": {
56
+ "build": "tsup",
57
+ "dev": "tsup --watch",
58
+ "typecheck": "tsc --noEmit",
59
+ "clean": "rm -rf dist"
60
+ }
61
+ }