@arbidocs/blocks 0.4.39 → 0.4.41
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/dist/agents/index.cjs +222 -220
- package/dist/agents/index.js +3 -1
- package/dist/agents/tasks/TaskInbox.d.ts +1 -1
- package/dist/agents/tasks/TaskStartDialog.d.ts +11 -3
- package/dist/agents/tasks/taskRequest.d.ts +3 -0
- package/dist/chat/index.cjs +127 -126
- package/dist/chat/index.js +3 -2
- package/dist/chunk-3VQYJBOI.js +76 -0
- package/dist/chunk-3VQYJBOI.js.map +1 -0
- package/dist/{chunk-SWON6O45.js → chunk-7L3KPYD2.js} +3 -3
- package/dist/{chunk-SWON6O45.js.map → chunk-7L3KPYD2.js.map} +1 -1
- package/dist/{chunk-LQITIYBN.js → chunk-CA7JD6IX.js} +3 -3
- package/dist/{chunk-LQITIYBN.js.map → chunk-CA7JD6IX.js.map} +1 -1
- package/dist/{chunk-CHVFO74Y.cjs → chunk-DIOTMJTC.cjs} +155 -37
- package/dist/chunk-DIOTMJTC.cjs.map +1 -0
- package/dist/{chunk-ZXYHBQFW.js → chunk-E3U5GYAP.js} +5 -72
- package/dist/chunk-E3U5GYAP.js.map +1 -0
- package/dist/{chunk-SKFSJHVU.cjs → chunk-LR54PQ7N.cjs} +4 -4
- package/dist/{chunk-SKFSJHVU.cjs.map → chunk-LR54PQ7N.cjs.map} +1 -1
- package/dist/{chunk-EEGPWOOG.cjs → chunk-NT3WEHL5.cjs} +5 -5
- package/dist/{chunk-EEGPWOOG.cjs.map → chunk-NT3WEHL5.cjs.map} +1 -1
- package/dist/{chunk-KFR4GKHS.js → chunk-PG2RWOGF.js} +155 -37
- package/dist/chunk-PG2RWOGF.js.map +1 -0
- package/dist/{chunk-KMYLQIOH.cjs → chunk-UW3IHMYA.cjs} +4 -72
- package/dist/chunk-UW3IHMYA.cjs.map +1 -0
- package/dist/chunk-V3L5DONY.cjs +78 -0
- package/dist/chunk-V3L5DONY.cjs.map +1 -0
- package/dist/connect/index.cjs +12 -11
- package/dist/connect/index.cjs.map +1 -1
- package/dist/connect/index.js +3 -2
- package/dist/connect/index.js.map +1 -1
- package/dist/index.cjs +462 -461
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +6 -5
- package/dist/index.js.map +1 -1
- package/dist/settings/index.cjs +1 -1
- package/dist/settings/index.js +1 -1
- package/dist/studio/index.cjs +4 -3
- package/dist/studio/index.cjs.map +1 -1
- package/dist/studio/index.js +3 -2
- package/dist/studio/index.js.map +1 -1
- package/dist/workspaces/WorkspaceSettingsParts.d.ts +2 -0
- package/dist/workspaces/index.cjs +4 -1
- package/dist/workspaces/index.cjs.map +1 -1
- package/dist/workspaces/index.js +5 -2
- package/dist/workspaces/index.js.map +1 -1
- package/package.json +4 -4
- package/src/docx/styles.css +6 -0
- package/dist/chunk-CHVFO74Y.cjs.map +0 -1
- package/dist/chunk-KFR4GKHS.js.map +0 -1
- package/dist/chunk-KMYLQIOH.cjs.map +0 -1
- package/dist/chunk-ZXYHBQFW.js.map +0 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/Toolbar.tsx","../src/components/EntityIdentityBar.tsx","../src/components/EntityTooltip.tsx","../src/components/AskBar.tsx"],"names":["jsxs","cn","jsx","Search","Input","useState","useEffect","Textarea","Pencil","useRef","Button","Sparkles"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { ReactNode } from 'react'\nimport { Search } from 'lucide-react'\nimport { Input, cn } from '@arbidocs/react/ui'\n\n/** Search + filter bar used above every list view. */\nexport function Toolbar({\n search,\n onSearch,\n searchPlaceholder = 'Search…',\n filters,\n actions,\n className,\n testId,\n}: {\n search?: string\n onSearch?: (v: string) => void\n searchPlaceholder?: string\n filters?: ReactNode\n actions?: ReactNode\n className?: string\n testId?: string\n}) {\n return (\n <div\n className={cn(\n 'flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between',\n className\n )}\n data-testid={testId}\n >\n <div className=\"flex flex-1 flex-wrap items-center gap-2\">\n {onSearch && (\n <div className=\"relative w-full max-w-xs\">\n <Search className=\"pointer-events-none absolute left-2.5 top-1/2 size-4 -translate-y-1/2 text-muted-foreground\" />\n <Input\n value={search}\n onChange={(e) => onSearch(e.target.value)}\n placeholder={searchPlaceholder}\n className=\"bg-card text-sm placeholder:text-muted-foreground focus-visible:border-ring/60 focus-visible:ring-2 focus-visible:ring-ring pl-8\"\n data-testid={testId ? `${testId}-search` : 'toolbar-search'}\n />\n </div>\n )}\n {filters}\n </div>\n {actions && <div className=\"flex items-center gap-2\">{actions}</div>}\n </div>\n )\n}\n","import { useEffect, useState, type ReactNode } from 'react'\nimport { Pencil } from 'lucide-react'\nimport { Input, Textarea, cn } from '@arbidocs/react/ui'\n\n/** Longest a name may be. Exported so a form editing the same field agrees. */\nexport const IDENTITY_NAME_MAX_LENGTH = 50\n\n/** Shown once the remaining allowance gets this low, not for the whole time. */\nconst COUNTER_THRESHOLD = 10\n\nexport interface EntityIdentityField {\n /** Row caption. Rendered with a trailing colon. */\n label: string\n value: string\n /** Stands in for an empty value, in italics — never a blank row. */\n placeholder: string\n /** Commits the edit. Not called when the value is unchanged. */\n onSave: (next: string) => void\n /** A description needs line breaks; a name does not. */\n multiline?: boolean\n /** Caps the input and shows a counter as it fills. Names only, by default. */\n maxLength?: number\n /** Classes for the read-mode value, e.g. a larger weight for the name. */\n valueClassName?: string\n /**\n * Content pinned to the RIGHT END of this row — e.g. the owning project\n * beside a name, a member stack beside a status. Rows without one let their\n * value run the full width, which is what a description wants.\n */\n trailing?: ReactNode\n /**\n * Content rendered immediately BEFORE the value — the entity's own mark.\n * Sits outside the edit swap, so starting to edit the name doesn't make the\n * icon jump or disappear.\n */\n leading?: ReactNode\n /**\n * Drops the caption from view for this row, leaving the value flush left.\n * For a field whose value already says what it is — a workspace's name and\n * description read as exactly that — the caption is a word the eye has to\n * step over on the way in. The caption stays in the markup for screen\n * readers, which have no such visual cue to fall back on.\n */\n hideLabel?: boolean\n /** Row test id; the pencil and input derive `-edit` and `-input`. */\n testId?: string\n}\n\nexport interface EntityIdentityBarProps {\n /** The editable text fields, in order. Usually name then description. */\n fields: EntityIdentityField[]\n /**\n * Read-only rows shown after the editable ones — anything whose control the\n * consumer owns (a project picker, an owner avatar, a status). Rendered with\n * the same caption column so every row lines up.\n */\n extraRows?: { label: string; content: ReactNode; trailing?: ReactNode; testId?: string }[]\n /** Hides every pencil. A viewer without permission sees values, not controls. */\n canEdit?: boolean\n /** Trailing controls, pinned right — e.g. a member stack, a status. */\n actions?: ReactNode\n /**\n * Controls that act on the ENTITY rather than on any one field — typically an\n * overflow menu holding delete or leave. Sits under the field list, where a\n * destructive action is findable but not in the path of everyday reading.\n */\n footer?: ReactNode\n className?: string\n testId?: string\n}\n\n/**\n * The \"what am I looking at\" bar for an entity's own page.\n *\n * A caption column (`Name:`, `Description:`, `Project:`) and a value column. The\n * captions are the point: a bare bold string at the top of a page reads equally\n * as a workspace, a project, a case file or a folder, and people read it as\n * whichever they expected. Saying which field is which costs one column and\n * removes the ambiguity entirely.\n *\n * Editing happens in place. The pencil is always visible to someone who can use\n * it rather than revealed on hover — a control you have to go hunting for is one\n * most people never find, and hover doesn't exist on touch. Commit is on blur\n * and on Enter (single-line fields only, so a description can hold line\n * breaks); Escape abandons the edit.\n *\n * Deliberately NOT a form: no submit, no dirty state, no field-level errors.\n * When a consumer needs visibility toggles, destructive actions or validation\n * messages, those belong in its settings form — this bar is the identity of the\n * thing, shown where you are working on it.\n *\n * Styled with SEMANTIC tokens only, so every host gets it in its own colours.\n */\nexport function EntityIdentityBar({\n fields,\n extraRows = [],\n canEdit = false,\n actions,\n footer,\n className,\n testId,\n}: EntityIdentityBarProps) {\n return (\n <div\n className={cn('flex flex-wrap items-start justify-between gap-x-6 gap-y-3', className)}\n data-testid={testId}\n >\n <dl className=\"min-w-0 flex-1 space-y-1.5\">\n {fields.map((field) => (\n <IdentityFieldRow key={field.label} field={field} canEdit={canEdit} />\n ))}\n {extraRows.map((row) => (\n <div\n key={row.label}\n className=\"flex min-h-7 min-w-0 items-center gap-2\"\n data-testid={row.testId}\n >\n <dt className=\"w-24 shrink-0 text-sm font-medium text-muted-foreground\">\n {row.label}:\n </dt>\n <dd className=\"flex min-w-0 flex-1 items-center gap-2\">\n {row.content}\n {row.trailing ? (\n <div className=\"min-w-0 shrink-0 sm:ml-auto\">{row.trailing}</div>\n ) : null}\n </dd>\n </div>\n ))}\n {footer ? <div className=\"flex items-center pt-0.5\">{footer}</div> : null}\n </dl>\n {actions ? <div className=\"flex shrink-0 items-center gap-2\">{actions}</div> : null}\n </div>\n )\n}\n\nfunction IdentityFieldRow({ field, canEdit }: { field: EntityIdentityField; canEdit: boolean }) {\n const {\n label,\n value,\n placeholder,\n onSave,\n multiline = false,\n maxLength,\n valueClassName,\n leading,\n hideLabel,\n trailing,\n testId,\n } = field\n\n const [isEditing, setIsEditing] = useState(false)\n const [draft, setDraft] = useState(value)\n\n // Track the value while not editing, so an update from elsewhere (another\n // tab, a websocket) doesn't get overwritten by a stale draft on the next edit.\n useEffect(() => {\n if (!isEditing) setDraft(value)\n }, [value, isEditing])\n\n const commit = () => {\n setIsEditing(false)\n const next = draft.trim()\n if (next !== value) onSave(next)\n }\n\n const cancel = () => {\n setDraft(value)\n setIsEditing(false)\n }\n\n const charsLeft = maxLength === undefined ? null : maxLength - draft.length\n\n // Editing must not move anything. The input carries the read view's exact\n // typography and padding, drops the border and shadow entirely, and marks\n // focus with a contrasting FIELD instead — a box appearing around the text\n // (and the row growing to fit it) reads as the page jumping under the cursor.\n const fieldClass =\n 'h-auto rounded border-0 bg-muted px-1.5 py-0.5 shadow-none focus-visible:ring-0 focus-visible:ring-offset-0'\n\n const shared = {\n autoFocus: true,\n value: draft,\n placeholder,\n maxLength,\n 'aria-label': label,\n 'data-testid': testId && `${testId}-input`,\n onBlur: commit,\n onChange: (e: { target: { value: string } }) => setDraft(e.target.value),\n onKeyDown: (e: React.KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault()\n cancel()\n } else if (e.key === 'Enter' && !multiline) {\n e.preventDefault()\n commit()\n }\n },\n }\n\n // Every row shares one minimum height: that of the small controls (h-7) a\n // row may carry at its trailing end. A row that is only text then sits in\n // the same rhythm as one holding a button, so the captions fall on an even\n // beat down the bar instead of bunching up wherever a row has no control.\n return (\n <div className={cn('flex min-h-7 min-w-0 gap-2', multiline ? 'items-start' : 'items-center')}>\n <dt\n className={cn(\n hideLabel\n ? 'sr-only'\n : cn('w-24 shrink-0 text-sm font-medium text-muted-foreground', multiline && 'pt-1')\n )}\n >\n {label}:\n </dt>\n {/* Wraps under sm: the trailing controls drop to their own line instead of overflowing. */}\n <dd className=\"flex min-w-0 flex-1 flex-wrap items-center gap-x-2 gap-y-1.5 sm:flex-nowrap\">\n {leading}\n {isEditing ? (\n <div className=\"relative min-w-0 flex-1 max-sm:basis-[calc(100%-2.5rem)]\">\n {multiline ? (\n <Textarea\n {...shared}\n rows={2}\n className={cn(fieldClass, 'min-h-0 resize-none leading-snug', valueClassName)}\n />\n ) : (\n <Input {...shared} className={cn(fieldClass, 'pr-20', valueClassName)} />\n )}\n {charsLeft !== null && charsLeft <= COUNTER_THRESHOLD && (\n <span\n className={cn(\n 'pointer-events-none absolute right-3 top-1/2 hidden -translate-y-1/2 text-sm lg:block',\n charsLeft < 0 ? 'text-destructive' : 'text-muted-foreground'\n )}\n data-testid={testId && `${testId}-counter`}\n >\n {charsLeft < 0 ? `${-charsLeft} over` : `${charsLeft} left`}\n </span>\n )}\n </div>\n ) : (\n // `identity-field` (not the generic `group`) scopes the pencil's hover\n // to THIS field only — an ancestor card also carries `group`, so a\n // `.group:hover` rule would reveal every field's pencil at once.\n <span className=\"identity-field flex min-w-0 flex-1 items-center gap-1.5 sm:flex-none\">\n {/* Same padding as the input above — the swap must not nudge the\n text sideways or change the row's height. */}\n <span className={cn('px-1.5 py-0.5', valueClassName)} data-testid={testId}>\n {value || <span className=\"italic text-muted-foreground\">{placeholder}</span>}\n </span>\n {canEdit && (\n <button\n type=\"button\"\n onClick={() => setIsEditing(true)}\n aria-label={`Edit ${label.toLowerCase()}`}\n title={`Edit ${label.toLowerCase()}`}\n // Quiet by default — the pencil only surfaces when the row is\n // hovered so it reads as clean text, and stays reachable by\n // keyboard (focus-visible).\n //\n // NB: use the ungated `[.identity-field:hover_&]` selector rather\n // than Tailwind's `group-hover:`. The latter compiles behind\n // `@media (hover: hover)`, so on a touchscreen (whose PRIMARY\n // pointer reports `hover: none`) the rule is disabled even when a\n // real mouse is firing hover events — the pencil then stays at\n // opacity-0 forever. The arbitrary selector has no media gate, so\n // it reveals on any genuine `:hover`.\n className=\"shrink-0 cursor-pointer rounded p-1 text-muted-foreground opacity-60 transition-[color,background-color,opacity] hover:bg-accent hover:text-foreground focus-visible:opacity-100 pointer-coarse:p-[15px] [.identity-field:hover_&]:opacity-100\"\n data-testid={testId && `${testId}-edit`}\n >\n <Pencil className=\"size-3.5\" />\n </button>\n )}\n </span>\n )}\n {trailing ? (\n <div className=\"min-w-0 shrink-0 max-sm:w-full sm:ml-auto\">{trailing}</div>\n ) : null}\n </dd>\n </div>\n )\n}\n","import type { ReactNode } from 'react'\nimport { cn } from '@arbidocs/react/ui'\n\n/**\n * Parts for the hover card of an entity pill (workspace, user, tag, ...): a header, optional\n * stat rows, bordered sections and an action hint. The host fills them from its own data.\n */\n\nexport function EntityTooltip({\n className,\n children,\n}: {\n className?: string\n children: ReactNode\n}) {\n return (\n <div data-slot=\"entity-tooltip\" className={cn('flex flex-col gap-2', className)}>\n {children}\n </div>\n )\n}\n\nexport interface EntityTooltipHeaderProps {\n /** Icon / avatar before the title. */\n lead: ReactNode\n title: ReactNode\n subtitle?: ReactNode\n /** Right-hand badge. */\n trailing?: ReactNode\n /** Extra glyph after the title (e.g. an agent mark). */\n titleAccessory?: ReactNode\n}\n\nexport function EntityTooltipHeader({\n lead,\n title,\n subtitle,\n trailing,\n titleAccessory,\n}: EntityTooltipHeaderProps) {\n return (\n <div className=\"flex items-center gap-2\">\n {lead}\n <div className=\"flex min-w-0 flex-1 flex-col\">\n <div className=\"flex items-center gap-1.5\">\n <span className=\"truncate text-sm font-medium\">{title}</span>\n {titleAccessory}\n </div>\n {subtitle && <span className=\"truncate text-xs text-muted-foreground\">{subtitle}</span>}\n </div>\n {trailing}\n </div>\n )\n}\n\nexport interface EntityTooltipStat {\n key: string\n icon: ReactNode\n label: ReactNode\n value: ReactNode\n}\n\n/** Label/value rows between two rules. */\nexport function EntityTooltipStats({ stats }: { stats: EntityTooltipStat[] }) {\n return (\n <div className=\"flex flex-col gap-1.5 border-y border-border py-2\">\n {stats.map((s) => (\n <div key={s.key} className=\"flex items-center justify-between text-sm\">\n <div className=\"flex items-center gap-2\">\n {s.icon}\n <span className=\"text-muted-foreground\">{s.label}</span>\n </div>\n <span className=\"font-medium\">{s.value}</span>\n </div>\n ))}\n </div>\n )\n}\n\n/** A secondary section under a rule, optionally headed by an icon + text. */\nexport function EntityTooltipSection({\n icon,\n heading,\n children,\n}: {\n icon?: ReactNode\n heading?: ReactNode\n children?: ReactNode\n}) {\n return (\n <div className=\"flex flex-col gap-1.5 border-t border-border pt-2\">\n {heading && (\n <div className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n {icon}\n <span>{heading}</span>\n </div>\n )}\n {children}\n </div>\n )\n}\n\n/** Muted one-liner at the foot of the card, e.g. \"Click to send message\". */\nexport function EntityTooltipHint({\n icon,\n children,\n isRuled,\n}: {\n icon?: ReactNode\n children: ReactNode\n /** Draw the rule above (the hint closes a card that already has sections). */\n isRuled?: boolean\n}) {\n return (\n <div\n className={cn(\n 'flex items-center gap-1.5 text-xs text-muted-foreground',\n isRuled && 'border-t border-border pt-1'\n )}\n >\n {icon}\n <span>{children}</span>\n </div>\n )\n}\n","/**\n * A question box that IS the product's front door, not a link to one.\n *\n * One input, two destinations: Enter (or the arrow) ASKS — hands the trimmed\n * text to `onAsk`, the conversational answer — while the Search button beside\n * it hands the same text to `onSearch`, the retrieval experience. The split\n * matters because queries come in both registers (\"what does\n * this term mean\" vs \"find every mention of it\") and making them choose a\n * page before typing kills the impulse. Omit `onSearch` and the bar is a plain\n * ask composer.\n *\n * The consumer owns what asking and searching mean (start a chat, run smart\n * search, open a record). Suggestion chips prefill the input rather than\n * firing immediately: a suggestion is a starting point you edit, not a button\n * you regret.\n *\n * Styled with SEMANTIC tokens only (card, border, foreground, muted-foreground,\n * primary), so every host gets it in its own colours.\n */\n\nimport { useRef, useState, type KeyboardEventHandler, type ReactNode, type RefObject } from 'react'\nimport { Search, Sparkles } from 'lucide-react'\nimport { Button, cn } from '@arbidocs/react/ui'\n\nexport interface AskBarProps {\n /** Receives the trimmed question; the caller owns what asking means. */\n onAsk: (text: string) => void\n /** Second destination for the same text — retrieval. Omit to hide. */\n onSearch?: (text: string) => void\n /** Prefill-on-click starter questions, shown under the input. */\n suggestions?: string[]\n placeholder?: string\n askLabel?: string\n searchLabel?: string\n /** Controlled value. Omit for the bar to own its own text. */\n value?: string\n onValueChange?: (value: string) => void\n /** Raw keydown on the input — lets a consumer run an autocomplete\n * (arrow/Enter/Tab/Escape) before the form's own submit handling.\n * preventDefault() on Enter suppresses the submit. */\n onInputKeyDown?: KeyboardEventHandler<HTMLInputElement>\n /** Popover anchored to the pill (e.g. a slash-command menu). Rendered in a\n * relative wrapper around the form, so absolute children position against\n * the pill. */\n menu?: ReactNode\n /** External input ref, for consumers that refocus after menu selection. */\n inputRef?: RefObject<HTMLInputElement | null>\n className?: string\n /** Root test id; children derive `-input`, `-submit`, `-search`, `-suggestion`. */\n testId?: string\n}\n\nexport function AskBar({\n onAsk,\n onSearch,\n suggestions = [],\n placeholder = 'Ask anything…',\n askLabel = 'Ask',\n searchLabel = 'Search',\n value,\n onValueChange,\n onInputKeyDown,\n menu,\n inputRef: externalInputRef,\n className,\n testId = 'ask-bar',\n}: AskBarProps) {\n const [innerText, setInnerText] = useState('')\n const text = value !== undefined ? value : innerText\n const setText = (next: string) => {\n onValueChange?.(next)\n if (value === undefined) setInnerText(next)\n }\n const localInputRef = useRef<HTMLInputElement>(null)\n const inputRef = externalInputRef ?? localInputRef\n\n const submitTo = (handler: (text: string) => void) => {\n const question = text.trim()\n if (!question) return\n handler(question)\n setText('')\n }\n\n return (\n <div className={cn('flex flex-col gap-2', className)} data-testid={testId}>\n <div className=\"relative\">\n {menu}\n <form\n onSubmit={(e) => {\n e.preventDefault()\n submitTo(onAsk)\n }}\n // The AppHeader search pill's language exactly — rounded-md,\n // border-input, magnifier left, muted text — so the bar sits in a\n // topbar the way a ⌘K trigger does, not like a chat composer\n // dropped into a header.\n className=\"flex h-12 items-center gap-1.5 rounded-md border border-border/50 bg-background pl-3 pr-1.5 transition-colors focus-within:border-border\"\n >\n <Search className=\"pointer-events-none size-4 shrink-0 text-muted-foreground\" />\n <input\n ref={inputRef}\n type=\"text\"\n value={text}\n onChange={(e) => setText(e.target.value)}\n onKeyDown={onInputKeyDown}\n placeholder={placeholder}\n className=\"h-8 min-w-0 flex-1 bg-transparent text-sm text-foreground outline-none placeholder:text-muted-foreground\"\n data-testid={testId && `${testId}-input`}\n />\n {onSearch && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n disabled={!text.trim()}\n onClick={() => submitTo(onSearch)}\n className=\"h-8 shrink-0 px-2.5 text-xs font-medium text-muted-foreground hover:text-foreground\"\n data-testid={testId && `${testId}-search`}\n >\n {searchLabel}\n </Button>\n )}\n {/* The primary door wears the Ask AI anatomy: Sparkles + label. */}\n <Button\n type=\"submit\"\n size=\"sm\"\n disabled={!text.trim()}\n className=\"h-8 shrink-0 px-3 text-xs font-medium\"\n data-testid={testId && `${testId}-submit`}\n >\n <Sparkles className=\"size-3.5\" />\n {askLabel}\n </Button>\n </form>\n </div>\n {suggestions.length > 0 && (\n <div className=\"flex flex-wrap gap-1.5\">\n {suggestions.map((s) => (\n <button\n key={s}\n type=\"button\"\n onClick={() => {\n setText(s)\n inputRef.current?.focus()\n }}\n className=\"rounded-full border border-border/50 bg-card px-3 py-1 text-xs text-muted-foreground transition-colors hover:border-border hover:bg-accent hover:text-foreground\"\n data-testid={testId && `${testId}-suggestion`}\n >\n {s}\n </button>\n ))}\n </div>\n )}\n </div>\n )\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/Toolbar.tsx","../src/components/EntityIdentityBar.tsx","../src/components/EntityTooltip.tsx","../src/components/AskBar.tsx"],"names":["jsxs","cn","jsx","Search","Input","useState","useEffect","Textarea","Pencil","useRef","Button","Sparkles"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { ReactNode } from 'react'\nimport { Search } from 'lucide-react'\nimport { Input, cn } from '@arbidocs/react/ui'\n\n/** Search + filter bar used above every list view. */\nexport function Toolbar({\n search,\n onSearch,\n searchPlaceholder = 'Search…',\n filters,\n actions,\n className,\n testId,\n}: {\n search?: string\n onSearch?: (v: string) => void\n searchPlaceholder?: string\n filters?: ReactNode\n actions?: ReactNode\n className?: string\n testId?: string\n}) {\n return (\n <div\n className={cn(\n 'flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between',\n className\n )}\n data-testid={testId}\n >\n <div className=\"flex flex-1 flex-wrap items-center gap-2\">\n {onSearch && (\n <div className=\"relative w-full max-w-xs\">\n <Search className=\"pointer-events-none absolute left-2.5 top-1/2 size-4 -translate-y-1/2 text-muted-foreground\" />\n <Input\n value={search}\n onChange={(e) => onSearch(e.target.value)}\n placeholder={searchPlaceholder}\n className=\"bg-card text-sm placeholder:text-muted-foreground focus-visible:border-ring/60 focus-visible:ring-2 focus-visible:ring-ring pl-8\"\n data-testid={testId ? `${testId}-search` : 'toolbar-search'}\n />\n </div>\n )}\n {filters}\n </div>\n {actions && <div className=\"flex items-center gap-2\">{actions}</div>}\n </div>\n )\n}\n","import { useEffect, useState, type ReactNode } from 'react'\nimport { Pencil } from 'lucide-react'\nimport { Input, Textarea, cn } from '@arbidocs/react/ui'\n\n/** Longest a name may be. Exported so a form editing the same field agrees. */\nexport const IDENTITY_NAME_MAX_LENGTH = 50\n\n/** Shown once the remaining allowance gets this low, not for the whole time. */\nconst COUNTER_THRESHOLD = 10\n\nexport interface EntityIdentityField {\n /** Row caption. Rendered with a trailing colon. */\n label: string\n value: string\n /** Stands in for an empty value, in italics — never a blank row. */\n placeholder: string\n /** Commits the edit. Not called when the value is unchanged. */\n onSave: (next: string) => void\n /** A description needs line breaks; a name does not. */\n multiline?: boolean\n /** Caps the input and shows a counter as it fills. Names only, by default. */\n maxLength?: number\n /** Classes for the read-mode value, e.g. a larger weight for the name. */\n valueClassName?: string\n /**\n * Content pinned to the RIGHT END of this row — e.g. the owning project\n * beside a name, a member stack beside a status. Rows without one let their\n * value run the full width, which is what a description wants.\n */\n trailing?: ReactNode\n /**\n * Content rendered immediately BEFORE the value — the entity's own mark.\n * Sits outside the edit swap, so starting to edit the name doesn't make the\n * icon jump or disappear.\n */\n leading?: ReactNode\n /**\n * Drops the caption from view for this row, leaving the value flush left.\n * For a field whose value already says what it is — a workspace's name and\n * description read as exactly that — the caption is a word the eye has to\n * step over on the way in. The caption stays in the markup for screen\n * readers, which have no such visual cue to fall back on.\n */\n hideLabel?: boolean\n /** Row test id; the pencil and input derive `-edit` and `-input`. */\n testId?: string\n}\n\nexport interface EntityIdentityBarProps {\n /** The editable text fields, in order. Usually name then description. */\n fields: EntityIdentityField[]\n /**\n * Read-only rows shown after the editable ones — anything whose control the\n * consumer owns (a project picker, an owner avatar, a status). Rendered with\n * the same caption column so every row lines up.\n */\n extraRows?: { label: string; content: ReactNode; trailing?: ReactNode; testId?: string }[]\n /** Hides every pencil. A viewer without permission sees values, not controls. */\n canEdit?: boolean\n /** Trailing controls, pinned right — e.g. a member stack, a status. */\n actions?: ReactNode\n /**\n * Controls that act on the ENTITY rather than on any one field — typically an\n * overflow menu holding delete or leave. Sits under the field list, where a\n * destructive action is findable but not in the path of everyday reading.\n */\n footer?: ReactNode\n className?: string\n testId?: string\n}\n\n/**\n * The \"what am I looking at\" bar for an entity's own page.\n *\n * A caption column (`Name:`, `Description:`, `Project:`) and a value column. The\n * captions are the point: a bare bold string at the top of a page reads equally\n * as a workspace, a project, a case file or a folder, and people read it as\n * whichever they expected. Saying which field is which costs one column and\n * removes the ambiguity entirely.\n *\n * Editing happens in place. The pencil is always visible to someone who can use\n * it rather than revealed on hover — a control you have to go hunting for is one\n * most people never find, and hover doesn't exist on touch. Commit is on blur\n * and on Enter (single-line fields only, so a description can hold line\n * breaks); Escape abandons the edit.\n *\n * Deliberately NOT a form: no submit, no dirty state, no field-level errors.\n * When a consumer needs visibility toggles, destructive actions or validation\n * messages, those belong in its settings form — this bar is the identity of the\n * thing, shown where you are working on it.\n *\n * Styled with SEMANTIC tokens only, so every host gets it in its own colours.\n */\nexport function EntityIdentityBar({\n fields,\n extraRows = [],\n canEdit = false,\n actions,\n footer,\n className,\n testId,\n}: EntityIdentityBarProps) {\n return (\n <div\n className={cn('flex flex-wrap items-start justify-between gap-x-6 gap-y-3', className)}\n data-testid={testId}\n >\n <dl className=\"min-w-0 flex-1 space-y-1.5\">\n {fields.map((field) => (\n <IdentityFieldRow key={field.label} field={field} canEdit={canEdit} />\n ))}\n {extraRows.map((row) => (\n <div\n key={row.label}\n className=\"flex min-h-7 min-w-0 items-center gap-2\"\n data-testid={row.testId}\n >\n <dt className=\"w-24 shrink-0 text-sm font-medium text-muted-foreground\">\n {row.label}:\n </dt>\n <dd className=\"flex min-w-0 flex-1 items-center gap-2\">\n {row.content}\n {row.trailing ? (\n <div className=\"min-w-0 shrink-0 sm:ml-auto\">{row.trailing}</div>\n ) : null}\n </dd>\n </div>\n ))}\n {footer ? <div className=\"flex items-center pt-0.5\">{footer}</div> : null}\n </dl>\n {actions ? <div className=\"flex shrink-0 items-center gap-2\">{actions}</div> : null}\n </div>\n )\n}\n\nfunction IdentityFieldRow({ field, canEdit }: { field: EntityIdentityField; canEdit: boolean }) {\n const {\n label,\n value,\n placeholder,\n onSave,\n multiline = false,\n maxLength,\n valueClassName,\n leading,\n hideLabel,\n trailing,\n testId,\n } = field\n\n const [isEditing, setIsEditing] = useState(false)\n const [draft, setDraft] = useState(value)\n\n // Track the value while not editing, so an update from elsewhere (another\n // tab, a websocket) doesn't get overwritten by a stale draft on the next edit.\n useEffect(() => {\n if (!isEditing) setDraft(value)\n }, [value, isEditing])\n\n const commit = () => {\n setIsEditing(false)\n const next = draft.trim()\n if (next !== value) onSave(next)\n }\n\n const cancel = () => {\n setDraft(value)\n setIsEditing(false)\n }\n\n const charsLeft = maxLength === undefined ? null : maxLength - draft.length\n\n // Editing must not move anything. The input carries the read view's exact\n // typography and padding, drops the border and shadow entirely, and marks\n // focus with a contrasting FIELD instead — a box appearing around the text\n // (and the row growing to fit it) reads as the page jumping under the cursor.\n const fieldClass =\n 'h-auto rounded border-0 bg-muted px-1.5 py-0.5 shadow-none focus-visible:ring-0 focus-visible:ring-offset-0'\n\n const shared = {\n autoFocus: true,\n value: draft,\n placeholder,\n maxLength,\n 'aria-label': label,\n 'data-testid': testId && `${testId}-input`,\n onBlur: commit,\n onChange: (e: { target: { value: string } }) => setDraft(e.target.value),\n onKeyDown: (e: React.KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault()\n cancel()\n } else if (e.key === 'Enter' && !multiline) {\n e.preventDefault()\n commit()\n }\n },\n }\n\n // Every row shares one minimum height: that of the small controls (h-7) a\n // row may carry at its trailing end. A row that is only text then sits in\n // the same rhythm as one holding a button, so the captions fall on an even\n // beat down the bar instead of bunching up wherever a row has no control.\n return (\n <div className={cn('flex min-h-7 min-w-0 gap-2', multiline ? 'items-start' : 'items-center')}>\n <dt\n className={cn(\n hideLabel\n ? 'sr-only'\n : cn('w-24 shrink-0 text-sm font-medium text-muted-foreground', multiline && 'pt-1')\n )}\n >\n {label}:\n </dt>\n {/* Wraps under sm: the trailing controls drop to their own line instead of overflowing. */}\n <dd className=\"flex min-w-0 flex-1 flex-wrap items-center gap-x-2 gap-y-1.5 sm:flex-nowrap\">\n {leading}\n {isEditing ? (\n <div className=\"relative min-w-0 flex-1 max-sm:basis-[calc(100%-2.5rem)]\">\n {multiline ? (\n <Textarea\n {...shared}\n rows={2}\n className={cn(fieldClass, 'min-h-0 resize-none leading-snug', valueClassName)}\n />\n ) : (\n <Input {...shared} className={cn(fieldClass, 'pr-20', valueClassName)} />\n )}\n {charsLeft !== null && charsLeft <= COUNTER_THRESHOLD && (\n <span\n className={cn(\n 'pointer-events-none absolute right-3 top-1/2 hidden -translate-y-1/2 text-sm lg:block',\n charsLeft < 0 ? 'text-destructive' : 'text-muted-foreground'\n )}\n data-testid={testId && `${testId}-counter`}\n >\n {charsLeft < 0 ? `${-charsLeft} over` : `${charsLeft} left`}\n </span>\n )}\n </div>\n ) : (\n // `identity-field` (not the generic `group`) scopes the pencil's hover\n // to THIS field only — an ancestor card also carries `group`, so a\n // `.group:hover` rule would reveal every field's pencil at once.\n <span className=\"identity-field flex min-w-0 flex-1 items-center gap-1.5 sm:flex-none\">\n {/* Same padding as the input above — the swap must not nudge the\n text sideways or change the row's height. */}\n <span className={cn('px-1.5 py-0.5', valueClassName)} data-testid={testId}>\n {value || <span className=\"italic text-muted-foreground\">{placeholder}</span>}\n </span>\n {canEdit && (\n <button\n type=\"button\"\n onClick={() => setIsEditing(true)}\n aria-label={`Edit ${label.toLowerCase()}`}\n title={`Edit ${label.toLowerCase()}`}\n // Quiet by default — the pencil only surfaces when the row is\n // hovered so it reads as clean text, and stays reachable by\n // keyboard (focus-visible).\n //\n // NB: use the ungated `[.identity-field:hover_&]` selector rather\n // than Tailwind's `group-hover:`. The latter compiles behind\n // `@media (hover: hover)`, so on a touchscreen (whose PRIMARY\n // pointer reports `hover: none`) the rule is disabled even when a\n // real mouse is firing hover events — the pencil then stays at\n // opacity-0 forever. The arbitrary selector has no media gate, so\n // it reveals on any genuine `:hover`.\n className=\"shrink-0 cursor-pointer rounded p-1 text-muted-foreground opacity-60 transition-[color,background-color,opacity] hover:bg-accent hover:text-foreground focus-visible:opacity-100 pointer-coarse:p-[15px] [.identity-field:hover_&]:opacity-100\"\n data-testid={testId && `${testId}-edit`}\n >\n <Pencil className=\"size-3.5\" />\n </button>\n )}\n </span>\n )}\n {trailing ? (\n <div className=\"min-w-0 shrink-0 max-sm:w-full sm:ml-auto\">{trailing}</div>\n ) : null}\n </dd>\n </div>\n )\n}\n","import type { ReactNode } from 'react'\nimport { cn } from '@arbidocs/react/ui'\n\n/**\n * Parts for the hover card of an entity pill (workspace, user, tag, ...): a header, optional\n * stat rows, bordered sections and an action hint. The host fills them from its own data.\n */\n\nexport function EntityTooltip({\n className,\n children,\n}: {\n className?: string\n children: ReactNode\n}) {\n return (\n <div data-slot=\"entity-tooltip\" className={cn('flex flex-col gap-2', className)}>\n {children}\n </div>\n )\n}\n\nexport interface EntityTooltipHeaderProps {\n /** Icon / avatar before the title. */\n lead: ReactNode\n title: ReactNode\n subtitle?: ReactNode\n /** Right-hand badge. */\n trailing?: ReactNode\n /** Extra glyph after the title (e.g. an agent mark). */\n titleAccessory?: ReactNode\n}\n\nexport function EntityTooltipHeader({\n lead,\n title,\n subtitle,\n trailing,\n titleAccessory,\n}: EntityTooltipHeaderProps) {\n return (\n <div className=\"flex items-center gap-2\">\n {lead}\n <div className=\"flex min-w-0 flex-1 flex-col\">\n <div className=\"flex items-center gap-1.5\">\n <span className=\"truncate text-sm font-medium\">{title}</span>\n {titleAccessory}\n </div>\n {subtitle && <span className=\"truncate text-xs text-muted-foreground\">{subtitle}</span>}\n </div>\n {trailing}\n </div>\n )\n}\n\nexport interface EntityTooltipStat {\n key: string\n icon: ReactNode\n label: ReactNode\n value: ReactNode\n}\n\n/** Label/value rows between two rules. */\nexport function EntityTooltipStats({ stats }: { stats: EntityTooltipStat[] }) {\n return (\n <div className=\"flex flex-col gap-1.5 border-y border-border py-2\">\n {stats.map((s) => (\n <div key={s.key} className=\"flex items-center justify-between text-sm\">\n <div className=\"flex items-center gap-2\">\n {s.icon}\n <span className=\"text-muted-foreground\">{s.label}</span>\n </div>\n <span className=\"font-medium\">{s.value}</span>\n </div>\n ))}\n </div>\n )\n}\n\n/** A secondary section under a rule, optionally headed by an icon + text. */\nexport function EntityTooltipSection({\n icon,\n heading,\n children,\n}: {\n icon?: ReactNode\n heading?: ReactNode\n children?: ReactNode\n}) {\n return (\n <div className=\"flex flex-col gap-1.5 border-t border-border pt-2\">\n {heading && (\n <div className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n {icon}\n <span>{heading}</span>\n </div>\n )}\n {children}\n </div>\n )\n}\n\n/** Muted one-liner at the foot of the card, e.g. \"Click to send message\". */\nexport function EntityTooltipHint({\n icon,\n children,\n isRuled,\n}: {\n icon?: ReactNode\n children: ReactNode\n /** Draw the rule above (the hint closes a card that already has sections). */\n isRuled?: boolean\n}) {\n return (\n <div\n className={cn(\n 'flex items-center gap-1.5 text-xs text-muted-foreground',\n isRuled && 'border-t border-border pt-1'\n )}\n >\n {icon}\n <span>{children}</span>\n </div>\n )\n}\n","/**\n * A question box that IS the product's front door, not a link to one.\n *\n * One input, two destinations: Enter (or the arrow) ASKS — hands the trimmed\n * text to `onAsk`, the conversational answer — while the Search button beside\n * it hands the same text to `onSearch`, the retrieval experience. The split\n * matters because queries come in both registers (\"what does\n * this term mean\" vs \"find every mention of it\") and making them choose a\n * page before typing kills the impulse. Omit `onSearch` and the bar is a plain\n * ask composer.\n *\n * The consumer owns what asking and searching mean (start a chat, run smart\n * search, open a record). Suggestion chips prefill the input rather than\n * firing immediately: a suggestion is a starting point you edit, not a button\n * you regret.\n *\n * Styled with SEMANTIC tokens only (card, border, foreground, muted-foreground,\n * primary), so every host gets it in its own colours.\n */\n\nimport { useRef, useState, type KeyboardEventHandler, type ReactNode, type RefObject } from 'react'\nimport { Search, Sparkles } from 'lucide-react'\nimport { Button, cn } from '@arbidocs/react/ui'\n\nexport interface AskBarProps {\n /** Receives the trimmed question; the caller owns what asking means. */\n onAsk: (text: string) => void\n /** Second destination for the same text — retrieval. Omit to hide. */\n onSearch?: (text: string) => void\n /** Prefill-on-click starter questions, shown under the input. */\n suggestions?: string[]\n placeholder?: string\n askLabel?: string\n searchLabel?: string\n /** Controlled value. Omit for the bar to own its own text. */\n value?: string\n onValueChange?: (value: string) => void\n /** Raw keydown on the input — lets a consumer run an autocomplete\n * (arrow/Enter/Tab/Escape) before the form's own submit handling.\n * preventDefault() on Enter suppresses the submit. */\n onInputKeyDown?: KeyboardEventHandler<HTMLInputElement>\n /** Popover anchored to the pill (e.g. a slash-command menu). Rendered in a\n * relative wrapper around the form, so absolute children position against\n * the pill. */\n menu?: ReactNode\n /** External input ref, for consumers that refocus after menu selection. */\n inputRef?: RefObject<HTMLInputElement | null>\n className?: string\n /** Root test id; children derive `-input`, `-submit`, `-search`, `-suggestion`. */\n testId?: string\n}\n\nexport function AskBar({\n onAsk,\n onSearch,\n suggestions = [],\n placeholder = 'Ask anything…',\n askLabel = 'Ask',\n searchLabel = 'Search',\n value,\n onValueChange,\n onInputKeyDown,\n menu,\n inputRef: externalInputRef,\n className,\n testId = 'ask-bar',\n}: AskBarProps) {\n const [innerText, setInnerText] = useState('')\n const text = value !== undefined ? value : innerText\n const setText = (next: string) => {\n onValueChange?.(next)\n if (value === undefined) setInnerText(next)\n }\n const localInputRef = useRef<HTMLInputElement>(null)\n const inputRef = externalInputRef ?? localInputRef\n\n const submitTo = (handler: (text: string) => void) => {\n const question = text.trim()\n if (!question) return\n handler(question)\n setText('')\n }\n\n return (\n <div className={cn('flex flex-col gap-2', className)} data-testid={testId}>\n <div className=\"relative\">\n {menu}\n <form\n onSubmit={(e) => {\n e.preventDefault()\n submitTo(onAsk)\n }}\n // The AppHeader search pill's language exactly — rounded-md,\n // border-input, magnifier left, muted text — so the bar sits in a\n // topbar the way a ⌘K trigger does, not like a chat composer\n // dropped into a header.\n className=\"flex h-12 items-center gap-1.5 rounded-md border border-border/50 bg-background pl-3 pr-1.5 transition-colors focus-within:border-border\"\n >\n <Search className=\"pointer-events-none size-4 shrink-0 text-muted-foreground\" />\n <input\n ref={inputRef}\n type=\"text\"\n value={text}\n onChange={(e) => setText(e.target.value)}\n onKeyDown={onInputKeyDown}\n placeholder={placeholder}\n className=\"h-8 min-w-0 flex-1 bg-transparent text-sm text-foreground outline-none placeholder:text-muted-foreground\"\n data-testid={testId && `${testId}-input`}\n />\n {onSearch && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n disabled={!text.trim()}\n onClick={() => submitTo(onSearch)}\n className=\"h-8 shrink-0 px-2.5 text-xs font-medium text-muted-foreground hover:text-foreground\"\n data-testid={testId && `${testId}-search`}\n >\n {searchLabel}\n </Button>\n )}\n {/* The primary door wears the Ask AI anatomy: Sparkles + label. */}\n <Button\n type=\"submit\"\n size=\"sm\"\n disabled={!text.trim()}\n className=\"h-8 shrink-0 px-3 text-xs font-medium\"\n data-testid={testId && `${testId}-submit`}\n >\n <Sparkles className=\"size-3.5\" />\n {askLabel}\n </Button>\n </form>\n </div>\n {suggestions.length > 0 && (\n <div className=\"flex flex-wrap gap-1.5\">\n {suggestions.map((s) => (\n <button\n key={s}\n type=\"button\"\n onClick={() => {\n setText(s)\n inputRef.current?.focus()\n }}\n className=\"rounded-full border border-border/50 bg-card px-3 py-1 text-xs text-muted-foreground transition-colors hover:border-border hover:bg-accent hover:text-foreground\"\n data-testid={testId && `${testId}-suggestion`}\n >\n {s}\n </button>\n ))}\n </div>\n )}\n </div>\n )\n}\n"]}
|
package/dist/index.js
CHANGED
|
@@ -10,7 +10,9 @@ export { ApplyLabelButton, ApplyLabelDialog, DEFAULT_APPLY_LABEL_DIALOG_LABELS,
|
|
|
10
10
|
export { DEFAULT_SEARCH_HIT_LABELS, SearchHit } from './chunk-A2YAC22G.js';
|
|
11
11
|
export { UsageMeter } from './chunk-D5T53XCL.js';
|
|
12
12
|
export { ActionCluster, AskField, AskRow, AskTrigger, DEFAULT_ASK_FIELD_LABELS, DEFAULT_INSTALL_PROMPT_LABELS, DEFAULT_MOBILE_BARS_LABELS, DEFAULT_OFFLINE_PILL_LABELS, DEFAULT_REMOTE_CONTROL_PILL_LABELS, DEFAULT_SIDEBAR_LABELS, DEFAULT_TIP_CARD_LABELS, DEFAULT_WORKSPACE_KIND_LABELS, DEFAULT_WORKSPACE_SWITCHER_LABELS, INSTALL_PROMPT_DISMISSED_KEY, InfoBar, InstallPrompt, MobileAppBar, MobileTabBar, NotificationBell, OfflinePill, RemoteControlPill, STATUS_ROW_BASE_CLASS, STATUS_ROW_TONES, Sidebar, SidebarBadgeRow, SidebarRowAction, SidebarRowHoverContext, SplitLayout, StatusBadge, StatusRow, TipCard, UserMenu, WorkspaceIdentity, WorkspaceSwitcher, getInstallInstructions, initInstallPrompt, isIosDevice, promptAppInstall, resolveSidebarLayout, useInstallPrompt, useSidebarContext, useSidebarSettle, workspaceKindColor, workspaceKindMeta } from './chunk-WYVCXY7R.js';
|
|
13
|
-
export {
|
|
13
|
+
export { AccountRecoveryDialog, AuthAlert, AuthConsent, AuthDivider, AuthField, AuthFieldBadge, AuthFooterLinks, AuthHeading, AuthHero, AuthInput, AuthLayout, AuthLink, AuthNote, AuthOfflineBadge, AuthSubmitButton, AuthTabs, DEFAULT_ACCOUNT_RECOVERY_DIALOG_LABELS, DEFAULT_AUTH_CONSENT_LABELS, DEFAULT_AUTH_FOOTER_LINKS_LABELS, DEFAULT_AUTH_OFFLINE_BADGE_LABELS, DEFAULT_RECOVERY_KEY_DIALOG_LABELS, DEFAULT_REVEALABLE_PASSWORD_INPUT_LABELS, DEFAULT_SSO_LOGIN_BUTTON_LABELS, RecoveryKeyDialog, RevealablePasswordInput, SsoLoginButton } from './chunk-SFXVNFES.js';
|
|
14
|
+
export { DEFAULT_PASSWORD_STRENGTH_INPUT_LABELS, PasswordStrengthInput } from './chunk-VILAPTCB.js';
|
|
15
|
+
export { AgentAvatarField, AgentBar, AgentBarIconButton, AgentBarMenu, AgentBarNotes, AgentBarProbeAnswer, AgentBarQueuedNote, AgentBarStatus, AgentCard, AgentCreateView, AgentCreatedView, AgentCreator, AgentEditView, AgentGallery, AgentMainView, AgentSelect, AgentTypeSelector, CapabilityGrid, CapabilityTile, ConfigField, ConfigForm, ConsentActions, ConsentBulletList, ConsentCard, ConsentFootnote, ConsentHeader, ConsentMessage, ConsentNotice, ConsentPage, ConsentPermissionList, ConsentSection, ConsentStrong, ConsentText, ConversationListView, ConversationTurnSpeaker, CopyableUrl, DEFAULT_AGENT_AVATAR_FIELD_LABELS, DEFAULT_AGENT_BAR_LABELS, DEFAULT_AGENT_CARD_LABELS, DEFAULT_AGENT_CREATOR_LABELS, DEFAULT_AGENT_GALLERY_LABELS, DEFAULT_AGENT_SELECT_LABELS, DEFAULT_AGENT_STEPS_LABELS, DEFAULT_AGENT_TYPE_SELECTOR_LABELS, DEFAULT_AUTHORIZE_AGENT_LABELS, DEFAULT_CONFIG_FIELD_LABELS, DEFAULT_CONFIG_FORM_LABELS, DEFAULT_CONSENT_ACTIONS_LABELS, DEFAULT_COPYABLE_URL_LABELS, DEFAULT_NEW_THREAD_DIALOG_LABELS, DEFAULT_PILL_SELECT_LABELS, DEFAULT_RECURRENCE, DEFAULT_RECURRENCE_BUILDER_LABELS, DEFAULT_SCHEMA_FORM_LABELS, DEFAULT_SKILL_CARD_LABELS, DEFAULT_SKILL_EDIT_FORM_LABELS, DEFAULT_SKILL_GENERATE_FORM_LABELS, DEFAULT_SKILL_GLOBAL_BADGE_LABELS, DEFAULT_SKILL_ROW_LABELS, DEFAULT_SKILL_VIEW_TOGGLE_LABELS, DEFAULT_SUBAGENT_ROSTER_LABELS, DEFAULT_TASKS_CHROME_LABELS, DEFAULT_TASK_ACTIVITY_LABELS, DEFAULT_TASK_COMPOSER_LABELS, DEFAULT_TASK_LIST_LABELS, DEFAULT_TASK_OUTPUTS_CELL_LABELS, DEFAULT_TASK_PLAN_LABELS, DEFAULT_TASK_REVIEW_ACTIONS_LABELS, DEFAULT_TASK_RUNS_DIALOG_LABELS, DEFAULT_TASK_STATUS_PILL_LABELS, DEFAULT_TASK_THREAD_CHIP_LABELS, DEFAULT_TASK_TRIGGER_CHIP_LABELS, DEFAULT_TUPLE_ARRAY_FIELD_LABELS, DEFAULT_UPLOAD_TASK_ITEM_LABELS, DEFAULT_UPLOAD_TASK_LIST_LABELS, DEFAULT_WORKFLOWS_CHROME_LABELS, DEFAULT_WORKFLOW_CONFIG_DIALOG_LABELS, DEFAULT_WORKFLOW_LIST_LABELS, DERIVED_NAME_WORDS, EMPTY_NEW_THREAD, EMPTY_WORKFLOW_SCOPE, EntityChip, GoalCriteria, MAX_TASK_DEPTH, NewThreadDialog, PersonPill, PillSelect, RecurrenceBuilder, SKILL_PROMPT_FALLBACK_PLACEHOLDER, SKILL_PROMPT_LABEL, STATUS_LABELS, STATUS_ORDER, STATUS_TONE, SchemaForm, SkillActionButton, SkillCard, SkillDetail, SkillDetailSection, SkillEditForm, SkillFilterChips, SkillGenerateForm, SkillGlobalBadge, SkillRow, SkillTile, SkillTypeBadge, SkillViewToggle, StepDetail, StepNarration, StepOutcome, StepParams, StepRow, StepSummary, StepTrace, StepTraceSummary, SubAgentLane, SubStepGroup, SubagentRoster, TASK_COLUMN_ORDER, TRIGGER_LABELS, TaskActivityDialog, TaskActivityTimeline, TaskComposer, TaskFlow, TaskInbox, TaskMoveDialog, TaskOutputsCell, TaskPlan, TaskReviewActions, TaskReviewDialog, TaskRunsDialog, TaskStartDialog, TaskStatusPill, TaskTable, TaskThreadChip, TaskTriggerChip, TasksToolbar, ThreadActivity, ThreadNotifyDialog, TupleArrayField, UploadTaskItem, UploadTaskList, WEEKDAYS, WORKFLOW_COLUMN_ORDER, WorkflowConfigDialog, WorkflowDocumentsField, WorkflowLauncher, WorkflowsTable, WorkflowsToolbar, agentConfigSectionToValues, agentCreatorToConfigSection, asTaskStatus, authModeFor, buildLaunch, buildRRule, buildTaskRows, buildWorkflowScopeSource, compactThreadActivity, composePersona, composeWorkflowPrompt, composerToTaskQuery, composerToWorkRequest, composerToWorkflowRequest, composerToWorkflowUpdate, createTaskColumns, createWorkflowColumns, createsWork, defaultInputs, defaultScopeRenderer, defaultTaskComposerValues, deriveAgentName, deriveWorkflowName, descendantIds, describeRRule, filterConversationRows, firstWords, formatElapsed, goalProgress, hasTaskFields, hasTrigger, humanizeSection, indexTasks, inferType, inputDocumentIds, inputsFromContext, isAgenticWorkflow, isEmptyWorkflowScope, isOutOfBounds, isPlainTodo, isSkillRow, isValidAgentName, isWorkflowScope, isoToLocalInput, localInputToIso, matchWorkflowScope, moveTargets, newThreadToRequest, nextCriterionId, ownerExtId, parseRRule, prettifyKey, promptFieldName, resolveScopeInputs, skillToWorkflow, stripPersonaPreamble, summarizeAgent, summarizeCapabilities, taskComposerToCreateRequest, taskComposerToUpdateRequest, taskNeedsAccess, taskToComposerValues, validateInputs, workflowAccepts, workflowFromFrontmatter, workflowStatus, workflowTaskFields, workflowToComposerValues, workflowTriggerType, workflowWhen, workflowsAccepting, workflowsForHost } from './chunk-PG2RWOGF.js';
|
|
14
16
|
export { EmptyState } from './chunk-P6GHJSLR.js';
|
|
15
17
|
import './chunk-RFXJYIDV.js';
|
|
16
18
|
import './chunk-BUHKUKKB.js';
|
|
@@ -20,12 +22,11 @@ export { Dot, ToneBadge } from './chunk-DPLRHEJZ.js';
|
|
|
20
22
|
export { DEFAULT_FILTER_FIELDS, DEFAULT_FILTER_INPUT_LABELS, FilterInput } from './chunk-YU2KUMGE.js';
|
|
21
23
|
export { ActionLink } from './chunk-S7PSMMRG.js';
|
|
22
24
|
export { DEFAULT_TAB_HEADER_LABELS, TabHeader } from './chunk-4WWM3GQ5.js';
|
|
23
|
-
export {
|
|
24
|
-
export {
|
|
25
|
-
export { AssistantToaster, BranchControls, ComposerAccessories, ComposerTools, ContextActionButton, ContextCheckRow, ContextPanelContent, ContextPanelFooter, ContextPanelTabs, ContextPickerList, ContextPickerRow, ContextSearchInput, ContextSelectList, ContextSelectRow, Conversation, ConversationBody, ConversationHeader, ConversationHeaderActions, ConversationHistoryPane, ConversationLoading, ConversationMain, ConversationRoot, ConversationSearchView, ConversationSettingsButton, DEFAULT_BRANCH_CONTROLS_LABELS, DEFAULT_CONVERSATION_LAYOUT_LABELS, DEFAULT_CONVERSATION_PARTS_LABELS, DEFAULT_CONVERSATION_SEARCH_LABELS, DEFAULT_LABEL_PIN_ROW_LABELS, DEFAULT_MODEL_PRICING_TIP_LABELS, DEFAULT_PENDING_ANSWER_BAR_LABELS, DEFAULT_PINNED_DOC_CHIP_LABELS, DEFAULT_SLASH_MENU_LABELS, DEFAULT_THREAD_MAP_LABELS, LabelPinRow, ModelAutoIcon, ModelConfigureButton, ModelDot, ModelMenuDivider, ModelMenuMessage, ModelOption, ModelOptionLabel, ModelPickerPopover, ModelPickerTrigger, ModelPricingTip, ModelTierIcon, ModelTierOption, ModelTriggerContent, NewChatButton, NewPaChatButton, PaModeBadge, PendingAnswerBar, PinnedDocChip, SlashMenu, ThreadMap, ThreadMapDiagram, ThreadMapError, ThreadMapLoading, getParticipantTints, hasMessageBody, isLongPastedText, useDismissibleCard, useLongPaste, useRecipientDraft } from './chunk-LQITIYBN.js';
|
|
26
|
-
export { AssistantDock, AssistantDockToggle, AssistantModeToggle, ChatDocuments, ChatMessageContent, ChatPage, ChatThreadList, ChatThreadSelect, CitationMark, Composer, ComposerBranchingNotice, ComposerContainer, ComposerDock, ComposerFrame, ComposerInput, ComposerRoot, ComposerSend, ComposerToolbar, ComposerVoiceButton, ContextChip, ConversationEmpty, DEFAULT_ASSISTANT_MODE_TOGGLE_LABELS, DEFAULT_CHAT_PAGE_LABELS, DEFAULT_COMPOSER_LABELS, DEFAULT_CONVERSATION_EMPTY_LABELS, DEFAULT_MESSAGE_ALERT_LABELS, DEFAULT_MESSAGE_LABELS, DEFAULT_MESSAGE_LIST_LABELS, Message, MessageActionButton, MessageActionMenu, MessageAlert, MessageBody, MessageBubble, MessageByline, MessageContent, MessageFooter, MessageList, MessageListBanner, MessageListEmpty, MessageListRoot, MessageListRow, MessageListRows, MessageListStatus, MessageListTail, MessageNarration, MessageRoot, MessageSources, MessageSubagentBadge, ScrollToBottom, SourceChip, toSpeakableText, useAssistantDock, useChatSurface, useMentionAutocomplete, useRegisterEmbeddedChat, useStreamAnnouncement } from './chunk-ZXYHBQFW.js';
|
|
25
|
+
export { AssistantToaster, BranchControls, ComposerAccessories, ComposerTools, ContextActionButton, ContextCheckRow, ContextPanelContent, ContextPanelFooter, ContextPanelTabs, ContextPickerList, ContextPickerRow, ContextSearchInput, ContextSelectList, ContextSelectRow, Conversation, ConversationBody, ConversationHeader, ConversationHeaderActions, ConversationHistoryPane, ConversationLoading, ConversationMain, ConversationRoot, ConversationSearchView, ConversationSettingsButton, DEFAULT_BRANCH_CONTROLS_LABELS, DEFAULT_CONVERSATION_LAYOUT_LABELS, DEFAULT_CONVERSATION_PARTS_LABELS, DEFAULT_CONVERSATION_SEARCH_LABELS, DEFAULT_LABEL_PIN_ROW_LABELS, DEFAULT_MODEL_PRICING_TIP_LABELS, DEFAULT_PENDING_ANSWER_BAR_LABELS, DEFAULT_PINNED_DOC_CHIP_LABELS, DEFAULT_SLASH_MENU_LABELS, DEFAULT_THREAD_MAP_LABELS, LabelPinRow, ModelAutoIcon, ModelConfigureButton, ModelDot, ModelMenuDivider, ModelMenuMessage, ModelOption, ModelOptionLabel, ModelPickerPopover, ModelPickerTrigger, ModelPricingTip, ModelTierIcon, ModelTierOption, ModelTriggerContent, NewChatButton, NewPaChatButton, PaModeBadge, PendingAnswerBar, PinnedDocChip, SlashMenu, ThreadMap, ThreadMapDiagram, ThreadMapError, ThreadMapLoading, getParticipantTints, hasMessageBody, isLongPastedText, useDismissibleCard, useLongPaste, useRecipientDraft } from './chunk-CA7JD6IX.js';
|
|
26
|
+
export { AssistantDock, AssistantDockToggle, AssistantModeToggle, ChatDocuments, ChatMessageContent, ChatPage, ChatThreadList, ChatThreadSelect, CitationMark, Composer, ComposerBranchingNotice, ComposerContainer, ComposerDock, ComposerFrame, ComposerInput, ComposerRoot, ComposerSend, ComposerToolbar, ComposerVoiceButton, ContextChip, ConversationEmpty, DEFAULT_ASSISTANT_MODE_TOGGLE_LABELS, DEFAULT_CHAT_PAGE_LABELS, DEFAULT_COMPOSER_LABELS, DEFAULT_CONVERSATION_EMPTY_LABELS, DEFAULT_MESSAGE_ALERT_LABELS, DEFAULT_MESSAGE_LABELS, DEFAULT_MESSAGE_LIST_LABELS, Message, MessageActionButton, MessageActionMenu, MessageAlert, MessageBody, MessageBubble, MessageByline, MessageContent, MessageFooter, MessageList, MessageListBanner, MessageListEmpty, MessageListRoot, MessageListRow, MessageListRows, MessageListStatus, MessageListTail, MessageNarration, MessageRoot, MessageSources, MessageSubagentBadge, ScrollToBottom, SourceChip, toSpeakableText, useAssistantDock, useChatSurface, useRegisterEmbeddedChat, useStreamAnnouncement } from './chunk-E3U5GYAP.js';
|
|
27
27
|
export { DEFAULT_DOCK_WIDTH, Toaster } from './chunk-BV7FEMSI.js';
|
|
28
28
|
export { BlocksTooltipProvider, DEFAULT_OVERLAY_ZONE_ID, DEFAULT_PAGE_CONTAINER_PADDING, DEFAULT_SIDEBAR_TOGGLE_BUTTON_LABELS, PageContainer, SHELL_BOTTOM_INSET_VAR, Shell, SidebarToggleButton, ToolButton, useDrawerBehavior, useOverlayZoneId, useShellBottomInset } from './chunk-KZJAG7T3.js';
|
|
29
|
+
export { useMentionAutocomplete } from './chunk-3VQYJBOI.js';
|
|
29
30
|
export { BREAKPOINT_QUERIES, useIsNarrow, useIsPhone, useIsTouchScreen, useMediaQuery } from './chunk-SLSBJRWW.js';
|
|
30
31
|
import './chunk-NPLYHR2E.js';
|
|
31
32
|
export { CitationEditor, DEFAULT_PASSAGE_PILL_LABELS, DEFAULT_QUIET_MARK_LABELS, LabelMark, NoteMark, PassageMark, PassagePill, QuietLink, useCopyText } from './chunk-XQKGYGCJ.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/Toolbar.tsx","../src/components/EntityIdentityBar.tsx","../src/components/EntityTooltip.tsx","../src/components/AskBar.tsx"],"names":["jsxs","cn","jsx","Input","useState","Search"],"mappings":"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","file":"index.js","sourcesContent":["import type { ReactNode } from 'react'\nimport { Search } from 'lucide-react'\nimport { Input, cn } from '@arbidocs/react/ui'\n\n/** Search + filter bar used above every list view. */\nexport function Toolbar({\n search,\n onSearch,\n searchPlaceholder = 'Search…',\n filters,\n actions,\n className,\n testId,\n}: {\n search?: string\n onSearch?: (v: string) => void\n searchPlaceholder?: string\n filters?: ReactNode\n actions?: ReactNode\n className?: string\n testId?: string\n}) {\n return (\n <div\n className={cn(\n 'flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between',\n className\n )}\n data-testid={testId}\n >\n <div className=\"flex flex-1 flex-wrap items-center gap-2\">\n {onSearch && (\n <div className=\"relative w-full max-w-xs\">\n <Search className=\"pointer-events-none absolute left-2.5 top-1/2 size-4 -translate-y-1/2 text-muted-foreground\" />\n <Input\n value={search}\n onChange={(e) => onSearch(e.target.value)}\n placeholder={searchPlaceholder}\n className=\"bg-card text-sm placeholder:text-muted-foreground focus-visible:border-ring/60 focus-visible:ring-2 focus-visible:ring-ring pl-8\"\n data-testid={testId ? `${testId}-search` : 'toolbar-search'}\n />\n </div>\n )}\n {filters}\n </div>\n {actions && <div className=\"flex items-center gap-2\">{actions}</div>}\n </div>\n )\n}\n","import { useEffect, useState, type ReactNode } from 'react'\nimport { Pencil } from 'lucide-react'\nimport { Input, Textarea, cn } from '@arbidocs/react/ui'\n\n/** Longest a name may be. Exported so a form editing the same field agrees. */\nexport const IDENTITY_NAME_MAX_LENGTH = 50\n\n/** Shown once the remaining allowance gets this low, not for the whole time. */\nconst COUNTER_THRESHOLD = 10\n\nexport interface EntityIdentityField {\n /** Row caption. Rendered with a trailing colon. */\n label: string\n value: string\n /** Stands in for an empty value, in italics — never a blank row. */\n placeholder: string\n /** Commits the edit. Not called when the value is unchanged. */\n onSave: (next: string) => void\n /** A description needs line breaks; a name does not. */\n multiline?: boolean\n /** Caps the input and shows a counter as it fills. Names only, by default. */\n maxLength?: number\n /** Classes for the read-mode value, e.g. a larger weight for the name. */\n valueClassName?: string\n /**\n * Content pinned to the RIGHT END of this row — e.g. the owning project\n * beside a name, a member stack beside a status. Rows without one let their\n * value run the full width, which is what a description wants.\n */\n trailing?: ReactNode\n /**\n * Content rendered immediately BEFORE the value — the entity's own mark.\n * Sits outside the edit swap, so starting to edit the name doesn't make the\n * icon jump or disappear.\n */\n leading?: ReactNode\n /**\n * Drops the caption from view for this row, leaving the value flush left.\n * For a field whose value already says what it is — a workspace's name and\n * description read as exactly that — the caption is a word the eye has to\n * step over on the way in. The caption stays in the markup for screen\n * readers, which have no such visual cue to fall back on.\n */\n hideLabel?: boolean\n /** Row test id; the pencil and input derive `-edit` and `-input`. */\n testId?: string\n}\n\nexport interface EntityIdentityBarProps {\n /** The editable text fields, in order. Usually name then description. */\n fields: EntityIdentityField[]\n /**\n * Read-only rows shown after the editable ones — anything whose control the\n * consumer owns (a project picker, an owner avatar, a status). Rendered with\n * the same caption column so every row lines up.\n */\n extraRows?: { label: string; content: ReactNode; trailing?: ReactNode; testId?: string }[]\n /** Hides every pencil. A viewer without permission sees values, not controls. */\n canEdit?: boolean\n /** Trailing controls, pinned right — e.g. a member stack, a status. */\n actions?: ReactNode\n /**\n * Controls that act on the ENTITY rather than on any one field — typically an\n * overflow menu holding delete or leave. Sits under the field list, where a\n * destructive action is findable but not in the path of everyday reading.\n */\n footer?: ReactNode\n className?: string\n testId?: string\n}\n\n/**\n * The \"what am I looking at\" bar for an entity's own page.\n *\n * A caption column (`Name:`, `Description:`, `Project:`) and a value column. The\n * captions are the point: a bare bold string at the top of a page reads equally\n * as a workspace, a project, a case file or a folder, and people read it as\n * whichever they expected. Saying which field is which costs one column and\n * removes the ambiguity entirely.\n *\n * Editing happens in place. The pencil is always visible to someone who can use\n * it rather than revealed on hover — a control you have to go hunting for is one\n * most people never find, and hover doesn't exist on touch. Commit is on blur\n * and on Enter (single-line fields only, so a description can hold line\n * breaks); Escape abandons the edit.\n *\n * Deliberately NOT a form: no submit, no dirty state, no field-level errors.\n * When a consumer needs visibility toggles, destructive actions or validation\n * messages, those belong in its settings form — this bar is the identity of the\n * thing, shown where you are working on it.\n *\n * Styled with SEMANTIC tokens only, so every host gets it in its own colours.\n */\nexport function EntityIdentityBar({\n fields,\n extraRows = [],\n canEdit = false,\n actions,\n footer,\n className,\n testId,\n}: EntityIdentityBarProps) {\n return (\n <div\n className={cn('flex flex-wrap items-start justify-between gap-x-6 gap-y-3', className)}\n data-testid={testId}\n >\n <dl className=\"min-w-0 flex-1 space-y-1.5\">\n {fields.map((field) => (\n <IdentityFieldRow key={field.label} field={field} canEdit={canEdit} />\n ))}\n {extraRows.map((row) => (\n <div\n key={row.label}\n className=\"flex min-h-7 min-w-0 items-center gap-2\"\n data-testid={row.testId}\n >\n <dt className=\"w-24 shrink-0 text-sm font-medium text-muted-foreground\">\n {row.label}:\n </dt>\n <dd className=\"flex min-w-0 flex-1 items-center gap-2\">\n {row.content}\n {row.trailing ? (\n <div className=\"min-w-0 shrink-0 sm:ml-auto\">{row.trailing}</div>\n ) : null}\n </dd>\n </div>\n ))}\n {footer ? <div className=\"flex items-center pt-0.5\">{footer}</div> : null}\n </dl>\n {actions ? <div className=\"flex shrink-0 items-center gap-2\">{actions}</div> : null}\n </div>\n )\n}\n\nfunction IdentityFieldRow({ field, canEdit }: { field: EntityIdentityField; canEdit: boolean }) {\n const {\n label,\n value,\n placeholder,\n onSave,\n multiline = false,\n maxLength,\n valueClassName,\n leading,\n hideLabel,\n trailing,\n testId,\n } = field\n\n const [isEditing, setIsEditing] = useState(false)\n const [draft, setDraft] = useState(value)\n\n // Track the value while not editing, so an update from elsewhere (another\n // tab, a websocket) doesn't get overwritten by a stale draft on the next edit.\n useEffect(() => {\n if (!isEditing) setDraft(value)\n }, [value, isEditing])\n\n const commit = () => {\n setIsEditing(false)\n const next = draft.trim()\n if (next !== value) onSave(next)\n }\n\n const cancel = () => {\n setDraft(value)\n setIsEditing(false)\n }\n\n const charsLeft = maxLength === undefined ? null : maxLength - draft.length\n\n // Editing must not move anything. The input carries the read view's exact\n // typography and padding, drops the border and shadow entirely, and marks\n // focus with a contrasting FIELD instead — a box appearing around the text\n // (and the row growing to fit it) reads as the page jumping under the cursor.\n const fieldClass =\n 'h-auto rounded border-0 bg-muted px-1.5 py-0.5 shadow-none focus-visible:ring-0 focus-visible:ring-offset-0'\n\n const shared = {\n autoFocus: true,\n value: draft,\n placeholder,\n maxLength,\n 'aria-label': label,\n 'data-testid': testId && `${testId}-input`,\n onBlur: commit,\n onChange: (e: { target: { value: string } }) => setDraft(e.target.value),\n onKeyDown: (e: React.KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault()\n cancel()\n } else if (e.key === 'Enter' && !multiline) {\n e.preventDefault()\n commit()\n }\n },\n }\n\n // Every row shares one minimum height: that of the small controls (h-7) a\n // row may carry at its trailing end. A row that is only text then sits in\n // the same rhythm as one holding a button, so the captions fall on an even\n // beat down the bar instead of bunching up wherever a row has no control.\n return (\n <div className={cn('flex min-h-7 min-w-0 gap-2', multiline ? 'items-start' : 'items-center')}>\n <dt\n className={cn(\n hideLabel\n ? 'sr-only'\n : cn('w-24 shrink-0 text-sm font-medium text-muted-foreground', multiline && 'pt-1')\n )}\n >\n {label}:\n </dt>\n {/* Wraps under sm: the trailing controls drop to their own line instead of overflowing. */}\n <dd className=\"flex min-w-0 flex-1 flex-wrap items-center gap-x-2 gap-y-1.5 sm:flex-nowrap\">\n {leading}\n {isEditing ? (\n <div className=\"relative min-w-0 flex-1 max-sm:basis-[calc(100%-2.5rem)]\">\n {multiline ? (\n <Textarea\n {...shared}\n rows={2}\n className={cn(fieldClass, 'min-h-0 resize-none leading-snug', valueClassName)}\n />\n ) : (\n <Input {...shared} className={cn(fieldClass, 'pr-20', valueClassName)} />\n )}\n {charsLeft !== null && charsLeft <= COUNTER_THRESHOLD && (\n <span\n className={cn(\n 'pointer-events-none absolute right-3 top-1/2 hidden -translate-y-1/2 text-sm lg:block',\n charsLeft < 0 ? 'text-destructive' : 'text-muted-foreground'\n )}\n data-testid={testId && `${testId}-counter`}\n >\n {charsLeft < 0 ? `${-charsLeft} over` : `${charsLeft} left`}\n </span>\n )}\n </div>\n ) : (\n // `identity-field` (not the generic `group`) scopes the pencil's hover\n // to THIS field only — an ancestor card also carries `group`, so a\n // `.group:hover` rule would reveal every field's pencil at once.\n <span className=\"identity-field flex min-w-0 flex-1 items-center gap-1.5 sm:flex-none\">\n {/* Same padding as the input above — the swap must not nudge the\n text sideways or change the row's height. */}\n <span className={cn('px-1.5 py-0.5', valueClassName)} data-testid={testId}>\n {value || <span className=\"italic text-muted-foreground\">{placeholder}</span>}\n </span>\n {canEdit && (\n <button\n type=\"button\"\n onClick={() => setIsEditing(true)}\n aria-label={`Edit ${label.toLowerCase()}`}\n title={`Edit ${label.toLowerCase()}`}\n // Quiet by default — the pencil only surfaces when the row is\n // hovered so it reads as clean text, and stays reachable by\n // keyboard (focus-visible).\n //\n // NB: use the ungated `[.identity-field:hover_&]` selector rather\n // than Tailwind's `group-hover:`. The latter compiles behind\n // `@media (hover: hover)`, so on a touchscreen (whose PRIMARY\n // pointer reports `hover: none`) the rule is disabled even when a\n // real mouse is firing hover events — the pencil then stays at\n // opacity-0 forever. The arbitrary selector has no media gate, so\n // it reveals on any genuine `:hover`.\n className=\"shrink-0 cursor-pointer rounded p-1 text-muted-foreground opacity-60 transition-[color,background-color,opacity] hover:bg-accent hover:text-foreground focus-visible:opacity-100 pointer-coarse:p-[15px] [.identity-field:hover_&]:opacity-100\"\n data-testid={testId && `${testId}-edit`}\n >\n <Pencil className=\"size-3.5\" />\n </button>\n )}\n </span>\n )}\n {trailing ? (\n <div className=\"min-w-0 shrink-0 max-sm:w-full sm:ml-auto\">{trailing}</div>\n ) : null}\n </dd>\n </div>\n )\n}\n","import type { ReactNode } from 'react'\nimport { cn } from '@arbidocs/react/ui'\n\n/**\n * Parts for the hover card of an entity pill (workspace, user, tag, ...): a header, optional\n * stat rows, bordered sections and an action hint. The host fills them from its own data.\n */\n\nexport function EntityTooltip({\n className,\n children,\n}: {\n className?: string\n children: ReactNode\n}) {\n return (\n <div data-slot=\"entity-tooltip\" className={cn('flex flex-col gap-2', className)}>\n {children}\n </div>\n )\n}\n\nexport interface EntityTooltipHeaderProps {\n /** Icon / avatar before the title. */\n lead: ReactNode\n title: ReactNode\n subtitle?: ReactNode\n /** Right-hand badge. */\n trailing?: ReactNode\n /** Extra glyph after the title (e.g. an agent mark). */\n titleAccessory?: ReactNode\n}\n\nexport function EntityTooltipHeader({\n lead,\n title,\n subtitle,\n trailing,\n titleAccessory,\n}: EntityTooltipHeaderProps) {\n return (\n <div className=\"flex items-center gap-2\">\n {lead}\n <div className=\"flex min-w-0 flex-1 flex-col\">\n <div className=\"flex items-center gap-1.5\">\n <span className=\"truncate text-sm font-medium\">{title}</span>\n {titleAccessory}\n </div>\n {subtitle && <span className=\"truncate text-xs text-muted-foreground\">{subtitle}</span>}\n </div>\n {trailing}\n </div>\n )\n}\n\nexport interface EntityTooltipStat {\n key: string\n icon: ReactNode\n label: ReactNode\n value: ReactNode\n}\n\n/** Label/value rows between two rules. */\nexport function EntityTooltipStats({ stats }: { stats: EntityTooltipStat[] }) {\n return (\n <div className=\"flex flex-col gap-1.5 border-y border-border py-2\">\n {stats.map((s) => (\n <div key={s.key} className=\"flex items-center justify-between text-sm\">\n <div className=\"flex items-center gap-2\">\n {s.icon}\n <span className=\"text-muted-foreground\">{s.label}</span>\n </div>\n <span className=\"font-medium\">{s.value}</span>\n </div>\n ))}\n </div>\n )\n}\n\n/** A secondary section under a rule, optionally headed by an icon + text. */\nexport function EntityTooltipSection({\n icon,\n heading,\n children,\n}: {\n icon?: ReactNode\n heading?: ReactNode\n children?: ReactNode\n}) {\n return (\n <div className=\"flex flex-col gap-1.5 border-t border-border pt-2\">\n {heading && (\n <div className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n {icon}\n <span>{heading}</span>\n </div>\n )}\n {children}\n </div>\n )\n}\n\n/** Muted one-liner at the foot of the card, e.g. \"Click to send message\". */\nexport function EntityTooltipHint({\n icon,\n children,\n isRuled,\n}: {\n icon?: ReactNode\n children: ReactNode\n /** Draw the rule above (the hint closes a card that already has sections). */\n isRuled?: boolean\n}) {\n return (\n <div\n className={cn(\n 'flex items-center gap-1.5 text-xs text-muted-foreground',\n isRuled && 'border-t border-border pt-1'\n )}\n >\n {icon}\n <span>{children}</span>\n </div>\n )\n}\n","/**\n * A question box that IS the product's front door, not a link to one.\n *\n * One input, two destinations: Enter (or the arrow) ASKS — hands the trimmed\n * text to `onAsk`, the conversational answer — while the Search button beside\n * it hands the same text to `onSearch`, the retrieval experience. The split\n * matters because queries come in both registers (\"what does\n * this term mean\" vs \"find every mention of it\") and making them choose a\n * page before typing kills the impulse. Omit `onSearch` and the bar is a plain\n * ask composer.\n *\n * The consumer owns what asking and searching mean (start a chat, run smart\n * search, open a record). Suggestion chips prefill the input rather than\n * firing immediately: a suggestion is a starting point you edit, not a button\n * you regret.\n *\n * Styled with SEMANTIC tokens only (card, border, foreground, muted-foreground,\n * primary), so every host gets it in its own colours.\n */\n\nimport { useRef, useState, type KeyboardEventHandler, type ReactNode, type RefObject } from 'react'\nimport { Search, Sparkles } from 'lucide-react'\nimport { Button, cn } from '@arbidocs/react/ui'\n\nexport interface AskBarProps {\n /** Receives the trimmed question; the caller owns what asking means. */\n onAsk: (text: string) => void\n /** Second destination for the same text — retrieval. Omit to hide. */\n onSearch?: (text: string) => void\n /** Prefill-on-click starter questions, shown under the input. */\n suggestions?: string[]\n placeholder?: string\n askLabel?: string\n searchLabel?: string\n /** Controlled value. Omit for the bar to own its own text. */\n value?: string\n onValueChange?: (value: string) => void\n /** Raw keydown on the input — lets a consumer run an autocomplete\n * (arrow/Enter/Tab/Escape) before the form's own submit handling.\n * preventDefault() on Enter suppresses the submit. */\n onInputKeyDown?: KeyboardEventHandler<HTMLInputElement>\n /** Popover anchored to the pill (e.g. a slash-command menu). Rendered in a\n * relative wrapper around the form, so absolute children position against\n * the pill. */\n menu?: ReactNode\n /** External input ref, for consumers that refocus after menu selection. */\n inputRef?: RefObject<HTMLInputElement | null>\n className?: string\n /** Root test id; children derive `-input`, `-submit`, `-search`, `-suggestion`. */\n testId?: string\n}\n\nexport function AskBar({\n onAsk,\n onSearch,\n suggestions = [],\n placeholder = 'Ask anything…',\n askLabel = 'Ask',\n searchLabel = 'Search',\n value,\n onValueChange,\n onInputKeyDown,\n menu,\n inputRef: externalInputRef,\n className,\n testId = 'ask-bar',\n}: AskBarProps) {\n const [innerText, setInnerText] = useState('')\n const text = value !== undefined ? value : innerText\n const setText = (next: string) => {\n onValueChange?.(next)\n if (value === undefined) setInnerText(next)\n }\n const localInputRef = useRef<HTMLInputElement>(null)\n const inputRef = externalInputRef ?? localInputRef\n\n const submitTo = (handler: (text: string) => void) => {\n const question = text.trim()\n if (!question) return\n handler(question)\n setText('')\n }\n\n return (\n <div className={cn('flex flex-col gap-2', className)} data-testid={testId}>\n <div className=\"relative\">\n {menu}\n <form\n onSubmit={(e) => {\n e.preventDefault()\n submitTo(onAsk)\n }}\n // The AppHeader search pill's language exactly — rounded-md,\n // border-input, magnifier left, muted text — so the bar sits in a\n // topbar the way a ⌘K trigger does, not like a chat composer\n // dropped into a header.\n className=\"flex h-12 items-center gap-1.5 rounded-md border border-border/50 bg-background pl-3 pr-1.5 transition-colors focus-within:border-border\"\n >\n <Search className=\"pointer-events-none size-4 shrink-0 text-muted-foreground\" />\n <input\n ref={inputRef}\n type=\"text\"\n value={text}\n onChange={(e) => setText(e.target.value)}\n onKeyDown={onInputKeyDown}\n placeholder={placeholder}\n className=\"h-8 min-w-0 flex-1 bg-transparent text-sm text-foreground outline-none placeholder:text-muted-foreground\"\n data-testid={testId && `${testId}-input`}\n />\n {onSearch && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n disabled={!text.trim()}\n onClick={() => submitTo(onSearch)}\n className=\"h-8 shrink-0 px-2.5 text-xs font-medium text-muted-foreground hover:text-foreground\"\n data-testid={testId && `${testId}-search`}\n >\n {searchLabel}\n </Button>\n )}\n {/* The primary door wears the Ask AI anatomy: Sparkles + label. */}\n <Button\n type=\"submit\"\n size=\"sm\"\n disabled={!text.trim()}\n className=\"h-8 shrink-0 px-3 text-xs font-medium\"\n data-testid={testId && `${testId}-submit`}\n >\n <Sparkles className=\"size-3.5\" />\n {askLabel}\n </Button>\n </form>\n </div>\n {suggestions.length > 0 && (\n <div className=\"flex flex-wrap gap-1.5\">\n {suggestions.map((s) => (\n <button\n key={s}\n type=\"button\"\n onClick={() => {\n setText(s)\n inputRef.current?.focus()\n }}\n className=\"rounded-full border border-border/50 bg-card px-3 py-1 text-xs text-muted-foreground transition-colors hover:border-border hover:bg-accent hover:text-foreground\"\n data-testid={testId && `${testId}-suggestion`}\n >\n {s}\n </button>\n ))}\n </div>\n )}\n </div>\n )\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/Toolbar.tsx","../src/components/EntityIdentityBar.tsx","../src/components/EntityTooltip.tsx","../src/components/AskBar.tsx"],"names":["jsxs","cn","jsx","Input","useState","Search"],"mappings":"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","file":"index.js","sourcesContent":["import type { ReactNode } from 'react'\nimport { Search } from 'lucide-react'\nimport { Input, cn } from '@arbidocs/react/ui'\n\n/** Search + filter bar used above every list view. */\nexport function Toolbar({\n search,\n onSearch,\n searchPlaceholder = 'Search…',\n filters,\n actions,\n className,\n testId,\n}: {\n search?: string\n onSearch?: (v: string) => void\n searchPlaceholder?: string\n filters?: ReactNode\n actions?: ReactNode\n className?: string\n testId?: string\n}) {\n return (\n <div\n className={cn(\n 'flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between',\n className\n )}\n data-testid={testId}\n >\n <div className=\"flex flex-1 flex-wrap items-center gap-2\">\n {onSearch && (\n <div className=\"relative w-full max-w-xs\">\n <Search className=\"pointer-events-none absolute left-2.5 top-1/2 size-4 -translate-y-1/2 text-muted-foreground\" />\n <Input\n value={search}\n onChange={(e) => onSearch(e.target.value)}\n placeholder={searchPlaceholder}\n className=\"bg-card text-sm placeholder:text-muted-foreground focus-visible:border-ring/60 focus-visible:ring-2 focus-visible:ring-ring pl-8\"\n data-testid={testId ? `${testId}-search` : 'toolbar-search'}\n />\n </div>\n )}\n {filters}\n </div>\n {actions && <div className=\"flex items-center gap-2\">{actions}</div>}\n </div>\n )\n}\n","import { useEffect, useState, type ReactNode } from 'react'\nimport { Pencil } from 'lucide-react'\nimport { Input, Textarea, cn } from '@arbidocs/react/ui'\n\n/** Longest a name may be. Exported so a form editing the same field agrees. */\nexport const IDENTITY_NAME_MAX_LENGTH = 50\n\n/** Shown once the remaining allowance gets this low, not for the whole time. */\nconst COUNTER_THRESHOLD = 10\n\nexport interface EntityIdentityField {\n /** Row caption. Rendered with a trailing colon. */\n label: string\n value: string\n /** Stands in for an empty value, in italics — never a blank row. */\n placeholder: string\n /** Commits the edit. Not called when the value is unchanged. */\n onSave: (next: string) => void\n /** A description needs line breaks; a name does not. */\n multiline?: boolean\n /** Caps the input and shows a counter as it fills. Names only, by default. */\n maxLength?: number\n /** Classes for the read-mode value, e.g. a larger weight for the name. */\n valueClassName?: string\n /**\n * Content pinned to the RIGHT END of this row — e.g. the owning project\n * beside a name, a member stack beside a status. Rows without one let their\n * value run the full width, which is what a description wants.\n */\n trailing?: ReactNode\n /**\n * Content rendered immediately BEFORE the value — the entity's own mark.\n * Sits outside the edit swap, so starting to edit the name doesn't make the\n * icon jump or disappear.\n */\n leading?: ReactNode\n /**\n * Drops the caption from view for this row, leaving the value flush left.\n * For a field whose value already says what it is — a workspace's name and\n * description read as exactly that — the caption is a word the eye has to\n * step over on the way in. The caption stays in the markup for screen\n * readers, which have no such visual cue to fall back on.\n */\n hideLabel?: boolean\n /** Row test id; the pencil and input derive `-edit` and `-input`. */\n testId?: string\n}\n\nexport interface EntityIdentityBarProps {\n /** The editable text fields, in order. Usually name then description. */\n fields: EntityIdentityField[]\n /**\n * Read-only rows shown after the editable ones — anything whose control the\n * consumer owns (a project picker, an owner avatar, a status). Rendered with\n * the same caption column so every row lines up.\n */\n extraRows?: { label: string; content: ReactNode; trailing?: ReactNode; testId?: string }[]\n /** Hides every pencil. A viewer without permission sees values, not controls. */\n canEdit?: boolean\n /** Trailing controls, pinned right — e.g. a member stack, a status. */\n actions?: ReactNode\n /**\n * Controls that act on the ENTITY rather than on any one field — typically an\n * overflow menu holding delete or leave. Sits under the field list, where a\n * destructive action is findable but not in the path of everyday reading.\n */\n footer?: ReactNode\n className?: string\n testId?: string\n}\n\n/**\n * The \"what am I looking at\" bar for an entity's own page.\n *\n * A caption column (`Name:`, `Description:`, `Project:`) and a value column. The\n * captions are the point: a bare bold string at the top of a page reads equally\n * as a workspace, a project, a case file or a folder, and people read it as\n * whichever they expected. Saying which field is which costs one column and\n * removes the ambiguity entirely.\n *\n * Editing happens in place. The pencil is always visible to someone who can use\n * it rather than revealed on hover — a control you have to go hunting for is one\n * most people never find, and hover doesn't exist on touch. Commit is on blur\n * and on Enter (single-line fields only, so a description can hold line\n * breaks); Escape abandons the edit.\n *\n * Deliberately NOT a form: no submit, no dirty state, no field-level errors.\n * When a consumer needs visibility toggles, destructive actions or validation\n * messages, those belong in its settings form — this bar is the identity of the\n * thing, shown where you are working on it.\n *\n * Styled with SEMANTIC tokens only, so every host gets it in its own colours.\n */\nexport function EntityIdentityBar({\n fields,\n extraRows = [],\n canEdit = false,\n actions,\n footer,\n className,\n testId,\n}: EntityIdentityBarProps) {\n return (\n <div\n className={cn('flex flex-wrap items-start justify-between gap-x-6 gap-y-3', className)}\n data-testid={testId}\n >\n <dl className=\"min-w-0 flex-1 space-y-1.5\">\n {fields.map((field) => (\n <IdentityFieldRow key={field.label} field={field} canEdit={canEdit} />\n ))}\n {extraRows.map((row) => (\n <div\n key={row.label}\n className=\"flex min-h-7 min-w-0 items-center gap-2\"\n data-testid={row.testId}\n >\n <dt className=\"w-24 shrink-0 text-sm font-medium text-muted-foreground\">\n {row.label}:\n </dt>\n <dd className=\"flex min-w-0 flex-1 items-center gap-2\">\n {row.content}\n {row.trailing ? (\n <div className=\"min-w-0 shrink-0 sm:ml-auto\">{row.trailing}</div>\n ) : null}\n </dd>\n </div>\n ))}\n {footer ? <div className=\"flex items-center pt-0.5\">{footer}</div> : null}\n </dl>\n {actions ? <div className=\"flex shrink-0 items-center gap-2\">{actions}</div> : null}\n </div>\n )\n}\n\nfunction IdentityFieldRow({ field, canEdit }: { field: EntityIdentityField; canEdit: boolean }) {\n const {\n label,\n value,\n placeholder,\n onSave,\n multiline = false,\n maxLength,\n valueClassName,\n leading,\n hideLabel,\n trailing,\n testId,\n } = field\n\n const [isEditing, setIsEditing] = useState(false)\n const [draft, setDraft] = useState(value)\n\n // Track the value while not editing, so an update from elsewhere (another\n // tab, a websocket) doesn't get overwritten by a stale draft on the next edit.\n useEffect(() => {\n if (!isEditing) setDraft(value)\n }, [value, isEditing])\n\n const commit = () => {\n setIsEditing(false)\n const next = draft.trim()\n if (next !== value) onSave(next)\n }\n\n const cancel = () => {\n setDraft(value)\n setIsEditing(false)\n }\n\n const charsLeft = maxLength === undefined ? null : maxLength - draft.length\n\n // Editing must not move anything. The input carries the read view's exact\n // typography and padding, drops the border and shadow entirely, and marks\n // focus with a contrasting FIELD instead — a box appearing around the text\n // (and the row growing to fit it) reads as the page jumping under the cursor.\n const fieldClass =\n 'h-auto rounded border-0 bg-muted px-1.5 py-0.5 shadow-none focus-visible:ring-0 focus-visible:ring-offset-0'\n\n const shared = {\n autoFocus: true,\n value: draft,\n placeholder,\n maxLength,\n 'aria-label': label,\n 'data-testid': testId && `${testId}-input`,\n onBlur: commit,\n onChange: (e: { target: { value: string } }) => setDraft(e.target.value),\n onKeyDown: (e: React.KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault()\n cancel()\n } else if (e.key === 'Enter' && !multiline) {\n e.preventDefault()\n commit()\n }\n },\n }\n\n // Every row shares one minimum height: that of the small controls (h-7) a\n // row may carry at its trailing end. A row that is only text then sits in\n // the same rhythm as one holding a button, so the captions fall on an even\n // beat down the bar instead of bunching up wherever a row has no control.\n return (\n <div className={cn('flex min-h-7 min-w-0 gap-2', multiline ? 'items-start' : 'items-center')}>\n <dt\n className={cn(\n hideLabel\n ? 'sr-only'\n : cn('w-24 shrink-0 text-sm font-medium text-muted-foreground', multiline && 'pt-1')\n )}\n >\n {label}:\n </dt>\n {/* Wraps under sm: the trailing controls drop to their own line instead of overflowing. */}\n <dd className=\"flex min-w-0 flex-1 flex-wrap items-center gap-x-2 gap-y-1.5 sm:flex-nowrap\">\n {leading}\n {isEditing ? (\n <div className=\"relative min-w-0 flex-1 max-sm:basis-[calc(100%-2.5rem)]\">\n {multiline ? (\n <Textarea\n {...shared}\n rows={2}\n className={cn(fieldClass, 'min-h-0 resize-none leading-snug', valueClassName)}\n />\n ) : (\n <Input {...shared} className={cn(fieldClass, 'pr-20', valueClassName)} />\n )}\n {charsLeft !== null && charsLeft <= COUNTER_THRESHOLD && (\n <span\n className={cn(\n 'pointer-events-none absolute right-3 top-1/2 hidden -translate-y-1/2 text-sm lg:block',\n charsLeft < 0 ? 'text-destructive' : 'text-muted-foreground'\n )}\n data-testid={testId && `${testId}-counter`}\n >\n {charsLeft < 0 ? `${-charsLeft} over` : `${charsLeft} left`}\n </span>\n )}\n </div>\n ) : (\n // `identity-field` (not the generic `group`) scopes the pencil's hover\n // to THIS field only — an ancestor card also carries `group`, so a\n // `.group:hover` rule would reveal every field's pencil at once.\n <span className=\"identity-field flex min-w-0 flex-1 items-center gap-1.5 sm:flex-none\">\n {/* Same padding as the input above — the swap must not nudge the\n text sideways or change the row's height. */}\n <span className={cn('px-1.5 py-0.5', valueClassName)} data-testid={testId}>\n {value || <span className=\"italic text-muted-foreground\">{placeholder}</span>}\n </span>\n {canEdit && (\n <button\n type=\"button\"\n onClick={() => setIsEditing(true)}\n aria-label={`Edit ${label.toLowerCase()}`}\n title={`Edit ${label.toLowerCase()}`}\n // Quiet by default — the pencil only surfaces when the row is\n // hovered so it reads as clean text, and stays reachable by\n // keyboard (focus-visible).\n //\n // NB: use the ungated `[.identity-field:hover_&]` selector rather\n // than Tailwind's `group-hover:`. The latter compiles behind\n // `@media (hover: hover)`, so on a touchscreen (whose PRIMARY\n // pointer reports `hover: none`) the rule is disabled even when a\n // real mouse is firing hover events — the pencil then stays at\n // opacity-0 forever. The arbitrary selector has no media gate, so\n // it reveals on any genuine `:hover`.\n className=\"shrink-0 cursor-pointer rounded p-1 text-muted-foreground opacity-60 transition-[color,background-color,opacity] hover:bg-accent hover:text-foreground focus-visible:opacity-100 pointer-coarse:p-[15px] [.identity-field:hover_&]:opacity-100\"\n data-testid={testId && `${testId}-edit`}\n >\n <Pencil className=\"size-3.5\" />\n </button>\n )}\n </span>\n )}\n {trailing ? (\n <div className=\"min-w-0 shrink-0 max-sm:w-full sm:ml-auto\">{trailing}</div>\n ) : null}\n </dd>\n </div>\n )\n}\n","import type { ReactNode } from 'react'\nimport { cn } from '@arbidocs/react/ui'\n\n/**\n * Parts for the hover card of an entity pill (workspace, user, tag, ...): a header, optional\n * stat rows, bordered sections and an action hint. The host fills them from its own data.\n */\n\nexport function EntityTooltip({\n className,\n children,\n}: {\n className?: string\n children: ReactNode\n}) {\n return (\n <div data-slot=\"entity-tooltip\" className={cn('flex flex-col gap-2', className)}>\n {children}\n </div>\n )\n}\n\nexport interface EntityTooltipHeaderProps {\n /** Icon / avatar before the title. */\n lead: ReactNode\n title: ReactNode\n subtitle?: ReactNode\n /** Right-hand badge. */\n trailing?: ReactNode\n /** Extra glyph after the title (e.g. an agent mark). */\n titleAccessory?: ReactNode\n}\n\nexport function EntityTooltipHeader({\n lead,\n title,\n subtitle,\n trailing,\n titleAccessory,\n}: EntityTooltipHeaderProps) {\n return (\n <div className=\"flex items-center gap-2\">\n {lead}\n <div className=\"flex min-w-0 flex-1 flex-col\">\n <div className=\"flex items-center gap-1.5\">\n <span className=\"truncate text-sm font-medium\">{title}</span>\n {titleAccessory}\n </div>\n {subtitle && <span className=\"truncate text-xs text-muted-foreground\">{subtitle}</span>}\n </div>\n {trailing}\n </div>\n )\n}\n\nexport interface EntityTooltipStat {\n key: string\n icon: ReactNode\n label: ReactNode\n value: ReactNode\n}\n\n/** Label/value rows between two rules. */\nexport function EntityTooltipStats({ stats }: { stats: EntityTooltipStat[] }) {\n return (\n <div className=\"flex flex-col gap-1.5 border-y border-border py-2\">\n {stats.map((s) => (\n <div key={s.key} className=\"flex items-center justify-between text-sm\">\n <div className=\"flex items-center gap-2\">\n {s.icon}\n <span className=\"text-muted-foreground\">{s.label}</span>\n </div>\n <span className=\"font-medium\">{s.value}</span>\n </div>\n ))}\n </div>\n )\n}\n\n/** A secondary section under a rule, optionally headed by an icon + text. */\nexport function EntityTooltipSection({\n icon,\n heading,\n children,\n}: {\n icon?: ReactNode\n heading?: ReactNode\n children?: ReactNode\n}) {\n return (\n <div className=\"flex flex-col gap-1.5 border-t border-border pt-2\">\n {heading && (\n <div className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n {icon}\n <span>{heading}</span>\n </div>\n )}\n {children}\n </div>\n )\n}\n\n/** Muted one-liner at the foot of the card, e.g. \"Click to send message\". */\nexport function EntityTooltipHint({\n icon,\n children,\n isRuled,\n}: {\n icon?: ReactNode\n children: ReactNode\n /** Draw the rule above (the hint closes a card that already has sections). */\n isRuled?: boolean\n}) {\n return (\n <div\n className={cn(\n 'flex items-center gap-1.5 text-xs text-muted-foreground',\n isRuled && 'border-t border-border pt-1'\n )}\n >\n {icon}\n <span>{children}</span>\n </div>\n )\n}\n","/**\n * A question box that IS the product's front door, not a link to one.\n *\n * One input, two destinations: Enter (or the arrow) ASKS — hands the trimmed\n * text to `onAsk`, the conversational answer — while the Search button beside\n * it hands the same text to `onSearch`, the retrieval experience. The split\n * matters because queries come in both registers (\"what does\n * this term mean\" vs \"find every mention of it\") and making them choose a\n * page before typing kills the impulse. Omit `onSearch` and the bar is a plain\n * ask composer.\n *\n * The consumer owns what asking and searching mean (start a chat, run smart\n * search, open a record). Suggestion chips prefill the input rather than\n * firing immediately: a suggestion is a starting point you edit, not a button\n * you regret.\n *\n * Styled with SEMANTIC tokens only (card, border, foreground, muted-foreground,\n * primary), so every host gets it in its own colours.\n */\n\nimport { useRef, useState, type KeyboardEventHandler, type ReactNode, type RefObject } from 'react'\nimport { Search, Sparkles } from 'lucide-react'\nimport { Button, cn } from '@arbidocs/react/ui'\n\nexport interface AskBarProps {\n /** Receives the trimmed question; the caller owns what asking means. */\n onAsk: (text: string) => void\n /** Second destination for the same text — retrieval. Omit to hide. */\n onSearch?: (text: string) => void\n /** Prefill-on-click starter questions, shown under the input. */\n suggestions?: string[]\n placeholder?: string\n askLabel?: string\n searchLabel?: string\n /** Controlled value. Omit for the bar to own its own text. */\n value?: string\n onValueChange?: (value: string) => void\n /** Raw keydown on the input — lets a consumer run an autocomplete\n * (arrow/Enter/Tab/Escape) before the form's own submit handling.\n * preventDefault() on Enter suppresses the submit. */\n onInputKeyDown?: KeyboardEventHandler<HTMLInputElement>\n /** Popover anchored to the pill (e.g. a slash-command menu). Rendered in a\n * relative wrapper around the form, so absolute children position against\n * the pill. */\n menu?: ReactNode\n /** External input ref, for consumers that refocus after menu selection. */\n inputRef?: RefObject<HTMLInputElement | null>\n className?: string\n /** Root test id; children derive `-input`, `-submit`, `-search`, `-suggestion`. */\n testId?: string\n}\n\nexport function AskBar({\n onAsk,\n onSearch,\n suggestions = [],\n placeholder = 'Ask anything…',\n askLabel = 'Ask',\n searchLabel = 'Search',\n value,\n onValueChange,\n onInputKeyDown,\n menu,\n inputRef: externalInputRef,\n className,\n testId = 'ask-bar',\n}: AskBarProps) {\n const [innerText, setInnerText] = useState('')\n const text = value !== undefined ? value : innerText\n const setText = (next: string) => {\n onValueChange?.(next)\n if (value === undefined) setInnerText(next)\n }\n const localInputRef = useRef<HTMLInputElement>(null)\n const inputRef = externalInputRef ?? localInputRef\n\n const submitTo = (handler: (text: string) => void) => {\n const question = text.trim()\n if (!question) return\n handler(question)\n setText('')\n }\n\n return (\n <div className={cn('flex flex-col gap-2', className)} data-testid={testId}>\n <div className=\"relative\">\n {menu}\n <form\n onSubmit={(e) => {\n e.preventDefault()\n submitTo(onAsk)\n }}\n // The AppHeader search pill's language exactly — rounded-md,\n // border-input, magnifier left, muted text — so the bar sits in a\n // topbar the way a ⌘K trigger does, not like a chat composer\n // dropped into a header.\n className=\"flex h-12 items-center gap-1.5 rounded-md border border-border/50 bg-background pl-3 pr-1.5 transition-colors focus-within:border-border\"\n >\n <Search className=\"pointer-events-none size-4 shrink-0 text-muted-foreground\" />\n <input\n ref={inputRef}\n type=\"text\"\n value={text}\n onChange={(e) => setText(e.target.value)}\n onKeyDown={onInputKeyDown}\n placeholder={placeholder}\n className=\"h-8 min-w-0 flex-1 bg-transparent text-sm text-foreground outline-none placeholder:text-muted-foreground\"\n data-testid={testId && `${testId}-input`}\n />\n {onSearch && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n disabled={!text.trim()}\n onClick={() => submitTo(onSearch)}\n className=\"h-8 shrink-0 px-2.5 text-xs font-medium text-muted-foreground hover:text-foreground\"\n data-testid={testId && `${testId}-search`}\n >\n {searchLabel}\n </Button>\n )}\n {/* The primary door wears the Ask AI anatomy: Sparkles + label. */}\n <Button\n type=\"submit\"\n size=\"sm\"\n disabled={!text.trim()}\n className=\"h-8 shrink-0 px-3 text-xs font-medium\"\n data-testid={testId && `${testId}-submit`}\n >\n <Sparkles className=\"size-3.5\" />\n {askLabel}\n </Button>\n </form>\n </div>\n {suggestions.length > 0 && (\n <div className=\"flex flex-wrap gap-1.5\">\n {suggestions.map((s) => (\n <button\n key={s}\n type=\"button\"\n onClick={() => {\n setText(s)\n inputRef.current?.focus()\n }}\n className=\"rounded-full border border-border/50 bg-card px-3 py-1 text-xs text-muted-foreground transition-colors hover:border-border hover:bg-accent hover:text-foreground\"\n data-testid={testId && `${testId}-suggestion`}\n >\n {s}\n </button>\n ))}\n </div>\n )}\n </div>\n )\n}\n"]}
|
package/dist/settings/index.cjs
CHANGED
|
@@ -4,10 +4,10 @@
|
|
|
4
4
|
var chunkVUEZARW5_cjs = require('../chunk-VUEZARW5.cjs');
|
|
5
5
|
var chunk223D4727_cjs = require('../chunk-223D4727.cjs');
|
|
6
6
|
var chunk46IU3UPF_cjs = require('../chunk-46IU3UPF.cjs');
|
|
7
|
+
require('../chunk-ADOKTJHV.cjs');
|
|
7
8
|
var chunkYJQVLVBJ_cjs = require('../chunk-YJQVLVBJ.cjs');
|
|
8
9
|
var chunkVFUWWH52_cjs = require('../chunk-VFUWWH52.cjs');
|
|
9
10
|
var chunk7RGLTF76_cjs = require('../chunk-7RGLTF76.cjs');
|
|
10
|
-
require('../chunk-ADOKTJHV.cjs');
|
|
11
11
|
require('../chunk-PPCATBOY.cjs');
|
|
12
12
|
var chunkKDG6FER6_cjs = require('../chunk-KDG6FER6.cjs');
|
|
13
13
|
var chunk2ZTONLT5_cjs = require('../chunk-2ZTONLT5.cjs');
|
package/dist/settings/index.js
CHANGED
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
export { ActiveSessionsDialog, AvatarPicker, DEFAULT_ACTIVE_SESSIONS_DIALOG_LABELS, DEFAULT_AVATAR_PICKER_LABELS, DEFAULT_DELETE_ACCOUNT_DIALOG_LABELS, DEFAULT_LOGOUT_DIALOG_LABELS, DEFAULT_PASSWORD_CHANGE_DIALOG_LABELS, DEFAULT_PROFILE_CARD_LABELS, DEFAULT_SETTINGS_DANGER_ZONE_LABELS, DeleteAccountDialog, EMAIL_NOTIFICATION_CATEGORIES, EMAIL_NOTIFICATION_KEYS, LogoutDialog, NotificationCategoryList, PasswordChangeDialog, ProfileCard, SettingsActionRow, SettingsCard, SettingsDangerZone, SettingsPanel, SettingsRow, SettingsSection, SettingsSwitchGroup, SettingsSwitchRow, formatSessionTtl, toActiveSessionViews, toDeleteBlockerViews, toLogoutSessionViews, toNotificationCategories } from '../chunk-VZGBCBYB.js';
|
|
3
3
|
export { ModalBreadcrumbHeader, ModalCrumbs } from '../chunk-RC6VTY2H.js';
|
|
4
4
|
import { UsageMeter } from '../chunk-D5T53XCL.js';
|
|
5
|
+
import '../chunk-VILAPTCB.js';
|
|
5
6
|
export { DEFAULT_DOCUMENT_PICKER_LABELS, DEFAULT_TRI_STATE_FILTER_MENU_LABELS, DocumentPicker, MultiSelect, TriStateFilterMenu } from '../chunk-CKB64Z4R.js';
|
|
6
7
|
import { TONE_BORDER, TONE_SURFACE, ToneBadge } from '../chunk-DPLRHEJZ.js';
|
|
7
8
|
import { TabHeader } from '../chunk-4WWM3GQ5.js';
|
|
8
|
-
import '../chunk-VILAPTCB.js';
|
|
9
9
|
import '../chunk-NPLYHR2E.js';
|
|
10
10
|
import { formatCount } from '../chunk-OXF2IFXG.js';
|
|
11
11
|
import { ModalScaffold, ModalSection, ModalSectionTitle, ModalHeader } from '../chunk-CPMNAJLF.js';
|
package/dist/studio/index.cjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
|
-
var
|
|
4
|
+
var chunkLR54PQ7N_cjs = require('../chunk-LR54PQ7N.cjs');
|
|
5
5
|
var chunk7QDX2CO4_cjs = require('../chunk-7QDX2CO4.cjs');
|
|
6
6
|
var chunkMJCCBMM5_cjs = require('../chunk-MJCCBMM5.cjs');
|
|
7
7
|
var chunkELR74ME6_cjs = require('../chunk-ELR74ME6.cjs');
|
|
@@ -9,8 +9,9 @@ require('../chunk-VPPX5XUF.cjs');
|
|
|
9
9
|
var chunkPCB2BPN3_cjs = require('../chunk-PCB2BPN3.cjs');
|
|
10
10
|
var chunkZW6FPIFC_cjs = require('../chunk-ZW6FPIFC.cjs');
|
|
11
11
|
require('../chunk-OB5F4577.cjs');
|
|
12
|
-
require('../chunk-
|
|
12
|
+
require('../chunk-UW3IHMYA.cjs');
|
|
13
13
|
require('../chunk-VGOFFCMT.cjs');
|
|
14
|
+
require('../chunk-V3L5DONY.cjs');
|
|
14
15
|
require('../chunk-PPCATBOY.cjs');
|
|
15
16
|
var chunkC54XEN5T_cjs = require('../chunk-C54XEN5T.cjs');
|
|
16
17
|
var chunkKDG6FER6_cjs = require('../chunk-KDG6FER6.cjs');
|
|
@@ -881,7 +882,7 @@ function latestImageDocId(artifacts) {
|
|
|
881
882
|
return null;
|
|
882
883
|
}
|
|
883
884
|
function useImageGen() {
|
|
884
|
-
const task =
|
|
885
|
+
const task = chunkLR54PQ7N_cjs.useConnectedAiTask();
|
|
885
886
|
const { run } = task;
|
|
886
887
|
const generate = react.useCallback(
|
|
887
888
|
async (prompt, referenceDocIds = []) => {
|