@dataimago/hub-chrome 0.2.0-alpha.2 → 0.2.0-alpha.3
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 +135 -36
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +41 -2
- package/dist/index.d.ts +41 -2
- package/dist/index.js +134 -36
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -30,6 +30,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
30
30
|
// src/index.ts
|
|
31
31
|
var index_exports = {};
|
|
32
32
|
__export(index_exports, {
|
|
33
|
+
GitHubNavButton: () => GitHubNavButton,
|
|
33
34
|
MinimalFooter: () => MinimalFooter,
|
|
34
35
|
PhilosophyFooter: () => PhilosophyFooter,
|
|
35
36
|
PlatformNav: () => PlatformNav,
|
|
@@ -55,6 +56,7 @@ function PlatformNav({
|
|
|
55
56
|
brandLabel = "dataimago.ai home",
|
|
56
57
|
links = DEFAULT_LINKS,
|
|
57
58
|
cta = DEFAULT_CTA,
|
|
59
|
+
rightSlot,
|
|
58
60
|
navLabel = "Primary",
|
|
59
61
|
homeHref = "/"
|
|
60
62
|
}) {
|
|
@@ -93,17 +95,113 @@ function PlatformNav({
|
|
|
93
95
|
href
|
|
94
96
|
) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_link.default, { href, className: "btn-ghost hidden sm:inline-flex", children: label }, href)
|
|
95
97
|
),
|
|
96
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_link.default, { href: cta.href, className: "btn-primary", children: cta.label })
|
|
98
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_link.default, { href: cta.href, className: "btn-primary", children: cta.label }),
|
|
99
|
+
rightSlot
|
|
97
100
|
] })
|
|
98
101
|
]
|
|
99
102
|
}
|
|
100
103
|
) });
|
|
101
104
|
}
|
|
102
105
|
|
|
106
|
+
// src/GitHubNavButton.tsx
|
|
107
|
+
var import_jsx_runtime2 = require("react/jsx-runtime");
|
|
108
|
+
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
|
+
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
|
+
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" }) });
|
|
112
|
+
}
|
|
113
|
+
function LoginGlyph() {
|
|
114
|
+
return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
|
|
115
|
+
"svg",
|
|
116
|
+
{
|
|
117
|
+
viewBox: "0 0 24 24",
|
|
118
|
+
"aria-hidden": "true",
|
|
119
|
+
className: "h-5 w-5 shrink-0",
|
|
120
|
+
fill: "none",
|
|
121
|
+
stroke: "currentColor",
|
|
122
|
+
strokeWidth: "2",
|
|
123
|
+
strokeLinecap: "round",
|
|
124
|
+
strokeLinejoin: "round",
|
|
125
|
+
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" })
|
|
129
|
+
]
|
|
130
|
+
}
|
|
131
|
+
);
|
|
132
|
+
}
|
|
133
|
+
function GitHubNavButton({
|
|
134
|
+
mode = "auth",
|
|
135
|
+
status = "unauthed",
|
|
136
|
+
login,
|
|
137
|
+
avatarUrl,
|
|
138
|
+
signInHref,
|
|
139
|
+
profileHref,
|
|
140
|
+
signOutAction,
|
|
141
|
+
orgHref,
|
|
142
|
+
defaultOpen
|
|
143
|
+
}) {
|
|
144
|
+
if (mode === "link") {
|
|
145
|
+
return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
146
|
+
"a",
|
|
147
|
+
{
|
|
148
|
+
href: orgHref,
|
|
149
|
+
target: "_blank",
|
|
150
|
+
rel: "noreferrer",
|
|
151
|
+
className: SHELL,
|
|
152
|
+
"aria-label": "dataimago on GitHub",
|
|
153
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(GithubMark, {})
|
|
154
|
+
}
|
|
155
|
+
);
|
|
156
|
+
}
|
|
157
|
+
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, {})
|
|
161
|
+
] });
|
|
162
|
+
}
|
|
163
|
+
return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("details", { className: "relative", open: defaultOpen, children: [
|
|
164
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
|
|
165
|
+
"summary",
|
|
166
|
+
{
|
|
167
|
+
className: `${SHELL} cursor-pointer list-none [&::-webkit-details-marker]:hidden`,
|
|
168
|
+
"aria-label": `GitHub account \u2014 signed in as ${login ?? "your account"}`,
|
|
169
|
+
children: [
|
|
170
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(GithubMark, {}),
|
|
171
|
+
avatarUrl ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
172
|
+
"img",
|
|
173
|
+
{
|
|
174
|
+
src: avatarUrl,
|
|
175
|
+
alt: "",
|
|
176
|
+
className: "h-7 w-7 rounded-full border border-stone-200",
|
|
177
|
+
width: 28,
|
|
178
|
+
height: 28
|
|
179
|
+
}
|
|
180
|
+
) : /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { className: "text-sm font-medium", children: [
|
|
181
|
+
"@",
|
|
182
|
+
login
|
|
183
|
+
] })
|
|
184
|
+
]
|
|
185
|
+
}
|
|
186
|
+
),
|
|
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: [
|
|
189
|
+
"Signed in as ",
|
|
190
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { className: "font-medium text-stone-900", children: [
|
|
191
|
+
"@",
|
|
192
|
+
login
|
|
193
|
+
] })
|
|
194
|
+
] }),
|
|
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" }) })
|
|
197
|
+
] })
|
|
198
|
+
] });
|
|
199
|
+
}
|
|
200
|
+
|
|
103
201
|
// src/SiteFooter.tsx
|
|
104
202
|
var import_link2 = __toESM(require("next/link"), 1);
|
|
105
203
|
var import_ui2 = require("@dataimago/ui");
|
|
106
|
-
var
|
|
204
|
+
var import_jsx_runtime3 = require("react/jsx-runtime");
|
|
107
205
|
var DEFAULT_TAGLINE = "A living AI-native application ecosystem.";
|
|
108
206
|
var DEFAULT_COLUMNS = [
|
|
109
207
|
{
|
|
@@ -140,21 +238,21 @@ function SiteFooter({
|
|
|
140
238
|
columns = DEFAULT_COLUMNS,
|
|
141
239
|
closingStatement
|
|
142
240
|
}) {
|
|
143
|
-
return /* @__PURE__ */ (0,
|
|
241
|
+
return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
144
242
|
"footer",
|
|
145
243
|
{
|
|
146
244
|
className: "border-t border-stone-800 bg-stone-900 text-stone-400",
|
|
147
245
|
"data-bs-theme": "dark",
|
|
148
|
-
children: /* @__PURE__ */ (0,
|
|
149
|
-
/* @__PURE__ */ (0,
|
|
150
|
-
/* @__PURE__ */ (0,
|
|
151
|
-
/* @__PURE__ */ (0,
|
|
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)(
|
|
152
250
|
import_link2.default,
|
|
153
251
|
{
|
|
154
252
|
href: "/",
|
|
155
253
|
className: "inline-flex items-center text-stone-100 transition hover:opacity-80",
|
|
156
254
|
"aria-label": "dataimago",
|
|
157
|
-
children: /* @__PURE__ */ (0,
|
|
255
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
158
256
|
import_ui2.Logo,
|
|
159
257
|
{
|
|
160
258
|
name: "dataimago",
|
|
@@ -165,11 +263,11 @@ function SiteFooter({
|
|
|
165
263
|
)
|
|
166
264
|
}
|
|
167
265
|
),
|
|
168
|
-
/* @__PURE__ */ (0,
|
|
266
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("p", { className: "mt-3 text-xs text-stone-400", children: tagline })
|
|
169
267
|
] }),
|
|
170
|
-
columns.map((col) => /* @__PURE__ */ (0,
|
|
171
|
-
/* @__PURE__ */ (0,
|
|
172
|
-
/* @__PURE__ */ (0,
|
|
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)(
|
|
173
271
|
"a",
|
|
174
272
|
{
|
|
175
273
|
href,
|
|
@@ -178,10 +276,10 @@ function SiteFooter({
|
|
|
178
276
|
rel: "noreferrer",
|
|
179
277
|
children: label
|
|
180
278
|
}
|
|
181
|
-
) : /* @__PURE__ */ (0,
|
|
279
|
+
) : /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_link2.default, { href, className: "hover:text-paper-100", children: label }) }, label)) })
|
|
182
280
|
] }, col.heading))
|
|
183
281
|
] }),
|
|
184
|
-
closingStatement ? /* @__PURE__ */ (0,
|
|
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
|
|
185
283
|
] })
|
|
186
284
|
}
|
|
187
285
|
);
|
|
@@ -190,7 +288,7 @@ function SiteFooter({
|
|
|
190
288
|
// src/MinimalFooter.tsx
|
|
191
289
|
var import_link3 = __toESM(require("next/link"), 1);
|
|
192
290
|
var import_ui3 = require("@dataimago/ui");
|
|
193
|
-
var
|
|
291
|
+
var import_jsx_runtime4 = require("react/jsx-runtime");
|
|
194
292
|
var DEFAULT_BRAND_HREF = "https://dataimago.ai";
|
|
195
293
|
var DEFAULT_EMBODIMENT = "An embodiment of dataimago";
|
|
196
294
|
function MinimalFooter({
|
|
@@ -199,13 +297,13 @@ function MinimalFooter({
|
|
|
199
297
|
links = [],
|
|
200
298
|
copyright
|
|
201
299
|
}) {
|
|
202
|
-
return /* @__PURE__ */ (0,
|
|
300
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
203
301
|
"footer",
|
|
204
302
|
{
|
|
205
303
|
className: "border-t border-stone-800 bg-stone-900 text-stone-400",
|
|
206
304
|
"data-bs-theme": "dark",
|
|
207
|
-
children: /* @__PURE__ */ (0,
|
|
208
|
-
/* @__PURE__ */ (0,
|
|
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)(
|
|
209
307
|
"a",
|
|
210
308
|
{
|
|
211
309
|
href: brandHref,
|
|
@@ -214,7 +312,7 @@ function MinimalFooter({
|
|
|
214
312
|
rel: "noreferrer",
|
|
215
313
|
"aria-label": `${embodimentLabel} \u2014 visit dataimago.ai`,
|
|
216
314
|
children: [
|
|
217
|
-
/* @__PURE__ */ (0,
|
|
315
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
218
316
|
import_ui3.Logo,
|
|
219
317
|
{
|
|
220
318
|
name: "dataimago",
|
|
@@ -223,17 +321,17 @@ function MinimalFooter({
|
|
|
223
321
|
className: "[&_svg]:h-7 [&_svg]:w-auto"
|
|
224
322
|
}
|
|
225
323
|
),
|
|
226
|
-
/* @__PURE__ */ (0,
|
|
324
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "text-sm text-stone-400", children: embodimentLabel })
|
|
227
325
|
]
|
|
228
326
|
}
|
|
229
327
|
),
|
|
230
|
-
links.length > 0 ? /* @__PURE__ */ (0,
|
|
328
|
+
links.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
231
329
|
"nav",
|
|
232
330
|
{
|
|
233
331
|
className: "flex flex-wrap items-center justify-center gap-x-6 gap-y-2 text-sm",
|
|
234
332
|
"aria-label": "Footer",
|
|
235
333
|
children: links.map(
|
|
236
|
-
({ href, label, external }) => !href ? /* @__PURE__ */ (0,
|
|
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)(
|
|
237
335
|
"a",
|
|
238
336
|
{
|
|
239
337
|
href,
|
|
@@ -243,18 +341,18 @@ function MinimalFooter({
|
|
|
243
341
|
children: label
|
|
244
342
|
},
|
|
245
343
|
label
|
|
246
|
-
) : /* @__PURE__ */ (0,
|
|
344
|
+
) : /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_link3.default, { href, className: "text-stone-300 hover:text-paper-100", children: label }, label)
|
|
247
345
|
)
|
|
248
346
|
}
|
|
249
347
|
) : null,
|
|
250
|
-
copyright ? /* @__PURE__ */ (0,
|
|
348
|
+
copyright ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("p", { className: "text-xs text-stone-400", children: copyright }) : null
|
|
251
349
|
] })
|
|
252
350
|
}
|
|
253
351
|
);
|
|
254
352
|
}
|
|
255
353
|
|
|
256
354
|
// src/PhilosophyFooter.tsx
|
|
257
|
-
var
|
|
355
|
+
var import_jsx_runtime5 = require("react/jsx-runtime");
|
|
258
356
|
var DEFAULT_PAIRS = [
|
|
259
357
|
{
|
|
260
358
|
eyebrow: "our belief",
|
|
@@ -281,42 +379,43 @@ function PhilosophyFooter({
|
|
|
281
379
|
quote = DEFAULT_QUOTE,
|
|
282
380
|
closingStatement = DEFAULT_CLOSING
|
|
283
381
|
}) {
|
|
284
|
-
return /* @__PURE__ */ (0,
|
|
382
|
+
return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
285
383
|
"section",
|
|
286
384
|
{
|
|
287
385
|
"aria-labelledby": "philosophy-heading",
|
|
288
386
|
className: "border-t border-stone-200 bg-stone-900 py-20 text-paper-100 sm:py-28",
|
|
289
|
-
children: /* @__PURE__ */ (0,
|
|
290
|
-
/* @__PURE__ */ (0,
|
|
291
|
-
/* @__PURE__ */ (0,
|
|
292
|
-
i === 0 ? /* @__PURE__ */ (0,
|
|
387
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "mx-auto max-w-6xl px-6", children: [
|
|
388
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "grid gap-12 lg:grid-cols-3", children: pairs.map((pair, i) => /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { children: [
|
|
389
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "font-mono text-xs uppercase tracking-wider text-accent-500", children: pair.eyebrow }),
|
|
390
|
+
i === 0 ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
293
391
|
"h3",
|
|
294
392
|
{
|
|
295
393
|
id: "philosophy-heading",
|
|
296
394
|
className: "mt-2 font-display text-xl text-paper-100",
|
|
297
395
|
children: pair.body
|
|
298
396
|
}
|
|
299
|
-
) : /* @__PURE__ */ (0,
|
|
397
|
+
) : /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "mt-2 font-display text-xl text-paper-100", children: pair.body })
|
|
300
398
|
] }, i)) }),
|
|
301
|
-
/* @__PURE__ */ (0,
|
|
302
|
-
/* @__PURE__ */ (0,
|
|
303
|
-
/* @__PURE__ */ (0,
|
|
399
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("blockquote", { className: "mt-16 max-w-prose-wide border-l-2 border-copper-500 pl-6 font-display italic text-paper-100", children: [
|
|
400
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "text-base leading-relaxed", children: quote.text }),
|
|
401
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("footer", { className: "mt-4 text-sm not-italic text-stone-400", children: [
|
|
304
402
|
"\u2014 ",
|
|
305
403
|
quote.attribution,
|
|
306
404
|
", ",
|
|
307
|
-
/* @__PURE__ */ (0,
|
|
405
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("cite", { children: quote.work }),
|
|
308
406
|
" (",
|
|
309
407
|
quote.year,
|
|
310
408
|
")"
|
|
311
409
|
] })
|
|
312
410
|
] }),
|
|
313
|
-
/* @__PURE__ */ (0,
|
|
411
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "mt-8 max-w-prose-wide text-sm text-stone-400", children: closingStatement })
|
|
314
412
|
] })
|
|
315
413
|
}
|
|
316
414
|
);
|
|
317
415
|
}
|
|
318
416
|
// Annotate the CommonJS export names for ESM import in node:
|
|
319
417
|
0 && (module.exports = {
|
|
418
|
+
GitHubNavButton,
|
|
320
419
|
MinimalFooter,
|
|
321
420
|
PhilosophyFooter,
|
|
322
421
|
PlatformNav,
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/PlatformNav.tsx","../src/SiteFooter.tsx","../src/MinimalFooter.tsx","../src/PhilosophyFooter.tsx"],"sourcesContent":["/**\n * @dataimago/hub-chrome — public surface barrel.\n *\n * All three chrome components are named exports. The original apps/hub\n * versions were default exports; the package exposes them as named exports\n * for tree-shaking and to keep the import surface symmetric with\n * @dataimago/ui and @dataimago/interview.\n */\nexport { PlatformNav } from './PlatformNav';\nexport { SiteFooter } from './SiteFooter';\nexport { MinimalFooter } from './MinimalFooter';\nexport { PhilosophyFooter } from './PhilosophyFooter';\n\nexport type {\n NavLink,\n FooterColumn,\n EditorialPair,\n PullQuote,\n BrandMark,\n NavbarMark,\n AiMonogram,\n PlatformNavProps,\n SiteFooterProps,\n MinimalFooterProps,\n PhilosophyFooterProps,\n} from './types';\n","'use client';\n\nimport Link from 'next/link';\nimport { Logo, NavbarLogo } from '@dataimago/ui';\nimport type { PlatformNavProps } from './types';\n\n/**\n * Platform navigation — sticky header with the property's brand mark + nav cluster.\n *\n * The property mark is rendered by height (so any aspect fits the nav). By default\n * it's the static `@dataimago/brand` wordmark via `<Logo>` (font-free, IoU-locked,\n * `currentColor`). When `navbarMark` is set it becomes the ANIMATED `<NavbarLogo>`\n * (the a/i assemble toggle for L2 marks, lift+wash for L1) — falling back to the\n * static `<Logo brandMark>` otherwise, so pre-navbar consumers are unaffected.\n *\n * `aiMonogram` adds the dataimago `ai-monogram` icon button to the LEFT of the\n * property mark (a 48px touch target; lift+washes to the brand-mark red on hover).\n *\n * Extracted from apps/hub into @dataimago/hub-chrome during iteration-3-B.2\n * (2026-05-11); `navbarMark`/`aiMonogram` added in iteration-4 (the navbar logo\n * system). All props default to the Level-1 hub configuration.\n */\n\nconst DEFAULT_LINKS = [\n { href: '/ecosystem', label: 'Ecosystem' },\n { href: '/philosophy', label: 'Philosophy' },\n];\n\nconst DEFAULT_CTA = { href: '/onboard', label: 'Begin' };\n\n/** Height-based sizing for the property mark (the navbar norm — ~30% larger letters). */\nconst MARK_CLASS = '[&_svg]:h-7 [&_svg]:w-auto sm:[&_svg]:h-8';\n\n/** The optional ai-monogram icon button — a 48px touch target (ready-to-hand floor). */\nconst AI_BUTTON_CLASS =\n 'inline-flex min-h-[48px] min-w-[48px] items-center justify-center rounded-xl ' +\n 'border border-stone-200 bg-stone-50 text-stone-900 transition hover:bg-stone-100';\n\nexport function PlatformNav({\n brandMark = 'dataimago_ai_OVERLAP',\n navbarMark,\n aiMonogram,\n brandLabel = 'dataimago.ai home',\n links = DEFAULT_LINKS,\n cta = DEFAULT_CTA,\n navLabel = 'Primary',\n homeHref = '/',\n}: PlatformNavProps) {\n const propertyMark = navbarMark ? (\n <NavbarLogo name={navbarMark} aria-hidden className={MARK_CLASS} />\n ) : (\n <Logo name={brandMark} variant=\"PATH\" aria-hidden className={MARK_CLASS} />\n );\n\n const aiHref = typeof aiMonogram === 'object' ? aiMonogram.href : undefined;\n const aiLabel =\n typeof aiMonogram === 'object' ? (aiMonogram.label ?? 'dataimago') : 'dataimago';\n\n return (\n <header className=\"sticky top-0 z-40 border-b border-stone-200 bg-stone-100/95 backdrop-blur-sm\">\n <nav\n className=\"mx-auto flex max-w-7xl items-center justify-between px-6 py-4\"\n aria-label={navLabel}\n >\n <div className=\"flex items-center gap-2 sm:gap-3\">\n {aiMonogram &&\n (aiHref ? (\n <Link href={aiHref} aria-label={aiLabel} className={AI_BUTTON_CLASS}>\n <NavbarLogo name=\"ai-monogram\" aria-hidden className=\"[&_svg]:h-6 [&_svg]:w-auto\" />\n </Link>\n ) : (\n <span className={AI_BUTTON_CLASS} aria-hidden>\n <NavbarLogo name=\"ai-monogram\" aria-hidden className=\"[&_svg]:h-6 [&_svg]:w-auto\" />\n </span>\n ))}\n <Link\n href={homeHref}\n className=\"inline-flex min-h-[48px] items-center text-stone-900 transition hover:opacity-80\"\n aria-label={brandLabel}\n >\n {propertyMark}\n </Link>\n </div>\n\n <div className=\"flex items-center gap-2 sm:gap-6\">\n {links.map(({ href, label, external }) =>\n external ? (\n <a\n key={href}\n href={href}\n className=\"btn-ghost hidden sm:inline-flex\"\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {label}\n </a>\n ) : (\n <Link key={href} href={href} className=\"btn-ghost hidden sm:inline-flex\">\n {label}\n </Link>\n )\n )}\n <Link href={cta.href} className=\"btn-primary\">\n {cta.label}\n </Link>\n </div>\n </nav>\n </header>\n );\n}\n","'use client';\n\nimport Link from 'next/link';\nimport { Logo } from '@dataimago/ui';\nimport type { SiteFooterProps } from './types';\n\n/**\n * Site footer — the Level-1 hub footer: dark surface, dataimago wordmark + a\n * trimmed nav column grid.\n *\n * The wordmark is the `dataimago` brand mark via `<Logo>` (font-free, in a light\n * `currentColor` on the dark surface) — no backplate, no hardcoded \".ai\" span.\n *\n * Extracted from apps/hub into @dataimago/hub-chrome during iteration-3-B.2\n * (2026-05-11). The defaults drop the former \"Legacy\" column + the critical-theory\n * closing statement (the philosophical-basis editorial lives on the PhilosophyFooter,\n * which is Level-1-only). Level-2 verticals use `MinimalFooter` instead.\n */\n\nconst DEFAULT_TAGLINE = 'A living AI-native application ecosystem.';\n\nconst DEFAULT_COLUMNS = [\n {\n heading: 'Platform',\n links: [\n { href: '/onboard', label: 'Begin a project' },\n { href: '/ecosystem', label: 'Ecosystem' },\n { href: '/philosophy', label: 'Philosophy' },\n ],\n },\n {\n heading: 'Framework',\n links: [\n {\n href: 'https://github.com/dataimago/dataimago-design',\n label: 'dataimago-design',\n external: true,\n },\n {\n href: 'https://github.com/dataimago/dataimago-rpkg',\n label: 'dataimago-rpkg',\n external: true,\n },\n {\n href: 'https://github.com/dataimago/dataimago-ai',\n label: 'dataimago-ai',\n external: true,\n },\n ],\n },\n];\n\nexport function SiteFooter({\n tagline = DEFAULT_TAGLINE,\n columns = DEFAULT_COLUMNS,\n closingStatement,\n}: SiteFooterProps) {\n return (\n <footer\n className=\"border-t border-stone-800 bg-stone-900 text-stone-400\"\n data-bs-theme=\"dark\"\n >\n <div className=\"mx-auto max-w-6xl px-6 py-12\">\n <div className=\"grid gap-8 md:grid-cols-4\">\n <div>\n <Link\n href=\"/\"\n className=\"inline-flex items-center text-stone-100 transition hover:opacity-80\"\n aria-label=\"dataimago\"\n >\n <Logo\n name=\"dataimago\"\n variant=\"PATH\"\n aria-hidden\n className=\"[&_svg]:h-7 [&_svg]:w-auto\"\n />\n </Link>\n <p className=\"mt-3 text-xs text-stone-400\">{tagline}</p>\n </div>\n\n {columns.map((col) => (\n <div key={col.heading}>\n <h4 className=\"font-mono text-xs uppercase tracking-wider text-accent-300\">\n {col.heading}\n </h4>\n <ul className=\"mt-3 space-y-2 text-sm\">\n {col.links.map(({ href, label, external }) => (\n <li key={label}>\n {!href ? (\n label\n ) : external ? (\n <a\n href={href}\n className=\"hover:text-paper-100\"\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {label}\n </a>\n ) : (\n <Link href={href} className=\"hover:text-paper-100\">\n {label}\n </Link>\n )}\n </li>\n ))}\n </ul>\n </div>\n ))}\n </div>\n\n {closingStatement ? (\n <div className=\"mt-12 border-t border-stone-800 pt-6 text-xs text-stone-400\">\n <p>{closingStatement}</p>\n </div>\n ) : null}\n </div>\n </footer>\n );\n}\n","'use client';\n\nimport Link from 'next/link';\nimport { Logo } from '@dataimago/ui';\nimport type { MinimalFooterProps } from './types';\n\n/**\n * MinimalFooter — the Level-2 vertical footer.\n *\n * A Level-2 vertical (dissertation.ai, future rpkg.ai / sgpc.ai) is \"an embodiment\n * of dataimago\": the footer shows the parent `dataimago` wordmark linking UP to\n * dataimago.ai, the embodiment line, a compact links row, and a copyright line.\n * No nav columns, no philosophy — those belong to the Level-1 hub (SiteFooter +\n * PhilosophyFooter). See dataimago-design wiki/patterns/hub-hero-anatomy.\n */\n\nconst DEFAULT_BRAND_HREF = 'https://dataimago.ai';\nconst DEFAULT_EMBODIMENT = 'An embodiment of dataimago';\n\nexport function MinimalFooter({\n brandHref = DEFAULT_BRAND_HREF,\n embodimentLabel = DEFAULT_EMBODIMENT,\n links = [],\n copyright,\n}: MinimalFooterProps) {\n return (\n <footer\n className=\"border-t border-stone-800 bg-stone-900 text-stone-400\"\n data-bs-theme=\"dark\"\n >\n <div className=\"mx-auto flex max-w-6xl flex-col items-center gap-4 px-6 py-10 text-center\">\n <a\n href={brandHref}\n className=\"inline-flex flex-col items-center gap-2 text-stone-100 transition hover:opacity-80\"\n target=\"_blank\"\n rel=\"noreferrer\"\n aria-label={`${embodimentLabel} — visit dataimago.ai`}\n >\n <Logo\n name=\"dataimago\"\n variant=\"PATH\"\n aria-hidden\n className=\"[&_svg]:h-7 [&_svg]:w-auto\"\n />\n <span className=\"text-sm text-stone-400\">{embodimentLabel}</span>\n </a>\n\n {links.length > 0 ? (\n <nav\n className=\"flex flex-wrap items-center justify-center gap-x-6 gap-y-2 text-sm\"\n aria-label=\"Footer\"\n >\n {links.map(({ href, label, external }) =>\n !href ? (\n <span key={label} className=\"text-stone-400\">\n {label}\n </span>\n ) : external ? (\n <a\n key={label}\n href={href}\n className=\"text-stone-300 hover:text-paper-100\"\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {label}\n </a>\n ) : (\n <Link key={label} href={href} className=\"text-stone-300 hover:text-paper-100\">\n {label}\n </Link>\n )\n )}\n </nav>\n ) : null}\n\n {copyright ? <p className=\"text-xs text-stone-400\">{copyright}</p> : null}\n </div>\n </footer>\n );\n}\n","'use client';\n\nimport type { PhilosophyFooterProps } from './types';\n\n/**\n * Philosophy footer — the platform's moral weight, rendered as a dark\n * editorial section with three belief/mission/vision pairs and a pull-quote.\n *\n * Iteration-1 visual identity (Phase B.3, 2026-05-06):\n * Dark-surface chrome with text-accent-500 eyebrows, font-display body, and\n * the Baudrillard blockquote with border-copper-500 (preserved-decorative-\n * copper per iteration-1 §5.2 governance).\n *\n * Iteration-2 role-shift (2026-05-07): text-accent-500 eyebrows resolve to\n * sky-blue accent-300 (#3498DB) on this dark surface via mode-aware mapping —\n * 5.41:1 on stone-900 (was 3.23:1 AA-large only with copper). The\n * border-copper-500 blockquote frame survives untouched. \"Two warmths\"\n * coexist: cool sky-blue on editorial eyebrows, warm copper on the\n * philosophical-quote frame.\n *\n * Extracted from apps/hub into @dataimago/hub-chrome during iteration-3-B.2\n * (2026-05-11). The `pairs`, `quote`, and `closingStatement` props allow\n * per-vertical adaptation; all props default to the Level-1 hub content.\n */\n\nconst DEFAULT_PAIRS = [\n {\n eyebrow: 'our belief',\n body: 'AI can enable virtuous cycles of improvement in the world.',\n },\n {\n eyebrow: 'our mission',\n body: 'The emancipation of humanity through ai super-alignment.',\n },\n {\n eyebrow: 'our vision',\n body: 'Super-alignment embeds ai in culture, not culture in ai.',\n },\n];\n\nconst DEFAULT_QUOTE = {\n text: `If men create intelligent machines, or fantasize about them, it is either because they secretly despair of their own intelligence or because they are in danger of succumbing to the weight of a monstrous and useless intelligence which they seek to exorcize by transferring it to machines, where they can play with it and make fun of it. By entrusting this burdensome intelligence to machines we are released from any responsibility to knowledge.`,\n attribution: 'Jean Baudrillard',\n work: 'Xerox and Infinity',\n year: 1988,\n};\n\nconst DEFAULT_CLOSING =\n 'dataimago is the structural answer to this critique. Every architectural choice — R as source of truth, editorial authority with the domain expert, the non-destructive retrofit principle, the ecosystem-as-commons — refuses to release the scholar from responsibility to their own knowledge. The AI serves the culture; the culture governs the AI.';\n\nexport function PhilosophyFooter({\n pairs = DEFAULT_PAIRS,\n quote = DEFAULT_QUOTE,\n closingStatement = DEFAULT_CLOSING,\n}: PhilosophyFooterProps) {\n return (\n <section\n aria-labelledby=\"philosophy-heading\"\n className=\"border-t border-stone-200 bg-stone-900 py-20 text-paper-100 sm:py-28\"\n >\n <div className=\"mx-auto max-w-6xl px-6\">\n <div className=\"grid gap-12 lg:grid-cols-3\">\n {pairs.map((pair, i) => (\n <div key={i}>\n <p className=\"font-mono text-xs uppercase tracking-wider text-accent-500\">\n {pair.eyebrow}\n </p>\n {i === 0 ? (\n <h3\n id=\"philosophy-heading\"\n className=\"mt-2 font-display text-xl text-paper-100\"\n >\n {pair.body}\n </h3>\n ) : (\n <p className=\"mt-2 font-display text-xl text-paper-100\">\n {pair.body}\n </p>\n )}\n </div>\n ))}\n </div>\n\n {/* Pull-quote — border-copper-500 PRESERVED: decorative-emphasis\n blockquote frame per iteration-1 §5.2 preserved-decorative-copper\n governance. */}\n <blockquote className=\"mt-16 max-w-prose-wide border-l-2 border-copper-500 pl-6 font-display italic text-paper-100\">\n <p className=\"text-base leading-relaxed\">{quote.text}</p>\n <footer className=\"mt-4 text-sm not-italic text-stone-400\">\n — {quote.attribution}, <cite>{quote.work}</cite> ({quote.year})\n </footer>\n </blockquote>\n\n <p className=\"mt-8 max-w-prose-wide text-sm text-stone-400\">\n {closingStatement}\n </p>\n </div>\n </section>\n );\n}\n"],"mappings":"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","names":["Link","import_link","import_ui","import_jsx_runtime","Link","import_link","import_ui","import_jsx_runtime","Link","import_jsx_runtime"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/PlatformNav.tsx","../src/GitHubNavButton.tsx","../src/SiteFooter.tsx","../src/MinimalFooter.tsx","../src/PhilosophyFooter.tsx"],"sourcesContent":["/**\n * @dataimago/hub-chrome — public surface barrel.\n *\n * All three chrome components are named exports. The original apps/hub\n * versions were default exports; the package exposes them as named exports\n * for tree-shaking and to keep the import surface symmetric with\n * @dataimago/ui and @dataimago/interview.\n */\nexport { PlatformNav } from './PlatformNav';\nexport { GitHubNavButton } from './GitHubNavButton';\nexport { SiteFooter } from './SiteFooter';\nexport { MinimalFooter } from './MinimalFooter';\nexport { PhilosophyFooter } from './PhilosophyFooter';\n\nexport type {\n NavLink,\n FooterColumn,\n EditorialPair,\n PullQuote,\n BrandMark,\n NavbarMark,\n AiMonogram,\n PlatformNavProps,\n GitHubNavButtonProps,\n SiteFooterProps,\n MinimalFooterProps,\n PhilosophyFooterProps,\n} from './types';\n","'use client';\n\nimport Link from 'next/link';\nimport { Logo, NavbarLogo } from '@dataimago/ui';\nimport type { PlatformNavProps } from './types';\n\n/**\n * Platform navigation — sticky header with the property's brand mark + nav cluster.\n *\n * The property mark is rendered by height (so any aspect fits the nav). By default\n * it's the static `@dataimago/brand` wordmark via `<Logo>` (font-free, IoU-locked,\n * `currentColor`). When `navbarMark` is set it becomes the ANIMATED `<NavbarLogo>`\n * (the a/i assemble toggle for L2 marks, lift+wash for L1) — falling back to the\n * static `<Logo brandMark>` otherwise, so pre-navbar consumers are unaffected.\n *\n * `aiMonogram` adds the dataimago `ai-monogram` icon button to the LEFT of the\n * property mark (a 48px touch target; lift+washes to the brand-mark red on hover).\n *\n * Extracted from apps/hub into @dataimago/hub-chrome during iteration-3-B.2\n * (2026-05-11); `navbarMark`/`aiMonogram` added in iteration-4 (the navbar logo\n * system). All props default to the Level-1 hub configuration.\n */\n\nconst DEFAULT_LINKS = [\n { href: '/ecosystem', label: 'Ecosystem' },\n { href: '/philosophy', label: 'Philosophy' },\n];\n\nconst DEFAULT_CTA = { href: '/onboard', label: 'Begin' };\n\n/** Height-based sizing for the property mark (the navbar norm — ~30% larger letters). */\nconst MARK_CLASS = '[&_svg]:h-7 [&_svg]:w-auto sm:[&_svg]:h-8';\n\n/** The optional ai-monogram icon button — a 48px touch target (ready-to-hand floor). */\nconst AI_BUTTON_CLASS =\n 'inline-flex min-h-[48px] min-w-[48px] items-center justify-center rounded-xl ' +\n 'border border-stone-200 bg-stone-50 text-stone-900 transition hover:bg-stone-100';\n\nexport function PlatformNav({\n brandMark = 'dataimago_ai_OVERLAP',\n navbarMark,\n aiMonogram,\n brandLabel = 'dataimago.ai home',\n links = DEFAULT_LINKS,\n cta = DEFAULT_CTA,\n rightSlot,\n navLabel = 'Primary',\n homeHref = '/',\n}: PlatformNavProps) {\n const propertyMark = navbarMark ? (\n <NavbarLogo name={navbarMark} aria-hidden className={MARK_CLASS} />\n ) : (\n <Logo name={brandMark} variant=\"PATH\" aria-hidden className={MARK_CLASS} />\n );\n\n const aiHref = typeof aiMonogram === 'object' ? aiMonogram.href : undefined;\n const aiLabel =\n typeof aiMonogram === 'object' ? (aiMonogram.label ?? 'dataimago') : 'dataimago';\n\n return (\n <header className=\"sticky top-0 z-40 border-b border-stone-200 bg-stone-100/95 backdrop-blur-sm\">\n <nav\n className=\"mx-auto flex max-w-7xl items-center justify-between px-6 py-4\"\n aria-label={navLabel}\n >\n <div className=\"flex items-center gap-2 sm:gap-3\">\n {aiMonogram &&\n (aiHref ? (\n <Link href={aiHref} aria-label={aiLabel} className={AI_BUTTON_CLASS}>\n <NavbarLogo name=\"ai-monogram\" aria-hidden className=\"[&_svg]:h-6 [&_svg]:w-auto\" />\n </Link>\n ) : (\n <span className={AI_BUTTON_CLASS} aria-hidden>\n <NavbarLogo name=\"ai-monogram\" aria-hidden className=\"[&_svg]:h-6 [&_svg]:w-auto\" />\n </span>\n ))}\n <Link\n href={homeHref}\n className=\"inline-flex min-h-[48px] items-center text-stone-900 transition hover:opacity-80\"\n aria-label={brandLabel}\n >\n {propertyMark}\n </Link>\n </div>\n\n <div className=\"flex items-center gap-2 sm:gap-6\">\n {links.map(({ href, label, external }) =>\n external ? (\n <a\n key={href}\n href={href}\n className=\"btn-ghost hidden sm:inline-flex\"\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {label}\n </a>\n ) : (\n <Link key={href} href={href} className=\"btn-ghost hidden sm:inline-flex\">\n {label}\n </Link>\n )\n )}\n <Link href={cta.href} className=\"btn-primary\">\n {cta.label}\n </Link>\n {rightSlot}\n </div>\n </nav>\n </header>\n );\n}\n","import type { GitHubNavButtonProps } from './types';\n\n/**\n * The unified GitHub account control for the nav's right slot — the canonical\n * login affordance + login-state indicator shared across every L1/L2 dataimago\n * app (rendered into `PlatformNav`'s `rightSlot`).\n *\n * Fully presentational and **stateless** — it reads no auth itself; the consumer\n * feeds it. Uses a native `<details>` disclosure for the signed-in menu, so it\n * needs no client JS and works whether rendered on the server (a server parent\n * injecting the avatar) or the client.\n *\n * - `mode=\"auth\"` (default): the login-state indicator.\n * - `status=\"unauthed\"` → a GET link to `signInHref` (start OAuth) showing the\n * GitHub mark + a login glyph.\n * - `status=\"authed\"` → the GitHub mark + the user's avatar, opening a menu\n * (profile link + a POST sign-out form to `signOutAction`).\n * - `mode=\"link\"`: a plain GitHub→`orgHref` link (L1, which has no auth).\n *\n * Icons are inlined (the GitHub mark + a lucide-style \"log-in\" glyph) to keep the\n * shared package free of an icon-library peer dependency.\n */\n\n// The 48px touch-target floor (the ready-to-hand dignity gate); colours resolve\n// from the consuming app's dataimago palette. The global `*:focus-visible` rule\n// supplies the focus ring.\nconst SHELL =\n 'inline-flex min-h-[48px] items-center gap-2 rounded-xl border border-stone-200 ' +\n 'bg-stone-50 px-3 text-stone-900 transition hover:bg-stone-100';\n\nconst MENU_ITEM =\n 'flex min-h-[48px] w-full items-center rounded px-2 text-left text-sm ' +\n 'text-stone-900 transition hover:bg-stone-100';\n\nfunction GithubMark() {\n return (\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" className=\"h-5 w-5 shrink-0\" fill=\"currentColor\">\n <path d=\"M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23a11.5 11.5 0 0 1 3.003-.404c1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222 0 1.606-.014 2.898-.014 3.293 0 .322.216.694.825.576C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12\" />\n </svg>\n );\n}\n\nfunction LoginGlyph() {\n // lucide \"log-in\" (ISC), inlined.\n return (\n <svg\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n className=\"h-5 w-5 shrink-0\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M15 3h4a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-4\" />\n <polyline points=\"10 17 15 12 10 7\" />\n <line x1=\"15\" x2=\"3\" y1=\"12\" y2=\"12\" />\n </svg>\n );\n}\n\nexport function GitHubNavButton({\n mode = 'auth',\n status = 'unauthed',\n login,\n avatarUrl,\n signInHref,\n profileHref,\n signOutAction,\n orgHref,\n defaultOpen,\n}: GitHubNavButtonProps) {\n // L1 mode: a plain GitHub→org link (no auth).\n if (mode === 'link') {\n return (\n <a\n href={orgHref}\n target=\"_blank\"\n rel=\"noreferrer\"\n className={SHELL}\n aria-label=\"dataimago on GitHub\"\n >\n <GithubMark />\n </a>\n );\n }\n\n // Signed out: a GET link that starts the OAuth flow.\n if (status !== 'authed') {\n return (\n <a href={signInHref} className={SHELL} aria-label=\"Sign in with GitHub\">\n <GithubMark />\n <LoginGlyph />\n </a>\n );\n }\n\n // Signed in: the GitHub mark + the user's avatar, with a native-disclosure menu.\n return (\n <details className=\"relative\" open={defaultOpen}>\n <summary\n className={`${SHELL} cursor-pointer list-none [&::-webkit-details-marker]:hidden`}\n aria-label={`GitHub account — signed in as ${login ?? 'your account'}`}\n >\n <GithubMark />\n {avatarUrl ? (\n <img\n src={avatarUrl}\n alt=\"\"\n className=\"h-7 w-7 rounded-full border border-stone-200\"\n width={28}\n height={28}\n />\n ) : (\n <span className=\"text-sm font-medium\">@{login}</span>\n )}\n </summary>\n <div className=\"absolute right-0 z-50 mt-2 w-60 rounded-lg border border-stone-200 bg-stone-50 p-2 shadow-lg\">\n <p className=\"px-2 py-1 text-sm text-stone-700\">\n Signed in as <span className=\"font-medium text-stone-900\">@{login}</span>\n </p>\n {profileHref && (\n <a href={profileHref} target=\"_blank\" rel=\"noreferrer\" className={MENU_ITEM}>\n View your GitHub profile\n </a>\n )}\n {signOutAction && (\n <form method=\"POST\" action={signOutAction}>\n <button type=\"submit\" className={MENU_ITEM}>\n Sign out\n </button>\n </form>\n )}\n </div>\n </details>\n );\n}\n","'use client';\n\nimport Link from 'next/link';\nimport { Logo } from '@dataimago/ui';\nimport type { SiteFooterProps } from './types';\n\n/**\n * Site footer — the Level-1 hub footer: dark surface, dataimago wordmark + a\n * trimmed nav column grid.\n *\n * The wordmark is the `dataimago` brand mark via `<Logo>` (font-free, in a light\n * `currentColor` on the dark surface) — no backplate, no hardcoded \".ai\" span.\n *\n * Extracted from apps/hub into @dataimago/hub-chrome during iteration-3-B.2\n * (2026-05-11). The defaults drop the former \"Legacy\" column + the critical-theory\n * closing statement (the philosophical-basis editorial lives on the PhilosophyFooter,\n * which is Level-1-only). Level-2 verticals use `MinimalFooter` instead.\n */\n\nconst DEFAULT_TAGLINE = 'A living AI-native application ecosystem.';\n\nconst DEFAULT_COLUMNS = [\n {\n heading: 'Platform',\n links: [\n { href: '/onboard', label: 'Begin a project' },\n { href: '/ecosystem', label: 'Ecosystem' },\n { href: '/philosophy', label: 'Philosophy' },\n ],\n },\n {\n heading: 'Framework',\n links: [\n {\n href: 'https://github.com/dataimago/dataimago-design',\n label: 'dataimago-design',\n external: true,\n },\n {\n href: 'https://github.com/dataimago/dataimago-rpkg',\n label: 'dataimago-rpkg',\n external: true,\n },\n {\n href: 'https://github.com/dataimago/dataimago-ai',\n label: 'dataimago-ai',\n external: true,\n },\n ],\n },\n];\n\nexport function SiteFooter({\n tagline = DEFAULT_TAGLINE,\n columns = DEFAULT_COLUMNS,\n closingStatement,\n}: SiteFooterProps) {\n return (\n <footer\n className=\"border-t border-stone-800 bg-stone-900 text-stone-400\"\n data-bs-theme=\"dark\"\n >\n <div className=\"mx-auto max-w-6xl px-6 py-12\">\n <div className=\"grid gap-8 md:grid-cols-4\">\n <div>\n <Link\n href=\"/\"\n className=\"inline-flex items-center text-stone-100 transition hover:opacity-80\"\n aria-label=\"dataimago\"\n >\n <Logo\n name=\"dataimago\"\n variant=\"PATH\"\n aria-hidden\n className=\"[&_svg]:h-7 [&_svg]:w-auto\"\n />\n </Link>\n <p className=\"mt-3 text-xs text-stone-400\">{tagline}</p>\n </div>\n\n {columns.map((col) => (\n <div key={col.heading}>\n <h4 className=\"font-mono text-xs uppercase tracking-wider text-accent-300\">\n {col.heading}\n </h4>\n <ul className=\"mt-3 space-y-2 text-sm\">\n {col.links.map(({ href, label, external }) => (\n <li key={label}>\n {!href ? (\n label\n ) : external ? (\n <a\n href={href}\n className=\"hover:text-paper-100\"\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {label}\n </a>\n ) : (\n <Link href={href} className=\"hover:text-paper-100\">\n {label}\n </Link>\n )}\n </li>\n ))}\n </ul>\n </div>\n ))}\n </div>\n\n {closingStatement ? (\n <div className=\"mt-12 border-t border-stone-800 pt-6 text-xs text-stone-400\">\n <p>{closingStatement}</p>\n </div>\n ) : null}\n </div>\n </footer>\n );\n}\n","'use client';\n\nimport Link from 'next/link';\nimport { Logo } from '@dataimago/ui';\nimport type { MinimalFooterProps } from './types';\n\n/**\n * MinimalFooter — the Level-2 vertical footer.\n *\n * A Level-2 vertical (dissertation.ai, future rpkg.ai / sgpc.ai) is \"an embodiment\n * of dataimago\": the footer shows the parent `dataimago` wordmark linking UP to\n * dataimago.ai, the embodiment line, a compact links row, and a copyright line.\n * No nav columns, no philosophy — those belong to the Level-1 hub (SiteFooter +\n * PhilosophyFooter). See dataimago-design wiki/patterns/hub-hero-anatomy.\n */\n\nconst DEFAULT_BRAND_HREF = 'https://dataimago.ai';\nconst DEFAULT_EMBODIMENT = 'An embodiment of dataimago';\n\nexport function MinimalFooter({\n brandHref = DEFAULT_BRAND_HREF,\n embodimentLabel = DEFAULT_EMBODIMENT,\n links = [],\n copyright,\n}: MinimalFooterProps) {\n return (\n <footer\n className=\"border-t border-stone-800 bg-stone-900 text-stone-400\"\n data-bs-theme=\"dark\"\n >\n <div className=\"mx-auto flex max-w-6xl flex-col items-center gap-4 px-6 py-10 text-center\">\n <a\n href={brandHref}\n className=\"inline-flex flex-col items-center gap-2 text-stone-100 transition hover:opacity-80\"\n target=\"_blank\"\n rel=\"noreferrer\"\n aria-label={`${embodimentLabel} — visit dataimago.ai`}\n >\n <Logo\n name=\"dataimago\"\n variant=\"PATH\"\n aria-hidden\n className=\"[&_svg]:h-7 [&_svg]:w-auto\"\n />\n <span className=\"text-sm text-stone-400\">{embodimentLabel}</span>\n </a>\n\n {links.length > 0 ? (\n <nav\n className=\"flex flex-wrap items-center justify-center gap-x-6 gap-y-2 text-sm\"\n aria-label=\"Footer\"\n >\n {links.map(({ href, label, external }) =>\n !href ? (\n <span key={label} className=\"text-stone-400\">\n {label}\n </span>\n ) : external ? (\n <a\n key={label}\n href={href}\n className=\"text-stone-300 hover:text-paper-100\"\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {label}\n </a>\n ) : (\n <Link key={label} href={href} className=\"text-stone-300 hover:text-paper-100\">\n {label}\n </Link>\n )\n )}\n </nav>\n ) : null}\n\n {copyright ? <p className=\"text-xs text-stone-400\">{copyright}</p> : null}\n </div>\n </footer>\n );\n}\n","'use client';\n\nimport type { PhilosophyFooterProps } from './types';\n\n/**\n * Philosophy footer — the platform's moral weight, rendered as a dark\n * editorial section with three belief/mission/vision pairs and a pull-quote.\n *\n * Iteration-1 visual identity (Phase B.3, 2026-05-06):\n * Dark-surface chrome with text-accent-500 eyebrows, font-display body, and\n * the Baudrillard blockquote with border-copper-500 (preserved-decorative-\n * copper per iteration-1 §5.2 governance).\n *\n * Iteration-2 role-shift (2026-05-07): text-accent-500 eyebrows resolve to\n * sky-blue accent-300 (#3498DB) on this dark surface via mode-aware mapping —\n * 5.41:1 on stone-900 (was 3.23:1 AA-large only with copper). The\n * border-copper-500 blockquote frame survives untouched. \"Two warmths\"\n * coexist: cool sky-blue on editorial eyebrows, warm copper on the\n * philosophical-quote frame.\n *\n * Extracted from apps/hub into @dataimago/hub-chrome during iteration-3-B.2\n * (2026-05-11). The `pairs`, `quote`, and `closingStatement` props allow\n * per-vertical adaptation; all props default to the Level-1 hub content.\n */\n\nconst DEFAULT_PAIRS = [\n {\n eyebrow: 'our belief',\n body: 'AI can enable virtuous cycles of improvement in the world.',\n },\n {\n eyebrow: 'our mission',\n body: 'The emancipation of humanity through ai super-alignment.',\n },\n {\n eyebrow: 'our vision',\n body: 'Super-alignment embeds ai in culture, not culture in ai.',\n },\n];\n\nconst DEFAULT_QUOTE = {\n text: `If men create intelligent machines, or fantasize about them, it is either because they secretly despair of their own intelligence or because they are in danger of succumbing to the weight of a monstrous and useless intelligence which they seek to exorcize by transferring it to machines, where they can play with it and make fun of it. By entrusting this burdensome intelligence to machines we are released from any responsibility to knowledge.`,\n attribution: 'Jean Baudrillard',\n work: 'Xerox and Infinity',\n year: 1988,\n};\n\nconst DEFAULT_CLOSING =\n 'dataimago is the structural answer to this critique. Every architectural choice — R as source of truth, editorial authority with the domain expert, the non-destructive retrofit principle, the ecosystem-as-commons — refuses to release the scholar from responsibility to their own knowledge. The AI serves the culture; the culture governs the AI.';\n\nexport function PhilosophyFooter({\n pairs = DEFAULT_PAIRS,\n quote = DEFAULT_QUOTE,\n closingStatement = DEFAULT_CLOSING,\n}: PhilosophyFooterProps) {\n return (\n <section\n aria-labelledby=\"philosophy-heading\"\n className=\"border-t border-stone-200 bg-stone-900 py-20 text-paper-100 sm:py-28\"\n >\n <div className=\"mx-auto max-w-6xl px-6\">\n <div className=\"grid gap-12 lg:grid-cols-3\">\n {pairs.map((pair, i) => (\n <div key={i}>\n <p className=\"font-mono text-xs uppercase tracking-wider text-accent-500\">\n {pair.eyebrow}\n </p>\n {i === 0 ? (\n <h3\n id=\"philosophy-heading\"\n className=\"mt-2 font-display text-xl text-paper-100\"\n >\n {pair.body}\n </h3>\n ) : (\n <p className=\"mt-2 font-display text-xl text-paper-100\">\n {pair.body}\n </p>\n )}\n </div>\n ))}\n </div>\n\n {/* Pull-quote — border-copper-500 PRESERVED: decorative-emphasis\n blockquote frame per iteration-1 §5.2 preserved-decorative-copper\n governance. */}\n <blockquote className=\"mt-16 max-w-prose-wide border-l-2 border-copper-500 pl-6 font-display italic text-paper-100\">\n <p className=\"text-base leading-relaxed\">{quote.text}</p>\n <footer className=\"mt-4 text-sm not-italic text-stone-400\">\n — {quote.attribution}, <cite>{quote.work}</cite> ({quote.year})\n </footer>\n </blockquote>\n\n <p className=\"mt-8 max-w-prose-wide text-sm text-stone-400\">\n {closingStatement}\n </p>\n </div>\n </section>\n );\n}\n"],"mappings":"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","names":["Link","import_jsx_runtime","import_link","import_ui","import_jsx_runtime","Link","import_link","import_ui","import_jsx_runtime","Link","import_jsx_runtime"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { ReactNode } from 'react';
|
|
2
3
|
import { LogoProps, NavbarLogoProps } from '@dataimago/ui';
|
|
3
4
|
|
|
4
5
|
/**
|
|
@@ -87,6 +88,14 @@ interface PlatformNavProps {
|
|
|
87
88
|
cta?: NavLink & {
|
|
88
89
|
href: string;
|
|
89
90
|
};
|
|
91
|
+
/**
|
|
92
|
+
* An app-supplied control rendered at the FAR RIGHT of the nav cluster, after
|
|
93
|
+
* the cta — the slot the unified GitHub account button occupies. A `ReactNode`
|
|
94
|
+
* (not a typed descriptor) so a *server* parent can inject server-fetched
|
|
95
|
+
* content (e.g. the signed-in avatar) into the otherwise presentational nav,
|
|
96
|
+
* and so L1 vs L2 can feed different state. Render `<GitHubNavButton>` here.
|
|
97
|
+
*/
|
|
98
|
+
rightSlot?: ReactNode;
|
|
90
99
|
/**
|
|
91
100
|
* Accessible label for the <nav> landmark.
|
|
92
101
|
* Defaults to "Primary".
|
|
@@ -98,6 +107,34 @@ interface PlatformNavProps {
|
|
|
98
107
|
*/
|
|
99
108
|
homeHref?: string;
|
|
100
109
|
}
|
|
110
|
+
/**
|
|
111
|
+
* The unified GitHub account control (`GitHubNavButton`) — the canonical login
|
|
112
|
+
* affordance + login-state indicator shared across L1/L2 apps. Presentational
|
|
113
|
+
* and stateless; the consuming app feeds the session state.
|
|
114
|
+
*/
|
|
115
|
+
interface GitHubNavButtonProps {
|
|
116
|
+
/**
|
|
117
|
+
* `'auth'` (default) renders the login-state indicator (verticals with a real
|
|
118
|
+
* GitHub session); `'link'` renders a plain GitHub→`orgHref` link (L1, no auth).
|
|
119
|
+
*/
|
|
120
|
+
mode?: 'auth' | 'link';
|
|
121
|
+
/** Auth mode: whether a session exists. */
|
|
122
|
+
status?: 'authed' | 'unauthed';
|
|
123
|
+
/** The signed-in GitHub login (e.g. `dbetebenner`). */
|
|
124
|
+
login?: string;
|
|
125
|
+
/** The signed-in user's avatar URL. */
|
|
126
|
+
avatarUrl?: string;
|
|
127
|
+
/** GET link that starts the OAuth flow (unauthed) — include any `?returnTo=`. */
|
|
128
|
+
signInHref?: string;
|
|
129
|
+
/** The user's GitHub profile URL (authed menu). */
|
|
130
|
+
profileHref?: string;
|
|
131
|
+
/** POST endpoint that destroys the session (authed menu sign-out). */
|
|
132
|
+
signOutAction?: string;
|
|
133
|
+
/** `mode='link'`: where the GitHub glyph links (e.g. the org). */
|
|
134
|
+
orgHref?: string;
|
|
135
|
+
/** Render the signed-in account menu initially open (chiefly for stories/VR). */
|
|
136
|
+
defaultOpen?: boolean;
|
|
137
|
+
}
|
|
101
138
|
interface SiteFooterProps {
|
|
102
139
|
/** One-line vertical tagline below the wordmark. */
|
|
103
140
|
tagline?: string;
|
|
@@ -146,7 +183,9 @@ interface PhilosophyFooterProps {
|
|
|
146
183
|
closingStatement?: string;
|
|
147
184
|
}
|
|
148
185
|
|
|
149
|
-
declare function PlatformNav({ brandMark, navbarMark, aiMonogram, brandLabel, links, cta, navLabel, homeHref, }: PlatformNavProps): react_jsx_runtime.JSX.Element;
|
|
186
|
+
declare function PlatformNav({ brandMark, navbarMark, aiMonogram, brandLabel, links, cta, rightSlot, navLabel, homeHref, }: PlatformNavProps): react_jsx_runtime.JSX.Element;
|
|
187
|
+
|
|
188
|
+
declare function GitHubNavButton({ mode, status, login, avatarUrl, signInHref, profileHref, signOutAction, orgHref, defaultOpen, }: GitHubNavButtonProps): react_jsx_runtime.JSX.Element;
|
|
150
189
|
|
|
151
190
|
declare function SiteFooter({ tagline, columns, closingStatement, }: SiteFooterProps): react_jsx_runtime.JSX.Element;
|
|
152
191
|
|
|
@@ -154,4 +193,4 @@ declare function MinimalFooter({ brandHref, embodimentLabel, links, copyright, }
|
|
|
154
193
|
|
|
155
194
|
declare function PhilosophyFooter({ pairs, quote, closingStatement, }: PhilosophyFooterProps): react_jsx_runtime.JSX.Element;
|
|
156
195
|
|
|
157
|
-
export { type AiMonogram, type BrandMark, type EditorialPair, type FooterColumn, MinimalFooter, type MinimalFooterProps, type NavLink, type NavbarMark, PhilosophyFooter, type PhilosophyFooterProps, PlatformNav, type PlatformNavProps, type PullQuote, SiteFooter, type SiteFooterProps };
|
|
196
|
+
export { type AiMonogram, type BrandMark, type EditorialPair, type FooterColumn, GitHubNavButton, type GitHubNavButtonProps, MinimalFooter, type MinimalFooterProps, type NavLink, type NavbarMark, PhilosophyFooter, type PhilosophyFooterProps, PlatformNav, type PlatformNavProps, type PullQuote, SiteFooter, type SiteFooterProps };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { ReactNode } from 'react';
|
|
2
3
|
import { LogoProps, NavbarLogoProps } from '@dataimago/ui';
|
|
3
4
|
|
|
4
5
|
/**
|
|
@@ -87,6 +88,14 @@ interface PlatformNavProps {
|
|
|
87
88
|
cta?: NavLink & {
|
|
88
89
|
href: string;
|
|
89
90
|
};
|
|
91
|
+
/**
|
|
92
|
+
* An app-supplied control rendered at the FAR RIGHT of the nav cluster, after
|
|
93
|
+
* the cta — the slot the unified GitHub account button occupies. A `ReactNode`
|
|
94
|
+
* (not a typed descriptor) so a *server* parent can inject server-fetched
|
|
95
|
+
* content (e.g. the signed-in avatar) into the otherwise presentational nav,
|
|
96
|
+
* and so L1 vs L2 can feed different state. Render `<GitHubNavButton>` here.
|
|
97
|
+
*/
|
|
98
|
+
rightSlot?: ReactNode;
|
|
90
99
|
/**
|
|
91
100
|
* Accessible label for the <nav> landmark.
|
|
92
101
|
* Defaults to "Primary".
|
|
@@ -98,6 +107,34 @@ interface PlatformNavProps {
|
|
|
98
107
|
*/
|
|
99
108
|
homeHref?: string;
|
|
100
109
|
}
|
|
110
|
+
/**
|
|
111
|
+
* The unified GitHub account control (`GitHubNavButton`) — the canonical login
|
|
112
|
+
* affordance + login-state indicator shared across L1/L2 apps. Presentational
|
|
113
|
+
* and stateless; the consuming app feeds the session state.
|
|
114
|
+
*/
|
|
115
|
+
interface GitHubNavButtonProps {
|
|
116
|
+
/**
|
|
117
|
+
* `'auth'` (default) renders the login-state indicator (verticals with a real
|
|
118
|
+
* GitHub session); `'link'` renders a plain GitHub→`orgHref` link (L1, no auth).
|
|
119
|
+
*/
|
|
120
|
+
mode?: 'auth' | 'link';
|
|
121
|
+
/** Auth mode: whether a session exists. */
|
|
122
|
+
status?: 'authed' | 'unauthed';
|
|
123
|
+
/** The signed-in GitHub login (e.g. `dbetebenner`). */
|
|
124
|
+
login?: string;
|
|
125
|
+
/** The signed-in user's avatar URL. */
|
|
126
|
+
avatarUrl?: string;
|
|
127
|
+
/** GET link that starts the OAuth flow (unauthed) — include any `?returnTo=`. */
|
|
128
|
+
signInHref?: string;
|
|
129
|
+
/** The user's GitHub profile URL (authed menu). */
|
|
130
|
+
profileHref?: string;
|
|
131
|
+
/** POST endpoint that destroys the session (authed menu sign-out). */
|
|
132
|
+
signOutAction?: string;
|
|
133
|
+
/** `mode='link'`: where the GitHub glyph links (e.g. the org). */
|
|
134
|
+
orgHref?: string;
|
|
135
|
+
/** Render the signed-in account menu initially open (chiefly for stories/VR). */
|
|
136
|
+
defaultOpen?: boolean;
|
|
137
|
+
}
|
|
101
138
|
interface SiteFooterProps {
|
|
102
139
|
/** One-line vertical tagline below the wordmark. */
|
|
103
140
|
tagline?: string;
|
|
@@ -146,7 +183,9 @@ interface PhilosophyFooterProps {
|
|
|
146
183
|
closingStatement?: string;
|
|
147
184
|
}
|
|
148
185
|
|
|
149
|
-
declare function PlatformNav({ brandMark, navbarMark, aiMonogram, brandLabel, links, cta, navLabel, homeHref, }: PlatformNavProps): react_jsx_runtime.JSX.Element;
|
|
186
|
+
declare function PlatformNav({ brandMark, navbarMark, aiMonogram, brandLabel, links, cta, rightSlot, navLabel, homeHref, }: PlatformNavProps): react_jsx_runtime.JSX.Element;
|
|
187
|
+
|
|
188
|
+
declare function GitHubNavButton({ mode, status, login, avatarUrl, signInHref, profileHref, signOutAction, orgHref, defaultOpen, }: GitHubNavButtonProps): react_jsx_runtime.JSX.Element;
|
|
150
189
|
|
|
151
190
|
declare function SiteFooter({ tagline, columns, closingStatement, }: SiteFooterProps): react_jsx_runtime.JSX.Element;
|
|
152
191
|
|
|
@@ -154,4 +193,4 @@ declare function MinimalFooter({ brandHref, embodimentLabel, links, copyright, }
|
|
|
154
193
|
|
|
155
194
|
declare function PhilosophyFooter({ pairs, quote, closingStatement, }: PhilosophyFooterProps): react_jsx_runtime.JSX.Element;
|
|
156
195
|
|
|
157
|
-
export { type AiMonogram, type BrandMark, type EditorialPair, type FooterColumn, MinimalFooter, type MinimalFooterProps, type NavLink, type NavbarMark, PhilosophyFooter, type PhilosophyFooterProps, PlatformNav, type PlatformNavProps, type PullQuote, SiteFooter, type SiteFooterProps };
|
|
196
|
+
export { type AiMonogram, type BrandMark, type EditorialPair, type FooterColumn, GitHubNavButton, type GitHubNavButtonProps, MinimalFooter, type MinimalFooterProps, type NavLink, type NavbarMark, PhilosophyFooter, type PhilosophyFooterProps, PlatformNav, type PlatformNavProps, type PullQuote, SiteFooter, type SiteFooterProps };
|
package/dist/index.js
CHANGED
|
@@ -16,6 +16,7 @@ function PlatformNav({
|
|
|
16
16
|
brandLabel = "dataimago.ai home",
|
|
17
17
|
links = DEFAULT_LINKS,
|
|
18
18
|
cta = DEFAULT_CTA,
|
|
19
|
+
rightSlot,
|
|
19
20
|
navLabel = "Primary",
|
|
20
21
|
homeHref = "/"
|
|
21
22
|
}) {
|
|
@@ -54,17 +55,113 @@ function PlatformNav({
|
|
|
54
55
|
href
|
|
55
56
|
) : /* @__PURE__ */ jsx(Link, { href, className: "btn-ghost hidden sm:inline-flex", children: label }, href)
|
|
56
57
|
),
|
|
57
|
-
/* @__PURE__ */ jsx(Link, { href: cta.href, className: "btn-primary", children: cta.label })
|
|
58
|
+
/* @__PURE__ */ jsx(Link, { href: cta.href, className: "btn-primary", children: cta.label }),
|
|
59
|
+
rightSlot
|
|
58
60
|
] })
|
|
59
61
|
]
|
|
60
62
|
}
|
|
61
63
|
) });
|
|
62
64
|
}
|
|
63
65
|
|
|
66
|
+
// src/GitHubNavButton.tsx
|
|
67
|
+
import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
68
|
+
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
|
+
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
|
+
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" }) });
|
|
72
|
+
}
|
|
73
|
+
function LoginGlyph() {
|
|
74
|
+
return /* @__PURE__ */ jsxs2(
|
|
75
|
+
"svg",
|
|
76
|
+
{
|
|
77
|
+
viewBox: "0 0 24 24",
|
|
78
|
+
"aria-hidden": "true",
|
|
79
|
+
className: "h-5 w-5 shrink-0",
|
|
80
|
+
fill: "none",
|
|
81
|
+
stroke: "currentColor",
|
|
82
|
+
strokeWidth: "2",
|
|
83
|
+
strokeLinecap: "round",
|
|
84
|
+
strokeLinejoin: "round",
|
|
85
|
+
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" })
|
|
89
|
+
]
|
|
90
|
+
}
|
|
91
|
+
);
|
|
92
|
+
}
|
|
93
|
+
function GitHubNavButton({
|
|
94
|
+
mode = "auth",
|
|
95
|
+
status = "unauthed",
|
|
96
|
+
login,
|
|
97
|
+
avatarUrl,
|
|
98
|
+
signInHref,
|
|
99
|
+
profileHref,
|
|
100
|
+
signOutAction,
|
|
101
|
+
orgHref,
|
|
102
|
+
defaultOpen
|
|
103
|
+
}) {
|
|
104
|
+
if (mode === "link") {
|
|
105
|
+
return /* @__PURE__ */ jsx2(
|
|
106
|
+
"a",
|
|
107
|
+
{
|
|
108
|
+
href: orgHref,
|
|
109
|
+
target: "_blank",
|
|
110
|
+
rel: "noreferrer",
|
|
111
|
+
className: SHELL,
|
|
112
|
+
"aria-label": "dataimago on GitHub",
|
|
113
|
+
children: /* @__PURE__ */ jsx2(GithubMark, {})
|
|
114
|
+
}
|
|
115
|
+
);
|
|
116
|
+
}
|
|
117
|
+
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, {})
|
|
121
|
+
] });
|
|
122
|
+
}
|
|
123
|
+
return /* @__PURE__ */ jsxs2("details", { className: "relative", open: defaultOpen, children: [
|
|
124
|
+
/* @__PURE__ */ jsxs2(
|
|
125
|
+
"summary",
|
|
126
|
+
{
|
|
127
|
+
className: `${SHELL} cursor-pointer list-none [&::-webkit-details-marker]:hidden`,
|
|
128
|
+
"aria-label": `GitHub account \u2014 signed in as ${login ?? "your account"}`,
|
|
129
|
+
children: [
|
|
130
|
+
/* @__PURE__ */ jsx2(GithubMark, {}),
|
|
131
|
+
avatarUrl ? /* @__PURE__ */ jsx2(
|
|
132
|
+
"img",
|
|
133
|
+
{
|
|
134
|
+
src: avatarUrl,
|
|
135
|
+
alt: "",
|
|
136
|
+
className: "h-7 w-7 rounded-full border border-stone-200",
|
|
137
|
+
width: 28,
|
|
138
|
+
height: 28
|
|
139
|
+
}
|
|
140
|
+
) : /* @__PURE__ */ jsxs2("span", { className: "text-sm font-medium", children: [
|
|
141
|
+
"@",
|
|
142
|
+
login
|
|
143
|
+
] })
|
|
144
|
+
]
|
|
145
|
+
}
|
|
146
|
+
),
|
|
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: [
|
|
149
|
+
"Signed in as ",
|
|
150
|
+
/* @__PURE__ */ jsxs2("span", { className: "font-medium text-stone-900", children: [
|
|
151
|
+
"@",
|
|
152
|
+
login
|
|
153
|
+
] })
|
|
154
|
+
] }),
|
|
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" }) })
|
|
157
|
+
] })
|
|
158
|
+
] });
|
|
159
|
+
}
|
|
160
|
+
|
|
64
161
|
// src/SiteFooter.tsx
|
|
65
162
|
import Link2 from "next/link";
|
|
66
163
|
import { Logo as Logo2 } from "@dataimago/ui";
|
|
67
|
-
import { jsx as
|
|
164
|
+
import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
68
165
|
var DEFAULT_TAGLINE = "A living AI-native application ecosystem.";
|
|
69
166
|
var DEFAULT_COLUMNS = [
|
|
70
167
|
{
|
|
@@ -101,21 +198,21 @@ function SiteFooter({
|
|
|
101
198
|
columns = DEFAULT_COLUMNS,
|
|
102
199
|
closingStatement
|
|
103
200
|
}) {
|
|
104
|
-
return /* @__PURE__ */
|
|
201
|
+
return /* @__PURE__ */ jsx3(
|
|
105
202
|
"footer",
|
|
106
203
|
{
|
|
107
204
|
className: "border-t border-stone-800 bg-stone-900 text-stone-400",
|
|
108
205
|
"data-bs-theme": "dark",
|
|
109
|
-
children: /* @__PURE__ */
|
|
110
|
-
/* @__PURE__ */
|
|
111
|
-
/* @__PURE__ */
|
|
112
|
-
/* @__PURE__ */
|
|
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(
|
|
113
210
|
Link2,
|
|
114
211
|
{
|
|
115
212
|
href: "/",
|
|
116
213
|
className: "inline-flex items-center text-stone-100 transition hover:opacity-80",
|
|
117
214
|
"aria-label": "dataimago",
|
|
118
|
-
children: /* @__PURE__ */
|
|
215
|
+
children: /* @__PURE__ */ jsx3(
|
|
119
216
|
Logo2,
|
|
120
217
|
{
|
|
121
218
|
name: "dataimago",
|
|
@@ -126,11 +223,11 @@ function SiteFooter({
|
|
|
126
223
|
)
|
|
127
224
|
}
|
|
128
225
|
),
|
|
129
|
-
/* @__PURE__ */
|
|
226
|
+
/* @__PURE__ */ jsx3("p", { className: "mt-3 text-xs text-stone-400", children: tagline })
|
|
130
227
|
] }),
|
|
131
|
-
columns.map((col) => /* @__PURE__ */
|
|
132
|
-
/* @__PURE__ */
|
|
133
|
-
/* @__PURE__ */
|
|
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(
|
|
134
231
|
"a",
|
|
135
232
|
{
|
|
136
233
|
href,
|
|
@@ -139,10 +236,10 @@ function SiteFooter({
|
|
|
139
236
|
rel: "noreferrer",
|
|
140
237
|
children: label
|
|
141
238
|
}
|
|
142
|
-
) : /* @__PURE__ */
|
|
239
|
+
) : /* @__PURE__ */ jsx3(Link2, { href, className: "hover:text-paper-100", children: label }) }, label)) })
|
|
143
240
|
] }, col.heading))
|
|
144
241
|
] }),
|
|
145
|
-
closingStatement ? /* @__PURE__ */
|
|
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
|
|
146
243
|
] })
|
|
147
244
|
}
|
|
148
245
|
);
|
|
@@ -151,7 +248,7 @@ function SiteFooter({
|
|
|
151
248
|
// src/MinimalFooter.tsx
|
|
152
249
|
import Link3 from "next/link";
|
|
153
250
|
import { Logo as Logo3 } from "@dataimago/ui";
|
|
154
|
-
import { jsx as
|
|
251
|
+
import { jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
|
|
155
252
|
var DEFAULT_BRAND_HREF = "https://dataimago.ai";
|
|
156
253
|
var DEFAULT_EMBODIMENT = "An embodiment of dataimago";
|
|
157
254
|
function MinimalFooter({
|
|
@@ -160,13 +257,13 @@ function MinimalFooter({
|
|
|
160
257
|
links = [],
|
|
161
258
|
copyright
|
|
162
259
|
}) {
|
|
163
|
-
return /* @__PURE__ */
|
|
260
|
+
return /* @__PURE__ */ jsx4(
|
|
164
261
|
"footer",
|
|
165
262
|
{
|
|
166
263
|
className: "border-t border-stone-800 bg-stone-900 text-stone-400",
|
|
167
264
|
"data-bs-theme": "dark",
|
|
168
|
-
children: /* @__PURE__ */
|
|
169
|
-
/* @__PURE__ */
|
|
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(
|
|
170
267
|
"a",
|
|
171
268
|
{
|
|
172
269
|
href: brandHref,
|
|
@@ -175,7 +272,7 @@ function MinimalFooter({
|
|
|
175
272
|
rel: "noreferrer",
|
|
176
273
|
"aria-label": `${embodimentLabel} \u2014 visit dataimago.ai`,
|
|
177
274
|
children: [
|
|
178
|
-
/* @__PURE__ */
|
|
275
|
+
/* @__PURE__ */ jsx4(
|
|
179
276
|
Logo3,
|
|
180
277
|
{
|
|
181
278
|
name: "dataimago",
|
|
@@ -184,17 +281,17 @@ function MinimalFooter({
|
|
|
184
281
|
className: "[&_svg]:h-7 [&_svg]:w-auto"
|
|
185
282
|
}
|
|
186
283
|
),
|
|
187
|
-
/* @__PURE__ */
|
|
284
|
+
/* @__PURE__ */ jsx4("span", { className: "text-sm text-stone-400", children: embodimentLabel })
|
|
188
285
|
]
|
|
189
286
|
}
|
|
190
287
|
),
|
|
191
|
-
links.length > 0 ? /* @__PURE__ */
|
|
288
|
+
links.length > 0 ? /* @__PURE__ */ jsx4(
|
|
192
289
|
"nav",
|
|
193
290
|
{
|
|
194
291
|
className: "flex flex-wrap items-center justify-center gap-x-6 gap-y-2 text-sm",
|
|
195
292
|
"aria-label": "Footer",
|
|
196
293
|
children: links.map(
|
|
197
|
-
({ href, label, external }) => !href ? /* @__PURE__ */
|
|
294
|
+
({ href, label, external }) => !href ? /* @__PURE__ */ jsx4("span", { className: "text-stone-400", children: label }, label) : external ? /* @__PURE__ */ jsx4(
|
|
198
295
|
"a",
|
|
199
296
|
{
|
|
200
297
|
href,
|
|
@@ -204,18 +301,18 @@ function MinimalFooter({
|
|
|
204
301
|
children: label
|
|
205
302
|
},
|
|
206
303
|
label
|
|
207
|
-
) : /* @__PURE__ */
|
|
304
|
+
) : /* @__PURE__ */ jsx4(Link3, { href, className: "text-stone-300 hover:text-paper-100", children: label }, label)
|
|
208
305
|
)
|
|
209
306
|
}
|
|
210
307
|
) : null,
|
|
211
|
-
copyright ? /* @__PURE__ */
|
|
308
|
+
copyright ? /* @__PURE__ */ jsx4("p", { className: "text-xs text-stone-400", children: copyright }) : null
|
|
212
309
|
] })
|
|
213
310
|
}
|
|
214
311
|
);
|
|
215
312
|
}
|
|
216
313
|
|
|
217
314
|
// src/PhilosophyFooter.tsx
|
|
218
|
-
import { jsx as
|
|
315
|
+
import { jsx as jsx5, jsxs as jsxs5 } from "react/jsx-runtime";
|
|
219
316
|
var DEFAULT_PAIRS = [
|
|
220
317
|
{
|
|
221
318
|
eyebrow: "our belief",
|
|
@@ -242,41 +339,42 @@ function PhilosophyFooter({
|
|
|
242
339
|
quote = DEFAULT_QUOTE,
|
|
243
340
|
closingStatement = DEFAULT_CLOSING
|
|
244
341
|
}) {
|
|
245
|
-
return /* @__PURE__ */
|
|
342
|
+
return /* @__PURE__ */ jsx5(
|
|
246
343
|
"section",
|
|
247
344
|
{
|
|
248
345
|
"aria-labelledby": "philosophy-heading",
|
|
249
346
|
className: "border-t border-stone-200 bg-stone-900 py-20 text-paper-100 sm:py-28",
|
|
250
|
-
children: /* @__PURE__ */
|
|
251
|
-
/* @__PURE__ */
|
|
252
|
-
/* @__PURE__ */
|
|
253
|
-
i === 0 ? /* @__PURE__ */
|
|
347
|
+
children: /* @__PURE__ */ jsxs5("div", { className: "mx-auto max-w-6xl px-6", children: [
|
|
348
|
+
/* @__PURE__ */ jsx5("div", { className: "grid gap-12 lg:grid-cols-3", children: pairs.map((pair, i) => /* @__PURE__ */ jsxs5("div", { children: [
|
|
349
|
+
/* @__PURE__ */ jsx5("p", { className: "font-mono text-xs uppercase tracking-wider text-accent-500", children: pair.eyebrow }),
|
|
350
|
+
i === 0 ? /* @__PURE__ */ jsx5(
|
|
254
351
|
"h3",
|
|
255
352
|
{
|
|
256
353
|
id: "philosophy-heading",
|
|
257
354
|
className: "mt-2 font-display text-xl text-paper-100",
|
|
258
355
|
children: pair.body
|
|
259
356
|
}
|
|
260
|
-
) : /* @__PURE__ */
|
|
357
|
+
) : /* @__PURE__ */ jsx5("p", { className: "mt-2 font-display text-xl text-paper-100", children: pair.body })
|
|
261
358
|
] }, i)) }),
|
|
262
|
-
/* @__PURE__ */
|
|
263
|
-
/* @__PURE__ */
|
|
264
|
-
/* @__PURE__ */
|
|
359
|
+
/* @__PURE__ */ jsxs5("blockquote", { className: "mt-16 max-w-prose-wide border-l-2 border-copper-500 pl-6 font-display italic text-paper-100", children: [
|
|
360
|
+
/* @__PURE__ */ jsx5("p", { className: "text-base leading-relaxed", children: quote.text }),
|
|
361
|
+
/* @__PURE__ */ jsxs5("footer", { className: "mt-4 text-sm not-italic text-stone-400", children: [
|
|
265
362
|
"\u2014 ",
|
|
266
363
|
quote.attribution,
|
|
267
364
|
", ",
|
|
268
|
-
/* @__PURE__ */
|
|
365
|
+
/* @__PURE__ */ jsx5("cite", { children: quote.work }),
|
|
269
366
|
" (",
|
|
270
367
|
quote.year,
|
|
271
368
|
")"
|
|
272
369
|
] })
|
|
273
370
|
] }),
|
|
274
|
-
/* @__PURE__ */
|
|
371
|
+
/* @__PURE__ */ jsx5("p", { className: "mt-8 max-w-prose-wide text-sm text-stone-400", children: closingStatement })
|
|
275
372
|
] })
|
|
276
373
|
}
|
|
277
374
|
);
|
|
278
375
|
}
|
|
279
376
|
export {
|
|
377
|
+
GitHubNavButton,
|
|
280
378
|
MinimalFooter,
|
|
281
379
|
PhilosophyFooter,
|
|
282
380
|
PlatformNav,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/PlatformNav.tsx","../src/SiteFooter.tsx","../src/MinimalFooter.tsx","../src/PhilosophyFooter.tsx"],"sourcesContent":["'use client';\n\nimport Link from 'next/link';\nimport { Logo, NavbarLogo } from '@dataimago/ui';\nimport type { PlatformNavProps } from './types';\n\n/**\n * Platform navigation — sticky header with the property's brand mark + nav cluster.\n *\n * The property mark is rendered by height (so any aspect fits the nav). By default\n * it's the static `@dataimago/brand` wordmark via `<Logo>` (font-free, IoU-locked,\n * `currentColor`). When `navbarMark` is set it becomes the ANIMATED `<NavbarLogo>`\n * (the a/i assemble toggle for L2 marks, lift+wash for L1) — falling back to the\n * static `<Logo brandMark>` otherwise, so pre-navbar consumers are unaffected.\n *\n * `aiMonogram` adds the dataimago `ai-monogram` icon button to the LEFT of the\n * property mark (a 48px touch target; lift+washes to the brand-mark red on hover).\n *\n * Extracted from apps/hub into @dataimago/hub-chrome during iteration-3-B.2\n * (2026-05-11); `navbarMark`/`aiMonogram` added in iteration-4 (the navbar logo\n * system). All props default to the Level-1 hub configuration.\n */\n\nconst DEFAULT_LINKS = [\n { href: '/ecosystem', label: 'Ecosystem' },\n { href: '/philosophy', label: 'Philosophy' },\n];\n\nconst DEFAULT_CTA = { href: '/onboard', label: 'Begin' };\n\n/** Height-based sizing for the property mark (the navbar norm — ~30% larger letters). */\nconst MARK_CLASS = '[&_svg]:h-7 [&_svg]:w-auto sm:[&_svg]:h-8';\n\n/** The optional ai-monogram icon button — a 48px touch target (ready-to-hand floor). */\nconst AI_BUTTON_CLASS =\n 'inline-flex min-h-[48px] min-w-[48px] items-center justify-center rounded-xl ' +\n 'border border-stone-200 bg-stone-50 text-stone-900 transition hover:bg-stone-100';\n\nexport function PlatformNav({\n brandMark = 'dataimago_ai_OVERLAP',\n navbarMark,\n aiMonogram,\n brandLabel = 'dataimago.ai home',\n links = DEFAULT_LINKS,\n cta = DEFAULT_CTA,\n navLabel = 'Primary',\n homeHref = '/',\n}: PlatformNavProps) {\n const propertyMark = navbarMark ? (\n <NavbarLogo name={navbarMark} aria-hidden className={MARK_CLASS} />\n ) : (\n <Logo name={brandMark} variant=\"PATH\" aria-hidden className={MARK_CLASS} />\n );\n\n const aiHref = typeof aiMonogram === 'object' ? aiMonogram.href : undefined;\n const aiLabel =\n typeof aiMonogram === 'object' ? (aiMonogram.label ?? 'dataimago') : 'dataimago';\n\n return (\n <header className=\"sticky top-0 z-40 border-b border-stone-200 bg-stone-100/95 backdrop-blur-sm\">\n <nav\n className=\"mx-auto flex max-w-7xl items-center justify-between px-6 py-4\"\n aria-label={navLabel}\n >\n <div className=\"flex items-center gap-2 sm:gap-3\">\n {aiMonogram &&\n (aiHref ? (\n <Link href={aiHref} aria-label={aiLabel} className={AI_BUTTON_CLASS}>\n <NavbarLogo name=\"ai-monogram\" aria-hidden className=\"[&_svg]:h-6 [&_svg]:w-auto\" />\n </Link>\n ) : (\n <span className={AI_BUTTON_CLASS} aria-hidden>\n <NavbarLogo name=\"ai-monogram\" aria-hidden className=\"[&_svg]:h-6 [&_svg]:w-auto\" />\n </span>\n ))}\n <Link\n href={homeHref}\n className=\"inline-flex min-h-[48px] items-center text-stone-900 transition hover:opacity-80\"\n aria-label={brandLabel}\n >\n {propertyMark}\n </Link>\n </div>\n\n <div className=\"flex items-center gap-2 sm:gap-6\">\n {links.map(({ href, label, external }) =>\n external ? (\n <a\n key={href}\n href={href}\n className=\"btn-ghost hidden sm:inline-flex\"\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {label}\n </a>\n ) : (\n <Link key={href} href={href} className=\"btn-ghost hidden sm:inline-flex\">\n {label}\n </Link>\n )\n )}\n <Link href={cta.href} className=\"btn-primary\">\n {cta.label}\n </Link>\n </div>\n </nav>\n </header>\n );\n}\n","'use client';\n\nimport Link from 'next/link';\nimport { Logo } from '@dataimago/ui';\nimport type { SiteFooterProps } from './types';\n\n/**\n * Site footer — the Level-1 hub footer: dark surface, dataimago wordmark + a\n * trimmed nav column grid.\n *\n * The wordmark is the `dataimago` brand mark via `<Logo>` (font-free, in a light\n * `currentColor` on the dark surface) — no backplate, no hardcoded \".ai\" span.\n *\n * Extracted from apps/hub into @dataimago/hub-chrome during iteration-3-B.2\n * (2026-05-11). The defaults drop the former \"Legacy\" column + the critical-theory\n * closing statement (the philosophical-basis editorial lives on the PhilosophyFooter,\n * which is Level-1-only). Level-2 verticals use `MinimalFooter` instead.\n */\n\nconst DEFAULT_TAGLINE = 'A living AI-native application ecosystem.';\n\nconst DEFAULT_COLUMNS = [\n {\n heading: 'Platform',\n links: [\n { href: '/onboard', label: 'Begin a project' },\n { href: '/ecosystem', label: 'Ecosystem' },\n { href: '/philosophy', label: 'Philosophy' },\n ],\n },\n {\n heading: 'Framework',\n links: [\n {\n href: 'https://github.com/dataimago/dataimago-design',\n label: 'dataimago-design',\n external: true,\n },\n {\n href: 'https://github.com/dataimago/dataimago-rpkg',\n label: 'dataimago-rpkg',\n external: true,\n },\n {\n href: 'https://github.com/dataimago/dataimago-ai',\n label: 'dataimago-ai',\n external: true,\n },\n ],\n },\n];\n\nexport function SiteFooter({\n tagline = DEFAULT_TAGLINE,\n columns = DEFAULT_COLUMNS,\n closingStatement,\n}: SiteFooterProps) {\n return (\n <footer\n className=\"border-t border-stone-800 bg-stone-900 text-stone-400\"\n data-bs-theme=\"dark\"\n >\n <div className=\"mx-auto max-w-6xl px-6 py-12\">\n <div className=\"grid gap-8 md:grid-cols-4\">\n <div>\n <Link\n href=\"/\"\n className=\"inline-flex items-center text-stone-100 transition hover:opacity-80\"\n aria-label=\"dataimago\"\n >\n <Logo\n name=\"dataimago\"\n variant=\"PATH\"\n aria-hidden\n className=\"[&_svg]:h-7 [&_svg]:w-auto\"\n />\n </Link>\n <p className=\"mt-3 text-xs text-stone-400\">{tagline}</p>\n </div>\n\n {columns.map((col) => (\n <div key={col.heading}>\n <h4 className=\"font-mono text-xs uppercase tracking-wider text-accent-300\">\n {col.heading}\n </h4>\n <ul className=\"mt-3 space-y-2 text-sm\">\n {col.links.map(({ href, label, external }) => (\n <li key={label}>\n {!href ? (\n label\n ) : external ? (\n <a\n href={href}\n className=\"hover:text-paper-100\"\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {label}\n </a>\n ) : (\n <Link href={href} className=\"hover:text-paper-100\">\n {label}\n </Link>\n )}\n </li>\n ))}\n </ul>\n </div>\n ))}\n </div>\n\n {closingStatement ? (\n <div className=\"mt-12 border-t border-stone-800 pt-6 text-xs text-stone-400\">\n <p>{closingStatement}</p>\n </div>\n ) : null}\n </div>\n </footer>\n );\n}\n","'use client';\n\nimport Link from 'next/link';\nimport { Logo } from '@dataimago/ui';\nimport type { MinimalFooterProps } from './types';\n\n/**\n * MinimalFooter — the Level-2 vertical footer.\n *\n * A Level-2 vertical (dissertation.ai, future rpkg.ai / sgpc.ai) is \"an embodiment\n * of dataimago\": the footer shows the parent `dataimago` wordmark linking UP to\n * dataimago.ai, the embodiment line, a compact links row, and a copyright line.\n * No nav columns, no philosophy — those belong to the Level-1 hub (SiteFooter +\n * PhilosophyFooter). See dataimago-design wiki/patterns/hub-hero-anatomy.\n */\n\nconst DEFAULT_BRAND_HREF = 'https://dataimago.ai';\nconst DEFAULT_EMBODIMENT = 'An embodiment of dataimago';\n\nexport function MinimalFooter({\n brandHref = DEFAULT_BRAND_HREF,\n embodimentLabel = DEFAULT_EMBODIMENT,\n links = [],\n copyright,\n}: MinimalFooterProps) {\n return (\n <footer\n className=\"border-t border-stone-800 bg-stone-900 text-stone-400\"\n data-bs-theme=\"dark\"\n >\n <div className=\"mx-auto flex max-w-6xl flex-col items-center gap-4 px-6 py-10 text-center\">\n <a\n href={brandHref}\n className=\"inline-flex flex-col items-center gap-2 text-stone-100 transition hover:opacity-80\"\n target=\"_blank\"\n rel=\"noreferrer\"\n aria-label={`${embodimentLabel} — visit dataimago.ai`}\n >\n <Logo\n name=\"dataimago\"\n variant=\"PATH\"\n aria-hidden\n className=\"[&_svg]:h-7 [&_svg]:w-auto\"\n />\n <span className=\"text-sm text-stone-400\">{embodimentLabel}</span>\n </a>\n\n {links.length > 0 ? (\n <nav\n className=\"flex flex-wrap items-center justify-center gap-x-6 gap-y-2 text-sm\"\n aria-label=\"Footer\"\n >\n {links.map(({ href, label, external }) =>\n !href ? (\n <span key={label} className=\"text-stone-400\">\n {label}\n </span>\n ) : external ? (\n <a\n key={label}\n href={href}\n className=\"text-stone-300 hover:text-paper-100\"\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {label}\n </a>\n ) : (\n <Link key={label} href={href} className=\"text-stone-300 hover:text-paper-100\">\n {label}\n </Link>\n )\n )}\n </nav>\n ) : null}\n\n {copyright ? <p className=\"text-xs text-stone-400\">{copyright}</p> : null}\n </div>\n </footer>\n );\n}\n","'use client';\n\nimport type { PhilosophyFooterProps } from './types';\n\n/**\n * Philosophy footer — the platform's moral weight, rendered as a dark\n * editorial section with three belief/mission/vision pairs and a pull-quote.\n *\n * Iteration-1 visual identity (Phase B.3, 2026-05-06):\n * Dark-surface chrome with text-accent-500 eyebrows, font-display body, and\n * the Baudrillard blockquote with border-copper-500 (preserved-decorative-\n * copper per iteration-1 §5.2 governance).\n *\n * Iteration-2 role-shift (2026-05-07): text-accent-500 eyebrows resolve to\n * sky-blue accent-300 (#3498DB) on this dark surface via mode-aware mapping —\n * 5.41:1 on stone-900 (was 3.23:1 AA-large only with copper). The\n * border-copper-500 blockquote frame survives untouched. \"Two warmths\"\n * coexist: cool sky-blue on editorial eyebrows, warm copper on the\n * philosophical-quote frame.\n *\n * Extracted from apps/hub into @dataimago/hub-chrome during iteration-3-B.2\n * (2026-05-11). The `pairs`, `quote`, and `closingStatement` props allow\n * per-vertical adaptation; all props default to the Level-1 hub content.\n */\n\nconst DEFAULT_PAIRS = [\n {\n eyebrow: 'our belief',\n body: 'AI can enable virtuous cycles of improvement in the world.',\n },\n {\n eyebrow: 'our mission',\n body: 'The emancipation of humanity through ai super-alignment.',\n },\n {\n eyebrow: 'our vision',\n body: 'Super-alignment embeds ai in culture, not culture in ai.',\n },\n];\n\nconst DEFAULT_QUOTE = {\n text: `If men create intelligent machines, or fantasize about them, it is either because they secretly despair of their own intelligence or because they are in danger of succumbing to the weight of a monstrous and useless intelligence which they seek to exorcize by transferring it to machines, where they can play with it and make fun of it. By entrusting this burdensome intelligence to machines we are released from any responsibility to knowledge.`,\n attribution: 'Jean Baudrillard',\n work: 'Xerox and Infinity',\n year: 1988,\n};\n\nconst DEFAULT_CLOSING =\n 'dataimago is the structural answer to this critique. Every architectural choice — R as source of truth, editorial authority with the domain expert, the non-destructive retrofit principle, the ecosystem-as-commons — refuses to release the scholar from responsibility to their own knowledge. The AI serves the culture; the culture governs the AI.';\n\nexport function PhilosophyFooter({\n pairs = DEFAULT_PAIRS,\n quote = DEFAULT_QUOTE,\n closingStatement = DEFAULT_CLOSING,\n}: PhilosophyFooterProps) {\n return (\n <section\n aria-labelledby=\"philosophy-heading\"\n className=\"border-t border-stone-200 bg-stone-900 py-20 text-paper-100 sm:py-28\"\n >\n <div className=\"mx-auto max-w-6xl px-6\">\n <div className=\"grid gap-12 lg:grid-cols-3\">\n {pairs.map((pair, i) => (\n <div key={i}>\n <p className=\"font-mono text-xs uppercase tracking-wider text-accent-500\">\n {pair.eyebrow}\n </p>\n {i === 0 ? (\n <h3\n id=\"philosophy-heading\"\n className=\"mt-2 font-display text-xl text-paper-100\"\n >\n {pair.body}\n </h3>\n ) : (\n <p className=\"mt-2 font-display text-xl text-paper-100\">\n {pair.body}\n </p>\n )}\n </div>\n ))}\n </div>\n\n {/* Pull-quote — border-copper-500 PRESERVED: decorative-emphasis\n blockquote frame per iteration-1 §5.2 preserved-decorative-copper\n governance. */}\n <blockquote className=\"mt-16 max-w-prose-wide border-l-2 border-copper-500 pl-6 font-display italic text-paper-100\">\n <p className=\"text-base leading-relaxed\">{quote.text}</p>\n <footer className=\"mt-4 text-sm not-italic text-stone-400\">\n — {quote.attribution}, <cite>{quote.work}</cite> ({quote.year})\n </footer>\n </blockquote>\n\n <p className=\"mt-8 max-w-prose-wide text-sm text-stone-400\">\n {closingStatement}\n </p>\n </div>\n </section>\n );\n}\n"],"mappings":"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","names":["Link","Logo","jsx","jsxs","Link","Logo","jsx","jsxs","jsx","jsxs"]}
|
|
1
|
+
{"version":3,"sources":["../src/PlatformNav.tsx","../src/GitHubNavButton.tsx","../src/SiteFooter.tsx","../src/MinimalFooter.tsx","../src/PhilosophyFooter.tsx"],"sourcesContent":["'use client';\n\nimport Link from 'next/link';\nimport { Logo, NavbarLogo } from '@dataimago/ui';\nimport type { PlatformNavProps } from './types';\n\n/**\n * Platform navigation — sticky header with the property's brand mark + nav cluster.\n *\n * The property mark is rendered by height (so any aspect fits the nav). By default\n * it's the static `@dataimago/brand` wordmark via `<Logo>` (font-free, IoU-locked,\n * `currentColor`). When `navbarMark` is set it becomes the ANIMATED `<NavbarLogo>`\n * (the a/i assemble toggle for L2 marks, lift+wash for L1) — falling back to the\n * static `<Logo brandMark>` otherwise, so pre-navbar consumers are unaffected.\n *\n * `aiMonogram` adds the dataimago `ai-monogram` icon button to the LEFT of the\n * property mark (a 48px touch target; lift+washes to the brand-mark red on hover).\n *\n * Extracted from apps/hub into @dataimago/hub-chrome during iteration-3-B.2\n * (2026-05-11); `navbarMark`/`aiMonogram` added in iteration-4 (the navbar logo\n * system). All props default to the Level-1 hub configuration.\n */\n\nconst DEFAULT_LINKS = [\n { href: '/ecosystem', label: 'Ecosystem' },\n { href: '/philosophy', label: 'Philosophy' },\n];\n\nconst DEFAULT_CTA = { href: '/onboard', label: 'Begin' };\n\n/** Height-based sizing for the property mark (the navbar norm — ~30% larger letters). */\nconst MARK_CLASS = '[&_svg]:h-7 [&_svg]:w-auto sm:[&_svg]:h-8';\n\n/** The optional ai-monogram icon button — a 48px touch target (ready-to-hand floor). */\nconst AI_BUTTON_CLASS =\n 'inline-flex min-h-[48px] min-w-[48px] items-center justify-center rounded-xl ' +\n 'border border-stone-200 bg-stone-50 text-stone-900 transition hover:bg-stone-100';\n\nexport function PlatformNav({\n brandMark = 'dataimago_ai_OVERLAP',\n navbarMark,\n aiMonogram,\n brandLabel = 'dataimago.ai home',\n links = DEFAULT_LINKS,\n cta = DEFAULT_CTA,\n rightSlot,\n navLabel = 'Primary',\n homeHref = '/',\n}: PlatformNavProps) {\n const propertyMark = navbarMark ? (\n <NavbarLogo name={navbarMark} aria-hidden className={MARK_CLASS} />\n ) : (\n <Logo name={brandMark} variant=\"PATH\" aria-hidden className={MARK_CLASS} />\n );\n\n const aiHref = typeof aiMonogram === 'object' ? aiMonogram.href : undefined;\n const aiLabel =\n typeof aiMonogram === 'object' ? (aiMonogram.label ?? 'dataimago') : 'dataimago';\n\n return (\n <header className=\"sticky top-0 z-40 border-b border-stone-200 bg-stone-100/95 backdrop-blur-sm\">\n <nav\n className=\"mx-auto flex max-w-7xl items-center justify-between px-6 py-4\"\n aria-label={navLabel}\n >\n <div className=\"flex items-center gap-2 sm:gap-3\">\n {aiMonogram &&\n (aiHref ? (\n <Link href={aiHref} aria-label={aiLabel} className={AI_BUTTON_CLASS}>\n <NavbarLogo name=\"ai-monogram\" aria-hidden className=\"[&_svg]:h-6 [&_svg]:w-auto\" />\n </Link>\n ) : (\n <span className={AI_BUTTON_CLASS} aria-hidden>\n <NavbarLogo name=\"ai-monogram\" aria-hidden className=\"[&_svg]:h-6 [&_svg]:w-auto\" />\n </span>\n ))}\n <Link\n href={homeHref}\n className=\"inline-flex min-h-[48px] items-center text-stone-900 transition hover:opacity-80\"\n aria-label={brandLabel}\n >\n {propertyMark}\n </Link>\n </div>\n\n <div className=\"flex items-center gap-2 sm:gap-6\">\n {links.map(({ href, label, external }) =>\n external ? (\n <a\n key={href}\n href={href}\n className=\"btn-ghost hidden sm:inline-flex\"\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {label}\n </a>\n ) : (\n <Link key={href} href={href} className=\"btn-ghost hidden sm:inline-flex\">\n {label}\n </Link>\n )\n )}\n <Link href={cta.href} className=\"btn-primary\">\n {cta.label}\n </Link>\n {rightSlot}\n </div>\n </nav>\n </header>\n );\n}\n","import type { GitHubNavButtonProps } from './types';\n\n/**\n * The unified GitHub account control for the nav's right slot — the canonical\n * login affordance + login-state indicator shared across every L1/L2 dataimago\n * app (rendered into `PlatformNav`'s `rightSlot`).\n *\n * Fully presentational and **stateless** — it reads no auth itself; the consumer\n * feeds it. Uses a native `<details>` disclosure for the signed-in menu, so it\n * needs no client JS and works whether rendered on the server (a server parent\n * injecting the avatar) or the client.\n *\n * - `mode=\"auth\"` (default): the login-state indicator.\n * - `status=\"unauthed\"` → a GET link to `signInHref` (start OAuth) showing the\n * GitHub mark + a login glyph.\n * - `status=\"authed\"` → the GitHub mark + the user's avatar, opening a menu\n * (profile link + a POST sign-out form to `signOutAction`).\n * - `mode=\"link\"`: a plain GitHub→`orgHref` link (L1, which has no auth).\n *\n * Icons are inlined (the GitHub mark + a lucide-style \"log-in\" glyph) to keep the\n * shared package free of an icon-library peer dependency.\n */\n\n// The 48px touch-target floor (the ready-to-hand dignity gate); colours resolve\n// from the consuming app's dataimago palette. The global `*:focus-visible` rule\n// supplies the focus ring.\nconst SHELL =\n 'inline-flex min-h-[48px] items-center gap-2 rounded-xl border border-stone-200 ' +\n 'bg-stone-50 px-3 text-stone-900 transition hover:bg-stone-100';\n\nconst MENU_ITEM =\n 'flex min-h-[48px] w-full items-center rounded px-2 text-left text-sm ' +\n 'text-stone-900 transition hover:bg-stone-100';\n\nfunction GithubMark() {\n return (\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" className=\"h-5 w-5 shrink-0\" fill=\"currentColor\">\n <path d=\"M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23a11.5 11.5 0 0 1 3.003-.404c1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222 0 1.606-.014 2.898-.014 3.293 0 .322.216.694.825.576C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12\" />\n </svg>\n );\n}\n\nfunction LoginGlyph() {\n // lucide \"log-in\" (ISC), inlined.\n return (\n <svg\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n className=\"h-5 w-5 shrink-0\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M15 3h4a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-4\" />\n <polyline points=\"10 17 15 12 10 7\" />\n <line x1=\"15\" x2=\"3\" y1=\"12\" y2=\"12\" />\n </svg>\n );\n}\n\nexport function GitHubNavButton({\n mode = 'auth',\n status = 'unauthed',\n login,\n avatarUrl,\n signInHref,\n profileHref,\n signOutAction,\n orgHref,\n defaultOpen,\n}: GitHubNavButtonProps) {\n // L1 mode: a plain GitHub→org link (no auth).\n if (mode === 'link') {\n return (\n <a\n href={orgHref}\n target=\"_blank\"\n rel=\"noreferrer\"\n className={SHELL}\n aria-label=\"dataimago on GitHub\"\n >\n <GithubMark />\n </a>\n );\n }\n\n // Signed out: a GET link that starts the OAuth flow.\n if (status !== 'authed') {\n return (\n <a href={signInHref} className={SHELL} aria-label=\"Sign in with GitHub\">\n <GithubMark />\n <LoginGlyph />\n </a>\n );\n }\n\n // Signed in: the GitHub mark + the user's avatar, with a native-disclosure menu.\n return (\n <details className=\"relative\" open={defaultOpen}>\n <summary\n className={`${SHELL} cursor-pointer list-none [&::-webkit-details-marker]:hidden`}\n aria-label={`GitHub account — signed in as ${login ?? 'your account'}`}\n >\n <GithubMark />\n {avatarUrl ? (\n <img\n src={avatarUrl}\n alt=\"\"\n className=\"h-7 w-7 rounded-full border border-stone-200\"\n width={28}\n height={28}\n />\n ) : (\n <span className=\"text-sm font-medium\">@{login}</span>\n )}\n </summary>\n <div className=\"absolute right-0 z-50 mt-2 w-60 rounded-lg border border-stone-200 bg-stone-50 p-2 shadow-lg\">\n <p className=\"px-2 py-1 text-sm text-stone-700\">\n Signed in as <span className=\"font-medium text-stone-900\">@{login}</span>\n </p>\n {profileHref && (\n <a href={profileHref} target=\"_blank\" rel=\"noreferrer\" className={MENU_ITEM}>\n View your GitHub profile\n </a>\n )}\n {signOutAction && (\n <form method=\"POST\" action={signOutAction}>\n <button type=\"submit\" className={MENU_ITEM}>\n Sign out\n </button>\n </form>\n )}\n </div>\n </details>\n );\n}\n","'use client';\n\nimport Link from 'next/link';\nimport { Logo } from '@dataimago/ui';\nimport type { SiteFooterProps } from './types';\n\n/**\n * Site footer — the Level-1 hub footer: dark surface, dataimago wordmark + a\n * trimmed nav column grid.\n *\n * The wordmark is the `dataimago` brand mark via `<Logo>` (font-free, in a light\n * `currentColor` on the dark surface) — no backplate, no hardcoded \".ai\" span.\n *\n * Extracted from apps/hub into @dataimago/hub-chrome during iteration-3-B.2\n * (2026-05-11). The defaults drop the former \"Legacy\" column + the critical-theory\n * closing statement (the philosophical-basis editorial lives on the PhilosophyFooter,\n * which is Level-1-only). Level-2 verticals use `MinimalFooter` instead.\n */\n\nconst DEFAULT_TAGLINE = 'A living AI-native application ecosystem.';\n\nconst DEFAULT_COLUMNS = [\n {\n heading: 'Platform',\n links: [\n { href: '/onboard', label: 'Begin a project' },\n { href: '/ecosystem', label: 'Ecosystem' },\n { href: '/philosophy', label: 'Philosophy' },\n ],\n },\n {\n heading: 'Framework',\n links: [\n {\n href: 'https://github.com/dataimago/dataimago-design',\n label: 'dataimago-design',\n external: true,\n },\n {\n href: 'https://github.com/dataimago/dataimago-rpkg',\n label: 'dataimago-rpkg',\n external: true,\n },\n {\n href: 'https://github.com/dataimago/dataimago-ai',\n label: 'dataimago-ai',\n external: true,\n },\n ],\n },\n];\n\nexport function SiteFooter({\n tagline = DEFAULT_TAGLINE,\n columns = DEFAULT_COLUMNS,\n closingStatement,\n}: SiteFooterProps) {\n return (\n <footer\n className=\"border-t border-stone-800 bg-stone-900 text-stone-400\"\n data-bs-theme=\"dark\"\n >\n <div className=\"mx-auto max-w-6xl px-6 py-12\">\n <div className=\"grid gap-8 md:grid-cols-4\">\n <div>\n <Link\n href=\"/\"\n className=\"inline-flex items-center text-stone-100 transition hover:opacity-80\"\n aria-label=\"dataimago\"\n >\n <Logo\n name=\"dataimago\"\n variant=\"PATH\"\n aria-hidden\n className=\"[&_svg]:h-7 [&_svg]:w-auto\"\n />\n </Link>\n <p className=\"mt-3 text-xs text-stone-400\">{tagline}</p>\n </div>\n\n {columns.map((col) => (\n <div key={col.heading}>\n <h4 className=\"font-mono text-xs uppercase tracking-wider text-accent-300\">\n {col.heading}\n </h4>\n <ul className=\"mt-3 space-y-2 text-sm\">\n {col.links.map(({ href, label, external }) => (\n <li key={label}>\n {!href ? (\n label\n ) : external ? (\n <a\n href={href}\n className=\"hover:text-paper-100\"\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {label}\n </a>\n ) : (\n <Link href={href} className=\"hover:text-paper-100\">\n {label}\n </Link>\n )}\n </li>\n ))}\n </ul>\n </div>\n ))}\n </div>\n\n {closingStatement ? (\n <div className=\"mt-12 border-t border-stone-800 pt-6 text-xs text-stone-400\">\n <p>{closingStatement}</p>\n </div>\n ) : null}\n </div>\n </footer>\n );\n}\n","'use client';\n\nimport Link from 'next/link';\nimport { Logo } from '@dataimago/ui';\nimport type { MinimalFooterProps } from './types';\n\n/**\n * MinimalFooter — the Level-2 vertical footer.\n *\n * A Level-2 vertical (dissertation.ai, future rpkg.ai / sgpc.ai) is \"an embodiment\n * of dataimago\": the footer shows the parent `dataimago` wordmark linking UP to\n * dataimago.ai, the embodiment line, a compact links row, and a copyright line.\n * No nav columns, no philosophy — those belong to the Level-1 hub (SiteFooter +\n * PhilosophyFooter). See dataimago-design wiki/patterns/hub-hero-anatomy.\n */\n\nconst DEFAULT_BRAND_HREF = 'https://dataimago.ai';\nconst DEFAULT_EMBODIMENT = 'An embodiment of dataimago';\n\nexport function MinimalFooter({\n brandHref = DEFAULT_BRAND_HREF,\n embodimentLabel = DEFAULT_EMBODIMENT,\n links = [],\n copyright,\n}: MinimalFooterProps) {\n return (\n <footer\n className=\"border-t border-stone-800 bg-stone-900 text-stone-400\"\n data-bs-theme=\"dark\"\n >\n <div className=\"mx-auto flex max-w-6xl flex-col items-center gap-4 px-6 py-10 text-center\">\n <a\n href={brandHref}\n className=\"inline-flex flex-col items-center gap-2 text-stone-100 transition hover:opacity-80\"\n target=\"_blank\"\n rel=\"noreferrer\"\n aria-label={`${embodimentLabel} — visit dataimago.ai`}\n >\n <Logo\n name=\"dataimago\"\n variant=\"PATH\"\n aria-hidden\n className=\"[&_svg]:h-7 [&_svg]:w-auto\"\n />\n <span className=\"text-sm text-stone-400\">{embodimentLabel}</span>\n </a>\n\n {links.length > 0 ? (\n <nav\n className=\"flex flex-wrap items-center justify-center gap-x-6 gap-y-2 text-sm\"\n aria-label=\"Footer\"\n >\n {links.map(({ href, label, external }) =>\n !href ? (\n <span key={label} className=\"text-stone-400\">\n {label}\n </span>\n ) : external ? (\n <a\n key={label}\n href={href}\n className=\"text-stone-300 hover:text-paper-100\"\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {label}\n </a>\n ) : (\n <Link key={label} href={href} className=\"text-stone-300 hover:text-paper-100\">\n {label}\n </Link>\n )\n )}\n </nav>\n ) : null}\n\n {copyright ? <p className=\"text-xs text-stone-400\">{copyright}</p> : null}\n </div>\n </footer>\n );\n}\n","'use client';\n\nimport type { PhilosophyFooterProps } from './types';\n\n/**\n * Philosophy footer — the platform's moral weight, rendered as a dark\n * editorial section with three belief/mission/vision pairs and a pull-quote.\n *\n * Iteration-1 visual identity (Phase B.3, 2026-05-06):\n * Dark-surface chrome with text-accent-500 eyebrows, font-display body, and\n * the Baudrillard blockquote with border-copper-500 (preserved-decorative-\n * copper per iteration-1 §5.2 governance).\n *\n * Iteration-2 role-shift (2026-05-07): text-accent-500 eyebrows resolve to\n * sky-blue accent-300 (#3498DB) on this dark surface via mode-aware mapping —\n * 5.41:1 on stone-900 (was 3.23:1 AA-large only with copper). The\n * border-copper-500 blockquote frame survives untouched. \"Two warmths\"\n * coexist: cool sky-blue on editorial eyebrows, warm copper on the\n * philosophical-quote frame.\n *\n * Extracted from apps/hub into @dataimago/hub-chrome during iteration-3-B.2\n * (2026-05-11). The `pairs`, `quote`, and `closingStatement` props allow\n * per-vertical adaptation; all props default to the Level-1 hub content.\n */\n\nconst DEFAULT_PAIRS = [\n {\n eyebrow: 'our belief',\n body: 'AI can enable virtuous cycles of improvement in the world.',\n },\n {\n eyebrow: 'our mission',\n body: 'The emancipation of humanity through ai super-alignment.',\n },\n {\n eyebrow: 'our vision',\n body: 'Super-alignment embeds ai in culture, not culture in ai.',\n },\n];\n\nconst DEFAULT_QUOTE = {\n text: `If men create intelligent machines, or fantasize about them, it is either because they secretly despair of their own intelligence or because they are in danger of succumbing to the weight of a monstrous and useless intelligence which they seek to exorcize by transferring it to machines, where they can play with it and make fun of it. By entrusting this burdensome intelligence to machines we are released from any responsibility to knowledge.`,\n attribution: 'Jean Baudrillard',\n work: 'Xerox and Infinity',\n year: 1988,\n};\n\nconst DEFAULT_CLOSING =\n 'dataimago is the structural answer to this critique. Every architectural choice — R as source of truth, editorial authority with the domain expert, the non-destructive retrofit principle, the ecosystem-as-commons — refuses to release the scholar from responsibility to their own knowledge. The AI serves the culture; the culture governs the AI.';\n\nexport function PhilosophyFooter({\n pairs = DEFAULT_PAIRS,\n quote = DEFAULT_QUOTE,\n closingStatement = DEFAULT_CLOSING,\n}: PhilosophyFooterProps) {\n return (\n <section\n aria-labelledby=\"philosophy-heading\"\n className=\"border-t border-stone-200 bg-stone-900 py-20 text-paper-100 sm:py-28\"\n >\n <div className=\"mx-auto max-w-6xl px-6\">\n <div className=\"grid gap-12 lg:grid-cols-3\">\n {pairs.map((pair, i) => (\n <div key={i}>\n <p className=\"font-mono text-xs uppercase tracking-wider text-accent-500\">\n {pair.eyebrow}\n </p>\n {i === 0 ? (\n <h3\n id=\"philosophy-heading\"\n className=\"mt-2 font-display text-xl text-paper-100\"\n >\n {pair.body}\n </h3>\n ) : (\n <p className=\"mt-2 font-display text-xl text-paper-100\">\n {pair.body}\n </p>\n )}\n </div>\n ))}\n </div>\n\n {/* Pull-quote — border-copper-500 PRESERVED: decorative-emphasis\n blockquote frame per iteration-1 §5.2 preserved-decorative-copper\n governance. */}\n <blockquote className=\"mt-16 max-w-prose-wide border-l-2 border-copper-500 pl-6 font-display italic text-paper-100\">\n <p className=\"text-base leading-relaxed\">{quote.text}</p>\n <footer className=\"mt-4 text-sm not-italic text-stone-400\">\n — {quote.attribution}, <cite>{quote.work}</cite> ({quote.year})\n </footer>\n </blockquote>\n\n <p className=\"mt-8 max-w-prose-wide text-sm text-stone-400\">\n {closingStatement}\n </p>\n </div>\n </section>\n );\n}\n"],"mappings":"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","names":["jsx","jsxs","Link","Logo","jsx","jsxs","Link","Logo","jsx","jsxs","jsx","jsxs"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dataimago/hub-chrome",
|
|
3
|
-
"version": "0.2.0-alpha.
|
|
3
|
+
"version": "0.2.0-alpha.3",
|
|
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": {
|