@neuronection/assistant-ui 0.9.0 → 0.11.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.
- package/CHANGELOG.md +22 -0
- package/README.md +3 -2
- package/dist/about.d.ts +31 -1
- package/dist/about.js +1 -1
- package/dist/capability-chips.d.ts +21 -0
- package/dist/capability-chips.js +3 -0
- package/dist/capability-chips.js.map +1 -0
- package/dist/{chunk-3QGVWTBU.js → chunk-7RTSSBBR.js} +157 -4
- package/dist/chunk-7RTSSBBR.js.map +1 -0
- package/dist/{chunk-RJSN4TVT.js → chunk-A3A4J5M5.js} +4 -3
- package/dist/chunk-A3A4J5M5.js.map +1 -0
- package/dist/chunk-G3DWN2DJ.js +80 -0
- package/dist/chunk-G3DWN2DJ.js.map +1 -0
- package/dist/{chunk-UWHUCQC6.js → chunk-LY2B3UJH.js} +10 -4
- package/dist/chunk-LY2B3UJH.js.map +1 -0
- package/dist/chunk-M67KF4W2.js +130 -0
- package/dist/chunk-M67KF4W2.js.map +1 -0
- package/dist/chunk-N5V5LVZX.js +517 -0
- package/dist/chunk-N5V5LVZX.js.map +1 -0
- package/dist/{chunk-OPTH3VUY.js → chunk-RI6CEWWF.js} +2 -2
- package/dist/chunk-RI6CEWWF.js.map +1 -0
- package/dist/connection-test-row.d.ts +4 -0
- package/dist/connection-test-row.js +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.js +9 -7
- package/dist/index.js.map +1 -1
- package/dist/model-picker.d.ts +2 -0
- package/dist/model-picker.js +1 -1
- package/dist/model-registry.d.ts +86 -0
- package/dist/model-registry.js +3 -0
- package/dist/model-registry.js.map +1 -0
- package/dist/provider-form.d.ts +2 -0
- package/dist/provider-form.js +1 -1
- package/dist/styles.css +1 -1
- package/dist/task-assignment-picker.d.ts +25 -6
- package/dist/task-assignment-picker.js +1 -1
- package/package.json +9 -1
- package/dist/chunk-3QGVWTBU.js.map +0 -1
- package/dist/chunk-OPTH3VUY.js.map +0 -1
- package/dist/chunk-RJSN4TVT.js.map +0 -1
- package/dist/chunk-TN35RR2R.js +0 -92
- package/dist/chunk-TN35RR2R.js.map +0 -1
- package/dist/chunk-UWHUCQC6.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,27 @@
|
|
|
1
1
|
# @neuronection/assistant-ui
|
|
2
2
|
|
|
3
|
+
## 0.11.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- [`b69b713`](https://github.com/neuronection/assistant-ui/commit/b69b713f4a61887bf1ae1aee3c65f150f6e459e9) Thanks [@constLiakos](https://github.com/constLiakos)! - Model-registry family adopts the health-assistant settings design language, all on tokens: provider cards gain the chevron icon tile (primary-filled when expanded), tinted border + shadow on the open card, an entry fade, and an enabled/total count pill; `CapabilityDescriptor` gains `icon` and every chip/badge carries `data-as-cap` so apps can re-tint per capability; `TaskAssignmentTask` gains `icon` (leading tile). Behavior changes: the remote-catalog zone (search, capability filters, manual add, add-all, catalog rows) is collapsed behind a `browseLabel` trigger button (`aria-expanded`) instead of always visible, and the per-row enable checkbox is removed — apps filter the `models` prop themselves (disabled models re-enter via the catalog's normal add path). `enabledLabel` is gone; `tasks` is optional on `TaskAssignmentPicker`.
|
|
8
|
+
|
|
9
|
+
### Patch Changes
|
|
10
|
+
|
|
11
|
+
- [`4f9e9bb`](https://github.com/neuronection/assistant-ui/commit/4f9e9bb923ea09fb5f186312627b124779a0035f) Thanks [@constLiakos](https://github.com/constLiakos)! - `ModelRegistry` draft payloads always carry `reasoningEffort` (empty string when cleared) so apps can distinguish "unset" from "cleared" — previously clearing the field sent `undefined` and the stored value could never be removed.
|
|
12
|
+
|
|
13
|
+
- [`a93f657`](https://github.com/neuronection/assistant-ui/commit/a93f657ed7577bb347909e211c62a40a36fda87a) Thanks [@constLiakos](https://github.com/constLiakos)! - `ProviderForm` gains `hideBaseUrl` for provider types with a fixed endpoint (Google, Anthropic) — the base URL field is omitted instead of rendering an inert input.
|
|
14
|
+
|
|
15
|
+
- [`6d8c694`](https://github.com/neuronection/assistant-ui/commit/6d8c694ffdc5b1358d49cc2e596639fbab3818a2) Thanks [@constLiakos](https://github.com/constLiakos)! - `TaskAssignmentPicker` makes `tasks` optional — sections-only usage no longer needs an empty `tasks` array.
|
|
16
|
+
|
|
17
|
+
## 0.10.0
|
|
18
|
+
|
|
19
|
+
### Minor Changes
|
|
20
|
+
|
|
21
|
+
- [`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.
|
|
22
|
+
|
|
23
|
+
- [`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.
|
|
24
|
+
|
|
3
25
|
## 0.9.0
|
|
4
26
|
|
|
5
27
|
### 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-
|
|
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,21 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { LucideIcon } from 'lucide-react';
|
|
3
|
+
|
|
4
|
+
interface CapabilityDescriptor {
|
|
5
|
+
value: string;
|
|
6
|
+
label: string;
|
|
7
|
+
icon?: LucideIcon;
|
|
8
|
+
}
|
|
9
|
+
interface CapabilityChipsProps {
|
|
10
|
+
caps: CapabilityDescriptor[];
|
|
11
|
+
selected: string[];
|
|
12
|
+
onToggle?: (value: string) => void;
|
|
13
|
+
variant?: 'toggle' | 'badge';
|
|
14
|
+
minSelected?: number;
|
|
15
|
+
disabled?: boolean;
|
|
16
|
+
ariaLabel?: string;
|
|
17
|
+
className?: string;
|
|
18
|
+
}
|
|
19
|
+
declare const CapabilityChips: React.ForwardRefExoticComponent<CapabilityChipsProps & React.RefAttributes<HTMLDivElement>>;
|
|
20
|
+
|
|
21
|
+
export { CapabilityChips, type CapabilityChipsProps, type CapabilityDescriptor };
|
|
@@ -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-
|
|
475
|
-
//# sourceMappingURL=chunk-
|
|
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"]}
|
|
@@ -16,6 +16,7 @@ var ProviderForm = React.forwardRef(
|
|
|
16
16
|
baseUrlPlaceholder = "https://api.example.com/v1",
|
|
17
17
|
nameLabel = "Name",
|
|
18
18
|
baseUrlLabel = "API base URL",
|
|
19
|
+
hideBaseUrl = false,
|
|
19
20
|
apiKeyLabel = "API key",
|
|
20
21
|
apiKeyHelp,
|
|
21
22
|
hasStoredKey = false,
|
|
@@ -43,7 +44,7 @@ var ProviderForm = React.forwardRef(
|
|
|
43
44
|
placeholder: namePlaceholder
|
|
44
45
|
}
|
|
45
46
|
),
|
|
46
|
-
/* @__PURE__ */ jsx(
|
|
47
|
+
hideBaseUrl ? null : /* @__PURE__ */ jsx(
|
|
47
48
|
Input,
|
|
48
49
|
{
|
|
49
50
|
label: baseUrlLabel,
|
|
@@ -85,5 +86,5 @@ var ProviderForm = React.forwardRef(
|
|
|
85
86
|
);
|
|
86
87
|
|
|
87
88
|
export { ProviderForm };
|
|
88
|
-
//# sourceMappingURL=chunk-
|
|
89
|
-
//# sourceMappingURL=chunk-
|
|
89
|
+
//# sourceMappingURL=chunk-A3A4J5M5.js.map
|
|
90
|
+
//# sourceMappingURL=chunk-A3A4J5M5.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/provider-form/ProviderForm.tsx"],"names":["ProviderForm"],"mappings":";;;;;;AAkCO,IAAM,YAAA,GAAqB,KAAA,CAAA,UAAA;AAAA,EAChC,SAASA,aAAAA,CACP;AAAA,IACE,IAAA;AAAA,IACA,YAAA;AAAA,IACA,OAAA;AAAA,IACA,eAAA;AAAA,IACA,MAAA;AAAA,IACA,cAAA;AAAA,IACA,eAAA,GAAkB,eAAA;AAAA,IAClB,kBAAA,GAAqB,4BAAA;AAAA,IACrB,SAAA,GAAY,MAAA;AAAA,IACZ,YAAA,GAAe,cAAA;AAAA,IACf,WAAA,GAAc,KAAA;AAAA,IACd,WAAA,GAAc,SAAA;AAAA,IACd,UAAA;AAAA,IACA,YAAA,GAAe,KAAA;AAAA,IACf,cAAA,GAAiB,mCAAA;AAAA,IACjB,cAAA,GAAiB,WAAA;AAAA,IACjB,KAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA;AAAA,IACA,GAAG;AAAA,KAEL,GAAA,EACA;AACA,IAAA,uBACE,IAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAQ,eAAA;AAAA,QACR,SAAA,EAAW,EAAA,CAAG,4BAAA,EAA8B,SAAS,CAAA;AAAA,QACpD,GAAG,KAAA;AAAA,QAEJ,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAO,SAAA;AAAA,cACP,KAAA,EAAO,IAAA;AAAA,cACP,UAAU,CAAC,KAAA,KAAU,YAAA,CAAa,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,cACpD,WAAA,EAAa;AAAA;AAAA,WACf;AAAA,UACC,cAAc,IAAA,mBACb,GAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAO,YAAA;AAAA,cACP,KAAA,EAAO,OAAA;AAAA,cACP,UAAU,CAAC,KAAA,KAAU,eAAA,CAAgB,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,cACvD,WAAA,EAAa,kBAAA;AAAA,cACb,SAAA,EAAU;AAAA;AAAA,WACZ;AAAA,0BAEF,GAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,KAAA,EACE,+BACE,IAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,gBAAA,WAAA;AAAA,gBAAa,GAAA;AAAA,gCACd,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uCAAA,EAAwC,QAAA,EAAA;AAAA,kBAAA,GAAA;AAAA,kBACpD,cAAA;AAAA,kBAAe;AAAA,iBAAA,EACnB;AAAA,eAAA,EACF,CAAA,GAEA,WAAA;AAAA,cAGJ,IAAA,EAAK,UAAA;AAAA,cACL,KAAA,EAAO,MAAA;AAAA,cACP,UAAU,CAAC,KAAA,KAAU,cAAA,CAAe,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,cACtD,WAAA,EAAa,eAAe,oBAAA,GAAQ,cAAA;AAAA,cACpC,YAAA,EAAa,cAAA;AAAA,cACb,IAAA,EACE,UAAA,mBACE,IAAA,CAAC,MAAA,EAAA,EAAK,WAAU,gCAAA,EACd,QAAA,EAAA;AAAA,gCAAA,GAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,QAAA,EAAS,aAAA,EAAW,IAAA,EAAC,CAAA;AAAA,gBACxC;AAAA,eAAA,EACH,CAAA,GACE;AAAA;AAAA,WAER;AAAA,UACC,QAAA;AAAA,UACA,KAAA,uBACE,GAAA,EAAA,EAAE,IAAA,EAAK,SAAQ,SAAA,EAAU,6CAAA,EACvB,iBACH,CAAA,GACE;AAAA;AAAA;AAAA,KACN;AAAA,EAEJ;AACF","file":"chunk-A3A4J5M5.js","sourcesContent":["import * as React from 'react'\nimport { KeyRound } from 'lucide-react'\nimport { cn } from '../../lib/utils'\nimport { Input } from '../input/Input'\n\nexport interface ProviderFormProps extends React.ComponentProps<'div'> {\n name: string\n onNameChange: (value: string) => void\n baseUrl: string\n onBaseUrlChange: (value: string) => void\n apiKey: string\n onApiKeyChange: (value: string) => void\n namePlaceholder?: string\n baseUrlPlaceholder?: string\n nameLabel?: string\n baseUrlLabel?: string\n /** Hide the base URL field for provider types that have a fixed endpoint. */\n hideBaseUrl?: boolean\n apiKeyLabel?: string\n /** Hint under the key field; apps mention keyring storage here. */\n apiKeyHelp?: string\n /** The provider already stores a key (write-only field shows no value). */\n hasStoredKey?: boolean\n storedKeyLabel?: string\n keyPlaceholder?: string\n error?: string\n children?: React.ReactNode\n}\n\n/**\n * Standard provider credential fields: name, base URL and a **write-only**\n * masked API key (`onChange` only — the library never renders a stored key;\n * keyring/storage is the app's business, ADR-006).\n */\nexport const ProviderForm = React.forwardRef<HTMLDivElement, ProviderFormProps>(\n function ProviderForm(\n {\n name,\n onNameChange,\n baseUrl,\n onBaseUrlChange,\n apiKey,\n onApiKeyChange,\n namePlaceholder = 'Provider name',\n baseUrlPlaceholder = 'https://api.example.com/v1',\n nameLabel = 'Name',\n baseUrlLabel = 'API base URL',\n hideBaseUrl = false,\n apiKeyLabel = 'API key',\n apiKeyHelp,\n hasStoredKey = false,\n storedKeyLabel = 'Stored — leave empty to keep',\n keyPlaceholder = 'sk-…',\n error,\n children,\n className,\n ...props\n },\n ref,\n ) {\n return (\n <div\n ref={ref}\n data-as=\"provider-form\"\n className={cn('flex w-full flex-col gap-4', className)}\n {...props}\n >\n <Input\n label={nameLabel}\n value={name}\n onChange={(event) => onNameChange(event.target.value)}\n placeholder={namePlaceholder}\n />\n {hideBaseUrl ? null : (\n <Input\n label={baseUrlLabel}\n value={baseUrl}\n onChange={(event) => onBaseUrlChange(event.target.value)}\n placeholder={baseUrlPlaceholder}\n className=\"font-mono\"\n />\n )}\n <Input\n label={\n hasStoredKey ? (\n <>\n {apiKeyLabel}{' '}\n <span className=\"font-normal text-[var(--as-muted-fg)]\">\n ({storedKeyLabel})\n </span>\n </>\n ) : (\n apiKeyLabel\n )\n }\n type=\"password\"\n value={apiKey}\n onChange={(event) => onApiKeyChange(event.target.value)}\n placeholder={hasStoredKey ? '•••' : keyPlaceholder}\n autoComplete=\"new-password\"\n hint={\n apiKeyHelp ? (\n <span className=\"inline-flex items-center gap-1\">\n <KeyRound className=\"size-3\" aria-hidden />\n {apiKeyHelp}\n </span>\n ) : undefined\n }\n />\n {children}\n {error ? (\n <p role=\"alert\" className=\"text-sm font-medium text-[var(--as-danger)]\">\n {error}\n </p>\n ) : null}\n </div>\n )\n },\n)\n"]}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { cn } from './chunk-BLJWR4ZV.js';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import { Check } from 'lucide-react';
|
|
4
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
var CapabilityChips = React.forwardRef(
|
|
7
|
+
function CapabilityChips2({
|
|
8
|
+
caps,
|
|
9
|
+
selected,
|
|
10
|
+
onToggle,
|
|
11
|
+
variant = "toggle",
|
|
12
|
+
minSelected = 0,
|
|
13
|
+
disabled = false,
|
|
14
|
+
ariaLabel,
|
|
15
|
+
className
|
|
16
|
+
}, ref) {
|
|
17
|
+
const interactive = variant === "toggle" && Boolean(onToggle);
|
|
18
|
+
const locked = (value) => interactive && !disabled && selected.includes(value) && selected.length <= minSelected;
|
|
19
|
+
return /* @__PURE__ */ jsx(
|
|
20
|
+
"div",
|
|
21
|
+
{
|
|
22
|
+
ref,
|
|
23
|
+
"data-as": "capability-chips",
|
|
24
|
+
"data-variant": variant,
|
|
25
|
+
role: interactive ? "group" : void 0,
|
|
26
|
+
"aria-label": interactive ? ariaLabel : void 0,
|
|
27
|
+
className: cn("flex flex-wrap items-center gap-1.5", className),
|
|
28
|
+
children: caps.map((cap) => {
|
|
29
|
+
const on = selected.includes(cap.value);
|
|
30
|
+
const Icon = cap.icon;
|
|
31
|
+
if (!interactive) {
|
|
32
|
+
return /* @__PURE__ */ jsxs(
|
|
33
|
+
"span",
|
|
34
|
+
{
|
|
35
|
+
"data-as-cap": cap.value,
|
|
36
|
+
"data-active": on || void 0,
|
|
37
|
+
title: `${cap.label} capability`,
|
|
38
|
+
className: cn(
|
|
39
|
+
"inline-flex items-center gap-1 rounded-[var(--as-radius-sm)] px-1.5 py-0.5 text-[10px] font-semibold uppercase tracking-wide",
|
|
40
|
+
on ? "bg-[var(--as-primary)]/10 text-[var(--as-primary)]" : "bg-[var(--as-muted)] text-[var(--as-muted-fg)]"
|
|
41
|
+
),
|
|
42
|
+
children: [
|
|
43
|
+
Icon ? /* @__PURE__ */ jsx(Icon, { className: "size-2.5", "aria-hidden": true }) : null,
|
|
44
|
+
cap.label
|
|
45
|
+
]
|
|
46
|
+
},
|
|
47
|
+
cap.value
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
return /* @__PURE__ */ jsxs(
|
|
51
|
+
"button",
|
|
52
|
+
{
|
|
53
|
+
type: "button",
|
|
54
|
+
"data-as-cap": cap.value,
|
|
55
|
+
"aria-pressed": on,
|
|
56
|
+
disabled: disabled || locked(cap.value),
|
|
57
|
+
onClick: () => onToggle?.(cap.value),
|
|
58
|
+
className: cn(
|
|
59
|
+
"flex cursor-pointer items-center gap-1.5 rounded-[var(--as-radius)] border px-3 py-2 text-xs font-semibold uppercase tracking-wider transition-all",
|
|
60
|
+
"focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-[var(--as-focus-ring)]",
|
|
61
|
+
"disabled:pointer-events-none disabled:opacity-60",
|
|
62
|
+
on ? "border-[var(--as-primary)]/30 bg-[var(--as-primary)]/10 text-[var(--as-primary)] shadow-[var(--as-shadow-1)]" : "border-[var(--as-border)] bg-[var(--as-surface)] text-[var(--as-muted-fg)] hover:border-[var(--as-muted-fg)]/40"
|
|
63
|
+
),
|
|
64
|
+
children: [
|
|
65
|
+
Icon ? /* @__PURE__ */ jsx(Icon, { className: "size-3.5", "aria-hidden": true }) : null,
|
|
66
|
+
cap.label,
|
|
67
|
+
on ? /* @__PURE__ */ jsx(Check, { className: "size-3", "aria-hidden": true }) : null
|
|
68
|
+
]
|
|
69
|
+
},
|
|
70
|
+
cap.value
|
|
71
|
+
);
|
|
72
|
+
})
|
|
73
|
+
}
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
);
|
|
77
|
+
|
|
78
|
+
export { CapabilityChips };
|
|
79
|
+
//# sourceMappingURL=chunk-G3DWN2DJ.js.map
|
|
80
|
+
//# sourceMappingURL=chunk-G3DWN2DJ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/capability-chips/CapabilityChips.tsx"],"names":["CapabilityChips"],"mappings":";;;;;AAsBO,IAAM,eAAA,GAAwB,KAAA,CAAA,UAAA;AAAA,EACnC,SAASA,gBAAAA,CACP;AAAA,IACE,IAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA,GAAU,QAAA;AAAA,IACV,WAAA,GAAc,CAAA;AAAA,IACd,QAAA,GAAW,KAAA;AAAA,IACX,SAAA;AAAA,IACA;AAAA,KAEF,GAAA,EACA;AACA,IAAA,MAAM,WAAA,GAAc,OAAA,KAAY,QAAA,IAAY,OAAA,CAAQ,QAAQ,CAAA;AAC5D,IAAA,MAAM,MAAA,GAAS,CAAC,KAAA,KACd,WAAA,IAAe,CAAC,QAAA,IAAY,QAAA,CAAS,QAAA,CAAS,KAAK,CAAA,IAAK,QAAA,CAAS,MAAA,IAAU,WAAA;AAE7E,IAAA,uBACE,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAQ,kBAAA;AAAA,QACR,cAAA,EAAc,OAAA;AAAA,QACd,IAAA,EAAM,cAAc,OAAA,GAAU,MAAA;AAAA,QAC9B,YAAA,EAAY,cAAc,SAAA,GAAY,MAAA;AAAA,QACtC,SAAA,EAAW,EAAA,CAAG,qCAAA,EAAuC,SAAS,CAAA;AAAA,QAE7D,QAAA,EAAA,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ;AACjB,UAAA,MAAM,EAAA,GAAK,QAAA,CAAS,QAAA,CAAS,GAAA,CAAI,KAAK,CAAA;AACtC,UAAA,MAAM,OAAO,GAAA,CAAI,IAAA;AACjB,UAAA,IAAI,CAAC,WAAA,EAAa;AAChB,YAAA,uBACE,IAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBAEC,eAAa,GAAA,CAAI,KAAA;AAAA,gBACjB,eAAa,EAAA,IAAM,MAAA;AAAA,gBACnB,KAAA,EAAO,CAAA,EAAG,GAAA,CAAI,KAAK,CAAA,WAAA,CAAA;AAAA,gBACnB,SAAA,EAAW,EAAA;AAAA,kBACT,8HAAA;AAAA,kBACA,KACI,oDAAA,GACA;AAAA,iBACN;AAAA,gBAEC,QAAA,EAAA;AAAA,kBAAA,IAAA,uBAAQ,IAAA,EAAA,EAAK,SAAA,EAAU,UAAA,EAAW,aAAA,EAAW,MAAC,CAAA,GAAK,IAAA;AAAA,kBACnD,GAAA,CAAI;AAAA;AAAA,eAAA;AAAA,cAZA,GAAA,CAAI;AAAA,aAaX;AAAA,UAEJ;AACA,UAAA,uBACE,IAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cAEC,IAAA,EAAK,QAAA;AAAA,cACL,eAAa,GAAA,CAAI,KAAA;AAAA,cACjB,cAAA,EAAc,EAAA;AAAA,cACd,QAAA,EAAU,QAAA,IAAY,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA;AAAA,cACtC,OAAA,EAAS,MAAM,QAAA,GAAW,GAAA,CAAI,KAAK,CAAA;AAAA,cACnC,SAAA,EAAW,EAAA;AAAA,gBACT,oJAAA;AAAA,gBACA,qGAAA;AAAA,gBACA,kDAAA;AAAA,gBACA,KACI,8GAAA,GACA;AAAA,eACN;AAAA,cAEC,QAAA,EAAA;AAAA,gBAAA,IAAA,uBAAQ,IAAA,EAAA,EAAK,SAAA,EAAU,UAAA,EAAW,aAAA,EAAW,MAAC,CAAA,GAAK,IAAA;AAAA,gBACnD,GAAA,CAAI,KAAA;AAAA,gBACJ,qBAAK,GAAA,CAAC,KAAA,EAAA,EAAM,WAAU,QAAA,EAAS,aAAA,EAAW,MAAC,CAAA,GAAK;AAAA;AAAA,aAAA;AAAA,YAjB5C,GAAA,CAAI;AAAA,WAkBX;AAAA,QAEJ,CAAC;AAAA;AAAA,KACH;AAAA,EAEJ;AACF","file":"chunk-G3DWN2DJ.js","sourcesContent":["import * as React from 'react'\nimport { Check } from 'lucide-react'\nimport type { LucideIcon } from 'lucide-react'\nimport { cn } from '../../lib/utils'\n\nexport interface CapabilityDescriptor {\n value: string\n label: string\n icon?: LucideIcon\n}\n\nexport interface CapabilityChipsProps {\n caps: CapabilityDescriptor[]\n selected: string[]\n onToggle?: (value: string) => void\n variant?: 'toggle' | 'badge'\n minSelected?: number\n disabled?: boolean\n ariaLabel?: string\n className?: string\n}\n\nexport const CapabilityChips = React.forwardRef<HTMLDivElement, CapabilityChipsProps>(\n function CapabilityChips(\n {\n caps,\n selected,\n onToggle,\n variant = 'toggle',\n minSelected = 0,\n disabled = false,\n ariaLabel,\n className,\n },\n ref,\n ) {\n const interactive = variant === 'toggle' && Boolean(onToggle)\n const locked = (value: string) =>\n interactive && !disabled && selected.includes(value) && selected.length <= minSelected\n\n return (\n <div\n ref={ref}\n data-as=\"capability-chips\"\n data-variant={variant}\n role={interactive ? 'group' : undefined}\n aria-label={interactive ? ariaLabel : undefined}\n className={cn('flex flex-wrap items-center gap-1.5', className)}\n >\n {caps.map((cap) => {\n const on = selected.includes(cap.value)\n const Icon = cap.icon\n if (!interactive) {\n return (\n <span\n key={cap.value}\n data-as-cap={cap.value}\n data-active={on || undefined}\n title={`${cap.label} capability`}\n className={cn(\n 'inline-flex items-center gap-1 rounded-[var(--as-radius-sm)] px-1.5 py-0.5 text-[10px] font-semibold uppercase tracking-wide',\n on\n ? 'bg-[var(--as-primary)]/10 text-[var(--as-primary)]'\n : 'bg-[var(--as-muted)] text-[var(--as-muted-fg)]',\n )}\n >\n {Icon ? <Icon className=\"size-2.5\" aria-hidden /> : null}\n {cap.label}\n </span>\n )\n }\n return (\n <button\n key={cap.value}\n type=\"button\"\n data-as-cap={cap.value}\n aria-pressed={on}\n disabled={disabled || locked(cap.value)}\n onClick={() => onToggle?.(cap.value)}\n className={cn(\n 'flex cursor-pointer items-center gap-1.5 rounded-[var(--as-radius)] border px-3 py-2 text-xs font-semibold uppercase tracking-wider transition-all',\n 'focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-[var(--as-focus-ring)]',\n 'disabled:pointer-events-none disabled:opacity-60',\n on\n ? 'border-[var(--as-primary)]/30 bg-[var(--as-primary)]/10 text-[var(--as-primary)] shadow-[var(--as-shadow-1)]'\n : 'border-[var(--as-border)] bg-[var(--as-surface)] text-[var(--as-muted-fg)] hover:border-[var(--as-muted-fg)]/40',\n )}\n >\n {Icon ? <Icon className=\"size-3.5\" aria-hidden /> : null}\n {cap.label}\n {on ? <Check className=\"size-3\" aria-hidden /> : null}\n </button>\n )\n })}\n </div>\n )\n },\n)\n"]}
|