@neuronection/assistant-ui 0.8.0 → 0.9.0

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.
Files changed (43) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/README.md +45 -53
  3. package/dist/Logo-D8DEBUoL.d.ts +11 -0
  4. package/dist/about.d.ts +124 -0
  5. package/dist/about.js +3 -0
  6. package/dist/about.js.map +1 -0
  7. package/dist/badge.d.ts +1 -1
  8. package/dist/badge.js +1 -1
  9. package/dist/card.js +1 -1
  10. package/dist/chip-list.js +1 -1
  11. package/dist/chunk-3QGVWTBU.js +475 -0
  12. package/dist/chunk-3QGVWTBU.js.map +1 -0
  13. package/dist/chunk-7EG3AUTS.js +3 -0
  14. package/dist/chunk-7EG3AUTS.js.map +1 -0
  15. package/dist/chunk-A6RXCBJY.js +3 -0
  16. package/dist/chunk-A6RXCBJY.js.map +1 -0
  17. package/dist/chunk-CE7JZP67.js +3 -0
  18. package/dist/chunk-CE7JZP67.js.map +1 -0
  19. package/dist/{chunk-ERK53RFJ.js → chunk-CR42EAF4.js} +3 -3
  20. package/dist/chunk-CR42EAF4.js.map +1 -0
  21. package/dist/{chunk-SKTLC2XY.js → chunk-F4DP4PIM.js} +2 -2
  22. package/dist/{chunk-SKTLC2XY.js.map → chunk-F4DP4PIM.js.map} +1 -1
  23. package/dist/{chunk-TJLELOAW.js → chunk-GVOC3ARM.js} +3 -3
  24. package/dist/{chunk-TJLELOAW.js.map → chunk-GVOC3ARM.js.map} +1 -1
  25. package/dist/chunk-Q2JMEAKN.js +340 -0
  26. package/dist/chunk-Q2JMEAKN.js.map +1 -0
  27. package/dist/{chunk-BN3YHYYL.js → chunk-QUPGIPTT.js} +2 -2
  28. package/dist/{chunk-BN3YHYYL.js.map → chunk-QUPGIPTT.js.map} +1 -1
  29. package/dist/{chunk-HSWSYEFQ.js → chunk-RYE5YCFF.js} +2 -2
  30. package/dist/{chunk-HSWSYEFQ.js.map → chunk-RYE5YCFF.js.map} +1 -1
  31. package/dist/chunk-VPLCX2A5.js +3 -0
  32. package/dist/chunk-VPLCX2A5.js.map +1 -0
  33. package/dist/index.d.ts +4 -1
  34. package/dist/index.js +17 -15
  35. package/dist/index.js.map +1 -1
  36. package/dist/logo.d.ts +18 -0
  37. package/dist/logo.js +3 -0
  38. package/dist/logo.js.map +1 -0
  39. package/dist/styles.css +1 -1
  40. package/dist/time-list.js +1 -1
  41. package/dist/time-picker.js +1 -1
  42. package/package.json +11 -1
  43. package/dist/chunk-ERK53RFJ.js.map +0 -1
@@ -0,0 +1,475 @@
1
+ import { NeuronectionMark, NeuronectionWordmark, StudyMark, CareerMark, HealthMark } from './chunk-Q2JMEAKN.js';
2
+ import { Card, CardHeader, CardContent } from './chunk-RYE5YCFF.js';
3
+ import { ChipList } from './chunk-QUPGIPTT.js';
4
+ import { Badge } from './chunk-F4DP4PIM.js';
5
+ import { cn } from './chunk-BLJWR4ZV.js';
6
+ import * as React2 from 'react';
7
+ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
8
+ import { Link2, ArrowUpRight, Globe, Check, Copy } from 'lucide-react';
9
+ import { cva } from 'class-variance-authority';
10
+
11
+ var AboutCard = React2.forwardRef(
12
+ function AboutCard2({ icon, title, description, heading = "h2", className, children, ...props }, ref) {
13
+ const Title = heading;
14
+ return /* @__PURE__ */ jsxs(Card, { ref, "data-as": "about-card", className: cn("h-fit", className), ...props, children: [
15
+ /* @__PURE__ */ jsxs(CardHeader, { className: "flex-row items-center gap-3", children: [
16
+ icon ? /* @__PURE__ */ jsx(
17
+ "span",
18
+ {
19
+ "aria-hidden": true,
20
+ className: "flex size-10 shrink-0 items-center justify-center rounded-[var(--as-radius)] bg-[var(--as-secondary)] text-[var(--as-secondary-fg)] [&_svg]:size-5",
21
+ children: icon
22
+ }
23
+ ) : null,
24
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1", children: [
25
+ /* @__PURE__ */ jsx(
26
+ Title,
27
+ {
28
+ "data-as": "card-title",
29
+ className: "font-semibold leading-none tracking-tight",
30
+ children: title
31
+ }
32
+ ),
33
+ description ? /* @__PURE__ */ jsx("p", { className: "text-sm text-[var(--as-muted-fg)]", children: description }) : null
34
+ ] })
35
+ ] }),
36
+ children ? /* @__PURE__ */ jsx(CardContent, { children }) : null
37
+ ] });
38
+ }
39
+ );
40
+ var rowClass = "group flex w-full items-center gap-3 rounded-[var(--as-radius)] p-2 text-left transition-colors hover:bg-[var(--as-muted)] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--as-primary)]";
41
+ var tileClass = "flex size-10 shrink-0 items-center justify-center rounded-[var(--as-radius)] bg-[var(--as-secondary)] text-[var(--as-secondary-fg)] transition-colors group-hover:bg-[color-mix(in_srgb,var(--as-secondary-fg)_14%,transparent)] [&_svg]:size-5";
42
+ var CopyRow = ({
43
+ value,
44
+ icon: Icon = Link2,
45
+ label,
46
+ subtitle,
47
+ copyLabel = "Copy to clipboard",
48
+ copiedLabel = "Copied!"
49
+ }) => {
50
+ const [copied, setCopied] = React2.useState(false);
51
+ React2.useEffect(() => {
52
+ if (!copied) return;
53
+ const timeout = setTimeout(() => setCopied(false), 2e3);
54
+ return () => clearTimeout(timeout);
55
+ }, [copied]);
56
+ const onCopy = () => {
57
+ void navigator.clipboard?.writeText(value).then(() => setCopied(true));
58
+ };
59
+ return /* @__PURE__ */ jsxs(
60
+ "button",
61
+ {
62
+ type: "button",
63
+ onClick: onCopy,
64
+ "data-as": "about-copy-row",
65
+ "aria-label": `${typeof label === "string" ? label : copyLabel} \u2014 ${copyLabel}`,
66
+ className: rowClass,
67
+ children: [
68
+ /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: tileClass, children: /* @__PURE__ */ jsx(Icon, { className: "size-5" }) }),
69
+ /* @__PURE__ */ jsxs("span", { className: "min-w-0 flex-1", children: [
70
+ /* @__PURE__ */ jsx("span", { className: "block truncate text-sm font-semibold text-[var(--as-fg)] transition-colors group-hover:text-[var(--as-primary)]", children: label }),
71
+ /* @__PURE__ */ jsx("span", { className: "block truncate text-xs text-[var(--as-muted-fg)]", children: copied ? copiedLabel : subtitle })
72
+ ] }),
73
+ copied ? /* @__PURE__ */ jsx(Check, { "aria-hidden": true, className: "size-4 shrink-0 text-[var(--as-success)]" }) : /* @__PURE__ */ jsx(
74
+ Copy,
75
+ {
76
+ "aria-hidden": true,
77
+ className: "size-4 shrink-0 text-[var(--as-muted-fg)] opacity-0 transition-opacity group-hover:opacity-100"
78
+ }
79
+ )
80
+ ]
81
+ }
82
+ );
83
+ };
84
+ var AboutLinkList = React2.forwardRef(
85
+ function AboutLinkList2({ links, className, ...props }, ref) {
86
+ let lastGroup;
87
+ return /* @__PURE__ */ jsx(
88
+ "ul",
89
+ {
90
+ ref,
91
+ "data-as": "about-link-list",
92
+ className: cn("flex flex-col gap-0.5", className),
93
+ ...props,
94
+ children: links.map((link, index) => {
95
+ const Icon = link.icon ?? Link2;
96
+ const external = link.external !== false;
97
+ const heading = link.group !== void 0 && link.group !== lastGroup ? link.group : null;
98
+ lastGroup = link.group;
99
+ return /* @__PURE__ */ jsxs("li", { children: [
100
+ heading !== null ? /* @__PURE__ */ jsx(
101
+ "p",
102
+ {
103
+ className: cn(
104
+ "mb-1.5 text-[11px] font-semibold uppercase tracking-wider text-[var(--as-muted-fg)]",
105
+ index > 0 && "mt-4"
106
+ ),
107
+ children: heading
108
+ }
109
+ ) : null,
110
+ link.copyValue && !link.href ? /* @__PURE__ */ jsx(
111
+ CopyRow,
112
+ {
113
+ value: link.copyValue,
114
+ icon: link.icon,
115
+ label: link.label,
116
+ subtitle: link.subtitle,
117
+ copyLabel: link.copyLabel,
118
+ copiedLabel: link.copiedLabel
119
+ }
120
+ ) : /* @__PURE__ */ jsxs(
121
+ "a",
122
+ {
123
+ href: link.href,
124
+ ...external ? { target: "_blank", rel: "noreferrer" } : {},
125
+ className: rowClass,
126
+ children: [
127
+ /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: tileClass, children: /* @__PURE__ */ jsx(Icon, { className: "size-5" }) }),
128
+ /* @__PURE__ */ jsxs("span", { className: "min-w-0 flex-1", children: [
129
+ /* @__PURE__ */ jsx("span", { className: "block truncate text-sm font-semibold text-[var(--as-fg)] transition-colors group-hover:text-[var(--as-primary)]", children: link.label }),
130
+ link.subtitle ? /* @__PURE__ */ jsx("span", { className: "block truncate text-xs text-[var(--as-muted-fg)]", children: link.subtitle }) : null
131
+ ] }),
132
+ external ? /* @__PURE__ */ jsx(
133
+ ArrowUpRight,
134
+ {
135
+ "aria-hidden": true,
136
+ className: "size-4 shrink-0 text-[var(--as-muted-fg)] opacity-60 transition-opacity group-hover:opacity-100"
137
+ }
138
+ ) : null
139
+ ]
140
+ }
141
+ )
142
+ ] }, index);
143
+ })
144
+ }
145
+ );
146
+ }
147
+ );
148
+ var noteStyles = cva(
149
+ "rounded-[var(--as-radius-lg)] border p-5 text-sm leading-relaxed",
150
+ {
151
+ variants: {
152
+ tone: {
153
+ info: "border-[color-mix(in_srgb,var(--as-primary)_25%,transparent)] bg-[color-mix(in_srgb,var(--as-primary)_8%,transparent)] text-[var(--as-fg)]",
154
+ warning: "border-[color-mix(in_srgb,var(--as-warning)_35%,transparent)] bg-[color-mix(in_srgb,var(--as-warning)_12%,transparent)] text-[color-mix(in_srgb,var(--as-warning)_72%,var(--as-fg))]"
155
+ }
156
+ },
157
+ defaultVariants: {
158
+ tone: "info"
159
+ }
160
+ }
161
+ );
162
+ var AboutNote = React2.forwardRef(
163
+ function AboutNote2({ tone, title, className, children, ...props }, ref) {
164
+ return /* @__PURE__ */ jsxs("div", { ref, "data-as": "about-note", "data-as-tone": tone, className: cn(noteStyles({ tone }), className), ...props, children: [
165
+ title ? /* @__PURE__ */ jsx("p", { className: "mb-1.5 font-semibold uppercase tracking-wider", children: title }) : null,
166
+ children
167
+ ] });
168
+ }
169
+ );
170
+ var AboutFooterLine = React2.forwardRef(function AboutFooterLine2({ version, copyright, className, children, ...props }, ref) {
171
+ return /* @__PURE__ */ jsxs(
172
+ "p",
173
+ {
174
+ ref,
175
+ "data-as": "about-footer-line",
176
+ className: cn("text-center text-xs text-[var(--as-muted-fg)]", className),
177
+ ...props,
178
+ children: [
179
+ version ? /* @__PURE__ */ jsx("span", { children: version }) : null,
180
+ version && (copyright || children) ? /* @__PURE__ */ jsx("br", {}) : null,
181
+ copyright ?? children
182
+ ]
183
+ }
184
+ );
185
+ });
186
+ var GitHubGlyph = ({ className }) => /* @__PURE__ */ jsx("svg", { viewBox: "0 0 24 24", fill: "currentColor", "aria-hidden": true, className, children: /* @__PURE__ */ jsx("path", { d: "M12 .5C5.65.5.5 5.65.5 12c0 5.08 3.29 9.39 7.86 10.91.58.11.79-.25.79-.55 0-.27-.01-1.17-.02-2.12-3.2.7-3.88-1.36-3.88-1.36-.52-1.33-1.28-1.68-1.28-1.68-1.04-.71.08-.7.08-.7 1.15.08 1.76 1.19 1.76 1.19 1.03 1.75 2.69 1.25 3.35.95.1-.74.4-1.25.72-1.53-2.55-.29-5.24-1.28-5.24-5.68 0-1.26.45-2.28 1.19-3.09-.12-.29-.52-1.46.11-3.05 0 0 .97-.31 3.18 1.18a11.1 11.1 0 0 1 5.8 0c2.2-1.49 3.17-1.18 3.17-1.18.63 1.59.23 2.76.12 3.05.74.81 1.18 1.83 1.18 3.09 0 4.42-2.69 5.39-5.25 5.67.41.35.77 1.05.77 2.12 0 1.53-.01 2.76-.01 3.14 0 .3.2.67.8.55A11.51 11.51 0 0 0 23.5 12C23.5 5.65 18.35.5 12 .5Z" }) });
187
+ var marks = {
188
+ health: HealthMark,
189
+ career: CareerMark,
190
+ study: StudyMark
191
+ };
192
+ var defaultMembers = {
193
+ health: {
194
+ name: "Health Assistant",
195
+ tagline: "Self-hosted, privacy-first health records with AI insights",
196
+ href: "https://neuronection.com/en/health/",
197
+ github: "https://github.com/health-assistant-io/health-assistant",
198
+ website: "https://health-assistant.io"
199
+ },
200
+ career: {
201
+ name: "Career Assistant",
202
+ tagline: "Open-source career explorer with transparent AI matching",
203
+ href: "https://neuronection.com/en/career/",
204
+ github: "https://github.com/neuronection/career-assistant"
205
+ },
206
+ study: {
207
+ name: "Study Assistant",
208
+ tagline: "Local-first study workbench that runs in your browser",
209
+ href: "https://neuronection.com/en/study/",
210
+ github: "https://github.com/neuronection/study-assistant"
211
+ }
212
+ };
213
+ var defaultOrder = ["health", "career", "study"];
214
+ var defaultBlurb = "Neuronection is a family of open-source, self-hosted AI assistants \u2014 one connected ecosystem for life\u2019s important choices. Every assistant in the family shares the same principles: deeply structured data instead of text dumps, AI that explains its reasoning, and you in control of your information.";
215
+ var FamilyBadge = React2.forwardRef(
216
+ function FamilyBadge2({
217
+ current,
218
+ members,
219
+ creator,
220
+ creatorLabel = "Created by",
221
+ hubUrl = "https://neuronection.com",
222
+ label = "Part of the Neuronection family",
223
+ blurb = defaultBlurb,
224
+ ctaLabel = "Visit neuronection.com",
225
+ currentLabel = "Current app",
226
+ githubLabel = "GitHub",
227
+ websiteLabel = "Website",
228
+ theme = "light",
229
+ className,
230
+ ...props
231
+ }, ref) {
232
+ const list = members ?? defaultOrder.map((app) => ({ app, ...defaultMembers[app] }));
233
+ return /* @__PURE__ */ jsxs(
234
+ "section",
235
+ {
236
+ ref,
237
+ "data-as": "family-badge",
238
+ "aria-label": label,
239
+ className: cn(
240
+ "flex flex-col gap-5 rounded-[var(--as-radius-lg)] border border-[var(--as-border)] bg-[var(--as-surface)] p-6 shadow-[var(--as-shadow-1)] sm:p-8",
241
+ className
242
+ ),
243
+ ...props,
244
+ children: [
245
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center justify-between gap-x-6 gap-y-4", children: [
246
+ /* @__PURE__ */ jsxs(
247
+ "a",
248
+ {
249
+ href: hubUrl,
250
+ target: "_blank",
251
+ rel: "noreferrer",
252
+ "aria-label": label,
253
+ className: "flex items-center gap-3 rounded-[var(--as-radius)] p-1 transition-opacity hover:opacity-85 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--as-primary)]",
254
+ children: [
255
+ /* @__PURE__ */ jsx(NeuronectionMark, { size: 44, theme }),
256
+ /* @__PURE__ */ jsx(NeuronectionWordmark, { size: 24, theme })
257
+ ]
258
+ }
259
+ ),
260
+ /* @__PURE__ */ jsxs(
261
+ "a",
262
+ {
263
+ href: hubUrl,
264
+ target: "_blank",
265
+ rel: "noreferrer",
266
+ "data-as": "family-cta",
267
+ className: "group inline-flex items-center gap-2.5 rounded-full bg-[var(--as-primary)] py-2 pl-5 pr-2 text-sm font-semibold text-[var(--as-primary-fg)] shadow-[var(--as-shadow-2)] transition-shadow hover:shadow-[var(--as-shadow-3)] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--as-primary)]",
268
+ children: [
269
+ ctaLabel,
270
+ /* @__PURE__ */ jsx(
271
+ "span",
272
+ {
273
+ "aria-hidden": true,
274
+ className: "flex size-7 items-center justify-center rounded-full bg-[color-mix(in_srgb,var(--as-primary-fg)_20%,transparent)] transition-colors group-hover:bg-[color-mix(in_srgb,var(--as-primary-fg)_32%,transparent)]",
275
+ children: /* @__PURE__ */ jsx(ArrowUpRight, { className: "size-4" })
276
+ }
277
+ )
278
+ ]
279
+ }
280
+ )
281
+ ] }),
282
+ blurb ? /* @__PURE__ */ jsx("p", { className: "max-w-2xl text-base leading-relaxed text-[var(--as-muted-fg)]", children: blurb }) : null,
283
+ /* @__PURE__ */ jsx("ul", { className: "grid grid-cols-1 gap-x-3 gap-y-4 sm:grid-cols-3", children: list.map((member) => {
284
+ const Mark = marks[member.app];
285
+ const isCurrent = member.app === current;
286
+ const card = cn(
287
+ "group flex h-full flex-col rounded-[var(--as-radius)] border p-5 pt-6 text-center transition-[color,box-shadow] hover:shadow-[var(--as-shadow-2)]",
288
+ isCurrent ? "border-[var(--as-primary)] bg-[color-mix(in_srgb,var(--as-primary)_7%,transparent)] ring-2 ring-[var(--as-primary)]" : "border-[var(--as-border)] bg-[var(--as-muted)] hover:border-[var(--as-primary)]"
289
+ );
290
+ const linkExtras = "focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--as-primary)]";
291
+ const header = /* @__PURE__ */ jsxs(Fragment, { children: [
292
+ /* @__PURE__ */ jsx(Mark, { size: 56, theme }),
293
+ member.href && !isCurrent ? /* @__PURE__ */ jsx("span", { className: "text-base font-bold leading-snug text-[var(--as-primary)] underline decoration-transparent underline-offset-4 transition-colors group-hover:decoration-current", children: member.name }) : /* @__PURE__ */ jsx("span", { className: "text-base font-bold leading-snug text-[var(--as-fg)]", children: member.name }),
294
+ member.tagline ? /* @__PURE__ */ jsx("span", { className: "text-sm leading-relaxed text-[var(--as-muted-fg)]", children: member.tagline }) : null,
295
+ isCurrent ? /* @__PURE__ */ jsx("span", { className: "mt-1 rounded-full bg-[var(--as-primary)] px-2.5 py-1 text-[11px] font-semibold uppercase tracking-wide text-[var(--as-primary-fg)]", children: currentLabel }) : null
296
+ ] });
297
+ return /* @__PURE__ */ jsx("li", { "data-current": isCurrent ? "true" : void 0, className: "flex", children: /* @__PURE__ */ jsxs("div", { className: cn(card, "w-full"), children: [
298
+ member.href && !isCurrent ? /* @__PURE__ */ jsx(
299
+ "a",
300
+ {
301
+ href: member.href,
302
+ target: "_blank",
303
+ rel: "noreferrer",
304
+ className: cn("flex flex-1 flex-col items-center gap-2.5", linkExtras),
305
+ children: header
306
+ }
307
+ ) : /* @__PURE__ */ jsx("div", { className: "flex flex-1 flex-col items-center gap-2.5", children: header }),
308
+ member.github || member.website ? /* @__PURE__ */ jsxs("div", { className: "mt-5 flex items-center justify-center gap-2 border-t border-[var(--as-border)] pt-4", children: [
309
+ member.github ? /* @__PURE__ */ jsxs(
310
+ "a",
311
+ {
312
+ href: member.github,
313
+ target: "_blank",
314
+ rel: "noreferrer",
315
+ "aria-label": `${member.name} on GitHub`,
316
+ className: "inline-flex items-center gap-1.5 rounded-full border border-[var(--as-border)] bg-[var(--as-surface)] px-3.5 py-2 text-xs font-semibold text-[var(--as-muted-fg)] transition-colors hover:border-[var(--as-primary)] hover:text-[var(--as-primary)] focus-visible:border-[var(--as-primary)] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--as-primary)]",
317
+ children: [
318
+ /* @__PURE__ */ jsx(GitHubGlyph, { className: "size-4" }),
319
+ githubLabel
320
+ ]
321
+ }
322
+ ) : null,
323
+ member.website ? /* @__PURE__ */ jsxs(
324
+ "a",
325
+ {
326
+ href: member.website,
327
+ target: "_blank",
328
+ rel: "noreferrer",
329
+ "aria-label": `${member.name} website`,
330
+ className: "inline-flex items-center gap-1.5 rounded-full border border-[var(--as-border)] bg-[var(--as-surface)] px-3.5 py-2 text-xs font-semibold text-[var(--as-muted-fg)] transition-colors hover:border-[var(--as-primary)] hover:text-[var(--as-primary)] focus-visible:border-[var(--as-primary)] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--as-primary)]",
331
+ children: [
332
+ /* @__PURE__ */ jsx(Globe, { "aria-hidden": true, className: "size-4" }),
333
+ websiteLabel
334
+ ]
335
+ }
336
+ ) : null
337
+ ] }) : null
338
+ ] }) }, member.app);
339
+ }) }),
340
+ creator ? /* @__PURE__ */ jsxs("p", { className: "flex flex-wrap items-center justify-center gap-x-1.5 gap-y-1 border-t border-[var(--as-border)] pt-4 text-xs text-[var(--as-muted-fg)]", children: [
341
+ /* @__PURE__ */ jsx("span", { children: creatorLabel }),
342
+ creator.href ? /* @__PURE__ */ jsx(
343
+ "a",
344
+ {
345
+ href: creator.href,
346
+ target: "_blank",
347
+ rel: "noreferrer",
348
+ className: "rounded font-semibold text-[var(--as-fg)] transition-colors hover:text-[var(--as-primary)] hover:underline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--as-primary)]",
349
+ children: creator.name
350
+ }
351
+ ) : /* @__PURE__ */ jsx("span", { className: "font-semibold text-[var(--as-fg)]", children: creator.name }),
352
+ creator.role ? /* @__PURE__ */ jsxs("span", { children: [
353
+ "\xB7 ",
354
+ creator.role
355
+ ] }) : null
356
+ ] }) : null
357
+ ]
358
+ }
359
+ );
360
+ }
361
+ );
362
+ var TechChips = React2.forwardRef(
363
+ function TechChips2({ items, className, ...props }, ref) {
364
+ const cleaned = items.filter((item) => Boolean(item));
365
+ if (cleaned.length === 0) return null;
366
+ return /* @__PURE__ */ jsx("div", { ref, "data-as": "tech-chips", className: cn(className), ...props, children: /* @__PURE__ */ jsx(ChipList, { items: cleaned, variant: "neutral" }) });
367
+ }
368
+ );
369
+ var marks2 = {
370
+ health: HealthMark,
371
+ career: CareerMark,
372
+ study: StudyMark
373
+ };
374
+ var AboutPanel = React2.forwardRef(
375
+ function AboutPanel2({
376
+ appName,
377
+ familyCurrent,
378
+ logo,
379
+ tagline,
380
+ description,
381
+ version,
382
+ license,
383
+ licenseTitle = "License & open source",
384
+ licenseLinkLabel = "Read license",
385
+ links,
386
+ linksTitle = "Links",
387
+ creator,
388
+ creatorTitle = "Created by",
389
+ tech,
390
+ techTitle = "Built with",
391
+ note,
392
+ familyMembers,
393
+ hubUrl,
394
+ familyLabel,
395
+ familyBlurb,
396
+ familyCtaLabel,
397
+ familyCurrentLabel,
398
+ theme = "light",
399
+ copyright,
400
+ className,
401
+ children,
402
+ ...props
403
+ }, ref) {
404
+ const DefaultMark = familyCurrent ? marks2[familyCurrent] : null;
405
+ return /* @__PURE__ */ jsxs(
406
+ "div",
407
+ {
408
+ ref,
409
+ "data-as": "about-panel",
410
+ className: cn("flex w-full flex-col gap-6", className),
411
+ ...props,
412
+ children: [
413
+ /* @__PURE__ */ jsxs("section", { className: "flex items-start gap-5", children: [
414
+ logo ?? (DefaultMark ? /* @__PURE__ */ jsx(DefaultMark, { size: 72, theme }) : null),
415
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1.5 pt-1", children: [
416
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-2.5", children: [
417
+ /* @__PURE__ */ jsx("h1", { className: "text-2xl font-bold tracking-tight text-[var(--as-fg)]", children: appName }),
418
+ version ? /* @__PURE__ */ jsxs(Badge, { variant: "outline", "data-as": "about-version", children: [
419
+ "v",
420
+ version
421
+ ] }) : null
422
+ ] }),
423
+ tagline ? /* @__PURE__ */ jsx("p", { className: "text-sm font-medium text-[var(--as-muted-fg)]", children: tagline }) : null,
424
+ description ? /* @__PURE__ */ jsx("p", { className: "max-w-2xl text-sm leading-relaxed text-[var(--as-muted-fg)]", children: description }) : null
425
+ ] })
426
+ ] }),
427
+ creator || license || links?.length ? /* @__PURE__ */ jsxs("section", { className: "grid grid-cols-1 gap-4 md:grid-cols-2", children: [
428
+ creator && !familyCurrent ? /* @__PURE__ */ jsxs(AboutCard, { title: creatorTitle, children: [
429
+ /* @__PURE__ */ jsx("p", { className: "font-semibold text-[var(--as-fg)]", children: creator.name }),
430
+ creator.role ? /* @__PURE__ */ jsx("p", { className: "mb-3 text-sm text-[var(--as-muted-fg)]", children: creator.role }) : null,
431
+ creator.links?.length ? /* @__PURE__ */ jsx(AboutLinkList, { links: creator.links }) : null
432
+ ] }) : null,
433
+ license ? /* @__PURE__ */ jsx(AboutCard, { title: licenseTitle, children: /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-3 rounded-[var(--as-radius)] border border-[var(--as-border)] bg-[var(--as-muted)] px-4 py-3", children: [
434
+ /* @__PURE__ */ jsx("span", { className: "font-semibold text-[var(--as-fg)]", children: license.name }),
435
+ license.href ? /* @__PURE__ */ jsx(
436
+ "a",
437
+ {
438
+ href: license.href,
439
+ target: "_blank",
440
+ rel: "noreferrer",
441
+ className: "text-xs font-bold text-[var(--as-primary)] hover:underline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--as-primary)]",
442
+ children: licenseLinkLabel
443
+ }
444
+ ) : null
445
+ ] }) }) : null,
446
+ links?.length ? /* @__PURE__ */ jsx(AboutCard, { title: linksTitle, children: /* @__PURE__ */ jsx(AboutLinkList, { links }) }) : null
447
+ ] }) : null,
448
+ tech?.length ? /* @__PURE__ */ jsx(AboutCard, { title: techTitle, children: /* @__PURE__ */ jsx(TechChips, { items: tech }) }) : null,
449
+ note ? /* @__PURE__ */ jsx(AboutNote, { tone: note.tone, title: note.title, children: note.children }) : null,
450
+ familyCurrent ? /* @__PURE__ */ jsx(
451
+ FamilyBadge,
452
+ {
453
+ current: familyCurrent,
454
+ members: familyMembers,
455
+ creator: creator ? { name: creator.name, role: creator.role, href: creator.href } : void 0,
456
+ creatorLabel: creatorTitle,
457
+ hubUrl,
458
+ label: familyLabel,
459
+ blurb: familyBlurb,
460
+ ctaLabel: familyCtaLabel,
461
+ currentLabel: familyCurrentLabel,
462
+ theme
463
+ }
464
+ ) : null,
465
+ version || copyright ? /* @__PURE__ */ jsx(AboutFooterLine, { version, copyright }) : null,
466
+ children
467
+ ]
468
+ }
469
+ );
470
+ }
471
+ );
472
+
473
+ export { AboutCard, AboutFooterLine, AboutLinkList, AboutNote, AboutPanel, FamilyBadge, TechChips };
474
+ //# sourceMappingURL=chunk-3QGVWTBU.js.map
475
+ //# sourceMappingURL=chunk-3QGVWTBU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/about/AboutCard.tsx","../src/components/about/AboutLinkList.tsx","../src/components/about/AboutNote.tsx","../src/components/about/AboutFooterLine.tsx","../src/components/about/FamilyBadge.tsx","../src/components/about/TechChips.tsx","../src/components/about/AboutPanel.tsx"],"names":["React","AboutCard","jsxs","jsx","AboutLinkList","React3","AboutNote","React4","AboutFooterLine","React5","FamilyBadge","ArrowUpRight","React6","TechChips","marks","React7","AboutPanel"],"mappings":"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","file":"chunk-3QGVWTBU.js","sourcesContent":["import * as React from 'react'\nimport { cn } from '../../lib/utils'\nimport { Card, CardContent, CardHeader } from '../card/Card'\n\nexport interface AboutCardProps extends Omit<React.ComponentProps<'div'>, 'title'> {\n icon?: React.ReactNode\n title: React.ReactNode\n description?: React.ReactNode\n heading?: 'h2' | 'h3' | 'h4'\n}\n\nexport const AboutCard = React.forwardRef<HTMLDivElement, AboutCardProps>(\n function AboutCard({ icon, title, description, heading = 'h2', className, children, ...props }, ref) {\n const Title = heading\n return (\n <Card ref={ref} data-as=\"about-card\" className={cn('h-fit', className)} {...props}>\n <CardHeader className=\"flex-row items-center gap-3\">\n {icon ? (\n <span\n aria-hidden\n className=\"flex size-10 shrink-0 items-center justify-center rounded-[var(--as-radius)] bg-[var(--as-secondary)] text-[var(--as-secondary-fg)] [&_svg]:size-5\"\n >\n {icon}\n </span>\n ) : null}\n <div className=\"flex flex-col gap-1\">\n <Title\n data-as=\"card-title\"\n className=\"font-semibold leading-none tracking-tight\"\n >\n {title}\n </Title>\n {description ? (\n <p className=\"text-sm text-[var(--as-muted-fg)]\">{description}</p>\n ) : null}\n </div>\n </CardHeader>\n {children ? <CardContent>{children}</CardContent> : null}\n </Card>\n )\n },\n)\n","import * as React from 'react'\nimport { ArrowUpRight, Check, Copy, Link2 } from 'lucide-react'\nimport { cn } from '../../lib/utils'\n\nexport interface AboutLinkItem {\n href?: string\n label: React.ReactNode\n subtitle?: React.ReactNode\n icon?: React.ComponentType<{ className?: string }>\n external?: boolean\n group?: React.ReactNode\n copyValue?: string\n copyLabel?: string\n copiedLabel?: string\n}\n\nexport interface AboutLinkListProps extends React.ComponentProps<'ul'> {\n links: ReadonlyArray<AboutLinkItem>\n}\n\nconst rowClass =\n 'group flex w-full items-center gap-3 rounded-[var(--as-radius)] p-2 text-left transition-colors hover:bg-[var(--as-muted)] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--as-primary)]'\n\nconst tileClass =\n 'flex size-10 shrink-0 items-center justify-center rounded-[var(--as-radius)] bg-[var(--as-secondary)] text-[var(--as-secondary-fg)] transition-colors group-hover:bg-[color-mix(in_srgb,var(--as-secondary-fg)_14%,transparent)] [&_svg]:size-5'\n\ninterface CopyRowProps {\n value: string\n icon?: React.ComponentType<{ className?: string }>\n label?: React.ReactNode\n subtitle?: React.ReactNode\n copyLabel?: string\n copiedLabel?: string\n}\n\nconst CopyRow = ({\n value,\n icon: Icon = Link2,\n label,\n subtitle,\n copyLabel = 'Copy to clipboard',\n copiedLabel = 'Copied!',\n}: CopyRowProps) => {\n const [copied, setCopied] = React.useState(false)\n React.useEffect(() => {\n if (!copied) return\n const timeout = setTimeout(() => setCopied(false), 2000)\n return () => clearTimeout(timeout)\n }, [copied])\n const onCopy = () => {\n void navigator.clipboard?.writeText(value).then(() => setCopied(true))\n }\n return (\n <button\n type=\"button\"\n onClick={onCopy}\n data-as=\"about-copy-row\"\n aria-label={`${typeof label === 'string' ? label : copyLabel} — ${copyLabel}`}\n className={rowClass}\n >\n <span aria-hidden className={tileClass}>\n <Icon className=\"size-5\" />\n </span>\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate text-sm font-semibold text-[var(--as-fg)] transition-colors group-hover:text-[var(--as-primary)]\">\n {label}\n </span>\n <span className=\"block truncate text-xs text-[var(--as-muted-fg)]\">\n {copied ? copiedLabel : subtitle}\n </span>\n </span>\n {copied ? (\n <Check aria-hidden className=\"size-4 shrink-0 text-[var(--as-success)]\" />\n ) : (\n <Copy\n aria-hidden\n className=\"size-4 shrink-0 text-[var(--as-muted-fg)] opacity-0 transition-opacity group-hover:opacity-100\"\n />\n )}\n </button>\n )\n}\n\nexport const AboutLinkList = React.forwardRef<HTMLUListElement, AboutLinkListProps>(\n function AboutLinkList({ links, className, ...props }, ref) {\n let lastGroup: React.ReactNode | undefined\n return (\n <ul\n ref={ref}\n data-as=\"about-link-list\"\n className={cn('flex flex-col gap-0.5', className)}\n {...props}\n >\n {links.map((link, index) => {\n const Icon = link.icon ?? Link2\n const external = link.external !== false\n const heading =\n link.group !== undefined && link.group !== lastGroup ? link.group : null\n lastGroup = link.group\n return (\n <li key={index}>\n {heading !== null ? (\n <p\n className={cn(\n 'mb-1.5 text-[11px] font-semibold uppercase tracking-wider text-[var(--as-muted-fg)]',\n index > 0 && 'mt-4',\n )}\n >\n {heading}\n </p>\n ) : null}\n {link.copyValue && !link.href ? (\n <CopyRow\n value={link.copyValue}\n icon={link.icon}\n label={link.label}\n subtitle={link.subtitle}\n copyLabel={link.copyLabel}\n copiedLabel={link.copiedLabel}\n />\n ) : (\n <a\n href={link.href}\n {...(external ? { target: '_blank', rel: 'noreferrer' } : {})}\n className={rowClass}\n >\n <span aria-hidden className={tileClass}>\n <Icon className=\"size-5\" />\n </span>\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate text-sm font-semibold text-[var(--as-fg)] transition-colors group-hover:text-[var(--as-primary)]\">\n {link.label}\n </span>\n {link.subtitle ? (\n <span className=\"block truncate text-xs text-[var(--as-muted-fg)]\">\n {link.subtitle}\n </span>\n ) : null}\n </span>\n {external ? (\n <ArrowUpRight\n aria-hidden\n className=\"size-4 shrink-0 text-[var(--as-muted-fg)] opacity-60 transition-opacity group-hover:opacity-100\"\n />\n ) : null}\n </a>\n )}\n </li>\n )\n })}\n </ul>\n )\n },\n)\n","import * as React from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '../../lib/utils'\n\nconst noteStyles = cva(\n 'rounded-[var(--as-radius-lg)] border p-5 text-sm leading-relaxed',\n {\n variants: {\n tone: {\n info: 'border-[color-mix(in_srgb,var(--as-primary)_25%,transparent)] bg-[color-mix(in_srgb,var(--as-primary)_8%,transparent)] text-[var(--as-fg)]',\n warning:\n 'border-[color-mix(in_srgb,var(--as-warning)_35%,transparent)] bg-[color-mix(in_srgb,var(--as-warning)_12%,transparent)] text-[color-mix(in_srgb,var(--as-warning)_72%,var(--as-fg))]',\n },\n },\n defaultVariants: {\n tone: 'info',\n },\n },\n)\n\nexport interface AboutNoteProps\n extends Omit<React.ComponentProps<'div'>, 'title'>,\n VariantProps<typeof noteStyles> {\n title?: React.ReactNode\n}\n\nexport const AboutNote = React.forwardRef<HTMLDivElement, AboutNoteProps>(\n function AboutNote({ tone, title, className, children, ...props }, ref) {\n return (\n <div ref={ref} data-as=\"about-note\" data-as-tone={tone} className={cn(noteStyles({ tone }), className)} {...props}>\n {title ? <p className=\"mb-1.5 font-semibold uppercase tracking-wider\">{title}</p> : null}\n {children}\n </div>\n )\n },\n)\n","import * as React from 'react'\nimport { cn } from '../../lib/utils'\n\nexport interface AboutFooterLineProps extends React.ComponentProps<'p'> {\n version?: string\n copyright?: React.ReactNode\n}\n\nexport const AboutFooterLine = React.forwardRef<\n HTMLParagraphElement,\n AboutFooterLineProps\n>(function AboutFooterLine({ version, copyright, className, children, ...props }, ref) {\n return (\n <p\n ref={ref}\n data-as=\"about-footer-line\"\n className={cn('text-center text-xs text-[var(--as-muted-fg)]', className)}\n {...props}\n >\n {version ? <span>{version}</span> : null}\n {version && (copyright || children) ? <br /> : null}\n {copyright ?? children}\n </p>\n )\n})\n","import * as React from 'react'\nimport { ArrowUpRight, Globe } from 'lucide-react'\nimport { cn } from '../../lib/utils'\nimport type { LogoTheme } from '../logo/Logo'\nimport { NeuronectionMark } from '../logo/NeuronectionMark'\nimport { NeuronectionWordmark } from '../logo/NeuronectionWordmark'\nimport { CareerMark } from '../logo/CareerMark'\nimport { HealthMark } from '../logo/HealthMark'\nimport { StudyMark } from '../logo/StudyMark'\n\nconst GitHubGlyph = ({ className }: { className?: string }) => (\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden className={className}>\n <path d=\"M12 .5C5.65.5.5 5.65.5 12c0 5.08 3.29 9.39 7.86 10.91.58.11.79-.25.79-.55 0-.27-.01-1.17-.02-2.12-3.2.7-3.88-1.36-3.88-1.36-.52-1.33-1.28-1.68-1.28-1.68-1.04-.71.08-.7.08-.7 1.15.08 1.76 1.19 1.76 1.19 1.03 1.75 2.69 1.25 3.35.95.1-.74.4-1.25.72-1.53-2.55-.29-5.24-1.28-5.24-5.68 0-1.26.45-2.28 1.19-3.09-.12-.29-.52-1.46.11-3.05 0 0 .97-.31 3.18 1.18a11.1 11.1 0 0 1 5.8 0c2.2-1.49 3.17-1.18 3.17-1.18.63 1.59.23 2.76.12 3.05.74.81 1.18 1.83 1.18 3.09 0 4.42-2.69 5.39-5.25 5.67.41.35.77 1.05.77 2.12 0 1.53-.01 2.76-.01 3.14 0 .3.2.67.8.55A11.51 11.51 0 0 0 23.5 12C23.5 5.65 18.35.5 12 .5Z\" />\n </svg>\n)\n\nexport type FamilyApp = 'health' | 'career' | 'study'\n\nexport interface FamilyMember {\n app: FamilyApp\n name: string\n tagline?: string\n href?: string\n github?: string\n website?: string\n}\n\nexport interface FamilyCreator {\n name: React.ReactNode\n role?: React.ReactNode\n href?: string\n}\n\nexport interface FamilyBadgeProps extends Omit<React.ComponentProps<'div'>, 'title'> {\n current: FamilyApp\n members?: ReadonlyArray<FamilyMember>\n creator?: FamilyCreator\n creatorLabel?: string\n hubUrl?: string\n label?: string\n blurb?: React.ReactNode\n ctaLabel?: string\n currentLabel?: string\n githubLabel?: string\n websiteLabel?: string\n theme?: LogoTheme\n}\n\nconst marks = {\n health: HealthMark,\n career: CareerMark,\n study: StudyMark,\n} as const\n\nconst defaultMembers: Record<FamilyApp, { name: string; tagline: string; href: string; github: string; website?: string }> = {\n health: {\n name: 'Health Assistant',\n tagline: 'Self-hosted, privacy-first health records with AI insights',\n href: 'https://neuronection.com/en/health/',\n github: 'https://github.com/health-assistant-io/health-assistant',\n website: 'https://health-assistant.io',\n },\n career: {\n name: 'Career Assistant',\n tagline: 'Open-source career explorer with transparent AI matching',\n href: 'https://neuronection.com/en/career/',\n github: 'https://github.com/neuronection/career-assistant',\n },\n study: {\n name: 'Study Assistant',\n tagline: 'Local-first study workbench that runs in your browser',\n href: 'https://neuronection.com/en/study/',\n github: 'https://github.com/neuronection/study-assistant',\n },\n}\n\nconst defaultOrder: FamilyApp[] = ['health', 'career', 'study']\n\nconst defaultBlurb =\n 'Neuronection is a family of open-source, self-hosted AI assistants — one connected ecosystem for life\\u2019s important choices. Every assistant in the family shares the same principles: deeply structured data instead of text dumps, AI that explains its reasoning, and you in control of your information.'\n\nexport const FamilyBadge = React.forwardRef<HTMLDivElement, FamilyBadgeProps>(\n function FamilyBadge(\n {\n current,\n members,\n creator,\n creatorLabel = 'Created by',\n hubUrl = 'https://neuronection.com',\n label = 'Part of the Neuronection family',\n blurb = defaultBlurb,\n ctaLabel = 'Visit neuronection.com',\n currentLabel = 'Current app',\n githubLabel = 'GitHub',\n websiteLabel = 'Website',\n theme = 'light',\n className,\n ...props\n },\n ref,\n ) {\n const list = members ?? defaultOrder.map((app) => ({ app, ...defaultMembers[app] }))\n return (\n <section\n ref={ref}\n data-as=\"family-badge\"\n aria-label={label}\n className={cn(\n 'flex flex-col gap-5 rounded-[var(--as-radius-lg)] border border-[var(--as-border)] bg-[var(--as-surface)] p-6 shadow-[var(--as-shadow-1)] sm:p-8',\n className,\n )}\n {...props}\n >\n <div className=\"flex flex-wrap items-center justify-between gap-x-6 gap-y-4\">\n <a\n href={hubUrl}\n target=\"_blank\"\n rel=\"noreferrer\"\n aria-label={label}\n className=\"flex items-center gap-3 rounded-[var(--as-radius)] p-1 transition-opacity hover:opacity-85 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--as-primary)]\"\n >\n <NeuronectionMark size={44} theme={theme} />\n <NeuronectionWordmark size={24} theme={theme} />\n </a>\n <a\n href={hubUrl}\n target=\"_blank\"\n rel=\"noreferrer\"\n data-as=\"family-cta\"\n className=\"group inline-flex items-center gap-2.5 rounded-full bg-[var(--as-primary)] py-2 pl-5 pr-2 text-sm font-semibold text-[var(--as-primary-fg)] shadow-[var(--as-shadow-2)] transition-shadow hover:shadow-[var(--as-shadow-3)] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--as-primary)]\"\n >\n {ctaLabel}\n <span\n aria-hidden\n className=\"flex size-7 items-center justify-center rounded-full bg-[color-mix(in_srgb,var(--as-primary-fg)_20%,transparent)] transition-colors group-hover:bg-[color-mix(in_srgb,var(--as-primary-fg)_32%,transparent)]\"\n >\n <ArrowUpRight className=\"size-4\" />\n </span>\n </a>\n </div>\n\n {blurb ? (\n <p className=\"max-w-2xl text-base leading-relaxed text-[var(--as-muted-fg)]\">\n {blurb}\n </p>\n ) : null}\n\n <ul className=\"grid grid-cols-1 gap-x-3 gap-y-4 sm:grid-cols-3\">\n {list.map((member) => {\n const Mark = marks[member.app]\n const isCurrent = member.app === current\n const card = cn(\n 'group flex h-full flex-col rounded-[var(--as-radius)] border p-5 pt-6 text-center transition-[color,box-shadow] hover:shadow-[var(--as-shadow-2)]',\n isCurrent\n ? 'border-[var(--as-primary)] bg-[color-mix(in_srgb,var(--as-primary)_7%,transparent)] ring-2 ring-[var(--as-primary)]'\n : 'border-[var(--as-border)] bg-[var(--as-muted)] hover:border-[var(--as-primary)]',\n )\n const linkExtras =\n 'focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--as-primary)]'\n const header = (\n <>\n <Mark size={56} theme={theme} />\n {member.href && !isCurrent ? (\n <span className=\"text-base font-bold leading-snug text-[var(--as-primary)] underline decoration-transparent underline-offset-4 transition-colors group-hover:decoration-current\">\n {member.name}\n </span>\n ) : (\n <span className=\"text-base font-bold leading-snug text-[var(--as-fg)]\">\n {member.name}\n </span>\n )}\n {member.tagline ? (\n <span className=\"text-sm leading-relaxed text-[var(--as-muted-fg)]\">\n {member.tagline}\n </span>\n ) : null}\n {isCurrent ? (\n <span className=\"mt-1 rounded-full bg-[var(--as-primary)] px-2.5 py-1 text-[11px] font-semibold uppercase tracking-wide text-[var(--as-primary-fg)]\">\n {currentLabel}\n </span>\n ) : null}\n </>\n )\n return (\n <li key={member.app} data-current={isCurrent ? 'true' : undefined} className=\"flex\">\n <div className={cn(card, 'w-full')}>\n {member.href && !isCurrent ? (\n <a\n href={member.href}\n target=\"_blank\"\n rel=\"noreferrer\"\n className={cn('flex flex-1 flex-col items-center gap-2.5', linkExtras)}\n >\n {header}\n </a>\n ) : (\n <div className=\"flex flex-1 flex-col items-center gap-2.5\">{header}</div>\n )}\n {member.github || member.website ? (\n <div className=\"mt-5 flex items-center justify-center gap-2 border-t border-[var(--as-border)] pt-4\">\n {member.github ? (\n <a\n href={member.github}\n target=\"_blank\"\n rel=\"noreferrer\"\n aria-label={`${member.name} on GitHub`}\n className=\"inline-flex items-center gap-1.5 rounded-full border border-[var(--as-border)] bg-[var(--as-surface)] px-3.5 py-2 text-xs font-semibold text-[var(--as-muted-fg)] transition-colors hover:border-[var(--as-primary)] hover:text-[var(--as-primary)] focus-visible:border-[var(--as-primary)] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--as-primary)]\"\n >\n <GitHubGlyph className=\"size-4\" />\n {githubLabel}\n </a>\n ) : null}\n {member.website ? (\n <a\n href={member.website}\n target=\"_blank\"\n rel=\"noreferrer\"\n aria-label={`${member.name} website`}\n className=\"inline-flex items-center gap-1.5 rounded-full border border-[var(--as-border)] bg-[var(--as-surface)] px-3.5 py-2 text-xs font-semibold text-[var(--as-muted-fg)] transition-colors hover:border-[var(--as-primary)] hover:text-[var(--as-primary)] focus-visible:border-[var(--as-primary)] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--as-primary)]\"\n >\n <Globe aria-hidden className=\"size-4\" />\n {websiteLabel}\n </a>\n ) : null}\n </div>\n ) : null}\n </div>\n </li>\n )\n })}\n </ul>\n\n {creator ? (\n <p className=\"flex flex-wrap items-center justify-center gap-x-1.5 gap-y-1 border-t border-[var(--as-border)] pt-4 text-xs text-[var(--as-muted-fg)]\">\n <span>{creatorLabel}</span>\n {creator.href ? (\n <a\n href={creator.href}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"rounded font-semibold text-[var(--as-fg)] transition-colors hover:text-[var(--as-primary)] hover:underline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--as-primary)]\"\n >\n {creator.name}\n </a>\n ) : (\n <span className=\"font-semibold text-[var(--as-fg)]\">{creator.name}</span>\n )}\n {creator.role ? <span>· {creator.role}</span> : null}\n </p>\n ) : null}\n </section>\n )\n },\n)\n","import * as React from 'react'\nimport { cn } from '../../lib/utils'\nimport { ChipList } from '../chip-list/ChipList'\n\nexport interface TechChipsProps extends React.ComponentProps<'div'> {\n items: ReadonlyArray<string | null | undefined>\n}\n\nexport const TechChips = React.forwardRef<HTMLDivElement, TechChipsProps>(\n function TechChips({ items, className, ...props }, ref) {\n const cleaned = items.filter((item): item is string => Boolean(item))\n if (cleaned.length === 0) return null\n return (\n <div ref={ref} data-as=\"tech-chips\" className={cn(className)} {...props}>\n <ChipList items={cleaned} variant=\"neutral\" />\n </div>\n )\n },\n)\n","import * as React from 'react'\nimport { cn } from '../../lib/utils'\nimport { Badge } from '../badge/Badge'\nimport { CareerMark } from '../logo/CareerMark'\nimport { HealthMark } from '../logo/HealthMark'\nimport { StudyMark } from '../logo/StudyMark'\nimport type { LogoTheme } from '../logo/Logo'\nimport { AboutCard } from './AboutCard'\nimport { AboutFooterLine } from './AboutFooterLine'\nimport { AboutLinkList, type AboutLinkItem } from './AboutLinkList'\nimport { AboutNote } from './AboutNote'\nimport { FamilyBadge, type FamilyApp, type FamilyMember } from './FamilyBadge'\nimport { TechChips } from './TechChips'\n\nexport interface AboutCreator {\n name: React.ReactNode\n role?: React.ReactNode\n href?: string\n links?: ReadonlyArray<AboutLinkItem>\n}\n\nexport interface AboutLicense {\n name: string\n href?: string\n}\n\nexport interface AboutNoteContent {\n tone?: 'info' | 'warning'\n title?: React.ReactNode\n children: React.ReactNode\n}\n\nexport interface AboutPanelProps extends React.ComponentProps<'div'> {\n appName: string\n familyCurrent?: FamilyApp\n logo?: React.ReactNode\n tagline?: React.ReactNode\n description?: React.ReactNode\n version?: string\n license?: AboutLicense\n licenseTitle?: string\n licenseLinkLabel?: string\n links?: ReadonlyArray<AboutLinkItem>\n linksTitle?: string\n creator?: AboutCreator\n creatorTitle?: string\n tech?: ReadonlyArray<string>\n techTitle?: string\n note?: AboutNoteContent\n familyMembers?: ReadonlyArray<FamilyMember>\n hubUrl?: string\n familyLabel?: string\n familyBlurb?: React.ReactNode\n familyCtaLabel?: string\n familyCurrentLabel?: string\n theme?: LogoTheme\n copyright?: React.ReactNode\n}\n\nconst marks = {\n health: HealthMark,\n career: CareerMark,\n study: StudyMark,\n} as const\n\nexport const AboutPanel = React.forwardRef<HTMLDivElement, AboutPanelProps>(\n function AboutPanel(\n {\n appName,\n familyCurrent,\n logo,\n tagline,\n description,\n version,\n license,\n licenseTitle = 'License & open source',\n licenseLinkLabel = 'Read license',\n links,\n linksTitle = 'Links',\n creator,\n creatorTitle = 'Created by',\n tech,\n techTitle = 'Built with',\n note,\n familyMembers,\n hubUrl,\n familyLabel,\n familyBlurb,\n familyCtaLabel,\n familyCurrentLabel,\n theme = 'light',\n copyright,\n className,\n children,\n ...props\n },\n ref,\n ) {\n const DefaultMark = familyCurrent ? marks[familyCurrent] : null\n return (\n <div\n ref={ref}\n data-as=\"about-panel\"\n className={cn('flex w-full flex-col gap-6', className)}\n {...props}\n >\n <section className=\"flex items-start gap-5\">\n {logo ?? (DefaultMark ? <DefaultMark size={72} theme={theme} /> : null)}\n <div className=\"flex flex-col gap-1.5 pt-1\">\n <div className=\"flex flex-wrap items-center gap-2.5\">\n <h1 className=\"text-2xl font-bold tracking-tight text-[var(--as-fg)]\">\n {appName}\n </h1>\n {version ? (\n <Badge variant=\"outline\" data-as=\"about-version\">\n v{version}\n </Badge>\n ) : null}\n </div>\n {tagline ? (\n <p className=\"text-sm font-medium text-[var(--as-muted-fg)]\">{tagline}</p>\n ) : null}\n {description ? (\n <p className=\"max-w-2xl text-sm leading-relaxed text-[var(--as-muted-fg)]\">\n {description}\n </p>\n ) : null}\n </div>\n </section>\n\n {creator || license || links?.length ? (\n <section className=\"grid grid-cols-1 gap-4 md:grid-cols-2\">\n {creator && !familyCurrent ? (\n <AboutCard title={creatorTitle}>\n <p className=\"font-semibold text-[var(--as-fg)]\">{creator.name}</p>\n {creator.role ? (\n <p className=\"mb-3 text-sm text-[var(--as-muted-fg)]\">{creator.role}</p>\n ) : null}\n {creator.links?.length ? <AboutLinkList links={creator.links} /> : null}\n </AboutCard>\n ) : null}\n {license ? (\n <AboutCard title={licenseTitle}>\n <div className=\"flex items-center justify-between gap-3 rounded-[var(--as-radius)] border border-[var(--as-border)] bg-[var(--as-muted)] px-4 py-3\">\n <span className=\"font-semibold text-[var(--as-fg)]\">{license.name}</span>\n {license.href ? (\n <a\n href={license.href}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"text-xs font-bold text-[var(--as-primary)] hover:underline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--as-primary)]\"\n >\n {licenseLinkLabel}\n </a>\n ) : null}\n </div>\n </AboutCard>\n ) : null}\n {links?.length ? (\n <AboutCard title={linksTitle}>\n <AboutLinkList links={links} />\n </AboutCard>\n ) : null}\n </section>\n ) : null}\n\n {tech?.length ? (\n <AboutCard title={techTitle}>\n <TechChips items={tech} />\n </AboutCard>\n ) : null}\n\n {note ? (\n <AboutNote tone={note.tone} title={note.title}>\n {note.children}\n </AboutNote>\n ) : null}\n\n {familyCurrent ? (\n <FamilyBadge\n current={familyCurrent}\n members={familyMembers}\n creator={\n creator\n ? { name: creator.name, role: creator.role, href: creator.href }\n : undefined\n }\n creatorLabel={creatorTitle}\n hubUrl={hubUrl}\n label={familyLabel}\n blurb={familyBlurb}\n ctaLabel={familyCtaLabel}\n currentLabel={familyCurrentLabel}\n theme={theme}\n />\n ) : null}\n\n {version || copyright ? (\n <AboutFooterLine version={version} copyright={copyright} />\n ) : null}\n\n {children}\n </div>\n )\n },\n)\n"]}
@@ -0,0 +1,3 @@
1
+
2
+ //# sourceMappingURL=chunk-7EG3AUTS.js.map
3
+ //# sourceMappingURL=chunk-7EG3AUTS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-7EG3AUTS.js"}
@@ -0,0 +1,3 @@
1
+
2
+ //# sourceMappingURL=chunk-A6RXCBJY.js.map
3
+ //# sourceMappingURL=chunk-A6RXCBJY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-A6RXCBJY.js"}
@@ -0,0 +1,3 @@
1
+
2
+ //# sourceMappingURL=chunk-CE7JZP67.js.map
3
+ //# sourceMappingURL=chunk-CE7JZP67.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-CE7JZP67.js"}
@@ -213,7 +213,7 @@ var TimeInput = ({
213
213
  onFocus();
214
214
  requestAnimationFrame(() => {
215
215
  const el = document.activeElement;
216
- if (el) el.select();
216
+ if (el && typeof el.select === "function") el.select();
217
217
  });
218
218
  },
219
219
  onBlur: () => {
@@ -459,5 +459,5 @@ var TimePicker = React.forwardRef(
459
459
  );
460
460
 
461
461
  export { TimePicker, TimePickerContent };
462
- //# sourceMappingURL=chunk-ERK53RFJ.js.map
463
- //# sourceMappingURL=chunk-ERK53RFJ.js.map
462
+ //# sourceMappingURL=chunk-CR42EAF4.js.map
463
+ //# sourceMappingURL=chunk-CR42EAF4.js.map