indira-workspace-ui 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indira-workspace-ui.mjs","names":[],"sources":["../src/components/Button.jsx","../src/components/Card.jsx","../src/components/status.js","../src/components/StatusGlyph.jsx","../src/components/StatTile.jsx","../src/components/avatar-utils.js","../src/components/Avatar.jsx","../src/components/RecordCard.jsx","../src/components/Table.jsx","../src/components/FilterChip.jsx","../src/components/Tabs.jsx","../src/components/ToolbarButton.jsx","../src/components/Input.jsx","../src/components/Chip.jsx","../src/components/Notice.jsx","../src/components/usePerson.js","../src/components/Person.jsx","../src/components/Stepper.jsx","../src/components/scroll-lock.js","../src/components/Dialog.jsx","../src/components/DocFull.jsx","../src/components/Skeleton.jsx","../src/components/EmptyState.jsx","../src/components/toast-context.js","../src/components/Toast.jsx","../src/components/theme.js","../src/components/Shell.jsx"],"sourcesContent":["import { forwardRef } from \"react\";\n\n/**\n * Button (§4.1) — pill, 40px, 14/600. Small: 34px, 12px.\n *\n * Variants: filled (at most ONE per view, law 1) · tonal · outlined · text ·\n * approve / sendback / reject (the three decisions, law 14).\n *\n * `attention` rings a filled button in sent-back amber while the form is\n * incomplete. `loading` swaps the icon for a spinner inside the button —\n * the only place a spinner is allowed (law 10).\n */\nconst Button = forwardRef(function Button(\n {\n variant = \"outlined\",\n size = \"md\",\n icon: Icon,\n iconEnd: IconEnd,\n iconOnly = false,\n attention = false,\n loading = false,\n as: Tag = \"button\",\n className = \"\",\n children,\n type,\n ...rest\n },\n ref\n) {\n const iconSize = size === \"sm\" ? 16 : 18;\n const classes = [\n \"btn\",\n `btn--${variant}`,\n size === \"sm\" && \"btn--sm\",\n iconOnly && \"btn--icon\",\n attention && \"btn--attention\",\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n const isButton = Tag === \"button\";\n\n return (\n <Tag\n ref={ref}\n className={classes}\n type={isButton ? type ?? \"button\" : undefined}\n aria-busy={loading || undefined}\n aria-label={iconOnly ? rest[\"aria-label\"] ?? rest.title : rest[\"aria-label\"]}\n {...rest}\n >\n {loading ? (\n <span className=\"btn-spinner\" aria-hidden=\"true\" />\n ) : (\n Icon && <Icon size={iconSize} aria-hidden=\"true\" />\n )}\n {!iconOnly && children != null && <span className=\"truncate\">{children}</span>}\n {!iconOnly && IconEnd && <IconEnd size={iconSize} aria-hidden=\"true\" />}\n </Tag>\n );\n});\n\nexport default Button;\n","import { forwardRef } from \"react\";\n\n/**\n * Card (§4.2) — surface, radius 16, elev-2, no border (hairline in dark).\n * A card is a REGION, never decoration: do not nest cards.\n *\n * <Card>\n * <Card.Header title=\"Approvers\" action={<Button size=\"sm\">Edit</Button>} />\n * <Card.Body>…</Card.Body>\n * </Card>\n */\nconst Card = forwardRef(function Card({ as: Tag = \"section\", className = \"\", children, ...rest }, ref) {\n return (\n <Tag ref={ref} className={`card ${className}`} {...rest}>\n {children}\n </Tag>\n );\n});\n\nfunction CardHeader({ title, icon: Icon, action, className = \"\", children }) {\n return (\n <header className={`card-h ${className}`}>\n <div className=\"flex items-center gap-4 min-w-0\">\n {Icon && <Icon size={20} className=\"text-ink-muted\" aria-hidden=\"true\" />}\n {title && <h2 className=\"card-title truncate\">{title}</h2>}\n {children}\n </div>\n {action && <div className=\"flex items-center gap-2 shrink-0\">{action}</div>}\n </header>\n );\n}\n\nfunction CardBody({ compact = false, className = \"\", children }) {\n return <div className={`card-b ${compact ? \"card-b--compact\" : \"\"} ${className}`}>{children}</div>;\n}\n\nCard.Header = CardHeader;\nCard.Body = CardBody;\n\nexport default Card;\n","import { File, Send, Clock, CircleCheck, Ban, Undo2 } from \"lucide-react\";\n\n/**\n * The six statuses — the entire data palette (§1.1).\n * Every status is a shape AND a colour (law 5): the glyph here pairs with\n * the `--c-st-*` / `--chip-*` tokens in index.css.\n */\nexport const STATUSES = [\"draft\", \"submitted\", \"review\", \"approved\", \"rejected\", \"sentback\"];\n\nexport const STATUS_META = {\n draft: { label: \"Draft\", icon: File, token: \"--c-st-draft\" },\n submitted: { label: \"Submitted\", icon: Send, token: \"--c-st-submitted\" },\n review: { label: \"In review\", icon: Clock, token: \"--c-st-review\" },\n approved: { label: \"Approved\", icon: CircleCheck, token: \"--c-st-approved\" },\n rejected: { label: \"Rejected\", icon: Ban, token: \"--c-st-rejected\" },\n sentback: { label: \"Sent back\", icon: Undo2, token: \"--c-st-sentback\" },\n};\n\nexport function statusLabel(status) {\n return STATUS_META[status]?.label ?? status;\n}\n\nexport function statusIcon(status) {\n return STATUS_META[status]?.icon ?? File;\n}\n\n/** CSS colour expression for a status, usable in inline styles. */\nexport function statusColor(status) {\n return `rgb(var(${STATUS_META[status]?.token ?? \"--c-st-draft\"}))`;\n}\n\n/** Bare \"R G B\" custom-property reference, for `--orb-tone` / `--tile-tone`. */\nexport function statusTriplet(status) {\n return `var(${STATUS_META[status]?.token ?? \"--c-st-draft\"})`;\n}\n","import { File } from \"lucide-react\";\nimport { STATUS_META } from \"./status\";\n\n/** The glyph half of \"status is a shape and a colour\" (law 5). */\nexport default function StatusGlyph({ status, size = 16, ...rest }) {\n const Icon = STATUS_META[status]?.icon ?? File;\n return <Icon size={size} aria-hidden=\"true\" {...rest} />;\n}\n","import { statusTriplet } from \"./status\";\nimport StatusGlyph from \"./StatusGlyph\";\n\n/**\n * Stat tile (§4.3) — a card with a 44px tinted status icon, figure 24/600,\n * 12/500 muted label. Click filters the list it summarises. Active: 2px\n * primary ring. KPI tiles are used INSTEAD of distribution bars (§1.1 CVD).\n *\n * <StatTile status=\"review\" figure={12} label=\"In review\" active onClick={…} />\n */\nexport default function StatTile({\n status = \"draft\",\n icon,\n figure,\n label,\n active = false,\n onClick,\n className = \"\",\n ...rest\n}) {\n const Icon = icon;\n const Tag = onClick ? \"button\" : \"div\";\n return (\n <Tag\n type={onClick ? \"button\" : undefined}\n className={`stat-tile ${className}`}\n data-active={active ? \"true\" : undefined}\n aria-pressed={onClick ? active : undefined}\n onClick={onClick}\n style={{ \"--tile-tone\": statusTriplet(status) }}\n {...rest}\n >\n <span className=\"stat-tile__icon\">\n {Icon ? <Icon size={24} aria-hidden=\"true\" /> : <StatusGlyph status={status} size={24} />}\n </span>\n <span className=\"min-w-0\">\n <span className=\"stat-tile__figure block\">{figure}</span>\n <span className=\"stat-tile__label block truncate\">{label}</span>\n </span>\n </Tag>\n );\n}\n","/**\n * Avatar helpers (§4.12). Six tints derived from the name — all outside the\n * brand's red family and outside the status palette.\n */\nexport const AVATAR_TINTS = [\"#1D4ED8\", \"#6D28D9\", \"#15803D\", \"#B45309\", \"#475569\", \"#0F766E\"];\nexport const AVATAR_SIZES = [20, 24, 28, 32, 40, 44, 48];\n\nexport function initialsOf(name = \"\") {\n const parts = String(name).trim().split(/[\\s.@_-]+/).filter(Boolean);\n if (parts.length === 0) return \"?\";\n if (parts.length === 1) return parts[0].slice(0, 2).toUpperCase();\n return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\n}\n\nexport function tintOf(name = \"\") {\n let h = 0;\n for (let i = 0; i < name.length; i += 1) h = (h * 31 + name.charCodeAt(i)) >>> 0;\n return AVATAR_TINTS[h % AVATAR_TINTS.length];\n}\n","import { AVATAR_SIZES, initialsOf, tintOf } from \"./avatar-utils\";\n\n/**\n * Avatar (§4.12) — initials 600 white on one of six tints derived from the\n * name. Renders a photo instead when the person has one.\n * Sizes 20 / 24 / 28 / 32 / 40 / 44 / 48.\n */\nexport default function Avatar({ name = \"\", photo, size = 32, className = \"\", title, ...rest }) {\n const px = AVATAR_SIZES.includes(size) ? size : 32;\n const font = px <= 24 ? 10 : px <= 32 ? 12 : 14;\n return (\n <span\n className={`avatar ${className}`}\n style={{ width: px, height: px, fontSize: font, \"--avatar-tint\": tintOf(name) }}\n title={title ?? name}\n role=\"img\"\n aria-label={name}\n {...rest}\n >\n {photo ? <img src={photo} alt=\"\" /> : initialsOf(name)}\n </span>\n );\n}\n\n/**\n * Avatar stack — overlaps by 4px with a 2px surface ring; dashed \"+N\" for\n * the rest. `people` is an array of { name, photo? }.\n */\nexport function AvatarStack({ people = [], max = 4, size = 24, className = \"\" }) {\n const shown = people.slice(0, max);\n const rest = people.length - shown.length;\n return (\n <span className={`avatar-stack ${className}`} title={people.map((p) => p.name).join(\", \")}>\n {shown.map((p) => (\n <Avatar key={p.id ?? p.email ?? p.name} name={p.name} photo={p.photo} size={size} />\n ))}\n {rest > 0 && (\n <span className=\"avatar-more\" style={{ width: size, height: size }} aria-label={`${rest} more`}>\n +{rest}\n </span>\n )}\n </span>\n );\n}\n","import { AvatarStack } from \"./Avatar\";\nimport { statusLabel, statusTriplet } from \"./status\";\nimport StatusGlyph from \"./StatusGlyph\";\n\n/**\n * Large-icon record card (§4.4, `.brd-card`) — for lists where the STATE\n * of a record matters more than its metadata. A 52px solid status orb sits\n * centred on the top edge; the title clamps to two lines and reserves two\n * so meta rows align across the row (law 7). Footer pins to the bottom.\n *\n * The card shows no id, no status text, no priority — the orb IS the\n * status; the id lives in `title=` and an sr-only span (law 3).\n *\n * <RecordCardGrid>\n * <RecordCard\n * id=\"BRD-2026-0142\" status=\"review\" title=\"…\"\n * meta={[{ icon: Building2, text: \"Finance\" }, { icon: Calendar, text: \"12 Aug 2026\" }]}\n * approvers={[{ name: \"…\" }]} progress={40} onClick={…}\n * />\n * </RecordCardGrid>\n */\nexport default function RecordCard({\n id,\n status = \"draft\",\n title,\n meta = [],\n approvers = [],\n progress,\n onClick,\n href,\n className = \"\",\n ...rest\n}) {\n const Tag = href ? \"a\" : onClick ? \"button\" : \"article\";\n const tip = [id, statusLabel(status)].filter(Boolean).join(\" · \");\n return (\n <Tag\n className={`brd-card ${className}`}\n href={href}\n type={Tag === \"button\" ? \"button\" : undefined}\n onClick={onClick}\n title={tip}\n {...rest}\n >\n <span className=\"brd-card__orb\" style={{ \"--orb-tone\": statusTriplet(status) }} aria-hidden=\"true\">\n <StatusGlyph status={status} size={24} />\n </span>\n <span className=\"sr-only\">\n {id ? `${id}, ` : \"\"}\n {statusLabel(status)}\n </span>\n <h3 className=\"brd-card__title\">{title}</h3>\n <div className=\"brd-card__meta\">\n {meta.slice(0, 2).map((m, i) => (\n <div key={i} className=\"brd-card__meta-row\" title={m.title ?? m.text}>\n {m.icon && <m.icon size={14} aria-hidden=\"true\" />}\n <span>{m.text}</span>\n </div>\n ))}\n </div>\n <div className=\"brd-card__foot\">\n <span className=\"min-w-0\">\n <span className=\"brd-card__foot-label\">Approvers</span>\n <AvatarStack people={approvers} size={24} max={4} />\n </span>\n {progress != null && (\n <span className=\"text-right\">\n <span className=\"brd-card__foot-label\">Progress</span>\n <span className=\"brd-card__pct\">{Math.round(progress)}%</span>\n </span>\n )}\n </div>\n </Tag>\n );\n}\n\n/** 4 columns from 1100px, gaps 24 across / 48 down, 28px top padding for the orb. */\nexport function RecordCardGrid({ className = \"\", children }) {\n return <div className={`brd-grid ${className}`}>{children}</div>;\n}\n","import { ArrowUp, ArrowDown } from \"lucide-react\";\n\n/**\n * Table (§4.5) — header 12px uppercase 600 on surface-1; cells 14px with\n * `overflow-wrap: anywhere` so a long email never widens the table.\n *\n * More than five columns ⇒ `table-layout: fixed` with a `<colgroup>` plan\n * (column `width` in %). Every single-line cell truncates with the full\n * value in `title=` — except a column marked `truncate: false` (ids whose\n * distinguishing digits are at the end never truncate, §6).\n *\n * Column: { key, label, width?, render?(row), sub?(row), align?, truncate?, sortable?, title? }\n * A list row carries at most five facts (law 3) — put the rest in `sub`\n * (second 12px faint line inside the cell) or behind a click.\n */\nexport default function Table({\n columns = [],\n rows = [],\n getRowId = (row, i) => row.id ?? i,\n onRowClick,\n sortKey,\n sortDir = \"asc\",\n onSortChange,\n plan,\n empty = null,\n caption,\n className = \"\",\n}) {\n // A column plan is mandatory above five columns and used whenever every\n // column declares a width — fixed layout is what makes truncation possible.\n const usePlan = plan ?? (columns.length > 5 || columns.every((c) => c.width));\n\n const sortBy = (col) => {\n if (!col.sortable || !onSortChange) return;\n const nextDir = sortKey === col.key && sortDir === \"asc\" ? \"desc\" : \"asc\";\n onSortChange(col.key, nextDir);\n };\n\n return (\n <div className=\"overflow-x-auto\">\n <table className={`table ${usePlan ? \"table-plan\" : \"\"} ${className}`}>\n {caption && <caption className=\"sr-only\">{caption}</caption>}\n {usePlan && (\n <colgroup>\n {columns.map((c) => (\n <col key={c.key} style={c.width ? { width: c.width } : undefined} />\n ))}\n </colgroup>\n )}\n <thead>\n <tr>\n {columns.map((c) => {\n const sorted = sortKey === c.key;\n const SortIcon = sortDir === \"asc\" ? ArrowUp : ArrowDown;\n return (\n <th\n key={c.key}\n scope=\"col\"\n className={`th ${c.sortable && onSortChange ? \"th--sortable\" : \"\"} ${c.align === \"right\" ? \"td--num\" : \"\"}`}\n style={!usePlan && c.width ? { width: c.width } : undefined}\n title={c.title ?? c.label}\n aria-sort={sorted ? (sortDir === \"asc\" ? \"ascending\" : \"descending\") : undefined}\n onClick={() => sortBy(c)}\n >\n <span className=\"inline-flex items-center gap-1\">\n {c.label}\n {sorted && <SortIcon size={14} aria-hidden=\"true\" />}\n </span>\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody>\n {rows.length === 0 && empty && (\n <tr>\n <td className=\"td\" colSpan={columns.length}>\n {empty}\n </td>\n </tr>\n )}\n {rows.map((row, i) => {\n const id = getRowId(row, i);\n const clickable = Boolean(onRowClick);\n return (\n <tr\n key={id}\n className={clickable ? \"row-link\" : undefined}\n onClick={clickable ? () => onRowClick(row) : undefined}\n onKeyDown={\n clickable\n ? (e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onRowClick(row);\n }\n }\n : undefined\n }\n tabIndex={clickable ? 0 : undefined}\n >\n {columns.map((c) => {\n const raw = row[c.key];\n const content = c.render ? c.render(row) : raw;\n const sub = c.sub ? c.sub(row) : null;\n const truncate = c.truncate !== false && !c.render;\n const text = typeof raw === \"string\" || typeof raw === \"number\" ? String(raw) : undefined;\n return (\n <td\n key={c.key}\n className={`td ${c.align === \"right\" ? \"td--num\" : \"\"} ${truncate && !sub ? \"td--truncate\" : \"\"}`}\n title={truncate ? text : undefined}\n >\n {sub ? (\n <>\n <span className=\"block truncate\" title={text}>\n {content}\n </span>\n <span className=\"td-sub\" title={typeof sub === \"string\" ? sub : undefined}>\n {sub}\n </span>\n </>\n ) : (\n content\n )}\n </td>\n );\n })}\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n );\n}\n","/**\n * Filter chips (§4.6) — 32px, radius 8, 13/500, 12px between chips. The\n * count rides in a 26px box. Counts come from the FULL set, so a chip\n * always says how many are behind it. Chips FILTER; tabs switch views.\n *\n * <FilterChips\n * options={[{ value: \"all\", label: \"All\", count: 42 }, …]}\n * value={status}\n * onChange={setStatus}\n * />\n */\nexport function FilterChip({ active = false, count, icon: Icon, className = \"\", children, ...rest }) {\n return (\n <button type=\"button\" className={`fchip ${className}`} aria-pressed={active} {...rest}>\n {Icon && <Icon size={14} aria-hidden=\"true\" />}\n <span>{children}</span>\n {count != null && <span className=\"fcount\">{count}</span>}\n </button>\n );\n}\n\nexport default function FilterChips({ options = [], value, onChange, className = \"\" }) {\n return (\n <div className={`flex items-center gap-3 flex-wrap ${className}`} role=\"group\">\n {options.map((o) => (\n <FilterChip\n key={o.value}\n icon={o.icon}\n count={o.count}\n active={value === o.value}\n title={o.title}\n onClick={() => onChange?.(o.value)}\n >\n {o.label}\n </FilterChip>\n ))}\n </div>\n );\n}\n","import { useId } from \"react\";\n\n/**\n * Tabs (§4.7) — a segmented control. Track 4px padding, radius 12,\n * surface-2. Segment 34px, radius 8, 13/500. Active: surface + elev-1 +\n * 600. Badge 20px radius 6. `alert` marks a tab with empty required fields\n * (set only after a submit attempt; it does not pulse).\n *\n * Tabs switch VIEWS; chips filter. They must not look alike.\n *\n * <Tabs\n * tabs={[{ value: \"details\", label: \"Details\" }, { value: \"route\", label: \"Route\", badge: 3 }]}\n * value={tab}\n * onChange={setTab}\n * />\n */\nexport default function Tabs({ tabs = [], value, onChange, className = \"\", \"aria-label\": ariaLabel }) {\n const id = useId();\n const onKey = (e) => {\n const idx = tabs.findIndex((t) => t.value === value);\n if (idx < 0) return;\n let next = -1;\n if (e.key === \"ArrowRight\") next = (idx + 1) % tabs.length;\n if (e.key === \"ArrowLeft\") next = (idx - 1 + tabs.length) % tabs.length;\n if (e.key === \"Home\") next = 0;\n if (e.key === \"End\") next = tabs.length - 1;\n if (next >= 0) {\n e.preventDefault();\n onChange?.(tabs[next].value);\n document.getElementById(`${id}-${tabs[next].value}`)?.focus();\n }\n };\n return (\n <div className={`tabs ${className}`} role=\"tablist\" aria-label={ariaLabel} onKeyDown={onKey}>\n {tabs.map((t) => {\n const selected = t.value === value;\n return (\n <button\n key={t.value}\n id={`${id}-${t.value}`}\n type=\"button\"\n role=\"tab\"\n className=\"tab\"\n aria-selected={selected}\n tabIndex={selected ? 0 : -1}\n title={t.title}\n onClick={() => onChange?.(t.value)}\n >\n {t.icon && <t.icon size={16} aria-hidden=\"true\" />}\n {t.label}\n {t.badge != null && <span className=\"tab-badge\">{t.badge}</span>}\n {t.alert && <span className=\"tab-alert\" aria-label=\"Has empty required fields\" />}\n </button>\n );\n })}\n </div>\n );\n}\n","/**\n * Toolbar button (§4.8) — 32px, radius 8, surface, elev-1, 12/500, icon 16.\n * Icon-only 32×32. Active: primary-container. Grid/list toggles, \"clear\".\n */\nexport default function ToolbarButton({\n icon: Icon,\n active = false,\n iconOnly = false,\n className = \"\",\n children,\n ...rest\n}) {\n return (\n <button\n type=\"button\"\n className={`tbtn ${iconOnly ? \"tbtn--icon\" : \"\"} ${className}`}\n aria-pressed={active}\n aria-label={iconOnly ? rest[\"aria-label\"] ?? rest.title : undefined}\n {...rest}\n >\n {Icon && <Icon size={16} aria-hidden=\"true\" />}\n {!iconOnly && children}\n </button>\n );\n}\n\n/** A group of toolbar toggles, e.g. grid/list. `options`: [{ value, icon, title }]. */\nexport function ToolbarToggle({ options = [], value, onChange, className = \"\" }) {\n return (\n <div className={`inline-flex gap-1 ${className}`} role=\"group\">\n {options.map((o) => (\n <ToolbarButton\n key={o.value}\n icon={o.icon}\n iconOnly\n title={o.title}\n active={value === o.value}\n onClick={() => onChange?.(o.value)}\n />\n ))}\n </div>\n );\n}\n","import { forwardRef, useId } from \"react\";\nimport { Search, ChevronDown, X } from \"lucide-react\";\n\n/**\n * Inputs (§4.9) — 40px, radius 8, line-strong border, surface. Hover: faint\n * border. Focus: primary border + 3px 12% ring. Label 12/600 muted above\n * with 8px gap; hint 12 faint below. Required = primary asterisk.\n * Explanatory copy belongs in `title=` (law 4), not in a hint sentence.\n */\nexport function Label({ htmlFor, required, className = \"\", children }) {\n return (\n <label htmlFor={htmlFor} className={`lbl ${className}`}>\n {children}\n {required && (\n <span className=\"lbl__req\" aria-hidden=\"true\">\n *\n </span>\n )}\n </label>\n );\n}\n\nexport function Hint({ error, id, className = \"\", children }) {\n if (!children) return null;\n return (\n <span id={id} className={`hint ${error ? \"hint--error\" : \"\"} ${className}`}>\n {children}\n </span>\n );\n}\n\nfunction Field({ id, label, required, hint, error, className, children }) {\n return (\n <div className={className}>\n {label && (\n <Label htmlFor={id} required={required}>\n {label}\n </Label>\n )}\n {children}\n <Hint id={`${id}-hint`} error={Boolean(error)}>\n {error || hint}\n </Hint>\n </div>\n );\n}\n\nconst Input = forwardRef(function Input(\n { id, label, required, hint, error, dense = false, icon: Icon, className = \"\", inputClassName = \"\", ...rest },\n ref\n) {\n const autoId = useId();\n const fieldId = id ?? autoId;\n const control = (\n <input\n ref={ref}\n id={fieldId}\n required={required}\n aria-invalid={error ? \"true\" : undefined}\n aria-describedby={hint || error ? `${fieldId}-hint` : undefined}\n className={`inp ${dense ? \"inp--dense\" : \"\"} ${Icon ? \"inp--glyph\" : \"\"} ${inputClassName}`}\n {...rest}\n />\n );\n return (\n <Field id={fieldId} label={label} required={required} hint={hint} error={error} className={className}>\n {Icon ? (\n <div className=\"inp-wrap\">\n <Icon size={16} className=\"inp-glyph\" aria-hidden=\"true\" />\n {control}\n </div>\n ) : (\n control\n )}\n </Field>\n );\n});\n\nexport const Textarea = forwardRef(function Textarea(\n { id, label, required, hint, error, className = \"\", inputClassName = \"\", ...rest },\n ref\n) {\n const autoId = useId();\n const fieldId = id ?? autoId;\n return (\n <Field id={fieldId} label={label} required={required} hint={hint} error={error} className={className}>\n <textarea\n ref={ref}\n id={fieldId}\n required={required}\n aria-invalid={error ? \"true\" : undefined}\n className={`inp ${inputClassName}`}\n {...rest}\n />\n </Field>\n );\n});\n\nexport const Select = forwardRef(function Select(\n { id, label, required, hint, error, dense = false, className = \"\", inputClassName = \"\", children, ...rest },\n ref\n) {\n const autoId = useId();\n const fieldId = id ?? autoId;\n return (\n <Field id={fieldId} label={label} required={required} hint={hint} error={error} className={className}>\n <div className=\"inp-wrap\">\n <select\n ref={ref}\n id={fieldId}\n required={required}\n aria-invalid={error ? \"true\" : undefined}\n className={`inp ${dense ? \"inp--dense\" : \"\"} ${inputClassName}`}\n {...rest}\n >\n {children}\n </select>\n <ChevronDown size={16} className=\"inp-glyph inp-glyph--right\" aria-hidden=\"true\" />\n </div>\n </Field>\n );\n});\n\n/**\n * Search input — 16px glyph at left 12px, surface-1 fill, no border until\n * focus. `onClear` shows an \"×\" control when there is a value.\n */\nexport const SearchInput = forwardRef(function SearchInput(\n { value, onClear, dense = false, className = \"\", placeholder = \"Search\", ...rest },\n ref\n) {\n const hasValue = value != null && String(value).length > 0;\n return (\n <div className={`inp-wrap ${className}`}>\n <Search size={16} className=\"inp-glyph\" aria-hidden=\"true\" />\n <input\n ref={ref}\n type=\"search\"\n value={value}\n placeholder={placeholder}\n aria-label={placeholder}\n className={`inp inp-search inp--glyph ${dense ? \"inp--dense\" : \"\"} ${onClear ? \"inp--glyph-right\" : \"\"}`}\n {...rest}\n />\n {onClear && hasValue && (\n <button\n type=\"button\"\n onClick={onClear}\n title=\"Clear search\"\n aria-label=\"Clear search\"\n className=\"absolute right-2 top-1/2 -translate-y-1/2 grid place-items-center w-6 h-6 rounded-full text-ink-faint hover:text-ink hover:bg-surface-2\"\n >\n <X size={14} aria-hidden=\"true\" />\n </button>\n )}\n </div>\n );\n});\n\nexport function Checkbox({ label, className = \"\", ...rest }) {\n const id = useId();\n return (\n <label htmlFor={rest.id ?? id} className={`inline-flex items-center gap-2 text-sm cursor-pointer ${className}`}>\n <input type=\"checkbox\" id={rest.id ?? id} className=\"checkbox\" {...rest} />\n {label && <span>{label}</span>}\n </label>\n );\n}\n\nexport default Input;\n","import { statusLabel } from \"./status\";\nimport StatusGlyph from \"./StatusGlyph\";\n\n/**\n * Status pill (§4.10) — pastel fill, saturated text, tinted border, 6px dot.\n * Optionally carries the status glyph too, so it survives greyscale (law 5).\n *\n * <StatusChip status=\"approved\" />\n * <StatusChip status=\"sentback\" label=\"Pending\" icon />\n */\nexport function StatusChip({ status = \"draft\", label, icon = false, className = \"\", ...rest }) {\n return (\n <span className={`chip chip--${status} ${className}`} {...rest}>\n {icon && <StatusGlyph status={status} size={14} />}\n {label ?? statusLabel(status)}\n </span>\n );\n}\n\n/**\n * Tag — radius 8, surface-1, hairline, 12/500 muted. Roles, levels, counts.\n */\nexport function Tag({ icon: Icon, className = \"\", children, ...rest }) {\n return (\n <span className={`tag ${className}`} {...rest}>\n {Icon && <Icon size={14} aria-hidden=\"true\" />}\n {children}\n </span>\n );\n}\n\n/**\n * Version chip — like Tag but mono 12/600. Current version takes the\n * primary container.\n */\nexport function VersionChip({ version, current = false, className = \"\", ...rest }) {\n return (\n <span className={`tag vchip ${className}`} data-current={current ? \"true\" : undefined} {...rest}>\n {version}\n </span>\n );\n}\n\nexport default StatusChip;\n","import { Info, CircleAlert, Sparkles } from \"lucide-react\";\n\n/**\n * Notice (§4.11) — radius 8, no border, surface-2 fill. `accent` uses the\n * primary container; `alert` the rejected chip fill. The 20px icon sits on\n * the first line's centre; an optional action is pinned right.\n *\n * <Notice tone=\"alert\" action={<Button size=\"sm\" variant=\"text\">Retry</Button>}>\n * The approver could not be reached.\n * </Notice>\n */\nconst DEFAULT_ICON = { default: Info, accent: Sparkles, alert: CircleAlert };\n\nexport default function Notice({ tone = \"default\", icon, action, className = \"\", children, ...rest }) {\n const Icon = icon ?? DEFAULT_ICON[tone] ?? Info;\n const toneClass = tone === \"default\" ? \"\" : `notice--${tone}`;\n return (\n <div className={`notice ${toneClass} ${className}`} role={tone === \"alert\" ? \"alert\" : \"status\"} {...rest}>\n <Icon size={20} className=\"notice__icon\" aria-hidden=\"true\" />\n <div className=\"notice__text\">{children}</div>\n {action && <div className=\"notice__action\">{action}</div>}\n </div>\n );\n}\n","import { createContext, useContext, useEffect, useState } from \"react\";\n\n/** Directory context — provided by <PersonDirectoryProvider> in Person.jsx. */\nexport const DirectoryContext = createContext(null);\n\nexport function matchPerson(list, { id, email, name }) {\n if (!list) return null;\n const e = email?.toLowerCase();\n const n = name?.trim().toLowerCase();\n return (\n (id != null && list.find((p) => String(p.id) === String(id))) ||\n (e && list.find((p) => p.email?.toLowerCase() === e)) ||\n (n && list.find((p) => p.name?.trim().toLowerCase() === n)) ||\n null\n );\n}\n\n/**\n * Resolve a person from id, email or name against the cached directory\n * (§4.13). Synchronous when the directory is already loaded; otherwise\n * triggers the one shared request and resolves when it lands.\n */\nexport function usePerson({ id, email, name }) {\n const ctx = useContext(DirectoryContext);\n const direct = matchPerson(ctx?.list, { id, email, name });\n const [loaded, setLoaded] = useState(null);\n\n useEffect(() => {\n if (direct || !ctx) return undefined;\n let alive = true;\n ctx.ensure().then((l) => {\n if (alive) setLoaded(matchPerson(l, { id, email, name }));\n });\n return () => {\n alive = false;\n };\n }, [ctx, direct, id, email, name]);\n\n return direct ?? loaded;\n}\n","import { useCallback, useEffect, useId, useLayoutEffect, useMemo, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { Mail, Building2, UserRound, Briefcase } from \"lucide-react\";\nimport Avatar from \"./Avatar\";\nimport { Tag } from \"./Chip\";\nimport { DirectoryContext, usePerson } from \"./usePerson\";\n\n/* ------------------------------------------------------------------ */\n/* Directory */\n/* ------------------------------------------------------------------ */\n\n/**\n * PersonDirectoryProvider — ONE cached directory request for the whole app.\n * Pass `people` (an array) or `load` (a function returning a promise of an\n * array). Person shape:\n * { id, name, email, designation, department, reportsTo, role, status, photo }\n */\nexport function PersonDirectoryProvider({ people, load, children }) {\n const [loaded, setLoaded] = useState(null);\n const pending = useRef(null);\n const list = people ?? loaded;\n\n const ensure = useCallback(() => {\n if (list) return Promise.resolve(list);\n if (!load) return Promise.resolve([]);\n if (!pending.current) {\n pending.current = Promise.resolve(load()).then((l) => {\n setLoaded(l);\n return l;\n });\n }\n return pending.current;\n }, [list, load]);\n\n const value = useMemo(() => ({ list, ensure }), [list, ensure]);\n return <DirectoryContext.Provider value={value}>{children}</DirectoryContext.Provider>;\n}\n\n/* ------------------------------------------------------------------ */\n/* Contact card */\n/* ------------------------------------------------------------------ */\n\nconst CARD_W = 300;\nconst GAP = 8;\n\nfunction ContactCard({ person, anchorRef, id }) {\n const ref = useRef(null);\n const [pos, setPos] = useState({ top: -9999, left: -9999 });\n\n useLayoutEffect(() => {\n const anchor = anchorRef.current;\n if (!anchor || !ref.current) return;\n const a = anchor.getBoundingClientRect();\n const h = ref.current.offsetHeight;\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n let top = a.bottom + GAP;\n if (top + h > vh - 12) top = Math.max(12, a.top - GAP - h); // flip above\n let left = a.left;\n if (left + CARD_W > vw - 12) left = Math.max(12, vw - 12 - CARD_W);\n setPos({ top, left });\n }, [anchorRef, person]);\n\n const inactive = person.status && person.status.toLowerCase() !== \"active\";\n\n return createPortal(\n <div ref={ref} id={id} role=\"dialog\" aria-label={person.name} className=\"person-card\" style={pos}>\n <div className=\"person-card__head\">\n <Avatar name={person.name} photo={person.photo} size={48} />\n <div className=\"min-w-0 flex-1\">\n <div className=\"person-card__name\">{person.name}</div>\n {person.designation && <div className=\"person-card__desig\">{person.designation}</div>}\n </div>\n {inactive && <Tag>{person.status}</Tag>}\n </div>\n <div className=\"person-card__body\">\n {person.email && (\n <div className=\"person-card__row\">\n <Mail size={16} aria-hidden=\"true\" />\n <a href={`mailto:${person.email}`}>{person.email}</a>\n </div>\n )}\n {person.department && (\n <div className=\"person-card__row\">\n <Building2 size={16} aria-hidden=\"true\" />\n <span>{person.department}</span>\n </div>\n )}\n {person.reportsTo && (\n <div className=\"person-card__row\">\n <UserRound size={16} aria-hidden=\"true\" />\n <span>Reports to {person.reportsTo}</span>\n </div>\n )}\n {person.role && (\n <div className=\"person-card__row\">\n <Briefcase size={16} aria-hidden=\"true\" />\n <span>{person.role}</span>\n </div>\n )}\n </div>\n </div>,\n document.body\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Person trigger */\n/* ------------------------------------------------------------------ */\n\nconst OPEN_DELAY = 350;\nconst CLOSE_DELAY = 180;\n\n/**\n * Person (§4.13, law 12) — any rendered person is a trigger. Hover 350ms in\n * / 180ms out, focus opens immediately, Esc closes. Resolves from `id`,\n * `email` or `name` against the directory; `person` can be passed directly.\n *\n * `hoverOnly` — use when the Person sits inside a <button>: renders a\n * <span> with no second focusable.\n *\n * <Person email=\"a.sharma@indiraivf.com\" />\n * <Person name=\"Asha Sharma\" size={40} sub=\"Finance\" />\n */\nexport default function Person({\n id,\n email,\n name,\n person: given,\n size = 32,\n sub,\n showEmail = false,\n avatarOnly = false,\n hoverOnly = false,\n className = \"\",\n}) {\n const resolved = usePerson({ id, email, name });\n const person = given ?? resolved ?? (name || email ? { name: name ?? email, email } : null);\n const [open, setOpen] = useState(false);\n const anchorRef = useRef(null);\n const timer = useRef(null);\n const cardId = useId();\n\n const clear = () => {\n if (timer.current) clearTimeout(timer.current);\n timer.current = null;\n };\n const openLater = () => {\n clear();\n timer.current = setTimeout(() => setOpen(true), OPEN_DELAY);\n };\n const closeLater = () => {\n clear();\n timer.current = setTimeout(() => setOpen(false), CLOSE_DELAY);\n };\n const openNow = () => {\n clear();\n setOpen(true);\n };\n const closeNow = () => {\n clear();\n setOpen(false);\n };\n\n useEffect(() => () => timer.current && clearTimeout(timer.current), []);\n\n useEffect(() => {\n if (!open) return undefined;\n const onKey = (e) => e.key === \"Escape\" && setOpen(false);\n const onScroll = () => setOpen(false);\n window.addEventListener(\"keydown\", onKey);\n window.addEventListener(\"scroll\", onScroll, true);\n return () => {\n window.removeEventListener(\"keydown\", onKey);\n window.removeEventListener(\"scroll\", onScroll, true);\n };\n }, [open]);\n\n if (!person) return null;\n\n const display = showEmail ? person.email ?? person.name : person.name;\n\n const inner = (\n <>\n <Avatar name={person.name} photo={person.photo} size={size} />\n {!avatarOnly && (\n <span className=\"min-w-0\">\n <span className=\"person__name block\">{display}</span>\n {sub && <span className=\"person__sub\">{sub}</span>}\n </span>\n )}\n </>\n );\n\n return (\n <>\n {hoverOnly ? (\n <span\n ref={anchorRef}\n className={`person ${className}`}\n onMouseEnter={openLater}\n onMouseLeave={closeLater}\n aria-describedby={open ? cardId : undefined}\n title={person.email}\n >\n {inner}\n </span>\n ) : (\n <button\n ref={anchorRef}\n type=\"button\"\n className={`person ${className}`}\n onMouseEnter={openLater}\n onMouseLeave={closeLater}\n onFocus={openNow}\n onBlur={closeNow}\n aria-describedby={open ? cardId : undefined}\n >\n {inner}\n </button>\n )}\n {open && <ContactCard person={person} anchorRef={anchorRef} id={cardId} />}\n </>\n );\n}\n","import { Check, X } from \"lucide-react\";\n\n/**\n * Stepper (§4.14) — the approval route. Stamp: 40px circle, 2px border.\n * Four states, each a SHAPE as well as a colour so it survives a greyscale\n * print: done = primary fill + check; current = primary-container + 4px\n * ring; rejected = rejected chip + cross; waiting = surface + line-strong.\n * No pulsing.\n *\n * Pipelines show the EMAIL, not the name (law 12) — pass it as `sub`.\n *\n * <Stepper\n * orientation=\"vertical\"\n * steps={[\n * { label: \"Level 1 · HOD\", sub: \"r.mehta@indiraivf.com\", state: \"done\" },\n * { label: \"Level 2 · Finance\", sub: \"a.sharma@indiraivf.com\", state: \"current\" },\n * { label: \"Level 3 · CFO\", sub: \"cfo@indiraivf.com\", state: \"waiting\" },\n * ]}\n * />\n */\nexport default function Stepper({ steps = [], orientation = \"horizontal\", className = \"\" }) {\n const v = orientation === \"vertical\";\n return (\n <ol className={`stepper ${v ? \"stepper--v\" : \"stepper--h\"} ${className}`}>\n {steps.map((s, i) => {\n const state = s.state ?? \"waiting\";\n return (\n <li key={s.id ?? i} className=\"step\" data-state={state} aria-current={state === \"current\" ? \"step\" : undefined}>\n <span className=\"stamp\" aria-hidden=\"true\">\n {state === \"done\" ? <Check size={18} /> : state === \"rejected\" ? <X size={18} /> : i + 1}\n </span>\n <span className=\"sr-only\">{state}</span>\n <div className=\"step__body\">\n <div className=\"step__title\" title={s.label}>\n {s.label}\n </div>\n {s.sub && (\n <div className=\"step__sub\" title={s.sub}>\n {s.sub}\n </div>\n )}\n {v && s.children}\n </div>\n </li>\n );\n })}\n </ol>\n );\n}\n","let lockCount = 0;\n\n/** Lock body scroll beneath an overlay; returns the unlock function. */\nexport function lockBodyScroll() {\n lockCount += 1;\n document.body.style.overflow = \"hidden\";\n return () => {\n lockCount = Math.max(0, lockCount - 1);\n if (lockCount === 0) document.body.style.overflow = \"\";\n };\n}\n","import { useEffect, useId, useRef } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { X } from \"lucide-react\";\nimport Button from \"./Button\";\nimport { lockBodyScroll } from \"./scroll-lock\";\n\nconst FOCUSABLE =\n 'a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n\n/**\n * Dialog (§4.15, law 13) — scrim black/30, panel surface radius 12 elev-3,\n * max-height calc(100vh - 48px). Flex column: header and footer fixed, ONLY\n * the body scrolls. Focus trapped, returned to the invoker on close, Esc\n * closes. Sizes 480 / 640 / 960.\n *\n * <Dialog open={open} onClose={…} title=\"Reject BRD-2026-0142\" size={480}\n * footer={<><Button variant=\"text\">Cancel</Button><Button variant=\"reject\">Reject</Button></>}>\n * …\n * </Dialog>\n */\nexport default function Dialog({ open, onClose, title, size = 640, footer, children, className = \"\" }) {\n const panel = useRef(null);\n const invoker = useRef(null);\n const titleId = useId();\n\n useEffect(() => {\n if (!open) return undefined;\n invoker.current = document.activeElement;\n const unlock = lockBodyScroll();\n const first = panel.current?.querySelector(FOCUSABLE);\n (first ?? panel.current)?.focus();\n\n const onKey = (e) => {\n if (e.key === \"Escape\") {\n e.stopPropagation();\n onClose?.();\n return;\n }\n if (e.key !== \"Tab\" || !panel.current) return;\n const nodes = Array.from(panel.current.querySelectorAll(FOCUSABLE));\n if (nodes.length === 0) {\n e.preventDefault();\n return;\n }\n const firstNode = nodes[0];\n const lastNode = nodes[nodes.length - 1];\n if (e.shiftKey && document.activeElement === firstNode) {\n e.preventDefault();\n lastNode.focus();\n } else if (!e.shiftKey && document.activeElement === lastNode) {\n e.preventDefault();\n firstNode.focus();\n }\n };\n document.addEventListener(\"keydown\", onKey);\n return () => {\n document.removeEventListener(\"keydown\", onKey);\n unlock();\n if (invoker.current && typeof invoker.current.focus === \"function\") invoker.current.focus();\n };\n }, [open, onClose]);\n\n if (!open) return null;\n\n return createPortal(\n <div className=\"modal-scrim\" onMouseDown={(e) => e.target === e.currentTarget && onClose?.()}>\n <div\n ref={panel}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={title ? titleId : undefined}\n tabIndex={-1}\n className={`modal modal--${size} ${className}`}\n >\n <header className=\"modal__h\">\n <h2 id={titleId} className=\"modal__title truncate\">\n {title}\n </h2>\n <Button variant=\"text\" size=\"sm\" iconOnly icon={X} title=\"Close\" onClick={onClose} />\n </header>\n <div className=\"modal__b\">{children}</div>\n {footer && <footer className=\"modal__f\">{footer}</footer>}\n </div>\n </div>,\n document.body\n );\n}\n","import { useEffect } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { Minimize2 } from \"lucide-react\";\nimport Button from \"./Button\";\nimport { lockBodyScroll } from \"./scroll-lock\";\n\n/**\n * Full-screen document (§4.16) — fixed inset-0, canvas fill, page 920px\n * centred, one pill \"Exit\" control fixed top-right. Esc closes. Body\n * scroll locked beneath. Content renders in the document serif (`.doc`).\n */\nexport default function DocFull({ open, onClose, children, label = \"Document\" }) {\n useEffect(() => {\n if (!open) return undefined;\n const unlock = lockBodyScroll();\n const onKey = (e) => e.key === \"Escape\" && onClose?.();\n document.addEventListener(\"keydown\", onKey);\n return () => {\n document.removeEventListener(\"keydown\", onKey);\n unlock();\n };\n }, [open, onClose]);\n\n if (!open) return null;\n\n return createPortal(\n <div className=\"doc-full\" role=\"dialog\" aria-modal=\"true\" aria-label={label}>\n <Button variant=\"outlined\" icon={Minimize2} className=\"doc-full__exit\" onClick={onClose}>\n Exit\n </Button>\n <div className=\"doc-full__page doc\">{children}</div>\n </div>,\n document.body\n );\n}\n","/**\n * Skeleton (§4.17) — rounded bars in surface-2, in the SHAPE of the content\n * so nothing reflows when data lands. Never a spinner for content (law 10).\n * Nothing pulses (law 11).\n */\nexport default function Skeleton({ w = \"100%\", h = 12, circle = false, className = \"\", style, ...rest }) {\n return (\n <span\n className={`skel ${circle ? \"skel--circle\" : \"\"} ${className}`}\n style={{ width: w, height: h, ...style }}\n aria-hidden=\"true\"\n {...rest}\n />\n );\n}\n\n/** A record-card skeleton: orb, two title lines, meta, a rule, a footer. */\nexport function RecordCardSkeleton() {\n return (\n <div className=\"brd-card\" aria-hidden=\"true\">\n <span className=\"brd-card__orb\" style={{ background: \"rgb(var(--c-surface-3))\", boxShadow: \"none\" }} />\n <Skeleton h={16} w=\"88%\" />\n <Skeleton h={16} w=\"64%\" className=\"mt-2\" />\n <div className=\"brd-card__meta\">\n <div className=\"brd-card__meta-row\">\n <Skeleton h={12} w=\"56%\" />\n </div>\n <div className=\"brd-card__meta-row\">\n <Skeleton h={12} w=\"44%\" />\n </div>\n </div>\n <div className=\"brd-card__foot\">\n <span className=\"flex items-center gap-1\">\n <Skeleton circle w={24} h={24} />\n <Skeleton circle w={24} h={24} />\n <Skeleton circle w={24} h={24} />\n </span>\n <Skeleton h={14} w={40} />\n </div>\n </div>\n );\n}\n\n/** A table skeleton with the given column count and row count. */\nexport function TableSkeleton({ columns = 5, rows = 6 }) {\n return (\n <table className=\"table table-plan\" aria-hidden=\"true\">\n <thead>\n <tr>\n {Array.from({ length: columns }, (_, i) => (\n <th key={i} className=\"th\">\n <Skeleton h={10} w=\"60%\" />\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {Array.from({ length: rows }, (_, r) => (\n <tr key={r}>\n {Array.from({ length: columns }, (_, c) => (\n <td key={c} className=\"td\">\n <Skeleton h={12} w={c === 0 ? \"80%\" : \"50%\"} />\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n );\n}\n\n/** A stat-tile skeleton. */\nexport function StatTileSkeleton() {\n return (\n <div className=\"stat-tile\" aria-hidden=\"true\">\n <Skeleton w={44} h={44} style={{ borderRadius: 8 }} />\n <span className=\"min-w-0 flex-1\">\n <Skeleton h={24} w={56} />\n <Skeleton h={12} w=\"60%\" className=\"mt-2\" />\n </span>\n </div>\n );\n}\n","import { Inbox } from \"lucide-react\";\n\n/**\n * Empty state (§4.18) — 48px surface-1 icon well, 14/500 title, one 14 muted\n * line (max 46ch), one tonal small button. Never a paragraph.\n */\nexport default function EmptyState({ icon: Icon = Inbox, title, line, action, className = \"\" }) {\n return (\n <div className={`empty ${className}`}>\n <span className=\"empty__well\">\n <Icon size={20} aria-hidden=\"true\" />\n </span>\n {title && <p className=\"empty__title\">{title}</p>}\n {line && <p className=\"empty__line\">{line}</p>}\n {action && <div className=\"mt-2\">{action}</div>}\n </div>\n );\n}\n","import { createContext, useContext } from \"react\";\n\nexport const ToastContext = createContext(null);\n\n/**\n * useToast — returns the `toast` function.\n * toast(\"Saved\");\n * toast({ message: \"Could not save\", tone: \"error\", duration: 6000 });\n */\nexport function useToast() {\n const ctx = useContext(ToastContext);\n if (!ctx) throw new Error(\"useToast must be used inside <ToastProvider>\");\n return ctx.toast;\n}\n\n/** Programmatic dismiss of the current toast. */\nexport function useToastDismiss() {\n const ctx = useContext(ToastContext);\n if (!ctx) throw new Error(\"useToastDismiss must be used inside <ToastProvider>\");\n return ctx.dismiss;\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { X, CircleCheck, CircleAlert } from \"lucide-react\";\nimport { ToastContext } from \"./toast-context\";\n\n/**\n * Toast (§4.19) — bottom-centre, elev-2, 14px, auto-dismiss. One at a\n * time: a new toast replaces the current one. Error variant uses the\n * rejected chip colours. Read it with `useToast()` from toast-context.\n */\nexport function ToastProvider({ children, duration = 4000 }) {\n const [current, setCurrent] = useState(null);\n const timer = useRef(null);\n\n const dismiss = useCallback(() => {\n if (timer.current) clearTimeout(timer.current);\n timer.current = null;\n setCurrent(null);\n }, []);\n\n const toast = useCallback(\n (input) => {\n const t = typeof input === \"string\" ? { message: input } : input;\n if (timer.current) clearTimeout(timer.current);\n setCurrent({ tone: \"default\", ...t, key: Date.now() });\n timer.current = setTimeout(() => setCurrent(null), t.duration ?? duration);\n },\n [duration]\n );\n\n useEffect(() => () => timer.current && clearTimeout(timer.current), []);\n\n const value = useMemo(() => ({ toast, dismiss }), [toast, dismiss]);\n\n return (\n <ToastContext.Provider value={value}>\n {children}\n {current &&\n createPortal(\n <div\n key={current.key}\n className={`toast ${current.tone === \"error\" ? \"toast--error\" : \"\"}`}\n role={current.tone === \"error\" ? \"alert\" : \"status\"}\n >\n {current.tone === \"error\" ? (\n <CircleAlert size={18} aria-hidden=\"true\" />\n ) : (\n <CircleCheck size={18} aria-hidden=\"true\" />\n )}\n <span className=\"toast__text\" title={current.message}>\n {current.message}\n </span>\n {current.action}\n <button type=\"button\" className=\"toast__close\" onClick={dismiss} aria-label=\"Dismiss\">\n <X size={16} aria-hidden=\"true\" />\n </button>\n </div>,\n document.body\n )}\n </ToastContext.Provider>\n );\n}\n\nexport default ToastProvider;\n","import { useCallback, useEffect, useState } from \"react\";\n\nconst KEY = \"iw-theme\";\nconst MQ = \"(prefers-color-scheme: dark)\";\n\nfunction readStored() {\n try {\n const v = localStorage.getItem(KEY);\n return v === \"dark\" || v === \"light\" ? v : \"system\";\n } catch {\n return \"system\";\n }\n}\n\nfunction systemPrefersDark() {\n return typeof window !== \"undefined\" && window.matchMedia?.(MQ).matches === true;\n}\n\n/**\n * Theme — `[data-theme='dark'|'light']` on the root; \"system\" follows\n * `prefers-color-scheme` (§1.2). Persisted per browser.\n *\n * const { theme, resolved, setTheme, toggle } = useTheme();\n */\nexport function useTheme() {\n const [theme, setTheme] = useState(readStored);\n const [systemDark, setSystemDark] = useState(systemPrefersDark);\n const resolved = theme === \"system\" ? (systemDark ? \"dark\" : \"light\") : theme;\n\n // Sync the root attribute and storage with the chosen theme.\n useEffect(() => {\n const root = document.documentElement;\n if (theme === \"system\") root.removeAttribute(\"data-theme\");\n else root.setAttribute(\"data-theme\", theme);\n try {\n if (theme === \"system\") localStorage.removeItem(KEY);\n else localStorage.setItem(KEY, theme);\n } catch {\n /* storage unavailable */\n }\n }, [theme]);\n\n // Subscribe to the OS preference.\n useEffect(() => {\n const mq = window.matchMedia?.(MQ);\n if (!mq) return undefined;\n const onChange = (e) => setSystemDark(e.matches);\n mq.addEventListener(\"change\", onChange);\n return () => mq.removeEventListener(\"change\", onChange);\n }, []);\n\n const toggle = useCallback(() => {\n setTheme((t) => {\n const current = t === \"system\" ? (systemPrefersDark() ? \"dark\" : \"light\") : t;\n return current === \"dark\" ? \"light\" : \"dark\";\n });\n }, []);\n\n return { theme, resolved, setTheme, toggle };\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport { Bell, ChevronDown, ChevronLeft, ChevronRight, LogOut, Moon, Sun } from \"lucide-react\";\nimport Avatar from \"./Avatar\";\nimport { SearchInput } from \"./Input\";\nimport { useTheme } from \"./theme\";\n\nconst RAIL_BREAKPOINT = 1000;\n\nfunction greetingFor(date = new Date()) {\n const h = date.getHours();\n if (h < 12) return \"Good morning,\";\n if (h < 17) return \"Good afternoon,\";\n return \"Good evening,\";\n}\n\n/**\n * Shell (§3) — the sidebar and header are regions of ONE white surface,\n * so neither carries a border. The content panel is the only thing with\n * an edge: canvas grey with a 24px top-left radius curving into the\n * corner where sidebar meets header. That single curve makes the \"L\".\n *\n * Props\n * brand { mark, name }\n * nav [{ id, label, icon, count, title } | \"gap\"] — \"gap\" = 12px group separator\n * activeId, onNavigate(id)\n * user { name, role, email, photo }\n * search { value, onChange, onClear, placeholder }\n * notifications number (bell badge)\n * onSignOut, onBell, onUserMenu? (menu items: [{ label, icon, onClick }])\n * rail / onRailChange — controlled rail; below 1000px the rail is forced.\n * Header hides when railed (focus mode). Double-tap space toggles full screen.\n */\nexport default function Shell({\n brand = { mark: \"IW\", name: \"Indira Workspace\" },\n nav = [],\n activeId,\n onNavigate,\n user,\n search,\n notifications = 0,\n onBell,\n onSignOut,\n userMenu = [],\n rail: railProp,\n onRailChange,\n children,\n}) {\n const [railState, setRailState] = useState(false);\n const [forced, setForced] = useState(() => window.innerWidth < RAIL_BREAKPOINT);\n const rail = forced || (railProp ?? railState);\n const setRail = (v) => {\n if (onRailChange) onRailChange(v);\n else setRailState(v);\n };\n\n const [menuOpen, setMenuOpen] = useState(false);\n const menuRef = useRef(null);\n const { resolved, toggle } = useTheme();\n\n // Below 1000px the rail is forced.\n useEffect(() => {\n const mq = window.matchMedia(`(max-width: ${RAIL_BREAKPOINT - 1}px)`);\n const on = () => setForced(mq.matches);\n on();\n mq.addEventListener(\"change\", on);\n return () => mq.removeEventListener(\"change\", on);\n }, []);\n\n // Double-tap of the space bar outside any field toggles browser full screen.\n useEffect(() => {\n let last = 0;\n const onKey = (e) => {\n if (e.key !== \" \" || e.repeat) return;\n const t = e.target;\n const tag = t?.tagName;\n if (tag === \"INPUT\" || tag === \"TEXTAREA\" || tag === \"SELECT\" || tag === \"BUTTON\" || tag === \"A\" || t?.isContentEditable) return;\n const now = Date.now();\n if (now - last < 350) {\n e.preventDefault();\n if (document.fullscreenElement) document.exitFullscreen?.();\n else document.documentElement.requestFullscreen?.();\n last = 0;\n } else last = now;\n };\n window.addEventListener(\"keydown\", onKey);\n return () => window.removeEventListener(\"keydown\", onKey);\n }, []);\n\n // Close the user menu on outside click / Esc.\n useEffect(() => {\n if (!menuOpen) return undefined;\n const onDown = (e) => !menuRef.current?.contains(e.target) && setMenuOpen(false);\n const onKey = (e) => e.key === \"Escape\" && setMenuOpen(false);\n document.addEventListener(\"mousedown\", onDown);\n document.addEventListener(\"keydown\", onKey);\n return () => {\n document.removeEventListener(\"mousedown\", onDown);\n document.removeEventListener(\"keydown\", onKey);\n };\n }, [menuOpen]);\n\n const ThemeIcon = resolved === \"dark\" ? Sun : Moon;\n\n return (\n <div className=\"shell\" data-rail={rail ? \"true\" : \"false\"}>\n <aside className=\"shell__sidebar\">\n <div className=\"shell__brand\" title={brand.name}>\n <span className=\"shell__brand-mark\" aria-hidden=\"true\">\n {brand.mark}\n </span>\n <span className=\"shell__brand-name\">{brand.name}</span>\n </div>\n\n {!forced && (\n <button\n type=\"button\"\n className=\"shell__collapse\"\n onClick={() => setRail(!rail)}\n title={rail ? \"Expand navigation\" : \"Collapse navigation\"}\n aria-label={rail ? \"Expand navigation\" : \"Collapse navigation\"}\n aria-expanded={!rail}\n >\n {rail ? <ChevronRight size={16} /> : <ChevronLeft size={16} />}\n </button>\n )}\n\n <nav className=\"shell__nav\" aria-label=\"Primary\">\n {nav.map((item, i) =>\n item === \"gap\" ? (\n <span key={`gap-${i}`} className=\"shell__nav-gap\" aria-hidden=\"true\" />\n ) : (\n <NavItem\n key={item.id}\n icon={item.icon}\n label={item.label}\n count={item.count}\n title={item.title}\n active={item.id === activeId}\n onClick={() => onNavigate?.(item.id)}\n />\n )\n )}\n </nav>\n\n <div className=\"shell__foot\">\n <NavItem icon={ThemeIcon} label={resolved === \"dark\" ? \"Light theme\" : \"Dark theme\"} onClick={toggle} />\n {onSignOut && <NavItem icon={LogOut} label=\"Sign out\" onClick={onSignOut} />}\n </div>\n </aside>\n\n <div className=\"shell__main\">\n <header className=\"shell__header\">\n {user && (\n <div className=\"shell__greeting\">\n <div className=\"shell__greeting-hi\">{greetingFor()}</div>\n <div className=\"shell__greeting-name\">{user.name}</div>\n </div>\n )}\n\n {search && (\n <SearchInput\n className=\"shell__search\"\n value={search.value ?? \"\"}\n onChange={search.onChange}\n onClear={search.onClear}\n placeholder={search.placeholder ?? \"Search\"}\n />\n )}\n\n <button type=\"button\" className=\"btn btn--text btn--icon bell\" onClick={onBell} title=\"Notifications\" aria-label={`Notifications${notifications ? `, ${notifications} unread` : \"\"}`}>\n <Bell size={20} aria-hidden=\"true\" />\n {notifications > 0 && <span className=\"bell__badge\">{notifications > 99 ? \"99+\" : notifications}</span>}\n </button>\n\n {user && (\n <div className=\"relative\" ref={menuRef}>\n <button\n type=\"button\"\n className=\"user-pill\"\n onClick={() => setMenuOpen((o) => !o)}\n aria-haspopup=\"menu\"\n aria-expanded={menuOpen}\n title={user.email}\n >\n <Avatar name={user.name} photo={user.photo} size={40} />\n <span className=\"min-w-0\">\n <span className=\"user-pill__name block truncate\">{user.name}</span>\n {user.role && <span className=\"user-pill__role block truncate\">{user.role}</span>}\n </span>\n <ChevronDown size={16} className=\"text-ink-faint\" aria-hidden=\"true\" />\n </button>\n {menuOpen && (\n <div className=\"menu\" role=\"menu\">\n {userMenu.map((m) => (\n <button\n key={m.label}\n type=\"button\"\n role=\"menuitem\"\n className=\"menu__item\"\n onClick={() => {\n setMenuOpen(false);\n m.onClick?.();\n }}\n >\n {m.icon && <m.icon size={16} aria-hidden=\"true\" />}\n {m.label}\n </button>\n ))}\n {onSignOut && (\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"menu__item\"\n onClick={() => {\n setMenuOpen(false);\n onSignOut();\n }}\n >\n <LogOut size={16} aria-hidden=\"true\" />\n Sign out\n </button>\n )}\n </div>\n )}\n </div>\n )}\n </header>\n\n <main className=\"shell__content\">{children}</main>\n </div>\n </div>\n );\n}\n\n/** Nav item — 48px, 14/500, icon 20, radius 12. Active: solid primary. */\nexport function NavItem({ icon: Icon, label, count, active = false, title, ...rest }) {\n return (\n <button type=\"button\" className=\"nav-item\" aria-current={active ? \"page\" : undefined} title={title ?? label} {...rest}>\n {Icon && <Icon size={20} aria-hidden=\"true\" />}\n <span className=\"nav-item__label\">{label}</span>\n {count != null && <span className=\"nav-item__count\">{count}</span>}\n </button>\n );\n}\n\n/**\n * Toolbar (law 2) — the top of the content panel is a toolbar, not a title:\n * filters left, view controls and the ONE primary action right.\n */\nexport function Toolbar({ left, right, className = \"\" }) {\n return (\n <div className={`toolbar ${className}`}>\n <div className=\"toolbar__left\">{left}</div>\n <div className=\"toolbar__right\">{right}</div>\n </div>\n );\n}\n"],"mappings":"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"}