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

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