@neuronection/assistant-ui 0.8.1 → 0.10.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 (62) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/README.md +5 -2
  3. package/dist/Logo-D8DEBUoL.d.ts +11 -0
  4. package/dist/about.d.ts +154 -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/capability-chips.d.ts +19 -0
  10. package/dist/capability-chips.js +3 -0
  11. package/dist/capability-chips.js.map +1 -0
  12. package/dist/card.js +1 -1
  13. package/dist/chip-list.js +1 -1
  14. package/dist/chunk-7EG3AUTS.js +3 -0
  15. package/dist/chunk-7EG3AUTS.js.map +1 -0
  16. package/dist/chunk-7RTSSBBR.js +628 -0
  17. package/dist/chunk-7RTSSBBR.js.map +1 -0
  18. package/dist/chunk-A6RXCBJY.js +3 -0
  19. package/dist/chunk-A6RXCBJY.js.map +1 -0
  20. package/dist/chunk-CE7JZP67.js +3 -0
  21. package/dist/chunk-CE7JZP67.js.map +1 -0
  22. package/dist/{chunk-SKTLC2XY.js → chunk-F4DP4PIM.js} +2 -2
  23. package/dist/{chunk-SKTLC2XY.js.map → chunk-F4DP4PIM.js.map} +1 -1
  24. package/dist/chunk-HGJ5HINX.js +500 -0
  25. package/dist/chunk-HGJ5HINX.js.map +1 -0
  26. package/dist/{chunk-UWHUCQC6.js → chunk-LY2B3UJH.js} +10 -4
  27. package/dist/chunk-LY2B3UJH.js.map +1 -0
  28. package/dist/chunk-MLQAA2QV.js +68 -0
  29. package/dist/chunk-MLQAA2QV.js.map +1 -0
  30. package/dist/chunk-Q2JMEAKN.js +340 -0
  31. package/dist/chunk-Q2JMEAKN.js.map +1 -0
  32. package/dist/{chunk-BN3YHYYL.js → chunk-QUPGIPTT.js} +2 -2
  33. package/dist/{chunk-BN3YHYYL.js.map → chunk-QUPGIPTT.js.map} +1 -1
  34. package/dist/{chunk-OPTH3VUY.js → chunk-RI6CEWWF.js} +2 -2
  35. package/dist/chunk-RI6CEWWF.js.map +1 -0
  36. package/dist/{chunk-HSWSYEFQ.js → chunk-RYE5YCFF.js} +2 -2
  37. package/dist/{chunk-HSWSYEFQ.js.map → chunk-RYE5YCFF.js.map} +1 -1
  38. package/dist/chunk-VPLCX2A5.js +3 -0
  39. package/dist/chunk-VPLCX2A5.js.map +1 -0
  40. package/dist/chunk-XB7QWPHP.js +127 -0
  41. package/dist/chunk-XB7QWPHP.js.map +1 -0
  42. package/dist/connection-test-row.d.ts +4 -0
  43. package/dist/connection-test-row.js +1 -1
  44. package/dist/index.d.ts +7 -2
  45. package/dist/index.js +22 -18
  46. package/dist/index.js.map +1 -1
  47. package/dist/logo.d.ts +18 -0
  48. package/dist/logo.js +3 -0
  49. package/dist/logo.js.map +1 -0
  50. package/dist/model-picker.d.ts +2 -0
  51. package/dist/model-picker.js +1 -1
  52. package/dist/model-registry.d.ts +84 -0
  53. package/dist/model-registry.js +3 -0
  54. package/dist/model-registry.js.map +1 -0
  55. package/dist/styles.css +1 -1
  56. package/dist/task-assignment-picker.d.ts +20 -5
  57. package/dist/task-assignment-picker.js +1 -1
  58. package/package.json +19 -1
  59. package/dist/chunk-OPTH3VUY.js.map +0 -1
  60. package/dist/chunk-TN35RR2R.js +0 -92
  61. package/dist/chunk-TN35RR2R.js.map +0 -1
  62. package/dist/chunk-UWHUCQC6.js.map +0 -1
@@ -0,0 +1,628 @@
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, Heart, 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 rowBase = "group flex w-full items-center gap-3 rounded-[var(--as-radius)] p-3.5 text-left no-underline transition-[color,box-shadow,border-color] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--as-primary)]";
370
+ var SponsorCard = React2.forwardRef(
371
+ function SponsorCard2({
372
+ channels,
373
+ title = "Support this project",
374
+ description = "This project is free and open source. Contributions directly fund servers, maintenance and new development.",
375
+ footnote = "Every contribution keeps the project independent and free.",
376
+ channelsLabel = "Ways to support",
377
+ icon,
378
+ heading: Heading = "h2",
379
+ className,
380
+ children,
381
+ ...props
382
+ }, ref) {
383
+ if (channels.length === 0) return null;
384
+ return /* @__PURE__ */ jsxs(
385
+ "section",
386
+ {
387
+ ref,
388
+ "data-as": "sponsor-card",
389
+ className: cn(
390
+ "relative flex flex-col gap-4 overflow-hidden rounded-[var(--as-radius-lg)] border border-[var(--as-border)] bg-[var(--as-surface)] p-6 shadow-[var(--as-shadow-1)]",
391
+ className
392
+ ),
393
+ ...props,
394
+ children: [
395
+ /* @__PURE__ */ jsx(
396
+ "div",
397
+ {
398
+ "aria-hidden": true,
399
+ className: "pointer-events-none absolute -right-12 -top-12 size-36 rounded-full bg-[var(--as-primary)] opacity-10 blur-2xl"
400
+ }
401
+ ),
402
+ /* @__PURE__ */ jsxs("div", { className: "relative flex items-start gap-3.5", children: [
403
+ /* @__PURE__ */ jsx(
404
+ "span",
405
+ {
406
+ "aria-hidden": true,
407
+ className: "flex size-10 shrink-0 items-center justify-center rounded-[var(--as-radius)] bg-[color-mix(in_srgb,var(--as-danger)_12%,transparent)] text-[var(--as-danger)] [&_svg]:size-5",
408
+ children: icon ?? /* @__PURE__ */ jsx(Heart, {})
409
+ }
410
+ ),
411
+ /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-col gap-1.5 pt-0.5", children: [
412
+ /* @__PURE__ */ jsx(
413
+ Heading,
414
+ {
415
+ "data-as": "sponsor-title",
416
+ className: "text-base font-semibold leading-tight tracking-tight text-[var(--as-fg)]",
417
+ children: title
418
+ }
419
+ ),
420
+ description ? /* @__PURE__ */ jsx("p", { className: "text-sm leading-relaxed text-[var(--as-muted-fg)]", children: description }) : null
421
+ ] })
422
+ ] }),
423
+ /* @__PURE__ */ jsx(
424
+ "ul",
425
+ {
426
+ "data-as": "sponsor-channels",
427
+ "aria-label": channelsLabel,
428
+ className: "relative flex list-none flex-col gap-2",
429
+ children: channels.map((channel) => {
430
+ const Icon = channel.icon ?? Heart;
431
+ const external = channel.external !== false;
432
+ return /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsxs(
433
+ "a",
434
+ {
435
+ href: channel.href,
436
+ ...external ? { target: "_blank", rel: "noreferrer" } : {},
437
+ "data-as": "sponsor-channel",
438
+ "data-as-channel": channel.id,
439
+ "data-as-highlight": channel.highlight ? "true" : void 0,
440
+ className: cn(
441
+ rowBase,
442
+ channel.highlight ? "bg-[var(--as-primary)] text-[var(--as-primary-fg)] shadow-[var(--as-shadow-2)] hover:bg-[var(--as-accent-strong)] hover:shadow-[var(--as-shadow-3)]" : "border border-[var(--as-border)] bg-[var(--as-surface-raised)] hover:border-[var(--as-primary)] hover:shadow-[var(--as-shadow-2)]"
443
+ ),
444
+ children: [
445
+ /* @__PURE__ */ jsx(
446
+ "span",
447
+ {
448
+ "aria-hidden": true,
449
+ className: cn(
450
+ "flex size-9 shrink-0 items-center justify-center rounded-[var(--as-radius)] transition-transform group-hover:scale-105 [&_svg]:size-[18px]",
451
+ channel.highlight ? "bg-[color-mix(in_srgb,var(--as-primary-fg)_18%,transparent)]" : "bg-[var(--as-secondary)] text-[var(--as-secondary-fg)]"
452
+ ),
453
+ children: /* @__PURE__ */ jsx(Icon, { className: "size-[18px]" })
454
+ }
455
+ ),
456
+ /* @__PURE__ */ jsxs("span", { className: "min-w-0 flex-1", children: [
457
+ /* @__PURE__ */ jsx(
458
+ "span",
459
+ {
460
+ className: cn(
461
+ "block truncate text-sm font-semibold",
462
+ channel.highlight ? "text-[var(--as-primary-fg)]" : "text-[var(--as-fg)]"
463
+ ),
464
+ children: channel.name
465
+ }
466
+ ),
467
+ channel.description ? /* @__PURE__ */ jsx(
468
+ "span",
469
+ {
470
+ className: cn(
471
+ "block truncate text-xs",
472
+ channel.highlight ? "text-[color-mix(in_srgb,var(--as-primary-fg)_78%,transparent)]" : "text-[var(--as-muted-fg)]"
473
+ ),
474
+ children: channel.description
475
+ }
476
+ ) : null
477
+ ] }),
478
+ /* @__PURE__ */ jsx(
479
+ "span",
480
+ {
481
+ "aria-hidden": true,
482
+ className: cn(
483
+ "flex size-7 shrink-0 items-center justify-center rounded-full transition-all group-hover:scale-110",
484
+ channel.highlight ? "bg-[color-mix(in_srgb,var(--as-primary-fg)_20%,transparent)] group-hover:bg-[color-mix(in_srgb,var(--as-primary-fg)_32%,transparent)]" : "text-[var(--as-muted-fg)] group-hover:text-[var(--as-primary)]"
485
+ ),
486
+ children: /* @__PURE__ */ jsx(ArrowUpRight, { className: "size-4" })
487
+ }
488
+ )
489
+ ]
490
+ }
491
+ ) }, channel.id);
492
+ })
493
+ }
494
+ ),
495
+ footnote ? /* @__PURE__ */ jsxs("p", { className: "relative flex items-center gap-2 border-t border-[var(--as-border)] pt-4 text-xs leading-relaxed text-[var(--as-muted-fg)]", children: [
496
+ /* @__PURE__ */ jsx(
497
+ Heart,
498
+ {
499
+ "aria-hidden": true,
500
+ className: "size-3.5 shrink-0 fill-[var(--as-danger)] text-[var(--as-danger)]"
501
+ }
502
+ ),
503
+ footnote
504
+ ] }) : null,
505
+ children
506
+ ]
507
+ }
508
+ );
509
+ }
510
+ );
511
+ var marks2 = {
512
+ health: HealthMark,
513
+ career: CareerMark,
514
+ study: StudyMark
515
+ };
516
+ var AboutPanel = React2.forwardRef(
517
+ function AboutPanel2({
518
+ appName,
519
+ familyCurrent,
520
+ logo,
521
+ tagline,
522
+ description,
523
+ version,
524
+ license,
525
+ licenseTitle = "License & open source",
526
+ licenseLinkLabel = "Read license",
527
+ links,
528
+ linksTitle = "Links",
529
+ creator,
530
+ creatorTitle = "Created by",
531
+ tech,
532
+ techTitle = "Built with",
533
+ note,
534
+ sponsor,
535
+ familyMembers,
536
+ hubUrl,
537
+ familyLabel,
538
+ familyBlurb,
539
+ familyCtaLabel,
540
+ familyCurrentLabel,
541
+ theme = "light",
542
+ copyright,
543
+ className,
544
+ children,
545
+ ...props
546
+ }, ref) {
547
+ const DefaultMark = familyCurrent ? marks2[familyCurrent] : null;
548
+ return /* @__PURE__ */ jsxs(
549
+ "div",
550
+ {
551
+ ref,
552
+ "data-as": "about-panel",
553
+ className: cn("flex w-full flex-col gap-6", className),
554
+ ...props,
555
+ children: [
556
+ /* @__PURE__ */ jsxs("section", { className: "flex items-start gap-5", children: [
557
+ logo ?? (DefaultMark ? /* @__PURE__ */ jsx(DefaultMark, { size: 72, theme }) : null),
558
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1.5 pt-1", children: [
559
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-2.5", children: [
560
+ /* @__PURE__ */ jsx("h1", { className: "text-2xl font-bold tracking-tight text-[var(--as-fg)]", children: appName }),
561
+ version ? /* @__PURE__ */ jsxs(Badge, { variant: "outline", "data-as": "about-version", children: [
562
+ "v",
563
+ version
564
+ ] }) : null
565
+ ] }),
566
+ tagline ? /* @__PURE__ */ jsx("p", { className: "text-sm font-medium text-[var(--as-muted-fg)]", children: tagline }) : null,
567
+ description ? /* @__PURE__ */ jsx("p", { className: "max-w-2xl text-sm leading-relaxed text-[var(--as-muted-fg)]", children: description }) : null
568
+ ] })
569
+ ] }),
570
+ creator || license || links?.length ? /* @__PURE__ */ jsxs("section", { className: "grid grid-cols-1 gap-4 md:grid-cols-2", children: [
571
+ creator && !familyCurrent ? /* @__PURE__ */ jsxs(AboutCard, { title: creatorTitle, children: [
572
+ /* @__PURE__ */ jsx("p", { className: "font-semibold text-[var(--as-fg)]", children: creator.name }),
573
+ creator.role ? /* @__PURE__ */ jsx("p", { className: "mb-3 text-sm text-[var(--as-muted-fg)]", children: creator.role }) : null,
574
+ creator.links?.length ? /* @__PURE__ */ jsx(AboutLinkList, { links: creator.links }) : null
575
+ ] }) : null,
576
+ 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: [
577
+ /* @__PURE__ */ jsx("span", { className: "font-semibold text-[var(--as-fg)]", children: license.name }),
578
+ license.href ? /* @__PURE__ */ jsx(
579
+ "a",
580
+ {
581
+ href: license.href,
582
+ target: "_blank",
583
+ rel: "noreferrer",
584
+ 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)]",
585
+ children: licenseLinkLabel
586
+ }
587
+ ) : null
588
+ ] }) }) : null,
589
+ links?.length ? /* @__PURE__ */ jsx(AboutCard, { title: linksTitle, children: /* @__PURE__ */ jsx(AboutLinkList, { links }) }) : null
590
+ ] }) : null,
591
+ sponsor ? /* @__PURE__ */ jsx(
592
+ SponsorCard,
593
+ {
594
+ channels: sponsor.channels,
595
+ title: sponsor.title,
596
+ description: sponsor.description,
597
+ footnote: sponsor.footnote,
598
+ channelsLabel: sponsor.channelsLabel
599
+ }
600
+ ) : null,
601
+ tech?.length ? /* @__PURE__ */ jsx(AboutCard, { title: techTitle, children: /* @__PURE__ */ jsx(TechChips, { items: tech }) }) : null,
602
+ note ? /* @__PURE__ */ jsx(AboutNote, { tone: note.tone, title: note.title, children: note.children }) : null,
603
+ familyCurrent ? /* @__PURE__ */ jsx(
604
+ FamilyBadge,
605
+ {
606
+ current: familyCurrent,
607
+ members: familyMembers,
608
+ creator: creator ? { name: creator.name, role: creator.role, href: creator.href } : void 0,
609
+ creatorLabel: creatorTitle,
610
+ hubUrl,
611
+ label: familyLabel,
612
+ blurb: familyBlurb,
613
+ ctaLabel: familyCtaLabel,
614
+ currentLabel: familyCurrentLabel,
615
+ theme
616
+ }
617
+ ) : null,
618
+ version || copyright ? /* @__PURE__ */ jsx(AboutFooterLine, { version, copyright }) : null,
619
+ children
620
+ ]
621
+ }
622
+ );
623
+ }
624
+ );
625
+
626
+ export { AboutCard, AboutFooterLine, AboutLinkList, AboutNote, AboutPanel, FamilyBadge, SponsorCard, TechChips };
627
+ //# sourceMappingURL=chunk-7RTSSBBR.js.map
628
+ //# sourceMappingURL=chunk-7RTSSBBR.js.map