@neuronection/assistant-ui 0.49.0 → 0.50.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 +12 -0
- package/README.md +1 -0
- package/dist/admin-user-table.js +1 -1
- package/dist/ai-magic-fill.js +1 -1
- package/dist/{chunk-RXFQZMSF.js → chunk-3YIVKKT6.js} +3 -3
- package/dist/{chunk-RXFQZMSF.js.map → chunk-3YIVKKT6.js.map} +1 -1
- package/dist/{chunk-OIET4P2M.js → chunk-47CRUWHB.js} +4 -4
- package/dist/{chunk-OIET4P2M.js.map → chunk-47CRUWHB.js.map} +1 -1
- package/dist/{chunk-67FLOT4X.js → chunk-5U45TQJE.js} +3 -3
- package/dist/{chunk-67FLOT4X.js.map → chunk-5U45TQJE.js.map} +1 -1
- package/dist/{chunk-WY5TO6R4.js → chunk-6ANLDUGL.js} +3 -3
- package/dist/{chunk-WY5TO6R4.js.map → chunk-6ANLDUGL.js.map} +1 -1
- package/dist/{chunk-PTTJJEYJ.js → chunk-CCFVDJHU.js} +3 -3
- package/dist/{chunk-PTTJJEYJ.js.map → chunk-CCFVDJHU.js.map} +1 -1
- package/dist/{chunk-QUVVOG7K.js → chunk-MFM4W6ZO.js} +3 -3
- package/dist/{chunk-QUVVOG7K.js.map → chunk-MFM4W6ZO.js.map} +1 -1
- package/dist/chunk-SNHU4PV3.js +169 -0
- package/dist/chunk-SNHU4PV3.js.map +1 -0
- package/dist/{chunk-URLF67WR.js → chunk-SVRCZUNQ.js} +6 -2
- package/dist/chunk-SVRCZUNQ.js.map +1 -0
- package/dist/{chunk-BCKOBT7T.js → chunk-UMI4M4MF.js} +3 -3
- package/dist/{chunk-BCKOBT7T.js.map → chunk-UMI4M4MF.js.map} +1 -1
- package/dist/{chunk-YM4YN3YC.js → chunk-X6L5Z5LV.js} +3 -3
- package/dist/{chunk-YM4YN3YC.js.map → chunk-X6L5Z5LV.js.map} +1 -1
- package/dist/combobox.js +1 -1
- package/dist/index.d.ts +59 -1
- package/dist/index.js +25 -24
- package/dist/instance-mode-control.d.ts +62 -0
- package/dist/instance-mode-control.js +3 -0
- package/dist/instance-mode-control.js.map +1 -0
- package/dist/markdown-diff-view.js +1 -1
- package/dist/model-picker.js +1 -1
- package/dist/model-registry.js +1 -1
- package/dist/profile-switcher.js +1 -1
- package/dist/provider-form.js +1 -1
- package/dist/styles.css +1 -1
- package/dist/task-assignment-picker.js +1 -1
- package/package.json +5 -1
- package/dist/chunk-URLF67WR.js.map +0 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Input } from './chunk-GQDW6BBO.js';
|
|
2
|
-
import { Popover, PopoverTrigger, PopoverContent } from './chunk-VX3EQRSM.js';
|
|
3
2
|
import { Button } from './chunk-4WBBF5LH.js';
|
|
3
|
+
import { Popover, PopoverTrigger, PopoverContent } from './chunk-VX3EQRSM.js';
|
|
4
4
|
import { cn } from './chunk-RVVXVTH3.js';
|
|
5
5
|
import * as React from 'react';
|
|
6
6
|
import { UserRound, ChevronDown, Pencil, Star, Trash2, Plus, Check } from 'lucide-react';
|
|
@@ -411,5 +411,5 @@ var ProfileSwitcher = React.forwardRef(
|
|
|
411
411
|
);
|
|
412
412
|
|
|
413
413
|
export { ProfileSwitcher };
|
|
414
|
-
//# sourceMappingURL=chunk-
|
|
415
|
-
//# sourceMappingURL=chunk-
|
|
414
|
+
//# sourceMappingURL=chunk-6ANLDUGL.js.map
|
|
415
|
+
//# sourceMappingURL=chunk-6ANLDUGL.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/profile-switcher/ProfileSwitcher.tsx"],"names":["ProfileSwitcher"],"mappings":"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","file":"chunk-WY5TO6R4.js","sourcesContent":["import * as React from 'react'\nimport {\n Check,\n ChevronDown,\n Pencil,\n Plus,\n Star,\n Trash2,\n UserRound,\n type LucideIcon,\n} from 'lucide-react'\n\nimport { cn } from '../../lib/utils'\nimport { Button } from '../button/Button'\nimport { Input } from '../input/Input'\nimport { Popover, PopoverContent, PopoverTrigger } from '../popover/Popover'\n\nexport interface ProfileItem {\n id: string\n name: string\n is_default?: boolean\n color?: string | null\n}\n\nexport interface ProfileSwitcherLabels {\n trigger: string\n panelTitle: string\n currentBadge: string\n defaultBadge: string\n newProfile: string\n newProfilePlaceholder: string\n create: string\n rename: (name: string) => string\n renamePlaceholder: string\n renameSubmit: string\n setDefault: (name: string) => string\n delete: (name: string) => string\n cancel: string\n loading: string\n empty: string\n}\n\nexport interface ProfileSwitcherIcons {\n trigger?: LucideIcon\n create?: LucideIcon\n rename?: LucideIcon\n setDefault?: LucideIcon\n delete?: LucideIcon\n empty?: LucideIcon\n}\n\nexport interface ProfileSwitcherProps {\n profiles: ProfileItem[]\n currentId: string | null\n onSelect: (profile: ProfileItem) => void\n onCreate: (name: string) => void | Promise<unknown>\n onRename: (profile: ProfileItem, name: string) => void | Promise<unknown>\n onDelete: (profile: ProfileItem) => void | Promise<unknown>\n /** When given, rows expose a \"make Default\" action (identity-auth §12). */\n onSetDefault?: (profile: ProfileItem) => void | Promise<unknown>\n loading?: boolean\n error?: string | null\n align?: 'start' | 'end'\n labels?: Partial<ProfileSwitcherLabels>\n icons?: ProfileSwitcherIcons\n className?: string\n}\n\nconst defaultLabels: ProfileSwitcherLabels = {\n trigger: 'Switch profile',\n panelTitle: 'Profiles',\n currentBadge: 'Current',\n defaultBadge: 'Default',\n newProfile: 'New profile',\n newProfilePlaceholder: 'Profile name',\n create: 'Create',\n rename: (name) => `Rename ${name}`,\n renamePlaceholder: 'Profile name',\n renameSubmit: 'Save',\n setDefault: (name) => `Make ${name} the default profile`,\n delete: (name) => `Delete ${name}`,\n cancel: 'Cancel',\n loading: 'Loading profiles…',\n empty: 'No profiles yet',\n}\n\nfunction ProfileAvatar({\n profile,\n size = 'sm',\n}: {\n profile: ProfileItem\n size?: 'sm' | 'md'\n}) {\n const letter = (profile.name.trim()[0] ?? '?').toUpperCase()\n return (\n <span\n aria-hidden\n className={cn(\n 'flex shrink-0 items-center justify-center rounded-full font-semibold ring-1 ring-[var(--as-border)]',\n size === 'md' ? 'size-8 text-xs' : 'size-6 text-[10px]',\n )}\n style={\n profile.color\n ? { backgroundColor: `${profile.color}22`, color: profile.color }\n : {\n backgroundColor: 'var(--as-secondary)',\n color: 'var(--as-muted-fg)',\n }\n }\n >\n {profile.color ? (\n letter\n ) : (\n <UserRound className={size === 'md' ? 'size-4' : 'size-3.5'} />\n )}\n </span>\n )\n}\n\n/** Status pills on a row: accent \"Current\" when active, muted \"Default\". */\nfunction ProfileRowBadges({\n isCurrent,\n isDefault,\n currentBadge,\n defaultBadge,\n}: {\n isCurrent: boolean\n isDefault: boolean\n currentBadge: string\n defaultBadge: string\n}) {\n if (!isCurrent && !isDefault) return null\n return (\n <span className=\"flex shrink-0 items-center gap-1\">\n {isCurrent ? (\n <span\n className=\"inline-flex items-center gap-1 rounded-full px-1.5 py-0.5 text-[10px] font-medium\"\n style={{\n backgroundColor: 'color-mix(in srgb, var(--as-accent) 12%, transparent)',\n color: 'var(--as-accent)',\n }}\n >\n <Check aria-hidden className=\"size-3\" />\n {currentBadge}\n </span>\n ) : null}\n {isDefault ? (\n <span className=\"inline-flex items-center rounded-full bg-[var(--as-secondary)] px-1.5 py-0.5 text-[10px] font-medium text-[var(--as-muted-fg)]\">\n {defaultBadge}\n </span>\n ) : null}\n </span>\n )\n}\n\nexport const ProfileSwitcher = React.forwardRef<HTMLDivElement, ProfileSwitcherProps>(\n function ProfileSwitcher(\n {\n profiles,\n currentId,\n onSelect,\n onCreate,\n onRename,\n onDelete,\n onSetDefault,\n loading = false,\n error = null,\n align = 'start',\n labels,\n icons,\n className,\n },\n ref,\n ) {\n const merged = { ...defaultLabels, ...labels }\n const TriggerIcon = icons?.trigger ?? UserRound\n const CreateIcon = icons?.create ?? Plus\n const RenameIcon = icons?.rename ?? Pencil\n const SetDefaultIcon = icons?.setDefault ?? Star\n const DeleteIcon = icons?.delete ?? Trash2\n const EmptyIcon = icons?.empty ?? UserRound\n\n const [open, setOpen] = React.useState(false)\n const [draftName, setDraftName] = React.useState('')\n const [renamingId, setRenamingId] = React.useState<string | null>(null)\n const [renameDraft, setRenameDraft] = React.useState('')\n const renameInputRef = React.useRef<HTMLInputElement>(null)\n\n const current = profiles.find((profile) => profile.id === currentId) ?? profiles[0] ?? null\n\n const close = React.useCallback(() => {\n setOpen(false)\n setRenamingId(null)\n setDraftName('')\n }, [])\n\n React.useEffect(() => {\n if (renamingId !== null) {\n renameInputRef.current?.focus()\n renameInputRef.current?.select()\n }\n }, [renamingId])\n\n const startRename = (profile: ProfileItem) => {\n setRenamingId(profile.id)\n setRenameDraft(profile.name)\n }\n\n const submitRename = async (profile: ProfileItem) => {\n const name = renameDraft.trim()\n if (!name || name === profile.name) {\n setRenamingId(null)\n return\n }\n await onRename(profile, name)\n setRenamingId(null)\n }\n\n const submitCreate = async (event: React.FormEvent) => {\n event.preventDefault()\n const name = draftName.trim()\n if (!name) return\n await onCreate(name)\n setDraftName('')\n }\n\n // Roving arrows: ↓/↑ (and Home/End) walk the profile rows without\n // leaving the panel; Tab keeps the DOM order (select → actions).\n const onListKeyDown = (event: React.KeyboardEvent<HTMLUListElement>) => {\n const rows = Array.from(\n event.currentTarget.querySelectorAll<HTMLButtonElement>('[data-profile-row]'),\n )\n if (rows.length === 0) return\n const index = rows.indexOf(document.activeElement as HTMLButtonElement)\n let next = -1\n if (event.key === 'ArrowDown') next = index < 0 ? 0 : Math.min(index + 1, rows.length - 1)\n else if (event.key === 'ArrowUp')\n next = index < 0 ? rows.length - 1 : Math.max(index - 1, 0)\n else if (event.key === 'Home') next = 0\n else if (event.key === 'End') next = rows.length - 1\n if (next >= 0) {\n event.preventDefault()\n rows[next]?.focus()\n }\n }\n\n return (\n <div ref={ref} data-as=\"profile-switcher\" className={cn('inline-block', className)}>\n <Popover\n open={open}\n onOpenChange={(next) => {\n setOpen(next)\n if (!next) {\n setRenamingId(null)\n setDraftName('')\n }\n }}\n >\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n aria-haspopup=\"dialog\"\n aria-label={merged.trigger}\n data-testid=\"profile-trigger\"\n className=\"flex cursor-pointer items-center gap-2 rounded-full p-0.5 pr-2 transition-colors hover:bg-[var(--as-secondary)] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--as-focus-ring)]\"\n >\n {current ? (\n <ProfileAvatar profile={current} size=\"md\" />\n ) : (\n <span\n aria-hidden\n className=\"flex size-8 shrink-0 items-center justify-center rounded-full ring-1 ring-[var(--as-border)]\"\n >\n <TriggerIcon className=\"size-4 text-[var(--as-muted-fg)]\" />\n </span>\n )}\n <span className=\"max-w-32 truncate text-sm font-medium\">\n {current ? current.name : merged.empty}\n </span>\n <ChevronDown\n aria-hidden\n className=\"size-3.5 text-[var(--as-muted-fg)] transition-transform duration-150 [[data-state=open]>&]:rotate-180\"\n />\n </button>\n </PopoverTrigger>\n <PopoverContent\n align={align}\n role=\"dialog\"\n aria-label={merged.panelTitle}\n className=\"w-80 p-1.5 shadow-[var(--as-shadow-pop)] backdrop-blur-xl\"\n onEscapeKeyDown={(event) => {\n // Escape cancels an inline rename first, closes the panel\n // only on the second press.\n if (renamingId !== null) event.preventDefault()\n }}\n >\n <div className=\"flex items-center justify-between px-2 pb-1 pt-1\">\n <span className=\"text-[11px] font-semibold uppercase tracking-wide text-[var(--as-muted-fg)]\">\n {merged.panelTitle}\n </span>\n {profiles.length > 0 ? (\n <span className=\"text-[11px] tabular-nums text-[var(--as-muted-fg)]\">\n {profiles.length}\n </span>\n ) : null}\n </div>\n {loading ? (\n <p\n className=\"as-anim-fade px-2 py-3 text-sm text-[var(--as-muted-fg)]\"\n role=\"status\"\n >\n {merged.loading}\n </p>\n ) : profiles.length === 0 ? (\n <p className=\"flex items-center gap-2 px-2 py-3 text-sm text-[var(--as-muted-fg)]\">\n <EmptyIcon aria-hidden className=\"size-4\" />\n {merged.empty}\n </p>\n ) : (\n <ul\n className=\"max-h-72 space-y-0.5 overflow-y-auto\"\n onKeyDown={onListKeyDown}\n >\n {profiles.map((profile) => {\n const isCurrent = current !== null && profile.id === current.id\n return (\n <li\n key={profile.id}\n className=\"flex items-center gap-1 rounded-[var(--as-radius-sm)] px-0.5 py-0.5 hover:bg-[var(--as-secondary)]\"\n >\n {renamingId === profile.id ? (\n <form\n className=\"flex w-full items-center gap-1 py-0.5\"\n onSubmit={(event) => {\n event.preventDefault()\n void submitRename(profile)\n }}\n >\n <Input\n ref={renameInputRef}\n aria-label={merged.rename(profile.name)}\n placeholder={merged.renamePlaceholder}\n value={renameDraft}\n onChange={(event) => setRenameDraft(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n setRenamingId(null)\n }\n }}\n className=\"h-8 flex-1\"\n />\n <Button\n type=\"submit\"\n size=\"sm\"\n className=\"h-8\"\n disabled={!renameDraft.trim()}\n aria-label={merged.renameSubmit}\n >\n {merged.renameSubmit}\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n className=\"h-8\"\n aria-label={merged.cancel}\n onClick={() => setRenamingId(null)}\n >\n {merged.cancel}\n </Button>\n </form>\n ) : (\n <>\n <button\n type=\"button\"\n aria-current={isCurrent || undefined}\n data-profile-row\n data-testid={`profile-option-${profile.id}`}\n className=\"flex min-w-0 flex-1 cursor-pointer items-center gap-2.5 rounded-[var(--as-radius-sm)] px-1.5 py-1.5 text-left text-sm outline-none transition-colors hover:bg-[var(--as-secondary)] focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-[var(--as-focus-ring)] aria-current:bg-[color-mix(in_srgb,var(--as-accent)_8%,transparent)]\"\n onClick={() => {\n onSelect(profile)\n close()\n }}\n >\n <ProfileAvatar profile={profile} size=\"md\" />\n <span className=\"min-w-0 flex-1 truncate font-medium\">\n {profile.name}\n </span>\n <ProfileRowBadges\n isCurrent={isCurrent}\n isDefault={Boolean(profile.is_default)}\n currentBadge={merged.currentBadge}\n defaultBadge={merged.defaultBadge}\n />\n </button>\n <span className=\"flex shrink-0 items-center gap-0.5 pr-0.5\">\n <Button\n type=\"button\"\n size=\"icon\"\n variant=\"ghost\"\n className=\"size-7 rounded-[var(--as-radius-sm)]\"\n aria-label={merged.rename(profile.name)}\n title={merged.rename(profile.name)}\n onClick={() => startRename(profile)}\n >\n <RenameIcon aria-hidden />\n </Button>\n {onSetDefault && !profile.is_default ? (\n <Button\n type=\"button\"\n size=\"icon\"\n variant=\"ghost\"\n className=\"size-7 rounded-[var(--as-radius-sm)]\"\n aria-label={merged.setDefault(profile.name)}\n title={merged.setDefault(profile.name)}\n onClick={() => void onSetDefault(profile)}\n >\n <SetDefaultIcon aria-hidden />\n </Button>\n ) : null}\n <Button\n type=\"button\"\n size=\"icon\"\n variant=\"ghost\"\n className=\"size-7 rounded-[var(--as-radius-sm)] hover:text-[var(--as-danger)]\"\n aria-label={merged.delete(profile.name)}\n title={merged.delete(profile.name)}\n onClick={() => void onDelete(profile)}\n >\n <DeleteIcon aria-hidden />\n </Button>\n </span>\n </>\n )}\n </li>\n )\n })}\n </ul>\n )}\n {error ? (\n <p\n role=\"alert\"\n className=\"mx-1 mt-1 rounded-[var(--as-radius-sm)] bg-[color-mix(in_srgb,var(--as-danger)_10%,transparent)] px-2 py-1 text-xs text-[var(--as-danger)]\"\n >\n {error}\n </p>\n ) : null}\n <form\n className=\"mt-1 flex items-center gap-1.5 border-t border-[var(--as-border)] p-1.5 pt-2\"\n onSubmit={(event) => {\n void submitCreate(event)\n }}\n >\n <div className=\"relative min-w-0 flex-1\">\n <CreateIcon\n aria-hidden\n className=\"pointer-events-none absolute left-2.5 top-1/2 size-3.5 -translate-y-1/2 text-[var(--as-muted-fg)]\"\n />\n <Input\n aria-label={merged.newProfile}\n placeholder={merged.newProfilePlaceholder}\n value={draftName}\n onChange={(event) => setDraftName(event.target.value)}\n className=\"h-8 pl-8\"\n />\n </div>\n <Button\n type=\"submit\"\n size=\"sm\"\n className=\"h-8 gap-1 px-2.5\"\n disabled={!draftName.trim()}\n aria-label={merged.create}\n >\n <CreateIcon aria-hidden />\n {merged.create}\n </Button>\n </form>\n </PopoverContent>\n </Popover>\n </div>\n )\n },\n)\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/profile-switcher/ProfileSwitcher.tsx"],"names":["ProfileSwitcher"],"mappings":"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","file":"chunk-6ANLDUGL.js","sourcesContent":["import * as React from 'react'\nimport {\n Check,\n ChevronDown,\n Pencil,\n Plus,\n Star,\n Trash2,\n UserRound,\n type LucideIcon,\n} from 'lucide-react'\n\nimport { cn } from '../../lib/utils'\nimport { Button } from '../button/Button'\nimport { Input } from '../input/Input'\nimport { Popover, PopoverContent, PopoverTrigger } from '../popover/Popover'\n\nexport interface ProfileItem {\n id: string\n name: string\n is_default?: boolean\n color?: string | null\n}\n\nexport interface ProfileSwitcherLabels {\n trigger: string\n panelTitle: string\n currentBadge: string\n defaultBadge: string\n newProfile: string\n newProfilePlaceholder: string\n create: string\n rename: (name: string) => string\n renamePlaceholder: string\n renameSubmit: string\n setDefault: (name: string) => string\n delete: (name: string) => string\n cancel: string\n loading: string\n empty: string\n}\n\nexport interface ProfileSwitcherIcons {\n trigger?: LucideIcon\n create?: LucideIcon\n rename?: LucideIcon\n setDefault?: LucideIcon\n delete?: LucideIcon\n empty?: LucideIcon\n}\n\nexport interface ProfileSwitcherProps {\n profiles: ProfileItem[]\n currentId: string | null\n onSelect: (profile: ProfileItem) => void\n onCreate: (name: string) => void | Promise<unknown>\n onRename: (profile: ProfileItem, name: string) => void | Promise<unknown>\n onDelete: (profile: ProfileItem) => void | Promise<unknown>\n /** When given, rows expose a \"make Default\" action (identity-auth §12). */\n onSetDefault?: (profile: ProfileItem) => void | Promise<unknown>\n loading?: boolean\n error?: string | null\n align?: 'start' | 'end'\n labels?: Partial<ProfileSwitcherLabels>\n icons?: ProfileSwitcherIcons\n className?: string\n}\n\nconst defaultLabels: ProfileSwitcherLabels = {\n trigger: 'Switch profile',\n panelTitle: 'Profiles',\n currentBadge: 'Current',\n defaultBadge: 'Default',\n newProfile: 'New profile',\n newProfilePlaceholder: 'Profile name',\n create: 'Create',\n rename: (name) => `Rename ${name}`,\n renamePlaceholder: 'Profile name',\n renameSubmit: 'Save',\n setDefault: (name) => `Make ${name} the default profile`,\n delete: (name) => `Delete ${name}`,\n cancel: 'Cancel',\n loading: 'Loading profiles…',\n empty: 'No profiles yet',\n}\n\nfunction ProfileAvatar({\n profile,\n size = 'sm',\n}: {\n profile: ProfileItem\n size?: 'sm' | 'md'\n}) {\n const letter = (profile.name.trim()[0] ?? '?').toUpperCase()\n return (\n <span\n aria-hidden\n className={cn(\n 'flex shrink-0 items-center justify-center rounded-full font-semibold ring-1 ring-[var(--as-border)]',\n size === 'md' ? 'size-8 text-xs' : 'size-6 text-[10px]',\n )}\n style={\n profile.color\n ? { backgroundColor: `${profile.color}22`, color: profile.color }\n : {\n backgroundColor: 'var(--as-secondary)',\n color: 'var(--as-muted-fg)',\n }\n }\n >\n {profile.color ? (\n letter\n ) : (\n <UserRound className={size === 'md' ? 'size-4' : 'size-3.5'} />\n )}\n </span>\n )\n}\n\n/** Status pills on a row: accent \"Current\" when active, muted \"Default\". */\nfunction ProfileRowBadges({\n isCurrent,\n isDefault,\n currentBadge,\n defaultBadge,\n}: {\n isCurrent: boolean\n isDefault: boolean\n currentBadge: string\n defaultBadge: string\n}) {\n if (!isCurrent && !isDefault) return null\n return (\n <span className=\"flex shrink-0 items-center gap-1\">\n {isCurrent ? (\n <span\n className=\"inline-flex items-center gap-1 rounded-full px-1.5 py-0.5 text-[10px] font-medium\"\n style={{\n backgroundColor: 'color-mix(in srgb, var(--as-accent) 12%, transparent)',\n color: 'var(--as-accent)',\n }}\n >\n <Check aria-hidden className=\"size-3\" />\n {currentBadge}\n </span>\n ) : null}\n {isDefault ? (\n <span className=\"inline-flex items-center rounded-full bg-[var(--as-secondary)] px-1.5 py-0.5 text-[10px] font-medium text-[var(--as-muted-fg)]\">\n {defaultBadge}\n </span>\n ) : null}\n </span>\n )\n}\n\nexport const ProfileSwitcher = React.forwardRef<HTMLDivElement, ProfileSwitcherProps>(\n function ProfileSwitcher(\n {\n profiles,\n currentId,\n onSelect,\n onCreate,\n onRename,\n onDelete,\n onSetDefault,\n loading = false,\n error = null,\n align = 'start',\n labels,\n icons,\n className,\n },\n ref,\n ) {\n const merged = { ...defaultLabels, ...labels }\n const TriggerIcon = icons?.trigger ?? UserRound\n const CreateIcon = icons?.create ?? Plus\n const RenameIcon = icons?.rename ?? Pencil\n const SetDefaultIcon = icons?.setDefault ?? Star\n const DeleteIcon = icons?.delete ?? Trash2\n const EmptyIcon = icons?.empty ?? UserRound\n\n const [open, setOpen] = React.useState(false)\n const [draftName, setDraftName] = React.useState('')\n const [renamingId, setRenamingId] = React.useState<string | null>(null)\n const [renameDraft, setRenameDraft] = React.useState('')\n const renameInputRef = React.useRef<HTMLInputElement>(null)\n\n const current = profiles.find((profile) => profile.id === currentId) ?? profiles[0] ?? null\n\n const close = React.useCallback(() => {\n setOpen(false)\n setRenamingId(null)\n setDraftName('')\n }, [])\n\n React.useEffect(() => {\n if (renamingId !== null) {\n renameInputRef.current?.focus()\n renameInputRef.current?.select()\n }\n }, [renamingId])\n\n const startRename = (profile: ProfileItem) => {\n setRenamingId(profile.id)\n setRenameDraft(profile.name)\n }\n\n const submitRename = async (profile: ProfileItem) => {\n const name = renameDraft.trim()\n if (!name || name === profile.name) {\n setRenamingId(null)\n return\n }\n await onRename(profile, name)\n setRenamingId(null)\n }\n\n const submitCreate = async (event: React.FormEvent) => {\n event.preventDefault()\n const name = draftName.trim()\n if (!name) return\n await onCreate(name)\n setDraftName('')\n }\n\n // Roving arrows: ↓/↑ (and Home/End) walk the profile rows without\n // leaving the panel; Tab keeps the DOM order (select → actions).\n const onListKeyDown = (event: React.KeyboardEvent<HTMLUListElement>) => {\n const rows = Array.from(\n event.currentTarget.querySelectorAll<HTMLButtonElement>('[data-profile-row]'),\n )\n if (rows.length === 0) return\n const index = rows.indexOf(document.activeElement as HTMLButtonElement)\n let next = -1\n if (event.key === 'ArrowDown') next = index < 0 ? 0 : Math.min(index + 1, rows.length - 1)\n else if (event.key === 'ArrowUp')\n next = index < 0 ? rows.length - 1 : Math.max(index - 1, 0)\n else if (event.key === 'Home') next = 0\n else if (event.key === 'End') next = rows.length - 1\n if (next >= 0) {\n event.preventDefault()\n rows[next]?.focus()\n }\n }\n\n return (\n <div ref={ref} data-as=\"profile-switcher\" className={cn('inline-block', className)}>\n <Popover\n open={open}\n onOpenChange={(next) => {\n setOpen(next)\n if (!next) {\n setRenamingId(null)\n setDraftName('')\n }\n }}\n >\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n aria-haspopup=\"dialog\"\n aria-label={merged.trigger}\n data-testid=\"profile-trigger\"\n className=\"flex cursor-pointer items-center gap-2 rounded-full p-0.5 pr-2 transition-colors hover:bg-[var(--as-secondary)] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--as-focus-ring)]\"\n >\n {current ? (\n <ProfileAvatar profile={current} size=\"md\" />\n ) : (\n <span\n aria-hidden\n className=\"flex size-8 shrink-0 items-center justify-center rounded-full ring-1 ring-[var(--as-border)]\"\n >\n <TriggerIcon className=\"size-4 text-[var(--as-muted-fg)]\" />\n </span>\n )}\n <span className=\"max-w-32 truncate text-sm font-medium\">\n {current ? current.name : merged.empty}\n </span>\n <ChevronDown\n aria-hidden\n className=\"size-3.5 text-[var(--as-muted-fg)] transition-transform duration-150 [[data-state=open]>&]:rotate-180\"\n />\n </button>\n </PopoverTrigger>\n <PopoverContent\n align={align}\n role=\"dialog\"\n aria-label={merged.panelTitle}\n className=\"w-80 p-1.5 shadow-[var(--as-shadow-pop)] backdrop-blur-xl\"\n onEscapeKeyDown={(event) => {\n // Escape cancels an inline rename first, closes the panel\n // only on the second press.\n if (renamingId !== null) event.preventDefault()\n }}\n >\n <div className=\"flex items-center justify-between px-2 pb-1 pt-1\">\n <span className=\"text-[11px] font-semibold uppercase tracking-wide text-[var(--as-muted-fg)]\">\n {merged.panelTitle}\n </span>\n {profiles.length > 0 ? (\n <span className=\"text-[11px] tabular-nums text-[var(--as-muted-fg)]\">\n {profiles.length}\n </span>\n ) : null}\n </div>\n {loading ? (\n <p\n className=\"as-anim-fade px-2 py-3 text-sm text-[var(--as-muted-fg)]\"\n role=\"status\"\n >\n {merged.loading}\n </p>\n ) : profiles.length === 0 ? (\n <p className=\"flex items-center gap-2 px-2 py-3 text-sm text-[var(--as-muted-fg)]\">\n <EmptyIcon aria-hidden className=\"size-4\" />\n {merged.empty}\n </p>\n ) : (\n <ul\n className=\"max-h-72 space-y-0.5 overflow-y-auto\"\n onKeyDown={onListKeyDown}\n >\n {profiles.map((profile) => {\n const isCurrent = current !== null && profile.id === current.id\n return (\n <li\n key={profile.id}\n className=\"flex items-center gap-1 rounded-[var(--as-radius-sm)] px-0.5 py-0.5 hover:bg-[var(--as-secondary)]\"\n >\n {renamingId === profile.id ? (\n <form\n className=\"flex w-full items-center gap-1 py-0.5\"\n onSubmit={(event) => {\n event.preventDefault()\n void submitRename(profile)\n }}\n >\n <Input\n ref={renameInputRef}\n aria-label={merged.rename(profile.name)}\n placeholder={merged.renamePlaceholder}\n value={renameDraft}\n onChange={(event) => setRenameDraft(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n setRenamingId(null)\n }\n }}\n className=\"h-8 flex-1\"\n />\n <Button\n type=\"submit\"\n size=\"sm\"\n className=\"h-8\"\n disabled={!renameDraft.trim()}\n aria-label={merged.renameSubmit}\n >\n {merged.renameSubmit}\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n className=\"h-8\"\n aria-label={merged.cancel}\n onClick={() => setRenamingId(null)}\n >\n {merged.cancel}\n </Button>\n </form>\n ) : (\n <>\n <button\n type=\"button\"\n aria-current={isCurrent || undefined}\n data-profile-row\n data-testid={`profile-option-${profile.id}`}\n className=\"flex min-w-0 flex-1 cursor-pointer items-center gap-2.5 rounded-[var(--as-radius-sm)] px-1.5 py-1.5 text-left text-sm outline-none transition-colors hover:bg-[var(--as-secondary)] focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-[var(--as-focus-ring)] aria-current:bg-[color-mix(in_srgb,var(--as-accent)_8%,transparent)]\"\n onClick={() => {\n onSelect(profile)\n close()\n }}\n >\n <ProfileAvatar profile={profile} size=\"md\" />\n <span className=\"min-w-0 flex-1 truncate font-medium\">\n {profile.name}\n </span>\n <ProfileRowBadges\n isCurrent={isCurrent}\n isDefault={Boolean(profile.is_default)}\n currentBadge={merged.currentBadge}\n defaultBadge={merged.defaultBadge}\n />\n </button>\n <span className=\"flex shrink-0 items-center gap-0.5 pr-0.5\">\n <Button\n type=\"button\"\n size=\"icon\"\n variant=\"ghost\"\n className=\"size-7 rounded-[var(--as-radius-sm)]\"\n aria-label={merged.rename(profile.name)}\n title={merged.rename(profile.name)}\n onClick={() => startRename(profile)}\n >\n <RenameIcon aria-hidden />\n </Button>\n {onSetDefault && !profile.is_default ? (\n <Button\n type=\"button\"\n size=\"icon\"\n variant=\"ghost\"\n className=\"size-7 rounded-[var(--as-radius-sm)]\"\n aria-label={merged.setDefault(profile.name)}\n title={merged.setDefault(profile.name)}\n onClick={() => void onSetDefault(profile)}\n >\n <SetDefaultIcon aria-hidden />\n </Button>\n ) : null}\n <Button\n type=\"button\"\n size=\"icon\"\n variant=\"ghost\"\n className=\"size-7 rounded-[var(--as-radius-sm)] hover:text-[var(--as-danger)]\"\n aria-label={merged.delete(profile.name)}\n title={merged.delete(profile.name)}\n onClick={() => void onDelete(profile)}\n >\n <DeleteIcon aria-hidden />\n </Button>\n </span>\n </>\n )}\n </li>\n )\n })}\n </ul>\n )}\n {error ? (\n <p\n role=\"alert\"\n className=\"mx-1 mt-1 rounded-[var(--as-radius-sm)] bg-[color-mix(in_srgb,var(--as-danger)_10%,transparent)] px-2 py-1 text-xs text-[var(--as-danger)]\"\n >\n {error}\n </p>\n ) : null}\n <form\n className=\"mt-1 flex items-center gap-1.5 border-t border-[var(--as-border)] p-1.5 pt-2\"\n onSubmit={(event) => {\n void submitCreate(event)\n }}\n >\n <div className=\"relative min-w-0 flex-1\">\n <CreateIcon\n aria-hidden\n className=\"pointer-events-none absolute left-2.5 top-1/2 size-3.5 -translate-y-1/2 text-[var(--as-muted-fg)]\"\n />\n <Input\n aria-label={merged.newProfile}\n placeholder={merged.newProfilePlaceholder}\n value={draftName}\n onChange={(event) => setDraftName(event.target.value)}\n className=\"h-8 pl-8\"\n />\n </div>\n <Button\n type=\"submit\"\n size=\"sm\"\n className=\"h-8 gap-1 px-2.5\"\n disabled={!draftName.trim()}\n aria-label={merged.create}\n >\n <CreateIcon aria-hidden />\n {merged.create}\n </Button>\n </form>\n </PopoverContent>\n </Popover>\n </div>\n )\n },\n)\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Combobox } from './chunk-
|
|
1
|
+
import { Combobox } from './chunk-SVRCZUNQ.js';
|
|
2
2
|
import { cn } from './chunk-RVVXVTH3.js';
|
|
3
3
|
import * as React from 'react';
|
|
4
4
|
import { jsx } from 'react/jsx-runtime';
|
|
@@ -61,5 +61,5 @@ var ModelPicker = React.forwardRef(
|
|
|
61
61
|
);
|
|
62
62
|
|
|
63
63
|
export { ModelPicker };
|
|
64
|
-
//# sourceMappingURL=chunk-
|
|
65
|
-
//# sourceMappingURL=chunk-
|
|
64
|
+
//# sourceMappingURL=chunk-CCFVDJHU.js.map
|
|
65
|
+
//# sourceMappingURL=chunk-CCFVDJHU.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/model-picker/ModelPicker.tsx"],"names":["ModelPicker"],"mappings":";;;;;AA+CO,IAAM,WAAA,GAAoB,KAAA,CAAA,UAAA;AAAA,EAC/B,SAASA,YAAAA,CACP;AAAA,IACE,SAAA;AAAA,IACA,KAAA;AAAA,IACA,QAAA;AAAA,IACA,WAAA,GAAc,sBAAA;AAAA,IACd,iBAAA,GAAoB,qBAAA;AAAA,IACpB,WAAA;AAAA,IACA,UAAA;AAAA,IACA,OAAA,GAAU,KAAA;AAAA,IACV,QAAA,GAAW,KAAA;AAAA,IACX,SAAA,GAAY,KAAA;AAAA,IACZ,UAAA;AAAA,IACA,KAAA;AAAA,IACA,SAAA,GAAY,KAAA;AAAA,IACZ,KAAA;AAAA,IACA,EAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,KAEF,GAAA,EACA;AACA,IAAA,MAAM,OAAA,GAAkC,KAAA,CAAA,OAAA;AAAA,MACtC,MACE,SAAA,CAAU,OAAA;AAAA,QAAQ,CAAC,QAAA,KACjB,QAAA,CAAS,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,UAC9B,OAAO,KAAA,CAAM,EAAA;AAAA,UACb,OAAO,KAAA,CAAM,IAAA;AAAA,UACb,OAAO,QAAA,CAAS,IAAA;AAAA,UAChB,OAAO,KAAA,CAAM;AAAA,SACf,CAAE;AAAA,OACJ;AAAA,MACF,CAAC,SAAS;AAAA,KACZ;AAEA,IAAA,uBACE,GAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,OAAA;AAAA,QACA,KAAA;AAAA,QACA,QAAA;AAAA,QACA,WAAA;AAAA,QACA,iBAAA;AAAA,QACA,WAAA;AAAA,QACA,UAAA;AAAA,QACA,OAAA;AAAA,QACA,QAAA;AAAA,QACA,SAAA;AAAA,QACA,UAAA;AAAA,QACA,KAAA;AAAA,QACA,SAAA;AAAA,QACA,KAAA;AAAA,QACA,EAAA;AAAA,QACA,SAAA,EAAW,EAAA,CAAG,QAAA,EAAU,SAAS,CAAA;AAAA,QACjC;AAAA;AAAA,KACF;AAAA,EAEJ;AACF","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/components/model-picker/ModelPicker.tsx"],"names":["ModelPicker"],"mappings":";;;;;AA+CO,IAAM,WAAA,GAAoB,KAAA,CAAA,UAAA;AAAA,EAC/B,SAASA,YAAAA,CACP;AAAA,IACE,SAAA;AAAA,IACA,KAAA;AAAA,IACA,QAAA;AAAA,IACA,WAAA,GAAc,sBAAA;AAAA,IACd,iBAAA,GAAoB,qBAAA;AAAA,IACpB,WAAA;AAAA,IACA,UAAA;AAAA,IACA,OAAA,GAAU,KAAA;AAAA,IACV,QAAA,GAAW,KAAA;AAAA,IACX,SAAA,GAAY,KAAA;AAAA,IACZ,UAAA;AAAA,IACA,KAAA;AAAA,IACA,SAAA,GAAY,KAAA;AAAA,IACZ,KAAA;AAAA,IACA,EAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,KAEF,GAAA,EACA;AACA,IAAA,MAAM,OAAA,GAAkC,KAAA,CAAA,OAAA;AAAA,MACtC,MACE,SAAA,CAAU,OAAA;AAAA,QAAQ,CAAC,QAAA,KACjB,QAAA,CAAS,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,UAC9B,OAAO,KAAA,CAAM,EAAA;AAAA,UACb,OAAO,KAAA,CAAM,IAAA;AAAA,UACb,OAAO,QAAA,CAAS,IAAA;AAAA,UAChB,OAAO,KAAA,CAAM;AAAA,SACf,CAAE;AAAA,OACJ;AAAA,MACF,CAAC,SAAS;AAAA,KACZ;AAEA,IAAA,uBACE,GAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,OAAA;AAAA,QACA,KAAA;AAAA,QACA,QAAA;AAAA,QACA,WAAA;AAAA,QACA,iBAAA;AAAA,QACA,WAAA;AAAA,QACA,UAAA;AAAA,QACA,OAAA;AAAA,QACA,QAAA;AAAA,QACA,SAAA;AAAA,QACA,UAAA;AAAA,QACA,KAAA;AAAA,QACA,SAAA;AAAA,QACA,KAAA;AAAA,QACA,EAAA;AAAA,QACA,SAAA,EAAW,EAAA,CAAG,QAAA,EAAU,SAAS,CAAA;AAAA,QACjC;AAAA;AAAA,KACF;AAAA,EAEJ;AACF","file":"chunk-CCFVDJHU.js","sourcesContent":["import * as React from 'react'\nimport { cn } from '../../lib/utils'\nimport {\n Combobox,\n type ComboboxOption,\n} from '../combobox'\n\nexport interface ModelPickerModel {\n id: string\n name: string\n /** Short capability chip, e.g. `vision` or `tools`. */\n capability?: string\n /** Full capability set, matched by TaskAssignmentPicker `requires`. */\n capabilities?: string[]\n}\n\nexport interface ModelPickerProvider {\n id: string\n name: string\n models: ModelPickerModel[]\n}\n\nexport interface ModelPickerProps {\n providers: ModelPickerProvider[]\n value?: string\n onChange: (modelId: string) => void\n placeholder?: string\n searchPlaceholder?: string\n searchLabel?: string\n emptyLabel?: string\n loading?: boolean\n disabled?: boolean\n clearable?: boolean\n clearLabel?: string\n label?: string\n /** Keep the accessible name from `label` but do not render it visibly. */\n hideLabel?: boolean\n error?: string\n id?: string\n className?: string\n panelClassName?: string\n}\n\n/**\n * Grouped, searchable provider → model picker. Presentational: the model\n * list comes in via props, selection goes out via `onChange`.\n */\nexport const ModelPicker = React.forwardRef<HTMLButtonElement, ModelPickerProps>(\n function ModelPicker(\n {\n providers,\n value,\n onChange,\n placeholder = 'Select a model…',\n searchPlaceholder = 'Search models…',\n searchLabel,\n emptyLabel,\n loading = false,\n disabled = false,\n clearable = false,\n clearLabel,\n label,\n hideLabel = false,\n error,\n id,\n className,\n panelClassName,\n },\n ref,\n ) {\n const options: ComboboxOption[] = React.useMemo(\n () =>\n providers.flatMap((provider) =>\n provider.models.map((model) => ({\n value: model.id,\n label: model.name,\n group: provider.name,\n badge: model.capability,\n })),\n ),\n [providers],\n )\n\n return (\n <Combobox\n ref={ref}\n options={options}\n value={value}\n onChange={onChange}\n placeholder={placeholder}\n searchPlaceholder={searchPlaceholder}\n searchLabel={searchLabel}\n emptyLabel={emptyLabel}\n loading={loading}\n disabled={disabled}\n clearable={clearable}\n clearLabel={clearLabel}\n label={label}\n hideLabel={hideLabel}\n error={error}\n id={id}\n className={cn('w-full', className)}\n panelClassName={panelClassName}\n />\n )\n },\n)\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { MarkdownSurface } from './chunk-HQ3X5SVR.js';
|
|
2
1
|
import { computeUnitDiff } from './chunk-QLP7K3PY.js';
|
|
2
|
+
import { MarkdownSurface } from './chunk-HQ3X5SVR.js';
|
|
3
3
|
import { cn } from './chunk-RVVXVTH3.js';
|
|
4
4
|
import * as React from 'react';
|
|
5
5
|
import { useState, useRef, useMemo, useEffect } from 'react';
|
|
@@ -353,5 +353,5 @@ var MarkdownDiffView = React.forwardRef(function MarkdownDiffView2({
|
|
|
353
353
|
});
|
|
354
354
|
|
|
355
355
|
export { MarkdownDiffView, splitMarkdownBlocks };
|
|
356
|
-
//# sourceMappingURL=chunk-
|
|
357
|
-
//# sourceMappingURL=chunk-
|
|
356
|
+
//# sourceMappingURL=chunk-MFM4W6ZO.js.map
|
|
357
|
+
//# sourceMappingURL=chunk-MFM4W6ZO.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/markdown-diff-view/blockSplit.ts","../src/components/markdown-diff-view/MarkdownDiffView.tsx"],"names":["MarkdownDiffView","useRef"],"mappings":"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","file":"chunk-QUVVOG7K.js","sourcesContent":["function fenceMarkerOf(\n trimmed: string,\n): { char: string; bare: boolean } | null {\n const bare = /^(`{3,}|~{3,})$/.exec(trimmed)\n const marker = bare?.[1] ?? /^(`{3,}|~{3,})/.exec(trimmed)?.[1]\n if (marker === undefined || marker.length === 0) {\n return null\n }\n return { char: marker.charAt(0), bare: bare !== null }\n}\n\nexport function splitMarkdownBlocks(markdown: string): string[] {\n const lines = markdown.replace(/\\r\\n?/g, '\\n').split('\\n')\n const blocks: string[] = []\n let current: string[] = []\n let fenceChar: string | null = null\n let inMath = false\n\n const flush = () => {\n if (current.some((line) => line.trim() !== '')) {\n blocks.push(current.join('\\n').trim())\n }\n current = []\n }\n\n for (const line of lines) {\n const trimmed = line.trim()\n const marker = fenceMarkerOf(trimmed)\n if (fenceChar !== null) {\n current.push(line)\n if (marker !== null && marker.bare && marker.char === fenceChar) {\n fenceChar = null\n }\n continue\n }\n if (marker !== null) {\n flush()\n fenceChar = marker.char\n current.push(line)\n continue\n }\n if (inMath) {\n current.push(line)\n if (trimmed.endsWith('$$')) {\n inMath = false\n }\n continue\n }\n if (trimmed === '$$') {\n flush()\n inMath = true\n current.push(line)\n continue\n }\n if (trimmed.startsWith('$$')) {\n flush()\n current.push(line)\n if (!trimmed.endsWith('$$') || trimmed.length <= 4) {\n inMath = true\n }\n continue\n }\n if (trimmed === '') {\n flush()\n continue\n }\n current.push(line)\n }\n flush()\n return blocks\n}\n","import * as React from 'react'\nimport { useEffect, useMemo, useRef, useState } from 'react'\nimport {\n ChevronDown,\n ChevronRight,\n ChevronUp,\n Minus,\n Plus,\n} from 'lucide-react'\n\nimport { cn } from '../../lib/utils'\nimport { MarkdownSurface } from '../chat-markdown'\nimport { computeUnitDiff, type DiffRow } from '../text-diff-view/lineDiff'\n\nimport { splitMarkdownBlocks } from './blockSplit'\n\nexport interface MarkdownDiffViewLabels {\n original?: string\n suggested?: string\n /** Fold summary for a run of hidden unchanged blocks. */\n unchangedBlocks?: (count: number) => string\n showLess?: string\n prevChange?: string\n nextChange?: string\n changePosition?: (index: number, total: number) => string\n noChanges?: string\n}\n\nconst DEFAULT_LABELS: Required<MarkdownDiffViewLabels> = {\n original: 'Original',\n suggested: 'Suggested',\n unchangedBlocks: (count) =>\n count === 1 ? '1 unchanged block' : `${count} unchanged blocks`,\n showLess: 'Show less',\n prevChange: 'Previous change',\n nextChange: 'Next change',\n changePosition: (index, total) => `${index}/${total}`,\n noChanges: 'No changes',\n}\n\nexport interface MarkdownDiffViewProps {\n original: string\n suggested: string\n /** Unchanged blocks kept visible around each change; the rest fold. Default 1. */\n contextBlocks?: number\n showHeader?: boolean\n showNav?: boolean\n labels?: Partial<MarkdownDiffViewLabels>\n /** Applied to the outer box. */\n className?: string\n /** Applied to the scrolling body — size the view here (e.g. `max-h-80`). */\n bodyClassName?: string\n}\n\nfunction isChangedRow(row: DiffRow): boolean {\n return (\n row.kind === 'pair' &&\n (row.left?.kind === 'del' || row.right?.kind === 'add')\n )\n}\n\ninterface FlatRow {\n key: string\n row: DiffRow\n foldOf?: number\n collapseOf?: number\n}\n\nfunction BlockSurface({ value }: { value: string }) {\n return <MarkdownSurface value={value} className=\"min-w-0 [&>*:first-child]:mt-0 [&>*:last-child]:mb-0\" />\n}\n\nexport const MarkdownDiffView = React.forwardRef<\n HTMLDivElement,\n MarkdownDiffViewProps\n>(function MarkdownDiffView(\n {\n original,\n suggested,\n contextBlocks = 1,\n showHeader = true,\n showNav = true,\n labels,\n className,\n bodyClassName,\n },\n ref,\n) {\n const mergedLabels = { ...DEFAULT_LABELS, ...labels }\n const [expanded, setExpanded] = useState<Set<number>>(new Set())\n const [activeGroup, setActiveGroup] = useState(0)\n const scrollRef = React.useRef<HTMLDivElement | null>(null)\n const rowRefs = useRef(new Map<number, HTMLDivElement>())\n\n const diff = useMemo(\n () =>\n computeUnitDiff(splitMarkdownBlocks(original), splitMarkdownBlocks(suggested), {\n contextUnits: contextBlocks,\n }),\n [original, suggested, contextBlocks],\n )\n\n const flatRows = useMemo<FlatRow[]>(() => {\n const out: FlatRow[] = []\n diff.rows.forEach((row, index) => {\n if (row.kind === 'fold' && expanded.has(index)) {\n row.hidden.forEach((hiddenRow, hiddenIndex) => {\n out.push({ key: `${index}.${hiddenIndex}`, row: hiddenRow })\n })\n out.push({ key: `${index}.collapse`, row, collapseOf: index })\n } else {\n out.push({\n key: String(index),\n row,\n foldOf: row.kind === 'fold' ? index : undefined,\n })\n }\n })\n return out\n }, [diff.rows, expanded])\n\n const changeGroups = useMemo<number[]>(() => {\n const groups: number[] = []\n let inGroup = false\n flatRows.forEach((entry, index) => {\n const changed = isChangedRow(entry.row)\n if (changed && !inGroup) {\n groups.push(index)\n }\n inGroup = changed\n })\n return groups\n }, [flatRows])\n\n useEffect(() => {\n setExpanded(new Set())\n setActiveGroup(0)\n }, [original, suggested])\n\n useEffect(() => {\n if (activeGroup >= changeGroups.length) {\n setActiveGroup(0)\n }\n }, [activeGroup, changeGroups.length])\n\n useEffect(() => {\n const target = changeGroups[activeGroup]\n if (target === undefined) {\n return\n }\n const element = rowRefs.current.get(target)\n if (element && typeof element.scrollIntoView === 'function') {\n element.scrollIntoView({ block: 'center' })\n }\n }, [activeGroup, changeGroups])\n\n if (diff.added === 0 && diff.removed === 0) {\n return (\n <div\n ref={ref}\n data-as=\"markdown-diff-view\"\n className={cn(\n 'text-[var(--as-muted-fg)] border-[var(--as-border)] bg-[var(--as-subtle)] rounded-md border p-3 text-xs',\n className,\n )}\n >\n {mergedLabels.noChanges}\n </div>\n )\n }\n\n const activeGroupStart = changeGroups[activeGroup]\n const activeGroupEnd =\n activeGroupStart === undefined\n ? undefined\n : (() => {\n for (\n let index = activeGroupStart + 1;\n index < flatRows.length;\n index += 1\n ) {\n const entry = flatRows[index]\n if (entry !== undefined && isChangedRow(entry.row)) {\n return index\n }\n }\n return flatRows.length\n })()\n\n const renderRow = (entry: FlatRow, index: number) => {\n const row = entry.row\n if (row.kind === 'fold') {\n if (entry.collapseOf !== undefined) {\n const collapseOf = entry.collapseOf\n return (\n <button\n key={entry.key}\n type=\"button\"\n onClick={() =>\n setExpanded((current) => {\n const next = new Set(current)\n next.delete(collapseOf)\n return next\n })\n }\n className=\"text-[var(--as-muted-fg)] hover:bg-[var(--as-subtle)] hover:text-[var(--as-fg)] flex w-full items-center gap-1 px-3 py-0.5 text-left text-[11px]\"\n >\n <ChevronDown className=\"size-3\" aria-hidden />\n {mergedLabels.showLess}\n </button>\n )\n }\n const foldOf = entry.foldOf\n return (\n <button\n key={entry.key}\n type=\"button\"\n onClick={() => {\n if (foldOf !== undefined) {\n setExpanded((current) => {\n const next = new Set(current)\n next.add(foldOf)\n return next\n })\n }\n }}\n className=\"text-[var(--as-muted-fg)] hover:bg-[var(--as-subtle)] hover:text-[var(--as-fg)] flex w-full items-center gap-1 px-3 py-0.5 text-left text-[11px]\"\n >\n <ChevronRight className=\"size-3\" aria-hidden />\n {mergedLabels.unchangedBlocks(row.count)}\n </button>\n )\n }\n const changed = isChangedRow(row)\n const active =\n activeGroupStart !== undefined &&\n activeGroupEnd !== undefined &&\n index >= activeGroupStart &&\n index < activeGroupEnd\n if (!changed) {\n const text = row.left?.text ?? row.right?.text ?? ''\n return (\n <div\n key={entry.key}\n ref={(node) => {\n if (node) {\n rowRefs.current.set(index, node)\n } else {\n rowRefs.current.delete(index)\n }\n }}\n data-context=\"\"\n className={cn('border-[var(--as-border)] px-3 py-1.5', active && 'bg-[var(--as-primary)]/5')}\n >\n <BlockSurface value={text} />\n </div>\n )\n }\n return (\n <div\n key={entry.key}\n ref={(node) => {\n if (node) {\n rowRefs.current.set(index, node)\n } else {\n rowRefs.current.delete(index)\n }\n }}\n className={cn('grid grid-cols-2', active && 'bg-[var(--as-primary)]/5')}\n data-changed={changed || undefined}\n data-active={active || undefined}\n >\n {(['left', 'right'] as const).map((side) => {\n const cell = row[side]\n const isAdd = cell?.kind === 'add'\n const isDel = cell?.kind === 'del'\n return (\n <div\n key={side}\n data-kind={isAdd ? 'add' : isDel ? 'del' : undefined}\n className={cn(\n 'min-w-0 px-3 py-1.5',\n isAdd && 'bg-[var(--as-success)]/10',\n isDel && 'bg-[var(--as-danger)]/10',\n cell === null && 'bg-[var(--as-subtle)]/50',\n )}\n >\n {cell === null ? null : <BlockSurface value={cell.text} />}\n </div>\n )\n })}\n </div>\n )\n }\n\n return (\n <div\n ref={ref}\n data-as=\"markdown-diff-view\"\n className={cn(\n 'bg-[var(--as-surface)] border-[var(--as-border)] flex flex-col overflow-hidden rounded-md border text-sm leading-relaxed',\n className,\n )}\n >\n {showHeader ? (\n <div className=\"border-[var(--as-border)] text-[var(--as-muted-fg)] grid grid-cols-[1fr_auto_1fr] items-center gap-2 border-b px-3 py-1.5 text-[11px] font-medium tracking-wide uppercase\">\n <span className=\"flex items-center gap-1\">\n <Minus className=\"size-3 text-[var(--as-danger)]\" aria-hidden />\n {mergedLabels.original}\n </span>\n <span className=\"flex items-center gap-2\">\n <span>\n <span className=\"text-[var(--as-success)]\">+{diff.added}</span>{' '}\n <span className=\"text-[var(--as-danger)]\">−{diff.removed}</span>\n </span>\n {showNav && changeGroups.length > 0 ? (\n <span className=\"flex items-center gap-0.5\">\n <button\n type=\"button\"\n aria-label={mergedLabels.prevChange}\n title={mergedLabels.prevChange}\n disabled={activeGroup === 0}\n onClick={() => setActiveGroup((value) => Math.max(0, value - 1))}\n className=\"hover:bg-[var(--as-border)] hover:text-[var(--as-fg)] rounded p-0.5 disabled:opacity-40\"\n >\n <ChevronUp className=\"size-3.5\" aria-hidden />\n </button>\n <span className=\"tabular-nums\">\n {mergedLabels.changePosition(activeGroup + 1, changeGroups.length)}\n </span>\n <button\n type=\"button\"\n aria-label={mergedLabels.nextChange}\n title={mergedLabels.nextChange}\n disabled={activeGroup >= changeGroups.length - 1}\n onClick={() =>\n setActiveGroup((value) => Math.min(changeGroups.length - 1, value + 1))\n }\n className=\"hover:bg-[var(--as-border)] hover:text-[var(--as-fg)] rounded p-0.5 disabled:opacity-40\"\n >\n <ChevronDown className=\"size-3.5\" aria-hidden />\n </button>\n </span>\n ) : null}\n </span>\n <span className=\"flex items-center justify-end gap-1\">\n {mergedLabels.suggested}\n <Plus className=\"size-3 text-[var(--as-success)]\" aria-hidden />\n </span>\n </div>\n ) : null}\n <div ref={scrollRef} className={cn('min-h-0 flex-1 overflow-y-auto', bodyClassName)}>\n {flatRows.map((entry, index) => renderRow(entry, index))}\n </div>\n </div>\n )\n})\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/markdown-diff-view/blockSplit.ts","../src/components/markdown-diff-view/MarkdownDiffView.tsx"],"names":["MarkdownDiffView","useRef"],"mappings":"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","file":"chunk-MFM4W6ZO.js","sourcesContent":["function fenceMarkerOf(\n trimmed: string,\n): { char: string; bare: boolean } | null {\n const bare = /^(`{3,}|~{3,})$/.exec(trimmed)\n const marker = bare?.[1] ?? /^(`{3,}|~{3,})/.exec(trimmed)?.[1]\n if (marker === undefined || marker.length === 0) {\n return null\n }\n return { char: marker.charAt(0), bare: bare !== null }\n}\n\nexport function splitMarkdownBlocks(markdown: string): string[] {\n const lines = markdown.replace(/\\r\\n?/g, '\\n').split('\\n')\n const blocks: string[] = []\n let current: string[] = []\n let fenceChar: string | null = null\n let inMath = false\n\n const flush = () => {\n if (current.some((line) => line.trim() !== '')) {\n blocks.push(current.join('\\n').trim())\n }\n current = []\n }\n\n for (const line of lines) {\n const trimmed = line.trim()\n const marker = fenceMarkerOf(trimmed)\n if (fenceChar !== null) {\n current.push(line)\n if (marker !== null && marker.bare && marker.char === fenceChar) {\n fenceChar = null\n }\n continue\n }\n if (marker !== null) {\n flush()\n fenceChar = marker.char\n current.push(line)\n continue\n }\n if (inMath) {\n current.push(line)\n if (trimmed.endsWith('$$')) {\n inMath = false\n }\n continue\n }\n if (trimmed === '$$') {\n flush()\n inMath = true\n current.push(line)\n continue\n }\n if (trimmed.startsWith('$$')) {\n flush()\n current.push(line)\n if (!trimmed.endsWith('$$') || trimmed.length <= 4) {\n inMath = true\n }\n continue\n }\n if (trimmed === '') {\n flush()\n continue\n }\n current.push(line)\n }\n flush()\n return blocks\n}\n","import * as React from 'react'\nimport { useEffect, useMemo, useRef, useState } from 'react'\nimport {\n ChevronDown,\n ChevronRight,\n ChevronUp,\n Minus,\n Plus,\n} from 'lucide-react'\n\nimport { cn } from '../../lib/utils'\nimport { MarkdownSurface } from '../chat-markdown'\nimport { computeUnitDiff, type DiffRow } from '../text-diff-view/lineDiff'\n\nimport { splitMarkdownBlocks } from './blockSplit'\n\nexport interface MarkdownDiffViewLabels {\n original?: string\n suggested?: string\n /** Fold summary for a run of hidden unchanged blocks. */\n unchangedBlocks?: (count: number) => string\n showLess?: string\n prevChange?: string\n nextChange?: string\n changePosition?: (index: number, total: number) => string\n noChanges?: string\n}\n\nconst DEFAULT_LABELS: Required<MarkdownDiffViewLabels> = {\n original: 'Original',\n suggested: 'Suggested',\n unchangedBlocks: (count) =>\n count === 1 ? '1 unchanged block' : `${count} unchanged blocks`,\n showLess: 'Show less',\n prevChange: 'Previous change',\n nextChange: 'Next change',\n changePosition: (index, total) => `${index}/${total}`,\n noChanges: 'No changes',\n}\n\nexport interface MarkdownDiffViewProps {\n original: string\n suggested: string\n /** Unchanged blocks kept visible around each change; the rest fold. Default 1. */\n contextBlocks?: number\n showHeader?: boolean\n showNav?: boolean\n labels?: Partial<MarkdownDiffViewLabels>\n /** Applied to the outer box. */\n className?: string\n /** Applied to the scrolling body — size the view here (e.g. `max-h-80`). */\n bodyClassName?: string\n}\n\nfunction isChangedRow(row: DiffRow): boolean {\n return (\n row.kind === 'pair' &&\n (row.left?.kind === 'del' || row.right?.kind === 'add')\n )\n}\n\ninterface FlatRow {\n key: string\n row: DiffRow\n foldOf?: number\n collapseOf?: number\n}\n\nfunction BlockSurface({ value }: { value: string }) {\n return <MarkdownSurface value={value} className=\"min-w-0 [&>*:first-child]:mt-0 [&>*:last-child]:mb-0\" />\n}\n\nexport const MarkdownDiffView = React.forwardRef<\n HTMLDivElement,\n MarkdownDiffViewProps\n>(function MarkdownDiffView(\n {\n original,\n suggested,\n contextBlocks = 1,\n showHeader = true,\n showNav = true,\n labels,\n className,\n bodyClassName,\n },\n ref,\n) {\n const mergedLabels = { ...DEFAULT_LABELS, ...labels }\n const [expanded, setExpanded] = useState<Set<number>>(new Set())\n const [activeGroup, setActiveGroup] = useState(0)\n const scrollRef = React.useRef<HTMLDivElement | null>(null)\n const rowRefs = useRef(new Map<number, HTMLDivElement>())\n\n const diff = useMemo(\n () =>\n computeUnitDiff(splitMarkdownBlocks(original), splitMarkdownBlocks(suggested), {\n contextUnits: contextBlocks,\n }),\n [original, suggested, contextBlocks],\n )\n\n const flatRows = useMemo<FlatRow[]>(() => {\n const out: FlatRow[] = []\n diff.rows.forEach((row, index) => {\n if (row.kind === 'fold' && expanded.has(index)) {\n row.hidden.forEach((hiddenRow, hiddenIndex) => {\n out.push({ key: `${index}.${hiddenIndex}`, row: hiddenRow })\n })\n out.push({ key: `${index}.collapse`, row, collapseOf: index })\n } else {\n out.push({\n key: String(index),\n row,\n foldOf: row.kind === 'fold' ? index : undefined,\n })\n }\n })\n return out\n }, [diff.rows, expanded])\n\n const changeGroups = useMemo<number[]>(() => {\n const groups: number[] = []\n let inGroup = false\n flatRows.forEach((entry, index) => {\n const changed = isChangedRow(entry.row)\n if (changed && !inGroup) {\n groups.push(index)\n }\n inGroup = changed\n })\n return groups\n }, [flatRows])\n\n useEffect(() => {\n setExpanded(new Set())\n setActiveGroup(0)\n }, [original, suggested])\n\n useEffect(() => {\n if (activeGroup >= changeGroups.length) {\n setActiveGroup(0)\n }\n }, [activeGroup, changeGroups.length])\n\n useEffect(() => {\n const target = changeGroups[activeGroup]\n if (target === undefined) {\n return\n }\n const element = rowRefs.current.get(target)\n if (element && typeof element.scrollIntoView === 'function') {\n element.scrollIntoView({ block: 'center' })\n }\n }, [activeGroup, changeGroups])\n\n if (diff.added === 0 && diff.removed === 0) {\n return (\n <div\n ref={ref}\n data-as=\"markdown-diff-view\"\n className={cn(\n 'text-[var(--as-muted-fg)] border-[var(--as-border)] bg-[var(--as-subtle)] rounded-md border p-3 text-xs',\n className,\n )}\n >\n {mergedLabels.noChanges}\n </div>\n )\n }\n\n const activeGroupStart = changeGroups[activeGroup]\n const activeGroupEnd =\n activeGroupStart === undefined\n ? undefined\n : (() => {\n for (\n let index = activeGroupStart + 1;\n index < flatRows.length;\n index += 1\n ) {\n const entry = flatRows[index]\n if (entry !== undefined && isChangedRow(entry.row)) {\n return index\n }\n }\n return flatRows.length\n })()\n\n const renderRow = (entry: FlatRow, index: number) => {\n const row = entry.row\n if (row.kind === 'fold') {\n if (entry.collapseOf !== undefined) {\n const collapseOf = entry.collapseOf\n return (\n <button\n key={entry.key}\n type=\"button\"\n onClick={() =>\n setExpanded((current) => {\n const next = new Set(current)\n next.delete(collapseOf)\n return next\n })\n }\n className=\"text-[var(--as-muted-fg)] hover:bg-[var(--as-subtle)] hover:text-[var(--as-fg)] flex w-full items-center gap-1 px-3 py-0.5 text-left text-[11px]\"\n >\n <ChevronDown className=\"size-3\" aria-hidden />\n {mergedLabels.showLess}\n </button>\n )\n }\n const foldOf = entry.foldOf\n return (\n <button\n key={entry.key}\n type=\"button\"\n onClick={() => {\n if (foldOf !== undefined) {\n setExpanded((current) => {\n const next = new Set(current)\n next.add(foldOf)\n return next\n })\n }\n }}\n className=\"text-[var(--as-muted-fg)] hover:bg-[var(--as-subtle)] hover:text-[var(--as-fg)] flex w-full items-center gap-1 px-3 py-0.5 text-left text-[11px]\"\n >\n <ChevronRight className=\"size-3\" aria-hidden />\n {mergedLabels.unchangedBlocks(row.count)}\n </button>\n )\n }\n const changed = isChangedRow(row)\n const active =\n activeGroupStart !== undefined &&\n activeGroupEnd !== undefined &&\n index >= activeGroupStart &&\n index < activeGroupEnd\n if (!changed) {\n const text = row.left?.text ?? row.right?.text ?? ''\n return (\n <div\n key={entry.key}\n ref={(node) => {\n if (node) {\n rowRefs.current.set(index, node)\n } else {\n rowRefs.current.delete(index)\n }\n }}\n data-context=\"\"\n className={cn('border-[var(--as-border)] px-3 py-1.5', active && 'bg-[var(--as-primary)]/5')}\n >\n <BlockSurface value={text} />\n </div>\n )\n }\n return (\n <div\n key={entry.key}\n ref={(node) => {\n if (node) {\n rowRefs.current.set(index, node)\n } else {\n rowRefs.current.delete(index)\n }\n }}\n className={cn('grid grid-cols-2', active && 'bg-[var(--as-primary)]/5')}\n data-changed={changed || undefined}\n data-active={active || undefined}\n >\n {(['left', 'right'] as const).map((side) => {\n const cell = row[side]\n const isAdd = cell?.kind === 'add'\n const isDel = cell?.kind === 'del'\n return (\n <div\n key={side}\n data-kind={isAdd ? 'add' : isDel ? 'del' : undefined}\n className={cn(\n 'min-w-0 px-3 py-1.5',\n isAdd && 'bg-[var(--as-success)]/10',\n isDel && 'bg-[var(--as-danger)]/10',\n cell === null && 'bg-[var(--as-subtle)]/50',\n )}\n >\n {cell === null ? null : <BlockSurface value={cell.text} />}\n </div>\n )\n })}\n </div>\n )\n }\n\n return (\n <div\n ref={ref}\n data-as=\"markdown-diff-view\"\n className={cn(\n 'bg-[var(--as-surface)] border-[var(--as-border)] flex flex-col overflow-hidden rounded-md border text-sm leading-relaxed',\n className,\n )}\n >\n {showHeader ? (\n <div className=\"border-[var(--as-border)] text-[var(--as-muted-fg)] grid grid-cols-[1fr_auto_1fr] items-center gap-2 border-b px-3 py-1.5 text-[11px] font-medium tracking-wide uppercase\">\n <span className=\"flex items-center gap-1\">\n <Minus className=\"size-3 text-[var(--as-danger)]\" aria-hidden />\n {mergedLabels.original}\n </span>\n <span className=\"flex items-center gap-2\">\n <span>\n <span className=\"text-[var(--as-success)]\">+{diff.added}</span>{' '}\n <span className=\"text-[var(--as-danger)]\">−{diff.removed}</span>\n </span>\n {showNav && changeGroups.length > 0 ? (\n <span className=\"flex items-center gap-0.5\">\n <button\n type=\"button\"\n aria-label={mergedLabels.prevChange}\n title={mergedLabels.prevChange}\n disabled={activeGroup === 0}\n onClick={() => setActiveGroup((value) => Math.max(0, value - 1))}\n className=\"hover:bg-[var(--as-border)] hover:text-[var(--as-fg)] rounded p-0.5 disabled:opacity-40\"\n >\n <ChevronUp className=\"size-3.5\" aria-hidden />\n </button>\n <span className=\"tabular-nums\">\n {mergedLabels.changePosition(activeGroup + 1, changeGroups.length)}\n </span>\n <button\n type=\"button\"\n aria-label={mergedLabels.nextChange}\n title={mergedLabels.nextChange}\n disabled={activeGroup >= changeGroups.length - 1}\n onClick={() =>\n setActiveGroup((value) => Math.min(changeGroups.length - 1, value + 1))\n }\n className=\"hover:bg-[var(--as-border)] hover:text-[var(--as-fg)] rounded p-0.5 disabled:opacity-40\"\n >\n <ChevronDown className=\"size-3.5\" aria-hidden />\n </button>\n </span>\n ) : null}\n </span>\n <span className=\"flex items-center justify-end gap-1\">\n {mergedLabels.suggested}\n <Plus className=\"size-3 text-[var(--as-success)]\" aria-hidden />\n </span>\n </div>\n ) : null}\n <div ref={scrollRef} className={cn('min-h-0 flex-1 overflow-y-auto', bodyClassName)}>\n {flatRows.map((entry, index) => renderRow(entry, index))}\n </div>\n </div>\n )\n})\n"]}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import { Input } from './chunk-GQDW6BBO.js';
|
|
2
|
+
import { ErrorBanner } from './chunk-HNMFDVMD.js';
|
|
3
|
+
import { Button } from './chunk-4WBBF5LH.js';
|
|
4
|
+
import { Badge } from './chunk-AIQJNN5B.js';
|
|
5
|
+
import { cn } from './chunk-RVVXVTH3.js';
|
|
6
|
+
import * as React from 'react';
|
|
7
|
+
import { ShieldAlert, ShieldCheck, LogIn, LogOut, ClipboardList } from 'lucide-react';
|
|
8
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
9
|
+
|
|
10
|
+
var defaultLabels = {
|
|
11
|
+
title: "Access mode",
|
|
12
|
+
modeOpen: "Open \u2014 no login",
|
|
13
|
+
modeAuthenticated: "Login required",
|
|
14
|
+
modeOpenHint: "This device boots straight in; accounts exist but no one signs in.",
|
|
15
|
+
modeAuthenticatedHint: "Everyone signs in with their own account.",
|
|
16
|
+
enableLogin: "Require login",
|
|
17
|
+
enableLoginNote: (minLength) => `Set the owner password \u2014 at least ${minLength} characters. The owner keeps admin.`,
|
|
18
|
+
disableLogin: "Remove login",
|
|
19
|
+
disableLoginNote: "Everyone with an account loses access until login is enabled again.",
|
|
20
|
+
password: "Password",
|
|
21
|
+
confirmPassword: "Confirm password",
|
|
22
|
+
passwordMismatch: "The passwords do not match.",
|
|
23
|
+
passwordTooShort: (minLength) => `Use at least ${minLength} characters.`,
|
|
24
|
+
submitEnable: "Enable login",
|
|
25
|
+
submitDisable: "Disable login",
|
|
26
|
+
confirmAck: "I understand this instance will be open to anyone with access to it.",
|
|
27
|
+
blockedServer: "Server instances always require login.",
|
|
28
|
+
blockedUsers: (count) => `Other accounts exist (${count}) \u2014 remove them before login can be removed.`,
|
|
29
|
+
auditNote: "This change is recorded in the audit log.",
|
|
30
|
+
errorGeneric: "Something went wrong \u2014 try again.",
|
|
31
|
+
errorForbidden: "Not allowed."
|
|
32
|
+
};
|
|
33
|
+
function describeInstanceModeError(error, labels) {
|
|
34
|
+
const record = typeof error === "object" && error !== null ? error : {};
|
|
35
|
+
const detail = typeof record.detail === "string" ? record.detail : "";
|
|
36
|
+
const message = typeof record.message === "string" ? record.message : "";
|
|
37
|
+
const text = detail || message;
|
|
38
|
+
if (record.status === 403) return text || labels.errorForbidden;
|
|
39
|
+
return text || labels.errorGeneric;
|
|
40
|
+
}
|
|
41
|
+
var panelClass = "space-y-3 rounded-[var(--as-radius)] border border-[var(--as-border)] bg-[var(--as-secondary)] p-3";
|
|
42
|
+
var noteClass = "flex items-start gap-1.5 text-xs text-[var(--as-muted-fg)]";
|
|
43
|
+
var InstanceModeControl = React.forwardRef(function InstanceModeControl2({
|
|
44
|
+
mode,
|
|
45
|
+
serverIdentity = false,
|
|
46
|
+
otherUserCount = 0,
|
|
47
|
+
minPasswordLength = 10,
|
|
48
|
+
onSetAuthenticated,
|
|
49
|
+
onSetOpen,
|
|
50
|
+
loading = false,
|
|
51
|
+
error = null,
|
|
52
|
+
labels,
|
|
53
|
+
icons = {},
|
|
54
|
+
className
|
|
55
|
+
}, ref) {
|
|
56
|
+
const merged = { ...defaultLabels, ...labels };
|
|
57
|
+
const [password, setPassword] = React.useState("");
|
|
58
|
+
const [confirmPassword, setConfirmPassword] = React.useState("");
|
|
59
|
+
const [acknowledged, setAcknowledged] = React.useState(false);
|
|
60
|
+
const [pending, setPending] = React.useState(false);
|
|
61
|
+
const [actionError, setActionError] = React.useState(null);
|
|
62
|
+
const [touched, setTouched] = React.useState(false);
|
|
63
|
+
const passwordRef = React.useRef(null);
|
|
64
|
+
React.useEffect(() => {
|
|
65
|
+
setPassword("");
|
|
66
|
+
setConfirmPassword("");
|
|
67
|
+
setAcknowledged(false);
|
|
68
|
+
setTouched(false);
|
|
69
|
+
setActionError(null);
|
|
70
|
+
}, [mode]);
|
|
71
|
+
const enable = mode === "open";
|
|
72
|
+
const tooShort = password.length > 0 && password.length < minPasswordLength;
|
|
73
|
+
const mismatch = confirmPassword.length > 0 && password !== confirmPassword;
|
|
74
|
+
const enableValid = password.length >= minPasswordLength && password === confirmPassword;
|
|
75
|
+
const blocked = serverIdentity || otherUserCount > 0;
|
|
76
|
+
const disableValid = !blocked && password.length > 0 && acknowledged;
|
|
77
|
+
const submit = async (event) => {
|
|
78
|
+
event.preventDefault();
|
|
79
|
+
setTouched(true);
|
|
80
|
+
if (enable ? !enableValid : !disableValid) return;
|
|
81
|
+
setPending(true);
|
|
82
|
+
setActionError(null);
|
|
83
|
+
try {
|
|
84
|
+
if (enable) {
|
|
85
|
+
await onSetAuthenticated(password);
|
|
86
|
+
} else {
|
|
87
|
+
await onSetOpen(password);
|
|
88
|
+
}
|
|
89
|
+
setPassword("");
|
|
90
|
+
setConfirmPassword("");
|
|
91
|
+
setAcknowledged(false);
|
|
92
|
+
setTouched(false);
|
|
93
|
+
} catch (cause) {
|
|
94
|
+
setActionError(describeInstanceModeError(cause, merged));
|
|
95
|
+
} finally {
|
|
96
|
+
setPending(false);
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
const ModeIcon = enable ? icons.open ?? ShieldAlert : icons.authenticated ?? ShieldCheck;
|
|
100
|
+
const ActionIcon = enable ? icons.enableLogin ?? LogIn : icons.disableLogin ?? LogOut;
|
|
101
|
+
const AuditIcon = icons.audit ?? ClipboardList;
|
|
102
|
+
return /* @__PURE__ */ jsxs("div", { ref, "data-as": "instance-mode-control", className: cn("space-y-3", className), children: [
|
|
103
|
+
error ? /* @__PURE__ */ jsx(ErrorBanner, { message: error }) : null,
|
|
104
|
+
actionError ? /* @__PURE__ */ jsx(ErrorBanner, { message: actionError }) : null,
|
|
105
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
106
|
+
/* @__PURE__ */ jsx(ModeIcon, { className: "size-4 text-[var(--as-muted-fg)]", "aria-hidden": "true" }),
|
|
107
|
+
/* @__PURE__ */ jsx("h3", { className: "text-sm font-semibold text-[var(--as-fg)]", children: merged.title }),
|
|
108
|
+
/* @__PURE__ */ jsx(Badge, { variant: enable ? "warning" : "success", children: enable ? merged.modeOpen : merged.modeAuthenticated })
|
|
109
|
+
] }),
|
|
110
|
+
/* @__PURE__ */ jsx("p", { className: "text-xs text-[var(--as-muted-fg)]", children: enable ? merged.modeOpenHint : merged.modeAuthenticatedHint }),
|
|
111
|
+
/* @__PURE__ */ jsxs("form", { className: panelClass, onSubmit: submit, noValidate: true, children: [
|
|
112
|
+
/* @__PURE__ */ jsxs("p", { className: "flex items-center gap-1.5 text-sm font-medium text-[var(--as-fg)]", children: [
|
|
113
|
+
/* @__PURE__ */ jsx(ActionIcon, { className: "size-4", "aria-hidden": "true" }),
|
|
114
|
+
enable ? merged.enableLogin : merged.disableLogin
|
|
115
|
+
] }),
|
|
116
|
+
/* @__PURE__ */ jsx("p", { className: "text-xs text-[var(--as-muted-fg)]", children: enable ? merged.enableLoginNote(minPasswordLength) : merged.disableLoginNote }),
|
|
117
|
+
/* @__PURE__ */ jsx(
|
|
118
|
+
Input,
|
|
119
|
+
{
|
|
120
|
+
ref: passwordRef,
|
|
121
|
+
type: "password",
|
|
122
|
+
autoComplete: "new-password",
|
|
123
|
+
label: merged.password,
|
|
124
|
+
value: password,
|
|
125
|
+
onChange: (event) => setPassword(event.target.value),
|
|
126
|
+
error: touched && tooShort ? merged.passwordTooShort(minPasswordLength) : void 0
|
|
127
|
+
}
|
|
128
|
+
),
|
|
129
|
+
enable ? /* @__PURE__ */ jsx(
|
|
130
|
+
Input,
|
|
131
|
+
{
|
|
132
|
+
type: "password",
|
|
133
|
+
autoComplete: "new-password",
|
|
134
|
+
label: merged.confirmPassword,
|
|
135
|
+
value: confirmPassword,
|
|
136
|
+
onChange: (event) => setConfirmPassword(event.target.value),
|
|
137
|
+
error: touched && mismatch ? merged.passwordMismatch : void 0
|
|
138
|
+
}
|
|
139
|
+
) : null,
|
|
140
|
+
!enable && blocked ? /* @__PURE__ */ jsxs("p", { className: "flex items-start gap-1.5 text-xs text-[var(--as-destructive)]", children: [
|
|
141
|
+
/* @__PURE__ */ jsx(ShieldAlert, { className: "mt-0.5 size-3.5", "aria-hidden": "true" }),
|
|
142
|
+
serverIdentity ? merged.blockedServer : merged.blockedUsers(otherUserCount)
|
|
143
|
+
] }) : null,
|
|
144
|
+
!enable ? /* @__PURE__ */ jsxs("label", { className: "flex items-start gap-2 text-xs text-[var(--as-fg)]", children: [
|
|
145
|
+
/* @__PURE__ */ jsx(
|
|
146
|
+
"input",
|
|
147
|
+
{
|
|
148
|
+
type: "checkbox",
|
|
149
|
+
checked: acknowledged,
|
|
150
|
+
onChange: (event) => setAcknowledged(event.target.checked),
|
|
151
|
+
className: "mt-0.5 size-3.5 accent-[var(--as-primary)]"
|
|
152
|
+
}
|
|
153
|
+
),
|
|
154
|
+
merged.confirmAck
|
|
155
|
+
] }) : null,
|
|
156
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
157
|
+
/* @__PURE__ */ jsx(Button, { type: "submit", size: "sm", loading: pending || loading, disabled: enable ? !enableValid : !disableValid, children: enable ? merged.submitEnable : merged.submitDisable }),
|
|
158
|
+
/* @__PURE__ */ jsxs("span", { className: noteClass, children: [
|
|
159
|
+
/* @__PURE__ */ jsx(AuditIcon, { className: "mt-0.5 size-3.5", "aria-hidden": "true" }),
|
|
160
|
+
merged.auditNote
|
|
161
|
+
] })
|
|
162
|
+
] })
|
|
163
|
+
] })
|
|
164
|
+
] });
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
export { InstanceModeControl, describeInstanceModeError };
|
|
168
|
+
//# sourceMappingURL=chunk-SNHU4PV3.js.map
|
|
169
|
+
//# sourceMappingURL=chunk-SNHU4PV3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/instance-mode-control/InstanceModeControl.tsx"],"names":["InstanceModeControl"],"mappings":"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","file":"chunk-SNHU4PV3.js","sourcesContent":["import * as React from 'react'\nimport { ClipboardList, LogIn, LogOut, ShieldAlert, ShieldCheck } from 'lucide-react'\nimport type { LucideIcon } from 'lucide-react'\n\nimport { cn } from '../../lib/utils'\nimport { Badge } from '../badge/Badge'\nimport { Button } from '../button/Button'\nimport { ErrorBanner } from '../error-banner/ErrorBanner'\nimport { Input } from '../input/Input'\n\nexport type InstanceAuthMode = 'open' | 'authenticated'\n\nexport interface InstanceModeControlLabels {\n title: string\n modeOpen: string\n modeAuthenticated: string\n modeOpenHint: string\n modeAuthenticatedHint: string\n enableLogin: string\n enableLoginNote: (minLength: number) => string\n disableLogin: string\n disableLoginNote: string\n password: string\n confirmPassword: string\n passwordMismatch: string\n passwordTooShort: (minLength: number) => string\n submitEnable: string\n submitDisable: string\n confirmAck: string\n blockedServer: string\n blockedUsers: (count: number) => string\n auditNote: string\n errorGeneric: string\n errorForbidden: string\n}\n\nexport interface InstanceModeControlIcons {\n open?: LucideIcon\n authenticated?: LucideIcon\n enableLogin?: LucideIcon\n disableLogin?: LucideIcon\n audit?: LucideIcon\n}\n\nexport interface InstanceModeControlProps {\n mode: InstanceAuthMode\n serverIdentity?: boolean\n otherUserCount?: number\n minPasswordLength?: number\n onSetAuthenticated: (password: string) => void | Promise<unknown>\n onSetOpen: (password: string) => void | Promise<unknown>\n loading?: boolean\n error?: string | null\n labels?: Partial<InstanceModeControlLabels>\n icons?: InstanceModeControlIcons\n className?: string\n}\n\nconst defaultLabels: InstanceModeControlLabels = {\n title: 'Access mode',\n modeOpen: 'Open — no login',\n modeAuthenticated: 'Login required',\n modeOpenHint: 'This device boots straight in; accounts exist but no one signs in.',\n modeAuthenticatedHint: 'Everyone signs in with their own account.',\n enableLogin: 'Require login',\n enableLoginNote: (minLength) =>\n `Set the owner password — at least ${minLength} characters. The owner keeps admin.`,\n disableLogin: 'Remove login',\n disableLoginNote: 'Everyone with an account loses access until login is enabled again.',\n password: 'Password',\n confirmPassword: 'Confirm password',\n passwordMismatch: 'The passwords do not match.',\n passwordTooShort: (minLength) => `Use at least ${minLength} characters.`,\n submitEnable: 'Enable login',\n submitDisable: 'Disable login',\n confirmAck: 'I understand this instance will be open to anyone with access to it.',\n blockedServer: 'Server instances always require login.',\n blockedUsers: (count) =>\n `Other accounts exist (${count}) — remove them before login can be removed.`,\n auditNote: 'This change is recorded in the audit log.',\n errorGeneric: 'Something went wrong — try again.',\n errorForbidden: 'Not allowed.',\n}\n\nexport function describeInstanceModeError(\n error: unknown,\n labels: Pick<InstanceModeControlLabels, 'errorGeneric' | 'errorForbidden'>,\n): string {\n const record = (typeof error === 'object' && error !== null ? error : {}) as {\n status?: unknown\n detail?: unknown\n message?: unknown\n }\n const detail = typeof record.detail === 'string' ? record.detail : ''\n const message = typeof record.message === 'string' ? record.message : ''\n const text = detail || message\n if (record.status === 403) return text || labels.errorForbidden\n return text || labels.errorGeneric\n}\n\nconst panelClass =\n 'space-y-3 rounded-[var(--as-radius)] border border-[var(--as-border)] bg-[var(--as-secondary)] p-3'\nconst noteClass = 'flex items-start gap-1.5 text-xs text-[var(--as-muted-fg)]'\n\n/**\n * Presentational + controlled instance access-mode panel (identity-auth\n * §4.5, ADR-06): shows the current mode and offers the two admin\n * transitions — `open → authenticated` (the owner sets credentials in\n * the same call) and `authenticated → open` (current password plus an\n * explicit acknowledgement). Blocked states (server entrypoint, other\n * accounts existing) disable the transition with a label-driven reason.\n * Data flows in through `mode`; the transitions are events out — the app\n * persists them and re-supplies the mode. Rejections surface as\n * label-driven messages and every change carries an audit note.\n */\nexport const InstanceModeControl = React.forwardRef<\n HTMLDivElement,\n InstanceModeControlProps\n>(function InstanceModeControl(\n {\n mode,\n serverIdentity = false,\n otherUserCount = 0,\n minPasswordLength = 10,\n onSetAuthenticated,\n onSetOpen,\n loading = false,\n error = null,\n labels,\n icons = {},\n className,\n },\n ref,\n) {\n const merged = { ...defaultLabels, ...labels }\n const [password, setPassword] = React.useState('')\n const [confirmPassword, setConfirmPassword] = React.useState('')\n const [acknowledged, setAcknowledged] = React.useState(false)\n const [pending, setPending] = React.useState(false)\n const [actionError, setActionError] = React.useState<string | null>(null)\n const [touched, setTouched] = React.useState(false)\n const passwordRef = React.useRef<HTMLInputElement>(null)\n\n React.useEffect(() => {\n setPassword('')\n setConfirmPassword('')\n setAcknowledged(false)\n setTouched(false)\n setActionError(null)\n }, [mode])\n\n const enable = mode === 'open'\n const tooShort = password.length > 0 && password.length < minPasswordLength\n const mismatch = confirmPassword.length > 0 && password !== confirmPassword\n const enableValid = password.length >= minPasswordLength && password === confirmPassword\n const blocked = serverIdentity || otherUserCount > 0\n const disableValid = !blocked && password.length > 0 && acknowledged\n\n const submit = async (event: React.FormEvent) => {\n event.preventDefault()\n setTouched(true)\n if (enable ? !enableValid : !disableValid) return\n setPending(true)\n setActionError(null)\n try {\n if (enable) {\n await onSetAuthenticated(password)\n } else {\n await onSetOpen(password)\n }\n setPassword('')\n setConfirmPassword('')\n setAcknowledged(false)\n setTouched(false)\n } catch (cause) {\n setActionError(describeInstanceModeError(cause, merged))\n } finally {\n setPending(false)\n }\n }\n\n const ModeIcon = enable\n ? (icons.open ?? ShieldAlert)\n : (icons.authenticated ?? ShieldCheck)\n const ActionIcon = enable ? (icons.enableLogin ?? LogIn) : (icons.disableLogin ?? LogOut)\n const AuditIcon = icons.audit ?? ClipboardList\n\n return (\n <div ref={ref} data-as=\"instance-mode-control\" className={cn('space-y-3', className)}>\n {error ? <ErrorBanner message={error} /> : null}\n {actionError ? <ErrorBanner message={actionError} /> : null}\n <div className=\"flex items-center gap-2\">\n <ModeIcon className=\"size-4 text-[var(--as-muted-fg)]\" aria-hidden=\"true\" />\n <h3 className=\"text-sm font-semibold text-[var(--as-fg)]\">{merged.title}</h3>\n <Badge variant={enable ? 'warning' : 'success'}>\n {enable ? merged.modeOpen : merged.modeAuthenticated}\n </Badge>\n </div>\n <p className=\"text-xs text-[var(--as-muted-fg)]\">\n {enable ? merged.modeOpenHint : merged.modeAuthenticatedHint}\n </p>\n <form className={panelClass} onSubmit={submit} noValidate>\n <p className=\"flex items-center gap-1.5 text-sm font-medium text-[var(--as-fg)]\">\n <ActionIcon className=\"size-4\" aria-hidden=\"true\" />\n {enable ? merged.enableLogin : merged.disableLogin}\n </p>\n <p className=\"text-xs text-[var(--as-muted-fg)]\">\n {enable ? merged.enableLoginNote(minPasswordLength) : merged.disableLoginNote}\n </p>\n <Input\n ref={passwordRef}\n type=\"password\"\n autoComplete=\"new-password\"\n label={merged.password}\n value={password}\n onChange={(event) => setPassword(event.target.value)}\n error={\n touched && tooShort ? merged.passwordTooShort(minPasswordLength) : undefined\n }\n />\n {enable ? (\n <Input\n type=\"password\"\n autoComplete=\"new-password\"\n label={merged.confirmPassword}\n value={confirmPassword}\n onChange={(event) => setConfirmPassword(event.target.value)}\n error={touched && mismatch ? merged.passwordMismatch : undefined}\n />\n ) : null}\n {!enable && blocked ? (\n <p className=\"flex items-start gap-1.5 text-xs text-[var(--as-destructive)]\">\n <ShieldAlert className=\"mt-0.5 size-3.5\" aria-hidden=\"true\" />\n {serverIdentity\n ? merged.blockedServer\n : merged.blockedUsers(otherUserCount)}\n </p>\n ) : null}\n {!enable ? (\n <label className=\"flex items-start gap-2 text-xs text-[var(--as-fg)]\">\n <input\n type=\"checkbox\"\n checked={acknowledged}\n onChange={(event) => setAcknowledged(event.target.checked)}\n className=\"mt-0.5 size-3.5 accent-[var(--as-primary)]\"\n />\n {merged.confirmAck}\n </label>\n ) : null}\n <div className=\"flex items-center gap-2\">\n <Button type=\"submit\" size=\"sm\" loading={pending || loading} disabled={enable ? !enableValid : !disableValid}>\n {enable ? merged.submitEnable : merged.submitDisable}\n </Button>\n <span className={noteClass}>\n <AuditIcon className=\"mt-0.5 size-3.5\" aria-hidden=\"true\" />\n {merged.auditNote}\n </span>\n </div>\n </form>\n </div>\n )\n})\n"]}
|
|
@@ -130,6 +130,7 @@ var ComboboxPanel = React.forwardRef(
|
|
|
130
130
|
onOpenChange,
|
|
131
131
|
searchPlaceholder,
|
|
132
132
|
searchLabel = "Search options",
|
|
133
|
+
panelLabel,
|
|
133
134
|
emptyLabel,
|
|
134
135
|
loading,
|
|
135
136
|
loadingLabel,
|
|
@@ -180,6 +181,7 @@ var ComboboxPanel = React.forwardRef(
|
|
|
180
181
|
ref,
|
|
181
182
|
align: "start",
|
|
182
183
|
collisionPadding: 8,
|
|
184
|
+
"aria-label": panelLabel,
|
|
183
185
|
onOpenAutoFocus: (event) => {
|
|
184
186
|
event.preventDefault();
|
|
185
187
|
const panel = event.currentTarget;
|
|
@@ -360,6 +362,7 @@ var Combobox = React.forwardRef(function Combobox2({
|
|
|
360
362
|
onOpenChange: handleOpenChange,
|
|
361
363
|
searchPlaceholder,
|
|
362
364
|
searchLabel,
|
|
365
|
+
panelLabel: typeof label === "string" ? label : placeholder || "Options",
|
|
363
366
|
emptyLabel,
|
|
364
367
|
loading,
|
|
365
368
|
loadingLabel,
|
|
@@ -474,6 +477,7 @@ var ComboboxMulti = React.forwardRef(
|
|
|
474
477
|
onOpenChange: handleOpenChange,
|
|
475
478
|
searchPlaceholder,
|
|
476
479
|
searchLabel,
|
|
480
|
+
panelLabel: typeof label === "string" ? label : placeholder || "Options",
|
|
477
481
|
emptyLabel,
|
|
478
482
|
loading,
|
|
479
483
|
loadingLabel,
|
|
@@ -488,5 +492,5 @@ var ComboboxMulti = React.forwardRef(
|
|
|
488
492
|
);
|
|
489
493
|
|
|
490
494
|
export { Combobox, ComboboxMulti };
|
|
491
|
-
//# sourceMappingURL=chunk-
|
|
492
|
-
//# sourceMappingURL=chunk-
|
|
495
|
+
//# sourceMappingURL=chunk-SVRCZUNQ.js.map
|
|
496
|
+
//# sourceMappingURL=chunk-SVRCZUNQ.js.map
|