@dataimago/hub-chrome 0.2.0-alpha.6 → 0.2.0-alpha.7

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
@@ -41,7 +41,39 @@ module.exports = __toCommonJS(index_exports);
41
41
  // src/PlatformNav.tsx
42
42
  var import_link = __toESM(require("next/link"), 1);
43
43
  var import_ui = require("@dataimago/ui");
44
+
45
+ // src/NewTabIndicator.tsx
44
46
  var import_jsx_runtime = require("react/jsx-runtime");
47
+ var NEW_TAB_SUFFIX = " (opens in a new tab)";
48
+ function NewTabIndicator({ hideText = false }) {
49
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
50
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
51
+ "svg",
52
+ {
53
+ "aria-hidden": "true",
54
+ focusable: "false",
55
+ viewBox: "0 0 24 24",
56
+ width: "0.85em",
57
+ height: "0.85em",
58
+ fill: "none",
59
+ stroke: "currentColor",
60
+ strokeWidth: "2",
61
+ strokeLinecap: "round",
62
+ strokeLinejoin: "round",
63
+ className: "ml-1 inline-block shrink-0 align-baseline",
64
+ children: [
65
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M15 3h6v6" }),
66
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M10 14 21 3" }),
67
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6" })
68
+ ]
69
+ }
70
+ ),
71
+ hideText ? null : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "sr-only", children: NEW_TAB_SUFFIX })
72
+ ] });
73
+ }
74
+
75
+ // src/PlatformNav.tsx
76
+ var import_jsx_runtime2 = require("react/jsx-runtime");
45
77
  var DEFAULT_LINKS = [
46
78
  { href: "/ecosystem", label: "Ecosystem" },
47
79
  { href: "/philosophy", label: "Philosophy" }
@@ -60,18 +92,18 @@ function PlatformNav({
60
92
  navLabel = "Primary",
61
93
  homeHref = "/"
62
94
  }) {
63
- 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 });
95
+ const propertyMark = navbarMark ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui.NavbarLogo, { name: navbarMark, "aria-hidden": true, className: MARK_CLASS }) : /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui.Logo, { name: brandMark, variant: "PATH", "aria-hidden": true, className: MARK_CLASS });
64
96
  const aiHref = typeof aiMonogram === "object" ? aiMonogram.href : void 0;
65
97
  const aiLabel = typeof aiMonogram === "object" ? aiMonogram.label ?? "dataimago" : "dataimago";
66
- 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)(
98
+ return /* @__PURE__ */ (0, import_jsx_runtime2.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_runtime2.jsxs)(
67
99
  "nav",
68
100
  {
69
101
  className: "mx-auto flex max-w-7xl items-center justify-between px-6 py-4",
70
102
  "aria-label": navLabel,
71
103
  children: [
72
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center gap-2 sm:gap-3", children: [
73
- 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" }) })),
74
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
104
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center gap-2 sm:gap-3", children: [
105
+ aiMonogram && (aiHref ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_link.default, { href: aiHref, "aria-label": aiLabel, className: AI_BUTTON_CLASS, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui.NavbarLogo, { name: "ai-monogram", "aria-hidden": true, className: "[&_svg]:h-6 [&_svg]:w-auto" }) }) : /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: AI_BUTTON_CLASS, "aria-hidden": true, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui.NavbarLogo, { name: "ai-monogram", "aria-hidden": true, className: "[&_svg]:h-6 [&_svg]:w-auto" }) })),
106
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
75
107
  import_link.default,
76
108
  {
77
109
  href: homeHref,
@@ -81,21 +113,24 @@ function PlatformNav({
81
113
  }
82
114
  )
83
115
  ] }),
84
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center gap-2 sm:gap-6", children: [
116
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center gap-2 sm:gap-6", children: [
85
117
  links.map(
86
- ({ href, label, external }) => external ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
118
+ ({ href, label, external }) => external ? /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
87
119
  "a",
88
120
  {
89
121
  href,
90
122
  className: "btn-ghost hidden sm:inline-flex",
91
123
  target: "_blank",
92
124
  rel: "noreferrer",
93
- children: label
125
+ children: [
126
+ label,
127
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(NewTabIndicator, {})
128
+ ]
94
129
  },
95
130
  href
96
- ) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_link.default, { href, className: "btn-ghost hidden sm:inline-flex", children: label }, href)
131
+ ) : /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_link.default, { href, className: "btn-ghost hidden sm:inline-flex", children: label }, href)
97
132
  ),
98
- cta && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_link.default, { href: cta.href, className: "btn-primary", children: cta.label }),
133
+ cta && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_link.default, { href: cta.href, className: "btn-primary", children: cta.label }),
99
134
  rightSlot
100
135
  ] })
101
136
  ]
@@ -104,14 +139,14 @@ function PlatformNav({
104
139
  }
105
140
 
106
141
  // src/GitHubNavButton.tsx
107
- var import_jsx_runtime2 = require("react/jsx-runtime");
142
+ var import_jsx_runtime3 = require("react/jsx-runtime");
108
143
  var SHELL = "inline-flex min-h-[48px] items-center gap-2 rounded-xl border border-stone-200 bg-stone-50 px-3 text-stone-900 transition hover:bg-stone-100";
109
144
  var MENU_ITEM = "flex min-h-[48px] w-full items-center rounded px-2 text-left text-sm text-stone-900 transition hover:bg-stone-100";
110
145
  function GithubMark() {
111
- return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("svg", { viewBox: "0 0 24 24", "aria-hidden": "true", className: "h-5 w-5 shrink-0", fill: "currentColor", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("path", { d: "M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23a11.5 11.5 0 0 1 3.003-.404c1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222 0 1.606-.014 2.898-.014 3.293 0 .322.216.694.825.576C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12" }) });
146
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("svg", { viewBox: "0 0 24 24", "aria-hidden": "true", className: "h-5 w-5 shrink-0", fill: "currentColor", children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23a11.5 11.5 0 0 1 3.003-.404c1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222 0 1.606-.014 2.898-.014 3.293 0 .322.216.694.825.576C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12" }) });
112
147
  }
113
148
  function LoginGlyph() {
114
- return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
149
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
115
150
  "svg",
116
151
  {
117
152
  viewBox: "0 0 24 24",
@@ -123,9 +158,9 @@ function LoginGlyph() {
123
158
  strokeLinecap: "round",
124
159
  strokeLinejoin: "round",
125
160
  children: [
126
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("path", { d: "M15 3h4a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-4" }),
127
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("polyline", { points: "10 17 15 12 10 7" }),
128
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("line", { x1: "15", x2: "3", y1: "12", y2: "12" })
161
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M15 3h4a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-4" }),
162
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("polyline", { points: "10 17 15 12 10 7" }),
163
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("line", { x1: "15", x2: "3", y1: "12", y2: "12" })
129
164
  ]
130
165
  }
131
166
  );
@@ -142,33 +177,36 @@ function GitHubNavButton({
142
177
  defaultOpen
143
178
  }) {
144
179
  if (mode === "link") {
145
- return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
180
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
146
181
  "a",
147
182
  {
148
183
  href: orgHref,
149
184
  target: "_blank",
150
185
  rel: "noreferrer",
151
186
  className: SHELL,
152
- "aria-label": "dataimago on GitHub",
153
- children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(GithubMark, {})
187
+ "aria-label": `dataimago on GitHub${NEW_TAB_SUFFIX}`,
188
+ children: [
189
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(GithubMark, {}),
190
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(NewTabIndicator, { hideText: true })
191
+ ]
154
192
  }
155
193
  );
156
194
  }
157
195
  if (status !== "authed") {
158
- return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("a", { href: signInHref, className: SHELL, "aria-label": "Sign in with GitHub", children: [
159
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(GithubMark, {}),
160
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(LoginGlyph, {})
196
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("a", { href: signInHref, className: SHELL, "aria-label": "Sign in with GitHub", children: [
197
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(GithubMark, {}),
198
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(LoginGlyph, {})
161
199
  ] });
162
200
  }
163
- return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("details", { className: "relative", open: defaultOpen, children: [
164
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
201
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("details", { className: "relative", open: defaultOpen, children: [
202
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
165
203
  "summary",
166
204
  {
167
205
  className: `${SHELL} cursor-pointer list-none [&::-webkit-details-marker]:hidden`,
168
206
  "aria-label": `GitHub account \u2014 signed in as ${login ?? "your account"}`,
169
207
  children: [
170
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(GithubMark, {}),
171
- avatarUrl ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
208
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(GithubMark, {}),
209
+ avatarUrl ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
172
210
  "img",
173
211
  {
174
212
  src: avatarUrl,
@@ -177,23 +215,26 @@ function GitHubNavButton({
177
215
  width: 28,
178
216
  height: 28
179
217
  }
180
- ) : /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { className: "text-sm font-medium", children: [
218
+ ) : /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("span", { className: "text-sm font-medium", children: [
181
219
  "@",
182
220
  login
183
221
  ] })
184
222
  ]
185
223
  }
186
224
  ),
187
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "absolute right-0 z-50 mt-2 w-60 rounded-lg border border-stone-200 bg-stone-50 p-2 shadow-lg", children: [
188
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("p", { className: "px-2 py-1 text-sm text-stone-700", children: [
225
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "absolute right-0 z-50 mt-2 w-60 rounded-lg border border-stone-200 bg-stone-50 p-2 shadow-lg", children: [
226
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("p", { className: "px-2 py-1 text-sm text-stone-700", children: [
189
227
  "Signed in as ",
190
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { className: "font-medium text-stone-900", children: [
228
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("span", { className: "font-medium text-stone-900", children: [
191
229
  "@",
192
230
  login
193
231
  ] })
194
232
  ] }),
195
- profileHref && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("a", { href: profileHref, target: "_blank", rel: "noreferrer", className: MENU_ITEM, children: "View your GitHub profile" }),
196
- signOutAction && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("form", { method: "POST", action: signOutAction, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("button", { type: "submit", className: MENU_ITEM, children: "Sign out" }) })
233
+ profileHref && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("a", { href: profileHref, target: "_blank", rel: "noreferrer", className: MENU_ITEM, children: [
234
+ "View your GitHub profile",
235
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(NewTabIndicator, {})
236
+ ] }),
237
+ signOutAction && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("form", { method: "POST", action: signOutAction, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("button", { type: "submit", className: MENU_ITEM, children: "Sign out" }) })
197
238
  ] })
198
239
  ] });
199
240
  }
@@ -201,7 +242,7 @@ function GitHubNavButton({
201
242
  // src/SiteFooter.tsx
202
243
  var import_link2 = __toESM(require("next/link"), 1);
203
244
  var import_ui2 = require("@dataimago/ui");
204
- var import_jsx_runtime3 = require("react/jsx-runtime");
245
+ var import_jsx_runtime4 = require("react/jsx-runtime");
205
246
  var DEFAULT_TAGLINE = "A living AI-native application ecosystem.";
206
247
  var DEFAULT_COLUMNS = [
207
248
  {
@@ -238,21 +279,21 @@ function SiteFooter({
238
279
  columns = DEFAULT_COLUMNS,
239
280
  closingStatement
240
281
  }) {
241
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
282
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
242
283
  "footer",
243
284
  {
244
285
  className: "border-t border-stone-800 bg-stone-900 text-stone-400",
245
286
  "data-bs-theme": "dark",
246
- children: /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "mx-auto max-w-6xl px-6 py-12", children: [
247
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "grid gap-8 md:grid-cols-4", children: [
248
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { children: [
249
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
287
+ children: /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "mx-auto max-w-6xl px-6 py-12", children: [
288
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "grid gap-8 md:grid-cols-4", children: [
289
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { children: [
290
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
250
291
  import_link2.default,
251
292
  {
252
293
  href: "/",
253
294
  className: "inline-flex items-center text-stone-100 transition hover:opacity-80",
254
295
  "aria-label": "dataimago",
255
- children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
296
+ children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
256
297
  import_ui2.Logo,
257
298
  {
258
299
  name: "dataimago",
@@ -263,23 +304,26 @@ function SiteFooter({
263
304
  )
264
305
  }
265
306
  ),
266
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("p", { className: "mt-3 text-xs text-stone-400", children: tagline })
307
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("p", { className: "mt-3 text-xs text-stone-400", children: tagline })
267
308
  ] }),
268
- columns.map((col) => /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { children: [
269
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("h4", { className: "font-mono text-xs uppercase tracking-wider text-accent-300", children: col.heading }),
270
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("ul", { className: "mt-3 space-y-2 text-sm", children: col.links.map(({ href, label, external }) => /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("li", { children: !href ? label : external ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
309
+ columns.map((col) => /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { children: [
310
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("h4", { className: "font-mono text-xs uppercase tracking-wider text-accent-300", children: col.heading }),
311
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("ul", { className: "mt-3 space-y-2 text-sm", children: col.links.map(({ href, label, external }) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("li", { children: !href ? label : external ? /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
271
312
  "a",
272
313
  {
273
314
  href,
274
315
  className: "hover:text-paper-100",
275
316
  target: "_blank",
276
317
  rel: "noreferrer",
277
- children: label
318
+ children: [
319
+ label,
320
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(NewTabIndicator, {})
321
+ ]
278
322
  }
279
- ) : /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_link2.default, { href, className: "hover:text-paper-100", children: label }) }, label)) })
323
+ ) : /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_link2.default, { href, className: "hover:text-paper-100", children: label }) }, label)) })
280
324
  ] }, col.heading))
281
325
  ] }),
282
- closingStatement ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: "mt-12 border-t border-stone-800 pt-6 text-xs text-stone-400", children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("p", { children: closingStatement }) }) : null
326
+ closingStatement ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "mt-12 border-t border-stone-800 pt-6 text-xs text-stone-400", children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("p", { children: closingStatement }) }) : null
283
327
  ] })
284
328
  }
285
329
  );
@@ -288,7 +332,7 @@ function SiteFooter({
288
332
  // src/MinimalFooter.tsx
289
333
  var import_link3 = __toESM(require("next/link"), 1);
290
334
  var import_ui3 = require("@dataimago/ui");
291
- var import_jsx_runtime4 = require("react/jsx-runtime");
335
+ var import_jsx_runtime5 = require("react/jsx-runtime");
292
336
  var DEFAULT_BRAND_HREF = "https://dataimago.ai";
293
337
  var DEFAULT_EMBODIMENT = "An embodiment of dataimago";
294
338
  function MinimalFooter({
@@ -297,22 +341,22 @@ function MinimalFooter({
297
341
  links = [],
298
342
  copyright
299
343
  }) {
300
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
344
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
301
345
  "footer",
302
346
  {
303
347
  className: "border-t border-stone-800 bg-stone-900 text-stone-400",
304
348
  "data-bs-theme": "dark",
305
- children: /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "mx-auto flex max-w-6xl flex-col items-center gap-4 px-6 py-10 text-center", children: [
306
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
349
+ children: /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "mx-auto flex max-w-6xl flex-col items-center gap-4 px-6 py-10 text-center", children: [
350
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
307
351
  "a",
308
352
  {
309
353
  href: brandHref,
310
354
  className: "inline-flex flex-col items-center gap-2 text-stone-100 transition hover:opacity-80",
311
355
  target: "_blank",
312
356
  rel: "noreferrer",
313
- "aria-label": `${embodimentLabel} \u2014 visit dataimago.ai`,
357
+ "aria-label": `${embodimentLabel} \u2014 visit dataimago.ai${NEW_TAB_SUFFIX}`,
314
358
  children: [
315
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
359
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
316
360
  import_ui3.Logo,
317
361
  {
318
362
  name: "dataimago",
@@ -321,38 +365,44 @@ function MinimalFooter({
321
365
  className: "[&_svg]:h-7 [&_svg]:w-auto"
322
366
  }
323
367
  ),
324
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "text-sm text-stone-400", children: embodimentLabel })
368
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("span", { className: "text-sm text-stone-400", children: [
369
+ embodimentLabel,
370
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(NewTabIndicator, { hideText: true })
371
+ ] })
325
372
  ]
326
373
  }
327
374
  ),
328
- links.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
375
+ links.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
329
376
  "nav",
330
377
  {
331
378
  className: "flex flex-wrap items-center justify-center gap-x-6 gap-y-2 text-sm",
332
379
  "aria-label": "Footer",
333
380
  children: links.map(
334
- ({ href, label, external }) => !href ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "text-stone-400", children: label }, label) : external ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
381
+ ({ href, label, external }) => !href ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "text-stone-400", children: label }, label) : external ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
335
382
  "a",
336
383
  {
337
384
  href,
338
385
  className: "text-stone-300 hover:text-paper-100",
339
386
  target: "_blank",
340
387
  rel: "noreferrer",
341
- children: label
388
+ children: [
389
+ label,
390
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(NewTabIndicator, {})
391
+ ]
342
392
  },
343
393
  label
344
- ) : /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_link3.default, { href, className: "text-stone-300 hover:text-paper-100", children: label }, label)
394
+ ) : /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_link3.default, { href, className: "text-stone-300 hover:text-paper-100", children: label }, label)
345
395
  )
346
396
  }
347
397
  ) : null,
348
- copyright ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("p", { className: "text-xs text-stone-400", children: copyright }) : null
398
+ copyright ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "text-xs text-stone-400", children: copyright }) : null
349
399
  ] })
350
400
  }
351
401
  );
352
402
  }
353
403
 
354
404
  // src/PhilosophyFooter.tsx
355
- var import_jsx_runtime5 = require("react/jsx-runtime");
405
+ var import_jsx_runtime6 = require("react/jsx-runtime");
356
406
  var DEFAULT_PAIRS = [
357
407
  {
358
408
  eyebrow: "our belief",
@@ -381,17 +431,17 @@ function PhilosophyFooter({
381
431
  density = "default"
382
432
  }) {
383
433
  const compact = density === "compact";
384
- const pullQuote = /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
434
+ const pullQuote = /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
385
435
  "blockquote",
386
436
  {
387
437
  className: `border-l-2 border-copper-500 pl-6 font-display italic text-paper-100 ${compact ? "" : "mt-16 max-w-prose-wide"}`,
388
438
  children: [
389
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "text-base leading-relaxed", children: quote.text }),
390
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("footer", { className: "mt-4 text-sm not-italic text-stone-400", children: [
439
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "text-base leading-relaxed", children: quote.text }),
440
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("footer", { className: "mt-4 text-sm not-italic text-stone-400", children: [
391
441
  "\u2014 ",
392
442
  quote.attribution,
393
443
  ", ",
394
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("cite", { children: quote.work }),
444
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("cite", { children: quote.work }),
395
445
  " (",
396
446
  quote.year,
397
447
  ")"
@@ -399,41 +449,41 @@ function PhilosophyFooter({
399
449
  ]
400
450
  }
401
451
  );
402
- const closing = /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
452
+ const closing = /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
403
453
  "p",
404
454
  {
405
455
  className: `text-stone-400 ${compact ? "text-base leading-relaxed" : "mt-8 max-w-prose-wide text-sm"}`,
406
456
  children: closingStatement
407
457
  }
408
458
  );
409
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
459
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
410
460
  "section",
411
461
  {
412
462
  "aria-labelledby": "philosophy-heading",
413
463
  className: `border-t border-stone-200 bg-stone-900 text-paper-100 ${compact ? "flex flex-col justify-center py-14 sm:py-16 lg:min-h-[50vh]" : "py-20 sm:py-28"}`,
414
464
  "data-bs-theme": "dark",
415
- children: /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "mx-auto w-full max-w-6xl px-6", children: [
416
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: `grid lg:grid-cols-3 ${compact ? "gap-8" : "gap-12"}`, children: pairs.map((pair, i) => /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { children: [
417
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "font-mono text-xs uppercase tracking-wider text-accent-300", children: pair.eyebrow }),
418
- i === 0 ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
465
+ children: /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "mx-auto w-full max-w-6xl px-6", children: [
466
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: `grid lg:grid-cols-3 ${compact ? "gap-8" : "gap-12"}`, children: pairs.map((pair, i) => /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { children: [
467
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "font-mono text-xs uppercase tracking-wider text-accent-300", children: pair.eyebrow }),
468
+ i === 0 ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
419
469
  "h3",
420
470
  {
421
471
  id: "philosophy-heading",
422
472
  className: "mt-2 font-display text-xl text-paper-100",
423
473
  children: pair.body
424
474
  }
425
- ) : /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "mt-2 font-display text-xl text-paper-100", children: pair.body })
475
+ ) : /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "mt-2 font-display text-xl text-paper-100", children: pair.body })
426
476
  ] }, i)) }),
427
477
  compact ? (
428
478
  // Critique / answer, side by side — Baudrillard's warning and
429
479
  // dataimago's structural answer. Filling the width is what pulls the
430
480
  // section down to ~half height (the default stacks these in one column,
431
481
  // leaving the right half empty).
432
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "mt-10 grid gap-x-12 gap-y-8 lg:grid-cols-2", children: [
482
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "mt-10 grid gap-x-12 gap-y-8 lg:grid-cols-2", children: [
433
483
  pullQuote,
434
484
  closing
435
485
  ] })
436
- ) : /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_jsx_runtime5.Fragment, { children: [
486
+ ) : /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(import_jsx_runtime6.Fragment, { children: [
437
487
  pullQuote,
438
488
  closing
439
489
  ] })
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/PlatformNav.tsx","../src/GitHubNavButton.tsx","../src/SiteFooter.tsx","../src/MinimalFooter.tsx","../src/PhilosophyFooter.tsx"],"sourcesContent":["/**\n * @dataimago/hub-chrome — public surface barrel.\n *\n * All three chrome components are named exports. The original apps/hub\n * versions were default exports; the package exposes them as named exports\n * for tree-shaking and to keep the import surface symmetric with\n * @dataimago/ui and @dataimago/interview.\n */\nexport { PlatformNav } from './PlatformNav';\nexport { GitHubNavButton } from './GitHubNavButton';\nexport { SiteFooter } from './SiteFooter';\nexport { MinimalFooter } from './MinimalFooter';\nexport { PhilosophyFooter } from './PhilosophyFooter';\n\nexport type {\n NavLink,\n FooterColumn,\n EditorialPair,\n PullQuote,\n BrandMark,\n NavbarMark,\n AiMonogram,\n PlatformNavProps,\n GitHubNavButtonProps,\n SiteFooterProps,\n MinimalFooterProps,\n PhilosophyFooterProps,\n} from './types';\n","'use client';\n\nimport Link from 'next/link';\nimport { Logo, NavbarLogo } from '@dataimago/ui';\nimport type { PlatformNavProps } from './types';\n\n/**\n * Platform navigation — sticky header with the property's brand mark + nav cluster.\n *\n * The property mark is rendered by height (so any aspect fits the nav). By default\n * it's the static `@dataimago/brand` wordmark via `<Logo>` (font-free, IoU-locked,\n * `currentColor`). When `navbarMark` is set it becomes the ANIMATED `<NavbarLogo>`\n * (the a/i assemble toggle for L2 marks, lift+wash for L1) — falling back to the\n * static `<Logo brandMark>` otherwise, so pre-navbar consumers are unaffected.\n *\n * `aiMonogram` adds the dataimago `ai-monogram` icon button to the LEFT of the\n * property mark (a 48px touch target; lift+washes to the brand-mark red on hover).\n *\n * Extracted from apps/hub into @dataimago/hub-chrome during iteration-3-B.2\n * (2026-05-11); `navbarMark`/`aiMonogram` added in iteration-4 (the navbar logo\n * system). All props default to the Level-1 hub configuration.\n */\n\nconst DEFAULT_LINKS = [\n { href: '/ecosystem', label: 'Ecosystem' },\n { href: '/philosophy', label: 'Philosophy' },\n];\n\nconst DEFAULT_CTA = { href: '/onboard', label: 'Begin' };\n\n/** Height-based sizing for the property mark (the navbar norm — ~30% larger letters). */\nconst MARK_CLASS = '[&_svg]:h-7 [&_svg]:w-auto sm:[&_svg]:h-8';\n\n/** The optional ai-monogram icon button — a 48px touch target (ready-to-hand floor). */\nconst AI_BUTTON_CLASS =\n 'inline-flex min-h-[48px] min-w-[48px] items-center justify-center rounded-xl ' +\n 'border border-stone-200 bg-stone-50 text-stone-900 transition hover:bg-stone-100';\n\nexport function PlatformNav({\n brandMark = 'dataimago_ai_OVERLAP',\n navbarMark,\n aiMonogram,\n brandLabel = 'dataimago.ai home',\n links = DEFAULT_LINKS,\n cta = DEFAULT_CTA,\n rightSlot,\n navLabel = 'Primary',\n homeHref = '/',\n}: PlatformNavProps) {\n const propertyMark = navbarMark ? (\n <NavbarLogo name={navbarMark} aria-hidden className={MARK_CLASS} />\n ) : (\n <Logo name={brandMark} variant=\"PATH\" aria-hidden className={MARK_CLASS} />\n );\n\n const aiHref = typeof aiMonogram === 'object' ? aiMonogram.href : undefined;\n const aiLabel =\n typeof aiMonogram === 'object' ? (aiMonogram.label ?? 'dataimago') : 'dataimago';\n\n return (\n <header className=\"sticky top-0 z-40 border-b border-stone-200 bg-stone-100/95 backdrop-blur-sm\">\n <nav\n className=\"mx-auto flex max-w-7xl items-center justify-between px-6 py-4\"\n aria-label={navLabel}\n >\n <div className=\"flex items-center gap-2 sm:gap-3\">\n {aiMonogram &&\n (aiHref ? (\n <Link href={aiHref} aria-label={aiLabel} className={AI_BUTTON_CLASS}>\n <NavbarLogo name=\"ai-monogram\" aria-hidden className=\"[&_svg]:h-6 [&_svg]:w-auto\" />\n </Link>\n ) : (\n <span className={AI_BUTTON_CLASS} aria-hidden>\n <NavbarLogo name=\"ai-monogram\" aria-hidden className=\"[&_svg]:h-6 [&_svg]:w-auto\" />\n </span>\n ))}\n <Link\n href={homeHref}\n className=\"inline-flex min-h-[48px] items-center text-stone-900 transition hover:opacity-80\"\n aria-label={brandLabel}\n >\n {propertyMark}\n </Link>\n </div>\n\n <div className=\"flex items-center gap-2 sm:gap-6\">\n {links.map(({ href, label, external }) =>\n external ? (\n <a\n key={href}\n href={href}\n className=\"btn-ghost hidden sm:inline-flex\"\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {label}\n </a>\n ) : (\n <Link key={href} href={href} className=\"btn-ghost hidden sm:inline-flex\">\n {label}\n </Link>\n )\n )}\n {cta && (\n <Link href={cta.href} className=\"btn-primary\">\n {cta.label}\n </Link>\n )}\n {rightSlot}\n </div>\n </nav>\n </header>\n );\n}\n","import type { GitHubNavButtonProps } from './types';\n\n/**\n * The unified GitHub account control for the nav's right slot — the canonical\n * login affordance + login-state indicator shared across every L1/L2 dataimago\n * app (rendered into `PlatformNav`'s `rightSlot`).\n *\n * Fully presentational and **stateless** — it reads no auth itself; the consumer\n * feeds it. Uses a native `<details>` disclosure for the signed-in menu, so it\n * needs no client JS and works whether rendered on the server (a server parent\n * injecting the avatar) or the client.\n *\n * - `mode=\"auth\"` (default): the login-state indicator.\n * - `status=\"unauthed\"` → a GET link to `signInHref` (start OAuth) showing the\n * GitHub mark + a login glyph.\n * - `status=\"authed\"` → the GitHub mark + the user's avatar, opening a menu\n * (profile link + a POST sign-out form to `signOutAction`).\n * - `mode=\"link\"`: a plain GitHub→`orgHref` link (L1, which has no auth).\n *\n * Icons are inlined (the GitHub mark + a lucide-style \"log-in\" glyph) to keep the\n * shared package free of an icon-library peer dependency.\n */\n\n// The 48px touch-target floor (the ready-to-hand dignity gate); colours resolve\n// from the consuming app's dataimago palette. The global `*:focus-visible` rule\n// supplies the focus ring.\nconst SHELL =\n 'inline-flex min-h-[48px] items-center gap-2 rounded-xl border border-stone-200 ' +\n 'bg-stone-50 px-3 text-stone-900 transition hover:bg-stone-100';\n\nconst MENU_ITEM =\n 'flex min-h-[48px] w-full items-center rounded px-2 text-left text-sm ' +\n 'text-stone-900 transition hover:bg-stone-100';\n\nfunction GithubMark() {\n return (\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" className=\"h-5 w-5 shrink-0\" fill=\"currentColor\">\n <path d=\"M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23a11.5 11.5 0 0 1 3.003-.404c1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222 0 1.606-.014 2.898-.014 3.293 0 .322.216.694.825.576C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12\" />\n </svg>\n );\n}\n\nfunction LoginGlyph() {\n // lucide \"log-in\" (ISC), inlined.\n return (\n <svg\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n className=\"h-5 w-5 shrink-0\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M15 3h4a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-4\" />\n <polyline points=\"10 17 15 12 10 7\" />\n <line x1=\"15\" x2=\"3\" y1=\"12\" y2=\"12\" />\n </svg>\n );\n}\n\nexport function GitHubNavButton({\n mode = 'auth',\n status = 'unauthed',\n login,\n avatarUrl,\n signInHref,\n profileHref,\n signOutAction,\n orgHref,\n defaultOpen,\n}: GitHubNavButtonProps) {\n // L1 mode: a plain GitHub→org link (no auth).\n if (mode === 'link') {\n return (\n <a\n href={orgHref}\n target=\"_blank\"\n rel=\"noreferrer\"\n className={SHELL}\n aria-label=\"dataimago on GitHub\"\n >\n <GithubMark />\n </a>\n );\n }\n\n // Signed out: a GET link that starts the OAuth flow.\n if (status !== 'authed') {\n return (\n <a href={signInHref} className={SHELL} aria-label=\"Sign in with GitHub\">\n <GithubMark />\n <LoginGlyph />\n </a>\n );\n }\n\n // Signed in: the GitHub mark + the user's avatar, with a native-disclosure menu.\n return (\n <details className=\"relative\" open={defaultOpen}>\n <summary\n className={`${SHELL} cursor-pointer list-none [&::-webkit-details-marker]:hidden`}\n aria-label={`GitHub account — signed in as ${login ?? 'your account'}`}\n >\n <GithubMark />\n {avatarUrl ? (\n <img\n src={avatarUrl}\n alt=\"\"\n className=\"h-7 w-7 rounded-full border border-stone-200\"\n width={28}\n height={28}\n />\n ) : (\n <span className=\"text-sm font-medium\">@{login}</span>\n )}\n </summary>\n <div className=\"absolute right-0 z-50 mt-2 w-60 rounded-lg border border-stone-200 bg-stone-50 p-2 shadow-lg\">\n <p className=\"px-2 py-1 text-sm text-stone-700\">\n Signed in as <span className=\"font-medium text-stone-900\">@{login}</span>\n </p>\n {profileHref && (\n <a href={profileHref} target=\"_blank\" rel=\"noreferrer\" className={MENU_ITEM}>\n View your GitHub profile\n </a>\n )}\n {signOutAction && (\n <form method=\"POST\" action={signOutAction}>\n <button type=\"submit\" className={MENU_ITEM}>\n Sign out\n </button>\n </form>\n )}\n </div>\n </details>\n );\n}\n","'use client';\n\nimport Link from 'next/link';\nimport { Logo } from '@dataimago/ui';\nimport type { SiteFooterProps } from './types';\n\n/**\n * Site footer — the Level-1 hub footer: dark surface, dataimago wordmark + a\n * trimmed nav column grid.\n *\n * The wordmark is the `dataimago` brand mark via `<Logo>` (font-free, in a light\n * `currentColor` on the dark surface) — no backplate, no hardcoded \".ai\" span.\n *\n * Extracted from apps/hub into @dataimago/hub-chrome during iteration-3-B.2\n * (2026-05-11). The defaults drop the former \"Legacy\" column + the critical-theory\n * closing statement (the philosophical-basis editorial lives on the PhilosophyFooter,\n * which is Level-1-only). Level-2 verticals use `MinimalFooter` instead.\n */\n\nconst DEFAULT_TAGLINE = 'A living AI-native application ecosystem.';\n\nconst DEFAULT_COLUMNS = [\n {\n heading: 'Platform',\n links: [\n { href: '/onboard', label: 'Begin a project' },\n { href: '/ecosystem', label: 'Ecosystem' },\n { href: '/philosophy', label: 'Philosophy' },\n ],\n },\n {\n heading: 'Framework',\n links: [\n {\n href: 'https://github.com/dataimago/dataimago-design',\n label: 'dataimago-design',\n external: true,\n },\n {\n href: 'https://github.com/dataimago/dataimago',\n label: 'dataimago',\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): eyebrows were meant to resolve to\n * sky-blue accent-300 (#3498DB) on this dark surface via mode-aware mapping —\n * 5.41:1 on stone-900. The static Tailwind class `text-accent-500` binds the\n * absolute color instead (~2.56:1). 2026-09-05: eyebrows match SiteFooter\n * (`text-accent-300` + `data-bs-theme=\"dark\"`). The border-copper-500\n * blockquote frame survives untouched. \"Two warmths\" coexist: cool sky-blue\n * on editorial eyebrows, warm copper on the 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 density = 'default',\n}: PhilosophyFooterProps) {\n const compact = density === 'compact';\n\n // Pull-quote — border-copper-500 PRESERVED: decorative-emphasis blockquote\n // frame per iteration-1 §5.2 preserved-decorative-copper governance.\n const pullQuote = (\n <blockquote\n className={`border-l-2 border-copper-500 pl-6 font-display italic text-paper-100 ${\n compact ? '' : 'mt-16 max-w-prose-wide'\n }`}\n >\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\n const closing = (\n <p\n className={`text-stone-400 ${\n compact ? 'text-base leading-relaxed' : 'mt-8 max-w-prose-wide text-sm'\n }`}\n >\n {closingStatement}\n </p>\n );\n\n return (\n <section\n aria-labelledby=\"philosophy-heading\"\n className={`border-t border-stone-200 bg-stone-900 text-paper-100 ${\n compact\n ? 'flex flex-col justify-center py-14 sm:py-16 lg:min-h-[50vh]'\n : 'py-20 sm:py-28'\n }`}\n data-bs-theme=\"dark\"\n >\n <div className=\"mx-auto w-full max-w-6xl px-6\">\n <div className={`grid lg:grid-cols-3 ${compact ? 'gap-8' : 'gap-12'}`}>\n {pairs.map((pair, i) => (\n <div key={i}>\n <p className=\"font-mono text-xs uppercase tracking-wider text-accent-300\">\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 {compact ? (\n // Critique / answer, side by side — Baudrillard's warning and\n // dataimago's structural answer. Filling the width is what pulls the\n // section down to ~half height (the default stacks these in one column,\n // leaving the right half empty).\n <div className=\"mt-10 grid gap-x-12 gap-y-8 lg:grid-cols-2\">\n {pullQuote}\n {closing}\n </div>\n ) : (\n <>\n {pullQuote}\n {closing}\n </>\n )}\n </div>\n </section>\n );\n}\n"],"mappings":"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","names":["Link","import_jsx_runtime","import_link","import_ui","import_jsx_runtime","Link","import_link","import_ui","import_jsx_runtime","Link","import_jsx_runtime"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/PlatformNav.tsx","../src/NewTabIndicator.tsx","../src/GitHubNavButton.tsx","../src/SiteFooter.tsx","../src/MinimalFooter.tsx","../src/PhilosophyFooter.tsx"],"sourcesContent":["/**\n * @dataimago/hub-chrome — public surface barrel.\n *\n * All three chrome components are named exports. The original apps/hub\n * versions were default exports; the package exposes them as named exports\n * for tree-shaking and to keep the import surface symmetric with\n * @dataimago/ui and @dataimago/interview.\n */\nexport { PlatformNav } from './PlatformNav';\nexport { GitHubNavButton } from './GitHubNavButton';\nexport { SiteFooter } from './SiteFooter';\nexport { MinimalFooter } from './MinimalFooter';\nexport { PhilosophyFooter } from './PhilosophyFooter';\n\nexport type {\n NavLink,\n FooterColumn,\n EditorialPair,\n PullQuote,\n BrandMark,\n NavbarMark,\n AiMonogram,\n PlatformNavProps,\n GitHubNavButtonProps,\n SiteFooterProps,\n MinimalFooterProps,\n PhilosophyFooterProps,\n} from './types';\n","'use client';\n\nimport Link from 'next/link';\nimport { Logo, NavbarLogo } from '@dataimago/ui';\nimport type { PlatformNavProps } from './types';\nimport { NewTabIndicator } from './NewTabIndicator';\n\n/**\n * Platform navigation — sticky header with the property's brand mark + nav cluster.\n *\n * The property mark is rendered by height (so any aspect fits the nav). By default\n * it's the static `@dataimago/brand` wordmark via `<Logo>` (font-free, IoU-locked,\n * `currentColor`). When `navbarMark` is set it becomes the ANIMATED `<NavbarLogo>`\n * (the a/i assemble toggle for L2 marks, lift+wash for L1) — falling back to the\n * static `<Logo brandMark>` otherwise, so pre-navbar consumers are unaffected.\n *\n * `aiMonogram` adds the dataimago `ai-monogram` icon button to the LEFT of the\n * property mark (a 48px touch target; lift+washes to the brand-mark red on hover).\n *\n * Extracted from apps/hub into @dataimago/hub-chrome during iteration-3-B.2\n * (2026-05-11); `navbarMark`/`aiMonogram` added in iteration-4 (the navbar logo\n * system). All props default to the Level-1 hub configuration.\n */\n\nconst DEFAULT_LINKS = [\n { href: '/ecosystem', label: 'Ecosystem' },\n { href: '/philosophy', label: 'Philosophy' },\n];\n\nconst DEFAULT_CTA = { href: '/onboard', label: 'Begin' };\n\n/** Height-based sizing for the property mark (the navbar norm — ~30% larger letters). */\nconst MARK_CLASS = '[&_svg]:h-7 [&_svg]:w-auto sm:[&_svg]:h-8';\n\n/** The optional ai-monogram icon button — a 48px touch target (ready-to-hand floor). */\nconst AI_BUTTON_CLASS =\n 'inline-flex min-h-[48px] min-w-[48px] items-center justify-center rounded-xl ' +\n 'border border-stone-200 bg-stone-50 text-stone-900 transition hover:bg-stone-100';\n\nexport function PlatformNav({\n brandMark = 'dataimago_ai_OVERLAP',\n navbarMark,\n aiMonogram,\n brandLabel = 'dataimago.ai home',\n links = DEFAULT_LINKS,\n cta = DEFAULT_CTA,\n rightSlot,\n navLabel = 'Primary',\n homeHref = '/',\n}: PlatformNavProps) {\n const propertyMark = navbarMark ? (\n <NavbarLogo name={navbarMark} aria-hidden className={MARK_CLASS} />\n ) : (\n <Logo name={brandMark} variant=\"PATH\" aria-hidden className={MARK_CLASS} />\n );\n\n const aiHref = typeof aiMonogram === 'object' ? aiMonogram.href : undefined;\n const aiLabel =\n typeof aiMonogram === 'object' ? (aiMonogram.label ?? 'dataimago') : 'dataimago';\n\n return (\n <header className=\"sticky top-0 z-40 border-b border-stone-200 bg-stone-100/95 backdrop-blur-sm\">\n <nav\n className=\"mx-auto flex max-w-7xl items-center justify-between px-6 py-4\"\n aria-label={navLabel}\n >\n <div className=\"flex items-center gap-2 sm:gap-3\">\n {aiMonogram &&\n (aiHref ? (\n <Link href={aiHref} aria-label={aiLabel} className={AI_BUTTON_CLASS}>\n <NavbarLogo name=\"ai-monogram\" aria-hidden className=\"[&_svg]:h-6 [&_svg]:w-auto\" />\n </Link>\n ) : (\n <span className={AI_BUTTON_CLASS} aria-hidden>\n <NavbarLogo name=\"ai-monogram\" aria-hidden className=\"[&_svg]:h-6 [&_svg]:w-auto\" />\n </span>\n ))}\n <Link\n href={homeHref}\n className=\"inline-flex min-h-[48px] items-center text-stone-900 transition hover:opacity-80\"\n aria-label={brandLabel}\n >\n {propertyMark}\n </Link>\n </div>\n\n <div className=\"flex items-center gap-2 sm:gap-6\">\n {links.map(({ href, label, external }) =>\n external ? (\n <a\n key={href}\n href={href}\n className=\"btn-ghost hidden sm:inline-flex\"\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {label}\n <NewTabIndicator />\n </a>\n ) : (\n <Link key={href} href={href} className=\"btn-ghost hidden sm:inline-flex\">\n {label}\n </Link>\n )\n )}\n {cta && (\n <Link href={cta.href} className=\"btn-primary\">\n {cta.label}\n </Link>\n )}\n {rightSlot}\n </div>\n </nav>\n </header>\n );\n}\n","/**\n * Disclosure for links that open in a new tab (WCAG 3.2.5), shared by every\n * `target=\"_blank\"` link in this package so sighted and screen-reader users get\n * the same warning.\n *\n * - Sighted: a small \"arrow out of a box\" glyph after the link content.\n * - Screen reader: the visually hidden text \"(opens in a new tab)\", appended to\n * the link's accessible name. For a link that sets `aria-label` (which\n * replaces its content in the name), append `NEW_TAB_SUFFIX` to the label\n * instead and pass `hideText` so the name is not announced twice.\n */\nexport const NEW_TAB_SUFFIX = ' (opens in a new tab)';\n\nexport function NewTabIndicator({ hideText = false }: { hideText?: boolean }) {\n return (\n <>\n <svg\n aria-hidden=\"true\"\n focusable=\"false\"\n viewBox=\"0 0 24 24\"\n width=\"0.85em\"\n height=\"0.85em\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"ml-1 inline-block shrink-0 align-baseline\"\n >\n <path d=\"M15 3h6v6\" />\n <path d=\"M10 14 21 3\" />\n <path d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\" />\n </svg>\n {hideText ? null : <span className=\"sr-only\">{NEW_TAB_SUFFIX}</span>}\n </>\n );\n}\n","import type { GitHubNavButtonProps } from './types';\nimport { NEW_TAB_SUFFIX, NewTabIndicator } from './NewTabIndicator';\n\n/**\n * The unified GitHub account control for the nav's right slot — the canonical\n * login affordance + login-state indicator shared across every L1/L2 dataimago\n * app (rendered into `PlatformNav`'s `rightSlot`).\n *\n * Fully presentational and **stateless** — it reads no auth itself; the consumer\n * feeds it. Uses a native `<details>` disclosure for the signed-in menu, so it\n * needs no client JS and works whether rendered on the server (a server parent\n * injecting the avatar) or the client.\n *\n * - `mode=\"auth\"` (default): the login-state indicator.\n * - `status=\"unauthed\"` → a GET link to `signInHref` (start OAuth) showing the\n * GitHub mark + a login glyph.\n * - `status=\"authed\"` → the GitHub mark + the user's avatar, opening a menu\n * (profile link + a POST sign-out form to `signOutAction`).\n * - `mode=\"link\"`: a plain GitHub→`orgHref` link (L1, which has no auth).\n *\n * Icons are inlined (the GitHub mark + a lucide-style \"log-in\" glyph) to keep the\n * shared package free of an icon-library peer dependency.\n */\n\n// The 48px touch-target floor (the ready-to-hand dignity gate); colours resolve\n// from the consuming app's dataimago palette. The global `*:focus-visible` rule\n// supplies the focus ring.\nconst SHELL =\n 'inline-flex min-h-[48px] items-center gap-2 rounded-xl border border-stone-200 ' +\n 'bg-stone-50 px-3 text-stone-900 transition hover:bg-stone-100';\n\nconst MENU_ITEM =\n 'flex min-h-[48px] w-full items-center rounded px-2 text-left text-sm ' +\n 'text-stone-900 transition hover:bg-stone-100';\n\nfunction GithubMark() {\n return (\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" className=\"h-5 w-5 shrink-0\" fill=\"currentColor\">\n <path d=\"M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23a11.5 11.5 0 0 1 3.003-.404c1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222 0 1.606-.014 2.898-.014 3.293 0 .322.216.694.825.576C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12\" />\n </svg>\n );\n}\n\nfunction LoginGlyph() {\n // lucide \"log-in\" (ISC), inlined.\n return (\n <svg\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n className=\"h-5 w-5 shrink-0\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M15 3h4a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-4\" />\n <polyline points=\"10 17 15 12 10 7\" />\n <line x1=\"15\" x2=\"3\" y1=\"12\" y2=\"12\" />\n </svg>\n );\n}\n\nexport function GitHubNavButton({\n mode = 'auth',\n status = 'unauthed',\n login,\n avatarUrl,\n signInHref,\n profileHref,\n signOutAction,\n orgHref,\n defaultOpen,\n}: GitHubNavButtonProps) {\n // L1 mode: a plain GitHub→org link (no auth).\n if (mode === 'link') {\n return (\n <a\n href={orgHref}\n target=\"_blank\"\n rel=\"noreferrer\"\n className={SHELL}\n aria-label={`dataimago on GitHub${NEW_TAB_SUFFIX}`}\n >\n <GithubMark />\n <NewTabIndicator hideText />\n </a>\n );\n }\n\n // Signed out: a GET link that starts the OAuth flow.\n if (status !== 'authed') {\n return (\n <a href={signInHref} className={SHELL} aria-label=\"Sign in with GitHub\">\n <GithubMark />\n <LoginGlyph />\n </a>\n );\n }\n\n // Signed in: the GitHub mark + the user's avatar, with a native-disclosure menu.\n return (\n <details className=\"relative\" open={defaultOpen}>\n <summary\n className={`${SHELL} cursor-pointer list-none [&::-webkit-details-marker]:hidden`}\n aria-label={`GitHub account — signed in as ${login ?? 'your account'}`}\n >\n <GithubMark />\n {avatarUrl ? (\n <img\n src={avatarUrl}\n alt=\"\"\n className=\"h-7 w-7 rounded-full border border-stone-200\"\n width={28}\n height={28}\n />\n ) : (\n <span className=\"text-sm font-medium\">@{login}</span>\n )}\n </summary>\n <div className=\"absolute right-0 z-50 mt-2 w-60 rounded-lg border border-stone-200 bg-stone-50 p-2 shadow-lg\">\n <p className=\"px-2 py-1 text-sm text-stone-700\">\n Signed in as <span className=\"font-medium text-stone-900\">@{login}</span>\n </p>\n {profileHref && (\n <a href={profileHref} target=\"_blank\" rel=\"noreferrer\" className={MENU_ITEM}>\n View your GitHub profile\n <NewTabIndicator />\n </a>\n )}\n {signOutAction && (\n <form method=\"POST\" action={signOutAction}>\n <button type=\"submit\" className={MENU_ITEM}>\n Sign out\n </button>\n </form>\n )}\n </div>\n </details>\n );\n}\n","'use client';\n\nimport Link from 'next/link';\nimport { Logo } from '@dataimago/ui';\nimport type { SiteFooterProps } from './types';\nimport { NewTabIndicator } from './NewTabIndicator';\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',\n label: 'dataimago',\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 <NewTabIndicator />\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';\nimport { NEW_TAB_SUFFIX, NewTabIndicator } from './NewTabIndicator';\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${NEW_TAB_SUFFIX}`}\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\">\n {embodimentLabel}\n <NewTabIndicator hideText />\n </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 <NewTabIndicator />\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): eyebrows were meant to resolve to\n * sky-blue accent-300 (#3498DB) on this dark surface via mode-aware mapping —\n * 5.41:1 on stone-900. The static Tailwind class `text-accent-500` binds the\n * absolute color instead (~2.56:1). 2026-09-05: eyebrows match SiteFooter\n * (`text-accent-300` + `data-bs-theme=\"dark\"`). The border-copper-500\n * blockquote frame survives untouched. \"Two warmths\" coexist: cool sky-blue\n * on editorial eyebrows, warm copper on the 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 density = 'default',\n}: PhilosophyFooterProps) {\n const compact = density === 'compact';\n\n // Pull-quote — border-copper-500 PRESERVED: decorative-emphasis blockquote\n // frame per iteration-1 §5.2 preserved-decorative-copper governance.\n const pullQuote = (\n <blockquote\n className={`border-l-2 border-copper-500 pl-6 font-display italic text-paper-100 ${\n compact ? '' : 'mt-16 max-w-prose-wide'\n }`}\n >\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\n const closing = (\n <p\n className={`text-stone-400 ${\n compact ? 'text-base leading-relaxed' : 'mt-8 max-w-prose-wide text-sm'\n }`}\n >\n {closingStatement}\n </p>\n );\n\n return (\n <section\n aria-labelledby=\"philosophy-heading\"\n className={`border-t border-stone-200 bg-stone-900 text-paper-100 ${\n compact\n ? 'flex flex-col justify-center py-14 sm:py-16 lg:min-h-[50vh]'\n : 'py-20 sm:py-28'\n }`}\n data-bs-theme=\"dark\"\n >\n <div className=\"mx-auto w-full max-w-6xl px-6\">\n <div className={`grid lg:grid-cols-3 ${compact ? 'gap-8' : 'gap-12'}`}>\n {pairs.map((pair, i) => (\n <div key={i}>\n <p className=\"font-mono text-xs uppercase tracking-wider text-accent-300\">\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 {compact ? (\n // Critique / answer, side by side — Baudrillard's warning and\n // dataimago's structural answer. Filling the width is what pulls the\n // section down to ~half height (the default stacks these in one column,\n // leaving the right half empty).\n <div className=\"mt-10 grid gap-x-12 gap-y-8 lg:grid-cols-2\">\n {pullQuote}\n {closing}\n </div>\n ) : (\n <>\n {pullQuote}\n {closing}\n </>\n )}\n </div>\n </section>\n );\n}\n"],"mappings":"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","names":["import_jsx_runtime","Link","import_jsx_runtime","import_link","import_ui","import_jsx_runtime","Link","import_link","import_ui","import_jsx_runtime","Link","import_jsx_runtime"]}
package/dist/index.js CHANGED
@@ -1,7 +1,39 @@
1
1
  // src/PlatformNav.tsx
2
2
  import Link from "next/link";
3
3
  import { Logo, NavbarLogo } from "@dataimago/ui";
4
- import { jsx, jsxs } from "react/jsx-runtime";
4
+
5
+ // src/NewTabIndicator.tsx
6
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
7
+ var NEW_TAB_SUFFIX = " (opens in a new tab)";
8
+ function NewTabIndicator({ hideText = false }) {
9
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
10
+ /* @__PURE__ */ jsxs(
11
+ "svg",
12
+ {
13
+ "aria-hidden": "true",
14
+ focusable: "false",
15
+ viewBox: "0 0 24 24",
16
+ width: "0.85em",
17
+ height: "0.85em",
18
+ fill: "none",
19
+ stroke: "currentColor",
20
+ strokeWidth: "2",
21
+ strokeLinecap: "round",
22
+ strokeLinejoin: "round",
23
+ className: "ml-1 inline-block shrink-0 align-baseline",
24
+ children: [
25
+ /* @__PURE__ */ jsx("path", { d: "M15 3h6v6" }),
26
+ /* @__PURE__ */ jsx("path", { d: "M10 14 21 3" }),
27
+ /* @__PURE__ */ jsx("path", { d: "M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6" })
28
+ ]
29
+ }
30
+ ),
31
+ hideText ? null : /* @__PURE__ */ jsx("span", { className: "sr-only", children: NEW_TAB_SUFFIX })
32
+ ] });
33
+ }
34
+
35
+ // src/PlatformNav.tsx
36
+ import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
5
37
  var DEFAULT_LINKS = [
6
38
  { href: "/ecosystem", label: "Ecosystem" },
7
39
  { href: "/philosophy", label: "Philosophy" }
@@ -20,18 +52,18 @@ function PlatformNav({
20
52
  navLabel = "Primary",
21
53
  homeHref = "/"
22
54
  }) {
23
- 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 });
55
+ const propertyMark = navbarMark ? /* @__PURE__ */ jsx2(NavbarLogo, { name: navbarMark, "aria-hidden": true, className: MARK_CLASS }) : /* @__PURE__ */ jsx2(Logo, { name: brandMark, variant: "PATH", "aria-hidden": true, className: MARK_CLASS });
24
56
  const aiHref = typeof aiMonogram === "object" ? aiMonogram.href : void 0;
25
57
  const aiLabel = typeof aiMonogram === "object" ? aiMonogram.label ?? "dataimago" : "dataimago";
26
- 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(
58
+ return /* @__PURE__ */ jsx2("header", { className: "sticky top-0 z-40 border-b border-stone-200 bg-stone-100/95 backdrop-blur-sm", children: /* @__PURE__ */ jsxs2(
27
59
  "nav",
28
60
  {
29
61
  className: "mx-auto flex max-w-7xl items-center justify-between px-6 py-4",
30
62
  "aria-label": navLabel,
31
63
  children: [
32
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 sm:gap-3", children: [
33
- 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" }) })),
34
- /* @__PURE__ */ jsx(
64
+ /* @__PURE__ */ jsxs2("div", { className: "flex items-center gap-2 sm:gap-3", children: [
65
+ aiMonogram && (aiHref ? /* @__PURE__ */ jsx2(Link, { href: aiHref, "aria-label": aiLabel, className: AI_BUTTON_CLASS, children: /* @__PURE__ */ jsx2(NavbarLogo, { name: "ai-monogram", "aria-hidden": true, className: "[&_svg]:h-6 [&_svg]:w-auto" }) }) : /* @__PURE__ */ jsx2("span", { className: AI_BUTTON_CLASS, "aria-hidden": true, children: /* @__PURE__ */ jsx2(NavbarLogo, { name: "ai-monogram", "aria-hidden": true, className: "[&_svg]:h-6 [&_svg]:w-auto" }) })),
66
+ /* @__PURE__ */ jsx2(
35
67
  Link,
36
68
  {
37
69
  href: homeHref,
@@ -41,21 +73,24 @@ function PlatformNav({
41
73
  }
42
74
  )
43
75
  ] }),
44
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 sm:gap-6", children: [
76
+ /* @__PURE__ */ jsxs2("div", { className: "flex items-center gap-2 sm:gap-6", children: [
45
77
  links.map(
46
- ({ href, label, external }) => external ? /* @__PURE__ */ jsx(
78
+ ({ href, label, external }) => external ? /* @__PURE__ */ jsxs2(
47
79
  "a",
48
80
  {
49
81
  href,
50
82
  className: "btn-ghost hidden sm:inline-flex",
51
83
  target: "_blank",
52
84
  rel: "noreferrer",
53
- children: label
85
+ children: [
86
+ label,
87
+ /* @__PURE__ */ jsx2(NewTabIndicator, {})
88
+ ]
54
89
  },
55
90
  href
56
- ) : /* @__PURE__ */ jsx(Link, { href, className: "btn-ghost hidden sm:inline-flex", children: label }, href)
91
+ ) : /* @__PURE__ */ jsx2(Link, { href, className: "btn-ghost hidden sm:inline-flex", children: label }, href)
57
92
  ),
58
- cta && /* @__PURE__ */ jsx(Link, { href: cta.href, className: "btn-primary", children: cta.label }),
93
+ cta && /* @__PURE__ */ jsx2(Link, { href: cta.href, className: "btn-primary", children: cta.label }),
59
94
  rightSlot
60
95
  ] })
61
96
  ]
@@ -64,14 +99,14 @@ function PlatformNav({
64
99
  }
65
100
 
66
101
  // src/GitHubNavButton.tsx
67
- import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
102
+ import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
68
103
  var SHELL = "inline-flex min-h-[48px] items-center gap-2 rounded-xl border border-stone-200 bg-stone-50 px-3 text-stone-900 transition hover:bg-stone-100";
69
104
  var MENU_ITEM = "flex min-h-[48px] w-full items-center rounded px-2 text-left text-sm text-stone-900 transition hover:bg-stone-100";
70
105
  function GithubMark() {
71
- return /* @__PURE__ */ jsx2("svg", { viewBox: "0 0 24 24", "aria-hidden": "true", className: "h-5 w-5 shrink-0", fill: "currentColor", children: /* @__PURE__ */ jsx2("path", { d: "M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23a11.5 11.5 0 0 1 3.003-.404c1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222 0 1.606-.014 2.898-.014 3.293 0 .322.216.694.825.576C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12" }) });
106
+ return /* @__PURE__ */ jsx3("svg", { viewBox: "0 0 24 24", "aria-hidden": "true", className: "h-5 w-5 shrink-0", fill: "currentColor", children: /* @__PURE__ */ jsx3("path", { d: "M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23a11.5 11.5 0 0 1 3.003-.404c1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222 0 1.606-.014 2.898-.014 3.293 0 .322.216.694.825.576C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12" }) });
72
107
  }
73
108
  function LoginGlyph() {
74
- return /* @__PURE__ */ jsxs2(
109
+ return /* @__PURE__ */ jsxs3(
75
110
  "svg",
76
111
  {
77
112
  viewBox: "0 0 24 24",
@@ -83,9 +118,9 @@ function LoginGlyph() {
83
118
  strokeLinecap: "round",
84
119
  strokeLinejoin: "round",
85
120
  children: [
86
- /* @__PURE__ */ jsx2("path", { d: "M15 3h4a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-4" }),
87
- /* @__PURE__ */ jsx2("polyline", { points: "10 17 15 12 10 7" }),
88
- /* @__PURE__ */ jsx2("line", { x1: "15", x2: "3", y1: "12", y2: "12" })
121
+ /* @__PURE__ */ jsx3("path", { d: "M15 3h4a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-4" }),
122
+ /* @__PURE__ */ jsx3("polyline", { points: "10 17 15 12 10 7" }),
123
+ /* @__PURE__ */ jsx3("line", { x1: "15", x2: "3", y1: "12", y2: "12" })
89
124
  ]
90
125
  }
91
126
  );
@@ -102,33 +137,36 @@ function GitHubNavButton({
102
137
  defaultOpen
103
138
  }) {
104
139
  if (mode === "link") {
105
- return /* @__PURE__ */ jsx2(
140
+ return /* @__PURE__ */ jsxs3(
106
141
  "a",
107
142
  {
108
143
  href: orgHref,
109
144
  target: "_blank",
110
145
  rel: "noreferrer",
111
146
  className: SHELL,
112
- "aria-label": "dataimago on GitHub",
113
- children: /* @__PURE__ */ jsx2(GithubMark, {})
147
+ "aria-label": `dataimago on GitHub${NEW_TAB_SUFFIX}`,
148
+ children: [
149
+ /* @__PURE__ */ jsx3(GithubMark, {}),
150
+ /* @__PURE__ */ jsx3(NewTabIndicator, { hideText: true })
151
+ ]
114
152
  }
115
153
  );
116
154
  }
117
155
  if (status !== "authed") {
118
- return /* @__PURE__ */ jsxs2("a", { href: signInHref, className: SHELL, "aria-label": "Sign in with GitHub", children: [
119
- /* @__PURE__ */ jsx2(GithubMark, {}),
120
- /* @__PURE__ */ jsx2(LoginGlyph, {})
156
+ return /* @__PURE__ */ jsxs3("a", { href: signInHref, className: SHELL, "aria-label": "Sign in with GitHub", children: [
157
+ /* @__PURE__ */ jsx3(GithubMark, {}),
158
+ /* @__PURE__ */ jsx3(LoginGlyph, {})
121
159
  ] });
122
160
  }
123
- return /* @__PURE__ */ jsxs2("details", { className: "relative", open: defaultOpen, children: [
124
- /* @__PURE__ */ jsxs2(
161
+ return /* @__PURE__ */ jsxs3("details", { className: "relative", open: defaultOpen, children: [
162
+ /* @__PURE__ */ jsxs3(
125
163
  "summary",
126
164
  {
127
165
  className: `${SHELL} cursor-pointer list-none [&::-webkit-details-marker]:hidden`,
128
166
  "aria-label": `GitHub account \u2014 signed in as ${login ?? "your account"}`,
129
167
  children: [
130
- /* @__PURE__ */ jsx2(GithubMark, {}),
131
- avatarUrl ? /* @__PURE__ */ jsx2(
168
+ /* @__PURE__ */ jsx3(GithubMark, {}),
169
+ avatarUrl ? /* @__PURE__ */ jsx3(
132
170
  "img",
133
171
  {
134
172
  src: avatarUrl,
@@ -137,23 +175,26 @@ function GitHubNavButton({
137
175
  width: 28,
138
176
  height: 28
139
177
  }
140
- ) : /* @__PURE__ */ jsxs2("span", { className: "text-sm font-medium", children: [
178
+ ) : /* @__PURE__ */ jsxs3("span", { className: "text-sm font-medium", children: [
141
179
  "@",
142
180
  login
143
181
  ] })
144
182
  ]
145
183
  }
146
184
  ),
147
- /* @__PURE__ */ jsxs2("div", { className: "absolute right-0 z-50 mt-2 w-60 rounded-lg border border-stone-200 bg-stone-50 p-2 shadow-lg", children: [
148
- /* @__PURE__ */ jsxs2("p", { className: "px-2 py-1 text-sm text-stone-700", children: [
185
+ /* @__PURE__ */ jsxs3("div", { className: "absolute right-0 z-50 mt-2 w-60 rounded-lg border border-stone-200 bg-stone-50 p-2 shadow-lg", children: [
186
+ /* @__PURE__ */ jsxs3("p", { className: "px-2 py-1 text-sm text-stone-700", children: [
149
187
  "Signed in as ",
150
- /* @__PURE__ */ jsxs2("span", { className: "font-medium text-stone-900", children: [
188
+ /* @__PURE__ */ jsxs3("span", { className: "font-medium text-stone-900", children: [
151
189
  "@",
152
190
  login
153
191
  ] })
154
192
  ] }),
155
- profileHref && /* @__PURE__ */ jsx2("a", { href: profileHref, target: "_blank", rel: "noreferrer", className: MENU_ITEM, children: "View your GitHub profile" }),
156
- signOutAction && /* @__PURE__ */ jsx2("form", { method: "POST", action: signOutAction, children: /* @__PURE__ */ jsx2("button", { type: "submit", className: MENU_ITEM, children: "Sign out" }) })
193
+ profileHref && /* @__PURE__ */ jsxs3("a", { href: profileHref, target: "_blank", rel: "noreferrer", className: MENU_ITEM, children: [
194
+ "View your GitHub profile",
195
+ /* @__PURE__ */ jsx3(NewTabIndicator, {})
196
+ ] }),
197
+ signOutAction && /* @__PURE__ */ jsx3("form", { method: "POST", action: signOutAction, children: /* @__PURE__ */ jsx3("button", { type: "submit", className: MENU_ITEM, children: "Sign out" }) })
157
198
  ] })
158
199
  ] });
159
200
  }
@@ -161,7 +202,7 @@ function GitHubNavButton({
161
202
  // src/SiteFooter.tsx
162
203
  import Link2 from "next/link";
163
204
  import { Logo as Logo2 } from "@dataimago/ui";
164
- import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
205
+ import { jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
165
206
  var DEFAULT_TAGLINE = "A living AI-native application ecosystem.";
166
207
  var DEFAULT_COLUMNS = [
167
208
  {
@@ -198,21 +239,21 @@ function SiteFooter({
198
239
  columns = DEFAULT_COLUMNS,
199
240
  closingStatement
200
241
  }) {
201
- return /* @__PURE__ */ jsx3(
242
+ return /* @__PURE__ */ jsx4(
202
243
  "footer",
203
244
  {
204
245
  className: "border-t border-stone-800 bg-stone-900 text-stone-400",
205
246
  "data-bs-theme": "dark",
206
- children: /* @__PURE__ */ jsxs3("div", { className: "mx-auto max-w-6xl px-6 py-12", children: [
207
- /* @__PURE__ */ jsxs3("div", { className: "grid gap-8 md:grid-cols-4", children: [
208
- /* @__PURE__ */ jsxs3("div", { children: [
209
- /* @__PURE__ */ jsx3(
247
+ children: /* @__PURE__ */ jsxs4("div", { className: "mx-auto max-w-6xl px-6 py-12", children: [
248
+ /* @__PURE__ */ jsxs4("div", { className: "grid gap-8 md:grid-cols-4", children: [
249
+ /* @__PURE__ */ jsxs4("div", { children: [
250
+ /* @__PURE__ */ jsx4(
210
251
  Link2,
211
252
  {
212
253
  href: "/",
213
254
  className: "inline-flex items-center text-stone-100 transition hover:opacity-80",
214
255
  "aria-label": "dataimago",
215
- children: /* @__PURE__ */ jsx3(
256
+ children: /* @__PURE__ */ jsx4(
216
257
  Logo2,
217
258
  {
218
259
  name: "dataimago",
@@ -223,23 +264,26 @@ function SiteFooter({
223
264
  )
224
265
  }
225
266
  ),
226
- /* @__PURE__ */ jsx3("p", { className: "mt-3 text-xs text-stone-400", children: tagline })
267
+ /* @__PURE__ */ jsx4("p", { className: "mt-3 text-xs text-stone-400", children: tagline })
227
268
  ] }),
228
- columns.map((col) => /* @__PURE__ */ jsxs3("div", { children: [
229
- /* @__PURE__ */ jsx3("h4", { className: "font-mono text-xs uppercase tracking-wider text-accent-300", children: col.heading }),
230
- /* @__PURE__ */ jsx3("ul", { className: "mt-3 space-y-2 text-sm", children: col.links.map(({ href, label, external }) => /* @__PURE__ */ jsx3("li", { children: !href ? label : external ? /* @__PURE__ */ jsx3(
269
+ columns.map((col) => /* @__PURE__ */ jsxs4("div", { children: [
270
+ /* @__PURE__ */ jsx4("h4", { className: "font-mono text-xs uppercase tracking-wider text-accent-300", children: col.heading }),
271
+ /* @__PURE__ */ jsx4("ul", { className: "mt-3 space-y-2 text-sm", children: col.links.map(({ href, label, external }) => /* @__PURE__ */ jsx4("li", { children: !href ? label : external ? /* @__PURE__ */ jsxs4(
231
272
  "a",
232
273
  {
233
274
  href,
234
275
  className: "hover:text-paper-100",
235
276
  target: "_blank",
236
277
  rel: "noreferrer",
237
- children: label
278
+ children: [
279
+ label,
280
+ /* @__PURE__ */ jsx4(NewTabIndicator, {})
281
+ ]
238
282
  }
239
- ) : /* @__PURE__ */ jsx3(Link2, { href, className: "hover:text-paper-100", children: label }) }, label)) })
283
+ ) : /* @__PURE__ */ jsx4(Link2, { href, className: "hover:text-paper-100", children: label }) }, label)) })
240
284
  ] }, col.heading))
241
285
  ] }),
242
- closingStatement ? /* @__PURE__ */ jsx3("div", { className: "mt-12 border-t border-stone-800 pt-6 text-xs text-stone-400", children: /* @__PURE__ */ jsx3("p", { children: closingStatement }) }) : null
286
+ closingStatement ? /* @__PURE__ */ jsx4("div", { className: "mt-12 border-t border-stone-800 pt-6 text-xs text-stone-400", children: /* @__PURE__ */ jsx4("p", { children: closingStatement }) }) : null
243
287
  ] })
244
288
  }
245
289
  );
@@ -248,7 +292,7 @@ function SiteFooter({
248
292
  // src/MinimalFooter.tsx
249
293
  import Link3 from "next/link";
250
294
  import { Logo as Logo3 } from "@dataimago/ui";
251
- import { jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
295
+ import { jsx as jsx5, jsxs as jsxs5 } from "react/jsx-runtime";
252
296
  var DEFAULT_BRAND_HREF = "https://dataimago.ai";
253
297
  var DEFAULT_EMBODIMENT = "An embodiment of dataimago";
254
298
  function MinimalFooter({
@@ -257,22 +301,22 @@ function MinimalFooter({
257
301
  links = [],
258
302
  copyright
259
303
  }) {
260
- return /* @__PURE__ */ jsx4(
304
+ return /* @__PURE__ */ jsx5(
261
305
  "footer",
262
306
  {
263
307
  className: "border-t border-stone-800 bg-stone-900 text-stone-400",
264
308
  "data-bs-theme": "dark",
265
- children: /* @__PURE__ */ jsxs4("div", { className: "mx-auto flex max-w-6xl flex-col items-center gap-4 px-6 py-10 text-center", children: [
266
- /* @__PURE__ */ jsxs4(
309
+ children: /* @__PURE__ */ jsxs5("div", { className: "mx-auto flex max-w-6xl flex-col items-center gap-4 px-6 py-10 text-center", children: [
310
+ /* @__PURE__ */ jsxs5(
267
311
  "a",
268
312
  {
269
313
  href: brandHref,
270
314
  className: "inline-flex flex-col items-center gap-2 text-stone-100 transition hover:opacity-80",
271
315
  target: "_blank",
272
316
  rel: "noreferrer",
273
- "aria-label": `${embodimentLabel} \u2014 visit dataimago.ai`,
317
+ "aria-label": `${embodimentLabel} \u2014 visit dataimago.ai${NEW_TAB_SUFFIX}`,
274
318
  children: [
275
- /* @__PURE__ */ jsx4(
319
+ /* @__PURE__ */ jsx5(
276
320
  Logo3,
277
321
  {
278
322
  name: "dataimago",
@@ -281,38 +325,44 @@ function MinimalFooter({
281
325
  className: "[&_svg]:h-7 [&_svg]:w-auto"
282
326
  }
283
327
  ),
284
- /* @__PURE__ */ jsx4("span", { className: "text-sm text-stone-400", children: embodimentLabel })
328
+ /* @__PURE__ */ jsxs5("span", { className: "text-sm text-stone-400", children: [
329
+ embodimentLabel,
330
+ /* @__PURE__ */ jsx5(NewTabIndicator, { hideText: true })
331
+ ] })
285
332
  ]
286
333
  }
287
334
  ),
288
- links.length > 0 ? /* @__PURE__ */ jsx4(
335
+ links.length > 0 ? /* @__PURE__ */ jsx5(
289
336
  "nav",
290
337
  {
291
338
  className: "flex flex-wrap items-center justify-center gap-x-6 gap-y-2 text-sm",
292
339
  "aria-label": "Footer",
293
340
  children: links.map(
294
- ({ href, label, external }) => !href ? /* @__PURE__ */ jsx4("span", { className: "text-stone-400", children: label }, label) : external ? /* @__PURE__ */ jsx4(
341
+ ({ href, label, external }) => !href ? /* @__PURE__ */ jsx5("span", { className: "text-stone-400", children: label }, label) : external ? /* @__PURE__ */ jsxs5(
295
342
  "a",
296
343
  {
297
344
  href,
298
345
  className: "text-stone-300 hover:text-paper-100",
299
346
  target: "_blank",
300
347
  rel: "noreferrer",
301
- children: label
348
+ children: [
349
+ label,
350
+ /* @__PURE__ */ jsx5(NewTabIndicator, {})
351
+ ]
302
352
  },
303
353
  label
304
- ) : /* @__PURE__ */ jsx4(Link3, { href, className: "text-stone-300 hover:text-paper-100", children: label }, label)
354
+ ) : /* @__PURE__ */ jsx5(Link3, { href, className: "text-stone-300 hover:text-paper-100", children: label }, label)
305
355
  )
306
356
  }
307
357
  ) : null,
308
- copyright ? /* @__PURE__ */ jsx4("p", { className: "text-xs text-stone-400", children: copyright }) : null
358
+ copyright ? /* @__PURE__ */ jsx5("p", { className: "text-xs text-stone-400", children: copyright }) : null
309
359
  ] })
310
360
  }
311
361
  );
312
362
  }
313
363
 
314
364
  // src/PhilosophyFooter.tsx
315
- import { Fragment, jsx as jsx5, jsxs as jsxs5 } from "react/jsx-runtime";
365
+ import { Fragment as Fragment2, jsx as jsx6, jsxs as jsxs6 } from "react/jsx-runtime";
316
366
  var DEFAULT_PAIRS = [
317
367
  {
318
368
  eyebrow: "our belief",
@@ -341,17 +391,17 @@ function PhilosophyFooter({
341
391
  density = "default"
342
392
  }) {
343
393
  const compact = density === "compact";
344
- const pullQuote = /* @__PURE__ */ jsxs5(
394
+ const pullQuote = /* @__PURE__ */ jsxs6(
345
395
  "blockquote",
346
396
  {
347
397
  className: `border-l-2 border-copper-500 pl-6 font-display italic text-paper-100 ${compact ? "" : "mt-16 max-w-prose-wide"}`,
348
398
  children: [
349
- /* @__PURE__ */ jsx5("p", { className: "text-base leading-relaxed", children: quote.text }),
350
- /* @__PURE__ */ jsxs5("footer", { className: "mt-4 text-sm not-italic text-stone-400", children: [
399
+ /* @__PURE__ */ jsx6("p", { className: "text-base leading-relaxed", children: quote.text }),
400
+ /* @__PURE__ */ jsxs6("footer", { className: "mt-4 text-sm not-italic text-stone-400", children: [
351
401
  "\u2014 ",
352
402
  quote.attribution,
353
403
  ", ",
354
- /* @__PURE__ */ jsx5("cite", { children: quote.work }),
404
+ /* @__PURE__ */ jsx6("cite", { children: quote.work }),
355
405
  " (",
356
406
  quote.year,
357
407
  ")"
@@ -359,41 +409,41 @@ function PhilosophyFooter({
359
409
  ]
360
410
  }
361
411
  );
362
- const closing = /* @__PURE__ */ jsx5(
412
+ const closing = /* @__PURE__ */ jsx6(
363
413
  "p",
364
414
  {
365
415
  className: `text-stone-400 ${compact ? "text-base leading-relaxed" : "mt-8 max-w-prose-wide text-sm"}`,
366
416
  children: closingStatement
367
417
  }
368
418
  );
369
- return /* @__PURE__ */ jsx5(
419
+ return /* @__PURE__ */ jsx6(
370
420
  "section",
371
421
  {
372
422
  "aria-labelledby": "philosophy-heading",
373
423
  className: `border-t border-stone-200 bg-stone-900 text-paper-100 ${compact ? "flex flex-col justify-center py-14 sm:py-16 lg:min-h-[50vh]" : "py-20 sm:py-28"}`,
374
424
  "data-bs-theme": "dark",
375
- children: /* @__PURE__ */ jsxs5("div", { className: "mx-auto w-full max-w-6xl px-6", children: [
376
- /* @__PURE__ */ jsx5("div", { className: `grid lg:grid-cols-3 ${compact ? "gap-8" : "gap-12"}`, children: pairs.map((pair, i) => /* @__PURE__ */ jsxs5("div", { children: [
377
- /* @__PURE__ */ jsx5("p", { className: "font-mono text-xs uppercase tracking-wider text-accent-300", children: pair.eyebrow }),
378
- i === 0 ? /* @__PURE__ */ jsx5(
425
+ children: /* @__PURE__ */ jsxs6("div", { className: "mx-auto w-full max-w-6xl px-6", children: [
426
+ /* @__PURE__ */ jsx6("div", { className: `grid lg:grid-cols-3 ${compact ? "gap-8" : "gap-12"}`, children: pairs.map((pair, i) => /* @__PURE__ */ jsxs6("div", { children: [
427
+ /* @__PURE__ */ jsx6("p", { className: "font-mono text-xs uppercase tracking-wider text-accent-300", children: pair.eyebrow }),
428
+ i === 0 ? /* @__PURE__ */ jsx6(
379
429
  "h3",
380
430
  {
381
431
  id: "philosophy-heading",
382
432
  className: "mt-2 font-display text-xl text-paper-100",
383
433
  children: pair.body
384
434
  }
385
- ) : /* @__PURE__ */ jsx5("p", { className: "mt-2 font-display text-xl text-paper-100", children: pair.body })
435
+ ) : /* @__PURE__ */ jsx6("p", { className: "mt-2 font-display text-xl text-paper-100", children: pair.body })
386
436
  ] }, i)) }),
387
437
  compact ? (
388
438
  // Critique / answer, side by side — Baudrillard's warning and
389
439
  // dataimago's structural answer. Filling the width is what pulls the
390
440
  // section down to ~half height (the default stacks these in one column,
391
441
  // leaving the right half empty).
392
- /* @__PURE__ */ jsxs5("div", { className: "mt-10 grid gap-x-12 gap-y-8 lg:grid-cols-2", children: [
442
+ /* @__PURE__ */ jsxs6("div", { className: "mt-10 grid gap-x-12 gap-y-8 lg:grid-cols-2", children: [
393
443
  pullQuote,
394
444
  closing
395
445
  ] })
396
- ) : /* @__PURE__ */ jsxs5(Fragment, { children: [
446
+ ) : /* @__PURE__ */ jsxs6(Fragment2, { children: [
397
447
  pullQuote,
398
448
  closing
399
449
  ] })
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/PlatformNav.tsx","../src/GitHubNavButton.tsx","../src/SiteFooter.tsx","../src/MinimalFooter.tsx","../src/PhilosophyFooter.tsx"],"sourcesContent":["'use client';\n\nimport Link from 'next/link';\nimport { Logo, NavbarLogo } from '@dataimago/ui';\nimport type { PlatformNavProps } from './types';\n\n/**\n * Platform navigation — sticky header with the property's brand mark + nav cluster.\n *\n * The property mark is rendered by height (so any aspect fits the nav). By default\n * it's the static `@dataimago/brand` wordmark via `<Logo>` (font-free, IoU-locked,\n * `currentColor`). When `navbarMark` is set it becomes the ANIMATED `<NavbarLogo>`\n * (the a/i assemble toggle for L2 marks, lift+wash for L1) — falling back to the\n * static `<Logo brandMark>` otherwise, so pre-navbar consumers are unaffected.\n *\n * `aiMonogram` adds the dataimago `ai-monogram` icon button to the LEFT of the\n * property mark (a 48px touch target; lift+washes to the brand-mark red on hover).\n *\n * Extracted from apps/hub into @dataimago/hub-chrome during iteration-3-B.2\n * (2026-05-11); `navbarMark`/`aiMonogram` added in iteration-4 (the navbar logo\n * system). All props default to the Level-1 hub configuration.\n */\n\nconst DEFAULT_LINKS = [\n { href: '/ecosystem', label: 'Ecosystem' },\n { href: '/philosophy', label: 'Philosophy' },\n];\n\nconst DEFAULT_CTA = { href: '/onboard', label: 'Begin' };\n\n/** Height-based sizing for the property mark (the navbar norm — ~30% larger letters). */\nconst MARK_CLASS = '[&_svg]:h-7 [&_svg]:w-auto sm:[&_svg]:h-8';\n\n/** The optional ai-monogram icon button — a 48px touch target (ready-to-hand floor). */\nconst AI_BUTTON_CLASS =\n 'inline-flex min-h-[48px] min-w-[48px] items-center justify-center rounded-xl ' +\n 'border border-stone-200 bg-stone-50 text-stone-900 transition hover:bg-stone-100';\n\nexport function PlatformNav({\n brandMark = 'dataimago_ai_OVERLAP',\n navbarMark,\n aiMonogram,\n brandLabel = 'dataimago.ai home',\n links = DEFAULT_LINKS,\n cta = DEFAULT_CTA,\n rightSlot,\n navLabel = 'Primary',\n homeHref = '/',\n}: PlatformNavProps) {\n const propertyMark = navbarMark ? (\n <NavbarLogo name={navbarMark} aria-hidden className={MARK_CLASS} />\n ) : (\n <Logo name={brandMark} variant=\"PATH\" aria-hidden className={MARK_CLASS} />\n );\n\n const aiHref = typeof aiMonogram === 'object' ? aiMonogram.href : undefined;\n const aiLabel =\n typeof aiMonogram === 'object' ? (aiMonogram.label ?? 'dataimago') : 'dataimago';\n\n return (\n <header className=\"sticky top-0 z-40 border-b border-stone-200 bg-stone-100/95 backdrop-blur-sm\">\n <nav\n className=\"mx-auto flex max-w-7xl items-center justify-between px-6 py-4\"\n aria-label={navLabel}\n >\n <div className=\"flex items-center gap-2 sm:gap-3\">\n {aiMonogram &&\n (aiHref ? (\n <Link href={aiHref} aria-label={aiLabel} className={AI_BUTTON_CLASS}>\n <NavbarLogo name=\"ai-monogram\" aria-hidden className=\"[&_svg]:h-6 [&_svg]:w-auto\" />\n </Link>\n ) : (\n <span className={AI_BUTTON_CLASS} aria-hidden>\n <NavbarLogo name=\"ai-monogram\" aria-hidden className=\"[&_svg]:h-6 [&_svg]:w-auto\" />\n </span>\n ))}\n <Link\n href={homeHref}\n className=\"inline-flex min-h-[48px] items-center text-stone-900 transition hover:opacity-80\"\n aria-label={brandLabel}\n >\n {propertyMark}\n </Link>\n </div>\n\n <div className=\"flex items-center gap-2 sm:gap-6\">\n {links.map(({ href, label, external }) =>\n external ? (\n <a\n key={href}\n href={href}\n className=\"btn-ghost hidden sm:inline-flex\"\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {label}\n </a>\n ) : (\n <Link key={href} href={href} className=\"btn-ghost hidden sm:inline-flex\">\n {label}\n </Link>\n )\n )}\n {cta && (\n <Link href={cta.href} className=\"btn-primary\">\n {cta.label}\n </Link>\n )}\n {rightSlot}\n </div>\n </nav>\n </header>\n );\n}\n","import type { GitHubNavButtonProps } from './types';\n\n/**\n * The unified GitHub account control for the nav's right slot — the canonical\n * login affordance + login-state indicator shared across every L1/L2 dataimago\n * app (rendered into `PlatformNav`'s `rightSlot`).\n *\n * Fully presentational and **stateless** — it reads no auth itself; the consumer\n * feeds it. Uses a native `<details>` disclosure for the signed-in menu, so it\n * needs no client JS and works whether rendered on the server (a server parent\n * injecting the avatar) or the client.\n *\n * - `mode=\"auth\"` (default): the login-state indicator.\n * - `status=\"unauthed\"` → a GET link to `signInHref` (start OAuth) showing the\n * GitHub mark + a login glyph.\n * - `status=\"authed\"` → the GitHub mark + the user's avatar, opening a menu\n * (profile link + a POST sign-out form to `signOutAction`).\n * - `mode=\"link\"`: a plain GitHub→`orgHref` link (L1, which has no auth).\n *\n * Icons are inlined (the GitHub mark + a lucide-style \"log-in\" glyph) to keep the\n * shared package free of an icon-library peer dependency.\n */\n\n// The 48px touch-target floor (the ready-to-hand dignity gate); colours resolve\n// from the consuming app's dataimago palette. The global `*:focus-visible` rule\n// supplies the focus ring.\nconst SHELL =\n 'inline-flex min-h-[48px] items-center gap-2 rounded-xl border border-stone-200 ' +\n 'bg-stone-50 px-3 text-stone-900 transition hover:bg-stone-100';\n\nconst MENU_ITEM =\n 'flex min-h-[48px] w-full items-center rounded px-2 text-left text-sm ' +\n 'text-stone-900 transition hover:bg-stone-100';\n\nfunction GithubMark() {\n return (\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" className=\"h-5 w-5 shrink-0\" fill=\"currentColor\">\n <path d=\"M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23a11.5 11.5 0 0 1 3.003-.404c1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222 0 1.606-.014 2.898-.014 3.293 0 .322.216.694.825.576C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12\" />\n </svg>\n );\n}\n\nfunction LoginGlyph() {\n // lucide \"log-in\" (ISC), inlined.\n return (\n <svg\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n className=\"h-5 w-5 shrink-0\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M15 3h4a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-4\" />\n <polyline points=\"10 17 15 12 10 7\" />\n <line x1=\"15\" x2=\"3\" y1=\"12\" y2=\"12\" />\n </svg>\n );\n}\n\nexport function GitHubNavButton({\n mode = 'auth',\n status = 'unauthed',\n login,\n avatarUrl,\n signInHref,\n profileHref,\n signOutAction,\n orgHref,\n defaultOpen,\n}: GitHubNavButtonProps) {\n // L1 mode: a plain GitHub→org link (no auth).\n if (mode === 'link') {\n return (\n <a\n href={orgHref}\n target=\"_blank\"\n rel=\"noreferrer\"\n className={SHELL}\n aria-label=\"dataimago on GitHub\"\n >\n <GithubMark />\n </a>\n );\n }\n\n // Signed out: a GET link that starts the OAuth flow.\n if (status !== 'authed') {\n return (\n <a href={signInHref} className={SHELL} aria-label=\"Sign in with GitHub\">\n <GithubMark />\n <LoginGlyph />\n </a>\n );\n }\n\n // Signed in: the GitHub mark + the user's avatar, with a native-disclosure menu.\n return (\n <details className=\"relative\" open={defaultOpen}>\n <summary\n className={`${SHELL} cursor-pointer list-none [&::-webkit-details-marker]:hidden`}\n aria-label={`GitHub account — signed in as ${login ?? 'your account'}`}\n >\n <GithubMark />\n {avatarUrl ? (\n <img\n src={avatarUrl}\n alt=\"\"\n className=\"h-7 w-7 rounded-full border border-stone-200\"\n width={28}\n height={28}\n />\n ) : (\n <span className=\"text-sm font-medium\">@{login}</span>\n )}\n </summary>\n <div className=\"absolute right-0 z-50 mt-2 w-60 rounded-lg border border-stone-200 bg-stone-50 p-2 shadow-lg\">\n <p className=\"px-2 py-1 text-sm text-stone-700\">\n Signed in as <span className=\"font-medium text-stone-900\">@{login}</span>\n </p>\n {profileHref && (\n <a href={profileHref} target=\"_blank\" rel=\"noreferrer\" className={MENU_ITEM}>\n View your GitHub profile\n </a>\n )}\n {signOutAction && (\n <form method=\"POST\" action={signOutAction}>\n <button type=\"submit\" className={MENU_ITEM}>\n Sign out\n </button>\n </form>\n )}\n </div>\n </details>\n );\n}\n","'use client';\n\nimport Link from 'next/link';\nimport { Logo } from '@dataimago/ui';\nimport type { SiteFooterProps } from './types';\n\n/**\n * Site footer — the Level-1 hub footer: dark surface, dataimago wordmark + a\n * trimmed nav column grid.\n *\n * The wordmark is the `dataimago` brand mark via `<Logo>` (font-free, in a light\n * `currentColor` on the dark surface) — no backplate, no hardcoded \".ai\" span.\n *\n * Extracted from apps/hub into @dataimago/hub-chrome during iteration-3-B.2\n * (2026-05-11). The defaults drop the former \"Legacy\" column + the critical-theory\n * closing statement (the philosophical-basis editorial lives on the PhilosophyFooter,\n * which is Level-1-only). Level-2 verticals use `MinimalFooter` instead.\n */\n\nconst DEFAULT_TAGLINE = 'A living AI-native application ecosystem.';\n\nconst DEFAULT_COLUMNS = [\n {\n heading: 'Platform',\n links: [\n { href: '/onboard', label: 'Begin a project' },\n { href: '/ecosystem', label: 'Ecosystem' },\n { href: '/philosophy', label: 'Philosophy' },\n ],\n },\n {\n heading: 'Framework',\n links: [\n {\n href: 'https://github.com/dataimago/dataimago-design',\n label: 'dataimago-design',\n external: true,\n },\n {\n href: 'https://github.com/dataimago/dataimago',\n label: 'dataimago',\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): eyebrows were meant to resolve to\n * sky-blue accent-300 (#3498DB) on this dark surface via mode-aware mapping —\n * 5.41:1 on stone-900. The static Tailwind class `text-accent-500` binds the\n * absolute color instead (~2.56:1). 2026-09-05: eyebrows match SiteFooter\n * (`text-accent-300` + `data-bs-theme=\"dark\"`). The border-copper-500\n * blockquote frame survives untouched. \"Two warmths\" coexist: cool sky-blue\n * on editorial eyebrows, warm copper on the 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 density = 'default',\n}: PhilosophyFooterProps) {\n const compact = density === 'compact';\n\n // Pull-quote — border-copper-500 PRESERVED: decorative-emphasis blockquote\n // frame per iteration-1 §5.2 preserved-decorative-copper governance.\n const pullQuote = (\n <blockquote\n className={`border-l-2 border-copper-500 pl-6 font-display italic text-paper-100 ${\n compact ? '' : 'mt-16 max-w-prose-wide'\n }`}\n >\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\n const closing = (\n <p\n className={`text-stone-400 ${\n compact ? 'text-base leading-relaxed' : 'mt-8 max-w-prose-wide text-sm'\n }`}\n >\n {closingStatement}\n </p>\n );\n\n return (\n <section\n aria-labelledby=\"philosophy-heading\"\n className={`border-t border-stone-200 bg-stone-900 text-paper-100 ${\n compact\n ? 'flex flex-col justify-center py-14 sm:py-16 lg:min-h-[50vh]'\n : 'py-20 sm:py-28'\n }`}\n data-bs-theme=\"dark\"\n >\n <div className=\"mx-auto w-full max-w-6xl px-6\">\n <div className={`grid lg:grid-cols-3 ${compact ? 'gap-8' : 'gap-12'}`}>\n {pairs.map((pair, i) => (\n <div key={i}>\n <p className=\"font-mono text-xs uppercase tracking-wider text-accent-300\">\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 {compact ? (\n // Critique / answer, side by side — Baudrillard's warning and\n // dataimago's structural answer. Filling the width is what pulls the\n // section down to ~half height (the default stacks these in one column,\n // leaving the right half empty).\n <div className=\"mt-10 grid gap-x-12 gap-y-8 lg:grid-cols-2\">\n {pullQuote}\n {closing}\n </div>\n ) : (\n <>\n {pullQuote}\n {closing}\n </>\n )}\n </div>\n </section>\n );\n}\n"],"mappings":"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","names":["jsx","jsxs","Link","Logo","jsx","jsxs","Link","Logo","jsx","jsxs","jsx","jsxs"]}
1
+ {"version":3,"sources":["../src/PlatformNav.tsx","../src/NewTabIndicator.tsx","../src/GitHubNavButton.tsx","../src/SiteFooter.tsx","../src/MinimalFooter.tsx","../src/PhilosophyFooter.tsx"],"sourcesContent":["'use client';\n\nimport Link from 'next/link';\nimport { Logo, NavbarLogo } from '@dataimago/ui';\nimport type { PlatformNavProps } from './types';\nimport { NewTabIndicator } from './NewTabIndicator';\n\n/**\n * Platform navigation — sticky header with the property's brand mark + nav cluster.\n *\n * The property mark is rendered by height (so any aspect fits the nav). By default\n * it's the static `@dataimago/brand` wordmark via `<Logo>` (font-free, IoU-locked,\n * `currentColor`). When `navbarMark` is set it becomes the ANIMATED `<NavbarLogo>`\n * (the a/i assemble toggle for L2 marks, lift+wash for L1) — falling back to the\n * static `<Logo brandMark>` otherwise, so pre-navbar consumers are unaffected.\n *\n * `aiMonogram` adds the dataimago `ai-monogram` icon button to the LEFT of the\n * property mark (a 48px touch target; lift+washes to the brand-mark red on hover).\n *\n * Extracted from apps/hub into @dataimago/hub-chrome during iteration-3-B.2\n * (2026-05-11); `navbarMark`/`aiMonogram` added in iteration-4 (the navbar logo\n * system). All props default to the Level-1 hub configuration.\n */\n\nconst DEFAULT_LINKS = [\n { href: '/ecosystem', label: 'Ecosystem' },\n { href: '/philosophy', label: 'Philosophy' },\n];\n\nconst DEFAULT_CTA = { href: '/onboard', label: 'Begin' };\n\n/** Height-based sizing for the property mark (the navbar norm — ~30% larger letters). */\nconst MARK_CLASS = '[&_svg]:h-7 [&_svg]:w-auto sm:[&_svg]:h-8';\n\n/** The optional ai-monogram icon button — a 48px touch target (ready-to-hand floor). */\nconst AI_BUTTON_CLASS =\n 'inline-flex min-h-[48px] min-w-[48px] items-center justify-center rounded-xl ' +\n 'border border-stone-200 bg-stone-50 text-stone-900 transition hover:bg-stone-100';\n\nexport function PlatformNav({\n brandMark = 'dataimago_ai_OVERLAP',\n navbarMark,\n aiMonogram,\n brandLabel = 'dataimago.ai home',\n links = DEFAULT_LINKS,\n cta = DEFAULT_CTA,\n rightSlot,\n navLabel = 'Primary',\n homeHref = '/',\n}: PlatformNavProps) {\n const propertyMark = navbarMark ? (\n <NavbarLogo name={navbarMark} aria-hidden className={MARK_CLASS} />\n ) : (\n <Logo name={brandMark} variant=\"PATH\" aria-hidden className={MARK_CLASS} />\n );\n\n const aiHref = typeof aiMonogram === 'object' ? aiMonogram.href : undefined;\n const aiLabel =\n typeof aiMonogram === 'object' ? (aiMonogram.label ?? 'dataimago') : 'dataimago';\n\n return (\n <header className=\"sticky top-0 z-40 border-b border-stone-200 bg-stone-100/95 backdrop-blur-sm\">\n <nav\n className=\"mx-auto flex max-w-7xl items-center justify-between px-6 py-4\"\n aria-label={navLabel}\n >\n <div className=\"flex items-center gap-2 sm:gap-3\">\n {aiMonogram &&\n (aiHref ? (\n <Link href={aiHref} aria-label={aiLabel} className={AI_BUTTON_CLASS}>\n <NavbarLogo name=\"ai-monogram\" aria-hidden className=\"[&_svg]:h-6 [&_svg]:w-auto\" />\n </Link>\n ) : (\n <span className={AI_BUTTON_CLASS} aria-hidden>\n <NavbarLogo name=\"ai-monogram\" aria-hidden className=\"[&_svg]:h-6 [&_svg]:w-auto\" />\n </span>\n ))}\n <Link\n href={homeHref}\n className=\"inline-flex min-h-[48px] items-center text-stone-900 transition hover:opacity-80\"\n aria-label={brandLabel}\n >\n {propertyMark}\n </Link>\n </div>\n\n <div className=\"flex items-center gap-2 sm:gap-6\">\n {links.map(({ href, label, external }) =>\n external ? (\n <a\n key={href}\n href={href}\n className=\"btn-ghost hidden sm:inline-flex\"\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {label}\n <NewTabIndicator />\n </a>\n ) : (\n <Link key={href} href={href} className=\"btn-ghost hidden sm:inline-flex\">\n {label}\n </Link>\n )\n )}\n {cta && (\n <Link href={cta.href} className=\"btn-primary\">\n {cta.label}\n </Link>\n )}\n {rightSlot}\n </div>\n </nav>\n </header>\n );\n}\n","/**\n * Disclosure for links that open in a new tab (WCAG 3.2.5), shared by every\n * `target=\"_blank\"` link in this package so sighted and screen-reader users get\n * the same warning.\n *\n * - Sighted: a small \"arrow out of a box\" glyph after the link content.\n * - Screen reader: the visually hidden text \"(opens in a new tab)\", appended to\n * the link's accessible name. For a link that sets `aria-label` (which\n * replaces its content in the name), append `NEW_TAB_SUFFIX` to the label\n * instead and pass `hideText` so the name is not announced twice.\n */\nexport const NEW_TAB_SUFFIX = ' (opens in a new tab)';\n\nexport function NewTabIndicator({ hideText = false }: { hideText?: boolean }) {\n return (\n <>\n <svg\n aria-hidden=\"true\"\n focusable=\"false\"\n viewBox=\"0 0 24 24\"\n width=\"0.85em\"\n height=\"0.85em\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"ml-1 inline-block shrink-0 align-baseline\"\n >\n <path d=\"M15 3h6v6\" />\n <path d=\"M10 14 21 3\" />\n <path d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\" />\n </svg>\n {hideText ? null : <span className=\"sr-only\">{NEW_TAB_SUFFIX}</span>}\n </>\n );\n}\n","import type { GitHubNavButtonProps } from './types';\nimport { NEW_TAB_SUFFIX, NewTabIndicator } from './NewTabIndicator';\n\n/**\n * The unified GitHub account control for the nav's right slot — the canonical\n * login affordance + login-state indicator shared across every L1/L2 dataimago\n * app (rendered into `PlatformNav`'s `rightSlot`).\n *\n * Fully presentational and **stateless** — it reads no auth itself; the consumer\n * feeds it. Uses a native `<details>` disclosure for the signed-in menu, so it\n * needs no client JS and works whether rendered on the server (a server parent\n * injecting the avatar) or the client.\n *\n * - `mode=\"auth\"` (default): the login-state indicator.\n * - `status=\"unauthed\"` → a GET link to `signInHref` (start OAuth) showing the\n * GitHub mark + a login glyph.\n * - `status=\"authed\"` → the GitHub mark + the user's avatar, opening a menu\n * (profile link + a POST sign-out form to `signOutAction`).\n * - `mode=\"link\"`: a plain GitHub→`orgHref` link (L1, which has no auth).\n *\n * Icons are inlined (the GitHub mark + a lucide-style \"log-in\" glyph) to keep the\n * shared package free of an icon-library peer dependency.\n */\n\n// The 48px touch-target floor (the ready-to-hand dignity gate); colours resolve\n// from the consuming app's dataimago palette. The global `*:focus-visible` rule\n// supplies the focus ring.\nconst SHELL =\n 'inline-flex min-h-[48px] items-center gap-2 rounded-xl border border-stone-200 ' +\n 'bg-stone-50 px-3 text-stone-900 transition hover:bg-stone-100';\n\nconst MENU_ITEM =\n 'flex min-h-[48px] w-full items-center rounded px-2 text-left text-sm ' +\n 'text-stone-900 transition hover:bg-stone-100';\n\nfunction GithubMark() {\n return (\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" className=\"h-5 w-5 shrink-0\" fill=\"currentColor\">\n <path d=\"M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23a11.5 11.5 0 0 1 3.003-.404c1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222 0 1.606-.014 2.898-.014 3.293 0 .322.216.694.825.576C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12\" />\n </svg>\n );\n}\n\nfunction LoginGlyph() {\n // lucide \"log-in\" (ISC), inlined.\n return (\n <svg\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n className=\"h-5 w-5 shrink-0\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M15 3h4a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-4\" />\n <polyline points=\"10 17 15 12 10 7\" />\n <line x1=\"15\" x2=\"3\" y1=\"12\" y2=\"12\" />\n </svg>\n );\n}\n\nexport function GitHubNavButton({\n mode = 'auth',\n status = 'unauthed',\n login,\n avatarUrl,\n signInHref,\n profileHref,\n signOutAction,\n orgHref,\n defaultOpen,\n}: GitHubNavButtonProps) {\n // L1 mode: a plain GitHub→org link (no auth).\n if (mode === 'link') {\n return (\n <a\n href={orgHref}\n target=\"_blank\"\n rel=\"noreferrer\"\n className={SHELL}\n aria-label={`dataimago on GitHub${NEW_TAB_SUFFIX}`}\n >\n <GithubMark />\n <NewTabIndicator hideText />\n </a>\n );\n }\n\n // Signed out: a GET link that starts the OAuth flow.\n if (status !== 'authed') {\n return (\n <a href={signInHref} className={SHELL} aria-label=\"Sign in with GitHub\">\n <GithubMark />\n <LoginGlyph />\n </a>\n );\n }\n\n // Signed in: the GitHub mark + the user's avatar, with a native-disclosure menu.\n return (\n <details className=\"relative\" open={defaultOpen}>\n <summary\n className={`${SHELL} cursor-pointer list-none [&::-webkit-details-marker]:hidden`}\n aria-label={`GitHub account — signed in as ${login ?? 'your account'}`}\n >\n <GithubMark />\n {avatarUrl ? (\n <img\n src={avatarUrl}\n alt=\"\"\n className=\"h-7 w-7 rounded-full border border-stone-200\"\n width={28}\n height={28}\n />\n ) : (\n <span className=\"text-sm font-medium\">@{login}</span>\n )}\n </summary>\n <div className=\"absolute right-0 z-50 mt-2 w-60 rounded-lg border border-stone-200 bg-stone-50 p-2 shadow-lg\">\n <p className=\"px-2 py-1 text-sm text-stone-700\">\n Signed in as <span className=\"font-medium text-stone-900\">@{login}</span>\n </p>\n {profileHref && (\n <a href={profileHref} target=\"_blank\" rel=\"noreferrer\" className={MENU_ITEM}>\n View your GitHub profile\n <NewTabIndicator />\n </a>\n )}\n {signOutAction && (\n <form method=\"POST\" action={signOutAction}>\n <button type=\"submit\" className={MENU_ITEM}>\n Sign out\n </button>\n </form>\n )}\n </div>\n </details>\n );\n}\n","'use client';\n\nimport Link from 'next/link';\nimport { Logo } from '@dataimago/ui';\nimport type { SiteFooterProps } from './types';\nimport { NewTabIndicator } from './NewTabIndicator';\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',\n label: 'dataimago',\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 <NewTabIndicator />\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';\nimport { NEW_TAB_SUFFIX, NewTabIndicator } from './NewTabIndicator';\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${NEW_TAB_SUFFIX}`}\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\">\n {embodimentLabel}\n <NewTabIndicator hideText />\n </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 <NewTabIndicator />\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): eyebrows were meant to resolve to\n * sky-blue accent-300 (#3498DB) on this dark surface via mode-aware mapping —\n * 5.41:1 on stone-900. The static Tailwind class `text-accent-500` binds the\n * absolute color instead (~2.56:1). 2026-09-05: eyebrows match SiteFooter\n * (`text-accent-300` + `data-bs-theme=\"dark\"`). The border-copper-500\n * blockquote frame survives untouched. \"Two warmths\" coexist: cool sky-blue\n * on editorial eyebrows, warm copper on the 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 density = 'default',\n}: PhilosophyFooterProps) {\n const compact = density === 'compact';\n\n // Pull-quote — border-copper-500 PRESERVED: decorative-emphasis blockquote\n // frame per iteration-1 §5.2 preserved-decorative-copper governance.\n const pullQuote = (\n <blockquote\n className={`border-l-2 border-copper-500 pl-6 font-display italic text-paper-100 ${\n compact ? '' : 'mt-16 max-w-prose-wide'\n }`}\n >\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\n const closing = (\n <p\n className={`text-stone-400 ${\n compact ? 'text-base leading-relaxed' : 'mt-8 max-w-prose-wide text-sm'\n }`}\n >\n {closingStatement}\n </p>\n );\n\n return (\n <section\n aria-labelledby=\"philosophy-heading\"\n className={`border-t border-stone-200 bg-stone-900 text-paper-100 ${\n compact\n ? 'flex flex-col justify-center py-14 sm:py-16 lg:min-h-[50vh]'\n : 'py-20 sm:py-28'\n }`}\n data-bs-theme=\"dark\"\n >\n <div className=\"mx-auto w-full max-w-6xl px-6\">\n <div className={`grid lg:grid-cols-3 ${compact ? 'gap-8' : 'gap-12'}`}>\n {pairs.map((pair, i) => (\n <div key={i}>\n <p className=\"font-mono text-xs uppercase tracking-wider text-accent-300\">\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 {compact ? (\n // Critique / answer, side by side — Baudrillard's warning and\n // dataimago's structural answer. Filling the width is what pulls the\n // section down to ~half height (the default stacks these in one column,\n // leaving the right half empty).\n <div className=\"mt-10 grid gap-x-12 gap-y-8 lg:grid-cols-2\">\n {pullQuote}\n {closing}\n </div>\n ) : (\n <>\n {pullQuote}\n {closing}\n </>\n )}\n </div>\n </section>\n );\n}\n"],"mappings":"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","names":["jsx","jsxs","jsx","jsxs","Link","Logo","jsx","jsxs","Link","Logo","Link","Logo","jsx","jsxs","Logo","Link","Fragment","jsx","jsxs"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dataimago/hub-chrome",
3
- "version": "0.2.0-alpha.6",
3
+ "version": "0.2.0-alpha.7",
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": {