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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -41,7 +41,39 @@ module.exports = __toCommonJS(index_exports);
41
41
  // src/PlatformNav.tsx
42
42
  var import_link = __toESM(require("next/link"), 1);
43
43
  var import_ui = require("@dataimago/ui");
44
+
45
+ // src/NewTabIndicator.tsx
44
46
  var import_jsx_runtime = require("react/jsx-runtime");
47
+ var NEW_TAB_SUFFIX = " (opens in a new tab)";
48
+ function NewTabIndicator({ hideText = false }) {
49
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
50
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
51
+ "svg",
52
+ {
53
+ "aria-hidden": "true",
54
+ focusable: "false",
55
+ viewBox: "0 0 24 24",
56
+ width: "0.85em",
57
+ height: "0.85em",
58
+ fill: "none",
59
+ stroke: "currentColor",
60
+ strokeWidth: "2",
61
+ strokeLinecap: "round",
62
+ strokeLinejoin: "round",
63
+ className: "ml-1 inline-block shrink-0 align-baseline",
64
+ children: [
65
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M15 3h6v6" }),
66
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M10 14 21 3" }),
67
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6" })
68
+ ]
69
+ }
70
+ ),
71
+ hideText ? null : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "sr-only", children: NEW_TAB_SUFFIX })
72
+ ] });
73
+ }
74
+
75
+ // src/PlatformNav.tsx
76
+ var import_jsx_runtime2 = require("react/jsx-runtime");
45
77
  var DEFAULT_LINKS = [
46
78
  { href: "/ecosystem", label: "Ecosystem" },
47
79
  { href: "/philosophy", label: "Philosophy" }
@@ -60,18 +92,18 @@ function PlatformNav({
60
92
  navLabel = "Primary",
61
93
  homeHref = "/"
62
94
  }) {
63
- const propertyMark = navbarMark ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_ui.NavbarLogo, { name: navbarMark, "aria-hidden": true, className: MARK_CLASS }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_ui.Logo, { name: brandMark, variant: "PATH", "aria-hidden": true, className: MARK_CLASS });
95
+ const propertyMark = navbarMark ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui.NavbarLogo, { name: navbarMark, "aria-hidden": true, className: MARK_CLASS }) : /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui.Logo, { name: brandMark, variant: "PATH", "aria-hidden": true, className: MARK_CLASS });
64
96
  const aiHref = typeof aiMonogram === "object" ? aiMonogram.href : void 0;
65
97
  const aiLabel = typeof aiMonogram === "object" ? aiMonogram.label ?? "dataimago" : "dataimago";
66
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("header", { className: "sticky top-0 z-40 border-b border-stone-200 bg-stone-100/95 backdrop-blur-sm", children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
98
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("header", { className: "sticky top-0 z-40 border-b border-stone-200 bg-stone-100/95 backdrop-blur-sm", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
67
99
  "nav",
68
100
  {
69
101
  className: "mx-auto flex max-w-7xl items-center justify-between px-6 py-4",
70
102
  "aria-label": navLabel,
71
103
  children: [
72
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center gap-2 sm:gap-3", children: [
73
- aiMonogram && (aiHref ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_link.default, { href: aiHref, "aria-label": aiLabel, className: AI_BUTTON_CLASS, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_ui.NavbarLogo, { name: "ai-monogram", "aria-hidden": true, className: "[&_svg]:h-6 [&_svg]:w-auto" }) }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: AI_BUTTON_CLASS, "aria-hidden": true, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_ui.NavbarLogo, { name: "ai-monogram", "aria-hidden": true, className: "[&_svg]:h-6 [&_svg]:w-auto" }) })),
74
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
104
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center gap-2 sm:gap-3", children: [
105
+ aiMonogram && (aiHref ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_link.default, { href: aiHref, "aria-label": aiLabel, className: AI_BUTTON_CLASS, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui.NavbarLogo, { name: "ai-monogram", "aria-hidden": true, className: "[&_svg]:h-6 [&_svg]:w-auto" }) }) : /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: AI_BUTTON_CLASS, "aria-hidden": true, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui.NavbarLogo, { name: "ai-monogram", "aria-hidden": true, className: "[&_svg]:h-6 [&_svg]:w-auto" }) })),
106
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
75
107
  import_link.default,
76
108
  {
77
109
  href: homeHref,
@@ -81,21 +113,24 @@ function PlatformNav({
81
113
  }
82
114
  )
83
115
  ] }),
84
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center gap-2 sm:gap-6", children: [
116
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center gap-2 sm:gap-6", children: [
85
117
  links.map(
86
- ({ href, label, external }) => external ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
118
+ ({ href, label, external }) => external ? /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
87
119
  "a",
88
120
  {
89
121
  href,
90
122
  className: "btn-ghost hidden sm:inline-flex",
91
123
  target: "_blank",
92
124
  rel: "noreferrer",
93
- children: label
125
+ children: [
126
+ label,
127
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(NewTabIndicator, {})
128
+ ]
94
129
  },
95
130
  href
96
- ) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_link.default, { href, className: "btn-ghost hidden sm:inline-flex", children: label }, href)
131
+ ) : /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_link.default, { href, className: "btn-ghost hidden sm:inline-flex", children: label }, href)
97
132
  ),
98
- cta && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_link.default, { href: cta.href, className: "btn-primary", children: cta.label }),
133
+ cta && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_link.default, { href: cta.href, className: "btn-primary", children: cta.label }),
99
134
  rightSlot
100
135
  ] })
101
136
  ]
@@ -104,14 +139,14 @@ function PlatformNav({
104
139
  }
105
140
 
106
141
  // src/GitHubNavButton.tsx
107
- var import_jsx_runtime2 = require("react/jsx-runtime");
142
+ var import_jsx_runtime3 = require("react/jsx-runtime");
108
143
  var SHELL = "inline-flex min-h-[48px] items-center gap-2 rounded-xl border border-stone-200 bg-stone-50 px-3 text-stone-900 transition hover:bg-stone-100";
109
144
  var MENU_ITEM = "flex min-h-[48px] w-full items-center rounded px-2 text-left text-sm text-stone-900 transition hover:bg-stone-100";
110
145
  function GithubMark() {
111
- return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("svg", { viewBox: "0 0 24 24", "aria-hidden": "true", className: "h-5 w-5 shrink-0", fill: "currentColor", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("path", { d: "M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23a11.5 11.5 0 0 1 3.003-.404c1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222 0 1.606-.014 2.898-.014 3.293 0 .322.216.694.825.576C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12" }) });
146
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("svg", { viewBox: "0 0 24 24", "aria-hidden": "true", className: "h-5 w-5 shrink-0", fill: "currentColor", children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23a11.5 11.5 0 0 1 3.003-.404c1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222 0 1.606-.014 2.898-.014 3.293 0 .322.216.694.825.576C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12" }) });
112
147
  }
113
148
  function LoginGlyph() {
114
- return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
149
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
115
150
  "svg",
116
151
  {
117
152
  viewBox: "0 0 24 24",
@@ -123,9 +158,9 @@ function LoginGlyph() {
123
158
  strokeLinecap: "round",
124
159
  strokeLinejoin: "round",
125
160
  children: [
126
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("path", { d: "M15 3h4a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-4" }),
127
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("polyline", { points: "10 17 15 12 10 7" }),
128
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("line", { x1: "15", x2: "3", y1: "12", y2: "12" })
161
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M15 3h4a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-4" }),
162
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("polyline", { points: "10 17 15 12 10 7" }),
163
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("line", { x1: "15", x2: "3", y1: "12", y2: "12" })
129
164
  ]
130
165
  }
131
166
  );
@@ -142,33 +177,36 @@ function GitHubNavButton({
142
177
  defaultOpen
143
178
  }) {
144
179
  if (mode === "link") {
145
- return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
180
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
146
181
  "a",
147
182
  {
148
183
  href: orgHref,
149
184
  target: "_blank",
150
185
  rel: "noreferrer",
151
186
  className: SHELL,
152
- "aria-label": "dataimago on GitHub",
153
- children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(GithubMark, {})
187
+ "aria-label": `dataimago on GitHub${NEW_TAB_SUFFIX}`,
188
+ children: [
189
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(GithubMark, {}),
190
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(NewTabIndicator, { hideText: true })
191
+ ]
154
192
  }
155
193
  );
156
194
  }
157
195
  if (status !== "authed") {
158
- return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("a", { href: signInHref, className: SHELL, "aria-label": "Sign in with GitHub", children: [
159
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(GithubMark, {}),
160
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(LoginGlyph, {})
196
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("a", { href: signInHref, className: SHELL, "aria-label": "Sign in with GitHub", children: [
197
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(GithubMark, {}),
198
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(LoginGlyph, {})
161
199
  ] });
162
200
  }
163
- return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("details", { className: "relative", open: defaultOpen, children: [
164
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
201
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("details", { className: "relative", open: defaultOpen, children: [
202
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
165
203
  "summary",
166
204
  {
167
205
  className: `${SHELL} cursor-pointer list-none [&::-webkit-details-marker]:hidden`,
168
206
  "aria-label": `GitHub account \u2014 signed in as ${login ?? "your account"}`,
169
207
  children: [
170
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(GithubMark, {}),
171
- avatarUrl ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
208
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(GithubMark, {}),
209
+ avatarUrl ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
172
210
  "img",
173
211
  {
174
212
  src: avatarUrl,
@@ -177,23 +215,26 @@ function GitHubNavButton({
177
215
  width: 28,
178
216
  height: 28
179
217
  }
180
- ) : /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { className: "text-sm font-medium", children: [
218
+ ) : /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("span", { className: "text-sm font-medium", children: [
181
219
  "@",
182
220
  login
183
221
  ] })
184
222
  ]
185
223
  }
186
224
  ),
187
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "absolute right-0 z-50 mt-2 w-60 rounded-lg border border-stone-200 bg-stone-50 p-2 shadow-lg", children: [
188
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("p", { className: "px-2 py-1 text-sm text-stone-700", children: [
225
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "absolute right-0 z-50 mt-2 w-60 rounded-lg border border-stone-200 bg-stone-50 p-2 shadow-lg", children: [
226
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("p", { className: "px-2 py-1 text-sm text-stone-700", children: [
189
227
  "Signed in as ",
190
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { className: "font-medium text-stone-900", children: [
228
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("span", { className: "font-medium text-stone-900", children: [
191
229
  "@",
192
230
  login
193
231
  ] })
194
232
  ] }),
195
- profileHref && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("a", { href: profileHref, target: "_blank", rel: "noreferrer", className: MENU_ITEM, children: "View your GitHub profile" }),
196
- signOutAction && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("form", { method: "POST", action: signOutAction, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("button", { type: "submit", className: MENU_ITEM, children: "Sign out" }) })
233
+ profileHref && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("a", { href: profileHref, target: "_blank", rel: "noreferrer", className: MENU_ITEM, children: [
234
+ "View your GitHub profile",
235
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(NewTabIndicator, {})
236
+ ] }),
237
+ signOutAction && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("form", { method: "POST", action: signOutAction, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("button", { type: "submit", className: MENU_ITEM, children: "Sign out" }) })
197
238
  ] })
198
239
  ] });
199
240
  }
@@ -201,7 +242,7 @@ function GitHubNavButton({
201
242
  // src/SiteFooter.tsx
202
243
  var import_link2 = __toESM(require("next/link"), 1);
203
244
  var import_ui2 = require("@dataimago/ui");
204
- var import_jsx_runtime3 = require("react/jsx-runtime");
245
+ var import_jsx_runtime4 = require("react/jsx-runtime");
205
246
  var DEFAULT_TAGLINE = "A living AI-native application ecosystem.";
206
247
  var DEFAULT_COLUMNS = [
207
248
  {
@@ -221,8 +262,8 @@ var DEFAULT_COLUMNS = [
221
262
  external: true
222
263
  },
223
264
  {
224
- href: "https://github.com/dataimago/dataimago-rpkg",
225
- label: "dataimago-rpkg",
265
+ href: "https://github.com/dataimago/dataimago",
266
+ label: "dataimago",
226
267
  external: true
227
268
  },
228
269
  {
@@ -238,21 +279,21 @@ function SiteFooter({
238
279
  columns = DEFAULT_COLUMNS,
239
280
  closingStatement
240
281
  }) {
241
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
282
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
242
283
  "footer",
243
284
  {
244
285
  className: "border-t border-stone-800 bg-stone-900 text-stone-400",
245
286
  "data-bs-theme": "dark",
246
- children: /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "mx-auto max-w-6xl px-6 py-12", children: [
247
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "grid gap-8 md:grid-cols-4", children: [
248
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { children: [
249
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
287
+ children: /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "mx-auto max-w-6xl px-6 py-12", children: [
288
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "grid gap-8 md:grid-cols-4", children: [
289
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { children: [
290
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
250
291
  import_link2.default,
251
292
  {
252
293
  href: "/",
253
294
  className: "inline-flex items-center text-stone-100 transition hover:opacity-80",
254
295
  "aria-label": "dataimago",
255
- children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
296
+ children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
256
297
  import_ui2.Logo,
257
298
  {
258
299
  name: "dataimago",
@@ -263,23 +304,26 @@ function SiteFooter({
263
304
  )
264
305
  }
265
306
  ),
266
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("p", { className: "mt-3 text-xs text-stone-400", children: tagline })
307
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("p", { className: "mt-3 text-xs text-stone-400", children: tagline })
267
308
  ] }),
268
- columns.map((col) => /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { children: [
269
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("h4", { className: "font-mono text-xs uppercase tracking-wider text-accent-300", children: col.heading }),
270
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("ul", { className: "mt-3 space-y-2 text-sm", children: col.links.map(({ href, label, external }) => /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("li", { children: !href ? label : external ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
309
+ columns.map((col) => /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { children: [
310
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("h4", { className: "font-mono text-xs uppercase tracking-wider text-accent-300", children: col.heading }),
311
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("ul", { className: "mt-3 space-y-2 text-sm", children: col.links.map(({ href, label, external }) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("li", { children: !href ? label : external ? /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
271
312
  "a",
272
313
  {
273
314
  href,
274
315
  className: "hover:text-paper-100",
275
316
  target: "_blank",
276
317
  rel: "noreferrer",
277
- children: label
318
+ children: [
319
+ label,
320
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(NewTabIndicator, {})
321
+ ]
278
322
  }
279
- ) : /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_link2.default, { href, className: "hover:text-paper-100", children: label }) }, label)) })
323
+ ) : /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_link2.default, { href, className: "hover:text-paper-100", children: label }) }, label)) })
280
324
  ] }, col.heading))
281
325
  ] }),
282
- closingStatement ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: "mt-12 border-t border-stone-800 pt-6 text-xs text-stone-400", children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("p", { children: closingStatement }) }) : null
326
+ closingStatement ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "mt-12 border-t border-stone-800 pt-6 text-xs text-stone-400", children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("p", { children: closingStatement }) }) : null
283
327
  ] })
284
328
  }
285
329
  );
@@ -288,7 +332,7 @@ function SiteFooter({
288
332
  // src/MinimalFooter.tsx
289
333
  var import_link3 = __toESM(require("next/link"), 1);
290
334
  var import_ui3 = require("@dataimago/ui");
291
- var import_jsx_runtime4 = require("react/jsx-runtime");
335
+ var import_jsx_runtime5 = require("react/jsx-runtime");
292
336
  var DEFAULT_BRAND_HREF = "https://dataimago.ai";
293
337
  var DEFAULT_EMBODIMENT = "An embodiment of dataimago";
294
338
  function MinimalFooter({
@@ -297,22 +341,22 @@ function MinimalFooter({
297
341
  links = [],
298
342
  copyright
299
343
  }) {
300
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
344
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
301
345
  "footer",
302
346
  {
303
347
  className: "border-t border-stone-800 bg-stone-900 text-stone-400",
304
348
  "data-bs-theme": "dark",
305
- children: /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "mx-auto flex max-w-6xl flex-col items-center gap-4 px-6 py-10 text-center", children: [
306
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
349
+ children: /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "mx-auto flex max-w-6xl flex-col items-center gap-4 px-6 py-10 text-center", children: [
350
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
307
351
  "a",
308
352
  {
309
353
  href: brandHref,
310
354
  className: "inline-flex flex-col items-center gap-2 text-stone-100 transition hover:opacity-80",
311
355
  target: "_blank",
312
356
  rel: "noreferrer",
313
- "aria-label": `${embodimentLabel} \u2014 visit dataimago.ai`,
357
+ "aria-label": `${embodimentLabel} \u2014 visit dataimago.ai${NEW_TAB_SUFFIX}`,
314
358
  children: [
315
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
359
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
316
360
  import_ui3.Logo,
317
361
  {
318
362
  name: "dataimago",
@@ -321,38 +365,44 @@ function MinimalFooter({
321
365
  className: "[&_svg]:h-7 [&_svg]:w-auto"
322
366
  }
323
367
  ),
324
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "text-sm text-stone-400", children: embodimentLabel })
368
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("span", { className: "text-sm text-stone-400", children: [
369
+ embodimentLabel,
370
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(NewTabIndicator, { hideText: true })
371
+ ] })
325
372
  ]
326
373
  }
327
374
  ),
328
- links.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
375
+ links.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
329
376
  "nav",
330
377
  {
331
378
  className: "flex flex-wrap items-center justify-center gap-x-6 gap-y-2 text-sm",
332
379
  "aria-label": "Footer",
333
380
  children: links.map(
334
- ({ href, label, external }) => !href ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "text-stone-400", children: label }, label) : external ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
381
+ ({ href, label, external }) => !href ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "text-stone-400", children: label }, label) : external ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
335
382
  "a",
336
383
  {
337
384
  href,
338
385
  className: "text-stone-300 hover:text-paper-100",
339
386
  target: "_blank",
340
387
  rel: "noreferrer",
341
- children: label
388
+ children: [
389
+ label,
390
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(NewTabIndicator, {})
391
+ ]
342
392
  },
343
393
  label
344
- ) : /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_link3.default, { href, className: "text-stone-300 hover:text-paper-100", children: label }, label)
394
+ ) : /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_link3.default, { href, className: "text-stone-300 hover:text-paper-100", children: label }, label)
345
395
  )
346
396
  }
347
397
  ) : null,
348
- copyright ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("p", { className: "text-xs text-stone-400", children: copyright }) : null
398
+ copyright ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "text-xs text-stone-400", children: copyright }) : null
349
399
  ] })
350
400
  }
351
401
  );
352
402
  }
353
403
 
354
404
  // src/PhilosophyFooter.tsx
355
- var import_jsx_runtime5 = require("react/jsx-runtime");
405
+ var import_jsx_runtime6 = require("react/jsx-runtime");
356
406
  var DEFAULT_PAIRS = [
357
407
  {
358
408
  eyebrow: "our belief",
@@ -377,38 +427,66 @@ var DEFAULT_CLOSING = "dataimago is the structural answer to this critique. Ever
377
427
  function PhilosophyFooter({
378
428
  pairs = DEFAULT_PAIRS,
379
429
  quote = DEFAULT_QUOTE,
380
- closingStatement = DEFAULT_CLOSING
430
+ closingStatement = DEFAULT_CLOSING,
431
+ density = "default"
381
432
  }) {
382
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
433
+ const compact = density === "compact";
434
+ const pullQuote = /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
435
+ "blockquote",
436
+ {
437
+ className: `border-l-2 border-copper-500 pl-6 font-display italic text-paper-100 ${compact ? "" : "mt-16 max-w-prose-wide"}`,
438
+ children: [
439
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "text-base leading-relaxed", children: quote.text }),
440
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("footer", { className: "mt-4 text-sm not-italic text-stone-400", children: [
441
+ "\u2014 ",
442
+ quote.attribution,
443
+ ", ",
444
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("cite", { children: quote.work }),
445
+ " (",
446
+ quote.year,
447
+ ")"
448
+ ] })
449
+ ]
450
+ }
451
+ );
452
+ const closing = /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
453
+ "p",
454
+ {
455
+ className: `text-stone-400 ${compact ? "text-base leading-relaxed" : "mt-8 max-w-prose-wide text-sm"}`,
456
+ children: closingStatement
457
+ }
458
+ );
459
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
383
460
  "section",
384
461
  {
385
462
  "aria-labelledby": "philosophy-heading",
386
- className: "border-t border-stone-200 bg-stone-900 py-20 text-paper-100 sm:py-28",
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)(
463
+ className: `border-t border-stone-200 bg-stone-900 text-paper-100 ${compact ? "flex flex-col justify-center py-14 sm:py-16 lg:min-h-[50vh]" : "py-20 sm:py-28"}`,
464
+ "data-bs-theme": "dark",
465
+ children: /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "mx-auto w-full max-w-6xl px-6", children: [
466
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: `grid lg:grid-cols-3 ${compact ? "gap-8" : "gap-12"}`, children: pairs.map((pair, i) => /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { children: [
467
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "font-mono text-xs uppercase tracking-wider text-accent-300", children: pair.eyebrow }),
468
+ i === 0 ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
391
469
  "h3",
392
470
  {
393
471
  id: "philosophy-heading",
394
472
  className: "mt-2 font-display text-xl text-paper-100",
395
473
  children: pair.body
396
474
  }
397
- ) : /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "mt-2 font-display text-xl text-paper-100", children: pair.body })
475
+ ) : /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "mt-2 font-display text-xl text-paper-100", children: pair.body })
398
476
  ] }, i)) }),
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: [
402
- "\u2014 ",
403
- quote.attribution,
404
- ", ",
405
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("cite", { children: quote.work }),
406
- " (",
407
- quote.year,
408
- ")"
477
+ compact ? (
478
+ // Critique / answer, side by side — Baudrillard's warning and
479
+ // dataimago's structural answer. Filling the width is what pulls the
480
+ // section down to ~half height (the default stacks these in one column,
481
+ // leaving the right half empty).
482
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "mt-10 grid gap-x-12 gap-y-8 lg:grid-cols-2", children: [
483
+ pullQuote,
484
+ closing
409
485
  ] })
410
- ] }),
411
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "mt-8 max-w-prose-wide text-sm text-stone-400", children: closingStatement })
486
+ ) : /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(import_jsx_runtime6.Fragment, { children: [
487
+ pullQuote,
488
+ closing
489
+ ] })
412
490
  ] })
413
491
  }
414
492
  );