@neuronection/assistant-ui 0.9.0 → 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 (38) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/README.md +3 -2
  3. package/dist/about.d.ts +31 -1
  4. package/dist/about.js +1 -1
  5. package/dist/capability-chips.d.ts +19 -0
  6. package/dist/capability-chips.js +3 -0
  7. package/dist/capability-chips.js.map +1 -0
  8. package/dist/{chunk-3QGVWTBU.js → chunk-7RTSSBBR.js} +157 -4
  9. package/dist/chunk-7RTSSBBR.js.map +1 -0
  10. package/dist/chunk-HGJ5HINX.js +500 -0
  11. package/dist/chunk-HGJ5HINX.js.map +1 -0
  12. package/dist/{chunk-UWHUCQC6.js → chunk-LY2B3UJH.js} +10 -4
  13. package/dist/chunk-LY2B3UJH.js.map +1 -0
  14. package/dist/chunk-MLQAA2QV.js +68 -0
  15. package/dist/chunk-MLQAA2QV.js.map +1 -0
  16. package/dist/{chunk-OPTH3VUY.js → chunk-RI6CEWWF.js} +2 -2
  17. package/dist/chunk-RI6CEWWF.js.map +1 -0
  18. package/dist/chunk-XB7QWPHP.js +127 -0
  19. package/dist/chunk-XB7QWPHP.js.map +1 -0
  20. package/dist/connection-test-row.d.ts +4 -0
  21. package/dist/connection-test-row.js +1 -1
  22. package/dist/index.d.ts +4 -2
  23. package/dist/index.js +8 -6
  24. package/dist/index.js.map +1 -1
  25. package/dist/model-picker.d.ts +2 -0
  26. package/dist/model-picker.js +1 -1
  27. package/dist/model-registry.d.ts +84 -0
  28. package/dist/model-registry.js +3 -0
  29. package/dist/model-registry.js.map +1 -0
  30. package/dist/styles.css +1 -1
  31. package/dist/task-assignment-picker.d.ts +20 -5
  32. package/dist/task-assignment-picker.js +1 -1
  33. package/package.json +9 -1
  34. package/dist/chunk-3QGVWTBU.js.map +0 -1
  35. package/dist/chunk-OPTH3VUY.js.map +0 -1
  36. package/dist/chunk-TN35RR2R.js +0 -92
  37. package/dist/chunk-TN35RR2R.js.map +0 -1
  38. package/dist/chunk-UWHUCQC6.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # @neuronection/assistant-ui
2
2
 
3
+ ## 0.10.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [`e6a78cf`](https://github.com/neuronection/assistant-ui/commit/e6a78cfda0ccd3f8b4014e8d40f726803ae3c0e2) Thanks [@constLiakos](https://github.com/constLiakos)! - Add the `model-registry` module and the AI-settings patterns it composes. `ModelRegistry` renders provider cards with registered model rows and the remote model catalog behind a two-stage add: quick-add with the app-provided cap guess, or an expandable draft panel where label, capabilities, and reasoning effort are editable before confirming — the same panel doubles as the inline editor, so apps can retire their separate edit dialogs. Adds `CapabilityChips` (controlled cap toggle group / badge display with `minSelected`), a `variant="inline"` + `meta` option on `ConnectionTestRow` for embedding in app provider cards, and v2 additions to `TaskAssignmentPicker`: `requires`-based capability filtering of the row catalog, `sections` grouping, per-task fallback (secondary) model assignment, and a `renderMeta` slot. `ModelPickerModel` gains an optional `capabilities: string[]`. All additions are backward compatible; flat `TaskAssignmentPicker` usage is unchanged.
8
+
9
+ - [`44d22a7`](https://github.com/neuronection/assistant-ui/commit/44d22a7d3c346d56e4a9c75ffb96c33f0d8ecc20) Thanks [@constLiakos](https://github.com/constLiakos)! - Add `SponsorCard` to the about module and a `sponsor` prop on `AboutPanel`. Channels are data-driven (`SponsorChannel[]`), so apps can start with Buy Me a Coffee (`https://buymeacoffee.com/neuronection`) and add future funding methods without API changes. Highlighted channels render as primary CTAs; per-channel `data-as-channel="<id>"` hooks allow app-side brand theming.
10
+
3
11
  ## 0.9.0
4
12
 
5
13
  ### Minor Changes
package/README.md CHANGED
@@ -84,8 +84,9 @@ files in the package's `dist/`. Visual reference:
84
84
  | `error-banner` / `undo-notice` / `empty-state` / `spinner` | presentational feedback: alert banner with `action` slot · undo toast · `EmptyState` · `Spinner` |
85
85
  | `info-button` / `field-label` / `copy-button` / `breadcrumbs` | `InfoButton` · `FieldLabel` · `CopyButton` (clipboard + copied state) · `Breadcrumbs` (SPA links via `linkComponent`) |
86
86
  | `ai-button` / `ai-actions-dropdown` / `ai-magic-fill` | AI affordances: ask-with-suggestions (controlled open, icon-only mode) · action menu + custom prompt · describe-in-words fill modal — API calls stay app-side |
87
- | `settings-shell` / `provider-form` / `connection-test-row` | `SettingsShell` (controlled two-pane nav) · `ProviderForm` (write-only API-key field) · `ConnectionTestRow` (idle/testing/ok/fail + latency) |
88
- | `model-picker` / `task-assignment-picker` | `ModelPicker` (grouped provider→model combobox, capability chips) · `TaskAssignmentPicker` (task → model mapping rows) |
87
+ | `settings-shell` / `provider-form` / `connection-test-row` | `SettingsShell` (controlled two-pane nav) · `ProviderForm` (write-only API-key field) · `ConnectionTestRow` (idle/testing/ok/fail + latency, `inline` variant + meta slot) |
88
+ | `model-picker` / `task-assignment-picker` / `capability-chips` | `ModelPicker` (grouped provider→model combobox, capability chips) · `TaskAssignmentPicker` (task → model mapping rows, capability-filtered, sections + fallback assignment, meta slot) · `CapabilityChips` (cap toggle group / badges, min-selected) |
89
+ | `model-registry` | `ModelRegistry` (provider cards → registered model rows + remote catalog with two-stage add: quick-add or expandable draft panel with editable label/caps/reasoning-effort; cap filter + search + add-all; add/edit are one panel) |
89
90
  | `upload-dropzone` / `file-card` / `file-queue` | file attachment surface: dropzone (block/row) · card (status, include toggle) · queue (summary + reorder) |
90
91
  | `marquee` | `useMarquee`, `MarqueeSurface`, `MarqueeBand` (rubber-band selection) |
91
92
  | `portal` / `theme-scope` / `tokens` | `Portal` · `ThemeScope` · token name lists + types |
package/dist/about.d.ts CHANGED
@@ -78,6 +78,28 @@ interface TechChipsProps extends React.ComponentProps<'div'> {
78
78
  }
79
79
  declare const TechChips: React.ForwardRefExoticComponent<Omit<TechChipsProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
80
80
 
81
+ interface SponsorChannel {
82
+ id: string;
83
+ name: React.ReactNode;
84
+ href: string;
85
+ description?: React.ReactNode;
86
+ icon?: React.ComponentType<{
87
+ className?: string;
88
+ }>;
89
+ external?: boolean;
90
+ highlight?: boolean;
91
+ }
92
+ interface SponsorCardProps extends Omit<React.ComponentProps<'section'>, 'title'> {
93
+ channels: ReadonlyArray<SponsorChannel>;
94
+ title?: React.ReactNode;
95
+ description?: React.ReactNode;
96
+ footnote?: React.ReactNode;
97
+ channelsLabel?: string;
98
+ icon?: React.ReactNode;
99
+ heading?: 'h2' | 'h3' | 'h4';
100
+ }
101
+ declare const SponsorCard: React.ForwardRefExoticComponent<Omit<SponsorCardProps, "ref"> & React.RefAttributes<HTMLElement>>;
102
+
81
103
  interface AboutCreator {
82
104
  name: React.ReactNode;
83
105
  role?: React.ReactNode;
@@ -93,6 +115,13 @@ interface AboutNoteContent {
93
115
  title?: React.ReactNode;
94
116
  children: React.ReactNode;
95
117
  }
118
+ interface AboutSponsorContent {
119
+ channels: ReadonlyArray<SponsorChannel>;
120
+ title?: React.ReactNode;
121
+ description?: React.ReactNode;
122
+ footnote?: React.ReactNode;
123
+ channelsLabel?: string;
124
+ }
96
125
  interface AboutPanelProps extends React.ComponentProps<'div'> {
97
126
  appName: string;
98
127
  familyCurrent?: FamilyApp;
@@ -110,6 +139,7 @@ interface AboutPanelProps extends React.ComponentProps<'div'> {
110
139
  tech?: ReadonlyArray<string>;
111
140
  techTitle?: string;
112
141
  note?: AboutNoteContent;
142
+ sponsor?: AboutSponsorContent;
113
143
  familyMembers?: ReadonlyArray<FamilyMember>;
114
144
  hubUrl?: string;
115
145
  familyLabel?: string;
@@ -121,4 +151,4 @@ interface AboutPanelProps extends React.ComponentProps<'div'> {
121
151
  }
122
152
  declare const AboutPanel: React.ForwardRefExoticComponent<Omit<AboutPanelProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
123
153
 
124
- export { AboutCard, type AboutCardProps, type AboutCreator, AboutFooterLine, type AboutFooterLineProps, type AboutLicense, type AboutLinkItem, AboutLinkList, type AboutLinkListProps, AboutNote, type AboutNoteContent, type AboutNoteProps, AboutPanel, type AboutPanelProps, type FamilyApp, FamilyBadge, type FamilyBadgeProps, type FamilyCreator, type FamilyMember, TechChips, type TechChipsProps };
154
+ export { AboutCard, type AboutCardProps, type AboutCreator, AboutFooterLine, type AboutFooterLineProps, type AboutLicense, type AboutLinkItem, AboutLinkList, type AboutLinkListProps, AboutNote, type AboutNoteContent, type AboutNoteProps, AboutPanel, type AboutPanelProps, type AboutSponsorContent, type FamilyApp, FamilyBadge, type FamilyBadgeProps, type FamilyCreator, type FamilyMember, SponsorCard, type SponsorCardProps, type SponsorChannel, TechChips, type TechChipsProps };
package/dist/about.js CHANGED
@@ -1,3 +1,3 @@
1
- export { AboutCard, AboutFooterLine, AboutLinkList, AboutNote, AboutPanel, FamilyBadge, TechChips } from './chunk-3QGVWTBU.js';
1
+ export { AboutCard, AboutFooterLine, AboutLinkList, AboutNote, AboutPanel, FamilyBadge, SponsorCard, TechChips } from './chunk-7RTSSBBR.js';
2
2
  //# sourceMappingURL=about.js.map
3
3
  //# sourceMappingURL=about.js.map
@@ -0,0 +1,19 @@
1
+ import * as React from 'react';
2
+
3
+ interface CapabilityDescriptor {
4
+ value: string;
5
+ label: string;
6
+ }
7
+ interface CapabilityChipsProps {
8
+ caps: CapabilityDescriptor[];
9
+ selected: string[];
10
+ onToggle?: (value: string) => void;
11
+ variant?: 'toggle' | 'badge';
12
+ minSelected?: number;
13
+ disabled?: boolean;
14
+ ariaLabel?: string;
15
+ className?: string;
16
+ }
17
+ declare const CapabilityChips: React.ForwardRefExoticComponent<CapabilityChipsProps & React.RefAttributes<HTMLDivElement>>;
18
+
19
+ export { CapabilityChips, type CapabilityChipsProps, type CapabilityDescriptor };
@@ -0,0 +1,3 @@
1
+ export { CapabilityChips } from './chunk-MLQAA2QV.js';
2
+ //# sourceMappingURL=capability-chips.js.map
3
+ //# sourceMappingURL=capability-chips.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"capability-chips.js"}
@@ -5,7 +5,7 @@ import { Badge } from './chunk-F4DP4PIM.js';
5
5
  import { cn } from './chunk-BLJWR4ZV.js';
6
6
  import * as React2 from 'react';
7
7
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
8
- import { Link2, ArrowUpRight, Globe, Check, Copy } from 'lucide-react';
8
+ import { Link2, ArrowUpRight, Globe, Heart, Check, Copy } from 'lucide-react';
9
9
  import { cva } from 'class-variance-authority';
10
10
 
11
11
  var AboutCard = React2.forwardRef(
@@ -366,6 +366,148 @@ var TechChips = React2.forwardRef(
366
366
  return /* @__PURE__ */ jsx("div", { ref, "data-as": "tech-chips", className: cn(className), ...props, children: /* @__PURE__ */ jsx(ChipList, { items: cleaned, variant: "neutral" }) });
367
367
  }
368
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
+ );
369
511
  var marks2 = {
370
512
  health: HealthMark,
371
513
  career: CareerMark,
@@ -389,6 +531,7 @@ var AboutPanel = React2.forwardRef(
389
531
  tech,
390
532
  techTitle = "Built with",
391
533
  note,
534
+ sponsor,
392
535
  familyMembers,
393
536
  hubUrl,
394
537
  familyLabel,
@@ -445,6 +588,16 @@ var AboutPanel = React2.forwardRef(
445
588
  ] }) }) : null,
446
589
  links?.length ? /* @__PURE__ */ jsx(AboutCard, { title: linksTitle, children: /* @__PURE__ */ jsx(AboutLinkList, { links }) }) : null
447
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,
448
601
  tech?.length ? /* @__PURE__ */ jsx(AboutCard, { title: techTitle, children: /* @__PURE__ */ jsx(TechChips, { items: tech }) }) : null,
449
602
  note ? /* @__PURE__ */ jsx(AboutNote, { tone: note.tone, title: note.title, children: note.children }) : null,
450
603
  familyCurrent ? /* @__PURE__ */ jsx(
@@ -470,6 +623,6 @@ var AboutPanel = React2.forwardRef(
470
623
  }
471
624
  );
472
625
 
473
- export { AboutCard, AboutFooterLine, AboutLinkList, AboutNote, AboutPanel, FamilyBadge, TechChips };
474
- //# sourceMappingURL=chunk-3QGVWTBU.js.map
475
- //# sourceMappingURL=chunk-3QGVWTBU.js.map
626
+ export { AboutCard, AboutFooterLine, AboutLinkList, AboutNote, AboutPanel, FamilyBadge, SponsorCard, TechChips };
627
+ //# sourceMappingURL=chunk-7RTSSBBR.js.map
628
+ //# sourceMappingURL=chunk-7RTSSBBR.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/SponsorCard.tsx","../src/components/about/AboutPanel.tsx"],"names":["React","AboutCard","jsxs","jsx","AboutLinkList","React3","AboutNote","React4","AboutFooterLine","React5","FamilyBadge","ArrowUpRight","React6","TechChips","React7","SponsorCard","marks","React8","AboutPanel"],"mappings":"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","file":"chunk-7RTSSBBR.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 { ArrowUpRight, Heart } from 'lucide-react'\nimport { cn } from '../../lib/utils'\n\nexport interface SponsorChannel {\n id: string\n name: React.ReactNode\n href: string\n description?: React.ReactNode\n icon?: React.ComponentType<{ className?: string }>\n external?: boolean\n highlight?: boolean\n}\n\nexport interface SponsorCardProps\n extends Omit<React.ComponentProps<'section'>, 'title'> {\n channels: ReadonlyArray<SponsorChannel>\n title?: React.ReactNode\n description?: React.ReactNode\n footnote?: React.ReactNode\n channelsLabel?: string\n icon?: React.ReactNode\n heading?: 'h2' | 'h3' | 'h4'\n}\n\nconst rowBase =\n '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)]'\n\nexport const SponsorCard = React.forwardRef<HTMLElement, SponsorCardProps>(\n function SponsorCard(\n {\n channels,\n title = 'Support this project',\n description = 'This project is free and open source. Contributions directly fund servers, maintenance and new development.',\n footnote = 'Every contribution keeps the project independent and free.',\n channelsLabel = 'Ways to support',\n icon,\n heading: Heading = 'h2',\n className,\n children,\n ...props\n },\n ref,\n ) {\n if (channels.length === 0) return null\n return (\n <section\n ref={ref}\n data-as=\"sponsor-card\"\n className={cn(\n '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)]',\n className,\n )}\n {...props}\n >\n <div\n aria-hidden\n className=\"pointer-events-none absolute -right-12 -top-12 size-36 rounded-full bg-[var(--as-primary)] opacity-10 blur-2xl\"\n />\n <div className=\"relative flex items-start gap-3.5\">\n <span\n aria-hidden\n 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\"\n >\n {icon ?? <Heart />}\n </span>\n <div className=\"flex min-w-0 flex-col gap-1.5 pt-0.5\">\n <Heading\n data-as=\"sponsor-title\"\n className=\"text-base font-semibold leading-tight tracking-tight text-[var(--as-fg)]\"\n >\n {title}\n </Heading>\n {description ? (\n <p className=\"text-sm leading-relaxed text-[var(--as-muted-fg)]\">\n {description}\n </p>\n ) : null}\n </div>\n </div>\n\n <ul\n data-as=\"sponsor-channels\"\n aria-label={channelsLabel}\n className=\"relative flex list-none flex-col gap-2\"\n >\n {channels.map((channel) => {\n const Icon = channel.icon ?? Heart\n const external = channel.external !== false\n return (\n <li key={channel.id}>\n <a\n href={channel.href}\n {...(external ? { target: '_blank', rel: 'noreferrer' } : {})}\n data-as=\"sponsor-channel\"\n data-as-channel={channel.id}\n data-as-highlight={channel.highlight ? 'true' : undefined}\n className={cn(\n rowBase,\n channel.highlight\n ? '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)]'\n : 'border border-[var(--as-border)] bg-[var(--as-surface-raised)] hover:border-[var(--as-primary)] hover:shadow-[var(--as-shadow-2)]',\n )}\n >\n <span\n aria-hidden\n className={cn(\n 'flex size-9 shrink-0 items-center justify-center rounded-[var(--as-radius)] transition-transform group-hover:scale-105 [&_svg]:size-[18px]',\n channel.highlight\n ? 'bg-[color-mix(in_srgb,var(--as-primary-fg)_18%,transparent)]'\n : 'bg-[var(--as-secondary)] text-[var(--as-secondary-fg)]',\n )}\n >\n <Icon className=\"size-[18px]\" />\n </span>\n <span className=\"min-w-0 flex-1\">\n <span\n className={cn(\n 'block truncate text-sm font-semibold',\n channel.highlight\n ? 'text-[var(--as-primary-fg)]'\n : 'text-[var(--as-fg)]',\n )}\n >\n {channel.name}\n </span>\n {channel.description ? (\n <span\n className={cn(\n 'block truncate text-xs',\n channel.highlight\n ? 'text-[color-mix(in_srgb,var(--as-primary-fg)_78%,transparent)]'\n : 'text-[var(--as-muted-fg)]',\n )}\n >\n {channel.description}\n </span>\n ) : null}\n </span>\n <span\n aria-hidden\n className={cn(\n 'flex size-7 shrink-0 items-center justify-center rounded-full transition-all group-hover:scale-110',\n channel.highlight\n ? 'bg-[color-mix(in_srgb,var(--as-primary-fg)_20%,transparent)] group-hover:bg-[color-mix(in_srgb,var(--as-primary-fg)_32%,transparent)]'\n : 'text-[var(--as-muted-fg)] group-hover:text-[var(--as-primary)]',\n )}\n >\n <ArrowUpRight className=\"size-4\" />\n </span>\n </a>\n </li>\n )\n })}\n </ul>\n\n {footnote ? (\n <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)]\">\n <Heart\n aria-hidden\n className=\"size-3.5 shrink-0 fill-[var(--as-danger)] text-[var(--as-danger)]\"\n />\n {footnote}\n </p>\n ) : null}\n {children}\n </section>\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 {\n SponsorCard,\n type SponsorChannel,\n} from './SponsorCard'\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 AboutSponsorContent {\n channels: ReadonlyArray<SponsorChannel>\n title?: React.ReactNode\n description?: React.ReactNode\n footnote?: React.ReactNode\n channelsLabel?: string\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 sponsor?: AboutSponsorContent\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 sponsor,\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 {sponsor ? (\n <SponsorCard\n channels={sponsor.channels}\n title={sponsor.title}\n description={sponsor.description}\n footnote={sponsor.footnote}\n channelsLabel={sponsor.channelsLabel}\n />\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"]}