@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.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
+ CopulaFooter: () => CopulaFooter,
33
34
  GitHubNavButton: () => GitHubNavButton,
34
35
  MinimalFooter: () => MinimalFooter,
35
36
  PhilosophyFooter: () => PhilosophyFooter,
@@ -41,7 +42,39 @@ module.exports = __toCommonJS(index_exports);
41
42
  // src/PlatformNav.tsx
42
43
  var import_link = __toESM(require("next/link"), 1);
43
44
  var import_ui = require("@dataimago/ui");
45
+
46
+ // src/NewTabIndicator.tsx
44
47
  var import_jsx_runtime = require("react/jsx-runtime");
48
+ var NEW_TAB_SUFFIX = " (opens in a new tab)";
49
+ function NewTabIndicator({ hideText = false }) {
50
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
51
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
52
+ "svg",
53
+ {
54
+ "aria-hidden": "true",
55
+ focusable: "false",
56
+ viewBox: "0 0 24 24",
57
+ width: "0.85em",
58
+ height: "0.85em",
59
+ fill: "none",
60
+ stroke: "currentColor",
61
+ strokeWidth: "2",
62
+ strokeLinecap: "round",
63
+ strokeLinejoin: "round",
64
+ className: "ml-1 inline-block shrink-0 align-baseline",
65
+ children: [
66
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M15 3h6v6" }),
67
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M10 14 21 3" }),
68
+ /* @__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" })
69
+ ]
70
+ }
71
+ ),
72
+ hideText ? null : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "sr-only", children: NEW_TAB_SUFFIX })
73
+ ] });
74
+ }
75
+
76
+ // src/PlatformNav.tsx
77
+ var import_jsx_runtime2 = require("react/jsx-runtime");
45
78
  var DEFAULT_LINKS = [
46
79
  { href: "/ecosystem", label: "Ecosystem" },
47
80
  { href: "/philosophy", label: "Philosophy" }
@@ -53,6 +86,7 @@ function PlatformNav({
53
86
  brandMark = "dataimago_ai_OVERLAP",
54
87
  navbarMark,
55
88
  aiMonogram,
89
+ dataimago = "shown",
56
90
  brandLabel = "dataimago.ai home",
57
91
  links = DEFAULT_LINKS,
58
92
  cta = DEFAULT_CTA,
@@ -60,18 +94,18 @@ function PlatformNav({
60
94
  navLabel = "Primary",
61
95
  homeHref = "/"
62
96
  }) {
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 });
97
+ 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
98
  const aiHref = typeof aiMonogram === "object" ? aiMonogram.href : void 0;
65
99
  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)(
100
+ 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
101
  "nav",
68
102
  {
69
103
  className: "mx-auto flex max-w-7xl items-center justify-between px-6 py-4",
70
104
  "aria-label": navLabel,
71
105
  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)(
106
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center gap-2 sm:gap-3", children: [
107
+ aiMonogram && dataimago === "shown" && (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" }) })),
108
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
75
109
  import_link.default,
76
110
  {
77
111
  href: homeHref,
@@ -81,21 +115,24 @@ function PlatformNav({
81
115
  }
82
116
  )
83
117
  ] }),
84
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center gap-2 sm:gap-6", children: [
118
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center gap-2 sm:gap-6", children: [
85
119
  links.map(
86
- ({ href, label, external }) => external ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
120
+ ({ href, label, external }) => external ? /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
87
121
  "a",
88
122
  {
89
123
  href,
90
124
  className: "btn-ghost hidden sm:inline-flex",
91
125
  target: "_blank",
92
126
  rel: "noreferrer",
93
- children: label
127
+ children: [
128
+ label,
129
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(NewTabIndicator, {})
130
+ ]
94
131
  },
95
132
  href
96
- ) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_link.default, { href, className: "btn-ghost hidden sm:inline-flex", children: label }, href)
133
+ ) : /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_link.default, { href, className: "btn-ghost hidden sm:inline-flex", children: label }, href)
97
134
  ),
98
- cta && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_link.default, { href: cta.href, className: "btn-primary", children: cta.label }),
135
+ cta && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_link.default, { href: cta.href, className: "btn-primary", children: cta.label }),
99
136
  rightSlot
100
137
  ] })
101
138
  ]
@@ -104,14 +141,14 @@ function PlatformNav({
104
141
  }
105
142
 
106
143
  // src/GitHubNavButton.tsx
107
- var import_jsx_runtime2 = require("react/jsx-runtime");
144
+ var import_jsx_runtime3 = require("react/jsx-runtime");
108
145
  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
146
  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
147
  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" }) });
148
+ 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
149
  }
113
150
  function LoginGlyph() {
114
- return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
151
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
115
152
  "svg",
116
153
  {
117
154
  viewBox: "0 0 24 24",
@@ -123,9 +160,9 @@ function LoginGlyph() {
123
160
  strokeLinecap: "round",
124
161
  strokeLinejoin: "round",
125
162
  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" })
163
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M15 3h4a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-4" }),
164
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("polyline", { points: "10 17 15 12 10 7" }),
165
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("line", { x1: "15", x2: "3", y1: "12", y2: "12" })
129
166
  ]
130
167
  }
131
168
  );
@@ -142,33 +179,36 @@ function GitHubNavButton({
142
179
  defaultOpen
143
180
  }) {
144
181
  if (mode === "link") {
145
- return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
182
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
146
183
  "a",
147
184
  {
148
185
  href: orgHref,
149
186
  target: "_blank",
150
187
  rel: "noreferrer",
151
188
  className: SHELL,
152
- "aria-label": "dataimago on GitHub",
153
- children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(GithubMark, {})
189
+ "aria-label": `dataimago on GitHub${NEW_TAB_SUFFIX}`,
190
+ children: [
191
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(GithubMark, {}),
192
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(NewTabIndicator, { hideText: true })
193
+ ]
154
194
  }
155
195
  );
156
196
  }
157
197
  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, {})
198
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("a", { href: signInHref, className: SHELL, "aria-label": "Sign in with GitHub", children: [
199
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(GithubMark, {}),
200
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(LoginGlyph, {})
161
201
  ] });
162
202
  }
163
- return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("details", { className: "relative", open: defaultOpen, children: [
164
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
203
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("details", { className: "relative", open: defaultOpen, children: [
204
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
165
205
  "summary",
166
206
  {
167
207
  className: `${SHELL} cursor-pointer list-none [&::-webkit-details-marker]:hidden`,
168
208
  "aria-label": `GitHub account \u2014 signed in as ${login ?? "your account"}`,
169
209
  children: [
170
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(GithubMark, {}),
171
- avatarUrl ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
210
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(GithubMark, {}),
211
+ avatarUrl ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
172
212
  "img",
173
213
  {
174
214
  src: avatarUrl,
@@ -177,23 +217,26 @@ function GitHubNavButton({
177
217
  width: 28,
178
218
  height: 28
179
219
  }
180
- ) : /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { className: "text-sm font-medium", children: [
220
+ ) : /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("span", { className: "text-sm font-medium", children: [
181
221
  "@",
182
222
  login
183
223
  ] })
184
224
  ]
185
225
  }
186
226
  ),
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: [
227
+ /* @__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: [
228
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("p", { className: "px-2 py-1 text-sm text-stone-700", children: [
189
229
  "Signed in as ",
190
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { className: "font-medium text-stone-900", children: [
230
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("span", { className: "font-medium text-stone-900", children: [
191
231
  "@",
192
232
  login
193
233
  ] })
194
234
  ] }),
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" }) })
235
+ profileHref && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("a", { href: profileHref, target: "_blank", rel: "noreferrer", className: MENU_ITEM, children: [
236
+ "View your GitHub profile",
237
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(NewTabIndicator, {})
238
+ ] }),
239
+ 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
240
  ] })
198
241
  ] });
199
242
  }
@@ -201,7 +244,7 @@ function GitHubNavButton({
201
244
  // src/SiteFooter.tsx
202
245
  var import_link2 = __toESM(require("next/link"), 1);
203
246
  var import_ui2 = require("@dataimago/ui");
204
- var import_jsx_runtime3 = require("react/jsx-runtime");
247
+ var import_jsx_runtime4 = require("react/jsx-runtime");
205
248
  var DEFAULT_TAGLINE = "A living AI-native application ecosystem.";
206
249
  var DEFAULT_COLUMNS = [
207
250
  {
@@ -238,21 +281,21 @@ function SiteFooter({
238
281
  columns = DEFAULT_COLUMNS,
239
282
  closingStatement
240
283
  }) {
241
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
284
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
242
285
  "footer",
243
286
  {
244
287
  className: "border-t border-stone-800 bg-stone-900 text-stone-400",
245
288
  "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)(
289
+ children: /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "mx-auto max-w-6xl px-6 py-12", children: [
290
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "grid gap-8 md:grid-cols-4", children: [
291
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { children: [
292
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
250
293
  import_link2.default,
251
294
  {
252
295
  href: "/",
253
296
  className: "inline-flex items-center text-stone-100 transition hover:opacity-80",
254
297
  "aria-label": "dataimago",
255
- children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
298
+ children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
256
299
  import_ui2.Logo,
257
300
  {
258
301
  name: "dataimago",
@@ -263,23 +306,26 @@ function SiteFooter({
263
306
  )
264
307
  }
265
308
  ),
266
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("p", { className: "mt-3 text-xs text-stone-400", children: tagline })
309
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("p", { className: "mt-3 text-xs text-stone-400", children: tagline })
267
310
  ] }),
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)(
311
+ columns.map((col) => /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { children: [
312
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("h4", { className: "font-mono text-xs uppercase tracking-wider text-accent-300", children: col.heading }),
313
+ /* @__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
314
  "a",
272
315
  {
273
316
  href,
274
317
  className: "hover:text-paper-100",
275
318
  target: "_blank",
276
319
  rel: "noreferrer",
277
- children: label
320
+ children: [
321
+ label,
322
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(NewTabIndicator, {})
323
+ ]
278
324
  }
279
- ) : /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_link2.default, { href, className: "hover:text-paper-100", children: label }) }, label)) })
325
+ ) : /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_link2.default, { href, className: "hover:text-paper-100", children: label }) }, label)) })
280
326
  ] }, col.heading))
281
327
  ] }),
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
328
+ 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
329
  ] })
284
330
  }
285
331
  );
@@ -288,7 +334,7 @@ function SiteFooter({
288
334
  // src/MinimalFooter.tsx
289
335
  var import_link3 = __toESM(require("next/link"), 1);
290
336
  var import_ui3 = require("@dataimago/ui");
291
- var import_jsx_runtime4 = require("react/jsx-runtime");
337
+ var import_jsx_runtime5 = require("react/jsx-runtime");
292
338
  var DEFAULT_BRAND_HREF = "https://dataimago.ai";
293
339
  var DEFAULT_EMBODIMENT = "An embodiment of dataimago";
294
340
  function MinimalFooter({
@@ -297,22 +343,22 @@ function MinimalFooter({
297
343
  links = [],
298
344
  copyright
299
345
  }) {
300
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
346
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
301
347
  "footer",
302
348
  {
303
349
  className: "border-t border-stone-800 bg-stone-900 text-stone-400",
304
350
  "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)(
351
+ 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: [
352
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
307
353
  "a",
308
354
  {
309
355
  href: brandHref,
310
356
  className: "inline-flex flex-col items-center gap-2 text-stone-100 transition hover:opacity-80",
311
357
  target: "_blank",
312
358
  rel: "noreferrer",
313
- "aria-label": `${embodimentLabel} \u2014 visit dataimago.ai`,
359
+ "aria-label": `${embodimentLabel} \u2014 visit dataimago.ai${NEW_TAB_SUFFIX}`,
314
360
  children: [
315
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
361
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
316
362
  import_ui3.Logo,
317
363
  {
318
364
  name: "dataimago",
@@ -321,38 +367,102 @@ function MinimalFooter({
321
367
  className: "[&_svg]:h-7 [&_svg]:w-auto"
322
368
  }
323
369
  ),
324
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "text-sm text-stone-400", children: embodimentLabel })
370
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("span", { className: "text-sm text-stone-400", children: [
371
+ embodimentLabel,
372
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(NewTabIndicator, { hideText: true })
373
+ ] })
325
374
  ]
326
375
  }
327
376
  ),
328
- links.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
377
+ links.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
329
378
  "nav",
330
379
  {
331
380
  className: "flex flex-wrap items-center justify-center gap-x-6 gap-y-2 text-sm",
332
381
  "aria-label": "Footer",
333
382
  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)(
383
+ ({ 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
384
  "a",
336
385
  {
337
386
  href,
338
387
  className: "text-stone-300 hover:text-paper-100",
339
388
  target: "_blank",
340
389
  rel: "noreferrer",
341
- children: label
390
+ children: [
391
+ label,
392
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(NewTabIndicator, {})
393
+ ]
342
394
  },
343
395
  label
344
- ) : /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_link3.default, { href, className: "text-stone-300 hover:text-paper-100", children: label }, label)
396
+ ) : /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_link3.default, { href, className: "text-stone-300 hover:text-paper-100", children: label }, label)
345
397
  )
346
398
  }
347
399
  ) : null,
348
- copyright ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("p", { className: "text-xs text-stone-400", children: copyright }) : null
400
+ copyright ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "text-xs text-stone-400", children: copyright }) : null
401
+ ] })
402
+ }
403
+ );
404
+ }
405
+
406
+ // src/CopulaFooter.tsx
407
+ var import_link4 = __toESM(require("next/link"), 1);
408
+ var import_ui4 = require("@dataimago/ui");
409
+ var import_jsx_runtime6 = require("react/jsx-runtime");
410
+ function FooterLink({ href, children, ...props }) {
411
+ return href.startsWith("/") ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_link4.default, { href, ...props, children }) : /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("a", { href, ...props, children });
412
+ }
413
+ function CopulaFooter({
414
+ property,
415
+ propertyLabel,
416
+ propertyHref = "/",
417
+ dataimago = "shown",
418
+ brandHref = "https://dataimago.ai",
419
+ links = [],
420
+ linksLabel = "Legal",
421
+ copyright
422
+ }) {
423
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
424
+ "footer",
425
+ {
426
+ className: "border-t border-stone-800 bg-stone-900 text-stone-400",
427
+ "data-bs-theme": "dark",
428
+ children: /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("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: [
429
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
430
+ import_ui4.CopulaLockup,
431
+ {
432
+ property,
433
+ propertyLabel,
434
+ propertyHref,
435
+ dataimago,
436
+ brandHref,
437
+ linkClassName: "text-stone-200 transition hover:text-stone-50",
438
+ badgeClassName: "text-stone-200",
439
+ renderLink: FooterLink
440
+ }
441
+ ),
442
+ links.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("nav", { "aria-label": linksLabel, className: "flex flex-wrap items-center gap-x-5 gap-y-2 text-sm", children: links.map(
443
+ ({ href, label, external }) => !href ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "text-stone-400", children: label }, label) : external ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
444
+ "a",
445
+ {
446
+ href,
447
+ className: "text-stone-400 transition hover:text-stone-200",
448
+ target: "_blank",
449
+ rel: "noreferrer",
450
+ children: [
451
+ label,
452
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(NewTabIndicator, {})
453
+ ]
454
+ },
455
+ label
456
+ ) : /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_link4.default, { href, className: "text-stone-400 transition hover:text-stone-200", children: label }, label)
457
+ ) }) : null,
458
+ copyright ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "w-full text-xs text-stone-400", children: copyright }) : null
349
459
  ] })
350
460
  }
351
461
  );
352
462
  }
353
463
 
354
464
  // src/PhilosophyFooter.tsx
355
- var import_jsx_runtime5 = require("react/jsx-runtime");
465
+ var import_jsx_runtime7 = require("react/jsx-runtime");
356
466
  var DEFAULT_PAIRS = [
357
467
  {
358
468
  eyebrow: "our belief",
@@ -381,17 +491,17 @@ function PhilosophyFooter({
381
491
  density = "default"
382
492
  }) {
383
493
  const compact = density === "compact";
384
- const pullQuote = /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
494
+ const pullQuote = /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
385
495
  "blockquote",
386
496
  {
387
497
  className: `border-l-2 border-copper-500 pl-6 font-display italic text-paper-100 ${compact ? "" : "mt-16 max-w-prose-wide"}`,
388
498
  children: [
389
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "text-base leading-relaxed", children: quote.text }),
390
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("footer", { className: "mt-4 text-sm not-italic text-stone-400", children: [
499
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("p", { className: "text-base leading-relaxed", children: quote.text }),
500
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("footer", { className: "mt-4 text-sm not-italic text-stone-400", children: [
391
501
  "\u2014 ",
392
502
  quote.attribution,
393
503
  ", ",
394
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("cite", { children: quote.work }),
504
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("cite", { children: quote.work }),
395
505
  " (",
396
506
  quote.year,
397
507
  ")"
@@ -399,41 +509,41 @@ function PhilosophyFooter({
399
509
  ]
400
510
  }
401
511
  );
402
- const closing = /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
512
+ const closing = /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
403
513
  "p",
404
514
  {
405
515
  className: `text-stone-400 ${compact ? "text-base leading-relaxed" : "mt-8 max-w-prose-wide text-sm"}`,
406
516
  children: closingStatement
407
517
  }
408
518
  );
409
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
519
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
410
520
  "section",
411
521
  {
412
522
  "aria-labelledby": "philosophy-heading",
413
523
  className: `border-t border-stone-200 bg-stone-900 text-paper-100 ${compact ? "flex flex-col justify-center py-14 sm:py-16 lg:min-h-[50vh]" : "py-20 sm:py-28"}`,
414
524
  "data-bs-theme": "dark",
415
- children: /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "mx-auto w-full max-w-6xl px-6", children: [
416
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: `grid lg:grid-cols-3 ${compact ? "gap-8" : "gap-12"}`, children: pairs.map((pair, i) => /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { children: [
417
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "font-mono text-xs uppercase tracking-wider text-accent-300", children: pair.eyebrow }),
418
- i === 0 ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
525
+ children: /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "mx-auto w-full max-w-6xl px-6", children: [
526
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: `grid lg:grid-cols-3 ${compact ? "gap-8" : "gap-12"}`, children: pairs.map((pair, i) => /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { children: [
527
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("p", { className: "font-mono text-xs uppercase tracking-wider text-accent-300", children: pair.eyebrow }),
528
+ i === 0 ? /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
419
529
  "h3",
420
530
  {
421
531
  id: "philosophy-heading",
422
532
  className: "mt-2 font-display text-xl text-paper-100",
423
533
  children: pair.body
424
534
  }
425
- ) : /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "mt-2 font-display text-xl text-paper-100", children: pair.body })
535
+ ) : /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("p", { className: "mt-2 font-display text-xl text-paper-100", children: pair.body })
426
536
  ] }, i)) }),
427
537
  compact ? (
428
538
  // Critique / answer, side by side — Baudrillard's warning and
429
539
  // dataimago's structural answer. Filling the width is what pulls the
430
540
  // section down to ~half height (the default stacks these in one column,
431
541
  // leaving the right half empty).
432
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "mt-10 grid gap-x-12 gap-y-8 lg:grid-cols-2", children: [
542
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "mt-10 grid gap-x-12 gap-y-8 lg:grid-cols-2", children: [
433
543
  pullQuote,
434
544
  closing
435
545
  ] })
436
- ) : /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_jsx_runtime5.Fragment, { children: [
546
+ ) : /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(import_jsx_runtime7.Fragment, { children: [
437
547
  pullQuote,
438
548
  closing
439
549
  ] })
@@ -443,6 +553,7 @@ function PhilosophyFooter({
443
553
  }
444
554
  // Annotate the CommonJS export names for ESM import in node:
445
555
  0 && (module.exports = {
556
+ CopulaFooter,
446
557
  GitHubNavButton,
447
558
  MinimalFooter,
448
559
  PhilosophyFooter,