@dataimago/hub-chrome 0.2.0-alpha.1 → 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 +154 -53
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +66 -3
- package/dist/index.d.ts +66 -3
- package/dist/index.js +154 -54
- package/dist/index.js.map +1 -1
- package/package.json +5 -5
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,
|
|
@@ -46,37 +47,40 @@ var DEFAULT_LINKS = [
|
|
|
46
47
|
{ href: "/philosophy", label: "Philosophy" }
|
|
47
48
|
];
|
|
48
49
|
var DEFAULT_CTA = { href: "/onboard", label: "Begin" };
|
|
50
|
+
var MARK_CLASS = "[&_svg]:h-7 [&_svg]:w-auto sm:[&_svg]:h-8";
|
|
51
|
+
var AI_BUTTON_CLASS = "inline-flex min-h-[48px] min-w-[48px] items-center justify-center rounded-xl border border-stone-200 bg-stone-50 text-stone-900 transition hover:bg-stone-100";
|
|
49
52
|
function PlatformNav({
|
|
50
53
|
brandMark = "dataimago_ai_OVERLAP",
|
|
54
|
+
navbarMark,
|
|
55
|
+
aiMonogram,
|
|
51
56
|
brandLabel = "dataimago.ai home",
|
|
52
57
|
links = DEFAULT_LINKS,
|
|
53
58
|
cta = DEFAULT_CTA,
|
|
59
|
+
rightSlot,
|
|
54
60
|
navLabel = "Primary",
|
|
55
61
|
homeHref = "/"
|
|
56
62
|
}) {
|
|
63
|
+
const propertyMark = navbarMark ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_ui.NavbarLogo, { name: navbarMark, "aria-hidden": true, className: MARK_CLASS }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_ui.Logo, { name: brandMark, variant: "PATH", "aria-hidden": true, className: MARK_CLASS });
|
|
64
|
+
const aiHref = typeof aiMonogram === "object" ? aiMonogram.href : void 0;
|
|
65
|
+
const aiLabel = typeof aiMonogram === "object" ? aiMonogram.label ?? "dataimago" : "dataimago";
|
|
57
66
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("header", { className: "sticky top-0 z-40 border-b border-stone-200 bg-stone-100/95 backdrop-blur-sm", children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
58
67
|
"nav",
|
|
59
68
|
{
|
|
60
69
|
className: "mx-auto flex max-w-7xl items-center justify-between px-6 py-4",
|
|
61
70
|
"aria-label": navLabel,
|
|
62
71
|
children: [
|
|
63
|
-
/* @__PURE__ */ (0, import_jsx_runtime.
|
|
64
|
-
import_link.default,
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
className: "[&_svg]:h-7 [&_svg]:w-auto sm:[&_svg]:h-8"
|
|
76
|
-
}
|
|
77
|
-
)
|
|
78
|
-
}
|
|
79
|
-
),
|
|
72
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center gap-2 sm:gap-3", children: [
|
|
73
|
+
aiMonogram && (aiHref ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_link.default, { href: aiHref, "aria-label": aiLabel, className: AI_BUTTON_CLASS, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_ui.NavbarLogo, { name: "ai-monogram", "aria-hidden": true, className: "[&_svg]:h-6 [&_svg]:w-auto" }) }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: AI_BUTTON_CLASS, "aria-hidden": true, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_ui.NavbarLogo, { name: "ai-monogram", "aria-hidden": true, className: "[&_svg]:h-6 [&_svg]:w-auto" }) })),
|
|
74
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
75
|
+
import_link.default,
|
|
76
|
+
{
|
|
77
|
+
href: homeHref,
|
|
78
|
+
className: "inline-flex min-h-[48px] items-center text-stone-900 transition hover:opacity-80",
|
|
79
|
+
"aria-label": brandLabel,
|
|
80
|
+
children: propertyMark
|
|
81
|
+
}
|
|
82
|
+
)
|
|
83
|
+
] }),
|
|
80
84
|
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center gap-2 sm:gap-6", children: [
|
|
81
85
|
links.map(
|
|
82
86
|
({ href, label, external }) => external ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
@@ -91,17 +95,113 @@ function PlatformNav({
|
|
|
91
95
|
href
|
|
92
96
|
) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_link.default, { href, className: "btn-ghost hidden sm:inline-flex", children: label }, href)
|
|
93
97
|
),
|
|
94
|
-
/* @__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
|
|
95
100
|
] })
|
|
96
101
|
]
|
|
97
102
|
}
|
|
98
103
|
) });
|
|
99
104
|
}
|
|
100
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
|
+
|
|
101
201
|
// src/SiteFooter.tsx
|
|
102
202
|
var import_link2 = __toESM(require("next/link"), 1);
|
|
103
203
|
var import_ui2 = require("@dataimago/ui");
|
|
104
|
-
var
|
|
204
|
+
var import_jsx_runtime3 = require("react/jsx-runtime");
|
|
105
205
|
var DEFAULT_TAGLINE = "A living AI-native application ecosystem.";
|
|
106
206
|
var DEFAULT_COLUMNS = [
|
|
107
207
|
{
|
|
@@ -138,21 +238,21 @@ function SiteFooter({
|
|
|
138
238
|
columns = DEFAULT_COLUMNS,
|
|
139
239
|
closingStatement
|
|
140
240
|
}) {
|
|
141
|
-
return /* @__PURE__ */ (0,
|
|
241
|
+
return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
142
242
|
"footer",
|
|
143
243
|
{
|
|
144
244
|
className: "border-t border-stone-800 bg-stone-900 text-stone-400",
|
|
145
245
|
"data-bs-theme": "dark",
|
|
146
|
-
children: /* @__PURE__ */ (0,
|
|
147
|
-
/* @__PURE__ */ (0,
|
|
148
|
-
/* @__PURE__ */ (0,
|
|
149
|
-
/* @__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)(
|
|
150
250
|
import_link2.default,
|
|
151
251
|
{
|
|
152
252
|
href: "/",
|
|
153
253
|
className: "inline-flex items-center text-stone-100 transition hover:opacity-80",
|
|
154
254
|
"aria-label": "dataimago",
|
|
155
|
-
children: /* @__PURE__ */ (0,
|
|
255
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
156
256
|
import_ui2.Logo,
|
|
157
257
|
{
|
|
158
258
|
name: "dataimago",
|
|
@@ -163,11 +263,11 @@ function SiteFooter({
|
|
|
163
263
|
)
|
|
164
264
|
}
|
|
165
265
|
),
|
|
166
|
-
/* @__PURE__ */ (0,
|
|
266
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("p", { className: "mt-3 text-xs text-stone-400", children: tagline })
|
|
167
267
|
] }),
|
|
168
|
-
columns.map((col) => /* @__PURE__ */ (0,
|
|
169
|
-
/* @__PURE__ */ (0,
|
|
170
|
-
/* @__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)(
|
|
171
271
|
"a",
|
|
172
272
|
{
|
|
173
273
|
href,
|
|
@@ -176,10 +276,10 @@ function SiteFooter({
|
|
|
176
276
|
rel: "noreferrer",
|
|
177
277
|
children: label
|
|
178
278
|
}
|
|
179
|
-
) : /* @__PURE__ */ (0,
|
|
279
|
+
) : /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_link2.default, { href, className: "hover:text-paper-100", children: label }) }, label)) })
|
|
180
280
|
] }, col.heading))
|
|
181
281
|
] }),
|
|
182
|
-
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
|
|
183
283
|
] })
|
|
184
284
|
}
|
|
185
285
|
);
|
|
@@ -188,7 +288,7 @@ function SiteFooter({
|
|
|
188
288
|
// src/MinimalFooter.tsx
|
|
189
289
|
var import_link3 = __toESM(require("next/link"), 1);
|
|
190
290
|
var import_ui3 = require("@dataimago/ui");
|
|
191
|
-
var
|
|
291
|
+
var import_jsx_runtime4 = require("react/jsx-runtime");
|
|
192
292
|
var DEFAULT_BRAND_HREF = "https://dataimago.ai";
|
|
193
293
|
var DEFAULT_EMBODIMENT = "An embodiment of dataimago";
|
|
194
294
|
function MinimalFooter({
|
|
@@ -197,13 +297,13 @@ function MinimalFooter({
|
|
|
197
297
|
links = [],
|
|
198
298
|
copyright
|
|
199
299
|
}) {
|
|
200
|
-
return /* @__PURE__ */ (0,
|
|
300
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
201
301
|
"footer",
|
|
202
302
|
{
|
|
203
303
|
className: "border-t border-stone-800 bg-stone-900 text-stone-400",
|
|
204
304
|
"data-bs-theme": "dark",
|
|
205
|
-
children: /* @__PURE__ */ (0,
|
|
206
|
-
/* @__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)(
|
|
207
307
|
"a",
|
|
208
308
|
{
|
|
209
309
|
href: brandHref,
|
|
@@ -212,7 +312,7 @@ function MinimalFooter({
|
|
|
212
312
|
rel: "noreferrer",
|
|
213
313
|
"aria-label": `${embodimentLabel} \u2014 visit dataimago.ai`,
|
|
214
314
|
children: [
|
|
215
|
-
/* @__PURE__ */ (0,
|
|
315
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
216
316
|
import_ui3.Logo,
|
|
217
317
|
{
|
|
218
318
|
name: "dataimago",
|
|
@@ -221,17 +321,17 @@ function MinimalFooter({
|
|
|
221
321
|
className: "[&_svg]:h-7 [&_svg]:w-auto"
|
|
222
322
|
}
|
|
223
323
|
),
|
|
224
|
-
/* @__PURE__ */ (0,
|
|
324
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "text-sm text-stone-400", children: embodimentLabel })
|
|
225
325
|
]
|
|
226
326
|
}
|
|
227
327
|
),
|
|
228
|
-
links.length > 0 ? /* @__PURE__ */ (0,
|
|
328
|
+
links.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
229
329
|
"nav",
|
|
230
330
|
{
|
|
231
331
|
className: "flex flex-wrap items-center justify-center gap-x-6 gap-y-2 text-sm",
|
|
232
332
|
"aria-label": "Footer",
|
|
233
333
|
children: links.map(
|
|
234
|
-
({ 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)(
|
|
235
335
|
"a",
|
|
236
336
|
{
|
|
237
337
|
href,
|
|
@@ -241,18 +341,18 @@ function MinimalFooter({
|
|
|
241
341
|
children: label
|
|
242
342
|
},
|
|
243
343
|
label
|
|
244
|
-
) : /* @__PURE__ */ (0,
|
|
344
|
+
) : /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_link3.default, { href, className: "text-stone-300 hover:text-paper-100", children: label }, label)
|
|
245
345
|
)
|
|
246
346
|
}
|
|
247
347
|
) : null,
|
|
248
|
-
copyright ? /* @__PURE__ */ (0,
|
|
348
|
+
copyright ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("p", { className: "text-xs text-stone-400", children: copyright }) : null
|
|
249
349
|
] })
|
|
250
350
|
}
|
|
251
351
|
);
|
|
252
352
|
}
|
|
253
353
|
|
|
254
354
|
// src/PhilosophyFooter.tsx
|
|
255
|
-
var
|
|
355
|
+
var import_jsx_runtime5 = require("react/jsx-runtime");
|
|
256
356
|
var DEFAULT_PAIRS = [
|
|
257
357
|
{
|
|
258
358
|
eyebrow: "our belief",
|
|
@@ -279,42 +379,43 @@ function PhilosophyFooter({
|
|
|
279
379
|
quote = DEFAULT_QUOTE,
|
|
280
380
|
closingStatement = DEFAULT_CLOSING
|
|
281
381
|
}) {
|
|
282
|
-
return /* @__PURE__ */ (0,
|
|
382
|
+
return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
283
383
|
"section",
|
|
284
384
|
{
|
|
285
385
|
"aria-labelledby": "philosophy-heading",
|
|
286
386
|
className: "border-t border-stone-200 bg-stone-900 py-20 text-paper-100 sm:py-28",
|
|
287
|
-
children: /* @__PURE__ */ (0,
|
|
288
|
-
/* @__PURE__ */ (0,
|
|
289
|
-
/* @__PURE__ */ (0,
|
|
290
|
-
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)(
|
|
291
391
|
"h3",
|
|
292
392
|
{
|
|
293
393
|
id: "philosophy-heading",
|
|
294
394
|
className: "mt-2 font-display text-xl text-paper-100",
|
|
295
395
|
children: pair.body
|
|
296
396
|
}
|
|
297
|
-
) : /* @__PURE__ */ (0,
|
|
397
|
+
) : /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "mt-2 font-display text-xl text-paper-100", children: pair.body })
|
|
298
398
|
] }, i)) }),
|
|
299
|
-
/* @__PURE__ */ (0,
|
|
300
|
-
/* @__PURE__ */ (0,
|
|
301
|
-
/* @__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: [
|
|
302
402
|
"\u2014 ",
|
|
303
403
|
quote.attribution,
|
|
304
404
|
", ",
|
|
305
|
-
/* @__PURE__ */ (0,
|
|
405
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("cite", { children: quote.work }),
|
|
306
406
|
" (",
|
|
307
407
|
quote.year,
|
|
308
408
|
")"
|
|
309
409
|
] })
|
|
310
410
|
] }),
|
|
311
|
-
/* @__PURE__ */ (0,
|
|
411
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "mt-8 max-w-prose-wide text-sm text-stone-400", children: closingStatement })
|
|
312
412
|
] })
|
|
313
413
|
}
|
|
314
414
|
);
|
|
315
415
|
}
|
|
316
416
|
// Annotate the CommonJS export names for ESM import in node:
|
|
317
417
|
0 && (module.exports = {
|
|
418
|
+
GitHubNavButton,
|
|
318
419
|
MinimalFooter,
|
|
319
420
|
PhilosophyFooter,
|
|
320
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 PlatformNavProps,\n SiteFooterProps,\n MinimalFooterProps,\n PhilosophyFooterProps,\n} from './types';\n","'use client';\n\nimport Link from 'next/link';\nimport { Logo } 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 header logo is the property's `@dataimago/brand` wordmark, rendered via\n * `<Logo>` (font-free, IoU-locked, `currentColor`) — sized by height so any mark\n * (Level-1 `dataimago_ai_OVERLAP`, Level-2 `dissertation_ai_OVERLAP`, …) fits the\n * nav regardless of aspect. The a/i overlap already encodes the \"ai\", so the old\n * hardcoded \".ai\" text span is gone.\n *\n * Extracted from apps/hub into @dataimago/hub-chrome during iteration-3-B.2\n * (2026-05-11). `brandMark`/`brandLabel`/`links`/`cta` allow per-vertical\n * customization; 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\nexport function PlatformNav({\n brandMark = 'dataimago_ai_OVERLAP',\n brandLabel = 'dataimago.ai home',\n links = DEFAULT_LINKS,\n cta = DEFAULT_CTA,\n navLabel = 'Primary',\n homeHref = '/',\n}: PlatformNavProps) {\n return (\n <header className=\"sticky top-0 z-40 border-b border-stone-200 bg-stone-100/95 backdrop-blur-sm\">\n <nav\n className=\"mx-auto flex max-w-7xl items-center justify-between px-6 py-4\"\n aria-label={navLabel}\n >\n <Link\n href={homeHref}\n className=\"flex items-center text-stone-900 transition hover:opacity-80\"\n aria-label={brandLabel}\n >\n <Logo\n name={brandMark}\n variant=\"PATH\"\n aria-hidden\n className=\"[&_svg]:h-7 [&_svg]:w-auto sm:[&_svg]:h-8\"\n />\n </Link>\n\n <div className=\"flex items-center gap-2 sm:gap-6\">\n {links.map(({ href, label, external }) =>\n external ? (\n <a\n key={href}\n href={href}\n className=\"btn-ghost hidden sm:inline-flex\"\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {label}\n </a>\n ) : (\n <Link key={href} href={href} className=\"btn-ghost hidden sm:inline-flex\">\n {label}\n </Link>\n )\n )}\n <Link href={cta.href} className=\"btn-primary\">\n {cta.label}\n </Link>\n </div>\n </nav>\n </header>\n );\n}\n","'use client';\n\nimport Link from 'next/link';\nimport { 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,5 +1,6 @@
|
|
|
1
1
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
-
import {
|
|
2
|
+
import { ReactNode } from 'react';
|
|
3
|
+
import { LogoProps, NavbarLogoProps } from '@dataimago/ui';
|
|
3
4
|
|
|
4
5
|
/**
|
|
5
6
|
* @dataimago/hub-chrome — configuration type surface.
|
|
@@ -11,6 +12,18 @@ import { LogoProps } from '@dataimago/ui';
|
|
|
11
12
|
|
|
12
13
|
/** A canonical @dataimago/brand mark id (e.g. `dataimago_ai_OVERLAP`). */
|
|
13
14
|
type BrandMark = LogoProps['name'];
|
|
15
|
+
/** An animated navbar mark id (e.g. `dissertation-ai`). See @dataimago/brand navbar.json. */
|
|
16
|
+
type NavbarMark = NavbarLogoProps['name'];
|
|
17
|
+
/**
|
|
18
|
+
* Optional `ai-monogram` icon button placed to the LEFT of the property mark
|
|
19
|
+
* (the dataimago "ai" signature, lift+washing to the brand-mark red on hover).
|
|
20
|
+
* `true` renders a non-interactive mark; an object makes it a link (e.g. up to
|
|
21
|
+
* the Level-1 hub).
|
|
22
|
+
*/
|
|
23
|
+
type AiMonogram = boolean | {
|
|
24
|
+
href: string;
|
|
25
|
+
label?: string;
|
|
26
|
+
};
|
|
14
27
|
/** A single navigation link or plain-text label (when href is omitted). */
|
|
15
28
|
interface NavLink {
|
|
16
29
|
/** Omit to render as a non-interactive text label (e.g. legacy items). */
|
|
@@ -43,6 +56,18 @@ interface PlatformNavProps {
|
|
|
43
56
|
* verticals pass their own (e.g. `dissertation_ai_OVERLAP`).
|
|
44
57
|
*/
|
|
45
58
|
brandMark?: BrandMark;
|
|
59
|
+
/**
|
|
60
|
+
* When set, the home link renders the ANIMATED `<NavbarLogo>` for this navbar
|
|
61
|
+
* mark id (the a/i assemble toggle for L2 marks, lift+wash for L1) instead of
|
|
62
|
+
* the static `<Logo brandMark>`. Falls back to `brandMark` when omitted, so
|
|
63
|
+
* existing consumers are unaffected.
|
|
64
|
+
*/
|
|
65
|
+
navbarMark?: NavbarMark;
|
|
66
|
+
/**
|
|
67
|
+
* Render an `ai-monogram` lift-wash icon button to the LEFT of the property
|
|
68
|
+
* mark (the dataimago "ai" signature). Omit/false to hide.
|
|
69
|
+
*/
|
|
70
|
+
aiMonogram?: AiMonogram;
|
|
46
71
|
/**
|
|
47
72
|
* Accessible name for the logo/home link.
|
|
48
73
|
* Defaults to "dataimago.ai home".
|
|
@@ -63,6 +88,14 @@ interface PlatformNavProps {
|
|
|
63
88
|
cta?: NavLink & {
|
|
64
89
|
href: string;
|
|
65
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;
|
|
66
99
|
/**
|
|
67
100
|
* Accessible label for the <nav> landmark.
|
|
68
101
|
* Defaults to "Primary".
|
|
@@ -74,6 +107,34 @@ interface PlatformNavProps {
|
|
|
74
107
|
*/
|
|
75
108
|
homeHref?: string;
|
|
76
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
|
+
}
|
|
77
138
|
interface SiteFooterProps {
|
|
78
139
|
/** One-line vertical tagline below the wordmark. */
|
|
79
140
|
tagline?: string;
|
|
@@ -122,7 +183,9 @@ interface PhilosophyFooterProps {
|
|
|
122
183
|
closingStatement?: string;
|
|
123
184
|
}
|
|
124
185
|
|
|
125
|
-
declare function PlatformNav({ brandMark, 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;
|
|
126
189
|
|
|
127
190
|
declare function SiteFooter({ tagline, columns, closingStatement, }: SiteFooterProps): react_jsx_runtime.JSX.Element;
|
|
128
191
|
|
|
@@ -130,4 +193,4 @@ declare function MinimalFooter({ brandHref, embodimentLabel, links, copyright, }
|
|
|
130
193
|
|
|
131
194
|
declare function PhilosophyFooter({ pairs, quote, closingStatement, }: PhilosophyFooterProps): react_jsx_runtime.JSX.Element;
|
|
132
195
|
|
|
133
|
-
export { type BrandMark, type EditorialPair, type FooterColumn, MinimalFooter, type MinimalFooterProps, type NavLink, 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,5 +1,6 @@
|
|
|
1
1
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
-
import {
|
|
2
|
+
import { ReactNode } from 'react';
|
|
3
|
+
import { LogoProps, NavbarLogoProps } from '@dataimago/ui';
|
|
3
4
|
|
|
4
5
|
/**
|
|
5
6
|
* @dataimago/hub-chrome — configuration type surface.
|
|
@@ -11,6 +12,18 @@ import { LogoProps } from '@dataimago/ui';
|
|
|
11
12
|
|
|
12
13
|
/** A canonical @dataimago/brand mark id (e.g. `dataimago_ai_OVERLAP`). */
|
|
13
14
|
type BrandMark = LogoProps['name'];
|
|
15
|
+
/** An animated navbar mark id (e.g. `dissertation-ai`). See @dataimago/brand navbar.json. */
|
|
16
|
+
type NavbarMark = NavbarLogoProps['name'];
|
|
17
|
+
/**
|
|
18
|
+
* Optional `ai-monogram` icon button placed to the LEFT of the property mark
|
|
19
|
+
* (the dataimago "ai" signature, lift+washing to the brand-mark red on hover).
|
|
20
|
+
* `true` renders a non-interactive mark; an object makes it a link (e.g. up to
|
|
21
|
+
* the Level-1 hub).
|
|
22
|
+
*/
|
|
23
|
+
type AiMonogram = boolean | {
|
|
24
|
+
href: string;
|
|
25
|
+
label?: string;
|
|
26
|
+
};
|
|
14
27
|
/** A single navigation link or plain-text label (when href is omitted). */
|
|
15
28
|
interface NavLink {
|
|
16
29
|
/** Omit to render as a non-interactive text label (e.g. legacy items). */
|
|
@@ -43,6 +56,18 @@ interface PlatformNavProps {
|
|
|
43
56
|
* verticals pass their own (e.g. `dissertation_ai_OVERLAP`).
|
|
44
57
|
*/
|
|
45
58
|
brandMark?: BrandMark;
|
|
59
|
+
/**
|
|
60
|
+
* When set, the home link renders the ANIMATED `<NavbarLogo>` for this navbar
|
|
61
|
+
* mark id (the a/i assemble toggle for L2 marks, lift+wash for L1) instead of
|
|
62
|
+
* the static `<Logo brandMark>`. Falls back to `brandMark` when omitted, so
|
|
63
|
+
* existing consumers are unaffected.
|
|
64
|
+
*/
|
|
65
|
+
navbarMark?: NavbarMark;
|
|
66
|
+
/**
|
|
67
|
+
* Render an `ai-monogram` lift-wash icon button to the LEFT of the property
|
|
68
|
+
* mark (the dataimago "ai" signature). Omit/false to hide.
|
|
69
|
+
*/
|
|
70
|
+
aiMonogram?: AiMonogram;
|
|
46
71
|
/**
|
|
47
72
|
* Accessible name for the logo/home link.
|
|
48
73
|
* Defaults to "dataimago.ai home".
|
|
@@ -63,6 +88,14 @@ interface PlatformNavProps {
|
|
|
63
88
|
cta?: NavLink & {
|
|
64
89
|
href: string;
|
|
65
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;
|
|
66
99
|
/**
|
|
67
100
|
* Accessible label for the <nav> landmark.
|
|
68
101
|
* Defaults to "Primary".
|
|
@@ -74,6 +107,34 @@ interface PlatformNavProps {
|
|
|
74
107
|
*/
|
|
75
108
|
homeHref?: string;
|
|
76
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
|
+
}
|
|
77
138
|
interface SiteFooterProps {
|
|
78
139
|
/** One-line vertical tagline below the wordmark. */
|
|
79
140
|
tagline?: string;
|
|
@@ -122,7 +183,9 @@ interface PhilosophyFooterProps {
|
|
|
122
183
|
closingStatement?: string;
|
|
123
184
|
}
|
|
124
185
|
|
|
125
|
-
declare function PlatformNav({ brandMark, 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;
|
|
126
189
|
|
|
127
190
|
declare function SiteFooter({ tagline, columns, closingStatement, }: SiteFooterProps): react_jsx_runtime.JSX.Element;
|
|
128
191
|
|
|
@@ -130,4 +193,4 @@ declare function MinimalFooter({ brandHref, embodimentLabel, links, copyright, }
|
|
|
130
193
|
|
|
131
194
|
declare function PhilosophyFooter({ pairs, quote, closingStatement, }: PhilosophyFooterProps): react_jsx_runtime.JSX.Element;
|
|
132
195
|
|
|
133
|
-
export { type BrandMark, type EditorialPair, type FooterColumn, MinimalFooter, type MinimalFooterProps, type NavLink, 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
|
@@ -1,43 +1,46 @@
|
|
|
1
1
|
// src/PlatformNav.tsx
|
|
2
2
|
import Link from "next/link";
|
|
3
|
-
import { Logo } from "@dataimago/ui";
|
|
3
|
+
import { Logo, NavbarLogo } from "@dataimago/ui";
|
|
4
4
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
5
5
|
var DEFAULT_LINKS = [
|
|
6
6
|
{ href: "/ecosystem", label: "Ecosystem" },
|
|
7
7
|
{ href: "/philosophy", label: "Philosophy" }
|
|
8
8
|
];
|
|
9
9
|
var DEFAULT_CTA = { href: "/onboard", label: "Begin" };
|
|
10
|
+
var MARK_CLASS = "[&_svg]:h-7 [&_svg]:w-auto sm:[&_svg]:h-8";
|
|
11
|
+
var AI_BUTTON_CLASS = "inline-flex min-h-[48px] min-w-[48px] items-center justify-center rounded-xl border border-stone-200 bg-stone-50 text-stone-900 transition hover:bg-stone-100";
|
|
10
12
|
function PlatformNav({
|
|
11
13
|
brandMark = "dataimago_ai_OVERLAP",
|
|
14
|
+
navbarMark,
|
|
15
|
+
aiMonogram,
|
|
12
16
|
brandLabel = "dataimago.ai home",
|
|
13
17
|
links = DEFAULT_LINKS,
|
|
14
18
|
cta = DEFAULT_CTA,
|
|
19
|
+
rightSlot,
|
|
15
20
|
navLabel = "Primary",
|
|
16
21
|
homeHref = "/"
|
|
17
22
|
}) {
|
|
23
|
+
const propertyMark = navbarMark ? /* @__PURE__ */ jsx(NavbarLogo, { name: navbarMark, "aria-hidden": true, className: MARK_CLASS }) : /* @__PURE__ */ jsx(Logo, { name: brandMark, variant: "PATH", "aria-hidden": true, className: MARK_CLASS });
|
|
24
|
+
const aiHref = typeof aiMonogram === "object" ? aiMonogram.href : void 0;
|
|
25
|
+
const aiLabel = typeof aiMonogram === "object" ? aiMonogram.label ?? "dataimago" : "dataimago";
|
|
18
26
|
return /* @__PURE__ */ jsx("header", { className: "sticky top-0 z-40 border-b border-stone-200 bg-stone-100/95 backdrop-blur-sm", children: /* @__PURE__ */ jsxs(
|
|
19
27
|
"nav",
|
|
20
28
|
{
|
|
21
29
|
className: "mx-auto flex max-w-7xl items-center justify-between px-6 py-4",
|
|
22
30
|
"aria-label": navLabel,
|
|
23
31
|
children: [
|
|
24
|
-
/* @__PURE__ */
|
|
25
|
-
Link,
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
className: "[&_svg]:h-7 [&_svg]:w-auto sm:[&_svg]:h-8"
|
|
37
|
-
}
|
|
38
|
-
)
|
|
39
|
-
}
|
|
40
|
-
),
|
|
32
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 sm:gap-3", children: [
|
|
33
|
+
aiMonogram && (aiHref ? /* @__PURE__ */ jsx(Link, { href: aiHref, "aria-label": aiLabel, className: AI_BUTTON_CLASS, children: /* @__PURE__ */ jsx(NavbarLogo, { name: "ai-monogram", "aria-hidden": true, className: "[&_svg]:h-6 [&_svg]:w-auto" }) }) : /* @__PURE__ */ jsx("span", { className: AI_BUTTON_CLASS, "aria-hidden": true, children: /* @__PURE__ */ jsx(NavbarLogo, { name: "ai-monogram", "aria-hidden": true, className: "[&_svg]:h-6 [&_svg]:w-auto" }) })),
|
|
34
|
+
/* @__PURE__ */ jsx(
|
|
35
|
+
Link,
|
|
36
|
+
{
|
|
37
|
+
href: homeHref,
|
|
38
|
+
className: "inline-flex min-h-[48px] items-center text-stone-900 transition hover:opacity-80",
|
|
39
|
+
"aria-label": brandLabel,
|
|
40
|
+
children: propertyMark
|
|
41
|
+
}
|
|
42
|
+
)
|
|
43
|
+
] }),
|
|
41
44
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 sm:gap-6", children: [
|
|
42
45
|
links.map(
|
|
43
46
|
({ href, label, external }) => external ? /* @__PURE__ */ jsx(
|
|
@@ -52,17 +55,113 @@ function PlatformNav({
|
|
|
52
55
|
href
|
|
53
56
|
) : /* @__PURE__ */ jsx(Link, { href, className: "btn-ghost hidden sm:inline-flex", children: label }, href)
|
|
54
57
|
),
|
|
55
|
-
/* @__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
|
|
56
60
|
] })
|
|
57
61
|
]
|
|
58
62
|
}
|
|
59
63
|
) });
|
|
60
64
|
}
|
|
61
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
|
+
|
|
62
161
|
// src/SiteFooter.tsx
|
|
63
162
|
import Link2 from "next/link";
|
|
64
163
|
import { Logo as Logo2 } from "@dataimago/ui";
|
|
65
|
-
import { jsx as
|
|
164
|
+
import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
66
165
|
var DEFAULT_TAGLINE = "A living AI-native application ecosystem.";
|
|
67
166
|
var DEFAULT_COLUMNS = [
|
|
68
167
|
{
|
|
@@ -99,21 +198,21 @@ function SiteFooter({
|
|
|
99
198
|
columns = DEFAULT_COLUMNS,
|
|
100
199
|
closingStatement
|
|
101
200
|
}) {
|
|
102
|
-
return /* @__PURE__ */
|
|
201
|
+
return /* @__PURE__ */ jsx3(
|
|
103
202
|
"footer",
|
|
104
203
|
{
|
|
105
204
|
className: "border-t border-stone-800 bg-stone-900 text-stone-400",
|
|
106
205
|
"data-bs-theme": "dark",
|
|
107
|
-
children: /* @__PURE__ */
|
|
108
|
-
/* @__PURE__ */
|
|
109
|
-
/* @__PURE__ */
|
|
110
|
-
/* @__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(
|
|
111
210
|
Link2,
|
|
112
211
|
{
|
|
113
212
|
href: "/",
|
|
114
213
|
className: "inline-flex items-center text-stone-100 transition hover:opacity-80",
|
|
115
214
|
"aria-label": "dataimago",
|
|
116
|
-
children: /* @__PURE__ */
|
|
215
|
+
children: /* @__PURE__ */ jsx3(
|
|
117
216
|
Logo2,
|
|
118
217
|
{
|
|
119
218
|
name: "dataimago",
|
|
@@ -124,11 +223,11 @@ function SiteFooter({
|
|
|
124
223
|
)
|
|
125
224
|
}
|
|
126
225
|
),
|
|
127
|
-
/* @__PURE__ */
|
|
226
|
+
/* @__PURE__ */ jsx3("p", { className: "mt-3 text-xs text-stone-400", children: tagline })
|
|
128
227
|
] }),
|
|
129
|
-
columns.map((col) => /* @__PURE__ */
|
|
130
|
-
/* @__PURE__ */
|
|
131
|
-
/* @__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(
|
|
132
231
|
"a",
|
|
133
232
|
{
|
|
134
233
|
href,
|
|
@@ -137,10 +236,10 @@ function SiteFooter({
|
|
|
137
236
|
rel: "noreferrer",
|
|
138
237
|
children: label
|
|
139
238
|
}
|
|
140
|
-
) : /* @__PURE__ */
|
|
239
|
+
) : /* @__PURE__ */ jsx3(Link2, { href, className: "hover:text-paper-100", children: label }) }, label)) })
|
|
141
240
|
] }, col.heading))
|
|
142
241
|
] }),
|
|
143
|
-
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
|
|
144
243
|
] })
|
|
145
244
|
}
|
|
146
245
|
);
|
|
@@ -149,7 +248,7 @@ function SiteFooter({
|
|
|
149
248
|
// src/MinimalFooter.tsx
|
|
150
249
|
import Link3 from "next/link";
|
|
151
250
|
import { Logo as Logo3 } from "@dataimago/ui";
|
|
152
|
-
import { jsx as
|
|
251
|
+
import { jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
|
|
153
252
|
var DEFAULT_BRAND_HREF = "https://dataimago.ai";
|
|
154
253
|
var DEFAULT_EMBODIMENT = "An embodiment of dataimago";
|
|
155
254
|
function MinimalFooter({
|
|
@@ -158,13 +257,13 @@ function MinimalFooter({
|
|
|
158
257
|
links = [],
|
|
159
258
|
copyright
|
|
160
259
|
}) {
|
|
161
|
-
return /* @__PURE__ */
|
|
260
|
+
return /* @__PURE__ */ jsx4(
|
|
162
261
|
"footer",
|
|
163
262
|
{
|
|
164
263
|
className: "border-t border-stone-800 bg-stone-900 text-stone-400",
|
|
165
264
|
"data-bs-theme": "dark",
|
|
166
|
-
children: /* @__PURE__ */
|
|
167
|
-
/* @__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(
|
|
168
267
|
"a",
|
|
169
268
|
{
|
|
170
269
|
href: brandHref,
|
|
@@ -173,7 +272,7 @@ function MinimalFooter({
|
|
|
173
272
|
rel: "noreferrer",
|
|
174
273
|
"aria-label": `${embodimentLabel} \u2014 visit dataimago.ai`,
|
|
175
274
|
children: [
|
|
176
|
-
/* @__PURE__ */
|
|
275
|
+
/* @__PURE__ */ jsx4(
|
|
177
276
|
Logo3,
|
|
178
277
|
{
|
|
179
278
|
name: "dataimago",
|
|
@@ -182,17 +281,17 @@ function MinimalFooter({
|
|
|
182
281
|
className: "[&_svg]:h-7 [&_svg]:w-auto"
|
|
183
282
|
}
|
|
184
283
|
),
|
|
185
|
-
/* @__PURE__ */
|
|
284
|
+
/* @__PURE__ */ jsx4("span", { className: "text-sm text-stone-400", children: embodimentLabel })
|
|
186
285
|
]
|
|
187
286
|
}
|
|
188
287
|
),
|
|
189
|
-
links.length > 0 ? /* @__PURE__ */
|
|
288
|
+
links.length > 0 ? /* @__PURE__ */ jsx4(
|
|
190
289
|
"nav",
|
|
191
290
|
{
|
|
192
291
|
className: "flex flex-wrap items-center justify-center gap-x-6 gap-y-2 text-sm",
|
|
193
292
|
"aria-label": "Footer",
|
|
194
293
|
children: links.map(
|
|
195
|
-
({ href, label, external }) => !href ? /* @__PURE__ */
|
|
294
|
+
({ href, label, external }) => !href ? /* @__PURE__ */ jsx4("span", { className: "text-stone-400", children: label }, label) : external ? /* @__PURE__ */ jsx4(
|
|
196
295
|
"a",
|
|
197
296
|
{
|
|
198
297
|
href,
|
|
@@ -202,18 +301,18 @@ function MinimalFooter({
|
|
|
202
301
|
children: label
|
|
203
302
|
},
|
|
204
303
|
label
|
|
205
|
-
) : /* @__PURE__ */
|
|
304
|
+
) : /* @__PURE__ */ jsx4(Link3, { href, className: "text-stone-300 hover:text-paper-100", children: label }, label)
|
|
206
305
|
)
|
|
207
306
|
}
|
|
208
307
|
) : null,
|
|
209
|
-
copyright ? /* @__PURE__ */
|
|
308
|
+
copyright ? /* @__PURE__ */ jsx4("p", { className: "text-xs text-stone-400", children: copyright }) : null
|
|
210
309
|
] })
|
|
211
310
|
}
|
|
212
311
|
);
|
|
213
312
|
}
|
|
214
313
|
|
|
215
314
|
// src/PhilosophyFooter.tsx
|
|
216
|
-
import { jsx as
|
|
315
|
+
import { jsx as jsx5, jsxs as jsxs5 } from "react/jsx-runtime";
|
|
217
316
|
var DEFAULT_PAIRS = [
|
|
218
317
|
{
|
|
219
318
|
eyebrow: "our belief",
|
|
@@ -240,41 +339,42 @@ function PhilosophyFooter({
|
|
|
240
339
|
quote = DEFAULT_QUOTE,
|
|
241
340
|
closingStatement = DEFAULT_CLOSING
|
|
242
341
|
}) {
|
|
243
|
-
return /* @__PURE__ */
|
|
342
|
+
return /* @__PURE__ */ jsx5(
|
|
244
343
|
"section",
|
|
245
344
|
{
|
|
246
345
|
"aria-labelledby": "philosophy-heading",
|
|
247
346
|
className: "border-t border-stone-200 bg-stone-900 py-20 text-paper-100 sm:py-28",
|
|
248
|
-
children: /* @__PURE__ */
|
|
249
|
-
/* @__PURE__ */
|
|
250
|
-
/* @__PURE__ */
|
|
251
|
-
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(
|
|
252
351
|
"h3",
|
|
253
352
|
{
|
|
254
353
|
id: "philosophy-heading",
|
|
255
354
|
className: "mt-2 font-display text-xl text-paper-100",
|
|
256
355
|
children: pair.body
|
|
257
356
|
}
|
|
258
|
-
) : /* @__PURE__ */
|
|
357
|
+
) : /* @__PURE__ */ jsx5("p", { className: "mt-2 font-display text-xl text-paper-100", children: pair.body })
|
|
259
358
|
] }, i)) }),
|
|
260
|
-
/* @__PURE__ */
|
|
261
|
-
/* @__PURE__ */
|
|
262
|
-
/* @__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: [
|
|
263
362
|
"\u2014 ",
|
|
264
363
|
quote.attribution,
|
|
265
364
|
", ",
|
|
266
|
-
/* @__PURE__ */
|
|
365
|
+
/* @__PURE__ */ jsx5("cite", { children: quote.work }),
|
|
267
366
|
" (",
|
|
268
367
|
quote.year,
|
|
269
368
|
")"
|
|
270
369
|
] })
|
|
271
370
|
] }),
|
|
272
|
-
/* @__PURE__ */
|
|
371
|
+
/* @__PURE__ */ jsx5("p", { className: "mt-8 max-w-prose-wide text-sm text-stone-400", children: closingStatement })
|
|
273
372
|
] })
|
|
274
373
|
}
|
|
275
374
|
);
|
|
276
375
|
}
|
|
277
376
|
export {
|
|
377
|
+
GitHubNavButton,
|
|
278
378
|
MinimalFooter,
|
|
279
379
|
PhilosophyFooter,
|
|
280
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 } 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 header logo is the property's `@dataimago/brand` wordmark, rendered via\n * `<Logo>` (font-free, IoU-locked, `currentColor`) — sized by height so any mark\n * (Level-1 `dataimago_ai_OVERLAP`, Level-2 `dissertation_ai_OVERLAP`, …) fits the\n * nav regardless of aspect. The a/i overlap already encodes the \"ai\", so the old\n * hardcoded \".ai\" text span is gone.\n *\n * Extracted from apps/hub into @dataimago/hub-chrome during iteration-3-B.2\n * (2026-05-11). `brandMark`/`brandLabel`/`links`/`cta` allow per-vertical\n * customization; 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\nexport function PlatformNav({\n brandMark = 'dataimago_ai_OVERLAP',\n brandLabel = 'dataimago.ai home',\n links = DEFAULT_LINKS,\n cta = DEFAULT_CTA,\n navLabel = 'Primary',\n homeHref = '/',\n}: PlatformNavProps) {\n return (\n <header className=\"sticky top-0 z-40 border-b border-stone-200 bg-stone-100/95 backdrop-blur-sm\">\n <nav\n className=\"mx-auto flex max-w-7xl items-center justify-between px-6 py-4\"\n aria-label={navLabel}\n >\n <Link\n href={homeHref}\n className=\"flex items-center text-stone-900 transition hover:opacity-80\"\n aria-label={brandLabel}\n >\n <Logo\n name={brandMark}\n variant=\"PATH\"\n aria-hidden\n className=\"[&_svg]:h-7 [&_svg]:w-auto sm:[&_svg]:h-8\"\n />\n </Link>\n\n <div className=\"flex items-center gap-2 sm:gap-6\">\n {links.map(({ href, label, external }) =>\n external ? (\n <a\n key={href}\n href={href}\n className=\"btn-ghost hidden sm:inline-flex\"\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {label}\n </a>\n ) : (\n <Link key={href} href={href} className=\"btn-ghost hidden sm:inline-flex\">\n {label}\n </Link>\n )\n )}\n <Link href={cta.href} className=\"btn-primary\">\n {cta.label}\n </Link>\n </div>\n </nav>\n </header>\n );\n}\n","'use client';\n\nimport Link from 'next/link';\nimport { 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": {
|
|
@@ -36,15 +36,15 @@
|
|
|
36
36
|
"README.md"
|
|
37
37
|
],
|
|
38
38
|
"peerDependencies": {
|
|
39
|
-
"@dataimago/brand": ">=0.1.0-alpha.
|
|
40
|
-
"@dataimago/ui": ">=0.1.0-alpha.
|
|
39
|
+
"@dataimago/brand": ">=0.1.0-alpha.3",
|
|
40
|
+
"@dataimago/ui": ">=0.1.0-alpha.8",
|
|
41
41
|
"next": ">=14",
|
|
42
42
|
"react": "^18.2.0",
|
|
43
43
|
"react-dom": "^18.2.0"
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
46
|
-
"@dataimago/brand": "^0.1.0-alpha.
|
|
47
|
-
"@dataimago/ui": "^0.1.0-alpha.
|
|
46
|
+
"@dataimago/brand": "^0.1.0-alpha.3",
|
|
47
|
+
"@dataimago/ui": "^0.1.0-alpha.8",
|
|
48
48
|
"@types/react": "^18.2.43",
|
|
49
49
|
"@types/react-dom": "^18.2.17",
|
|
50
50
|
"lucide-react": "^0.344.0",
|