@ship-it-ui/shipit 0.0.4 → 0.0.6

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/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/ai/AskBar.tsx","../src/ai/Citation.tsx","../src/ai/ConfidenceIndicator.tsx","../src/ai/CopilotMessage.tsx","../src/ai/ReasoningBlock.tsx","../src/ai/SuggestionChip.tsx","../src/ai/ToolCallCard.tsx","../src/entity/EntityBadge.tsx","../src/entity/types.ts","../src/entity/EntityCard.tsx","../src/entity/EntityListRow.tsx","../src/graph/GraphEdge.tsx","../src/graph/GraphInspector.tsx","../src/graph/GraphLegend.tsx","../src/graph/GraphMinimap.tsx","../src/graph/GraphNode.tsx","../src/graph/PathOverlay.tsx","../src/marketing/CTAStrip.tsx","../src/marketing/FeatureGrid.tsx","../src/marketing/Footer.tsx","../src/marketing/Hero.tsx","../src/marketing/PricingCard.tsx","../src/marketing/Testimonial.tsx","../src/data/ConnectorCard.tsx","../src/data/EntityTable.tsx"],"sourcesContent":["/**\n * @ship-it-ui/shipit — ShipIt-AI domain composites built on @ship-it-ui/ui.\n *\n * AI surfaces, knowledge-graph chrome, entity displays, and marketing\n * sections. Add new composites here as they're built. Keep exports\n * alphabetical within each category.\n */\n\n// Utilities — re-exported from @ship-it-ui/ui to keep the canonical implementation\n// in one place (clsx + tailwind-merge live there).\nexport { cn } from '@ship-it-ui/ui';\n\n// AI surfaces\nexport * from './ai';\n\n// Entity displays\nexport * from './entity';\n\n// Graph chrome\nexport * from './graph';\n\n// Marketing\nexport * from './marketing';\n\n// Data composites\nexport * from './data';\n","'use client';\n\nimport { Button, useControllableState } from '@ship-it-ui/ui';\nimport { cn } from '@ship-it-ui/ui';\nimport {\n forwardRef,\n useRef,\n type FormEvent,\n type HTMLAttributes,\n type KeyboardEvent,\n type ReactNode,\n} from 'react';\n\n/**\n * AskBar — the primary \"ask anything\" input. The leading ✦ glyph + accent\n * caret give it the same identity as the Copilot bubbles. Submit with the\n * button or `⌘↵` / `Ctrl↵`.\n *\n * Children are rendered as scope chips below the textarea (use the existing\n * `<Chip>` from @ship-it-ui/ui to mark a scoped query). Children render slot is\n * the \"scopes\" row — leave empty for an unscoped bar.\n */\n\nexport interface AskBarProps extends Omit<\n HTMLAttributes<HTMLFormElement>,\n 'onSubmit' | 'onChange'\n> {\n value?: string;\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n /** Fires with the current query when submitted (button or ⌘↵). */\n onSubmit?: (value: string) => void;\n placeholder?: string;\n /** Streaming caret next to the input. */\n streaming?: boolean;\n /** Submit button label. Default `Ask`. */\n submitLabel?: ReactNode;\n /** Disable submit. */\n disabled?: boolean;\n /** Pixel max-width. Default 620. */\n maxWidth?: number | string;\n}\n\nexport const AskBar = forwardRef<HTMLFormElement, AskBarProps>(function AskBar(\n {\n value: valueProp,\n defaultValue,\n onValueChange,\n onSubmit,\n placeholder = 'Ask anything…',\n streaming,\n submitLabel = 'Ask',\n disabled,\n maxWidth = 620,\n className,\n children,\n ...props\n },\n ref,\n) {\n const [value, setValue] = useControllableState<string>({\n value: valueProp,\n defaultValue: defaultValue ?? '',\n onChange: onValueChange,\n });\n const inputRef = useRef<HTMLTextAreaElement>(null);\n\n const submit = () => {\n const v = (value ?? '').trim();\n if (!v) return;\n onSubmit?.(v);\n };\n\n const handleSubmit = (e: FormEvent) => {\n e.preventDefault();\n submit();\n };\n\n const handleKey = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n submit();\n }\n };\n\n return (\n <form\n ref={ref}\n role=\"search\"\n onSubmit={handleSubmit}\n style={{ maxWidth }}\n className={cn(\n 'border-border-strong bg-panel w-full rounded-xl border p-[14px] shadow',\n 'focus-within:border-accent focus-within:ring-accent-dim focus-within:ring-[3px]',\n className,\n )}\n {...props}\n >\n <div className=\"mb-[10px] flex items-start gap-[10px]\">\n <span aria-hidden className=\"text-accent text-[16px]\">\n ✦\n </span>\n <textarea\n ref={inputRef}\n value={value ?? ''}\n onChange={(e) => setValue(e.target.value)}\n onKeyDown={handleKey}\n placeholder={placeholder}\n aria-label={placeholder}\n rows={1}\n className={cn(\n 'text-text flex-1 resize-none border-0 bg-transparent text-[14px] leading-[1.5] outline-none',\n 'placeholder:text-text-dim',\n )}\n />\n {streaming && (\n <span\n aria-hidden\n className=\"bg-accent mt-[3px] inline-block h-4 w-px animate-[ship-pulse_1s_infinite]\"\n />\n )}\n </div>\n <div className=\"flex flex-wrap items-center gap-[6px]\">\n {children}\n <div className=\"ml-auto flex items-center gap-2\">\n <span aria-hidden className=\"text-text-dim font-mono text-[11px]\">\n ⌘↵\n </span>\n <Button\n type=\"submit\"\n size=\"sm\"\n variant=\"primary\"\n disabled={disabled || !(value ?? '').trim()}\n >\n {submitLabel}\n </Button>\n </div>\n </div>\n </form>\n );\n});\n\nAskBar.displayName = 'AskBar';\n","'use client';\n\nimport { cn } from '@ship-it-ui/ui';\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\n\n/**\n * Citation — superscript-style numbered chip + source label, used in answer\n * bodies to point back to the document/line that supports the claim.\n *\n * Pass `inline` for the inline superscript variant (rendered next to the\n * referenced text). The default block variant lives below the answer with a\n * source preview.\n */\n\nconst SUPERSCRIPTS = ['⁰', '¹', '²', '³', '⁴', '⁵', '⁶', '⁷', '⁸', '⁹'];\n\nfunction toSuperscript(n: number): string {\n return String(n)\n .split('')\n .map((d) => SUPERSCRIPTS[Number(d)] ?? d)\n .join('');\n}\n\nexport interface CitationProps extends HTMLAttributes<HTMLElement> {\n /** Citation number (1-indexed). */\n index: number;\n /** Source label — e.g., `runbook-oncall.md:L42`. */\n source?: ReactNode;\n /** Connector / origin line — e.g., `notion · updated 2d ago`. */\n meta?: ReactNode;\n /** Inline superscript variant (renders the number only, no source row). */\n inline?: boolean;\n}\n\nexport const Citation = forwardRef<HTMLElement, CitationProps>(function Citation(\n { index, source, meta, inline, className, ...props },\n ref,\n) {\n if (inline) {\n return (\n <sup\n ref={ref}\n aria-label={\n typeof source === 'string' ? `Citation ${index}: ${source}` : `Citation ${index}`\n }\n className={cn('text-accent ml-[2px] font-mono text-[10px]', className)}\n {...props}\n >\n {toSuperscript(index)}\n </sup>\n );\n }\n return (\n <span ref={ref} className={cn('inline-flex items-center gap-2', className)} {...props}>\n <span\n aria-hidden\n className=\"bg-accent-dim text-accent rounded-xs px-[6px] py-[2px] font-mono text-[10px]\"\n >\n {toSuperscript(index)}\n </span>\n <span className=\"text-text-muted text-[12px]\">\n {source != null && <>from {source}</>}\n {source != null && meta != null && <span className=\"text-text-dim\"> · </span>}\n {meta}\n </span>\n </span>\n );\n});\n\nCitation.displayName = 'Citation';\n","'use client';\n\nimport { cn } from '@ship-it-ui/ui';\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\n\n/**\n * ConfidenceIndicator — horizontal bar + percent + tier label. The tier tone\n * is derived automatically from the value (high ≥ 95, medium ≥ 80, low ≥ 50,\n * unverified < 50) but can be overridden via `tier`.\n */\n\nexport type ConfidenceTier = 'high' | 'medium' | 'low' | 'unverified';\n\nconst tierLabel: Record<ConfidenceTier, string> = {\n high: 'High',\n medium: 'Medium',\n low: 'Low · review',\n unverified: 'Unverified',\n};\n\nconst tierBarClass: Record<ConfidenceTier, string> = {\n high: 'bg-ok',\n medium: 'bg-accent',\n low: 'bg-warn',\n unverified: 'bg-err',\n};\n\nconst tierTextClass: Record<ConfidenceTier, string> = {\n high: 'text-ok',\n medium: 'text-accent',\n low: 'text-warn',\n unverified: 'text-err',\n};\n\nfunction deriveTier(value: number): ConfidenceTier {\n if (value >= 95) return 'high';\n if (value >= 80) return 'medium';\n if (value >= 50) return 'low';\n return 'unverified';\n}\n\nexport interface ConfidenceIndicatorProps extends HTMLAttributes<HTMLDivElement> {\n /** Confidence value 0..100. */\n value: number;\n /** Override the auto-derived tier. */\n tier?: ConfidenceTier;\n /** Override the tier label. */\n label?: ReactNode;\n /** Pixel width of the bar. Default 120. */\n width?: number;\n /** Hide the percent number. */\n hideValue?: boolean;\n}\n\nexport const ConfidenceIndicator = forwardRef<HTMLDivElement, ConfidenceIndicatorProps>(\n function ConfidenceIndicator(\n { value, tier: tierProp, label, width = 120, hideValue, className, ...props },\n ref,\n ) {\n const tier = tierProp ?? deriveTier(value);\n const pct = Math.max(0, Math.min(100, value));\n const display = label ?? tierLabel[tier];\n return (\n <div\n ref={ref}\n role=\"meter\"\n aria-label={props['aria-label'] ?? 'Confidence'}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={Math.round(pct)}\n aria-valuetext={`${Math.round(pct)}% — ${typeof display === 'string' ? display : tierLabel[tier]}`}\n className={cn('inline-flex items-center gap-[10px] text-[11px]', className)}\n {...props}\n >\n <span aria-hidden style={{ width }} className=\"bg-panel-2 h-1 overflow-hidden rounded-full\">\n <span\n className={cn(\n 'block h-full rounded-full transition-[width] duration-(--duration-step)',\n tierBarClass[tier],\n )}\n style={{ width: `${pct}%` }}\n />\n </span>\n {!hideValue && (\n <span className=\"text-text min-w-[44px] font-mono tabular-nums\">{pct.toFixed(1)}%</span>\n )}\n <span className={tierTextClass[tier]}>{display}</span>\n </div>\n );\n },\n);\n\nConfidenceIndicator.displayName = 'ConfidenceIndicator';\n","'use client';\n\nimport { Avatar } from '@ship-it-ui/ui';\nimport { cn } from '@ship-it-ui/ui';\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\n\n/**\n * CopilotMessage — chat bubble for the AI conversation. Two roles:\n * `user` (right-aligned implicit, panel-2 background) and `assistant`\n * (left-aligned, framed panel + border). Pass `streaming` to render a pulsing\n * caret at the end of the body.\n */\n\nexport type CopilotRole = 'user' | 'assistant';\n\nexport interface CopilotMessageProps extends HTMLAttributes<HTMLDivElement> {\n role: CopilotRole;\n /** Avatar initials (or full node) shown on the side. */\n avatar?: ReactNode;\n /** Streaming caret at the end of the body. */\n streaming?: boolean;\n}\n\nexport const CopilotMessage = forwardRef<HTMLDivElement, CopilotMessageProps>(\n function CopilotMessage({ role, avatar, streaming, className, children, ...props }, ref) {\n const isAssistant = role === 'assistant';\n return (\n <div\n ref={ref}\n className={cn('flex items-start gap-[10px]', className)}\n data-role={role}\n {...props}\n >\n {isAssistant ? (\n <span\n aria-hidden\n className=\"bg-accent-dim text-accent grid h-6 w-6 shrink-0 place-items-center rounded-full text-[11px] font-semibold\"\n >\n ✦\n </span>\n ) : typeof avatar === 'string' ? (\n <Avatar size=\"sm\" name={avatar} />\n ) : (\n (avatar ?? null)\n )}\n <div\n className={cn(\n 'rounded-base min-w-0 flex-1 px-[14px] py-3 text-[13px] leading-[1.6]',\n isAssistant ? 'bg-panel border-border border' : 'bg-panel-2',\n )}\n >\n {children}\n {streaming && (\n <span\n aria-hidden\n className=\"bg-accent ml-[2px] inline-block h-[14px] w-px animate-[ship-pulse_1s_infinite] align-middle\"\n />\n )}\n </div>\n </div>\n );\n },\n);\n\nCopilotMessage.displayName = 'CopilotMessage';\n","'use client';\n\nimport { useControllableState } from '@ship-it-ui/ui';\nimport { cn } from '@ship-it-ui/ui';\nimport { Children, forwardRef, type HTMLAttributes, type ReactNode } from 'react';\n\n/**\n * ReasoningBlock — collapsible \"Reasoning · N steps · 1.8s\" disclosure. Shows\n * the chain-of-thought / step trace expanded or collapsed. Pass `<ReasoningStep>`\n * children for each step.\n */\n\nexport interface ReasoningBlockProps extends Omit<HTMLAttributes<HTMLDivElement>, 'onChange'> {\n /** Override the heading label (defaults to `Reasoning · N steps`). */\n label?: ReactNode;\n /** Visible step count when label is auto. Defaults to children length. */\n stepCount?: number;\n /** Visible duration label (e.g., `1.8s`). */\n duration?: ReactNode;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n}\n\nexport const ReasoningBlock = forwardRef<HTMLDivElement, ReasoningBlockProps>(\n function ReasoningBlock(\n {\n label,\n stepCount,\n duration,\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n className,\n children,\n ...props\n },\n ref,\n ) {\n const [open, setOpen] = useControllableState<boolean>({\n value: openProp,\n defaultValue: defaultOpen,\n onChange: onOpenChange,\n });\n\n const inferredCount = stepCount ?? Children.count(children);\n const heading = label ?? `Reasoning · ${inferredCount} step${inferredCount === 1 ? '' : 's'}`;\n\n return (\n <div\n ref={ref}\n className={cn('border-border bg-panel-2 overflow-hidden rounded-md border', className)}\n {...props}\n >\n <button\n type=\"button\"\n aria-expanded={open}\n onClick={() => setOpen(!open)}\n className=\"focus-visible:ring-accent-dim flex w-full cursor-pointer items-center gap-[10px] border-0 bg-transparent px-[14px] py-[10px] text-left outline-none focus-visible:ring-[3px]\"\n >\n <span aria-hidden className=\"text-text-dim font-mono text-[11px]\">\n {open ? '▾' : '▸'}\n </span>\n <span className=\"text-[12px] font-medium\">{heading}</span>\n {duration != null && (\n <span className=\"text-text-dim ml-auto font-mono text-[10px]\">{duration}</span>\n )}\n </button>\n {open && (\n <div className=\"border-border text-text-muted border-t px-[14px] py-[10px] pl-9 text-[11px] leading-[1.7]\">\n {children}\n </div>\n )}\n </div>\n );\n },\n);\n\nReasoningBlock.displayName = 'ReasoningBlock';\n\nexport interface ReasoningStepProps extends HTMLAttributes<HTMLDivElement> {\n /** 1-indexed step number. Renders accent-colored before the body. */\n step: number;\n}\n\nexport const ReasoningStep = forwardRef<HTMLDivElement, ReasoningStepProps>(function ReasoningStep(\n { step, className, children, ...props },\n ref,\n) {\n return (\n <div ref={ref} className={cn('mb-[2px] last:mb-0', className)} {...props}>\n <span className=\"text-accent mr-[6px] font-mono\">{step}.</span>\n {children}\n </div>\n );\n});\n\nReasoningStep.displayName = 'ReasoningStep';\n","'use client';\n\nimport { cn } from '@ship-it-ui/ui';\nimport { forwardRef, type ButtonHTMLAttributes, type ReactNode } from 'react';\n\n/**\n * SuggestionChip — pill-shaped prompt suggestion. The ✦ glyph prefix signals\n * \"ask about this\" and matches the AskBar's identity.\n */\n\nexport interface SuggestionChipProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n /** Override the leading glyph. Defaults to `✦`. */\n glyph?: ReactNode;\n}\n\nexport const SuggestionChip = forwardRef<HTMLButtonElement, SuggestionChipProps>(\n function SuggestionChip({ glyph = '✦', className, children, type, ...props }, ref) {\n return (\n <button\n ref={ref}\n type={type ?? 'button'}\n className={cn(\n 'border-border bg-panel text-text inline-flex cursor-pointer items-center gap-[6px] rounded-full border px-[10px] py-[6px] text-[12px] outline-none',\n 'transition-colors duration-(--duration-micro)',\n 'hover:border-border-strong hover:bg-panel-2',\n 'focus-visible:ring-accent-dim focus-visible:ring-[3px]',\n className,\n )}\n {...props}\n >\n <span aria-hidden className=\"text-accent\">\n {glyph}\n </span>\n {children}\n </button>\n );\n },\n);\n\nSuggestionChip.displayName = 'SuggestionChip';\n","'use client';\n\nimport { Badge } from '@ship-it-ui/ui';\nimport { cn } from '@ship-it-ui/ui';\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\n\n/**\n * ToolCallCard — visual card for a function/tool invocation in the AI\n * conversation. Shows a `TOOL` badge, the tool name, status (running →\n * duration · result), and an optional code/args preview body.\n *\n * Pass `running` to render a streaming caret next to the timing. When the\n * call completes, replace `running` with `duration` and optionally `result`.\n */\n\nexport interface ToolCallCardProps extends HTMLAttributes<HTMLDivElement> {\n /** Tool / function name. Rendered in mono. */\n name: ReactNode;\n /** Status text — e.g., `94ms · 142 rows`. */\n status?: ReactNode;\n /** When true, shows a streaming caret next to the status. */\n running?: boolean;\n /** Optional preformatted body — typically args or a query preview. */\n children?: ReactNode;\n}\n\nexport const ToolCallCard = forwardRef<HTMLDivElement, ToolCallCardProps>(function ToolCallCard(\n { name, status, running, className, children, ...props },\n ref,\n) {\n return (\n <div\n ref={ref}\n className={cn('border-border bg-panel rounded-md border px-[14px] py-[10px]', className)}\n {...props}\n >\n <div className=\"flex items-center gap-[10px]\">\n <Badge size=\"sm\" variant=\"accent\">\n TOOL\n </Badge>\n <span className=\"font-mono text-[12px] font-medium\">{name}</span>\n <span className=\"text-text-dim ml-auto inline-flex items-center font-mono text-[10px]\">\n {running ? (\n <>\n running\n <span\n aria-hidden\n className=\"bg-accent ml-1 inline-block h-3 w-px animate-[ship-pulse_1s_infinite] align-middle\"\n />\n </>\n ) : (\n status\n )}\n </span>\n </div>\n {children && (\n <pre className=\"text-text-muted m-0 mt-[6px] font-mono text-[11px] leading-[1.6] break-words whitespace-pre-wrap\">\n {children}\n </pre>\n )}\n </div>\n );\n});\n\nToolCallCard.displayName = 'ToolCallCard';\n","'use client';\n\nimport { Badge, type BadgeProps } from '@ship-it-ui/ui';\nimport { cn } from '@ship-it-ui/ui';\nimport { forwardRef, type ReactNode } from 'react';\n\nimport { getEntityTypeMeta, type EntityType } from './types';\n\n/**\n * EntityBadge — small chip identifying an entity type. Resolves the canonical\n * glyph + label from the type, but accepts a `label` override for cases where\n * the consumer wants to show the entity's actual name.\n */\n\nexport interface EntityBadgeProps extends Omit<BadgeProps, 'variant'> {\n type: EntityType;\n /** Override the visible label. Defaults to the canonical type label. */\n label?: ReactNode;\n /** Hide the leading glyph. */\n hideGlyph?: boolean;\n}\n\nexport const EntityBadge = forwardRef<HTMLSpanElement, EntityBadgeProps>(function EntityBadge(\n { type, label, hideGlyph, className, children, ...props },\n ref,\n) {\n const meta = getEntityTypeMeta(type);\n return (\n <Badge\n ref={ref}\n variant={meta.badgeVariant}\n data-entity-type={type}\n className={cn(className)}\n {...props}\n >\n {!hideGlyph && (\n <span aria-hidden className=\"font-mono\">\n {meta.glyph}\n </span>\n )}\n {children ?? label ?? meta.label}\n </Badge>\n );\n});\n\nEntityBadge.displayName = 'EntityBadge';\n","/**\n * ShipIt entity vocabulary. Six built-in categories — `service`, `person`,\n * `document`, `deployment`, `incident`, `ticket` — cover the graph's core\n * shapes. The `EntityType` type is intentionally open: consumers may pass any\n * string and register metadata for it via {@link registerEntityType} so their\n * domain types (Repository, Pipeline, Monitor, …) render with the right glyph,\n * label, and tone.\n *\n * Unregistered types fall back to the `service` visuals so a stray value never\n * crashes the UI; consumers can detect them via the `data-entity-type` attribute\n * that entity components forward to the DOM.\n */\n\nexport type KnownEntityType =\n | 'service'\n | 'person'\n | 'document'\n | 'deployment'\n | 'incident'\n | 'ticket';\n\n// The `(string & {})` branch preserves autocomplete for the six known literals\n// while still accepting any string value at runtime.\nexport type EntityType = KnownEntityType | (string & {});\n\n/**\n * Variant key for the shared `Badge` component in `@ship-it-ui/ui`. Inlined here\n * to keep `types.ts` free of cross-package value imports.\n */\nexport type EntityBadgeVariant = 'neutral' | 'accent' | 'ok' | 'warn' | 'err' | 'purple' | 'pink';\n\nexport interface EntityTypeMeta {\n /** Single-character glyph rendered next to the type label. */\n glyph: string;\n /** Human-readable type name (e.g. `'Service'`). */\n label: string;\n /** Tailwind text-color class for the glyph and accent text. */\n toneClass: string;\n /** Tailwind background-color class for the icon plate. */\n toneBg: string;\n /** CSS color value used by graph chrome (node ring + legend dot). */\n colorVar: string;\n /** Variant for the shared `Badge` component. */\n badgeVariant: EntityBadgeVariant;\n}\n\nconst BUILTIN_META: Record<KnownEntityType, EntityTypeMeta> = {\n service: {\n glyph: '◇',\n label: 'Service',\n toneClass: 'text-accent',\n toneBg: 'bg-accent-dim',\n colorVar: 'var(--color-accent)',\n badgeVariant: 'accent',\n },\n person: {\n glyph: '○',\n label: 'Person',\n toneClass: 'text-text-muted',\n toneBg: 'bg-panel-2',\n colorVar: 'var(--color-purple)',\n badgeVariant: 'neutral',\n },\n document: {\n glyph: '▤',\n label: 'Document',\n toneClass: 'text-purple',\n toneBg: 'bg-[color-mix(in_oklab,var(--color-purple),transparent_85%)]',\n colorVar: 'var(--color-pink)',\n badgeVariant: 'purple',\n },\n deployment: {\n glyph: '↑',\n label: 'Deployment',\n toneClass: 'text-ok',\n toneBg: 'bg-[color-mix(in_oklab,var(--color-ok),transparent_85%)]',\n colorVar: 'var(--color-ok)',\n badgeVariant: 'ok',\n },\n incident: {\n glyph: '◎',\n label: 'Incident',\n toneClass: 'text-err',\n toneBg: 'bg-[color-mix(in_oklab,var(--color-err),transparent_85%)]',\n colorVar: 'var(--color-warn)',\n badgeVariant: 'err',\n },\n ticket: {\n glyph: '▢',\n label: 'Ticket',\n toneClass: 'text-warn',\n toneBg: 'bg-[color-mix(in_oklab,var(--color-warn),transparent_85%)]',\n colorVar: 'var(--color-text-muted)',\n badgeVariant: 'warn',\n },\n};\n\nconst FALLBACK: EntityTypeMeta = BUILTIN_META.service;\n\nconst registry = new Map<string, EntityTypeMeta>(Object.entries(BUILTIN_META));\n\n/**\n * Register or replace metadata for an entity type. Pass any string key — the\n * built-in six can be overridden too. Returns the registered metadata.\n */\nexport function registerEntityType(type: string, meta: EntityTypeMeta): EntityTypeMeta {\n registry.set(type, meta);\n return meta;\n}\n\n/** Bulk-register a map of entity types. */\nexport function registerEntityTypes(map: Record<string, EntityTypeMeta>): void {\n for (const [key, meta] of Object.entries(map)) {\n registry.set(key, meta);\n }\n}\n\n/**\n * Resolve metadata for an entity type. Unknown types fall back to the `service`\n * metadata so consumers never crash on a stray value.\n */\nexport function getEntityTypeMeta(type: EntityType): EntityTypeMeta {\n return registry.get(type) ?? FALLBACK;\n}\n\n/**\n * Snapshot every registered entity type as `[type, meta]` tuples. Used by\n * downstream packages (e.g. `@ship-it-ui/cytoscape`) to enumerate types when\n * emitting per-type styles. Cheap — just `Array.from(map)`.\n */\nexport function listEntityTypes(): ReadonlyArray<readonly [string, EntityTypeMeta]> {\n return Array.from(registry.entries());\n}\n\n/** Test-only helper: drop all consumer registrations and re-seed the built-ins. */\nexport function resetEntityTypeRegistry(): void {\n registry.clear();\n for (const key of Object.keys(BUILTIN_META) as KnownEntityType[]) {\n registry.set(key, BUILTIN_META[key]);\n }\n}\n\n/**\n * @deprecated Prefer `getEntityTypeMeta(type).glyph`. Retained for the six\n * built-in types so existing consumers keep working.\n */\nexport const ENTITY_GLYPH: Record<KnownEntityType, string> = {\n service: BUILTIN_META.service.glyph,\n person: BUILTIN_META.person.glyph,\n document: BUILTIN_META.document.glyph,\n deployment: BUILTIN_META.deployment.glyph,\n incident: BUILTIN_META.incident.glyph,\n ticket: BUILTIN_META.ticket.glyph,\n};\n\n/** @deprecated Prefer `getEntityTypeMeta(type).label`. */\nexport const ENTITY_LABEL: Record<KnownEntityType, string> = {\n service: BUILTIN_META.service.label,\n person: BUILTIN_META.person.label,\n document: BUILTIN_META.document.label,\n deployment: BUILTIN_META.deployment.label,\n incident: BUILTIN_META.incident.label,\n ticket: BUILTIN_META.ticket.label,\n};\n\n/** @deprecated Prefer `getEntityTypeMeta(type).toneClass`. */\nexport const ENTITY_TONE_CLASS: Record<KnownEntityType, string> = {\n service: BUILTIN_META.service.toneClass,\n person: BUILTIN_META.person.toneClass,\n document: BUILTIN_META.document.toneClass,\n deployment: BUILTIN_META.deployment.toneClass,\n incident: BUILTIN_META.incident.toneClass,\n ticket: BUILTIN_META.ticket.toneClass,\n};\n\n/** @deprecated Prefer `getEntityTypeMeta(type).toneBg`. */\nexport const ENTITY_TONE_BG: Record<KnownEntityType, string> = {\n service: BUILTIN_META.service.toneBg,\n person: BUILTIN_META.person.toneBg,\n document: BUILTIN_META.document.toneBg,\n deployment: BUILTIN_META.deployment.toneBg,\n incident: BUILTIN_META.incident.toneBg,\n ticket: BUILTIN_META.ticket.toneBg,\n};\n","'use client';\n\nimport { cn } from '@ship-it-ui/ui';\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\n\nimport { EntityBadge } from './EntityBadge';\nimport { getEntityTypeMeta, type EntityType } from './types';\n\n/**\n * EntityCard — display card for a graph entity. Plate (icon + tinted bg),\n * title, optional subtitle / description, and an optional stats grid.\n *\n * Stats render in a 2- or 3-column grid below the description; pass `[]` (or\n * omit) to skip them.\n */\n\nexport interface EntityStat {\n label: ReactNode;\n value: ReactNode;\n /** Tone for the value text — defaults to plain `text-text`. */\n tone?: 'accent' | 'ok' | 'warn' | 'err' | 'muted';\n}\n\nexport interface EntityCardProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n type: EntityType;\n title: ReactNode;\n /** Subtitle line — typically owner / scope. */\n subtitle?: ReactNode;\n /** Body description. */\n description?: ReactNode;\n /** Stat tiles. Up to 6 fit comfortably across one row. */\n stats?: ReadonlyArray<EntityStat>;\n /** Right-side actions (buttons). */\n actions?: ReactNode;\n /** Override the leading glyph. */\n glyph?: ReactNode;\n}\n\nconst statToneClass = {\n accent: 'text-accent',\n ok: 'text-ok',\n warn: 'text-warn',\n err: 'text-err',\n muted: 'text-text-muted',\n} as const;\n\nexport const EntityCard = forwardRef<HTMLDivElement, EntityCardProps>(function EntityCard(\n { type, title, subtitle, description, stats, actions, glyph, className, ...props },\n ref,\n) {\n const meta = getEntityTypeMeta(type);\n return (\n <div\n ref={ref}\n data-entity-type={type}\n className={cn(\n 'rounded-base border-border bg-panel flex flex-col gap-3 border p-5',\n className,\n )}\n {...props}\n >\n <div className=\"flex items-start gap-3\">\n <span\n aria-hidden\n className={cn(\n 'rounded-base grid h-12 w-12 shrink-0 place-items-center text-[20px]',\n meta.toneBg,\n meta.toneClass,\n )}\n >\n {glyph ?? meta.glyph}\n </span>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <EntityBadge type={type} size=\"sm\" />\n {subtitle && <span className=\"text-text-dim font-mono text-[11px]\">{subtitle}</span>}\n </div>\n <div className=\"mt-1 truncate font-mono text-[18px] font-medium tracking-tight\">\n {title}\n </div>\n {description && (\n <div className=\"text-text-muted mt-1 text-[13px] leading-[1.5]\">{description}</div>\n )}\n </div>\n {actions && <div className=\"shrink-0\">{actions}</div>}\n </div>\n {stats && stats.length > 0 && (\n <div\n className=\"divide-border border-border bg-panel-2 grid divide-x rounded-md border\"\n style={{ gridTemplateColumns: `repeat(${Math.min(stats.length, 6)}, 1fr)` }}\n >\n {stats.map((stat, i) => (\n <div key={i} className=\"px-4 py-3\">\n <div className=\"text-text-dim font-mono text-[10px] tracking-[1.3px] uppercase\">\n {stat.label}\n </div>\n <div\n className={cn(\n 'mt-1 text-[16px] font-medium tracking-tight',\n stat.tone ? statToneClass[stat.tone] : 'text-text',\n )}\n >\n {stat.value}\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n );\n});\n\nEntityCard.displayName = 'EntityCard';\n","'use client';\n\nimport { cn } from '@ship-it-ui/ui';\nimport {\n forwardRef,\n type ButtonHTMLAttributes,\n type HTMLAttributes,\n type MouseEventHandler,\n type ReactNode,\n} from 'react';\n\nimport { getEntityTypeMeta, type EntityType } from './types';\n\n/**\n * EntityListRow — compact row for entity lists (e.g., dependents / dependencies\n * panels on a detail page). Glyph dot + name + optional relation pill +\n * optional trailing meta.\n *\n * Renders as a button when `onClick` is supplied; otherwise a plain row.\n *\n * For strongly-typed refs use the specialized exports `EntityListRowDiv`\n * (non-interactive) and `EntityListRowButton` (interactive). The default\n * `EntityListRow` is a thin wrapper that picks the right underlying element\n * based on whether `onClick` is provided.\n */\n\ninterface EntityListRowCommonProps {\n type: EntityType;\n /** Entity name / id. Rendered in mono. */\n name: ReactNode;\n /** Trailing pill (e.g., relation type: `OWNED_BY`). */\n relation?: ReactNode;\n /** Trailing meta line (e.g., a timestamp). */\n meta?: ReactNode;\n /** When true, hides the leading glyph dot. */\n hideGlyph?: boolean;\n}\n\nconst baseClassNames = (interactive: boolean, className?: string) =>\n cn(\n 'flex w-full items-center gap-3 border-0 bg-transparent px-2 py-2 text-left',\n 'border-b border-border last:border-0',\n interactive &&\n 'cursor-pointer outline-none transition-colors duration-(--duration-micro) hover:bg-panel-2 focus-visible:ring-[3px] focus-visible:ring-accent-dim',\n className,\n );\n\nfunction RowInner({\n type,\n name,\n relation,\n meta,\n hideGlyph,\n}: Pick<EntityListRowCommonProps, 'type' | 'name' | 'relation' | 'meta' | 'hideGlyph'>) {\n const typeMeta = getEntityTypeMeta(type);\n return (\n <>\n {!hideGlyph && (\n <span aria-hidden className={cn('font-mono text-[14px] leading-none', typeMeta.toneClass)}>\n {typeMeta.glyph}\n </span>\n )}\n <span className=\"text-text min-w-0 flex-1 truncate font-mono text-[12px]\">{name}</span>\n {relation && (\n <span className=\"border-border bg-panel-2 text-text-muted rounded-full border px-2 py-[2px] font-mono text-[10px]\">\n {relation}\n </span>\n )}\n {meta && <span className=\"text-text-dim font-mono text-[10px]\">{meta}</span>}\n </>\n );\n}\n\nexport interface EntityListRowDivProps\n extends EntityListRowCommonProps, Omit<HTMLAttributes<HTMLDivElement>, 'title' | 'name'> {}\n\n/** Non-interactive row. Use this when you have a static list of entities. */\nexport const EntityListRowDiv = forwardRef<HTMLDivElement, EntityListRowDivProps>(\n function EntityListRowDiv({ type, name, relation, meta, hideGlyph, className, ...props }, ref) {\n return (\n <div\n ref={ref}\n data-entity-type={type}\n className={baseClassNames(false, className)}\n {...props}\n >\n <RowInner type={type} name={name} relation={relation} meta={meta} hideGlyph={hideGlyph} />\n </div>\n );\n },\n);\n\nEntityListRowDiv.displayName = 'EntityListRowDiv';\n\nexport interface EntityListRowButtonProps\n extends\n EntityListRowCommonProps,\n Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'title' | 'type' | 'name' | 'onClick'> {\n /** Click handler. Required for the button variant. */\n onClick: MouseEventHandler<HTMLButtonElement>;\n}\n\n/** Interactive row rendered as a `<button>`. Use this when the row navigates. */\nexport const EntityListRowButton = forwardRef<HTMLButtonElement, EntityListRowButtonProps>(\n function EntityListRowButton(\n { type, name, relation, meta, hideGlyph, className, onClick, ...props },\n ref,\n ) {\n return (\n <button\n ref={ref}\n type=\"button\"\n data-entity-type={type}\n onClick={onClick}\n className={baseClassNames(true, className)}\n {...props}\n >\n <RowInner type={type} name={name} relation={relation} meta={meta} hideGlyph={hideGlyph} />\n </button>\n );\n },\n);\n\nEntityListRowButton.displayName = 'EntityListRowButton';\n\nexport interface EntityListRowProps extends Omit<\n HTMLAttributes<HTMLElement>,\n 'title' | 'name' | 'onClick'\n> {\n type: EntityType;\n /** Entity name / id. Rendered in mono. */\n name: ReactNode;\n /** Trailing pill (e.g., relation type: `OWNED_BY`). */\n relation?: ReactNode;\n /** Trailing meta line (e.g., a timestamp). */\n meta?: ReactNode;\n /** When provided, the row becomes a clickable button. */\n onClick?: MouseEventHandler<HTMLButtonElement>;\n /** When true, hides the leading glyph dot. */\n hideGlyph?: boolean;\n}\n\n/**\n * Convenience wrapper: chooses `EntityListRowButton` when `onClick` is\n * supplied, otherwise `EntityListRowDiv`. Does not forward refs — when you\n * need a typed ref, reach for the specialized component directly.\n */\nexport function EntityListRow({\n type,\n name,\n relation,\n meta,\n hideGlyph,\n onClick,\n className,\n ...props\n}: EntityListRowProps) {\n if (typeof onClick === 'function') {\n return (\n <EntityListRowButton\n type={type}\n name={name}\n relation={relation}\n meta={meta}\n hideGlyph={hideGlyph}\n onClick={onClick}\n className={className}\n {...(props as Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n 'title' | 'type' | 'name' | 'onClick'\n >)}\n />\n );\n }\n return (\n <EntityListRowDiv\n type={type}\n name={name}\n relation={relation}\n meta={meta}\n hideGlyph={hideGlyph}\n className={className}\n {...(props as Omit<HTMLAttributes<HTMLDivElement>, 'title' | 'name'>)}\n />\n );\n}\n\nEntityListRow.displayName = 'EntityListRow';\n","'use client';\n\nimport { forwardRef, type SVGAttributes } from 'react';\n\n/**\n * GraphEdge — SVG `<line>` (or `<path>` if curve points are provided) rendered\n * with one of four canonical styles. Place inside a parent `<svg>`.\n *\n * For curves, pass `curve={{ cx, cy }}` — the edge becomes `M x1,y1 Q cx,cy x2,y2`.\n * Pass `arrowheadId=\"arr-accent\"` and define a matching `<defs><marker id=\"arr-accent\">…</marker></defs>`\n * once in your SVG to enable arrows.\n */\n\nexport type GraphEdgeStyle = 'solid' | 'dashed' | 'highlighted' | 'dim';\n\nexport interface GraphEdgeProps extends Omit<SVGAttributes<SVGElement>, 'd'> {\n x1: number;\n y1: number;\n x2: number;\n y2: number;\n /** Optional Q-curve control point. */\n curve?: { cx: number; cy: number };\n edgeStyle?: GraphEdgeStyle;\n /** Stroke color override. Defaults to the style's tone. */\n color?: string;\n /** Marker id for an arrowhead. */\n arrowheadId?: string;\n}\n\nconst styleProps: Record<\n GraphEdgeStyle,\n { stroke: string; strokeWidth: number; strokeDasharray?: string; opacity?: number }\n> = {\n solid: { stroke: 'var(--color-accent)', strokeWidth: 1.5 },\n dashed: { stroke: 'var(--color-accent)', strokeWidth: 1.5, strokeDasharray: '4 3' },\n highlighted: { stroke: 'var(--color-purple)', strokeWidth: 2.5 },\n dim: { stroke: 'var(--color-text-dim)', strokeWidth: 1, opacity: 0.4 },\n};\n\nexport const GraphEdge = forwardRef<SVGElement, GraphEdgeProps>(function GraphEdge(\n { x1, y1, x2, y2, curve, edgeStyle = 'solid', color, arrowheadId, ...props },\n ref,\n) {\n const base = styleProps[edgeStyle];\n const stroke = color ?? base.stroke;\n const sharedProps = {\n fill: 'none' as const,\n stroke,\n strokeWidth: base.strokeWidth,\n strokeDasharray: base.strokeDasharray,\n opacity: base.opacity,\n markerEnd: arrowheadId ? `url(#${arrowheadId})` : undefined,\n ...props,\n };\n if (curve) {\n return (\n <path\n ref={ref as React.Ref<SVGPathElement>}\n d={`M${x1},${y1} Q${curve.cx},${curve.cy} ${x2},${y2}`}\n {...sharedProps}\n />\n );\n }\n return (\n <line ref={ref as React.Ref<SVGLineElement>} x1={x1} y1={y1} x2={x2} y2={y2} {...sharedProps} />\n );\n});\n\nGraphEdge.displayName = 'GraphEdge';\n","'use client';\n\nimport { cn } from '@ship-it-ui/ui';\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\n\nimport { EntityBadge } from '../entity/EntityBadge';\nimport { type EntityType } from '../entity/types';\n\n/**\n * GraphInspector — drill-in panel that appears next to a selected graph node.\n * Header (type badge + id), title + description, properties table, and a\n * relations list.\n *\n * The component is presentation-only: data shape mirrors what an inspector\n * needs to show, without prescribing how the consumer fetches it.\n */\n\nexport interface InspectorProperty {\n key: ReactNode;\n value: ReactNode;\n}\n\nexport interface InspectorRelation {\n /** Direction or label, e.g., `→ depends on`. Rendered in mono. */\n relation: ReactNode;\n /** Related entity name. */\n entity: ReactNode;\n}\n\nexport interface GraphInspectorProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n type: EntityType;\n /** Right-side machine id (e.g., `ent_0x7a2f`). */\n entityId?: ReactNode;\n title: ReactNode;\n description?: ReactNode;\n properties?: ReadonlyArray<InspectorProperty>;\n relations?: ReadonlyArray<InspectorRelation>;\n /** Total relation count if `relations` is a partial slice. */\n relationCount?: number;\n}\n\nexport const GraphInspector = forwardRef<HTMLDivElement, GraphInspectorProps>(\n function GraphInspector(\n {\n type,\n entityId,\n title,\n description,\n properties,\n relations,\n relationCount,\n className,\n ...props\n },\n ref,\n ) {\n const total = relationCount ?? relations?.length ?? 0;\n return (\n <aside\n ref={ref}\n aria-label={typeof title === 'string' ? `${title} inspector` : 'Node inspector'}\n className={cn(\n 'rounded-base border-border bg-panel flex w-[340px] flex-col gap-3 border p-4',\n className,\n )}\n {...props}\n >\n <div className=\"flex items-center\">\n <EntityBadge type={type} size=\"sm\" />\n {entityId && (\n <span className=\"text-text-dim ml-auto font-mono text-[10px]\">{entityId}</span>\n )}\n </div>\n <div>\n <div className=\"text-[17px] font-medium\">{title}</div>\n {description && <div className=\"text-text-muted mt-[2px] text-[12px]\">{description}</div>}\n </div>\n {properties && properties.length > 0 && (\n <section>\n <div className=\"text-text-dim mb-2 font-mono text-[9px] tracking-[1.4px] uppercase\">\n Properties\n </div>\n <dl className=\"m-0 flex flex-col gap-1 font-mono text-[11px]\">\n {properties.map((p, i) => (\n <div\n key={i}\n className={cn('border-border flex py-1', i < properties.length - 1 && 'border-b')}\n >\n <dt className=\"text-text-dim w-[70px]\">{p.key}</dt>\n <dd className=\"m-0 flex-1\">{p.value}</dd>\n </div>\n ))}\n </dl>\n </section>\n )}\n {relations && relations.length > 0 && (\n <section>\n <div className=\"text-text-dim mb-2 font-mono text-[9px] tracking-[1.4px] uppercase\">\n Relations · {total}\n </div>\n <ul className=\"m-0 flex list-none flex-col gap-1 p-0 text-[11px]\">\n {relations.map((r, i) => (\n <li key={i} className=\"flex gap-2\">\n <span className=\"text-text-dim w-[100px] font-mono\">{r.relation}</span>\n <span>{r.entity}</span>\n </li>\n ))}\n </ul>\n </section>\n )}\n </aside>\n );\n },\n);\n\nGraphInspector.displayName = 'GraphInspector';\n","'use client';\n\nimport { cn } from '@ship-it-ui/ui';\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\n\nimport { getEntityTypeMeta, type EntityType } from '../entity/types';\n\n/**\n * GraphLegend — translucent floating legend panel for the graph viewport.\n * Use the `entries` prop for the canonical entity-type list, or compose\n * children directly for a custom legend. Entry colors and labels resolve\n * through the shared entity-type registry, so consumer-registered types\n * appear with their own visuals.\n */\n\nexport interface GraphLegendEntry {\n /** Entity type (resolves color + label automatically) or a custom shape. */\n type?: EntityType;\n color?: string;\n label?: ReactNode;\n}\n\nexport interface GraphLegendProps extends HTMLAttributes<HTMLDivElement> {\n entries?: ReadonlyArray<GraphLegendEntry>;\n /** Heading rendered above the entries. Default `Legend`. */\n heading?: ReactNode;\n}\n\nconst DEFAULT_ENTRIES: GraphLegendEntry[] = [\n { type: 'service' },\n { type: 'person' },\n { type: 'document' },\n];\n\nexport const GraphLegend = forwardRef<HTMLDivElement, GraphLegendProps>(function GraphLegend(\n { entries = DEFAULT_ENTRIES, heading = 'Legend', className, children, ...props },\n ref,\n) {\n return (\n <div\n ref={ref}\n className={cn(\n 'rounded-base border-border bg-panel/85 inline-flex flex-col gap-[6px] border p-[10px] text-[11px] backdrop-blur-[8px]',\n className,\n )}\n {...props}\n >\n {heading && (\n <div className=\"text-text-dim font-mono text-[9px] tracking-[1.4px] uppercase\">\n {heading}\n </div>\n )}\n {children ??\n entries.map((entry, i) => {\n const meta = entry.type ? getEntityTypeMeta(entry.type) : undefined;\n const color = entry.color ?? meta?.colorVar ?? 'currentColor';\n const label = entry.label ?? meta?.label ?? '';\n return (\n <div key={i} className=\"flex items-center gap-[6px]\">\n <span aria-hidden className=\"h-2 w-2 rounded-full\" style={{ background: color }} />\n <span>{label}</span>\n </div>\n );\n })}\n </div>\n );\n});\n\nGraphLegend.displayName = 'GraphLegend';\n","'use client';\n\nimport { cn } from '@ship-it-ui/ui';\nimport { forwardRef, type HTMLAttributes } from 'react';\n\n/**\n * GraphMinimap — miniature scatter of node positions with a translucent\n * rectangle marking the current viewport. Coordinates are normalized to\n * [0, 1] × [0, 1]; the minimap renders them inside its fixed pixel box.\n */\n\nexport interface MinimapPoint {\n /** Normalized x, 0..1. */\n x: number;\n /** Normalized y, 0..1. */\n y: number;\n /** Optional dot color. */\n color?: string;\n}\n\nexport interface MinimapViewport {\n /** Top-left x, normalized 0..1. */\n x: number;\n /** Top-left y, normalized 0..1. */\n y: number;\n /** Width as a fraction of the minimap, 0..1. */\n width: number;\n /** Height as a fraction of the minimap, 0..1. */\n height: number;\n}\n\nexport interface GraphMinimapProps extends HTMLAttributes<HTMLDivElement> {\n points: ReadonlyArray<MinimapPoint>;\n viewport?: MinimapViewport;\n /** Pixel width. Default 120. */\n width?: number;\n /** Pixel height. Default 72. */\n height?: number;\n}\n\nexport const GraphMinimap = forwardRef<HTMLDivElement, GraphMinimapProps>(function GraphMinimap(\n { points, viewport, width = 120, height = 72, className, ...props },\n ref,\n) {\n return (\n <div\n ref={ref}\n role=\"img\"\n aria-label=\"Graph minimap\"\n className={cn(\n 'border-border bg-panel/85 relative rounded-md border p-1 backdrop-blur-[8px]',\n className,\n )}\n style={{ width, height }}\n {...props}\n >\n <div className=\"relative h-full w-full\">\n {points.map((p, i) => (\n <span\n key={i}\n aria-hidden\n className=\"absolute h-[2px] w-[2px] rounded-full\"\n style={{\n left: `${p.x * 100}%`,\n top: `${p.y * 100}%`,\n background: p.color ?? 'var(--color-accent)',\n }}\n />\n ))}\n {viewport && (\n <span\n aria-hidden\n data-testid=\"minimap-viewport\"\n className=\"border-accent absolute rounded-[2px] border\"\n style={{\n left: `${viewport.x * 100}%`,\n top: `${viewport.y * 100}%`,\n width: `${viewport.width * 100}%`,\n height: `${viewport.height * 100}%`,\n background: 'var(--color-accent-glow)',\n }}\n />\n )}\n </div>\n </div>\n );\n});\n\nGraphMinimap.displayName = 'GraphMinimap';\n","'use client';\n\nimport { cn } from '@ship-it-ui/ui';\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\n\nimport { getEntityTypeMeta, type EntityType } from '../entity/types';\n\n/**\n * GraphNode — visual representation of a graph node. Resolves color + glyph\n * from the shared entity-type registry, so consumer-registered types render\n * with their own visuals. Five states (default, hover, selected, on-path,\n * dimmed). The component itself is presentation-only; pan / zoom / drag is\n * the host's job.\n */\n\nexport type GraphNodeState = 'default' | 'hover' | 'selected' | 'path' | 'dim';\n\nexport interface GraphNodeProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n type: EntityType;\n state?: GraphNodeState;\n /** Override the leading glyph. */\n glyph?: ReactNode;\n /** Caption rendered below the node. */\n label?: ReactNode;\n /** Pixel size of the square. Default 52. */\n size?: number;\n /** Use the node's \"on a path\" purple ring even if state isn't `path`. */\n pathColor?: string;\n}\n\nexport const GraphNode = forwardRef<HTMLDivElement, GraphNodeProps>(function GraphNode(\n { type, state = 'default', glyph, label, size = 52, pathColor, className, style, ...props },\n ref,\n) {\n const meta = getEntityTypeMeta(type);\n const color = state === 'path' ? (pathColor ?? 'var(--color-purple)') : meta.colorVar;\n // Glow opacity expressed as a percent for color-mix; hover ≈ 50% (was hex 80), default ≈ 25% (was hex 40).\n const glowPct = state === 'hover' ? 50 : 25;\n const opacity = state === 'dim' ? 0.35 : 1;\n const showRing = state === 'selected' || state === 'path';\n\n return (\n <div\n ref={ref}\n role=\"img\"\n aria-label={typeof label === 'string' ? label : `${type} node`}\n data-state={state}\n data-entity-type={type}\n className={cn('inline-flex flex-col items-center gap-[6px]', className)}\n style={style}\n {...props}\n >\n <div\n className=\"bg-panel grid place-items-center rounded-[14px] border-[1.5px] transition-all duration-(--duration-micro)\"\n style={{\n width: size,\n height: size,\n borderColor: color,\n color,\n fontSize: Math.round(size * 0.42),\n boxShadow: `0 0 ${state === 'hover' ? 30 : 20}px color-mix(in oklab, ${color} ${glowPct}%, transparent)`,\n outline: showRing ? `2px solid ${color}` : undefined,\n outlineOffset: showRing ? 4 : undefined,\n opacity,\n }}\n >\n {glyph ?? meta.glyph}\n </div>\n {label && <span className=\"text-text-dim font-mono text-[10px]\">{label}</span>}\n </div>\n );\n});\n\nGraphNode.displayName = 'GraphNode';\n","'use client';\n\nimport { forwardRef, type SVGAttributes } from 'react';\n\n/**\n * PathOverlay — `<polyline>` highlighting a multi-hop path through the graph.\n * Renders inside a parent `<svg>`; takes the path as a list of `{ x, y }`\n * waypoints and draws a thicker, accent-tone line plus an optional shadow\n * stroke for legibility on busy backgrounds.\n */\n\nexport interface PathPoint {\n x: number;\n y: number;\n}\n\nexport interface PathOverlayProps extends Omit<SVGAttributes<SVGGElement>, 'points'> {\n points: ReadonlyArray<PathPoint>;\n /** Stroke color. Defaults to the path-emphasis purple. */\n color?: string;\n /** Stroke width in px. Default 2.5. */\n width?: number;\n /** Halo shadow stroke for legibility. Default true. */\n halo?: boolean;\n}\n\nexport const PathOverlay = forwardRef<SVGGElement, PathOverlayProps>(function PathOverlay(\n { points, color = 'var(--color-purple)', width = 2.5, halo = true, ...props },\n ref,\n) {\n if (points.length < 2) return null;\n const coords = points.map((p) => `${p.x},${p.y}`).join(' ');\n return (\n <g ref={ref} {...props}>\n {halo && (\n <polyline\n points={coords}\n fill=\"none\"\n stroke=\"var(--color-bg)\"\n strokeWidth={width + 4}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n opacity={0.65}\n />\n )}\n <polyline\n points={coords}\n fill=\"none\"\n stroke={color}\n strokeWidth={width}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </g>\n );\n});\n\nPathOverlay.displayName = 'PathOverlay';\n","'use client';\n\nimport { cn } from '@ship-it-ui/ui';\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\n\n/**\n * CTAStrip — full-width call-to-action band. Title + body + actions, on a\n * gradient panel background. Sits between feature sections and the footer.\n */\n\nexport interface CTAStripProps extends Omit<HTMLAttributes<HTMLElement>, 'title'> {\n title: ReactNode;\n description?: ReactNode;\n actions?: ReactNode;\n}\n\nexport const CTAStrip = forwardRef<HTMLElement, CTAStripProps>(function CTAStrip(\n { title, description, actions, className, ...props },\n ref,\n) {\n return (\n <section\n ref={ref}\n className={cn(\n 'rounded-xl px-10 py-12 text-center',\n 'bg-[linear-gradient(135deg,var(--color-cta-from),var(--color-cta-to))]',\n className,\n )}\n {...props}\n >\n <h2 className=\"m-0 mb-[10px] text-[28px] font-medium tracking-[-0.4px]\">{title}</h2>\n {description && <p className=\"text-text-muted m-0 mb-5 text-[13px]\">{description}</p>}\n {actions && <div className=\"flex flex-wrap justify-center gap-2\">{actions}</div>}\n </section>\n );\n});\n\nCTAStrip.displayName = 'CTAStrip';\n","'use client';\n\nimport { cn } from '@ship-it-ui/ui';\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\n\n/**\n * FeatureGrid — responsive grid of feature tiles. Each tile shows a glyph,\n * title, body description.\n */\n\nexport interface Feature {\n glyph: ReactNode;\n title: ReactNode;\n description: ReactNode;\n}\n\nexport interface FeatureGridProps extends HTMLAttributes<HTMLDivElement> {\n features: ReadonlyArray<Feature>;\n /** Columns at the largest breakpoint. Default 3. */\n columns?: 2 | 3 | 4;\n}\n\nconst colsClass = {\n 2: 'md:grid-cols-2',\n 3: 'md:grid-cols-3',\n 4: 'md:grid-cols-2 lg:grid-cols-4',\n} as const;\n\nexport const FeatureGrid = forwardRef<HTMLDivElement, FeatureGridProps>(function FeatureGrid(\n { features, columns = 3, className, ...props },\n ref,\n) {\n return (\n <div\n ref={ref}\n className={cn('grid grid-cols-1 gap-3', colsClass[columns], className)}\n {...props}\n >\n {features.map((f, i) => (\n <div key={i} className=\"rounded-base border-border bg-panel border p-5\">\n <div aria-hidden className=\"text-accent mb-3 text-[22px]\">\n {f.glyph}\n </div>\n <div className=\"mb-[6px] text-[14px] font-medium\">{f.title}</div>\n <div className=\"text-text-muted text-[12px] leading-[1.55]\">{f.description}</div>\n </div>\n ))}\n </div>\n );\n});\n\nFeatureGrid.displayName = 'FeatureGrid';\n","'use client';\n\nimport { cn } from '@ship-it-ui/ui';\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\n\n/**\n * Footer — site footer with brand on the left and grouped link columns on\n * the right, plus a copyright line below a divider.\n */\n\nexport interface FooterLink {\n label: ReactNode;\n href: string;\n}\n\nexport interface FooterColumn {\n heading: ReactNode;\n links: ReadonlyArray<FooterLink>;\n}\n\nexport interface FooterProps extends HTMLAttributes<HTMLElement> {\n /** Brand label (logo + word mark). */\n brand?: ReactNode;\n columns: ReadonlyArray<FooterColumn>;\n /** Copyright / legal line. */\n copyright?: ReactNode;\n /** Right-side closing line (e.g., `made with care · san francisco`). */\n closing?: ReactNode;\n}\n\nexport const Footer = forwardRef<HTMLElement, FooterProps>(function Footer(\n { brand, columns, copyright, closing, className, ...props },\n ref,\n) {\n return (\n <footer ref={ref} className={cn('px-7 py-7', className)} {...props}>\n <div className=\"mb-7 flex flex-wrap gap-8\">\n {brand && <div>{brand}</div>}\n <div className=\"text-text-muted ml-auto flex flex-wrap gap-6 text-[12px]\">\n {columns.map((col, i) => (\n <div key={i} className=\"flex flex-col gap-[6px]\">\n <div className=\"text-text-dim font-mono text-[10px] tracking-[1.2px] uppercase\">\n {col.heading}\n </div>\n {col.links.map((link, j) => (\n <a\n key={j}\n href={link.href}\n className=\"text-text-muted hover:text-text no-underline\"\n >\n {link.label}\n </a>\n ))}\n </div>\n ))}\n </div>\n </div>\n <div className=\"border-border text-text-dim flex border-t pt-4 font-mono text-[11px]\">\n {copyright && <span>{copyright}</span>}\n {closing && <span className=\"ml-auto\">{closing}</span>}\n </div>\n </footer>\n );\n});\n\nFooter.displayName = 'Footer';\n","'use client';\n\nimport { cn } from '@ship-it-ui/ui';\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\n\n/**\n * Hero — landing-page top section. Optional eyebrow / pill above the headline,\n * a large heading (children of `<h1>`), a body description, and an action row.\n *\n * Designed for marketing surfaces only — do not bring this into the app.\n */\n\nexport interface HeroProps extends Omit<HTMLAttributes<HTMLElement>, 'title'> {\n /** Eyebrow / pill rendered above the headline. */\n eyebrow?: ReactNode;\n /** Headline. Pass JSX to highlight a phrase (e.g., `<span className=\"text-accent\">…</span>`). */\n title: ReactNode;\n /** Subheading. */\n description?: ReactNode;\n /** Action buttons row. */\n actions?: ReactNode;\n /** Trailing visual (right-side image, animation). When provided, the hero\n * switches to a two-column layout. */\n visual?: ReactNode;\n}\n\nexport const Hero = forwardRef<HTMLElement, HeroProps>(function Hero(\n { eyebrow, title, description, actions, visual, className, ...props },\n ref,\n) {\n const hasVisual = visual != null;\n return (\n <section\n ref={ref}\n className={cn(\n 'flex flex-col items-center justify-between gap-10 px-6 py-16 md:py-24',\n hasVisual && 'md:flex-row md:items-center md:gap-16',\n className,\n )}\n {...props}\n >\n <div className={cn('max-w-[680px]', !hasVisual && 'mx-auto text-center')}>\n {eyebrow}\n <h1\n className={cn(\n 'mb-4 text-[44px] leading-[1.05] font-medium tracking-[-1.6px] md:text-[56px]',\n eyebrow && 'mt-5',\n )}\n >\n {title}\n </h1>\n {description && (\n <p className=\"text-text-muted mb-7 text-[17px] leading-[1.6]\">{description}</p>\n )}\n {actions && (\n <div className={cn('flex flex-wrap gap-2', !hasVisual && 'justify-center')}>\n {actions}\n </div>\n )}\n </div>\n {visual && <div className=\"flex-1\">{visual}</div>}\n </section>\n );\n});\n\nHero.displayName = 'Hero';\n","'use client';\n\nimport { cn } from '@ship-it-ui/ui';\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\n\n/**\n * PricingCard — single tier in a pricing table. Shows tier name, price,\n * description, list of features (with ✓ markers), and an action button slot.\n *\n * The card establishes a CSS container, so the price scales with the card's\n * own inline-size rather than the viewport — when three cards crowd into a\n * narrow column the price doesn't blow out the layout.\n *\n * Pass `featured` to highlight the card with an accent border + tinted\n * background for the \"recommended\" tier. Use `priceUnit` for per-period\n * suffixes (e.g. `/ user / mo`) so the unit lays out next to the price\n * baseline-aligned and wraps cleanly when there isn't room.\n */\n\nexport interface PricingCardProps extends HTMLAttributes<HTMLDivElement> {\n /** Tier name — e.g., `Pro`, `Team`. */\n tier: ReactNode;\n /** Headline price, e.g. `$29` or `Talk to us`. */\n price: ReactNode;\n /** Optional small unit rendered next to the price, e.g. `/ user / mo`. */\n priceUnit?: ReactNode;\n /** Short description below the tier name. */\n description?: ReactNode;\n /** Feature bullet list. */\n features: ReadonlyArray<ReactNode>;\n /** Action button (typically a `<Button>`). */\n action?: ReactNode;\n /** Highlight as the recommended tier. */\n featured?: boolean;\n}\n\nexport const PricingCard = forwardRef<HTMLDivElement, PricingCardProps>(function PricingCard(\n { tier, price, priceUnit, description, features, action, featured, className, ...props },\n ref,\n) {\n return (\n <div\n ref={ref}\n className={cn(\n 'bg-panel @container flex flex-col gap-5 rounded-lg border p-5 @sm:p-6',\n featured ? 'border-accent shadow-lg' : 'border-border',\n className,\n )}\n {...props}\n >\n <div>\n <div className=\"mb-1 flex flex-wrap items-center gap-2\">\n <span className=\"text-[14px] font-medium\">{tier}</span>\n {featured && (\n <span className=\"bg-accent-dim text-accent rounded-full px-[6px] py-[1px] font-mono text-[10px]\">\n recommended\n </span>\n )}\n </div>\n {description && <div className=\"text-text-muted text-[12px]\">{description}</div>}\n </div>\n <div className=\"flex flex-wrap items-baseline justify-center gap-x-2 gap-y-1\">\n <span className=\"font-mono text-[22px] font-medium tracking-[-0.5px] text-balance @sm:text-[28px]\">\n {price}\n </span>\n {priceUnit != null && (\n <span className=\"text-text-dim text-[12px] whitespace-nowrap @sm:text-[13px]\">\n {priceUnit}\n </span>\n )}\n </div>\n <ul className=\"m-0 flex list-none flex-col gap-2 p-0\">\n {features.map((f, i) => (\n <li key={i} className=\"flex items-start gap-2 text-[13px]\">\n <span aria-hidden className=\"text-accent\">\n ✓\n </span>\n <span>{f}</span>\n </li>\n ))}\n </ul>\n {action && <div className=\"mt-auto\">{action}</div>}\n </div>\n );\n});\n\nPricingCard.displayName = 'PricingCard';\n","'use client';\n\nimport { Avatar } from '@ship-it-ui/ui';\nimport { cn } from '@ship-it-ui/ui';\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\n\n/**\n * Testimonial — pull-quote with author + role. Centered for marketing\n * surfaces.\n */\n\nexport interface TestimonialProps extends Omit<HTMLAttributes<HTMLElement>, 'cite' | 'role'> {\n /** The quoted body. */\n quote: ReactNode;\n /** Author display name. */\n author: ReactNode;\n /** Author role / company. */\n role?: ReactNode;\n /** Avatar initials or full node. */\n avatar?: ReactNode;\n}\n\nexport const Testimonial = forwardRef<HTMLElement, TestimonialProps>(function Testimonial(\n { quote, author, role, avatar, className, ...props },\n ref,\n) {\n return (\n <figure\n ref={ref}\n className={cn('mx-auto max-w-[620px] px-6 py-10 text-center', className)}\n {...props}\n >\n <div aria-hidden className=\"text-accent mb-4 text-[40px] leading-none\">\n &ldquo;\n </div>\n <blockquote className=\"m-0 text-[22px] leading-[1.45] font-medium tracking-[-0.3px]\">\n {quote}\n </blockquote>\n <figcaption className=\"mt-5 flex items-center justify-center gap-[10px]\">\n {typeof avatar === 'string' ? <Avatar size=\"md\" name={avatar} /> : avatar}\n <div className=\"text-left\">\n <div className=\"text-[13px] font-medium\">{author}</div>\n {role && <div className=\"text-text-dim text-[11px]\">{role}</div>}\n </div>\n </figcaption>\n </figure>\n );\n});\n\nTestimonial.displayName = 'Testimonial';\n","'use client';\n\nimport { IconGlyph, type ConnectorName } from '@ship-it-ui/icons';\nimport { cn, formatRelative, StatusDot, type StatusState } from '@ship-it-ui/ui';\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\n\n/**\n * ConnectorCard — integration card for \"connector hubs\". Renders a connector\n * logo (via `@ship-it-ui/icons` connector glyphs), the connector name, a\n * sync-state dot, a relative last-sync timestamp, an optional summary, and a\n * trailing action slot.\n *\n * When `onClick` is provided the whole card becomes a button; otherwise it\n * renders as a plain `<div>`.\n */\n\nexport type ConnectorStatus = 'connected' | 'syncing' | 'error' | 'disconnected';\n\nexport interface ConnectorCardProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n 'title' | 'onClick'\n> {\n /** Connector name keyed into `@ship-it-ui/icons` connectorGlyphs. */\n connector: ConnectorName | (string & {});\n /** Display name shown next to the logo. */\n name: ReactNode;\n /** Sync status. Drives the status dot tone + the default status label. */\n status: ConnectorStatus;\n /** Last successful sync timestamp. Formatted relative to `relativeNow`. */\n lastSyncedAt?: Date | string | number;\n /** Reference time for relative formatting (injectable for tests/SSR). */\n relativeNow?: Date;\n /** Free-text summary (e.g. \"1,243 docs · 8 channels\"). */\n summary?: ReactNode;\n /** Trailing action slot — typically a `Button` or `DropdownMenu` trigger. */\n actions?: ReactNode;\n /** Click handler. When provided, the card becomes a button. */\n onClick?: () => void;\n /**\n * Accessible name override. Required when `onClick` is set *and* `name` is\n * not a string — without it the button has no accessible name (axe\n * `button-name`). Optional otherwise.\n */\n accessibleName?: string;\n}\n\nconst statusDot: Record<ConnectorStatus, StatusState> = {\n connected: 'ok',\n syncing: 'sync',\n error: 'err',\n disconnected: 'off',\n};\n\nconst statusLabel: Record<ConnectorStatus, string> = {\n connected: 'Connected',\n syncing: 'Syncing',\n error: 'Error',\n disconnected: 'Disconnected',\n};\n\nexport const ConnectorCard = forwardRef<HTMLDivElement, ConnectorCardProps>(function ConnectorCard(\n {\n connector,\n name,\n status,\n lastSyncedAt,\n relativeNow,\n summary,\n actions,\n onClick,\n accessibleName,\n className,\n ...props\n },\n ref,\n) {\n const interactive = typeof onClick === 'function';\n const time = lastSyncedAt ? formatRelative(lastSyncedAt, relativeNow ?? new Date()) : '';\n\n // The clickable label region (logo + name + status + sync time) is rendered\n // as a button when interactive; the `actions` slot sits beside it as a\n // sibling so any nested button stays a peer of the row button instead of a\n // descendant (avoiding axe `nested-interactive`).\n const labelBlock = (\n <>\n <span\n aria-hidden\n className=\"bg-panel-2 grid h-10 w-10 shrink-0 place-items-center rounded-md font-mono text-[16px]\"\n >\n <IconGlyph name={connector} kind=\"connector\" />\n </span>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"truncate text-[14px] font-medium\">{name}</span>\n <StatusDot\n state={statusDot[status]}\n pulse={status === 'syncing'}\n label={statusLabel[status]}\n />\n </div>\n {(summary || time) && (\n <div className=\"text-text-muted mt-[2px] flex items-center gap-2 text-[12px]\">\n {summary && <span className=\"truncate\">{summary}</span>}\n {summary && time && (\n <span aria-hidden className=\"text-text-dim\">\n ·\n </span>\n )}\n {time && (\n <time className=\"text-text-dim font-mono text-[11px]\">last synced {time}</time>\n )}\n </div>\n )}\n </div>\n </>\n );\n\n const labelRegionClass = cn(\n 'flex flex-1 items-start gap-3 rounded-md p-1 text-left transition-colors duration-(--duration-micro)',\n interactive &&\n 'hover:bg-panel-2 focus-visible:ring-accent-dim cursor-pointer outline-none focus-visible:ring-[3px]',\n );\n\n const labelRegion = interactive ? (\n <button\n type=\"button\"\n onClick={onClick}\n aria-label={\n accessibleName ?? (typeof name === 'string' ? `${name} connector` : statusLabel[status])\n }\n className={labelRegionClass}\n >\n {labelBlock}\n </button>\n ) : (\n <div className={labelRegionClass}>{labelBlock}</div>\n );\n\n return (\n <div\n ref={ref}\n className={cn(\n 'rounded-base border-border bg-panel flex items-start gap-2 border p-3',\n className,\n )}\n {...props}\n >\n {labelRegion}\n {actions && <div className=\"shrink-0 self-center pr-1\">{actions}</div>}\n </div>\n );\n});\n\nConnectorCard.displayName = 'ConnectorCard';\n","import { DataTable, type DataTableColumn, type DataTableProps } from '@ship-it-ui/ui';\nimport { type Ref } from 'react';\n\nimport { EntityBadge } from '../entity/EntityBadge';\nimport { getEntityTypeMeta, type EntityType } from '../entity/types';\n\n/**\n * EntityTable — DataTable preset with two ShipIt-aware column helpers:\n * `entityColumn(...)` for the typed name cell and `entityTypeColumn()` for a\n * standalone type column. Everything else (sort, selection, sticky header)\n * comes from `@ship-it-ui/ui` DataTable as-is.\n */\n\ninterface MinimalEntity {\n id: string;\n type: EntityType;\n name: string;\n}\n\nexport type EntityTableProps<T extends MinimalEntity> = Omit<DataTableProps<T>, 'rowKey'> & {\n rowKey?: (row: T) => string;\n};\n\nexport function EntityTable<T extends MinimalEntity>(\n props: EntityTableProps<T> & { ref?: Ref<HTMLTableElement> },\n) {\n const { rowKey, ...rest } = props;\n return <DataTable {...rest} rowKey={rowKey ?? ((row: T) => row.id)} />;\n}\n\n/**\n * Pre-built column for the entity name. Renders the type glyph (in the type's\n * tone) followed by the name in mono. Sorts on `name`.\n */\nexport function entityColumn<T extends MinimalEntity>(\n options: { key?: string; header?: string } = {},\n): DataTableColumn<T> {\n return {\n key: options.key ?? 'name',\n header: options.header ?? 'Name',\n accessor: (row) => row.name,\n cell: (row) => {\n const meta = getEntityTypeMeta(row.type);\n return (\n <span className=\"flex items-center gap-2 font-mono\" data-entity-type={row.type}>\n <span aria-hidden className={meta.toneClass}>\n {meta.glyph}\n </span>\n {row.name}\n </span>\n );\n },\n };\n}\n\n/**\n * Pre-built column rendering the canonical EntityBadge.\n */\nexport function entityTypeColumn<T extends MinimalEntity>(\n options: { key?: string; header?: string } = {},\n): DataTableColumn<T> {\n return {\n key: options.key ?? 'type',\n header: options.header ?? 'Type',\n accessor: (row) => row.type,\n cell: (row) => <EntityBadge type={row.type} size=\"sm\" />,\n };\n}\n"],"mappings":"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","names":["cn","AskBar","cn","forwardRef","jsx","jsxs","Citation","cn","forwardRef","jsx","jsxs","ConfidenceIndicator","cn","forwardRef","jsx","jsxs","CopilotMessage","useControllableState","cn","forwardRef","jsx","jsxs","ReasoningBlock","ReasoningStep","cn","forwardRef","jsx","jsxs","SuggestionChip","cn","forwardRef","Fragment","jsx","jsxs","ToolCallCard","Badge","cn","forwardRef","jsx","jsxs","forwardRef","EntityBadge","Badge","cn","cn","forwardRef","jsx","jsxs","forwardRef","EntityCard","cn","cn","forwardRef","Fragment","jsx","jsxs","cn","forwardRef","EntityListRowDiv","EntityListRowButton","forwardRef","jsx","GraphEdge","cn","forwardRef","jsx","jsxs","forwardRef","GraphInspector","cn","cn","forwardRef","jsx","jsxs","forwardRef","GraphLegend","cn","cn","forwardRef","jsx","jsxs","GraphMinimap","cn","forwardRef","jsx","jsxs","forwardRef","GraphNode","cn","forwardRef","jsx","jsxs","PathOverlay","cn","forwardRef","jsx","jsxs","CTAStrip","cn","forwardRef","jsx","jsxs","FeatureGrid","cn","forwardRef","jsx","jsxs","Footer","cn","forwardRef","jsx","jsxs","Hero","cn","forwardRef","jsx","jsxs","PricingCard","Avatar","cn","forwardRef","jsx","jsxs","Testimonial","cn","forwardRef","Fragment","jsx","jsxs","ConnectorCard","jsx","jsxs"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/ai/AskBar.tsx","../src/ai/Citation.tsx","../src/ai/ConfidenceIndicator.tsx","../src/ai/CopilotMessage.tsx","../src/ai/ReasoningBlock.tsx","../src/ai/SuggestionChip.tsx","../src/ai/ToolCallCard.tsx","../src/entity/EntityBadge.tsx","../src/entity/types.ts","../src/entity/EntityCard.tsx","../src/entity/EntityListRow.tsx","../src/graph/GraphEdge.tsx","../src/graph/GraphInspector.tsx","../src/graph/GraphLegend.tsx","../src/graph/GraphMinimap.tsx","../src/graph/GraphNode.tsx","../src/graph/PathOverlay.tsx","../src/marketing/CTAStrip.tsx","../src/marketing/FeatureGrid.tsx","../src/marketing/Footer.tsx","../src/marketing/Hero.tsx","../src/marketing/PricingCard.tsx","../src/marketing/Testimonial.tsx","../src/data/ConnectorCard.tsx","../src/data/EntityTable.tsx","../src/notifications/NotifRow.tsx"],"sourcesContent":["/**\n * @ship-it-ui/shipit — ShipIt-AI domain composites built on @ship-it-ui/ui.\n *\n * AI surfaces, knowledge-graph chrome, entity displays, and marketing\n * sections. Add new composites here as they're built. Keep exports\n * alphabetical within each category.\n */\n\n// Utilities — re-exported from @ship-it-ui/ui to keep the canonical implementation\n// in one place (clsx + tailwind-merge live there).\nexport { cn } from '@ship-it-ui/ui';\n\n// AI surfaces\nexport * from './ai';\n\n// Entity displays\nexport * from './entity';\n\n// Graph chrome\nexport * from './graph';\n\n// Marketing\nexport * from './marketing';\n\n// Data composites\nexport * from './data';\n\n// Notifications (mobile-only domain composites)\nexport * from './notifications';\n","'use client';\n\nimport { Button, useControllableState } from '@ship-it-ui/ui';\nimport { cn } from '@ship-it-ui/ui';\nimport {\n forwardRef,\n useRef,\n type FormEvent,\n type HTMLAttributes,\n type KeyboardEvent,\n type ReactNode,\n} from 'react';\n\n/**\n * AskBar — the primary \"ask anything\" input. The leading ✦ glyph + accent\n * caret give it the same identity as the Copilot bubbles. Submit with the\n * button or `⌘↵` / `Ctrl↵`.\n *\n * Children are rendered as scope chips below the textarea (use the existing\n * `<Chip>` from @ship-it-ui/ui to mark a scoped query). Children render slot is\n * the \"scopes\" row — leave empty for an unscoped bar.\n */\n\nexport interface AskBarProps extends Omit<\n HTMLAttributes<HTMLFormElement>,\n 'onSubmit' | 'onChange'\n> {\n value?: string;\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n /** Fires with the current query when submitted (button or ⌘↵). */\n onSubmit?: (value: string) => void;\n placeholder?: string;\n /** Streaming caret next to the input. */\n streaming?: boolean;\n /** Submit button label. Default `Ask`. */\n submitLabel?: ReactNode;\n /** Disable submit. */\n disabled?: boolean;\n /** Pixel max-width. Default 620. */\n maxWidth?: number | string;\n /**\n * `'comfortable'` (default) renders the desktop ask bar. `'touch'` swaps to\n * the mobile composer: larger text, 44pt send button, ⌘↵ hint hidden (no\n * hardware keyboard), and scope chips wrap to a second row.\n */\n density?: 'comfortable' | 'touch';\n}\n\nexport const AskBar = forwardRef<HTMLFormElement, AskBarProps>(function AskBar(\n {\n value: valueProp,\n defaultValue,\n onValueChange,\n onSubmit,\n placeholder = 'Ask anything…',\n streaming,\n submitLabel = 'Ask',\n disabled,\n maxWidth = 620,\n density = 'comfortable',\n className,\n children,\n ...props\n },\n ref,\n) {\n const isTouch = density === 'touch';\n const [value, setValue] = useControllableState<string>({\n value: valueProp,\n defaultValue: defaultValue ?? '',\n onChange: onValueChange,\n });\n const inputRef = useRef<HTMLTextAreaElement>(null);\n\n const submit = () => {\n const v = (value ?? '').trim();\n if (!v) return;\n onSubmit?.(v);\n };\n\n const handleSubmit = (e: FormEvent) => {\n e.preventDefault();\n submit();\n };\n\n const handleKey = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n submit();\n }\n };\n\n return (\n <form\n ref={ref}\n role=\"search\"\n onSubmit={handleSubmit}\n style={{ maxWidth: isTouch ? undefined : maxWidth }}\n className={cn(\n 'border-border-strong bg-panel w-full border',\n isTouch ? 'rounded-m-card p-3' : 'rounded-xl p-[14px] shadow',\n 'focus-within:border-accent focus-within:ring-accent-dim focus-within:ring-[3px]',\n className,\n )}\n {...props}\n >\n <div className={cn('flex items-start gap-[10px]', isTouch ? 'mb-2' : 'mb-[10px]')}>\n <span aria-hidden className={cn('text-accent', isTouch ? 'text-[18px]' : 'text-[16px]')}>\n ✦\n </span>\n <textarea\n ref={inputRef}\n value={value ?? ''}\n onChange={(e) => setValue(e.target.value)}\n onKeyDown={handleKey}\n placeholder={placeholder}\n aria-label={placeholder}\n rows={1}\n className={cn(\n 'text-text flex-1 resize-none border-0 bg-transparent leading-[1.5] outline-none',\n 'placeholder:text-text-dim',\n isTouch ? 'text-m-body' : 'text-[14px]',\n )}\n />\n {streaming && (\n <span\n aria-hidden\n className={cn(\n 'bg-accent mt-[3px] inline-block w-px animate-[ship-pulse_1s_infinite]',\n isTouch ? 'h-5' : 'h-4',\n )}\n />\n )}\n </div>\n <div className=\"flex flex-wrap items-center gap-[6px]\">\n {children}\n <div className=\"ml-auto flex items-center gap-2\">\n {!isTouch && (\n <span aria-hidden className=\"text-text-dim font-mono text-[11px]\">\n ⌘↵\n </span>\n )}\n <Button\n type=\"submit\"\n size={isTouch ? 'md' : 'sm'}\n density={isTouch ? 'touch' : undefined}\n variant=\"primary\"\n disabled={disabled || !(value ?? '').trim()}\n >\n {submitLabel}\n </Button>\n </div>\n </div>\n </form>\n );\n});\n\nAskBar.displayName = 'AskBar';\n","'use client';\n\nimport { cn } from '@ship-it-ui/ui';\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\n\n/**\n * Citation — superscript-style numbered chip + source label, used in answer\n * bodies to point back to the document/line that supports the claim.\n *\n * Pass `inline` for the inline superscript variant (rendered next to the\n * referenced text). The default block variant lives below the answer with a\n * source preview.\n */\n\nconst SUPERSCRIPTS = ['⁰', '¹', '²', '³', '⁴', '⁵', '⁶', '⁷', '⁸', '⁹'];\n\nfunction toSuperscript(n: number): string {\n return String(n)\n .split('')\n .map((d) => SUPERSCRIPTS[Number(d)] ?? d)\n .join('');\n}\n\nexport interface CitationProps extends HTMLAttributes<HTMLElement> {\n /** Citation number (1-indexed). */\n index: number;\n /** Source label — e.g., `runbook-oncall.md:L42`. */\n source?: ReactNode;\n /** Connector / origin line — e.g., `notion · updated 2d ago`. */\n meta?: ReactNode;\n /** Inline superscript variant (renders the number only, no source row). */\n inline?: boolean;\n}\n\nexport const Citation = forwardRef<HTMLElement, CitationProps>(function Citation(\n { index, source, meta, inline, className, ...props },\n ref,\n) {\n if (inline) {\n return (\n <sup\n ref={ref}\n aria-label={\n typeof source === 'string' ? `Citation ${index}: ${source}` : `Citation ${index}`\n }\n className={cn('text-accent ml-[2px] font-mono text-[10px]', className)}\n {...props}\n >\n {toSuperscript(index)}\n </sup>\n );\n }\n return (\n <span ref={ref} className={cn('inline-flex items-center gap-2', className)} {...props}>\n <span\n aria-hidden\n className=\"bg-accent-dim text-accent rounded-xs px-[6px] py-[2px] font-mono text-[10px]\"\n >\n {toSuperscript(index)}\n </span>\n <span className=\"text-text-muted text-[12px]\">\n {source != null && <>from {source}</>}\n {source != null && meta != null && <span className=\"text-text-dim\"> · </span>}\n {meta}\n </span>\n </span>\n );\n});\n\nCitation.displayName = 'Citation';\n","'use client';\n\nimport { cn } from '@ship-it-ui/ui';\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\n\n/**\n * ConfidenceIndicator — horizontal bar + percent + tier label. The tier tone\n * is derived automatically from the value (high ≥ 95, medium ≥ 80, low ≥ 50,\n * unverified < 50) but can be overridden via `tier`.\n */\n\nexport type ConfidenceTier = 'high' | 'medium' | 'low' | 'unverified';\n\nconst tierLabel: Record<ConfidenceTier, string> = {\n high: 'High',\n medium: 'Medium',\n low: 'Low · review',\n unverified: 'Unverified',\n};\n\nconst tierBarClass: Record<ConfidenceTier, string> = {\n high: 'bg-ok',\n medium: 'bg-accent',\n low: 'bg-warn',\n unverified: 'bg-err',\n};\n\nconst tierTextClass: Record<ConfidenceTier, string> = {\n high: 'text-ok',\n medium: 'text-accent',\n low: 'text-warn',\n unverified: 'text-err',\n};\n\nfunction deriveTier(value: number): ConfidenceTier {\n if (value >= 95) return 'high';\n if (value >= 80) return 'medium';\n if (value >= 50) return 'low';\n return 'unverified';\n}\n\nexport interface ConfidenceIndicatorProps extends HTMLAttributes<HTMLDivElement> {\n /** Confidence value 0..100. */\n value: number;\n /** Override the auto-derived tier. */\n tier?: ConfidenceTier;\n /** Override the tier label. */\n label?: ReactNode;\n /** Pixel width of the bar. Default 120. */\n width?: number;\n /** Hide the percent number. */\n hideValue?: boolean;\n}\n\nexport const ConfidenceIndicator = forwardRef<HTMLDivElement, ConfidenceIndicatorProps>(\n function ConfidenceIndicator(\n { value, tier: tierProp, label, width = 120, hideValue, className, ...props },\n ref,\n ) {\n const tier = tierProp ?? deriveTier(value);\n const pct = Math.max(0, Math.min(100, value));\n const display = label ?? tierLabel[tier];\n return (\n <div\n ref={ref}\n role=\"meter\"\n aria-label={props['aria-label'] ?? 'Confidence'}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={Math.round(pct)}\n aria-valuetext={`${Math.round(pct)}% — ${typeof display === 'string' ? display : tierLabel[tier]}`}\n className={cn('inline-flex items-center gap-[10px] text-[11px]', className)}\n {...props}\n >\n <span aria-hidden style={{ width }} className=\"bg-panel-2 h-1 overflow-hidden rounded-full\">\n <span\n className={cn(\n 'block h-full rounded-full transition-[width] duration-(--duration-step)',\n tierBarClass[tier],\n )}\n style={{ width: `${pct}%` }}\n />\n </span>\n {!hideValue && (\n <span className=\"text-text min-w-[44px] font-mono tabular-nums\">{pct.toFixed(1)}%</span>\n )}\n <span className={tierTextClass[tier]}>{display}</span>\n </div>\n );\n },\n);\n\nConfidenceIndicator.displayName = 'ConfidenceIndicator';\n","'use client';\n\nimport { Avatar } from '@ship-it-ui/ui';\nimport { cn } from '@ship-it-ui/ui';\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\n\n/**\n * CopilotMessage — chat bubble for the AI conversation. Two roles:\n * `user` (right-aligned implicit, panel-2 background) and `assistant`\n * (left-aligned, framed panel + border). Pass `streaming` to render a pulsing\n * caret at the end of the body.\n */\n\nexport type CopilotRole = 'user' | 'assistant';\n\nexport interface CopilotMessageProps extends HTMLAttributes<HTMLDivElement> {\n role: CopilotRole;\n /** Avatar initials (or full node) shown on the side. */\n avatar?: ReactNode;\n /** Streaming caret at the end of the body. */\n streaming?: boolean;\n /**\n * `'comfortable'` (default) renders the desktop bubble. `'touch'` switches\n * to the mobile chat layout: user bubbles right-aligned on `bg-accent`,\n * assistant bubbles left-aligned on `bg-panel`, larger 15px text, and a\n * max-width that keeps bubbles within 85% of the viewport.\n */\n density?: 'comfortable' | 'touch';\n}\n\nexport const CopilotMessage = forwardRef<HTMLDivElement, CopilotMessageProps>(\n function CopilotMessage(\n { role, avatar, streaming, density = 'comfortable', className, children, ...props },\n ref,\n ) {\n const isAssistant = role === 'assistant';\n const isTouch = density === 'touch';\n\n if (isTouch) {\n // Mobile layout: no side avatar; bubbles align to one side or the other.\n return (\n <div\n ref={ref}\n className={cn(\n 'flex flex-col gap-[6px]',\n isAssistant ? 'items-start' : 'items-end',\n className,\n )}\n data-role={role}\n {...props}\n >\n {isAssistant && (\n <div className=\"text-m-eyebrow text-accent inline-flex items-center gap-[6px] font-mono tracking-wide uppercase\">\n <span aria-hidden>✦</span>\n {streaming ? 'thinking' : 'ShipIt'}\n </div>\n )}\n <div\n className={cn(\n 'rounded-m-card text-m-body max-w-[85%] px-[14px] py-3 leading-normal',\n isAssistant ? 'bg-panel border-border border' : 'bg-accent text-on-accent',\n )}\n >\n {children}\n {streaming && (\n <span\n aria-hidden\n className=\"bg-accent ml-[2px] inline-block h-4 w-px animate-[ship-pulse_1s_infinite] align-middle\"\n />\n )}\n </div>\n </div>\n );\n }\n\n return (\n <div\n ref={ref}\n className={cn('flex items-start gap-[10px]', className)}\n data-role={role}\n {...props}\n >\n {isAssistant ? (\n <span\n aria-hidden\n className=\"bg-accent-dim text-accent grid h-6 w-6 shrink-0 place-items-center rounded-full text-[11px] font-semibold\"\n >\n ✦\n </span>\n ) : typeof avatar === 'string' ? (\n <Avatar size=\"sm\" name={avatar} />\n ) : (\n (avatar ?? null)\n )}\n <div\n className={cn(\n 'rounded-base min-w-0 flex-1 px-[14px] py-3 text-[13px] leading-[1.6]',\n isAssistant ? 'bg-panel border-border border' : 'bg-panel-2',\n )}\n >\n {children}\n {streaming && (\n <span\n aria-hidden\n className=\"bg-accent ml-[2px] inline-block h-[14px] w-px animate-[ship-pulse_1s_infinite] align-middle\"\n />\n )}\n </div>\n </div>\n );\n },\n);\n\nCopilotMessage.displayName = 'CopilotMessage';\n","'use client';\n\nimport { useControllableState } from '@ship-it-ui/ui';\nimport { cn } from '@ship-it-ui/ui';\nimport { Children, forwardRef, type HTMLAttributes, type ReactNode } from 'react';\n\n/**\n * ReasoningBlock — collapsible \"Reasoning · N steps · 1.8s\" disclosure. Shows\n * the chain-of-thought / step trace expanded or collapsed. Pass `<ReasoningStep>`\n * children for each step.\n */\n\nexport interface ReasoningBlockProps extends Omit<HTMLAttributes<HTMLDivElement>, 'onChange'> {\n /** Override the heading label (defaults to `Reasoning · N steps`). */\n label?: ReactNode;\n /** Visible step count when label is auto. Defaults to children length. */\n stepCount?: number;\n /** Visible duration label (e.g., `1.8s`). */\n duration?: ReactNode;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n}\n\nexport const ReasoningBlock = forwardRef<HTMLDivElement, ReasoningBlockProps>(\n function ReasoningBlock(\n {\n label,\n stepCount,\n duration,\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n className,\n children,\n ...props\n },\n ref,\n ) {\n const [open, setOpen] = useControllableState<boolean>({\n value: openProp,\n defaultValue: defaultOpen,\n onChange: onOpenChange,\n });\n\n const inferredCount = stepCount ?? Children.count(children);\n const heading = label ?? `Reasoning · ${inferredCount} step${inferredCount === 1 ? '' : 's'}`;\n\n return (\n <div\n ref={ref}\n className={cn('border-border bg-panel-2 overflow-hidden rounded-md border', className)}\n {...props}\n >\n <button\n type=\"button\"\n aria-expanded={open}\n onClick={() => setOpen(!open)}\n className=\"focus-visible:ring-accent-dim flex w-full cursor-pointer items-center gap-[10px] border-0 bg-transparent px-[14px] py-[10px] text-left outline-none focus-visible:ring-[3px]\"\n >\n <span aria-hidden className=\"text-text-dim font-mono text-[11px]\">\n {open ? '▾' : '▸'}\n </span>\n <span className=\"text-[12px] font-medium\">{heading}</span>\n {duration != null && (\n <span className=\"text-text-dim ml-auto font-mono text-[10px]\">{duration}</span>\n )}\n </button>\n {open && (\n <div className=\"border-border text-text-muted border-t px-[14px] py-[10px] pl-9 text-[11px] leading-[1.7]\">\n {children}\n </div>\n )}\n </div>\n );\n },\n);\n\nReasoningBlock.displayName = 'ReasoningBlock';\n\nexport interface ReasoningStepProps extends HTMLAttributes<HTMLDivElement> {\n /** 1-indexed step number. Renders accent-colored before the body. */\n step: number;\n}\n\nexport const ReasoningStep = forwardRef<HTMLDivElement, ReasoningStepProps>(function ReasoningStep(\n { step, className, children, ...props },\n ref,\n) {\n return (\n <div ref={ref} className={cn('mb-[2px] last:mb-0', className)} {...props}>\n <span className=\"text-accent mr-[6px] font-mono\">{step}.</span>\n {children}\n </div>\n );\n});\n\nReasoningStep.displayName = 'ReasoningStep';\n","'use client';\n\nimport { cn } from '@ship-it-ui/ui';\nimport { forwardRef, type ButtonHTMLAttributes, type ReactNode } from 'react';\n\n/**\n * SuggestionChip — pill-shaped prompt suggestion. The ✦ glyph prefix signals\n * \"ask about this\" and matches the AskBar's identity.\n */\n\nexport interface SuggestionChipProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n /** Override the leading glyph. Defaults to `✦`. */\n glyph?: ReactNode;\n}\n\nexport const SuggestionChip = forwardRef<HTMLButtonElement, SuggestionChipProps>(\n function SuggestionChip({ glyph = '✦', className, children, type, ...props }, ref) {\n return (\n <button\n ref={ref}\n type={type ?? 'button'}\n className={cn(\n 'border-border bg-panel text-text inline-flex cursor-pointer items-center gap-[6px] rounded-full border px-[10px] py-[6px] text-[12px] outline-none',\n 'transition-colors duration-(--duration-micro)',\n 'hover:border-border-strong hover:bg-panel-2',\n 'focus-visible:ring-accent-dim focus-visible:ring-[3px]',\n className,\n )}\n {...props}\n >\n <span aria-hidden className=\"text-accent\">\n {glyph}\n </span>\n {children}\n </button>\n );\n },\n);\n\nSuggestionChip.displayName = 'SuggestionChip';\n","'use client';\n\nimport { Badge } from '@ship-it-ui/ui';\nimport { cn } from '@ship-it-ui/ui';\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\n\n/**\n * ToolCallCard — visual card for a function/tool invocation in the AI\n * conversation. Shows a `TOOL` badge, the tool name, status (running →\n * duration · result), and an optional code/args preview body.\n *\n * Pass `running` to render a streaming caret next to the timing. When the\n * call completes, replace `running` with `duration` and optionally `result`.\n */\n\nexport interface ToolCallCardProps extends HTMLAttributes<HTMLDivElement> {\n /** Tool / function name. Rendered in mono. */\n name: ReactNode;\n /** Status text — e.g., `94ms · 142 rows`. */\n status?: ReactNode;\n /** When true, shows a streaming caret next to the status. */\n running?: boolean;\n /** Optional preformatted body — typically args or a query preview. */\n children?: ReactNode;\n}\n\nexport const ToolCallCard = forwardRef<HTMLDivElement, ToolCallCardProps>(function ToolCallCard(\n { name, status, running, className, children, ...props },\n ref,\n) {\n return (\n <div\n ref={ref}\n className={cn('border-border bg-panel rounded-md border px-[14px] py-[10px]', className)}\n {...props}\n >\n <div className=\"flex items-center gap-[10px]\">\n <Badge size=\"sm\" variant=\"accent\">\n TOOL\n </Badge>\n <span className=\"font-mono text-[12px] font-medium\">{name}</span>\n <span className=\"text-text-dim ml-auto inline-flex items-center font-mono text-[10px]\">\n {running ? (\n <>\n running\n <span\n aria-hidden\n className=\"bg-accent ml-1 inline-block h-3 w-px animate-[ship-pulse_1s_infinite] align-middle\"\n />\n </>\n ) : (\n status\n )}\n </span>\n </div>\n {children && (\n <pre className=\"text-text-muted m-0 mt-[6px] font-mono text-[11px] leading-[1.6] break-words whitespace-pre-wrap\">\n {children}\n </pre>\n )}\n </div>\n );\n});\n\nToolCallCard.displayName = 'ToolCallCard';\n","'use client';\n\nimport { Badge, type BadgeProps } from '@ship-it-ui/ui';\nimport { cn } from '@ship-it-ui/ui';\nimport { forwardRef, type ReactNode } from 'react';\n\nimport { getEntityTypeMeta, type EntityType } from './types';\n\n/**\n * EntityBadge — small chip identifying an entity type. Resolves the canonical\n * glyph + label from the type, but accepts a `label` override for cases where\n * the consumer wants to show the entity's actual name.\n */\n\nexport interface EntityBadgeProps extends Omit<BadgeProps, 'variant'> {\n type: EntityType;\n /** Override the visible label. Defaults to the canonical type label. */\n label?: ReactNode;\n /** Hide the leading glyph. */\n hideGlyph?: boolean;\n}\n\nexport const EntityBadge = forwardRef<HTMLSpanElement, EntityBadgeProps>(function EntityBadge(\n { type, label, hideGlyph, className, children, ...props },\n ref,\n) {\n const meta = getEntityTypeMeta(type);\n return (\n <Badge\n ref={ref}\n variant={meta.badgeVariant}\n data-entity-type={type}\n className={cn(className)}\n {...props}\n >\n {!hideGlyph && (\n <span aria-hidden className=\"font-mono\">\n {meta.glyph}\n </span>\n )}\n {children ?? label ?? meta.label}\n </Badge>\n );\n});\n\nEntityBadge.displayName = 'EntityBadge';\n","/**\n * ShipIt entity vocabulary. Six built-in categories — `service`, `person`,\n * `document`, `deployment`, `incident`, `ticket` — cover the graph's core\n * shapes. The `EntityType` type is intentionally open: consumers may pass any\n * string and register metadata for it via {@link registerEntityType} so their\n * domain types (Repository, Pipeline, Monitor, …) render with the right glyph,\n * label, and tone.\n *\n * Unregistered types fall back to the `service` visuals so a stray value never\n * crashes the UI; consumers can detect them via the `data-entity-type` attribute\n * that entity components forward to the DOM.\n */\n\nexport type KnownEntityType =\n | 'service'\n | 'person'\n | 'document'\n | 'deployment'\n | 'incident'\n | 'ticket';\n\n// The `(string & {})` branch preserves autocomplete for the six known literals\n// while still accepting any string value at runtime.\nexport type EntityType = KnownEntityType | (string & {});\n\n/**\n * Variant key for the shared `Badge` component in `@ship-it-ui/ui`. Inlined here\n * to keep `types.ts` free of cross-package value imports.\n */\nexport type EntityBadgeVariant = 'neutral' | 'accent' | 'ok' | 'warn' | 'err' | 'purple' | 'pink';\n\nexport interface EntityTypeMeta {\n /** Single-character glyph rendered next to the type label. */\n glyph: string;\n /** Human-readable type name (e.g. `'Service'`). */\n label: string;\n /** Tailwind text-color class for the glyph and accent text. */\n toneClass: string;\n /** Tailwind background-color class for the icon plate. */\n toneBg: string;\n /** CSS color value used by graph chrome (node ring + legend dot). */\n colorVar: string;\n /** Variant for the shared `Badge` component. */\n badgeVariant: EntityBadgeVariant;\n}\n\nconst BUILTIN_META: Record<KnownEntityType, EntityTypeMeta> = {\n service: {\n glyph: '◇',\n label: 'Service',\n toneClass: 'text-accent',\n toneBg: 'bg-accent-dim',\n colorVar: 'var(--color-accent)',\n badgeVariant: 'accent',\n },\n person: {\n glyph: '○',\n label: 'Person',\n toneClass: 'text-text-muted',\n toneBg: 'bg-panel-2',\n colorVar: 'var(--color-purple)',\n badgeVariant: 'neutral',\n },\n document: {\n glyph: '▤',\n label: 'Document',\n toneClass: 'text-purple',\n toneBg: 'bg-[color-mix(in_oklab,var(--color-purple),transparent_85%)]',\n colorVar: 'var(--color-pink)',\n badgeVariant: 'purple',\n },\n deployment: {\n glyph: '↑',\n label: 'Deployment',\n toneClass: 'text-ok',\n toneBg: 'bg-[color-mix(in_oklab,var(--color-ok),transparent_85%)]',\n colorVar: 'var(--color-ok)',\n badgeVariant: 'ok',\n },\n incident: {\n glyph: '◎',\n label: 'Incident',\n toneClass: 'text-err',\n toneBg: 'bg-[color-mix(in_oklab,var(--color-err),transparent_85%)]',\n colorVar: 'var(--color-warn)',\n badgeVariant: 'err',\n },\n ticket: {\n glyph: '▢',\n label: 'Ticket',\n toneClass: 'text-warn',\n toneBg: 'bg-[color-mix(in_oklab,var(--color-warn),transparent_85%)]',\n colorVar: 'var(--color-text-muted)',\n badgeVariant: 'warn',\n },\n};\n\nconst FALLBACK: EntityTypeMeta = BUILTIN_META.service;\n\nconst registry = new Map<string, EntityTypeMeta>(Object.entries(BUILTIN_META));\n\n/**\n * Register or replace metadata for an entity type. Pass any string key — the\n * built-in six can be overridden too. Returns the registered metadata.\n */\nexport function registerEntityType(type: string, meta: EntityTypeMeta): EntityTypeMeta {\n registry.set(type, meta);\n return meta;\n}\n\n/** Bulk-register a map of entity types. */\nexport function registerEntityTypes(map: Record<string, EntityTypeMeta>): void {\n for (const [key, meta] of Object.entries(map)) {\n registry.set(key, meta);\n }\n}\n\n/**\n * Resolve metadata for an entity type. Unknown types fall back to the `service`\n * metadata so consumers never crash on a stray value.\n */\nexport function getEntityTypeMeta(type: EntityType): EntityTypeMeta {\n return registry.get(type) ?? FALLBACK;\n}\n\n/**\n * Snapshot every registered entity type as `[type, meta]` tuples. Used by\n * downstream packages (e.g. `@ship-it-ui/cytoscape`) to enumerate types when\n * emitting per-type styles. Cheap — just `Array.from(map)`.\n */\nexport function listEntityTypes(): ReadonlyArray<readonly [string, EntityTypeMeta]> {\n return Array.from(registry.entries());\n}\n\n/** Test-only helper: drop all consumer registrations and re-seed the built-ins. */\nexport function resetEntityTypeRegistry(): void {\n registry.clear();\n for (const key of Object.keys(BUILTIN_META) as KnownEntityType[]) {\n registry.set(key, BUILTIN_META[key]);\n }\n}\n\n/**\n * @deprecated Prefer `getEntityTypeMeta(type).glyph`. Retained for the six\n * built-in types so existing consumers keep working.\n */\nexport const ENTITY_GLYPH: Record<KnownEntityType, string> = {\n service: BUILTIN_META.service.glyph,\n person: BUILTIN_META.person.glyph,\n document: BUILTIN_META.document.glyph,\n deployment: BUILTIN_META.deployment.glyph,\n incident: BUILTIN_META.incident.glyph,\n ticket: BUILTIN_META.ticket.glyph,\n};\n\n/** @deprecated Prefer `getEntityTypeMeta(type).label`. */\nexport const ENTITY_LABEL: Record<KnownEntityType, string> = {\n service: BUILTIN_META.service.label,\n person: BUILTIN_META.person.label,\n document: BUILTIN_META.document.label,\n deployment: BUILTIN_META.deployment.label,\n incident: BUILTIN_META.incident.label,\n ticket: BUILTIN_META.ticket.label,\n};\n\n/** @deprecated Prefer `getEntityTypeMeta(type).toneClass`. */\nexport const ENTITY_TONE_CLASS: Record<KnownEntityType, string> = {\n service: BUILTIN_META.service.toneClass,\n person: BUILTIN_META.person.toneClass,\n document: BUILTIN_META.document.toneClass,\n deployment: BUILTIN_META.deployment.toneClass,\n incident: BUILTIN_META.incident.toneClass,\n ticket: BUILTIN_META.ticket.toneClass,\n};\n\n/** @deprecated Prefer `getEntityTypeMeta(type).toneBg`. */\nexport const ENTITY_TONE_BG: Record<KnownEntityType, string> = {\n service: BUILTIN_META.service.toneBg,\n person: BUILTIN_META.person.toneBg,\n document: BUILTIN_META.document.toneBg,\n deployment: BUILTIN_META.deployment.toneBg,\n incident: BUILTIN_META.incident.toneBg,\n ticket: BUILTIN_META.ticket.toneBg,\n};\n","'use client';\n\nimport { cn } from '@ship-it-ui/ui';\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\n\nimport { EntityBadge } from './EntityBadge';\nimport { getEntityTypeMeta, type EntityType } from './types';\n\n/**\n * EntityCard — display card for a graph entity. Plate (icon + tinted bg),\n * title, optional subtitle / description, and an optional stats grid.\n *\n * Stats render in a 2- or 3-column grid below the description; pass `[]` (or\n * omit) to skip them.\n */\n\nexport interface EntityStat {\n label: ReactNode;\n value: ReactNode;\n /** Tone for the value text — defaults to plain `text-text`. */\n tone?: 'accent' | 'ok' | 'warn' | 'err' | 'muted';\n}\n\nexport interface EntityCardProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n type: EntityType;\n title: ReactNode;\n /** Subtitle line — typically owner / scope. */\n subtitle?: ReactNode;\n /** Body description. */\n description?: ReactNode;\n /** Stat tiles. Up to 6 fit comfortably across one row. */\n stats?: ReadonlyArray<EntityStat>;\n /** Right-side actions (buttons). */\n actions?: ReactNode;\n /** Override the leading glyph. */\n glyph?: ReactNode;\n}\n\nconst statToneClass = {\n accent: 'text-accent',\n ok: 'text-ok',\n warn: 'text-warn',\n err: 'text-err',\n muted: 'text-text-muted',\n} as const;\n\nexport const EntityCard = forwardRef<HTMLDivElement, EntityCardProps>(function EntityCard(\n { type, title, subtitle, description, stats, actions, glyph, className, ...props },\n ref,\n) {\n const meta = getEntityTypeMeta(type);\n return (\n <div\n ref={ref}\n data-entity-type={type}\n className={cn(\n 'rounded-base border-border bg-panel flex flex-col gap-3 border p-5',\n className,\n )}\n {...props}\n >\n <div className=\"flex items-start gap-3\">\n <span\n aria-hidden\n className={cn(\n 'rounded-base grid h-12 w-12 shrink-0 place-items-center text-[20px]',\n meta.toneBg,\n meta.toneClass,\n )}\n >\n {glyph ?? meta.glyph}\n </span>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <EntityBadge type={type} size=\"sm\" />\n {subtitle && <span className=\"text-text-dim font-mono text-[11px]\">{subtitle}</span>}\n </div>\n <div className=\"mt-1 truncate font-mono text-[18px] font-medium tracking-tight\">\n {title}\n </div>\n {description && (\n <div className=\"text-text-muted mt-1 text-[13px] leading-[1.5]\">{description}</div>\n )}\n </div>\n {actions && <div className=\"shrink-0\">{actions}</div>}\n </div>\n {stats && stats.length > 0 && (\n <div\n className=\"divide-border border-border bg-panel-2 grid divide-x rounded-md border\"\n style={{ gridTemplateColumns: `repeat(${Math.min(stats.length, 6)}, 1fr)` }}\n >\n {stats.map((stat, i) => (\n <div key={i} className=\"px-4 py-3\">\n <div className=\"text-text-dim font-mono text-[10px] tracking-[1.3px] uppercase\">\n {stat.label}\n </div>\n <div\n className={cn(\n 'mt-1 text-[16px] font-medium tracking-tight',\n stat.tone ? statToneClass[stat.tone] : 'text-text',\n )}\n >\n {stat.value}\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n );\n});\n\nEntityCard.displayName = 'EntityCard';\n","'use client';\n\nimport { cn } from '@ship-it-ui/ui';\nimport {\n forwardRef,\n type ButtonHTMLAttributes,\n type HTMLAttributes,\n type MouseEventHandler,\n type ReactNode,\n} from 'react';\n\nimport { getEntityTypeMeta, type EntityType } from './types';\n\n/**\n * EntityListRow — compact row for entity lists (e.g., dependents / dependencies\n * panels on a detail page). Glyph dot + name + optional relation pill +\n * optional trailing meta.\n *\n * Renders as a button when `onClick` is supplied; otherwise a plain row.\n *\n * For strongly-typed refs use the specialized exports `EntityListRowDiv`\n * (non-interactive) and `EntityListRowButton` (interactive). The default\n * `EntityListRow` is a thin wrapper that picks the right underlying element\n * based on whether `onClick` is provided.\n */\n\ninterface EntityListRowCommonProps {\n type: EntityType;\n /** Entity name / id. Rendered in mono. */\n name: ReactNode;\n /** Trailing pill (e.g., relation type: `OWNED_BY`). */\n relation?: ReactNode;\n /** Trailing meta line (e.g., a timestamp). */\n meta?: ReactNode;\n /** When true, hides the leading glyph dot. */\n hideGlyph?: boolean;\n}\n\nconst baseClassNames = (interactive: boolean, className?: string) =>\n cn(\n 'flex w-full items-center gap-3 border-0 bg-transparent px-2 py-2 text-left',\n 'border-b border-border last:border-0',\n interactive &&\n 'cursor-pointer outline-none transition-colors duration-(--duration-micro) hover:bg-panel-2 focus-visible:ring-[3px] focus-visible:ring-accent-dim',\n className,\n );\n\nfunction RowInner({\n type,\n name,\n relation,\n meta,\n hideGlyph,\n}: Pick<EntityListRowCommonProps, 'type' | 'name' | 'relation' | 'meta' | 'hideGlyph'>) {\n const typeMeta = getEntityTypeMeta(type);\n return (\n <>\n {!hideGlyph && (\n <span aria-hidden className={cn('font-mono text-[14px] leading-none', typeMeta.toneClass)}>\n {typeMeta.glyph}\n </span>\n )}\n <span className=\"text-text min-w-0 flex-1 truncate font-mono text-[12px]\">{name}</span>\n {relation && (\n <span className=\"border-border bg-panel-2 text-text-muted rounded-full border px-2 py-[2px] font-mono text-[10px]\">\n {relation}\n </span>\n )}\n {meta && <span className=\"text-text-dim font-mono text-[10px]\">{meta}</span>}\n </>\n );\n}\n\nexport interface EntityListRowDivProps\n extends EntityListRowCommonProps, Omit<HTMLAttributes<HTMLDivElement>, 'title' | 'name'> {}\n\n/** Non-interactive row. Use this when you have a static list of entities. */\nexport const EntityListRowDiv = forwardRef<HTMLDivElement, EntityListRowDivProps>(\n function EntityListRowDiv({ type, name, relation, meta, hideGlyph, className, ...props }, ref) {\n return (\n <div\n ref={ref}\n data-entity-type={type}\n className={baseClassNames(false, className)}\n {...props}\n >\n <RowInner type={type} name={name} relation={relation} meta={meta} hideGlyph={hideGlyph} />\n </div>\n );\n },\n);\n\nEntityListRowDiv.displayName = 'EntityListRowDiv';\n\nexport interface EntityListRowButtonProps\n extends\n EntityListRowCommonProps,\n Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'title' | 'type' | 'name' | 'onClick'> {\n /** Click handler. Required for the button variant. */\n onClick: MouseEventHandler<HTMLButtonElement>;\n}\n\n/** Interactive row rendered as a `<button>`. Use this when the row navigates. */\nexport const EntityListRowButton = forwardRef<HTMLButtonElement, EntityListRowButtonProps>(\n function EntityListRowButton(\n { type, name, relation, meta, hideGlyph, className, onClick, ...props },\n ref,\n ) {\n return (\n <button\n ref={ref}\n type=\"button\"\n data-entity-type={type}\n onClick={onClick}\n className={baseClassNames(true, className)}\n {...props}\n >\n <RowInner type={type} name={name} relation={relation} meta={meta} hideGlyph={hideGlyph} />\n </button>\n );\n },\n);\n\nEntityListRowButton.displayName = 'EntityListRowButton';\n\nexport interface EntityListRowProps extends Omit<\n HTMLAttributes<HTMLElement>,\n 'title' | 'name' | 'onClick'\n> {\n type: EntityType;\n /** Entity name / id. Rendered in mono. */\n name: ReactNode;\n /** Trailing pill (e.g., relation type: `OWNED_BY`). */\n relation?: ReactNode;\n /** Trailing meta line (e.g., a timestamp). */\n meta?: ReactNode;\n /** When provided, the row becomes a clickable button. */\n onClick?: MouseEventHandler<HTMLButtonElement>;\n /** When true, hides the leading glyph dot. */\n hideGlyph?: boolean;\n}\n\n/**\n * Convenience wrapper: chooses `EntityListRowButton` when `onClick` is\n * supplied, otherwise `EntityListRowDiv`. Does not forward refs — when you\n * need a typed ref, reach for the specialized component directly.\n */\nexport function EntityListRow({\n type,\n name,\n relation,\n meta,\n hideGlyph,\n onClick,\n className,\n ...props\n}: EntityListRowProps) {\n if (typeof onClick === 'function') {\n return (\n <EntityListRowButton\n type={type}\n name={name}\n relation={relation}\n meta={meta}\n hideGlyph={hideGlyph}\n onClick={onClick}\n className={className}\n {...(props as Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n 'title' | 'type' | 'name' | 'onClick'\n >)}\n />\n );\n }\n return (\n <EntityListRowDiv\n type={type}\n name={name}\n relation={relation}\n meta={meta}\n hideGlyph={hideGlyph}\n className={className}\n {...(props as Omit<HTMLAttributes<HTMLDivElement>, 'title' | 'name'>)}\n />\n );\n}\n\nEntityListRow.displayName = 'EntityListRow';\n","'use client';\n\nimport { forwardRef, type SVGAttributes } from 'react';\n\n/**\n * GraphEdge — SVG `<line>` (or `<path>` if curve points are provided) rendered\n * with one of four canonical styles. Place inside a parent `<svg>`.\n *\n * For curves, pass `curve={{ cx, cy }}` — the edge becomes `M x1,y1 Q cx,cy x2,y2`.\n * Pass `arrowheadId=\"arr-accent\"` and define a matching `<defs><marker id=\"arr-accent\">…</marker></defs>`\n * once in your SVG to enable arrows.\n */\n\nexport type GraphEdgeStyle = 'solid' | 'dashed' | 'highlighted' | 'dim';\n\nexport interface GraphEdgeProps extends Omit<SVGAttributes<SVGElement>, 'd'> {\n x1: number;\n y1: number;\n x2: number;\n y2: number;\n /** Optional Q-curve control point. */\n curve?: { cx: number; cy: number };\n edgeStyle?: GraphEdgeStyle;\n /** Stroke color override. Defaults to the style's tone. */\n color?: string;\n /** Marker id for an arrowhead. */\n arrowheadId?: string;\n}\n\nconst styleProps: Record<\n GraphEdgeStyle,\n { stroke: string; strokeWidth: number; strokeDasharray?: string; opacity?: number }\n> = {\n solid: { stroke: 'var(--color-accent)', strokeWidth: 1.5 },\n dashed: { stroke: 'var(--color-accent)', strokeWidth: 1.5, strokeDasharray: '4 3' },\n highlighted: { stroke: 'var(--color-purple)', strokeWidth: 2.5 },\n dim: { stroke: 'var(--color-text-dim)', strokeWidth: 1, opacity: 0.4 },\n};\n\nexport const GraphEdge = forwardRef<SVGElement, GraphEdgeProps>(function GraphEdge(\n { x1, y1, x2, y2, curve, edgeStyle = 'solid', color, arrowheadId, ...props },\n ref,\n) {\n const base = styleProps[edgeStyle];\n const stroke = color ?? base.stroke;\n const sharedProps = {\n fill: 'none' as const,\n stroke,\n strokeWidth: base.strokeWidth,\n strokeDasharray: base.strokeDasharray,\n opacity: base.opacity,\n markerEnd: arrowheadId ? `url(#${arrowheadId})` : undefined,\n ...props,\n };\n if (curve) {\n return (\n <path\n ref={ref as React.Ref<SVGPathElement>}\n d={`M${x1},${y1} Q${curve.cx},${curve.cy} ${x2},${y2}`}\n {...sharedProps}\n />\n );\n }\n return (\n <line ref={ref as React.Ref<SVGLineElement>} x1={x1} y1={y1} x2={x2} y2={y2} {...sharedProps} />\n );\n});\n\nGraphEdge.displayName = 'GraphEdge';\n","'use client';\n\nimport { cn } from '@ship-it-ui/ui';\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\n\nimport { EntityBadge } from '../entity/EntityBadge';\nimport { type EntityType } from '../entity/types';\n\n/**\n * GraphInspector — drill-in panel that appears next to a selected graph node.\n * Header (type badge + id), title + description, properties table, and a\n * relations list.\n *\n * The component is presentation-only: data shape mirrors what an inspector\n * needs to show, without prescribing how the consumer fetches it.\n */\n\nexport interface InspectorProperty {\n key: ReactNode;\n value: ReactNode;\n}\n\nexport interface InspectorRelation {\n /** Direction or label, e.g., `→ depends on`. Rendered in mono. */\n relation: ReactNode;\n /** Related entity name. */\n entity: ReactNode;\n}\n\nexport interface GraphInspectorProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n type: EntityType;\n /** Right-side machine id (e.g., `ent_0x7a2f`). */\n entityId?: ReactNode;\n title: ReactNode;\n description?: ReactNode;\n properties?: ReadonlyArray<InspectorProperty>;\n relations?: ReadonlyArray<InspectorRelation>;\n /** Total relation count if `relations` is a partial slice. */\n relationCount?: number;\n}\n\nexport const GraphInspector = forwardRef<HTMLDivElement, GraphInspectorProps>(\n function GraphInspector(\n {\n type,\n entityId,\n title,\n description,\n properties,\n relations,\n relationCount,\n className,\n ...props\n },\n ref,\n ) {\n const total = relationCount ?? relations?.length ?? 0;\n return (\n <aside\n ref={ref}\n aria-label={typeof title === 'string' ? `${title} inspector` : 'Node inspector'}\n className={cn(\n 'rounded-base border-border bg-panel flex w-[340px] flex-col gap-3 border p-4',\n className,\n )}\n {...props}\n >\n <div className=\"flex items-center\">\n <EntityBadge type={type} size=\"sm\" />\n {entityId && (\n <span className=\"text-text-dim ml-auto font-mono text-[10px]\">{entityId}</span>\n )}\n </div>\n <div>\n <div className=\"text-[17px] font-medium\">{title}</div>\n {description && <div className=\"text-text-muted mt-[2px] text-[12px]\">{description}</div>}\n </div>\n {properties && properties.length > 0 && (\n <section>\n <div className=\"text-text-dim mb-2 font-mono text-[9px] tracking-[1.4px] uppercase\">\n Properties\n </div>\n <dl className=\"m-0 flex flex-col gap-1 font-mono text-[11px]\">\n {properties.map((p, i) => (\n <div\n key={i}\n className={cn('border-border flex py-1', i < properties.length - 1 && 'border-b')}\n >\n <dt className=\"text-text-dim w-[70px]\">{p.key}</dt>\n <dd className=\"m-0 flex-1\">{p.value}</dd>\n </div>\n ))}\n </dl>\n </section>\n )}\n {relations && relations.length > 0 && (\n <section>\n <div className=\"text-text-dim mb-2 font-mono text-[9px] tracking-[1.4px] uppercase\">\n Relations · {total}\n </div>\n <ul className=\"m-0 flex list-none flex-col gap-1 p-0 text-[11px]\">\n {relations.map((r, i) => (\n <li key={i} className=\"flex gap-2\">\n <span className=\"text-text-dim w-[100px] font-mono\">{r.relation}</span>\n <span>{r.entity}</span>\n </li>\n ))}\n </ul>\n </section>\n )}\n </aside>\n );\n },\n);\n\nGraphInspector.displayName = 'GraphInspector';\n","'use client';\n\nimport { cn } from '@ship-it-ui/ui';\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\n\nimport { getEntityTypeMeta, type EntityType } from '../entity/types';\n\n/**\n * GraphLegend — translucent floating legend panel for the graph viewport.\n * Use the `entries` prop for the canonical entity-type list, or compose\n * children directly for a custom legend. Entry colors and labels resolve\n * through the shared entity-type registry, so consumer-registered types\n * appear with their own visuals.\n */\n\nexport interface GraphLegendEntry {\n /** Entity type (resolves color + label automatically) or a custom shape. */\n type?: EntityType;\n color?: string;\n label?: ReactNode;\n}\n\nexport interface GraphLegendProps extends HTMLAttributes<HTMLDivElement> {\n entries?: ReadonlyArray<GraphLegendEntry>;\n /** Heading rendered above the entries. Default `Legend`. */\n heading?: ReactNode;\n}\n\nconst DEFAULT_ENTRIES: GraphLegendEntry[] = [\n { type: 'service' },\n { type: 'person' },\n { type: 'document' },\n];\n\nexport const GraphLegend = forwardRef<HTMLDivElement, GraphLegendProps>(function GraphLegend(\n { entries = DEFAULT_ENTRIES, heading = 'Legend', className, children, ...props },\n ref,\n) {\n return (\n <div\n ref={ref}\n className={cn(\n 'rounded-base border-border bg-panel/85 inline-flex flex-col gap-[6px] border p-[10px] text-[11px] backdrop-blur-[8px]',\n className,\n )}\n {...props}\n >\n {heading && (\n <div className=\"text-text-dim font-mono text-[9px] tracking-[1.4px] uppercase\">\n {heading}\n </div>\n )}\n {children ??\n entries.map((entry, i) => {\n const meta = entry.type ? getEntityTypeMeta(entry.type) : undefined;\n const color = entry.color ?? meta?.colorVar ?? 'currentColor';\n const label = entry.label ?? meta?.label ?? '';\n return (\n <div key={i} className=\"flex items-center gap-[6px]\">\n <span aria-hidden className=\"h-2 w-2 rounded-full\" style={{ background: color }} />\n <span>{label}</span>\n </div>\n );\n })}\n </div>\n );\n});\n\nGraphLegend.displayName = 'GraphLegend';\n","'use client';\n\nimport { cn } from '@ship-it-ui/ui';\nimport { forwardRef, type HTMLAttributes } from 'react';\n\n/**\n * GraphMinimap — miniature scatter of node positions with a translucent\n * rectangle marking the current viewport. Coordinates are normalized to\n * [0, 1] × [0, 1]; the minimap renders them inside its fixed pixel box.\n */\n\nexport interface MinimapPoint {\n /** Normalized x, 0..1. */\n x: number;\n /** Normalized y, 0..1. */\n y: number;\n /** Optional dot color. */\n color?: string;\n}\n\nexport interface MinimapViewport {\n /** Top-left x, normalized 0..1. */\n x: number;\n /** Top-left y, normalized 0..1. */\n y: number;\n /** Width as a fraction of the minimap, 0..1. */\n width: number;\n /** Height as a fraction of the minimap, 0..1. */\n height: number;\n}\n\nexport interface GraphMinimapProps extends HTMLAttributes<HTMLDivElement> {\n points: ReadonlyArray<MinimapPoint>;\n viewport?: MinimapViewport;\n /** Pixel width. Default 120. */\n width?: number;\n /** Pixel height. Default 72. */\n height?: number;\n}\n\nexport const GraphMinimap = forwardRef<HTMLDivElement, GraphMinimapProps>(function GraphMinimap(\n { points, viewport, width = 120, height = 72, className, ...props },\n ref,\n) {\n return (\n <div\n ref={ref}\n role=\"img\"\n aria-label=\"Graph minimap\"\n className={cn(\n 'border-border bg-panel/85 relative rounded-md border p-1 backdrop-blur-[8px]',\n className,\n )}\n style={{ width, height }}\n {...props}\n >\n <div className=\"relative h-full w-full\">\n {points.map((p, i) => (\n <span\n key={i}\n aria-hidden\n className=\"absolute h-[2px] w-[2px] rounded-full\"\n style={{\n left: `${p.x * 100}%`,\n top: `${p.y * 100}%`,\n background: p.color ?? 'var(--color-accent)',\n }}\n />\n ))}\n {viewport && (\n <span\n aria-hidden\n data-testid=\"minimap-viewport\"\n className=\"border-accent absolute rounded-[2px] border\"\n style={{\n left: `${viewport.x * 100}%`,\n top: `${viewport.y * 100}%`,\n width: `${viewport.width * 100}%`,\n height: `${viewport.height * 100}%`,\n background: 'var(--color-accent-glow)',\n }}\n />\n )}\n </div>\n </div>\n );\n});\n\nGraphMinimap.displayName = 'GraphMinimap';\n","'use client';\n\nimport { cn } from '@ship-it-ui/ui';\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\n\nimport { getEntityTypeMeta, type EntityType } from '../entity/types';\n\n/**\n * GraphNode — visual representation of a graph node. Resolves color + glyph\n * from the shared entity-type registry, so consumer-registered types render\n * with their own visuals. Five states (default, hover, selected, on-path,\n * dimmed). The component itself is presentation-only; pan / zoom / drag is\n * the host's job.\n */\n\nexport type GraphNodeState = 'default' | 'hover' | 'selected' | 'path' | 'dim';\n\nexport interface GraphNodeProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n type: EntityType;\n state?: GraphNodeState;\n /** Override the leading glyph. */\n glyph?: ReactNode;\n /** Caption rendered below the node. */\n label?: ReactNode;\n /** Pixel size of the square. Default 52. */\n size?: number;\n /** Use the node's \"on a path\" purple ring even if state isn't `path`. */\n pathColor?: string;\n}\n\nexport const GraphNode = forwardRef<HTMLDivElement, GraphNodeProps>(function GraphNode(\n { type, state = 'default', glyph, label, size = 52, pathColor, className, style, ...props },\n ref,\n) {\n const meta = getEntityTypeMeta(type);\n const color = state === 'path' ? (pathColor ?? 'var(--color-purple)') : meta.colorVar;\n // Glow opacity expressed as a percent for color-mix; hover ≈ 50% (was hex 80), default ≈ 25% (was hex 40).\n const glowPct = state === 'hover' ? 50 : 25;\n const opacity = state === 'dim' ? 0.35 : 1;\n const showRing = state === 'selected' || state === 'path';\n\n return (\n <div\n ref={ref}\n role=\"img\"\n aria-label={typeof label === 'string' ? label : `${type} node`}\n data-state={state}\n data-entity-type={type}\n className={cn('inline-flex flex-col items-center gap-[6px]', className)}\n style={style}\n {...props}\n >\n <div\n className=\"bg-panel grid place-items-center rounded-[14px] border-[1.5px] transition-all duration-(--duration-micro)\"\n style={{\n width: size,\n height: size,\n borderColor: color,\n color,\n fontSize: Math.round(size * 0.42),\n boxShadow: `0 0 ${state === 'hover' ? 30 : 20}px color-mix(in oklab, ${color} ${glowPct}%, transparent)`,\n outline: showRing ? `2px solid ${color}` : undefined,\n outlineOffset: showRing ? 4 : undefined,\n opacity,\n }}\n >\n {glyph ?? meta.glyph}\n </div>\n {label && <span className=\"text-text-dim font-mono text-[10px]\">{label}</span>}\n </div>\n );\n});\n\nGraphNode.displayName = 'GraphNode';\n","'use client';\n\nimport { forwardRef, type SVGAttributes } from 'react';\n\n/**\n * PathOverlay — `<polyline>` highlighting a multi-hop path through the graph.\n * Renders inside a parent `<svg>`; takes the path as a list of `{ x, y }`\n * waypoints and draws a thicker, accent-tone line plus an optional shadow\n * stroke for legibility on busy backgrounds.\n */\n\nexport interface PathPoint {\n x: number;\n y: number;\n}\n\nexport interface PathOverlayProps extends Omit<SVGAttributes<SVGGElement>, 'points'> {\n points: ReadonlyArray<PathPoint>;\n /** Stroke color. Defaults to the path-emphasis purple. */\n color?: string;\n /** Stroke width in px. Default 2.5. */\n width?: number;\n /** Halo shadow stroke for legibility. Default true. */\n halo?: boolean;\n}\n\nexport const PathOverlay = forwardRef<SVGGElement, PathOverlayProps>(function PathOverlay(\n { points, color = 'var(--color-purple)', width = 2.5, halo = true, ...props },\n ref,\n) {\n if (points.length < 2) return null;\n const coords = points.map((p) => `${p.x},${p.y}`).join(' ');\n return (\n <g ref={ref} {...props}>\n {halo && (\n <polyline\n points={coords}\n fill=\"none\"\n stroke=\"var(--color-bg)\"\n strokeWidth={width + 4}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n opacity={0.65}\n />\n )}\n <polyline\n points={coords}\n fill=\"none\"\n stroke={color}\n strokeWidth={width}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </g>\n );\n});\n\nPathOverlay.displayName = 'PathOverlay';\n","'use client';\n\nimport { cn } from '@ship-it-ui/ui';\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\n\n/**\n * CTAStrip — full-width call-to-action band. Title + body + actions, on a\n * gradient panel background. Sits between feature sections and the footer.\n */\n\nexport interface CTAStripProps extends Omit<HTMLAttributes<HTMLElement>, 'title'> {\n title: ReactNode;\n description?: ReactNode;\n actions?: ReactNode;\n}\n\nexport const CTAStrip = forwardRef<HTMLElement, CTAStripProps>(function CTAStrip(\n { title, description, actions, className, ...props },\n ref,\n) {\n return (\n <section\n ref={ref}\n className={cn(\n 'rounded-xl px-10 py-12 text-center',\n 'bg-[linear-gradient(135deg,var(--color-cta-from),var(--color-cta-to))]',\n className,\n )}\n {...props}\n >\n <h2 className=\"m-0 mb-[10px] text-[28px] font-medium tracking-[-0.4px]\">{title}</h2>\n {description && <p className=\"text-text-muted m-0 mb-5 text-[13px]\">{description}</p>}\n {actions && <div className=\"flex flex-wrap justify-center gap-2\">{actions}</div>}\n </section>\n );\n});\n\nCTAStrip.displayName = 'CTAStrip';\n","'use client';\n\nimport { cn } from '@ship-it-ui/ui';\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\n\n/**\n * FeatureGrid — responsive grid of feature tiles. Each tile shows a glyph,\n * title, body description.\n */\n\nexport interface Feature {\n glyph: ReactNode;\n title: ReactNode;\n description: ReactNode;\n}\n\nexport interface FeatureGridProps extends HTMLAttributes<HTMLDivElement> {\n features: ReadonlyArray<Feature>;\n /** Columns at the largest breakpoint. Default 3. */\n columns?: 2 | 3 | 4;\n}\n\nconst colsClass = {\n 2: 'md:grid-cols-2',\n 3: 'md:grid-cols-3',\n 4: 'md:grid-cols-2 lg:grid-cols-4',\n} as const;\n\nexport const FeatureGrid = forwardRef<HTMLDivElement, FeatureGridProps>(function FeatureGrid(\n { features, columns = 3, className, ...props },\n ref,\n) {\n return (\n <div\n ref={ref}\n className={cn('grid grid-cols-1 gap-3', colsClass[columns], className)}\n {...props}\n >\n {features.map((f, i) => (\n <div key={i} className=\"rounded-base border-border bg-panel border p-5\">\n <div aria-hidden className=\"text-accent mb-3 text-[22px]\">\n {f.glyph}\n </div>\n <div className=\"mb-[6px] text-[14px] font-medium\">{f.title}</div>\n <div className=\"text-text-muted text-[12px] leading-[1.55]\">{f.description}</div>\n </div>\n ))}\n </div>\n );\n});\n\nFeatureGrid.displayName = 'FeatureGrid';\n","'use client';\n\nimport { cn } from '@ship-it-ui/ui';\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\n\n/**\n * Footer — site footer with brand on the left and grouped link columns on\n * the right, plus a copyright line below a divider.\n */\n\nexport interface FooterLink {\n label: ReactNode;\n href: string;\n}\n\nexport interface FooterColumn {\n heading: ReactNode;\n links: ReadonlyArray<FooterLink>;\n}\n\nexport interface FooterProps extends HTMLAttributes<HTMLElement> {\n /** Brand label (logo + word mark). */\n brand?: ReactNode;\n columns: ReadonlyArray<FooterColumn>;\n /** Copyright / legal line. */\n copyright?: ReactNode;\n /** Right-side closing line (e.g., `made with care · san francisco`). */\n closing?: ReactNode;\n}\n\nexport const Footer = forwardRef<HTMLElement, FooterProps>(function Footer(\n { brand, columns, copyright, closing, className, ...props },\n ref,\n) {\n return (\n <footer ref={ref} className={cn('px-7 py-7', className)} {...props}>\n <div className=\"mb-7 flex flex-wrap gap-8\">\n {brand && <div>{brand}</div>}\n <div className=\"text-text-muted ml-auto flex flex-wrap gap-6 text-[12px]\">\n {columns.map((col, i) => (\n <div key={i} className=\"flex flex-col gap-[6px]\">\n <div className=\"text-text-dim font-mono text-[10px] tracking-[1.2px] uppercase\">\n {col.heading}\n </div>\n {col.links.map((link, j) => (\n <a\n key={j}\n href={link.href}\n className=\"text-text-muted hover:text-text no-underline\"\n >\n {link.label}\n </a>\n ))}\n </div>\n ))}\n </div>\n </div>\n <div className=\"border-border text-text-dim flex border-t pt-4 font-mono text-[11px]\">\n {copyright && <span>{copyright}</span>}\n {closing && <span className=\"ml-auto\">{closing}</span>}\n </div>\n </footer>\n );\n});\n\nFooter.displayName = 'Footer';\n","'use client';\n\nimport { cn } from '@ship-it-ui/ui';\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\n\n/**\n * Hero — landing-page top section. Optional eyebrow / pill above the headline,\n * a large heading (children of `<h1>`), a body description, and an action row.\n *\n * Designed for marketing surfaces only — do not bring this into the app.\n */\n\nexport interface HeroProps extends Omit<HTMLAttributes<HTMLElement>, 'title'> {\n /** Eyebrow / pill rendered above the headline. */\n eyebrow?: ReactNode;\n /** Headline. Pass JSX to highlight a phrase (e.g., `<span className=\"text-accent\">…</span>`). */\n title: ReactNode;\n /** Subheading. */\n description?: ReactNode;\n /** Action buttons row. */\n actions?: ReactNode;\n /** Trailing visual (right-side image, animation). When provided, the hero\n * switches to a two-column layout. */\n visual?: ReactNode;\n}\n\nexport const Hero = forwardRef<HTMLElement, HeroProps>(function Hero(\n { eyebrow, title, description, actions, visual, className, ...props },\n ref,\n) {\n const hasVisual = visual != null;\n return (\n <section\n ref={ref}\n className={cn(\n 'flex flex-col items-center justify-between gap-10 px-6 py-16 md:py-24',\n hasVisual && 'md:flex-row md:items-center md:gap-16',\n className,\n )}\n {...props}\n >\n <div className={cn('max-w-[680px]', !hasVisual && 'mx-auto text-center')}>\n {eyebrow}\n <h1\n className={cn(\n 'mb-4 text-[44px] leading-[1.05] font-medium tracking-[-1.6px] md:text-[56px]',\n eyebrow && 'mt-5',\n )}\n >\n {title}\n </h1>\n {description && (\n <p className=\"text-text-muted mb-7 text-[17px] leading-[1.6]\">{description}</p>\n )}\n {actions && (\n <div className={cn('flex flex-wrap gap-2', !hasVisual && 'justify-center')}>\n {actions}\n </div>\n )}\n </div>\n {visual && <div className=\"flex-1\">{visual}</div>}\n </section>\n );\n});\n\nHero.displayName = 'Hero';\n","'use client';\n\nimport { cn } from '@ship-it-ui/ui';\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\n\n/**\n * PricingCard — single tier in a pricing table. Shows tier name, price,\n * description, list of features (with ✓ markers), and an action button slot.\n *\n * The card establishes a CSS container, so the price scales with the card's\n * own inline-size rather than the viewport — when three cards crowd into a\n * narrow column the price doesn't blow out the layout.\n *\n * Pass `featured` to highlight the card with an accent border + tinted\n * background for the \"recommended\" tier. Use `priceUnit` for per-period\n * suffixes (e.g. `/ user / mo`) so the unit lays out next to the price\n * baseline-aligned and wraps cleanly when there isn't room.\n */\n\nexport interface PricingCardProps extends HTMLAttributes<HTMLDivElement> {\n /** Tier name — e.g., `Pro`, `Team`. */\n tier: ReactNode;\n /** Headline price, e.g. `$29` or `Talk to us`. */\n price: ReactNode;\n /** Optional small unit rendered next to the price, e.g. `/ user / mo`. */\n priceUnit?: ReactNode;\n /** Short description below the tier name. */\n description?: ReactNode;\n /** Feature bullet list. */\n features: ReadonlyArray<ReactNode>;\n /** Action button (typically a `<Button>`). */\n action?: ReactNode;\n /** Highlight as the recommended tier. */\n featured?: boolean;\n}\n\nexport const PricingCard = forwardRef<HTMLDivElement, PricingCardProps>(function PricingCard(\n { tier, price, priceUnit, description, features, action, featured, className, ...props },\n ref,\n) {\n return (\n <div\n ref={ref}\n className={cn(\n 'bg-panel @container flex flex-col gap-5 rounded-lg border p-5 @sm:p-6',\n featured ? 'border-accent shadow-lg' : 'border-border',\n className,\n )}\n {...props}\n >\n <div>\n <div className=\"mb-1 flex flex-wrap items-center gap-2\">\n <span className=\"text-[14px] font-medium\">{tier}</span>\n {featured && (\n <span className=\"bg-accent-dim text-accent rounded-full px-[6px] py-[1px] font-mono text-[10px]\">\n recommended\n </span>\n )}\n </div>\n {description && <div className=\"text-text-muted text-[12px]\">{description}</div>}\n </div>\n <div className=\"flex flex-wrap items-baseline justify-center gap-x-2 gap-y-1\">\n <span className=\"font-mono text-[22px] font-medium tracking-[-0.5px] text-balance @sm:text-[28px]\">\n {price}\n </span>\n {priceUnit != null && (\n <span className=\"text-text-dim text-[12px] whitespace-nowrap @sm:text-[13px]\">\n {priceUnit}\n </span>\n )}\n </div>\n <ul className=\"m-0 flex list-none flex-col gap-2 p-0\">\n {features.map((f, i) => (\n <li key={i} className=\"flex items-start gap-2 text-[13px]\">\n <span aria-hidden className=\"text-accent\">\n ✓\n </span>\n <span>{f}</span>\n </li>\n ))}\n </ul>\n {action && <div className=\"mt-auto\">{action}</div>}\n </div>\n );\n});\n\nPricingCard.displayName = 'PricingCard';\n","'use client';\n\nimport { Avatar } from '@ship-it-ui/ui';\nimport { cn } from '@ship-it-ui/ui';\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\n\n/**\n * Testimonial — pull-quote with author + role. Centered for marketing\n * surfaces.\n */\n\nexport interface TestimonialProps extends Omit<HTMLAttributes<HTMLElement>, 'cite' | 'role'> {\n /** The quoted body. */\n quote: ReactNode;\n /** Author display name. */\n author: ReactNode;\n /** Author role / company. */\n role?: ReactNode;\n /** Avatar initials or full node. */\n avatar?: ReactNode;\n}\n\nexport const Testimonial = forwardRef<HTMLElement, TestimonialProps>(function Testimonial(\n { quote, author, role, avatar, className, ...props },\n ref,\n) {\n return (\n <figure\n ref={ref}\n className={cn('mx-auto max-w-[620px] px-6 py-10 text-center', className)}\n {...props}\n >\n <div aria-hidden className=\"text-accent mb-4 text-[40px] leading-none\">\n &ldquo;\n </div>\n <blockquote className=\"m-0 text-[22px] leading-[1.45] font-medium tracking-[-0.3px]\">\n {quote}\n </blockquote>\n <figcaption className=\"mt-5 flex items-center justify-center gap-[10px]\">\n {typeof avatar === 'string' ? <Avatar size=\"md\" name={avatar} /> : avatar}\n <div className=\"text-left\">\n <div className=\"text-[13px] font-medium\">{author}</div>\n {role && <div className=\"text-text-dim text-[11px]\">{role}</div>}\n </div>\n </figcaption>\n </figure>\n );\n});\n\nTestimonial.displayName = 'Testimonial';\n","'use client';\n\nimport { IconGlyph, type ConnectorName } from '@ship-it-ui/icons';\nimport { cn, formatRelative, StatusDot, type StatusState } from '@ship-it-ui/ui';\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\n\n/**\n * ConnectorCard — integration card for \"connector hubs\". Renders a connector\n * logo (via `@ship-it-ui/icons` connector glyphs), the connector name, a\n * sync-state dot, a relative last-sync timestamp, an optional summary, and a\n * trailing action slot.\n *\n * When `onClick` is provided the whole card becomes a button; otherwise it\n * renders as a plain `<div>`.\n */\n\nexport type ConnectorStatus = 'connected' | 'syncing' | 'error' | 'disconnected';\n\nexport interface ConnectorCardProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n 'title' | 'onClick'\n> {\n /** Connector name keyed into `@ship-it-ui/icons` connectorGlyphs. */\n connector: ConnectorName | (string & {});\n /** Display name shown next to the logo. */\n name: ReactNode;\n /** Sync status. Drives the status dot tone + the default status label. */\n status: ConnectorStatus;\n /** Last successful sync timestamp. Formatted relative to `relativeNow`. */\n lastSyncedAt?: Date | string | number;\n /** Reference time for relative formatting (injectable for tests/SSR). */\n relativeNow?: Date;\n /** Free-text summary (e.g. \"1,243 docs · 8 channels\"). */\n summary?: ReactNode;\n /** Trailing action slot — typically a `Button` or `DropdownMenu` trigger. */\n actions?: ReactNode;\n /** Click handler. When provided, the card becomes a button. */\n onClick?: () => void;\n /**\n * Accessible name override. Required when `onClick` is set *and* `name` is\n * not a string — without it the button has no accessible name (axe\n * `button-name`). Optional otherwise.\n */\n accessibleName?: string;\n}\n\nconst statusDot: Record<ConnectorStatus, StatusState> = {\n connected: 'ok',\n syncing: 'sync',\n error: 'err',\n disconnected: 'off',\n};\n\nconst statusLabel: Record<ConnectorStatus, string> = {\n connected: 'Connected',\n syncing: 'Syncing',\n error: 'Error',\n disconnected: 'Disconnected',\n};\n\nexport const ConnectorCard = forwardRef<HTMLDivElement, ConnectorCardProps>(function ConnectorCard(\n {\n connector,\n name,\n status,\n lastSyncedAt,\n relativeNow,\n summary,\n actions,\n onClick,\n accessibleName,\n className,\n ...props\n },\n ref,\n) {\n const interactive = typeof onClick === 'function';\n const time = lastSyncedAt ? formatRelative(lastSyncedAt, relativeNow ?? new Date()) : '';\n\n // The clickable label region (logo + name + status + sync time) is rendered\n // as a button when interactive; the `actions` slot sits beside it as a\n // sibling so any nested button stays a peer of the row button instead of a\n // descendant (avoiding axe `nested-interactive`).\n const labelBlock = (\n <>\n <span\n aria-hidden\n className=\"bg-panel-2 grid h-10 w-10 shrink-0 place-items-center rounded-md font-mono text-[16px]\"\n >\n <IconGlyph name={connector} kind=\"connector\" />\n </span>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"truncate text-[14px] font-medium\">{name}</span>\n <StatusDot\n state={statusDot[status]}\n pulse={status === 'syncing'}\n label={statusLabel[status]}\n />\n </div>\n {(summary || time) && (\n <div className=\"text-text-muted mt-[2px] flex items-center gap-2 text-[12px]\">\n {summary && <span className=\"truncate\">{summary}</span>}\n {summary && time && (\n <span aria-hidden className=\"text-text-dim\">\n ·\n </span>\n )}\n {time && (\n <time className=\"text-text-dim font-mono text-[11px]\">last synced {time}</time>\n )}\n </div>\n )}\n </div>\n </>\n );\n\n const labelRegionClass = cn(\n 'flex flex-1 items-start gap-3 rounded-md p-1 text-left transition-colors duration-(--duration-micro)',\n interactive &&\n 'hover:bg-panel-2 focus-visible:ring-accent-dim cursor-pointer outline-none focus-visible:ring-[3px]',\n );\n\n const labelRegion = interactive ? (\n <button\n type=\"button\"\n onClick={onClick}\n aria-label={\n accessibleName ?? (typeof name === 'string' ? `${name} connector` : statusLabel[status])\n }\n className={labelRegionClass}\n >\n {labelBlock}\n </button>\n ) : (\n <div className={labelRegionClass}>{labelBlock}</div>\n );\n\n return (\n <div\n ref={ref}\n className={cn(\n 'rounded-base border-border bg-panel flex items-start gap-2 border p-3',\n className,\n )}\n {...props}\n >\n {labelRegion}\n {actions && <div className=\"shrink-0 self-center pr-1\">{actions}</div>}\n </div>\n );\n});\n\nConnectorCard.displayName = 'ConnectorCard';\n","import { DataTable, type DataTableColumn, type DataTableProps } from '@ship-it-ui/ui';\nimport { type Ref } from 'react';\n\nimport { EntityBadge } from '../entity/EntityBadge';\nimport { getEntityTypeMeta, type EntityType } from '../entity/types';\n\n/**\n * EntityTable — DataTable preset with two ShipIt-aware column helpers:\n * `entityColumn(...)` for the typed name cell and `entityTypeColumn()` for a\n * standalone type column. Everything else (sort, selection, sticky header)\n * comes from `@ship-it-ui/ui` DataTable as-is.\n */\n\ninterface MinimalEntity {\n id: string;\n type: EntityType;\n name: string;\n}\n\nexport type EntityTableProps<T extends MinimalEntity> = Omit<DataTableProps<T>, 'rowKey'> & {\n rowKey?: (row: T) => string;\n};\n\nexport function EntityTable<T extends MinimalEntity>(\n props: EntityTableProps<T> & { ref?: Ref<HTMLTableElement> },\n) {\n const { rowKey, ...rest } = props;\n return <DataTable {...rest} rowKey={rowKey ?? ((row: T) => row.id)} />;\n}\n\n/**\n * Pre-built column for the entity name. Renders the type glyph (in the type's\n * tone) followed by the name in mono. Sorts on `name`.\n */\nexport function entityColumn<T extends MinimalEntity>(\n options: { key?: string; header?: string } = {},\n): DataTableColumn<T> {\n return {\n key: options.key ?? 'name',\n header: options.header ?? 'Name',\n accessor: (row) => row.name,\n cell: (row) => {\n const meta = getEntityTypeMeta(row.type);\n return (\n <span className=\"flex items-center gap-2 font-mono\" data-entity-type={row.type}>\n <span aria-hidden className={meta.toneClass}>\n {meta.glyph}\n </span>\n {row.name}\n </span>\n );\n },\n };\n}\n\n/**\n * Pre-built column rendering the canonical EntityBadge.\n */\nexport function entityTypeColumn<T extends MinimalEntity>(\n options: { key?: string; header?: string } = {},\n): DataTableColumn<T> {\n return {\n key: options.key ?? 'type',\n header: options.header ?? 'Type',\n accessor: (row) => row.type,\n cell: (row) => <EntityBadge type={row.type} size=\"sm\" />,\n };\n}\n","'use client';\n\nimport { cn } from '@ship-it-ui/ui';\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\n\n/**\n * NotifRow — single row in the mobile Inbox / notification list. Shows an\n * unread dot (tone-colored), a tight title + body block, and a right-aligned\n * relative time. Pair with `isFirst` / `isLast` props from a parent list\n * wrapper to round the corners of the group like an iOS grouped list.\n *\n * No desktop sibling — desktop uses the standard `Notifications` flyout\n * inside CommandPalette. This composite is mobile-only and lives under\n * `packages/shipit/src/notifications/`.\n */\n\nexport type NotifTone = 'ok' | 'warn' | 'err' | 'neutral';\n\nexport interface NotifRowProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n /** Bold first-line summary. */\n title: ReactNode;\n /** One-line body underneath. Truncates to a single line for now. */\n body?: ReactNode;\n /** Right-aligned relative time string (e.g. `9:32`, `Mon`). */\n time?: ReactNode;\n /** Coloring of the unread dot. */\n tone?: NotifTone;\n /** When true, render the unread dot. */\n unread?: boolean;\n /** Round the top corners — set when this is the first row in a group. */\n isFirst?: boolean;\n /** Round the bottom corners — set when this is the last row in a group. */\n isLast?: boolean;\n /**\n * Navigate when the row is tapped. Renders the row as an `<a>` and wins\n * over `onClick` for the render shape — but any `onClick` you pass is\n * still forwarded onto the anchor, which is the right place for\n * analytics callbacks (the link still navigates).\n */\n href?: string;\n}\n\nconst toneClass: Record<NotifTone, string> = {\n ok: 'bg-ok',\n warn: 'bg-warn',\n err: 'bg-err',\n neutral: 'bg-accent-text',\n};\n\nexport const NotifRow = forwardRef<HTMLDivElement, NotifRowProps>(function NotifRow(\n {\n title,\n body,\n time,\n tone = 'neutral',\n unread,\n isFirst,\n isLast,\n href,\n className,\n onClick,\n ...props\n },\n ref,\n) {\n // Padding/border arrangement mirrors the iOS grouped list aesthetic from the\n // Mobile Library: every row has full-width borders, the first/last rows\n // round their leading/trailing corners so the group reads as a single card.\n const content = (\n <>\n <div className=\"pt-1\" aria-hidden>\n <div\n className={cn('h-2 w-2 rounded-full', unread ? toneClass[tone] : 'bg-border-strong')}\n />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-baseline justify-between gap-2\">\n <div className=\"truncate text-[14px] font-medium tracking-tight\">{title}</div>\n {time != null && (\n <span className=\"text-text-muted shrink-0 font-mono text-[11px] whitespace-nowrap\">\n {time}\n </span>\n )}\n </div>\n {body && <div className=\"text-text-muted mt-[3px] text-[13px] leading-tight\">{body}</div>}\n </div>\n </>\n );\n\n const baseClass = cn(\n 'flex gap-3 p-[14px] bg-panel border-border border-l border-r',\n isFirst ? 'border-t rounded-t-m-card' : '',\n 'border-b',\n isLast ? 'rounded-b-m-card' : '',\n href || onClick ? 'cursor-pointer hover:bg-panel-2' : '',\n className,\n );\n\n if (href) {\n return (\n <a\n // Same cast pattern as the `<button>` branch below: `forwardRef` types\n // this component for `HTMLDivElement` (the default-render case), but\n // when we swap to `<a>` the ref slot expects `HTMLAnchorElement`. The\n // `{...props}` spread carries forwarded HTML attributes — `id`,\n // `data-*`, `aria-*`, `onFocus`, etc. — that consumers pass to the\n // polymorphic root. `onClick` is forwarded explicitly because it was\n // destructured out of `props` above; this is the analytics-on-link\n // pattern (`href` navigates, `onClick` tracks).\n ref={ref as unknown as React.Ref<HTMLAnchorElement>}\n href={href}\n onClick={onClick as unknown as React.MouseEventHandler<HTMLAnchorElement>}\n className={cn(\n baseClass,\n 'text-text focus-visible:ring-accent-dim no-underline outline-none focus-visible:ring-[3px]',\n )}\n {...(props as React.HTMLAttributes<HTMLAnchorElement>)}\n >\n {content}\n </a>\n );\n }\n\n // When the row is tappable but not a link, render as a <button> so keyboard\n // (Enter/Space) activation comes for free — otherwise a non-link, non-button\n // <div onClick> trips axe's `click-events-have-key-events` rule.\n if (onClick) {\n return (\n <button\n type=\"button\"\n // `forwardRef` types this component for `HTMLDivElement` (the default\n // rendering); when we swap to `<button>` for the tappable variant the\n // ref slot expects `HTMLButtonElement`. Cast through `unknown` because\n // these two element types don't overlap. `{...props}` carries\n // forwarded HTML attributes — `id`, `data-*`, `aria-*`, etc.\n ref={ref as unknown as React.Ref<HTMLButtonElement>}\n onClick={onClick as unknown as React.MouseEventHandler<HTMLButtonElement>}\n className={cn(\n baseClass,\n 'focus-visible:ring-accent-dim text-left outline-none focus-visible:ring-[3px]',\n )}\n {...(props as React.HTMLAttributes<HTMLButtonElement>)}\n >\n {content}\n </button>\n );\n }\n\n return (\n <div ref={ref} className={baseClass} {...props}>\n {content}\n </div>\n );\n});\n\nNotifRow.displayName = 'NotifRow';\n"],"mappings":"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","names":["cn","AskBar","cn","forwardRef","jsx","jsxs","Citation","cn","forwardRef","jsx","jsxs","ConfidenceIndicator","cn","forwardRef","jsx","jsxs","CopilotMessage","useControllableState","cn","forwardRef","jsx","jsxs","ReasoningBlock","ReasoningStep","cn","forwardRef","jsx","jsxs","SuggestionChip","cn","forwardRef","Fragment","jsx","jsxs","ToolCallCard","Badge","cn","forwardRef","jsx","jsxs","forwardRef","EntityBadge","Badge","cn","cn","forwardRef","jsx","jsxs","forwardRef","EntityCard","cn","cn","forwardRef","Fragment","jsx","jsxs","cn","forwardRef","EntityListRowDiv","EntityListRowButton","forwardRef","jsx","GraphEdge","cn","forwardRef","jsx","jsxs","forwardRef","GraphInspector","cn","cn","forwardRef","jsx","jsxs","forwardRef","GraphLegend","cn","cn","forwardRef","jsx","jsxs","GraphMinimap","cn","forwardRef","jsx","jsxs","forwardRef","GraphNode","cn","forwardRef","jsx","jsxs","PathOverlay","cn","forwardRef","jsx","jsxs","CTAStrip","cn","forwardRef","jsx","jsxs","FeatureGrid","cn","forwardRef","jsx","jsxs","Footer","cn","forwardRef","jsx","jsxs","Hero","cn","forwardRef","jsx","jsxs","PricingCard","Avatar","cn","forwardRef","jsx","jsxs","Testimonial","cn","forwardRef","Fragment","jsx","jsxs","ConnectorCard","jsx","jsxs","cn","forwardRef","Fragment","jsx","jsxs","NotifRow"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ship-it-ui/shipit",
3
- "version": "0.0.4",
3
+ "version": "0.0.6",
4
4
  "description": "ShipIt-AI domain composites: AI surfaces, knowledge-graph chrome, entity displays, and marketing components — built on @ship-it-ui/ui.",
5
5
  "license": "MIT",
6
6
  "homepage": "https://ship-it-ops.github.io/ship-it-design/",
@@ -43,8 +43,8 @@
43
43
  "peerDependencies": {
44
44
  "react": "^18.0.0 || ^19.0.0",
45
45
  "react-dom": "^18.0.0 || ^19.0.0",
46
- "@ship-it-ui/icons": "0.0.4",
47
- "@ship-it-ui/ui": "0.0.4"
46
+ "@ship-it-ui/icons": "0.0.5",
47
+ "@ship-it-ui/ui": "0.0.5"
48
48
  },
49
49
  "devDependencies": {
50
50
  "@testing-library/jest-dom": "^6.6.3",
@@ -62,9 +62,9 @@
62
62
  "vitest": "^2.1.3",
63
63
  "vitest-axe": "^0.1.0",
64
64
  "@ship-it-ui/eslint-config": "0.0.1",
65
- "@ship-it-ui/icons": "0.0.4",
66
- "@ship-it-ui/tokens": "0.0.4",
67
- "@ship-it-ui/ui": "0.0.4",
65
+ "@ship-it-ui/icons": "0.0.5",
66
+ "@ship-it-ui/tokens": "0.0.5",
67
+ "@ship-it-ui/ui": "0.0.5",
68
68
  "@ship-it-ui/tsconfig": "0.0.1"
69
69
  },
70
70
  "scripts": {