@orbitlabsui/ui 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +35 -0
- package/dist/index.d.ts +72 -1
- package/dist/index.js +395 -3
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -56,6 +56,41 @@ import { Button, ThemeToggle } from '@orbitlabsui/ui';
|
|
|
56
56
|
<ThemeToggle />
|
|
57
57
|
```
|
|
58
58
|
|
|
59
|
+
### DataTable
|
|
60
|
+
|
|
61
|
+
```tsx
|
|
62
|
+
import { DataTable, type ColumnDef } from '@orbitlabsui/ui';
|
|
63
|
+
|
|
64
|
+
interface Row { id: string; name: string; status: string }
|
|
65
|
+
const columns: ColumnDef<Row>[] = [
|
|
66
|
+
{ key: 'name', title: 'Name', sortable: true },
|
|
67
|
+
{ key: 'status', title: 'Status' },
|
|
68
|
+
];
|
|
69
|
+
|
|
70
|
+
<DataTable<Row>
|
|
71
|
+
data={rows}
|
|
72
|
+
columns={columns}
|
|
73
|
+
searchValue={q}
|
|
74
|
+
onSearchChange={setQ}
|
|
75
|
+
emptyMessage="No rows yet."
|
|
76
|
+
/>
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### Breadcrumbs (router-agnostic)
|
|
80
|
+
|
|
81
|
+
```tsx
|
|
82
|
+
import { Breadcrumbs } from '@orbitlabsui/ui';
|
|
83
|
+
|
|
84
|
+
// Plain links (default <a href>):
|
|
85
|
+
<Breadcrumbs items={[{ label: 'Home', href: '/' }, { label: 'Current' }]} />
|
|
86
|
+
|
|
87
|
+
// With a router (e.g. react-router) — inject via renderLink:
|
|
88
|
+
<Breadcrumbs
|
|
89
|
+
items={crumbs}
|
|
90
|
+
renderLink={(item, children) => <Link to={item.href!}>{children}</Link>}
|
|
91
|
+
/>
|
|
92
|
+
```
|
|
93
|
+
|
|
59
94
|
## Theming
|
|
60
95
|
|
|
61
96
|
Dark mode is class-based (`<html class="dark">`), driven by `ThemeProvider` /
|
package/dist/index.d.ts
CHANGED
|
@@ -413,6 +413,77 @@ interface ComboboxProps {
|
|
|
413
413
|
*/
|
|
414
414
|
declare function Combobox({ label, placeholder, options, value, onChange, error, helperText, disabled, className }: ComboboxProps): React.JSX.Element;
|
|
415
415
|
|
|
416
|
+
interface FilterOption {
|
|
417
|
+
id: string;
|
|
418
|
+
label: string;
|
|
419
|
+
/** Hex color for the colored dot marker, e.g. "#16A34A". Optional if `avatar` is provided. */
|
|
420
|
+
dotColor?: string;
|
|
421
|
+
/** Initials to render as a small avatar marker instead of a dot, e.g. "AB". */
|
|
422
|
+
avatar?: string;
|
|
423
|
+
}
|
|
424
|
+
interface FiltersProps {
|
|
425
|
+
options: FilterOption[];
|
|
426
|
+
selectedIds: string[];
|
|
427
|
+
onChange: (selectedIds: string[]) => void;
|
|
428
|
+
label?: string;
|
|
429
|
+
searchable?: boolean;
|
|
430
|
+
searchPlaceholder?: string;
|
|
431
|
+
}
|
|
432
|
+
declare function Filters({ options, selectedIds, onChange, label, searchable, searchPlaceholder }: FiltersProps): React.JSX.Element;
|
|
433
|
+
|
|
434
|
+
interface ColumnDef<T> {
|
|
435
|
+
key: string;
|
|
436
|
+
title: string;
|
|
437
|
+
sortable?: boolean;
|
|
438
|
+
render?: (item: T) => React.ReactNode;
|
|
439
|
+
}
|
|
440
|
+
interface DataTableProps<T extends {
|
|
441
|
+
id: string | number;
|
|
442
|
+
}> {
|
|
443
|
+
data: T[];
|
|
444
|
+
columns: ColumnDef<T>[];
|
|
445
|
+
searchValue?: string;
|
|
446
|
+
onSearchChange?: (val: string) => void;
|
|
447
|
+
searchPlaceholder?: string;
|
|
448
|
+
filterOptions?: FilterOption[];
|
|
449
|
+
selectedFilters?: string[];
|
|
450
|
+
onFilterChange?: (ids: string[]) => void;
|
|
451
|
+
filterLabel?: string;
|
|
452
|
+
onClearFilters?: () => void;
|
|
453
|
+
/** Additional filter controls rendered next to the primary filter. */
|
|
454
|
+
extraFilters?: React.ReactNode;
|
|
455
|
+
/** Filter rendered first in the filters row (e.g. a project filter). */
|
|
456
|
+
leadingFilter?: React.ReactNode;
|
|
457
|
+
sortKey?: string;
|
|
458
|
+
sortDirection?: 'asc' | 'desc';
|
|
459
|
+
onSortChange?: (key: string, dir: 'asc' | 'desc') => void;
|
|
460
|
+
isGroupRow?: (item: T) => boolean;
|
|
461
|
+
renderGroupRow?: (item: T) => React.ReactNode;
|
|
462
|
+
/** Called when a (non-group) row is clicked. Makes rows interactive. */
|
|
463
|
+
onRowClick?: (item: T) => void;
|
|
464
|
+
/** Trailing per-row actions (e.g. <RowActions>), revealed on row hover. */
|
|
465
|
+
rowActions?: (item: T) => React.ReactNode;
|
|
466
|
+
emptyMessage?: string;
|
|
467
|
+
resultsCount?: React.ReactNode;
|
|
468
|
+
toolbarActions?: React.ReactNode;
|
|
469
|
+
}
|
|
470
|
+
declare function DataTable<T extends {
|
|
471
|
+
id: string | number;
|
|
472
|
+
}>({ data, columns, searchValue, onSearchChange, searchPlaceholder, filterOptions, selectedFilters, onFilterChange, filterLabel, onClearFilters, extraFilters, leadingFilter, sortKey, sortDirection, onSortChange, isGroupRow, renderGroupRow, onRowClick, rowActions, emptyMessage, resultsCount, toolbarActions }: DataTableProps<T>): React.JSX.Element;
|
|
473
|
+
|
|
474
|
+
interface Crumb {
|
|
475
|
+
label: string;
|
|
476
|
+
href?: string;
|
|
477
|
+
}
|
|
478
|
+
interface BreadcrumbsProps {
|
|
479
|
+
items: Crumb[];
|
|
480
|
+
className?: string;
|
|
481
|
+
/** Render a navigable (non-final) crumb. Defaults to a plain <a href>. */
|
|
482
|
+
renderLink?: (item: Crumb, children: React.ReactNode) => React.ReactNode;
|
|
483
|
+
}
|
|
484
|
+
/** Path breadcrumb; non-final items with an `href` are links (router-agnostic). */
|
|
485
|
+
declare function Breadcrumbs({ items, className, renderLink }: BreadcrumbsProps): React.JSX.Element;
|
|
486
|
+
|
|
416
487
|
interface UsePopoverOptions {
|
|
417
488
|
open: boolean;
|
|
418
489
|
onOpenChange: (open: boolean) => void;
|
|
@@ -441,4 +512,4 @@ declare function usePopover({ open, onOpenChange, placement, gap, matchWidth, ro
|
|
|
441
512
|
getFloatingProps: UseInteractionsReturn['getFloatingProps'];
|
|
442
513
|
};
|
|
443
514
|
|
|
444
|
-
export { AppToaster, Avatar, Button, Code, Combobox, type ComboboxOption, type ComboboxProps, ConfirmDialog, type DirtyState, DirtyStateIndicator, Drawer, Dropdown, DropdownItem, EmptyState, type EmptyStateTone, Field, FormSection, Input, type InputProps, Markdown, Modal, Overlay, type OverlayPosition, PLAN_STATUS_CONFIG, PLAN_STATUS_ORDER, PROJECT_STATUS_CONFIG, type PlanStatusType, type ProjectStatus, type ResolvedTheme, type RowAction, RowActions, STATUS_CONFIG, SaveBar, Select, type SelectOption, type SelectProps, StatusBadge, type StatusType, THEME_STORAGE_KEY, type TabItem, Tabs, Textarea, type TextareaProps, type ThemeChoice, ThemeProvider, ThemeToggle, Tooltip, applyThemeClass, getStoredTheme, notify, resolveTheme, storeTheme, systemPrefersDark, usePopover, useTheme };
|
|
515
|
+
export { AppToaster, Avatar, Breadcrumbs, type BreadcrumbsProps, Button, Code, type ColumnDef, Combobox, type ComboboxOption, type ComboboxProps, ConfirmDialog, type Crumb, DataTable, type DirtyState, DirtyStateIndicator, Drawer, Dropdown, DropdownItem, EmptyState, type EmptyStateTone, Field, type FilterOption, Filters, FormSection, Input, type InputProps, Markdown, Modal, Overlay, type OverlayPosition, PLAN_STATUS_CONFIG, PLAN_STATUS_ORDER, PROJECT_STATUS_CONFIG, type PlanStatusType, type ProjectStatus, type ResolvedTheme, type RowAction, RowActions, STATUS_CONFIG, SaveBar, Select, type SelectOption, type SelectProps, StatusBadge, type StatusType, THEME_STORAGE_KEY, type TabItem, Tabs, Textarea, type TextareaProps, type ThemeChoice, ThemeProvider, ThemeToggle, Tooltip, applyThemeClass, getStoredTheme, notify, resolveTheme, storeTheme, systemPrefersDark, usePopover, useTheme };
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { createContext, forwardRef, useState, useEffect, useCallback, useMemo, useContext, useId, useRef, Children, isValidElement, cloneElement } from 'react';
|
|
1
|
+
import { createContext, forwardRef, useState, useEffect, useCallback, useMemo, useContext, useId, useRef, Children, isValidElement, cloneElement, Fragment as Fragment$1 } from 'react';
|
|
2
2
|
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
3
|
-
import { EyeOffIcon, EyeIcon, BanIcon, ScanSearchIcon, Clock4Icon, ArchiveIcon, CircleDotIcon, CheckCircle2Icon, CircleDashedIcon, PlayCircleIcon, SunIcon, MoonIcon, MonitorIcon, GithubIcon, ExternalLinkIcon, CopyIcon, PlusIcon, XIcon, Loader2Icon, CheckIcon, AlertTriangleIcon, ChevronDownIcon, SearchIcon, InfoIcon, XCircleIcon } from 'lucide-react';
|
|
3
|
+
import { EyeOffIcon, EyeIcon, BanIcon, ScanSearchIcon, Clock4Icon, ArchiveIcon, CircleDotIcon, CheckCircle2Icon, CircleDashedIcon, PlayCircleIcon, SunIcon, MoonIcon, MonitorIcon, GithubIcon, ExternalLinkIcon, CopyIcon, PlusIcon, XIcon, Loader2Icon, CheckIcon, AlertTriangleIcon, ChevronDownIcon, SearchIcon, ListFilterIcon, ArrowUpIcon, ArrowDownIcon, ChevronsUpDownIcon, ChevronRightIcon, InfoIcon, XCircleIcon } from 'lucide-react';
|
|
4
4
|
import { FloatingOverlay, useFloating, autoUpdate, useDismiss, useRole, useInteractions, FloatingPortal, FloatingFocusManager, offset, flip, shift, useHover, useFocus, size } from '@floating-ui/react';
|
|
5
5
|
import { motion, AnimatePresence } from 'framer-motion';
|
|
6
6
|
import toast, { Toaster } from 'react-hot-toast';
|
|
@@ -1293,7 +1293,399 @@ function Combobox({
|
|
|
1293
1293
|
)
|
|
1294
1294
|
] });
|
|
1295
1295
|
}
|
|
1296
|
+
function Filters({
|
|
1297
|
+
options,
|
|
1298
|
+
selectedIds,
|
|
1299
|
+
onChange,
|
|
1300
|
+
label = "Filter",
|
|
1301
|
+
searchable = false,
|
|
1302
|
+
searchPlaceholder
|
|
1303
|
+
}) {
|
|
1304
|
+
const [isOpen, setIsOpen] = useState(false);
|
|
1305
|
+
const [query, setQuery] = useState("");
|
|
1306
|
+
const searchInputRef = useRef(null);
|
|
1307
|
+
const { refs, floatingStyles, getReferenceProps, getFloatingProps } = usePopover({
|
|
1308
|
+
open: isOpen,
|
|
1309
|
+
onOpenChange: setIsOpen,
|
|
1310
|
+
placement: "bottom-start",
|
|
1311
|
+
role: "listbox"
|
|
1312
|
+
});
|
|
1313
|
+
useEffect(() => {
|
|
1314
|
+
if (isOpen && searchable) {
|
|
1315
|
+
const id = window.setTimeout(() => searchInputRef.current?.focus(), 0);
|
|
1316
|
+
return () => window.clearTimeout(id);
|
|
1317
|
+
}
|
|
1318
|
+
if (!isOpen) setQuery("");
|
|
1319
|
+
}, [isOpen, searchable]);
|
|
1320
|
+
const toggleFilter = (id) => {
|
|
1321
|
+
if (selectedIds.includes(id)) {
|
|
1322
|
+
onChange(selectedIds.filter((selectedId) => selectedId !== id));
|
|
1323
|
+
} else {
|
|
1324
|
+
onChange([...selectedIds, id]);
|
|
1325
|
+
}
|
|
1326
|
+
};
|
|
1327
|
+
const clearFilters = () => onChange([]);
|
|
1328
|
+
const selectedOptions = options.filter((o) => selectedIds.includes(o.id));
|
|
1329
|
+
const hasSelection = selectedOptions.length > 0;
|
|
1330
|
+
const filteredOptions = useMemo(() => {
|
|
1331
|
+
if (!searchable || query.trim() === "") return options;
|
|
1332
|
+
const q = query.trim().toLowerCase();
|
|
1333
|
+
return options.filter((o) => o.label.toLowerCase().includes(q));
|
|
1334
|
+
}, [options, query, searchable]);
|
|
1335
|
+
const renderMarker = (opt, ringed = false) => {
|
|
1336
|
+
if (opt.avatar) {
|
|
1337
|
+
return /* @__PURE__ */ jsx(
|
|
1338
|
+
"span",
|
|
1339
|
+
{
|
|
1340
|
+
className: `flex h-4 w-4 items-center justify-center rounded-full bg-surface-avatar text-[8px] font-semibold uppercase text-fg ${ringed ? "ring-2 ring-white" : ""}`,
|
|
1341
|
+
"aria-hidden": "true",
|
|
1342
|
+
children: opt.avatar.slice(0, 2)
|
|
1343
|
+
}
|
|
1344
|
+
);
|
|
1345
|
+
}
|
|
1346
|
+
if (opt.dotColor) {
|
|
1347
|
+
return /* @__PURE__ */ jsx(
|
|
1348
|
+
"span",
|
|
1349
|
+
{
|
|
1350
|
+
className: `h-2 w-2 rounded-full ${ringed ? "ring-2 ring-white" : ""}`,
|
|
1351
|
+
style: {
|
|
1352
|
+
backgroundColor: opt.dotColor
|
|
1353
|
+
},
|
|
1354
|
+
"aria-hidden": "true"
|
|
1355
|
+
}
|
|
1356
|
+
);
|
|
1357
|
+
}
|
|
1358
|
+
return null;
|
|
1359
|
+
};
|
|
1360
|
+
const renderSummary = () => {
|
|
1361
|
+
if (selectedOptions.length === 1) {
|
|
1362
|
+
const opt = selectedOptions[0];
|
|
1363
|
+
return /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-1.5 whitespace-nowrap", children: [
|
|
1364
|
+
renderMarker(opt),
|
|
1365
|
+
/* @__PURE__ */ jsx("span", { className: "max-w-[120px] truncate text-accent", children: opt.label })
|
|
1366
|
+
] });
|
|
1367
|
+
}
|
|
1368
|
+
return /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-1.5 whitespace-nowrap", children: [
|
|
1369
|
+
/* @__PURE__ */ jsx("span", { className: "flex flex-shrink-0 -space-x-1", children: selectedOptions.slice(0, 3).map(
|
|
1370
|
+
(opt) => /* @__PURE__ */ jsx(Fragment$1, { children: renderMarker(opt, true) }, opt.id)
|
|
1371
|
+
) }),
|
|
1372
|
+
/* @__PURE__ */ jsxs("span", { className: "whitespace-nowrap text-accent", children: [
|
|
1373
|
+
selectedOptions.length,
|
|
1374
|
+
" selected"
|
|
1375
|
+
] })
|
|
1376
|
+
] });
|
|
1377
|
+
};
|
|
1378
|
+
return /* @__PURE__ */ jsxs("div", { className: "relative inline-block flex-shrink-0 text-left", children: [
|
|
1379
|
+
/* @__PURE__ */ jsxs(
|
|
1380
|
+
"div",
|
|
1381
|
+
{
|
|
1382
|
+
ref: refs.setReference,
|
|
1383
|
+
className: "inline-flex items-stretch overflow-hidden rounded border border-border-strong bg-surface font-condensed text-sm font-medium leading-[17.5px] transition-colors",
|
|
1384
|
+
children: [
|
|
1385
|
+
/* @__PURE__ */ jsxs(
|
|
1386
|
+
"button",
|
|
1387
|
+
{
|
|
1388
|
+
type: "button",
|
|
1389
|
+
...getReferenceProps({
|
|
1390
|
+
onClick: () => setIsOpen((o) => !o)
|
|
1391
|
+
}),
|
|
1392
|
+
"aria-haspopup": "listbox",
|
|
1393
|
+
"aria-expanded": isOpen,
|
|
1394
|
+
className: "flex h-[38px] items-center gap-2 whitespace-nowrap px-3 transition-colors hover:bg-surface-raised focus:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-accent",
|
|
1395
|
+
children: [
|
|
1396
|
+
/* @__PURE__ */ jsx(
|
|
1397
|
+
ListFilterIcon,
|
|
1398
|
+
{
|
|
1399
|
+
className: `h-4 w-4 flex-shrink-0 ${hasSelection ? "text-accent" : "text-muted"}`,
|
|
1400
|
+
strokeWidth: 1.5,
|
|
1401
|
+
"aria-hidden": "true"
|
|
1402
|
+
}
|
|
1403
|
+
),
|
|
1404
|
+
/* @__PURE__ */ jsx("span", { className: hasSelection ? "text-accent" : "text-fg", children: label }),
|
|
1405
|
+
hasSelection && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
1406
|
+
/* @__PURE__ */ jsx("span", { className: "text-muted", children: "is" }),
|
|
1407
|
+
renderSummary()
|
|
1408
|
+
] }),
|
|
1409
|
+
!hasSelection && /* @__PURE__ */ jsx(
|
|
1410
|
+
ChevronDownIcon,
|
|
1411
|
+
{
|
|
1412
|
+
className: `h-4 w-4 text-muted transition-transform duration-200 ${isOpen ? "rotate-180" : ""}`,
|
|
1413
|
+
"aria-hidden": "true"
|
|
1414
|
+
}
|
|
1415
|
+
)
|
|
1416
|
+
]
|
|
1417
|
+
}
|
|
1418
|
+
),
|
|
1419
|
+
hasSelection && /* @__PURE__ */ jsx(
|
|
1420
|
+
"button",
|
|
1421
|
+
{
|
|
1422
|
+
type: "button",
|
|
1423
|
+
onClick: clearFilters,
|
|
1424
|
+
"aria-label": `Clear ${label} filter`,
|
|
1425
|
+
className: "flex items-center border-l border-border-strong px-2 text-muted transition-colors hover:bg-surface-raised hover:text-fg focus:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-accent",
|
|
1426
|
+
children: /* @__PURE__ */ jsx(XIcon, { className: "h-3.5 w-3.5" })
|
|
1427
|
+
}
|
|
1428
|
+
)
|
|
1429
|
+
]
|
|
1430
|
+
}
|
|
1431
|
+
),
|
|
1432
|
+
/* @__PURE__ */ jsx(FloatingPortal, { children: /* @__PURE__ */ jsx(AnimatePresence, { children: isOpen && /* @__PURE__ */ jsx(
|
|
1433
|
+
"div",
|
|
1434
|
+
{
|
|
1435
|
+
ref: refs.setFloating,
|
|
1436
|
+
style: floatingStyles,
|
|
1437
|
+
...getFloatingProps(),
|
|
1438
|
+
className: "z-50",
|
|
1439
|
+
children: /* @__PURE__ */ jsxs(
|
|
1440
|
+
motion.div,
|
|
1441
|
+
{
|
|
1442
|
+
initial: {
|
|
1443
|
+
opacity: 0,
|
|
1444
|
+
y: -4,
|
|
1445
|
+
scale: 0.98
|
|
1446
|
+
},
|
|
1447
|
+
animate: {
|
|
1448
|
+
opacity: 1,
|
|
1449
|
+
y: 0,
|
|
1450
|
+
scale: 1
|
|
1451
|
+
},
|
|
1452
|
+
exit: {
|
|
1453
|
+
opacity: 0,
|
|
1454
|
+
y: -4,
|
|
1455
|
+
scale: 0.98
|
|
1456
|
+
},
|
|
1457
|
+
transition: {
|
|
1458
|
+
duration: 0.15,
|
|
1459
|
+
ease: "easeOut"
|
|
1460
|
+
},
|
|
1461
|
+
className: "flex min-w-[220px] flex-col overflow-hidden rounded-md border border-border bg-surface shadow-lg",
|
|
1462
|
+
children: [
|
|
1463
|
+
searchable && /* @__PURE__ */ jsx("div", { className: "border-b border-border p-1.5", children: /* @__PURE__ */ jsxs("div", { className: "relative", children: [
|
|
1464
|
+
/* @__PURE__ */ jsx(
|
|
1465
|
+
SearchIcon,
|
|
1466
|
+
{
|
|
1467
|
+
className: "pointer-events-none absolute left-2 top-1/2 h-3.5 w-3.5 -translate-y-1/2 text-muted",
|
|
1468
|
+
"aria-hidden": "true"
|
|
1469
|
+
}
|
|
1470
|
+
),
|
|
1471
|
+
/* @__PURE__ */ jsx(
|
|
1472
|
+
"input",
|
|
1473
|
+
{
|
|
1474
|
+
ref: searchInputRef,
|
|
1475
|
+
type: "text",
|
|
1476
|
+
value: query,
|
|
1477
|
+
onChange: (e) => setQuery(e.target.value),
|
|
1478
|
+
placeholder: searchPlaceholder ?? `Search ${label.toLowerCase()}...`,
|
|
1479
|
+
className: "w-full rounded border border-transparent bg-surface-raised py-1.5 pl-7 pr-2 font-sans text-sm text-fg placeholder:text-muted focus:border-border focus:bg-surface focus:outline-none",
|
|
1480
|
+
"aria-label": `Search ${label}`
|
|
1481
|
+
}
|
|
1482
|
+
)
|
|
1483
|
+
] }) }),
|
|
1484
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between border-b border-border px-3 py-2", children: [
|
|
1485
|
+
/* @__PURE__ */ jsx("span", { className: "font-sans text-xs font-semibold uppercase tracking-wider text-muted", children: label }),
|
|
1486
|
+
hasSelection && /* @__PURE__ */ jsx(
|
|
1487
|
+
"button",
|
|
1488
|
+
{
|
|
1489
|
+
type: "button",
|
|
1490
|
+
onClick: clearFilters,
|
|
1491
|
+
className: "font-sans text-xs font-medium text-accent hover:underline focus:outline-none",
|
|
1492
|
+
children: "Clear all"
|
|
1493
|
+
}
|
|
1494
|
+
)
|
|
1495
|
+
] }),
|
|
1496
|
+
/* @__PURE__ */ jsx(
|
|
1497
|
+
"div",
|
|
1498
|
+
{
|
|
1499
|
+
role: "listbox",
|
|
1500
|
+
"aria-multiselectable": "true",
|
|
1501
|
+
className: "max-h-64 overflow-y-auto p-1",
|
|
1502
|
+
children: filteredOptions.length === 0 ? /* @__PURE__ */ jsx("div", { className: "px-2 py-6 text-center font-sans text-sm text-muted", children: "No matches" }) : filteredOptions.map((option) => {
|
|
1503
|
+
const checked = selectedIds.includes(option.id);
|
|
1504
|
+
return /* @__PURE__ */ jsxs(
|
|
1505
|
+
"button",
|
|
1506
|
+
{
|
|
1507
|
+
type: "button",
|
|
1508
|
+
role: "option",
|
|
1509
|
+
"aria-selected": checked,
|
|
1510
|
+
onClick: () => toggleFilter(option.id),
|
|
1511
|
+
className: "flex w-full items-center gap-2.5 rounded px-2 py-1.5 text-left font-sans text-sm text-fg transition-colors hover:bg-surface-raised focus:bg-surface-raised focus:outline-none",
|
|
1512
|
+
children: [
|
|
1513
|
+
/* @__PURE__ */ jsx(
|
|
1514
|
+
"span",
|
|
1515
|
+
{
|
|
1516
|
+
className: `flex h-[18px] w-[18px] items-center justify-center rounded border transition-colors ${checked ? "border-accent bg-accent text-on-accent" : "border-border-strong bg-surface"}`,
|
|
1517
|
+
"aria-hidden": "true",
|
|
1518
|
+
children: checked && /* @__PURE__ */ jsx(CheckIcon, { className: "h-3 w-3", strokeWidth: 3 })
|
|
1519
|
+
}
|
|
1520
|
+
),
|
|
1521
|
+
renderMarker(option),
|
|
1522
|
+
/* @__PURE__ */ jsx("span", { children: option.label })
|
|
1523
|
+
]
|
|
1524
|
+
},
|
|
1525
|
+
option.id
|
|
1526
|
+
);
|
|
1527
|
+
})
|
|
1528
|
+
}
|
|
1529
|
+
)
|
|
1530
|
+
]
|
|
1531
|
+
}
|
|
1532
|
+
)
|
|
1533
|
+
}
|
|
1534
|
+
) }) })
|
|
1535
|
+
] });
|
|
1536
|
+
}
|
|
1537
|
+
function DataTable({
|
|
1538
|
+
data,
|
|
1539
|
+
columns,
|
|
1540
|
+
searchValue,
|
|
1541
|
+
onSearchChange,
|
|
1542
|
+
searchPlaceholder = "Search...",
|
|
1543
|
+
filterOptions,
|
|
1544
|
+
selectedFilters,
|
|
1545
|
+
onFilterChange,
|
|
1546
|
+
filterLabel = "Filter",
|
|
1547
|
+
onClearFilters,
|
|
1548
|
+
extraFilters,
|
|
1549
|
+
leadingFilter,
|
|
1550
|
+
sortKey,
|
|
1551
|
+
sortDirection,
|
|
1552
|
+
onSortChange,
|
|
1553
|
+
isGroupRow,
|
|
1554
|
+
renderGroupRow,
|
|
1555
|
+
onRowClick,
|
|
1556
|
+
rowActions,
|
|
1557
|
+
emptyMessage = "No results found.",
|
|
1558
|
+
resultsCount,
|
|
1559
|
+
toolbarActions
|
|
1560
|
+
}) {
|
|
1561
|
+
const totalCols = columns.length + (rowActions ? 1 : 0);
|
|
1562
|
+
const hasFilters = filterOptions && onFilterChange || extraFilters || leadingFilter;
|
|
1563
|
+
const hasToolbar = onSearchChange || hasFilters || toolbarActions;
|
|
1564
|
+
const handleSortClick = (key) => {
|
|
1565
|
+
if (!onSortChange) return;
|
|
1566
|
+
if (sortKey === key) {
|
|
1567
|
+
onSortChange(key, sortDirection === "asc" ? "desc" : "asc");
|
|
1568
|
+
} else {
|
|
1569
|
+
onSortChange(key, "asc");
|
|
1570
|
+
}
|
|
1571
|
+
};
|
|
1572
|
+
return /* @__PURE__ */ jsxs("div", { className: "flex w-full flex-col gap-4", children: [
|
|
1573
|
+
hasToolbar && /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-3", children: [
|
|
1574
|
+
(onSearchChange || toolbarActions) && /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-3", children: [
|
|
1575
|
+
onSearchChange && /* @__PURE__ */ jsx("div", { className: "min-w-[160px] flex-1 sm:max-w-sm", children: /* @__PURE__ */ jsx(
|
|
1576
|
+
Input,
|
|
1577
|
+
{
|
|
1578
|
+
placeholder: searchPlaceholder,
|
|
1579
|
+
value: searchValue,
|
|
1580
|
+
onChange: (e) => onSearchChange(e.target.value),
|
|
1581
|
+
icon: SearchIcon
|
|
1582
|
+
}
|
|
1583
|
+
) }),
|
|
1584
|
+
toolbarActions && /* @__PURE__ */ jsx("div", { className: "ml-auto flex items-center gap-3", children: toolbarActions })
|
|
1585
|
+
] }),
|
|
1586
|
+
hasFilters && /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-3", children: [
|
|
1587
|
+
leadingFilter,
|
|
1588
|
+
filterOptions && selectedFilters && onFilterChange && /* @__PURE__ */ jsx(
|
|
1589
|
+
Filters,
|
|
1590
|
+
{
|
|
1591
|
+
label: filterLabel,
|
|
1592
|
+
options: filterOptions,
|
|
1593
|
+
selectedIds: selectedFilters,
|
|
1594
|
+
onChange: onFilterChange
|
|
1595
|
+
}
|
|
1596
|
+
),
|
|
1597
|
+
extraFilters
|
|
1598
|
+
] })
|
|
1599
|
+
] }),
|
|
1600
|
+
resultsCount && /* @__PURE__ */ jsx("div", { className: "font-sans text-sm text-muted", children: resultsCount }),
|
|
1601
|
+
/* @__PURE__ */ jsx("div", { className: "w-full overflow-x-auto rounded border border-border bg-surface shadow-[0px_0px_2px_rgba(0,0,0,0.1)]", children: /* @__PURE__ */ jsxs("table", { className: "w-full border-collapse text-left font-sans text-sm", children: [
|
|
1602
|
+
/* @__PURE__ */ jsx("thead", { className: "border-b border-border bg-surface-raised", children: /* @__PURE__ */ jsxs("tr", { children: [
|
|
1603
|
+
columns.map(
|
|
1604
|
+
(col) => /* @__PURE__ */ jsx(
|
|
1605
|
+
"th",
|
|
1606
|
+
{
|
|
1607
|
+
scope: "col",
|
|
1608
|
+
className: `border-r border-border-subtle px-5 py-3 font-medium text-muted last:border-r-0 ${col.sortable ? "cursor-pointer select-none hover:bg-surface-raised" : ""} ${rowActions ? "last:border-r" : ""}`,
|
|
1609
|
+
"aria-sort": col.sortable && sortKey === col.key ? sortDirection === "asc" ? "ascending" : "descending" : void 0,
|
|
1610
|
+
onClick: () => col.sortable && handleSortClick(col.key),
|
|
1611
|
+
children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1.5", children: [
|
|
1612
|
+
col.title,
|
|
1613
|
+
col.sortable && /* @__PURE__ */ jsx("span", { className: "text-muted", children: sortKey === col.key ? sortDirection === "asc" ? /* @__PURE__ */ jsx(ArrowUpIcon, { className: "h-3.5 w-3.5 text-fg" }) : /* @__PURE__ */ jsx(ArrowDownIcon, { className: "h-3.5 w-3.5 text-fg" }) : /* @__PURE__ */ jsx(ChevronsUpDownIcon, { className: "h-3.5 w-3.5 opacity-50" }) })
|
|
1614
|
+
] })
|
|
1615
|
+
},
|
|
1616
|
+
col.key
|
|
1617
|
+
)
|
|
1618
|
+
),
|
|
1619
|
+
rowActions && /* @__PURE__ */ jsx("th", { scope: "col", className: "w-px px-3 py-3", children: /* @__PURE__ */ jsx("span", { className: "sr-only", children: "Actions" }) })
|
|
1620
|
+
] }) }),
|
|
1621
|
+
/* @__PURE__ */ jsx("tbody", { children: data.length === 0 ? /* @__PURE__ */ jsx("tr", { children: /* @__PURE__ */ jsx(
|
|
1622
|
+
"td",
|
|
1623
|
+
{
|
|
1624
|
+
colSpan: totalCols,
|
|
1625
|
+
className: "px-5 py-8 text-center text-muted",
|
|
1626
|
+
children: emptyMessage
|
|
1627
|
+
}
|
|
1628
|
+
) }) : data.map((item) => {
|
|
1629
|
+
if (isGroupRow && isGroupRow(item) && renderGroupRow) {
|
|
1630
|
+
return /* @__PURE__ */ jsx(
|
|
1631
|
+
"tr",
|
|
1632
|
+
{
|
|
1633
|
+
className: "border-b border-border bg-surface-raised",
|
|
1634
|
+
children: /* @__PURE__ */ jsx("td", { colSpan: totalCols, className: "px-5 py-2", children: renderGroupRow(item) })
|
|
1635
|
+
},
|
|
1636
|
+
item.id
|
|
1637
|
+
);
|
|
1638
|
+
}
|
|
1639
|
+
return /* @__PURE__ */ jsxs(
|
|
1640
|
+
"tr",
|
|
1641
|
+
{
|
|
1642
|
+
onClick: () => onRowClick?.(item),
|
|
1643
|
+
className: `group border-b border-border-subtle transition-colors last:border-0 hover:bg-surface-raised ${onRowClick ? "cursor-pointer" : ""}`,
|
|
1644
|
+
children: [
|
|
1645
|
+
columns.map(
|
|
1646
|
+
(col) => /* @__PURE__ */ jsx("td", { className: "border-r border-border-subtle px-5 py-3 text-fg last:border-r-0", children: col.render ? col.render(item) : item[col.key] }, col.key)
|
|
1647
|
+
),
|
|
1648
|
+
rowActions && /* @__PURE__ */ jsx("td", { className: "px-3 py-3 text-right align-middle", children: rowActions(item) })
|
|
1649
|
+
]
|
|
1650
|
+
},
|
|
1651
|
+
item.id
|
|
1652
|
+
);
|
|
1653
|
+
}) })
|
|
1654
|
+
] }) })
|
|
1655
|
+
] });
|
|
1656
|
+
}
|
|
1657
|
+
function Breadcrumbs({ items, className = "", renderLink }) {
|
|
1658
|
+
const linkClass = "text-muted transition-colors hover:text-fg";
|
|
1659
|
+
return /* @__PURE__ */ jsx(
|
|
1660
|
+
"nav",
|
|
1661
|
+
{
|
|
1662
|
+
"aria-label": "Breadcrumb",
|
|
1663
|
+
className: `flex items-center gap-1.5 font-sans text-sm ${className}`,
|
|
1664
|
+
children: items.map((item, i) => {
|
|
1665
|
+
const isLast = i === items.length - 1;
|
|
1666
|
+
const linkable = item.href && !isLast;
|
|
1667
|
+
return /* @__PURE__ */ jsxs(Fragment$1, { children: [
|
|
1668
|
+
linkable ? renderLink ? renderLink(item, item.label) : /* @__PURE__ */ jsx("a", { href: item.href, className: linkClass, children: item.label }) : /* @__PURE__ */ jsx(
|
|
1669
|
+
"span",
|
|
1670
|
+
{
|
|
1671
|
+
className: isLast ? "font-medium text-fg" : "text-muted",
|
|
1672
|
+
"aria-current": isLast ? "page" : void 0,
|
|
1673
|
+
children: item.label
|
|
1674
|
+
}
|
|
1675
|
+
),
|
|
1676
|
+
!isLast && /* @__PURE__ */ jsx(
|
|
1677
|
+
ChevronRightIcon,
|
|
1678
|
+
{
|
|
1679
|
+
className: "h-3.5 w-3.5 flex-shrink-0 text-border-strong",
|
|
1680
|
+
"aria-hidden": "true"
|
|
1681
|
+
}
|
|
1682
|
+
)
|
|
1683
|
+
] }, `${item.label}-${i}`);
|
|
1684
|
+
})
|
|
1685
|
+
}
|
|
1686
|
+
);
|
|
1687
|
+
}
|
|
1296
1688
|
|
|
1297
|
-
export { AppToaster, Avatar, Button, Code, Combobox, ConfirmDialog, DirtyStateIndicator, Drawer, Dropdown, DropdownItem, EmptyState, Field, FormSection, Input, Markdown, Modal, Overlay, PLAN_STATUS_CONFIG, PLAN_STATUS_ORDER, PROJECT_STATUS_CONFIG, RowActions, STATUS_CONFIG, SaveBar, Select, StatusBadge, THEME_STORAGE_KEY, Tabs, Textarea, ThemeProvider, ThemeToggle, Tooltip, applyThemeClass, getStoredTheme, notify, resolveTheme, storeTheme, systemPrefersDark, usePopover, useTheme };
|
|
1689
|
+
export { AppToaster, Avatar, Breadcrumbs, Button, Code, Combobox, ConfirmDialog, DataTable, DirtyStateIndicator, Drawer, Dropdown, DropdownItem, EmptyState, Field, Filters, FormSection, Input, Markdown, Modal, Overlay, PLAN_STATUS_CONFIG, PLAN_STATUS_ORDER, PROJECT_STATUS_CONFIG, RowActions, STATUS_CONFIG, SaveBar, Select, StatusBadge, THEME_STORAGE_KEY, Tabs, Textarea, ThemeProvider, ThemeToggle, Tooltip, applyThemeClass, getStoredTheme, notify, resolveTheme, storeTheme, systemPrefersDark, usePopover, useTheme };
|
|
1298
1690
|
//# sourceMappingURL=index.js.map
|
|
1299
1691
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/theme/theme.ts","../src/theme/ThemeProvider.tsx","../src/theme/ThemeToggle.tsx","../src/components/Button.tsx","../src/components/Overlay.tsx","../src/components/Avatar.tsx","../src/components/Input.tsx","../src/components/Textarea.tsx","../src/components/Code.tsx","../src/components/Tooltip.tsx","../src/components/Tabs.tsx","../src/components/Toast.tsx","../src/components/StatusBadge.tsx","../src/components/EmptyState.tsx","../src/components/FormSection.tsx","../src/components/DirtyStateIndicator.tsx","../src/components/RowActions.tsx","../src/components/Markdown.tsx","../src/components/Modal.tsx","../src/components/Drawer.tsx","../src/components/ConfirmDialog.tsx","../src/components/SaveBar.tsx","../src/hooks/usePopover.ts","../src/components/Dropdown.tsx","../src/components/Select.tsx","../src/components/Combobox.tsx"],"names":["jsx","jsxs","size","useState","forwardRef","useFloating","autoUpdate","useDismiss","useRole","useInteractions","FloatingPortal","XIcon","CheckCircle2Icon","SIZES","Fragment","AlertTriangleIcon","offset","flip","shift","useEffect","AnimatePresence","motion","CheckIcon","useRef","ChevronDownIcon"],"mappings":"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","file":"index.js","sourcesContent":["export type ThemeChoice = 'light' | 'dark' | 'system';\nexport type ResolvedTheme = 'light' | 'dark';\n\nexport const THEME_STORAGE_KEY = 'orbit-theme';\nconst CHOICES: ThemeChoice[] = ['light', 'dark', 'system'];\n\nexport function resolveTheme(choice: ThemeChoice, prefersDark: boolean): ResolvedTheme {\n if (choice === 'system') return prefersDark ? 'dark' : 'light';\n return choice;\n}\n\nexport function getStoredTheme(): ThemeChoice {\n try {\n const stored = localStorage.getItem(THEME_STORAGE_KEY);\n if (stored && (CHOICES as string[]).includes(stored)) return stored as ThemeChoice;\n } catch {\n // localStorage unavailable (SSR/private mode) — fall through to default.\n }\n return 'system';\n}\n\nexport function storeTheme(choice: ThemeChoice): void {\n try {\n localStorage.setItem(THEME_STORAGE_KEY, choice);\n } catch {\n // Ignore persistence failures.\n }\n}\n\nexport function systemPrefersDark(): boolean {\n return typeof window !== 'undefined' &&\n window.matchMedia('(prefers-color-scheme: dark)').matches;\n}\n\nexport function applyThemeClass(resolved: ResolvedTheme): void {\n const root = document.documentElement;\n root.classList.toggle('dark', resolved === 'dark');\n // Tell the UA which scheme is active (correct default canvas, form controls,\n // scrollbars) and paint the page background from the themed token, so a\n // refresh or toggle never flashes white before the app shell mounts. Reading\n // --color-bg keeps a single source of truth with the CSS.\n root.style.colorScheme = resolved;\n const bg = getComputedStyle(root).getPropertyValue('--color-bg').trim();\n if (bg) root.style.backgroundColor = bg;\n}\n","import React, {\n createContext,\n useContext,\n useEffect,\n useMemo,\n useState,\n useCallback,\n} from 'react';\nimport {\n type ThemeChoice,\n type ResolvedTheme,\n getStoredTheme,\n storeTheme,\n resolveTheme,\n systemPrefersDark,\n applyThemeClass,\n} from './theme';\n\ninterface ThemeContextValue {\n theme: ThemeChoice;\n resolvedTheme: ResolvedTheme;\n setTheme: (choice: ThemeChoice) => void;\n}\n\nconst ThemeContext = createContext<ThemeContextValue | null>(null);\n\nexport function ThemeProvider({ children }: { children: React.ReactNode }) {\n const [theme, setThemeState] = useState<ThemeChoice>(() => getStoredTheme());\n const [prefersDark, setPrefersDark] = useState<boolean>(() => systemPrefersDark());\n\n // Track OS preference changes (only matters while theme === 'system').\n useEffect(() => {\n const mq = window.matchMedia('(prefers-color-scheme: dark)');\n const onChange = (e: MediaQueryListEvent) => setPrefersDark(e.matches);\n mq.addEventListener('change', onChange);\n return () => mq.removeEventListener('change', onChange);\n }, []);\n\n const resolvedTheme = resolveTheme(theme, prefersDark);\n\n // Apply the resolved theme to <html> whenever it changes.\n useEffect(() => {\n applyThemeClass(resolvedTheme);\n }, [resolvedTheme]);\n\n const setTheme = useCallback((choice: ThemeChoice) => {\n storeTheme(choice);\n setThemeState(choice);\n }, []);\n\n const value = useMemo(\n () => ({ theme, resolvedTheme, setTheme }),\n [theme, resolvedTheme, setTheme],\n );\n\n return <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>;\n}\n\nexport function useTheme(): ThemeContextValue {\n const ctx = useContext(ThemeContext);\n if (!ctx) throw new Error('useTheme must be used within a ThemeProvider');\n return ctx;\n}\n","import React from 'react';\nimport { SunIcon, MoonIcon, MonitorIcon, type LucideIcon } from 'lucide-react';\nimport { useTheme } from './ThemeProvider';\nimport type { ThemeChoice } from './theme';\n\nconst OPTIONS: { value: ThemeChoice; label: string; Icon: LucideIcon }[] = [\n { value: 'light', label: 'Light', Icon: SunIcon },\n { value: 'dark', label: 'Dark', Icon: MoonIcon },\n { value: 'system', label: 'System', Icon: MonitorIcon },\n];\n\nexport function ThemeToggle() {\n const { theme, setTheme } = useTheme();\n return (\n <div\n role=\"radiogroup\"\n aria-label=\"Theme\"\n className=\"flex items-center gap-0.5 rounded-md border border-border-strong bg-surface-raised p-0.5\"\n >\n {OPTIONS.map(({ value, label, Icon }) => {\n const active = theme === value;\n return (\n <button\n key={value}\n type=\"button\"\n role=\"radio\"\n aria-checked={active}\n aria-label={label}\n title={label}\n onClick={() => setTheme(value)}\n className={`flex h-6 w-6 items-center justify-center rounded transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-accent ${\n active\n ? 'bg-surface text-fg shadow-sm'\n : 'text-muted hover:text-fg'\n }`}\n >\n <Icon className=\"h-3.5 w-3.5\" strokeWidth={1.75} aria-hidden=\"true\" />\n </button>\n );\n })}\n </div>\n );\n}\n","import React from 'react';\nimport { PlusIcon, CopyIcon, ExternalLinkIcon, GithubIcon } from 'lucide-react';\ntype Variant = 'primary' | 'secondary' | 'destructive';\ntype IconPos = 'none' | 'leading' | 'trailing';\ninterface ButtonProps {\n children: React.ReactNode;\n variant?: Variant;\n icon?: 'plus' | 'copy' | 'external-link' | 'github';\n iconPosition?: IconPos;\n onClick?: () => void;\n disabled?: boolean;\n /** Stretch to the container width (e.g. a full-width form/footer action). */\n fullWidth?: boolean;\n}\nconst ICONS = {\n plus: PlusIcon,\n copy: CopyIcon,\n 'external-link': ExternalLinkIcon,\n github: GithubIcon\n};\nexport function Button({\n children,\n variant = 'primary',\n icon,\n iconPosition = 'none',\n onClick,\n disabled = false,\n fullWidth = false\n}: ButtonProps) {\n const Icon = icon ? ICONS[icon] : null;\n const showLeading = Icon && iconPosition === 'leading';\n const showTrailing = Icon && iconPosition === 'trailing';\n const base =\n `${fullWidth ? 'flex w-full' : 'inline-flex'} h-[38px] items-center justify-center gap-2.5 rounded px-3.5 font-condensed text-sm font-medium leading-[17.5px] transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-1 disabled:cursor-not-allowed disabled:opacity-60`;\n const variants: Record<Variant, string> = {\n primary:\n 'bg-accent text-on-accent hover:bg-accent-hover focus-visible:ring-accent shadow-[inset_0_1px_0_0_rgba(255,255,255,0.25),inset_0_0_0_1px_rgba(255,255,255,0.12)]',\n secondary:\n 'bg-surface text-fg border border-border-strong hover:bg-surface-raised focus-visible:ring-accent',\n // destructive stays hardcoded — themed in a later pass (see plan Global Constraints).\n destructive:\n 'bg-[#DC2626] text-white hover:bg-[#B91C1C] focus-visible:ring-[#DC2626] shadow-[inset_0_1px_0_0_rgba(255,255,255,0.25),inset_0_0_0_1px_rgba(255,255,255,0.12)]'\n };\n return (\n <button\n type=\"button\"\n onClick={onClick}\n disabled={disabled}\n className={`${base} ${variants[variant]}`}>\n\n {showLeading &&\n <Icon className=\"h-4 w-4\" strokeWidth={1.33} aria-hidden=\"true\" />\n }\n <span>{children}</span>\n {showTrailing &&\n <Icon className=\"h-4 w-4\" strokeWidth={1.33} aria-hidden=\"true\" />\n }\n </button>);\n\n}","import React, { useId } from 'react';\nimport {\n FloatingPortal,\n FloatingOverlay,\n FloatingFocusManager,\n useFloating,\n useDismiss,\n useRole,\n useInteractions,\n autoUpdate } from\n'@floating-ui/react';\nimport { AnimatePresence, motion } from 'framer-motion';\nimport { XIcon } from 'lucide-react';\n\nexport type OverlayPosition = 'center' | 'left' | 'right';\n\ninterface OverlayProps {\n open: boolean;\n onClose: () => void;\n position: OverlayPosition;\n /** Tailwind max-width class applied to the panel, e.g. \"max-w-lg\". */\n widthClassName: string;\n title?: React.ReactNode;\n description?: React.ReactNode;\n footer?: React.ReactNode;\n hideCloseButton?: boolean;\n closeOnBackdrop?: boolean;\n closeOnEsc?: boolean;\n children: React.ReactNode;\n}\n\nconst MotionFloatingOverlay = motion(FloatingOverlay);\n\n// Per-position container alignment and panel chrome.\nconst CONTAINER: Record<OverlayPosition, string> = {\n center: 'items-center justify-center p-4',\n right: 'justify-end',\n left: 'justify-start'\n};\nconst PANEL: Record<OverlayPosition, string> = {\n center:\n 'max-h-[85vh] w-full rounded-lg border-[0.5px] border-border-strong shadow-lg',\n right: 'h-full w-full border-l-[0.5px] border-border-strong shadow-xl',\n left: 'h-full w-full border-r-[0.5px] border-border-strong shadow-xl'\n};\n// Enter/exit transform per position (opacity is handled by the backdrop fade).\nconst PANEL_MOTION = {\n center: { from: { scale: 0.96, y: 8 }, to: { scale: 1, y: 0 } },\n right: { from: { x: '100%' }, to: { x: 0 } },\n left: { from: { x: '-100%' }, to: { x: 0 } }\n} satisfies Record<OverlayPosition, { from: object; to: object }>;\n\n/**\n * Shared modal-overlay primitive used by Modal and Drawer.\n *\n * Handles the portal, scroll-locking backdrop, focus trap + restore, Escape and\n * outside-press dismissal, enter/exit animation, and the common header/body/footer\n * chrome. Position drives both layout (centered vs edge-docked) and animation.\n */\nexport function Overlay({\n open,\n onClose,\n position,\n widthClassName,\n title,\n description,\n footer,\n hideCloseButton = false,\n closeOnBackdrop = true,\n closeOnEsc = true,\n children\n}: OverlayProps) {\n const titleId = useId();\n const { refs, context } = useFloating({\n open,\n onOpenChange: (next) => {\n if (!next) onClose();\n },\n whileElementsMounted: autoUpdate\n });\n const dismiss = useDismiss(context, {\n outsidePress: closeOnBackdrop,\n escapeKey: closeOnEsc\n });\n const role = useRole(context, { role: 'dialog' });\n const { getFloatingProps } = useInteractions([dismiss, role]);\n\n const panelMotion = PANEL_MOTION[position];\n const hasHeader = Boolean(title) || !hideCloseButton;\n\n return (\n <FloatingPortal>\n <AnimatePresence>\n {open &&\n <MotionFloatingOverlay\n lockScroll\n className={`fixed inset-0 z-50 flex bg-black/40 ${CONTAINER[position]}`}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.2, ease: 'easeOut' }}>\n\n <FloatingFocusManager context={context} modal>\n <motion.div\n ref={refs.setFloating}\n {...getFloatingProps()}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={title ? titleId : undefined}\n className={`relative flex flex-col overflow-hidden bg-surface font-sans ${PANEL[position]} ${widthClassName}`}\n initial={panelMotion.from}\n animate={panelMotion.to}\n exit={panelMotion.from}\n transition={{ duration: 0.2, ease: 'easeOut' }}>\n\n {hasHeader &&\n <div className=\"flex flex-shrink-0 items-start justify-between gap-4 border-b-[0.5px] border-border-strong px-6 py-4\">\n <div className=\"min-w-0\">\n {title &&\n <h2\n id={titleId}\n className=\"font-sans text-lg font-semibold text-fg\">\n\n {title}\n </h2>\n }\n {description &&\n <p className=\"mt-1 font-sans text-sm text-muted\">\n {description}\n </p>\n }\n </div>\n {!hideCloseButton &&\n <button\n type=\"button\"\n onClick={onClose}\n aria-label=\"Close\"\n className=\"-mr-1.5 flex h-8 w-8 flex-shrink-0 items-center justify-center rounded text-muted transition-colors hover:bg-surface-raised hover:text-fg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent\">\n\n <XIcon className=\"h-4 w-4\" strokeWidth={2} />\n </button>\n }\n </div>\n }\n\n <div className=\"flex-1 overflow-y-auto px-6 py-5\">{children}</div>\n\n {footer &&\n <div className=\"flex flex-shrink-0 items-center justify-end gap-3 border-t-[0.5px] border-border-strong px-6 py-4\">\n {footer}\n </div>\n }\n </motion.div>\n </FloatingFocusManager>\n </MotionFloatingOverlay>\n }\n </AnimatePresence>\n </FloatingPortal>);\n\n}\n","import React from 'react';\ninterface AvatarProps {\n name: string;\n initials?: string;\n size?: 'sm' | 'md' | 'lg';\n className?: string;\n}\nconst SIZES = {\n sm: 'h-6 w-6 text-[10px]',\n md: 'h-7 w-7 text-[11px]',\n lg: 'h-9 w-9 text-sm'\n} as const;\n// Neutral gray treatment used for all initials avatars.\nconst GRAY = {\n bg: 'var(--color-surface-avatar)',\n color: 'var(--color-text-secondary)'\n};\nfunction getInitials(name: string) {\n const parts = name.trim().split(/\\s+/);\n if (parts.length === 1) return (parts[0] ?? '').slice(0, 2).toUpperCase();\n return ((parts[0]?.[0] ?? '') + (parts[parts.length - 1]?.[0] ?? '')).toUpperCase();\n}\nexport function Avatar({\n name,\n initials,\n size = 'md',\n className = ''\n}: AvatarProps) {\n const label = initials ?? getInitials(name);\n return (\n <div\n className={`flex flex-shrink-0 items-center justify-center rounded-full font-medium ${SIZES[size]} ${className}`}\n style={{\n backgroundColor: GRAY.bg,\n color: GRAY.color\n }}\n aria-hidden=\"true\"\n title={name}>\n\n {label}\n </div>);\n\n}\n","import React, { useState, forwardRef } from 'react';\nimport { EyeIcon, EyeOffIcon, type LucideIcon } from 'lucide-react';\nexport interface InputProps extends\n React.InputHTMLAttributes<HTMLInputElement> {\n label?: string;\n helperText?: string;\n error?: boolean;\n icon?: LucideIcon;\n}\nexport const Input = forwardRef<HTMLInputElement, InputProps>(\n (\n {\n label,\n helperText,\n error,\n icon: Icon,\n type = 'text',\n className = '',\n disabled,\n ...props\n },\n ref) =>\n {\n const [showPassword, setShowPassword] = useState(false);\n const isPassword = type === 'password';\n const inputType = isPassword ? showPassword ? 'text' : 'password' : type;\n return (\n <div className={`flex w-full flex-col gap-1.5 ${className}`}>\n {label &&\n <label className=\"font-sans text-sm font-medium text-fg\">\n {label}\n </label>\n }\n <div className=\"relative flex items-center\">\n {Icon &&\n <div className=\"absolute left-3 text-muted\">\n <Icon className=\"h-4 w-4\" strokeWidth={1.5} />\n </div>\n }\n <input\n ref={ref}\n type={inputType}\n disabled={disabled}\n className={`w-full rounded border bg-surface px-3 py-2 font-sans text-sm text-fg placeholder:text-muted transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-1 disabled:cursor-not-allowed disabled:bg-surface-raised disabled:text-muted ${Icon ? 'pl-9' : ''} ${isPassword ? 'pr-9' : ''} ${error ? 'border-red-500 focus-visible:border-red-500 focus-visible:ring-red-500' : 'border-border hover:border-border-strong focus-visible:border-accent focus-visible:ring-accent'}`}\n {...props} />\n \n {isPassword &&\n <button\n type=\"button\"\n onClick={() => setShowPassword(!showPassword)}\n disabled={disabled}\n className=\"absolute right-3 text-muted hover:text-fg focus:outline-none disabled:cursor-not-allowed disabled:opacity-50\"\n aria-label={showPassword ? 'Hide password' : 'Show password'}>\n \n {showPassword ?\n <EyeOffIcon className=\"h-4 w-4\" strokeWidth={1.5} /> :\n\n <EyeIcon className=\"h-4 w-4\" strokeWidth={1.5} />\n }\n </button>\n }\n </div>\n {helperText &&\n <span\n className={`font-sans text-xs ${error ? 'text-red-500' : 'text-muted'}`}>\n \n {helperText}\n </span>\n }\n </div>);\n\n }\n);\nInput.displayName = 'Input';","import React, { forwardRef } from 'react';\nexport interface TextareaProps extends\n React.TextareaHTMLAttributes<HTMLTextAreaElement> {\n label?: string;\n helperText?: string;\n error?: boolean;\n}\nexport const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(\n ({ label, helperText, error, className = '', disabled, ...props }, ref) => {\n return (\n <div className={`flex w-full flex-col gap-1.5 ${className}`}>\n {label &&\n <label className=\"font-sans text-sm font-medium text-fg\">\n {label}\n </label>\n }\n <textarea\n ref={ref}\n disabled={disabled}\n className={`min-h-[80px] w-full rounded border bg-surface px-3 py-2 font-sans text-sm text-fg placeholder:text-muted transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-1 disabled:cursor-not-allowed disabled:bg-surface-raised disabled:text-muted ${error ? 'border-red-500 focus-visible:border-red-500 focus-visible:ring-red-500' : 'border-border hover:border-border-strong focus-visible:border-accent focus-visible:ring-accent'}`}\n {...props} />\n \n {helperText &&\n <span\n className={`font-sans text-xs ${error ? 'text-red-500' : 'text-muted'}`}>\n \n {helperText}\n </span>\n }\n </div>);\n\n }\n);\nTextarea.displayName = 'Textarea';","import React from 'react';\n\n/** Standard rendering for artifact codes (REQ-/BP-/WO-/CO-, project keys).\n * Condensed grey type — the work-order row style, used everywhere. */\nexport function Code({\n children,\n className = '',\n}: {\n children: React.ReactNode;\n className?: string;\n}) {\n return (\n <span className={`font-condensed text-muted ${className}`}>\n {children}\n </span>\n );\n}\n","import React, { useState } from 'react';\nimport {\n useFloating,\n useHover,\n useFocus,\n useDismiss,\n useRole,\n useInteractions,\n offset,\n flip,\n shift,\n autoUpdate,\n FloatingPortal } from\n'@floating-ui/react';\n\ninterface TooltipProps {\n label: React.ReactNode;\n children: React.ReactNode;\n placement?: 'top' | 'bottom' | 'left' | 'right';\n /** Make the trigger wrapper fill its cell and truncate (for table rows). */\n block?: boolean;\n}\n\n/** Hover/focus tooltip built on floating-ui. */\nexport function Tooltip({ label, children, placement = 'top', block }: TooltipProps) {\n const [open, setOpen] = useState(false);\n const { refs, floatingStyles, context } = useFloating({\n open,\n onOpenChange: setOpen,\n placement,\n middleware: [offset(6), flip({ padding: 8 }), shift({ padding: 8 })],\n whileElementsMounted: autoUpdate\n });\n const hover = useHover(context, { delay: { open: 250, close: 0 }, move: false });\n const focus = useFocus(context);\n const dismiss = useDismiss(context);\n const role = useRole(context, { role: 'tooltip' });\n const { getReferenceProps, getFloatingProps } = useInteractions([\n hover,\n focus,\n dismiss,\n role]\n );\n\n return (\n <>\n <span\n ref={refs.setReference}\n {...getReferenceProps()}\n className={block ? 'block min-w-0 truncate' : 'inline-flex'}>\n\n {children}\n </span>\n {open &&\n <FloatingPortal>\n <div\n ref={refs.setFloating}\n style={floatingStyles}\n {...getFloatingProps()}\n className=\"z-[60] max-w-xs rounded-md bg-black px-2.5 py-1.5 font-sans text-xs font-medium leading-snug text-white shadow-lg\">\n\n {label}\n </div>\n </FloatingPortal>\n }\n </>);\n\n}\n","import React from 'react';\nimport type { LucideIcon } from 'lucide-react';\n\nexport interface TabItem {\n id: string;\n label: string;\n icon?: LucideIcon;\n}\n\ninterface TabsProps {\n items: TabItem[];\n value: string;\n onChange: (id: string) => void;\n className?: string;\n}\n\n/** Controlled, underline-style tab navigation. */\nexport function Tabs({ items, value, onChange, className = '' }: TabsProps) {\n return (\n <div\n role=\"tablist\"\n className={`flex items-center gap-1 border-b border-border-strong ${className}`}>\n\n {items.map((item) => {\n const Icon = item.icon;\n const active = item.id === value;\n return (\n <button\n key={item.id}\n type=\"button\"\n role=\"tab\"\n aria-selected={active}\n onClick={() => onChange(item.id)}\n className={`-mb-px flex items-center gap-2 border-b-2 px-3 py-2.5 font-sans text-sm font-medium transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-1 ${active ? 'border-accent text-accent' : 'border-transparent text-muted hover:text-fg'}`}>\n\n {Icon && <Icon className=\"h-4 w-4\" strokeWidth={1.75} />}\n {item.label}\n </button>);\n\n })}\n </div>);\n\n}\n","import React from 'react';\nimport toast, { Toaster, Toast } from 'react-hot-toast';\nimport {\n CheckCircle2Icon,\n XCircleIcon,\n InfoIcon,\n AlertTriangleIcon,\n XIcon,\n type LucideIcon } from\n'lucide-react';\n\ntype ToastVariant = 'success' | 'error' | 'info' | 'warning';\n\n// Per-variant chrome, mirroring the StatusBadge color system.\nconst VARIANT: Record<\n ToastVariant,\n { Icon: LucideIcon; fill: string; border: string; color: string }> =\n{\n success: {\n Icon: CheckCircle2Icon,\n fill: 'var(--color-success-bg)',\n border: 'var(--color-success-border)',\n color: 'var(--color-success)'\n },\n error: {\n Icon: XCircleIcon,\n fill: 'var(--color-danger-bg)',\n border: 'var(--color-danger-border)',\n color: 'var(--color-danger)'\n },\n info: {\n Icon: InfoIcon,\n fill: 'var(--color-info-bg)',\n border: 'var(--color-info-border)',\n color: 'var(--color-info)'\n },\n warning: {\n Icon: AlertTriangleIcon,\n fill: 'var(--color-warning-bg)',\n border: 'var(--color-warning-border)',\n color: 'var(--color-warning)'\n }\n};\n\ninterface NotifyOptions {\n /** Optional secondary line beneath the title. */\n description?: React.ReactNode;\n /** Override the auto-dismiss duration (ms). */\n duration?: number;\n}\n\nfunction ToastCard({\n t,\n variant,\n title,\n description\n}: {\n t: Toast;\n variant: ToastVariant;\n title: React.ReactNode;\n description?: React.ReactNode;\n}) {\n const { Icon, fill, border, color } = VARIANT[variant];\n return (\n <div\n className={`pointer-events-auto flex w-full max-w-sm items-start gap-3 rounded-lg border border-border-strong bg-surface px-4 py-3 font-sans shadow-lg transition-all duration-200 ${t.visible ? 'translate-y-0 opacity-100' : '-translate-y-1 opacity-0'}`}\n role=\"status\">\n\n <span\n className=\"mt-0.5 flex h-7 w-7 flex-shrink-0 items-center justify-center rounded-full border\"\n style={{ backgroundColor: fill, borderColor: border, color }}\n aria-hidden=\"true\">\n\n <Icon className=\"h-4 w-4\" strokeWidth={1.5} />\n </span>\n <div className=\"min-w-0 flex-1 pt-0.5\">\n <p className=\"font-sans text-sm font-semibold text-fg\">{title}</p>\n {description &&\n <p className=\"mt-0.5 font-sans text-sm leading-snug text-fg-secondary\">\n {description}\n </p>\n }\n </div>\n <button\n type=\"button\"\n onClick={() => toast.dismiss(t.id)}\n aria-label=\"Dismiss\"\n className=\"-mr-1 flex h-6 w-6 flex-shrink-0 items-center justify-center rounded text-muted transition-colors hover:bg-surface-raised hover:text-fg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent\">\n\n <XIcon className=\"h-3.5 w-3.5\" strokeWidth={2} />\n </button>\n </div>);\n\n}\n\nfunction show(variant: ToastVariant, title: React.ReactNode, options: NotifyOptions = {}) {\n return toast.custom(\n (t) =>\n <ToastCard\n t={t}\n variant={variant}\n title={title}\n description={options.description} />,\n\n { duration: options.duration }\n );\n}\n\n/** Styled, design-system toast helpers. */\nexport const notify = {\n success: (title: React.ReactNode, options?: NotifyOptions) =>\n show('success', title, options),\n error: (title: React.ReactNode, options?: NotifyOptions) =>\n show('error', title, options),\n info: (title: React.ReactNode, options?: NotifyOptions) =>\n show('info', title, options),\n warning: (title: React.ReactNode, options?: NotifyOptions) =>\n show('warning', title, options),\n dismiss: (id?: string) => toast.dismiss(id)\n};\n\n/** Mount once near the app root so toasts render on every route. */\nexport function AppToaster() {\n return (\n <Toaster\n position=\"bottom-right\"\n gutter={12}\n toastOptions={{ duration: 4000 }} />);\n\n}\n","import React from 'react';\nimport {\n ScanSearchIcon,\n CircleDashedIcon,\n Clock4Icon,\n CheckCircle2Icon,\n BanIcon,\n PlayCircleIcon,\n CircleDotIcon,\n ArchiveIcon } from\n'lucide-react';\nexport type StatusType =\n'in-review' |\n'in-progress' |\n'backlog' |\n'completed' |\n'blocked' |\n'ready';\n/** Project lifecycle — distinct from artifact StatusType, rendered by the same badge. */\nexport type ProjectStatus = 'active' | 'archived';\n/** Plan statuses for Requirements & Blueprints — distinct from execution StatusType. */\nexport type PlanStatusType = 'backlog' | 'scoped' | 'cancelled';\ninterface StatusBadgeProps {\n status: StatusType | ProjectStatus | PlanStatusType;\n}\n// Ordered along the SDLC lifecycle — this key order drives the kanban columns\n// and table grouping (STATUS_ORDER derives from it).\nexport const STATUS_CONFIG = {\n backlog: {\n label: 'Backlog',\n Icon: Clock4Icon,\n fill: 'var(--color-neutral-bg)',\n border: 'var(--color-neutral-border)',\n color: 'var(--color-neutral)'\n },\n ready: {\n label: 'Ready',\n Icon: PlayCircleIcon,\n fill: 'var(--color-info-bg)',\n border: 'var(--color-info-border)',\n color: 'var(--color-info)'\n },\n 'in-progress': {\n label: 'In progress',\n Icon: CircleDashedIcon,\n fill: 'var(--color-warning-bg)',\n border: 'var(--color-warning-border)',\n color: 'var(--color-warning)'\n },\n 'in-review': {\n label: 'In Review',\n Icon: ScanSearchIcon,\n fill: 'var(--color-review-bg)',\n border: 'var(--color-review-border)',\n color: 'var(--color-review)'\n },\n blocked: {\n label: 'Blocked',\n Icon: BanIcon,\n fill: 'var(--color-danger-bg)',\n border: 'var(--color-danger-border)',\n color: 'var(--color-danger)'\n },\n completed: {\n label: 'Completed',\n Icon: CheckCircle2Icon,\n fill: 'var(--color-success-bg)',\n border: 'var(--color-success-border)',\n color: 'var(--color-success)'\n }\n} as const;\n/** Project lifecycle statuses — kept separate from STATUS_CONFIG so artifact\n * grouping/boards (which derive columns from STATUS_CONFIG) are unaffected. */\nexport const PROJECT_STATUS_CONFIG = {\n active: {\n label: 'Active',\n Icon: CircleDotIcon,\n fill: 'var(--color-success-bg)',\n border: 'var(--color-success-border)',\n color: 'var(--color-success)'\n },\n archived: {\n label: 'Archived',\n Icon: ArchiveIcon,\n fill: 'var(--color-neutral-bg)',\n border: 'var(--color-neutral-border)',\n color: 'var(--color-neutral)'\n }\n} as const;\n/** Plan statuses — kept separate from STATUS_CONFIG so artifact execution\n * grouping/boards (which derive columns from STATUS_CONFIG) are unaffected.\n * Used by Requirements & Blueprints. */\nexport const PLAN_STATUS_CONFIG = {\n backlog: {\n label: 'Backlog',\n Icon: Clock4Icon,\n fill: 'var(--color-neutral-bg)',\n border: 'var(--color-neutral-border)',\n color: 'var(--color-neutral)'\n },\n scoped: {\n label: 'Scoped',\n Icon: ScanSearchIcon,\n fill: 'var(--color-info-bg)',\n border: 'var(--color-info-border)',\n color: 'var(--color-info)'\n },\n cancelled: {\n label: 'Cancelled',\n Icon: BanIcon,\n fill: 'var(--color-danger-bg)',\n border: 'var(--color-danger-border)',\n color: 'var(--color-danger)'\n }\n} as const;\n/** Canonical plan-status order for grouping (columns/sections). */\nexport const PLAN_STATUS_ORDER = ['backlog', 'scoped', 'cancelled'] as PlanStatusType[];\nconst ALL_STATUS_CONFIG = { ...STATUS_CONFIG, ...PROJECT_STATUS_CONFIG, ...PLAN_STATUS_CONFIG };\nexport function StatusBadge({ status }: StatusBadgeProps) {\n const { label, Icon, fill, border, color } = ALL_STATUS_CONFIG[status];\n return (\n <span\n className=\"inline-flex items-center gap-1.5 rounded border px-2 py-1 font-condensed text-xs font-medium leading-[15px]\"\n style={{\n backgroundColor: fill,\n borderColor: border,\n color\n }}>\n \n <Icon className=\"h-3.5 w-3.5\" strokeWidth={1.5} aria-hidden=\"true\" />\n {label}\n </span>);\n\n}","import React from 'react';\nimport type { LucideIcon } from 'lucide-react';\n\nexport interface EmptyStateTone {\n /** Medallion background. */\n bg: string;\n /** Medallion border color. */\n border: string;\n /** Icon color. */\n color: string;\n}\n\nconst NEUTRAL_TONE: EmptyStateTone = {\n bg: 'var(--color-surface-strong)',\n border: 'var(--color-border-strong)',\n color: 'var(--color-text-muted)'\n};\n\ninterface EmptyStateProps {\n icon: LucideIcon;\n title: React.ReactNode;\n description?: React.ReactNode;\n /** Optional action(s) rendered below the copy, e.g. a Button. */\n action?: React.ReactNode;\n /** Color treatment for the icon medallion. Defaults to neutral gray. */\n tone?: EmptyStateTone;\n className?: string;\n}\n\n/**\n * Centered empty / placeholder state: an icon medallion, a title, supporting\n * copy, and an optional action. Fills the height of its container so it sits\n * dead-center in a page or panel.\n */\nexport function EmptyState({\n icon: Icon,\n title,\n description,\n action,\n tone = NEUTRAL_TONE,\n className = ''\n}: EmptyStateProps) {\n return (\n <div\n className={`flex h-full min-h-[360px] w-full flex-col items-center justify-center px-6 py-12 text-center ${className}`}>\n\n {/* Medallion with a soft halo ring for depth */}\n <div className=\"relative mb-5 flex items-center justify-center\">\n <span\n className=\"absolute h-20 w-20 rounded-3xl opacity-60\"\n style={{ backgroundColor: tone.bg }}\n aria-hidden=\"true\" />\n\n <span\n className=\"relative flex h-14 w-14 items-center justify-center rounded-2xl border shadow-[0px_1px_2px_rgba(0,0,0,0.06)]\"\n style={{\n backgroundColor: 'var(--color-surface)',\n borderColor: tone.border,\n color: tone.color\n }}\n aria-hidden=\"true\">\n\n <Icon className=\"h-6 w-6\" strokeWidth={1.5} />\n </span>\n </div>\n\n <h2 className=\"font-sans text-lg font-semibold tracking-tight text-fg\">\n {title}\n </h2>\n {description &&\n <p className=\"mt-2 max-w-sm font-sans text-sm leading-relaxed text-muted\">\n {description}\n </p>\n }\n {action && <div className=\"mt-6\">{action}</div>}\n </div>);\n\n}\n","import React from 'react';\n\ninterface FormSectionProps {\n title?: string;\n description?: string;\n children: React.ReactNode;\n className?: string;\n}\n\n/** Titled fieldset grouping a vertical stack of fields. */\nexport function FormSection({\n title,\n description,\n children,\n className = ''\n}: FormSectionProps) {\n return (\n <section className={`flex flex-col gap-4 ${className}`}>\n {(title || description) &&\n <div>\n {title &&\n <h3 className=\"font-sans text-sm font-semibold text-fg\">{title}</h3>}\n {description &&\n <p className=\"mt-0.5 font-sans text-sm text-muted\">{description}</p>}\n </div>\n }\n <div className=\"flex flex-col gap-4\">{children}</div>\n </section>);\n\n}\n\ninterface FieldProps {\n label: string;\n htmlFor?: string;\n help?: React.ReactNode;\n error?: React.ReactNode;\n children: React.ReactNode;\n}\n\n/** A single labeled field row with optional help / error text. */\nexport function Field({ label, htmlFor, help, error, children }: FieldProps) {\n return (\n <div className=\"flex flex-col gap-1.5\">\n <label\n htmlFor={htmlFor}\n className=\"font-sans text-sm font-medium text-fg\">\n\n {label}\n </label>\n {children}\n {error ?\n <span className=\"font-sans text-xs text-red-500\">{error}</span> :\n help ?\n <span className=\"font-sans text-xs text-muted\">{help}</span> :\n null}\n </div>);\n\n}\n","import React from 'react';\nimport { CheckIcon, Loader2Icon } from 'lucide-react';\n\nexport type DirtyState = 'clean' | 'dirty' | 'saving' | 'saved';\n\nconst CONFIG: Record<\n DirtyState,\n { label: string; className: string } | null> =\n{\n clean: null,\n dirty: { label: 'Unsaved changes', className: 'text-warning' },\n saving: { label: 'Saving…', className: 'text-muted' },\n saved: { label: 'Saved', className: 'text-success' }\n};\n\n/** Small status pill reflecting an editor's save state. */\nexport function DirtyStateIndicator({ state }: { state: DirtyState }) {\n const config = CONFIG[state];\n if (!config) return null;\n return (\n <span\n className={`flex items-center gap-1.5 font-sans text-xs font-medium ${config.className}`}\n aria-live=\"polite\">\n\n {state === 'saving' &&\n <Loader2Icon className=\"h-3.5 w-3.5 animate-spin\" strokeWidth={2} />}\n {state === 'saved' && <CheckIcon className=\"h-3.5 w-3.5\" strokeWidth={2.5} />}\n {state === 'dirty' &&\n <span className=\"h-1.5 w-1.5 rounded-full bg-warning\" aria-hidden=\"true\" />}\n {config.label}\n </span>);\n\n}\n","import React from 'react';\n\nexport interface RowAction {\n icon: React.ElementType;\n label: string;\n onClick: () => void;\n /** Render in a destructive (red) hover state. */\n danger?: boolean;\n}\n\n/**\n * Standard trailing row actions — a group of icon buttons revealed on row\n * hover. Used in every table row and the phases list so actions look and\n * behave identically everywhere. The parent row must have the `group` class.\n */\nexport function RowActions({ actions }: { actions: RowAction[] }) {\n return (\n <div className=\"flex items-center justify-end gap-0.5\">\n {actions.map((a) => (\n <button\n key={a.label}\n type=\"button\"\n aria-label={a.label}\n title={a.label}\n onClick={(e) => {\n e.stopPropagation();\n a.onClick();\n }}\n className={`rounded p-1.5 text-muted transition-colors ${\n a.danger\n ? 'hover:bg-danger-bg hover:text-danger'\n : 'hover:bg-surface-raised hover:text-fg'\n }`}>\n <a.icon className=\"h-4 w-4\" strokeWidth={1.75} />\n </button>\n ))}\n </div>\n );\n}\n","import React from 'react';\nimport ReactMarkdown from 'react-markdown';\nimport remarkGfm from 'remark-gfm';\n\n/** Renders markdown with design-system typography. */\nexport function Markdown({ children }: { children: string }) {\n return (\n <div\n className={[\n 'font-sans text-[15px] leading-7 text-fg-secondary',\n '[&>*:first-child]:mt-0 [&>*:last-child]:mb-0',\n '[&_p]:my-3',\n '[&_h1]:mb-3 [&_h1]:mt-8 [&_h1]:text-2xl [&_h1]:font-bold [&_h1]:leading-snug [&_h1]:text-fg',\n '[&_h2]:mb-2.5 [&_h2]:mt-8 [&_h2]:text-xl [&_h2]:font-semibold [&_h2]:leading-snug [&_h2]:text-fg',\n '[&_h3]:mb-2 [&_h3]:mt-6 [&_h3]:text-base [&_h3]:font-semibold [&_h3]:text-fg',\n '[&_ul]:my-3.5 [&_ul]:list-disc [&_ul]:pl-6 [&_ol]:my-3.5 [&_ol]:list-decimal [&_ol]:pl-6',\n '[&_li]:my-1.5 [&_li]:pl-1.5 [&_li>p]:my-0',\n '[&_a]:text-accent [&_a]:underline [&_a]:underline-offset-2 [&_strong]:font-semibold [&_strong]:text-fg',\n '[&_blockquote]:my-4 [&_blockquote]:border-l-2 [&_blockquote]:border-accent [&_blockquote]:pl-4 [&_blockquote]:text-fg-secondary',\n '[&_code]:rounded [&_code]:bg-surface-strong [&_code]:px-1.5 [&_code]:py-0.5 [&_code]:font-mono [&_code]:text-[13px] [&_code]:text-fg-secondary',\n '[&_pre]:my-4 [&_pre]:overflow-x-auto [&_pre]:rounded-lg [&_pre]:bg-surface-raised [&_pre]:p-4 [&_pre_code]:bg-transparent [&_pre_code]:p-0',\n '[&_hr]:my-7 [&_hr]:border-border-strong',\n '[&_table]:my-4 [&_table]:w-full [&_table]:border-collapse [&_td]:border [&_td]:border-border-strong [&_td]:px-3 [&_td]:py-1.5 [&_th]:border [&_th]:border-border-strong [&_th]:bg-surface-raised [&_th]:px-3 [&_th]:py-1.5 [&_th]:text-left [&_th]:font-semibold',\n ].join(' ')}>\n <ReactMarkdown remarkPlugins={[remarkGfm]}>{children}</ReactMarkdown>\n </div>);\n\n}\n","import React from 'react';\nimport { Overlay } from './Overlay';\n\ntype Size = 'sm' | 'md' | 'lg';\n\ninterface ModalProps {\n open: boolean;\n onClose: () => void;\n title?: React.ReactNode;\n description?: React.ReactNode;\n footer?: React.ReactNode;\n size?: Size;\n hideCloseButton?: boolean;\n closeOnBackdrop?: boolean;\n closeOnEsc?: boolean;\n children: React.ReactNode;\n}\n\nconst SIZES: Record<Size, string> = {\n sm: 'max-w-sm',\n md: 'max-w-lg',\n lg: 'max-w-2xl'\n};\n\n/** Centered modal dialog with header / body / footer slots. */\nexport function Modal({\n open,\n onClose,\n title,\n description,\n footer,\n size = 'md',\n hideCloseButton,\n closeOnBackdrop,\n closeOnEsc,\n children\n}: ModalProps) {\n return (\n <Overlay\n open={open}\n onClose={onClose}\n position=\"center\"\n widthClassName={SIZES[size]}\n title={title}\n description={description}\n footer={footer}\n hideCloseButton={hideCloseButton}\n closeOnBackdrop={closeOnBackdrop}\n closeOnEsc={closeOnEsc}>\n\n {children}\n </Overlay>);\n\n}\n","import React from 'react';\nimport { Overlay } from './Overlay';\n\ntype Size = 'sm' | 'md' | 'lg';\n\ninterface DrawerProps {\n open: boolean;\n onClose: () => void;\n side?: 'right' | 'left';\n title?: React.ReactNode;\n description?: React.ReactNode;\n footer?: React.ReactNode;\n size?: Size;\n hideCloseButton?: boolean;\n closeOnBackdrop?: boolean;\n closeOnEsc?: boolean;\n children: React.ReactNode;\n}\n\nconst SIZES: Record<Size, string> = {\n sm: 'max-w-sm',\n md: 'max-w-md',\n lg: 'max-w-lg'\n};\n\n/** Side panel that slides in from the left or right edge. */\nexport function Drawer({\n open,\n onClose,\n side = 'right',\n title,\n description,\n footer,\n size = 'md',\n hideCloseButton,\n closeOnBackdrop,\n closeOnEsc,\n children\n}: DrawerProps) {\n return (\n <Overlay\n open={open}\n onClose={onClose}\n position={side}\n widthClassName={SIZES[size]}\n title={title}\n description={description}\n footer={footer}\n hideCloseButton={hideCloseButton}\n closeOnBackdrop={closeOnBackdrop}\n closeOnEsc={closeOnEsc}>\n\n {children}\n </Overlay>);\n\n}\n","import React from 'react';\nimport { AlertTriangleIcon } from 'lucide-react';\nimport { Modal } from './Modal';\nimport { Button } from './Button';\n\ninterface ConfirmDialogProps {\n open: boolean;\n onClose: () => void;\n title: string;\n message: React.ReactNode;\n confirmLabel?: string;\n cancelLabel?: string;\n onConfirm: () => void;\n variant?: 'default' | 'destructive';\n loading?: boolean;\n}\n\n/** Opinionated confirmation dialog built on Modal. */\nexport function ConfirmDialog({\n open,\n onClose,\n title,\n message,\n confirmLabel = 'Confirm',\n cancelLabel = 'Cancel',\n onConfirm,\n variant = 'default',\n loading = false\n}: ConfirmDialogProps) {\n const destructive = variant === 'destructive';\n return (\n <Modal\n open={open}\n onClose={onClose}\n size=\"sm\"\n title={title}\n footer={\n <>\n <Button variant=\"secondary\" onClick={onClose} disabled={loading}>\n {cancelLabel}\n </Button>\n <Button\n variant={destructive ? 'destructive' : 'primary'}\n onClick={onConfirm}\n disabled={loading}>\n\n {loading ? 'Working…' : confirmLabel}\n </Button>\n </>\n }>\n\n <div className=\"flex items-start gap-3\">\n {destructive &&\n <span className=\"flex h-9 w-9 flex-shrink-0 items-center justify-center rounded-full bg-danger-bg text-danger\">\n <AlertTriangleIcon\n className=\"h-5 w-5\"\n strokeWidth={2}\n aria-hidden=\"true\" />\n\n </span>\n }\n <p className=\"font-sans text-sm leading-relaxed text-fg-secondary\">\n {message}\n </p>\n </div>\n </Modal>);\n\n}\n","import React from 'react';\nimport { Button } from './Button';\nimport { DirtyStateIndicator, type DirtyState } from './DirtyStateIndicator';\n\ninterface SaveBarProps {\n dirty: boolean;\n onSave: () => void;\n onDiscard: () => void;\n state?: DirtyState;\n saveLabel?: string;\n discardLabel?: string;\n}\n\n/** Sticky action bar: Save (disabled until dirty) + Discard, with a state pill. */\nexport function SaveBar({\n dirty,\n onSave,\n onDiscard,\n state,\n saveLabel = 'Save',\n discardLabel = 'Discard'\n}: SaveBarProps) {\n const resolvedState: DirtyState = state ?? (dirty ? 'dirty' : 'clean');\n return (\n <div className=\"sticky bottom-0 z-10 flex items-center justify-between gap-4 border-t border-border-strong bg-surface px-1 py-3 backdrop-blur\">\n <DirtyStateIndicator state={resolvedState} />\n <div className=\"flex items-center gap-3\">\n <Button variant=\"secondary\" onClick={onDiscard} disabled={!dirty}>\n {discardLabel}\n </Button>\n <Button onClick={onSave} disabled={!dirty}>\n {saveLabel}\n </Button>\n </div>\n </div>);\n\n}\n","import { useEffect, useRef, type CSSProperties } from 'react';\nimport {\n useFloating,\n autoUpdate,\n offset,\n flip,\n shift,\n size,\n useDismiss,\n useRole,\n useInteractions,\n type Placement,\n type ExtendedRefs,\n type FloatingContext,\n type ReferenceType,\n type UseInteractionsReturn } from\n'@floating-ui/react';\n\n// App-wide guarantee: at most one usePopover-driven dropdown is open at a time.\n// Opening one closes whichever was open before.\nlet activeClose: (() => void) | null = null;\n\ninterface UsePopoverOptions {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n placement?: Placement;\n /** Distance in px between the trigger and the floating panel. */\n gap?: number;\n /** When true, the floating panel is constrained to (and matches) the trigger width. */\n matchWidth?: boolean;\n role?: 'menu' | 'listbox' | 'dialog';\n}\n\n/**\n * Shared, collision-aware popover positioning built on Floating UI.\n *\n * Provides flip (open upward when there's no room below), shift (stay in the\n * viewport horizontally), and size (cap the panel height to available space and\n * optionally match the trigger width). Also wires escape + outside-press dismissal.\n *\n * Spread getReferenceProps() on the trigger and getFloatingProps() on the panel,\n * attach refs.setReference / refs.setFloating, and apply floatingStyles to the panel.\n */\nexport function usePopover({\n open,\n onOpenChange,\n placement = 'bottom-start',\n gap = 6,\n matchWidth = false,\n role = 'menu'\n}: UsePopoverOptions): {\n refs: ExtendedRefs<ReferenceType>;\n floatingStyles: CSSProperties;\n context: FloatingContext<ReferenceType>;\n getReferenceProps: UseInteractionsReturn['getReferenceProps'];\n getFloatingProps: UseInteractionsReturn['getFloatingProps'];\n} {\n const { refs, floatingStyles, context } = useFloating({\n open,\n onOpenChange,\n placement,\n whileElementsMounted: autoUpdate,\n middleware: [\n offset(gap),\n flip({ padding: 8 }),\n shift({ padding: 8 }),\n size({\n padding: 8,\n apply({ availableHeight, rects, elements }) {\n Object.assign(elements.floating.style, {\n maxHeight: `${Math.max(160, availableHeight)}px`,\n ...(matchWidth ? { width: `${rects.reference.width}px` } : {})\n });\n }\n })]\n\n });\n\n // Coordinate single-open behavior across all popovers. Keep a stable closer\n // per instance so opening this one closes any other that's currently open.\n const onOpenChangeRef = useRef(onOpenChange);\n onOpenChangeRef.current = onOpenChange;\n const closeSelfRef = useRef<() => void>();\n if (!closeSelfRef.current) {\n closeSelfRef.current = () => onOpenChangeRef.current(false);\n }\n useEffect(() => {\n if (!open) return;\n if (activeClose && activeClose !== closeSelfRef.current) {\n activeClose();\n }\n activeClose = closeSelfRef.current!;\n return () => {\n if (activeClose === closeSelfRef.current) activeClose = null;\n };\n }, [open]);\n\n const dismiss = useDismiss(context, { outsidePress: true });\n const roleInteraction = useRole(context, { role });\n\n const { getReferenceProps, getFloatingProps } = useInteractions([\n dismiss,\n roleInteraction]\n );\n\n return {\n refs,\n floatingStyles,\n context,\n getReferenceProps,\n getFloatingProps\n };\n}","import React, { useState, Children, cloneElement, isValidElement, type ReactNode } from 'react';\nimport { AnimatePresence, motion } from 'framer-motion';\nimport { FloatingPortal } from '@floating-ui/react';\nimport { usePopover } from '../hooks/usePopover';\ninterface DropdownProps {\n trigger: ReactNode;\n children: ReactNode;\n align?: 'left' | 'right';\n className?: string;\n}\nexport function Dropdown({\n trigger,\n children,\n align = 'left',\n className = ''\n}: DropdownProps) {\n const [isOpen, setIsOpen] = useState(false);\n const { refs, floatingStyles, context, getReferenceProps, getFloatingProps } =\n usePopover({\n open: isOpen,\n onOpenChange: setIsOpen,\n placement: align === 'right' ? 'bottom-end' : 'bottom-start',\n role: 'menu'\n });\n return (\n <div className={`relative inline-block text-left ${className}`}>\n <div\n ref={refs.setReference}\n {...getReferenceProps({\n onClick: () => setIsOpen((o) => !o)\n })}\n className=\"inline-block\">\n \n {trigger}\n </div>\n\n <FloatingPortal>\n <AnimatePresence>\n {isOpen &&\n <div\n ref={refs.setFloating}\n style={floatingStyles}\n {...getFloatingProps()}\n className=\"z-50\">\n \n <motion.div\n initial={{\n opacity: 0,\n y: -4,\n scale: 0.98\n }}\n animate={{\n opacity: 1,\n y: 0,\n scale: 1\n }}\n exit={{\n opacity: 0,\n y: -4,\n scale: 0.98\n }}\n transition={{\n duration: 0.15,\n ease: 'easeOut'\n }}\n className=\"min-w-[200px] overflow-auto rounded-md border border-border bg-surface py-1 shadow-lg\">\n \n {/* Clone children so they close the menu on click */}\n {Children.map(children, (child) => {\n if (isValidElement(child)) {\n return cloneElement(child as React.ReactElement<any>, {\n onClick: (e: React.MouseEvent) => {\n if (child.props.onClick) child.props.onClick(e);\n setIsOpen(false);\n }\n });\n }\n return child;\n })}\n </motion.div>\n </div>\n }\n </AnimatePresence>\n </FloatingPortal>\n </div>);\n\n}\ninterface DropdownItemProps extends\n React.ButtonHTMLAttributes<HTMLButtonElement> {\n children: ReactNode;\n icon?: React.ElementType;\n danger?: boolean;\n}\nexport function DropdownItem({\n children,\n icon: Icon,\n danger,\n className = '',\n ...props\n}: DropdownItemProps) {\n return (\n <button\n type=\"button\"\n role=\"menuitem\"\n className={`flex w-full items-center gap-2 px-4 py-2 text-left font-sans text-sm transition-colors hover:bg-surface-raised focus:bg-surface-raised focus:outline-none ${danger ? 'text-red-600' : 'text-fg'} ${className}`}\n {...props}>\n \n {Icon && <Icon className=\"h-4 w-4\" strokeWidth={1.5} />}\n {children}\n </button>);\n\n}","import React, { useState } from 'react';\nimport { ChevronDownIcon, CheckIcon } from 'lucide-react';\nimport { AnimatePresence, motion } from 'framer-motion';\nimport { FloatingPortal } from '@floating-ui/react';\nimport { usePopover } from '../hooks/usePopover';\nexport interface SelectOption {\n value: string;\n label: string;\n}\nexport interface SelectProps {\n label?: string;\n placeholder?: string;\n options: SelectOption[];\n value?: string;\n onChange?: (value: string) => void;\n error?: boolean;\n helperText?: string;\n disabled?: boolean;\n className?: string;\n}\nexport function Select({\n label,\n placeholder = 'Select an option',\n options,\n value,\n onChange,\n error,\n helperText,\n disabled,\n className = ''\n}: SelectProps) {\n const [isOpen, setIsOpen] = useState(false);\n const { refs, floatingStyles, getReferenceProps, getFloatingProps } =\n usePopover({\n open: isOpen,\n onOpenChange: setIsOpen,\n placement: 'bottom-start',\n matchWidth: true,\n role: 'listbox'\n });\n const selectedOption = options.find((opt) => opt.value === value);\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (disabled) return;\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n setIsOpen(!isOpen);\n } else if (e.key === 'Escape') {\n setIsOpen(false);\n }\n };\n const handleSelect = (val: string) => {\n onChange?.(val);\n setIsOpen(false);\n };\n return (\n <div className={`flex w-full flex-col gap-1.5 ${className}`}>\n {label &&\n <label className=\"font-sans text-sm font-medium text-fg\">\n {label}\n </label>\n }\n <button\n ref={refs.setReference}\n type=\"button\"\n disabled={disabled}\n aria-haspopup=\"listbox\"\n aria-expanded={isOpen}\n {...getReferenceProps({\n onClick: () => !disabled && setIsOpen((o) => !o),\n onKeyDown: handleKeyDown\n })}\n className={`flex w-full items-center justify-between rounded border bg-surface px-3 py-2 text-left font-sans text-sm transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-1 disabled:cursor-not-allowed disabled:bg-surface-raised disabled:text-muted ${error ? 'border-red-500 focus-visible:border-red-500 focus-visible:ring-red-500' : 'border-border hover:border-border-strong focus-visible:border-accent focus-visible:ring-accent'}`}>\n \n <span className={selectedOption ? 'text-fg' : 'text-muted'}>\n {selectedOption ? selectedOption.label : placeholder}\n </span>\n <ChevronDownIcon\n className={`h-4 w-4 text-muted transition-transform duration-200 ${isOpen ? 'rotate-180' : ''}`}\n strokeWidth={1.5} />\n \n </button>\n\n <FloatingPortal>\n <AnimatePresence>\n {isOpen &&\n <div\n ref={refs.setFloating}\n style={floatingStyles}\n {...getFloatingProps()}\n className=\"z-50\">\n \n <motion.ul\n role=\"listbox\"\n initial={{\n opacity: 0,\n y: -4,\n scale: 0.98\n }}\n animate={{\n opacity: 1,\n y: 0,\n scale: 1\n }}\n exit={{\n opacity: 0,\n y: -4,\n scale: 0.98\n }}\n transition={{\n duration: 0.15,\n ease: 'easeOut'\n }}\n className=\"overflow-auto rounded-md border border-border bg-surface py-1 shadow-lg focus:outline-none\">\n \n {options.map((option) =>\n <li\n key={option.value}\n role=\"option\"\n aria-selected={value === option.value}\n onClick={() => handleSelect(option.value)}\n className={`relative flex cursor-pointer select-none items-center py-2 pl-3 pr-9 font-sans text-sm transition-colors hover:bg-surface-raised ${value === option.value ? 'bg-surface-raised font-medium text-accent' : 'text-fg'}`}>\n \n <span className=\"block truncate\">{option.label}</span>\n {value === option.value &&\n <span className=\"absolute inset-y-0 right-0 flex items-center pr-3 text-accent\">\n <CheckIcon className=\"h-4 w-4\" strokeWidth={2} />\n </span>\n }\n </li>\n )}\n </motion.ul>\n </div>\n }\n </AnimatePresence>\n </FloatingPortal>\n {helperText &&\n <span\n className={`font-sans text-xs ${error ? 'text-red-500' : 'text-muted'}`}>\n \n {helperText}\n </span>\n }\n </div>);\n\n}","import React, { useEffect, useRef, useState } from 'react';\nimport { ChevronDownIcon, CheckIcon, SearchIcon } from 'lucide-react';\nimport { AnimatePresence, motion } from 'framer-motion';\nimport { FloatingPortal } from '@floating-ui/react';\nimport { usePopover } from '../hooks/usePopover';\n\nexport interface ComboboxOption {\n value: string;\n label: string;\n}\nexport interface ComboboxProps {\n label?: string;\n placeholder?: string;\n options: ComboboxOption[];\n value?: string;\n onChange?: (value: string) => void;\n error?: boolean;\n helperText?: string;\n disabled?: boolean;\n className?: string;\n}\n\n/**\n * Searchable single-select, built on the shared usePopover (collision-aware\n * positioning + outside-press / escape dismissal + single-open guarantee).\n */\nexport function Combobox({\n label,\n placeholder = 'Search...',\n options,\n value,\n onChange,\n error,\n helperText,\n disabled,\n className = ''\n}: ComboboxProps) {\n const [isOpen, setIsOpen] = useState(false);\n const [query, setQuery] = useState('');\n const inputRef = useRef<HTMLInputElement>(null);\n const { refs, floatingStyles, getReferenceProps, getFloatingProps } =\n usePopover({\n open: isOpen,\n onOpenChange: (next) => {\n setIsOpen(next);\n if (!next) setQuery('');\n },\n placement: 'bottom-start',\n matchWidth: true,\n role: 'listbox'\n });\n\n useEffect(() => {\n if (isOpen) inputRef.current?.focus();\n }, [isOpen]);\n\n const selectedOption = options.find((opt) => opt.value === value);\n const filteredOptions =\n query === ''\n ? options\n : options.filter((option) =>\n option.label.toLowerCase().includes(query.toLowerCase())\n );\n\n const handleSelect = (val: string) => {\n onChange?.(val);\n setIsOpen(false);\n setQuery('');\n };\n\n return (\n <div className={`flex w-full flex-col gap-1.5 ${className}`}>\n {label &&\n <label className=\"font-sans text-sm font-medium text-fg\">\n {label}\n </label>\n }\n <button\n ref={refs.setReference}\n type=\"button\"\n disabled={disabled}\n aria-haspopup=\"listbox\"\n aria-expanded={isOpen}\n {...getReferenceProps({\n onClick: () => !disabled && setIsOpen((o) => !o)\n })}\n className={`flex w-full items-center justify-between rounded border bg-surface px-3 py-2 text-left font-sans text-sm transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-1 disabled:cursor-not-allowed disabled:bg-surface-raised disabled:text-muted ${error ? 'border-red-500 focus-visible:ring-red-500' : 'border-border hover:border-border-strong focus-visible:border-accent focus-visible:ring-accent'}`}>\n\n <span className={selectedOption ? 'text-fg' : 'text-muted'}>\n {selectedOption ? selectedOption.label : placeholder}\n </span>\n <ChevronDownIcon\n className={`h-4 w-4 text-muted transition-transform duration-200 ${isOpen ? 'rotate-180' : ''}`}\n strokeWidth={1.5} />\n\n </button>\n\n <FloatingPortal>\n <AnimatePresence>\n {isOpen &&\n <div\n ref={refs.setFloating}\n style={floatingStyles}\n {...getFloatingProps()}\n className=\"z-50\">\n\n <motion.div\n initial={{ opacity: 0, y: -4, scale: 0.98 }}\n animate={{ opacity: 1, y: 0, scale: 1 }}\n exit={{ opacity: 0, y: -4, scale: 0.98 }}\n transition={{ duration: 0.15, ease: 'easeOut' }}\n className=\"overflow-hidden rounded-md border border-border bg-surface shadow-lg\">\n\n <div className=\"flex items-center gap-2 border-b border-border px-3 py-2\">\n <SearchIcon className=\"h-4 w-4 flex-shrink-0 text-muted\" strokeWidth={1.5} />\n <input\n ref={inputRef}\n type=\"text\"\n className=\"w-full bg-transparent p-0 font-sans text-sm text-fg placeholder:text-muted focus:outline-none\"\n placeholder={placeholder}\n value={query}\n onChange={(e) => setQuery(e.target.value)} />\n\n </div>\n <ul role=\"listbox\" className=\"max-h-60 overflow-auto py-1\">\n {filteredOptions.length === 0 ?\n <li className=\"px-3 py-2 font-sans text-sm text-muted\">\n No results found.\n </li> :\n\n filteredOptions.map((option) =>\n <li\n key={option.value}\n role=\"option\"\n aria-selected={value === option.value}\n onClick={() => handleSelect(option.value)}\n className={`relative flex cursor-pointer select-none items-center py-2 pl-3 pr-9 font-sans text-sm transition-colors hover:bg-surface-raised ${value === option.value ? 'bg-surface-raised font-medium text-accent' : 'text-fg'}`}>\n\n <span className=\"block truncate\">{option.label}</span>\n {value === option.value &&\n <span className=\"absolute inset-y-0 right-0 flex items-center pr-3 text-accent\">\n <CheckIcon className=\"h-4 w-4\" strokeWidth={2} />\n </span>\n }\n </li>\n )\n }\n </ul>\n </motion.div>\n </div>\n }\n </AnimatePresence>\n </FloatingPortal>\n {helperText &&\n <span\n className={`font-sans text-xs ${error ? 'text-red-500' : 'text-muted'}`}>\n\n {helperText}\n </span>\n }\n </div>);\n\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/theme/theme.ts","../src/theme/ThemeProvider.tsx","../src/theme/ThemeToggle.tsx","../src/components/Button.tsx","../src/components/Overlay.tsx","../src/components/Avatar.tsx","../src/components/Input.tsx","../src/components/Textarea.tsx","../src/components/Code.tsx","../src/components/Tooltip.tsx","../src/components/Tabs.tsx","../src/components/Toast.tsx","../src/components/StatusBadge.tsx","../src/components/EmptyState.tsx","../src/components/FormSection.tsx","../src/components/DirtyStateIndicator.tsx","../src/components/RowActions.tsx","../src/components/Markdown.tsx","../src/components/Modal.tsx","../src/components/Drawer.tsx","../src/components/ConfirmDialog.tsx","../src/components/SaveBar.tsx","../src/hooks/usePopover.ts","../src/components/Dropdown.tsx","../src/components/Select.tsx","../src/components/Combobox.tsx","../src/components/Filters.tsx","../src/components/DataTable.tsx","../src/components/Breadcrumbs.tsx"],"names":["jsx","jsxs","size","useState","forwardRef","useFloating","autoUpdate","useDismiss","useRole","useInteractions","FloatingPortal","XIcon","CheckCircle2Icon","SIZES","Fragment","AlertTriangleIcon","offset","flip","shift","useEffect","AnimatePresence","motion","CheckIcon","useRef","ChevronDownIcon","useMemo","SearchIcon"],"mappings":"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","file":"index.js","sourcesContent":["export type ThemeChoice = 'light' | 'dark' | 'system';\nexport type ResolvedTheme = 'light' | 'dark';\n\nexport const THEME_STORAGE_KEY = 'orbit-theme';\nconst CHOICES: ThemeChoice[] = ['light', 'dark', 'system'];\n\nexport function resolveTheme(choice: ThemeChoice, prefersDark: boolean): ResolvedTheme {\n if (choice === 'system') return prefersDark ? 'dark' : 'light';\n return choice;\n}\n\nexport function getStoredTheme(): ThemeChoice {\n try {\n const stored = localStorage.getItem(THEME_STORAGE_KEY);\n if (stored && (CHOICES as string[]).includes(stored)) return stored as ThemeChoice;\n } catch {\n // localStorage unavailable (SSR/private mode) — fall through to default.\n }\n return 'system';\n}\n\nexport function storeTheme(choice: ThemeChoice): void {\n try {\n localStorage.setItem(THEME_STORAGE_KEY, choice);\n } catch {\n // Ignore persistence failures.\n }\n}\n\nexport function systemPrefersDark(): boolean {\n return typeof window !== 'undefined' &&\n window.matchMedia('(prefers-color-scheme: dark)').matches;\n}\n\nexport function applyThemeClass(resolved: ResolvedTheme): void {\n const root = document.documentElement;\n root.classList.toggle('dark', resolved === 'dark');\n // Tell the UA which scheme is active (correct default canvas, form controls,\n // scrollbars) and paint the page background from the themed token, so a\n // refresh or toggle never flashes white before the app shell mounts. Reading\n // --color-bg keeps a single source of truth with the CSS.\n root.style.colorScheme = resolved;\n const bg = getComputedStyle(root).getPropertyValue('--color-bg').trim();\n if (bg) root.style.backgroundColor = bg;\n}\n","import React, {\n createContext,\n useContext,\n useEffect,\n useMemo,\n useState,\n useCallback,\n} from 'react';\nimport {\n type ThemeChoice,\n type ResolvedTheme,\n getStoredTheme,\n storeTheme,\n resolveTheme,\n systemPrefersDark,\n applyThemeClass,\n} from './theme';\n\ninterface ThemeContextValue {\n theme: ThemeChoice;\n resolvedTheme: ResolvedTheme;\n setTheme: (choice: ThemeChoice) => void;\n}\n\nconst ThemeContext = createContext<ThemeContextValue | null>(null);\n\nexport function ThemeProvider({ children }: { children: React.ReactNode }) {\n const [theme, setThemeState] = useState<ThemeChoice>(() => getStoredTheme());\n const [prefersDark, setPrefersDark] = useState<boolean>(() => systemPrefersDark());\n\n // Track OS preference changes (only matters while theme === 'system').\n useEffect(() => {\n const mq = window.matchMedia('(prefers-color-scheme: dark)');\n const onChange = (e: MediaQueryListEvent) => setPrefersDark(e.matches);\n mq.addEventListener('change', onChange);\n return () => mq.removeEventListener('change', onChange);\n }, []);\n\n const resolvedTheme = resolveTheme(theme, prefersDark);\n\n // Apply the resolved theme to <html> whenever it changes.\n useEffect(() => {\n applyThemeClass(resolvedTheme);\n }, [resolvedTheme]);\n\n const setTheme = useCallback((choice: ThemeChoice) => {\n storeTheme(choice);\n setThemeState(choice);\n }, []);\n\n const value = useMemo(\n () => ({ theme, resolvedTheme, setTheme }),\n [theme, resolvedTheme, setTheme],\n );\n\n return <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>;\n}\n\nexport function useTheme(): ThemeContextValue {\n const ctx = useContext(ThemeContext);\n if (!ctx) throw new Error('useTheme must be used within a ThemeProvider');\n return ctx;\n}\n","import React from 'react';\nimport { SunIcon, MoonIcon, MonitorIcon, type LucideIcon } from 'lucide-react';\nimport { useTheme } from './ThemeProvider';\nimport type { ThemeChoice } from './theme';\n\nconst OPTIONS: { value: ThemeChoice; label: string; Icon: LucideIcon }[] = [\n { value: 'light', label: 'Light', Icon: SunIcon },\n { value: 'dark', label: 'Dark', Icon: MoonIcon },\n { value: 'system', label: 'System', Icon: MonitorIcon },\n];\n\nexport function ThemeToggle() {\n const { theme, setTheme } = useTheme();\n return (\n <div\n role=\"radiogroup\"\n aria-label=\"Theme\"\n className=\"flex items-center gap-0.5 rounded-md border border-border-strong bg-surface-raised p-0.5\"\n >\n {OPTIONS.map(({ value, label, Icon }) => {\n const active = theme === value;\n return (\n <button\n key={value}\n type=\"button\"\n role=\"radio\"\n aria-checked={active}\n aria-label={label}\n title={label}\n onClick={() => setTheme(value)}\n className={`flex h-6 w-6 items-center justify-center rounded transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-accent ${\n active\n ? 'bg-surface text-fg shadow-sm'\n : 'text-muted hover:text-fg'\n }`}\n >\n <Icon className=\"h-3.5 w-3.5\" strokeWidth={1.75} aria-hidden=\"true\" />\n </button>\n );\n })}\n </div>\n );\n}\n","import React from 'react';\nimport { PlusIcon, CopyIcon, ExternalLinkIcon, GithubIcon } from 'lucide-react';\ntype Variant = 'primary' | 'secondary' | 'destructive';\ntype IconPos = 'none' | 'leading' | 'trailing';\ninterface ButtonProps {\n children: React.ReactNode;\n variant?: Variant;\n icon?: 'plus' | 'copy' | 'external-link' | 'github';\n iconPosition?: IconPos;\n onClick?: () => void;\n disabled?: boolean;\n /** Stretch to the container width (e.g. a full-width form/footer action). */\n fullWidth?: boolean;\n}\nconst ICONS = {\n plus: PlusIcon,\n copy: CopyIcon,\n 'external-link': ExternalLinkIcon,\n github: GithubIcon\n};\nexport function Button({\n children,\n variant = 'primary',\n icon,\n iconPosition = 'none',\n onClick,\n disabled = false,\n fullWidth = false\n}: ButtonProps) {\n const Icon = icon ? ICONS[icon] : null;\n const showLeading = Icon && iconPosition === 'leading';\n const showTrailing = Icon && iconPosition === 'trailing';\n const base =\n `${fullWidth ? 'flex w-full' : 'inline-flex'} h-[38px] items-center justify-center gap-2.5 rounded px-3.5 font-condensed text-sm font-medium leading-[17.5px] transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-1 disabled:cursor-not-allowed disabled:opacity-60`;\n const variants: Record<Variant, string> = {\n primary:\n 'bg-accent text-on-accent hover:bg-accent-hover focus-visible:ring-accent shadow-[inset_0_1px_0_0_rgba(255,255,255,0.25),inset_0_0_0_1px_rgba(255,255,255,0.12)]',\n secondary:\n 'bg-surface text-fg border border-border-strong hover:bg-surface-raised focus-visible:ring-accent',\n // destructive stays hardcoded — themed in a later pass (see plan Global Constraints).\n destructive:\n 'bg-[#DC2626] text-white hover:bg-[#B91C1C] focus-visible:ring-[#DC2626] shadow-[inset_0_1px_0_0_rgba(255,255,255,0.25),inset_0_0_0_1px_rgba(255,255,255,0.12)]'\n };\n return (\n <button\n type=\"button\"\n onClick={onClick}\n disabled={disabled}\n className={`${base} ${variants[variant]}`}>\n\n {showLeading &&\n <Icon className=\"h-4 w-4\" strokeWidth={1.33} aria-hidden=\"true\" />\n }\n <span>{children}</span>\n {showTrailing &&\n <Icon className=\"h-4 w-4\" strokeWidth={1.33} aria-hidden=\"true\" />\n }\n </button>);\n\n}","import React, { useId } from 'react';\nimport {\n FloatingPortal,\n FloatingOverlay,\n FloatingFocusManager,\n useFloating,\n useDismiss,\n useRole,\n useInteractions,\n autoUpdate } from\n'@floating-ui/react';\nimport { AnimatePresence, motion } from 'framer-motion';\nimport { XIcon } from 'lucide-react';\n\nexport type OverlayPosition = 'center' | 'left' | 'right';\n\ninterface OverlayProps {\n open: boolean;\n onClose: () => void;\n position: OverlayPosition;\n /** Tailwind max-width class applied to the panel, e.g. \"max-w-lg\". */\n widthClassName: string;\n title?: React.ReactNode;\n description?: React.ReactNode;\n footer?: React.ReactNode;\n hideCloseButton?: boolean;\n closeOnBackdrop?: boolean;\n closeOnEsc?: boolean;\n children: React.ReactNode;\n}\n\nconst MotionFloatingOverlay = motion(FloatingOverlay);\n\n// Per-position container alignment and panel chrome.\nconst CONTAINER: Record<OverlayPosition, string> = {\n center: 'items-center justify-center p-4',\n right: 'justify-end',\n left: 'justify-start'\n};\nconst PANEL: Record<OverlayPosition, string> = {\n center:\n 'max-h-[85vh] w-full rounded-lg border-[0.5px] border-border-strong shadow-lg',\n right: 'h-full w-full border-l-[0.5px] border-border-strong shadow-xl',\n left: 'h-full w-full border-r-[0.5px] border-border-strong shadow-xl'\n};\n// Enter/exit transform per position (opacity is handled by the backdrop fade).\nconst PANEL_MOTION = {\n center: { from: { scale: 0.96, y: 8 }, to: { scale: 1, y: 0 } },\n right: { from: { x: '100%' }, to: { x: 0 } },\n left: { from: { x: '-100%' }, to: { x: 0 } }\n} satisfies Record<OverlayPosition, { from: object; to: object }>;\n\n/**\n * Shared modal-overlay primitive used by Modal and Drawer.\n *\n * Handles the portal, scroll-locking backdrop, focus trap + restore, Escape and\n * outside-press dismissal, enter/exit animation, and the common header/body/footer\n * chrome. Position drives both layout (centered vs edge-docked) and animation.\n */\nexport function Overlay({\n open,\n onClose,\n position,\n widthClassName,\n title,\n description,\n footer,\n hideCloseButton = false,\n closeOnBackdrop = true,\n closeOnEsc = true,\n children\n}: OverlayProps) {\n const titleId = useId();\n const { refs, context } = useFloating({\n open,\n onOpenChange: (next) => {\n if (!next) onClose();\n },\n whileElementsMounted: autoUpdate\n });\n const dismiss = useDismiss(context, {\n outsidePress: closeOnBackdrop,\n escapeKey: closeOnEsc\n });\n const role = useRole(context, { role: 'dialog' });\n const { getFloatingProps } = useInteractions([dismiss, role]);\n\n const panelMotion = PANEL_MOTION[position];\n const hasHeader = Boolean(title) || !hideCloseButton;\n\n return (\n <FloatingPortal>\n <AnimatePresence>\n {open &&\n <MotionFloatingOverlay\n lockScroll\n className={`fixed inset-0 z-50 flex bg-black/40 ${CONTAINER[position]}`}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.2, ease: 'easeOut' }}>\n\n <FloatingFocusManager context={context} modal>\n <motion.div\n ref={refs.setFloating}\n {...getFloatingProps()}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={title ? titleId : undefined}\n className={`relative flex flex-col overflow-hidden bg-surface font-sans ${PANEL[position]} ${widthClassName}`}\n initial={panelMotion.from}\n animate={panelMotion.to}\n exit={panelMotion.from}\n transition={{ duration: 0.2, ease: 'easeOut' }}>\n\n {hasHeader &&\n <div className=\"flex flex-shrink-0 items-start justify-between gap-4 border-b-[0.5px] border-border-strong px-6 py-4\">\n <div className=\"min-w-0\">\n {title &&\n <h2\n id={titleId}\n className=\"font-sans text-lg font-semibold text-fg\">\n\n {title}\n </h2>\n }\n {description &&\n <p className=\"mt-1 font-sans text-sm text-muted\">\n {description}\n </p>\n }\n </div>\n {!hideCloseButton &&\n <button\n type=\"button\"\n onClick={onClose}\n aria-label=\"Close\"\n className=\"-mr-1.5 flex h-8 w-8 flex-shrink-0 items-center justify-center rounded text-muted transition-colors hover:bg-surface-raised hover:text-fg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent\">\n\n <XIcon className=\"h-4 w-4\" strokeWidth={2} />\n </button>\n }\n </div>\n }\n\n <div className=\"flex-1 overflow-y-auto px-6 py-5\">{children}</div>\n\n {footer &&\n <div className=\"flex flex-shrink-0 items-center justify-end gap-3 border-t-[0.5px] border-border-strong px-6 py-4\">\n {footer}\n </div>\n }\n </motion.div>\n </FloatingFocusManager>\n </MotionFloatingOverlay>\n }\n </AnimatePresence>\n </FloatingPortal>);\n\n}\n","import React from 'react';\ninterface AvatarProps {\n name: string;\n initials?: string;\n size?: 'sm' | 'md' | 'lg';\n className?: string;\n}\nconst SIZES = {\n sm: 'h-6 w-6 text-[10px]',\n md: 'h-7 w-7 text-[11px]',\n lg: 'h-9 w-9 text-sm'\n} as const;\n// Neutral gray treatment used for all initials avatars.\nconst GRAY = {\n bg: 'var(--color-surface-avatar)',\n color: 'var(--color-text-secondary)'\n};\nfunction getInitials(name: string) {\n const parts = name.trim().split(/\\s+/);\n if (parts.length === 1) return (parts[0] ?? '').slice(0, 2).toUpperCase();\n return ((parts[0]?.[0] ?? '') + (parts[parts.length - 1]?.[0] ?? '')).toUpperCase();\n}\nexport function Avatar({\n name,\n initials,\n size = 'md',\n className = ''\n}: AvatarProps) {\n const label = initials ?? getInitials(name);\n return (\n <div\n className={`flex flex-shrink-0 items-center justify-center rounded-full font-medium ${SIZES[size]} ${className}`}\n style={{\n backgroundColor: GRAY.bg,\n color: GRAY.color\n }}\n aria-hidden=\"true\"\n title={name}>\n\n {label}\n </div>);\n\n}\n","import React, { useState, forwardRef } from 'react';\nimport { EyeIcon, EyeOffIcon, type LucideIcon } from 'lucide-react';\nexport interface InputProps extends\n React.InputHTMLAttributes<HTMLInputElement> {\n label?: string;\n helperText?: string;\n error?: boolean;\n icon?: LucideIcon;\n}\nexport const Input = forwardRef<HTMLInputElement, InputProps>(\n (\n {\n label,\n helperText,\n error,\n icon: Icon,\n type = 'text',\n className = '',\n disabled,\n ...props\n },\n ref) =>\n {\n const [showPassword, setShowPassword] = useState(false);\n const isPassword = type === 'password';\n const inputType = isPassword ? showPassword ? 'text' : 'password' : type;\n return (\n <div className={`flex w-full flex-col gap-1.5 ${className}`}>\n {label &&\n <label className=\"font-sans text-sm font-medium text-fg\">\n {label}\n </label>\n }\n <div className=\"relative flex items-center\">\n {Icon &&\n <div className=\"absolute left-3 text-muted\">\n <Icon className=\"h-4 w-4\" strokeWidth={1.5} />\n </div>\n }\n <input\n ref={ref}\n type={inputType}\n disabled={disabled}\n className={`w-full rounded border bg-surface px-3 py-2 font-sans text-sm text-fg placeholder:text-muted transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-1 disabled:cursor-not-allowed disabled:bg-surface-raised disabled:text-muted ${Icon ? 'pl-9' : ''} ${isPassword ? 'pr-9' : ''} ${error ? 'border-red-500 focus-visible:border-red-500 focus-visible:ring-red-500' : 'border-border hover:border-border-strong focus-visible:border-accent focus-visible:ring-accent'}`}\n {...props} />\n \n {isPassword &&\n <button\n type=\"button\"\n onClick={() => setShowPassword(!showPassword)}\n disabled={disabled}\n className=\"absolute right-3 text-muted hover:text-fg focus:outline-none disabled:cursor-not-allowed disabled:opacity-50\"\n aria-label={showPassword ? 'Hide password' : 'Show password'}>\n \n {showPassword ?\n <EyeOffIcon className=\"h-4 w-4\" strokeWidth={1.5} /> :\n\n <EyeIcon className=\"h-4 w-4\" strokeWidth={1.5} />\n }\n </button>\n }\n </div>\n {helperText &&\n <span\n className={`font-sans text-xs ${error ? 'text-red-500' : 'text-muted'}`}>\n \n {helperText}\n </span>\n }\n </div>);\n\n }\n);\nInput.displayName = 'Input';","import React, { forwardRef } from 'react';\nexport interface TextareaProps extends\n React.TextareaHTMLAttributes<HTMLTextAreaElement> {\n label?: string;\n helperText?: string;\n error?: boolean;\n}\nexport const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(\n ({ label, helperText, error, className = '', disabled, ...props }, ref) => {\n return (\n <div className={`flex w-full flex-col gap-1.5 ${className}`}>\n {label &&\n <label className=\"font-sans text-sm font-medium text-fg\">\n {label}\n </label>\n }\n <textarea\n ref={ref}\n disabled={disabled}\n className={`min-h-[80px] w-full rounded border bg-surface px-3 py-2 font-sans text-sm text-fg placeholder:text-muted transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-1 disabled:cursor-not-allowed disabled:bg-surface-raised disabled:text-muted ${error ? 'border-red-500 focus-visible:border-red-500 focus-visible:ring-red-500' : 'border-border hover:border-border-strong focus-visible:border-accent focus-visible:ring-accent'}`}\n {...props} />\n \n {helperText &&\n <span\n className={`font-sans text-xs ${error ? 'text-red-500' : 'text-muted'}`}>\n \n {helperText}\n </span>\n }\n </div>);\n\n }\n);\nTextarea.displayName = 'Textarea';","import React from 'react';\n\n/** Standard rendering for artifact codes (REQ-/BP-/WO-/CO-, project keys).\n * Condensed grey type — the work-order row style, used everywhere. */\nexport function Code({\n children,\n className = '',\n}: {\n children: React.ReactNode;\n className?: string;\n}) {\n return (\n <span className={`font-condensed text-muted ${className}`}>\n {children}\n </span>\n );\n}\n","import React, { useState } from 'react';\nimport {\n useFloating,\n useHover,\n useFocus,\n useDismiss,\n useRole,\n useInteractions,\n offset,\n flip,\n shift,\n autoUpdate,\n FloatingPortal } from\n'@floating-ui/react';\n\ninterface TooltipProps {\n label: React.ReactNode;\n children: React.ReactNode;\n placement?: 'top' | 'bottom' | 'left' | 'right';\n /** Make the trigger wrapper fill its cell and truncate (for table rows). */\n block?: boolean;\n}\n\n/** Hover/focus tooltip built on floating-ui. */\nexport function Tooltip({ label, children, placement = 'top', block }: TooltipProps) {\n const [open, setOpen] = useState(false);\n const { refs, floatingStyles, context } = useFloating({\n open,\n onOpenChange: setOpen,\n placement,\n middleware: [offset(6), flip({ padding: 8 }), shift({ padding: 8 })],\n whileElementsMounted: autoUpdate\n });\n const hover = useHover(context, { delay: { open: 250, close: 0 }, move: false });\n const focus = useFocus(context);\n const dismiss = useDismiss(context);\n const role = useRole(context, { role: 'tooltip' });\n const { getReferenceProps, getFloatingProps } = useInteractions([\n hover,\n focus,\n dismiss,\n role]\n );\n\n return (\n <>\n <span\n ref={refs.setReference}\n {...getReferenceProps()}\n className={block ? 'block min-w-0 truncate' : 'inline-flex'}>\n\n {children}\n </span>\n {open &&\n <FloatingPortal>\n <div\n ref={refs.setFloating}\n style={floatingStyles}\n {...getFloatingProps()}\n className=\"z-[60] max-w-xs rounded-md bg-black px-2.5 py-1.5 font-sans text-xs font-medium leading-snug text-white shadow-lg\">\n\n {label}\n </div>\n </FloatingPortal>\n }\n </>);\n\n}\n","import React from 'react';\nimport type { LucideIcon } from 'lucide-react';\n\nexport interface TabItem {\n id: string;\n label: string;\n icon?: LucideIcon;\n}\n\ninterface TabsProps {\n items: TabItem[];\n value: string;\n onChange: (id: string) => void;\n className?: string;\n}\n\n/** Controlled, underline-style tab navigation. */\nexport function Tabs({ items, value, onChange, className = '' }: TabsProps) {\n return (\n <div\n role=\"tablist\"\n className={`flex items-center gap-1 border-b border-border-strong ${className}`}>\n\n {items.map((item) => {\n const Icon = item.icon;\n const active = item.id === value;\n return (\n <button\n key={item.id}\n type=\"button\"\n role=\"tab\"\n aria-selected={active}\n onClick={() => onChange(item.id)}\n className={`-mb-px flex items-center gap-2 border-b-2 px-3 py-2.5 font-sans text-sm font-medium transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-1 ${active ? 'border-accent text-accent' : 'border-transparent text-muted hover:text-fg'}`}>\n\n {Icon && <Icon className=\"h-4 w-4\" strokeWidth={1.75} />}\n {item.label}\n </button>);\n\n })}\n </div>);\n\n}\n","import React from 'react';\nimport toast, { Toaster, Toast } from 'react-hot-toast';\nimport {\n CheckCircle2Icon,\n XCircleIcon,\n InfoIcon,\n AlertTriangleIcon,\n XIcon,\n type LucideIcon } from\n'lucide-react';\n\ntype ToastVariant = 'success' | 'error' | 'info' | 'warning';\n\n// Per-variant chrome, mirroring the StatusBadge color system.\nconst VARIANT: Record<\n ToastVariant,\n { Icon: LucideIcon; fill: string; border: string; color: string }> =\n{\n success: {\n Icon: CheckCircle2Icon,\n fill: 'var(--color-success-bg)',\n border: 'var(--color-success-border)',\n color: 'var(--color-success)'\n },\n error: {\n Icon: XCircleIcon,\n fill: 'var(--color-danger-bg)',\n border: 'var(--color-danger-border)',\n color: 'var(--color-danger)'\n },\n info: {\n Icon: InfoIcon,\n fill: 'var(--color-info-bg)',\n border: 'var(--color-info-border)',\n color: 'var(--color-info)'\n },\n warning: {\n Icon: AlertTriangleIcon,\n fill: 'var(--color-warning-bg)',\n border: 'var(--color-warning-border)',\n color: 'var(--color-warning)'\n }\n};\n\ninterface NotifyOptions {\n /** Optional secondary line beneath the title. */\n description?: React.ReactNode;\n /** Override the auto-dismiss duration (ms). */\n duration?: number;\n}\n\nfunction ToastCard({\n t,\n variant,\n title,\n description\n}: {\n t: Toast;\n variant: ToastVariant;\n title: React.ReactNode;\n description?: React.ReactNode;\n}) {\n const { Icon, fill, border, color } = VARIANT[variant];\n return (\n <div\n className={`pointer-events-auto flex w-full max-w-sm items-start gap-3 rounded-lg border border-border-strong bg-surface px-4 py-3 font-sans shadow-lg transition-all duration-200 ${t.visible ? 'translate-y-0 opacity-100' : '-translate-y-1 opacity-0'}`}\n role=\"status\">\n\n <span\n className=\"mt-0.5 flex h-7 w-7 flex-shrink-0 items-center justify-center rounded-full border\"\n style={{ backgroundColor: fill, borderColor: border, color }}\n aria-hidden=\"true\">\n\n <Icon className=\"h-4 w-4\" strokeWidth={1.5} />\n </span>\n <div className=\"min-w-0 flex-1 pt-0.5\">\n <p className=\"font-sans text-sm font-semibold text-fg\">{title}</p>\n {description &&\n <p className=\"mt-0.5 font-sans text-sm leading-snug text-fg-secondary\">\n {description}\n </p>\n }\n </div>\n <button\n type=\"button\"\n onClick={() => toast.dismiss(t.id)}\n aria-label=\"Dismiss\"\n className=\"-mr-1 flex h-6 w-6 flex-shrink-0 items-center justify-center rounded text-muted transition-colors hover:bg-surface-raised hover:text-fg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent\">\n\n <XIcon className=\"h-3.5 w-3.5\" strokeWidth={2} />\n </button>\n </div>);\n\n}\n\nfunction show(variant: ToastVariant, title: React.ReactNode, options: NotifyOptions = {}) {\n return toast.custom(\n (t) =>\n <ToastCard\n t={t}\n variant={variant}\n title={title}\n description={options.description} />,\n\n { duration: options.duration }\n );\n}\n\n/** Styled, design-system toast helpers. */\nexport const notify = {\n success: (title: React.ReactNode, options?: NotifyOptions) =>\n show('success', title, options),\n error: (title: React.ReactNode, options?: NotifyOptions) =>\n show('error', title, options),\n info: (title: React.ReactNode, options?: NotifyOptions) =>\n show('info', title, options),\n warning: (title: React.ReactNode, options?: NotifyOptions) =>\n show('warning', title, options),\n dismiss: (id?: string) => toast.dismiss(id)\n};\n\n/** Mount once near the app root so toasts render on every route. */\nexport function AppToaster() {\n return (\n <Toaster\n position=\"bottom-right\"\n gutter={12}\n toastOptions={{ duration: 4000 }} />);\n\n}\n","import React from 'react';\nimport {\n ScanSearchIcon,\n CircleDashedIcon,\n Clock4Icon,\n CheckCircle2Icon,\n BanIcon,\n PlayCircleIcon,\n CircleDotIcon,\n ArchiveIcon } from\n'lucide-react';\nexport type StatusType =\n'in-review' |\n'in-progress' |\n'backlog' |\n'completed' |\n'blocked' |\n'ready';\n/** Project lifecycle — distinct from artifact StatusType, rendered by the same badge. */\nexport type ProjectStatus = 'active' | 'archived';\n/** Plan statuses for Requirements & Blueprints — distinct from execution StatusType. */\nexport type PlanStatusType = 'backlog' | 'scoped' | 'cancelled';\ninterface StatusBadgeProps {\n status: StatusType | ProjectStatus | PlanStatusType;\n}\n// Ordered along the SDLC lifecycle — this key order drives the kanban columns\n// and table grouping (STATUS_ORDER derives from it).\nexport const STATUS_CONFIG = {\n backlog: {\n label: 'Backlog',\n Icon: Clock4Icon,\n fill: 'var(--color-neutral-bg)',\n border: 'var(--color-neutral-border)',\n color: 'var(--color-neutral)'\n },\n ready: {\n label: 'Ready',\n Icon: PlayCircleIcon,\n fill: 'var(--color-info-bg)',\n border: 'var(--color-info-border)',\n color: 'var(--color-info)'\n },\n 'in-progress': {\n label: 'In progress',\n Icon: CircleDashedIcon,\n fill: 'var(--color-warning-bg)',\n border: 'var(--color-warning-border)',\n color: 'var(--color-warning)'\n },\n 'in-review': {\n label: 'In Review',\n Icon: ScanSearchIcon,\n fill: 'var(--color-review-bg)',\n border: 'var(--color-review-border)',\n color: 'var(--color-review)'\n },\n blocked: {\n label: 'Blocked',\n Icon: BanIcon,\n fill: 'var(--color-danger-bg)',\n border: 'var(--color-danger-border)',\n color: 'var(--color-danger)'\n },\n completed: {\n label: 'Completed',\n Icon: CheckCircle2Icon,\n fill: 'var(--color-success-bg)',\n border: 'var(--color-success-border)',\n color: 'var(--color-success)'\n }\n} as const;\n/** Project lifecycle statuses — kept separate from STATUS_CONFIG so artifact\n * grouping/boards (which derive columns from STATUS_CONFIG) are unaffected. */\nexport const PROJECT_STATUS_CONFIG = {\n active: {\n label: 'Active',\n Icon: CircleDotIcon,\n fill: 'var(--color-success-bg)',\n border: 'var(--color-success-border)',\n color: 'var(--color-success)'\n },\n archived: {\n label: 'Archived',\n Icon: ArchiveIcon,\n fill: 'var(--color-neutral-bg)',\n border: 'var(--color-neutral-border)',\n color: 'var(--color-neutral)'\n }\n} as const;\n/** Plan statuses — kept separate from STATUS_CONFIG so artifact execution\n * grouping/boards (which derive columns from STATUS_CONFIG) are unaffected.\n * Used by Requirements & Blueprints. */\nexport const PLAN_STATUS_CONFIG = {\n backlog: {\n label: 'Backlog',\n Icon: Clock4Icon,\n fill: 'var(--color-neutral-bg)',\n border: 'var(--color-neutral-border)',\n color: 'var(--color-neutral)'\n },\n scoped: {\n label: 'Scoped',\n Icon: ScanSearchIcon,\n fill: 'var(--color-info-bg)',\n border: 'var(--color-info-border)',\n color: 'var(--color-info)'\n },\n cancelled: {\n label: 'Cancelled',\n Icon: BanIcon,\n fill: 'var(--color-danger-bg)',\n border: 'var(--color-danger-border)',\n color: 'var(--color-danger)'\n }\n} as const;\n/** Canonical plan-status order for grouping (columns/sections). */\nexport const PLAN_STATUS_ORDER = ['backlog', 'scoped', 'cancelled'] as PlanStatusType[];\nconst ALL_STATUS_CONFIG = { ...STATUS_CONFIG, ...PROJECT_STATUS_CONFIG, ...PLAN_STATUS_CONFIG };\nexport function StatusBadge({ status }: StatusBadgeProps) {\n const { label, Icon, fill, border, color } = ALL_STATUS_CONFIG[status];\n return (\n <span\n className=\"inline-flex items-center gap-1.5 rounded border px-2 py-1 font-condensed text-xs font-medium leading-[15px]\"\n style={{\n backgroundColor: fill,\n borderColor: border,\n color\n }}>\n \n <Icon className=\"h-3.5 w-3.5\" strokeWidth={1.5} aria-hidden=\"true\" />\n {label}\n </span>);\n\n}","import React from 'react';\nimport type { LucideIcon } from 'lucide-react';\n\nexport interface EmptyStateTone {\n /** Medallion background. */\n bg: string;\n /** Medallion border color. */\n border: string;\n /** Icon color. */\n color: string;\n}\n\nconst NEUTRAL_TONE: EmptyStateTone = {\n bg: 'var(--color-surface-strong)',\n border: 'var(--color-border-strong)',\n color: 'var(--color-text-muted)'\n};\n\ninterface EmptyStateProps {\n icon: LucideIcon;\n title: React.ReactNode;\n description?: React.ReactNode;\n /** Optional action(s) rendered below the copy, e.g. a Button. */\n action?: React.ReactNode;\n /** Color treatment for the icon medallion. Defaults to neutral gray. */\n tone?: EmptyStateTone;\n className?: string;\n}\n\n/**\n * Centered empty / placeholder state: an icon medallion, a title, supporting\n * copy, and an optional action. Fills the height of its container so it sits\n * dead-center in a page or panel.\n */\nexport function EmptyState({\n icon: Icon,\n title,\n description,\n action,\n tone = NEUTRAL_TONE,\n className = ''\n}: EmptyStateProps) {\n return (\n <div\n className={`flex h-full min-h-[360px] w-full flex-col items-center justify-center px-6 py-12 text-center ${className}`}>\n\n {/* Medallion with a soft halo ring for depth */}\n <div className=\"relative mb-5 flex items-center justify-center\">\n <span\n className=\"absolute h-20 w-20 rounded-3xl opacity-60\"\n style={{ backgroundColor: tone.bg }}\n aria-hidden=\"true\" />\n\n <span\n className=\"relative flex h-14 w-14 items-center justify-center rounded-2xl border shadow-[0px_1px_2px_rgba(0,0,0,0.06)]\"\n style={{\n backgroundColor: 'var(--color-surface)',\n borderColor: tone.border,\n color: tone.color\n }}\n aria-hidden=\"true\">\n\n <Icon className=\"h-6 w-6\" strokeWidth={1.5} />\n </span>\n </div>\n\n <h2 className=\"font-sans text-lg font-semibold tracking-tight text-fg\">\n {title}\n </h2>\n {description &&\n <p className=\"mt-2 max-w-sm font-sans text-sm leading-relaxed text-muted\">\n {description}\n </p>\n }\n {action && <div className=\"mt-6\">{action}</div>}\n </div>);\n\n}\n","import React from 'react';\n\ninterface FormSectionProps {\n title?: string;\n description?: string;\n children: React.ReactNode;\n className?: string;\n}\n\n/** Titled fieldset grouping a vertical stack of fields. */\nexport function FormSection({\n title,\n description,\n children,\n className = ''\n}: FormSectionProps) {\n return (\n <section className={`flex flex-col gap-4 ${className}`}>\n {(title || description) &&\n <div>\n {title &&\n <h3 className=\"font-sans text-sm font-semibold text-fg\">{title}</h3>}\n {description &&\n <p className=\"mt-0.5 font-sans text-sm text-muted\">{description}</p>}\n </div>\n }\n <div className=\"flex flex-col gap-4\">{children}</div>\n </section>);\n\n}\n\ninterface FieldProps {\n label: string;\n htmlFor?: string;\n help?: React.ReactNode;\n error?: React.ReactNode;\n children: React.ReactNode;\n}\n\n/** A single labeled field row with optional help / error text. */\nexport function Field({ label, htmlFor, help, error, children }: FieldProps) {\n return (\n <div className=\"flex flex-col gap-1.5\">\n <label\n htmlFor={htmlFor}\n className=\"font-sans text-sm font-medium text-fg\">\n\n {label}\n </label>\n {children}\n {error ?\n <span className=\"font-sans text-xs text-red-500\">{error}</span> :\n help ?\n <span className=\"font-sans text-xs text-muted\">{help}</span> :\n null}\n </div>);\n\n}\n","import React from 'react';\nimport { CheckIcon, Loader2Icon } from 'lucide-react';\n\nexport type DirtyState = 'clean' | 'dirty' | 'saving' | 'saved';\n\nconst CONFIG: Record<\n DirtyState,\n { label: string; className: string } | null> =\n{\n clean: null,\n dirty: { label: 'Unsaved changes', className: 'text-warning' },\n saving: { label: 'Saving…', className: 'text-muted' },\n saved: { label: 'Saved', className: 'text-success' }\n};\n\n/** Small status pill reflecting an editor's save state. */\nexport function DirtyStateIndicator({ state }: { state: DirtyState }) {\n const config = CONFIG[state];\n if (!config) return null;\n return (\n <span\n className={`flex items-center gap-1.5 font-sans text-xs font-medium ${config.className}`}\n aria-live=\"polite\">\n\n {state === 'saving' &&\n <Loader2Icon className=\"h-3.5 w-3.5 animate-spin\" strokeWidth={2} />}\n {state === 'saved' && <CheckIcon className=\"h-3.5 w-3.5\" strokeWidth={2.5} />}\n {state === 'dirty' &&\n <span className=\"h-1.5 w-1.5 rounded-full bg-warning\" aria-hidden=\"true\" />}\n {config.label}\n </span>);\n\n}\n","import React from 'react';\n\nexport interface RowAction {\n icon: React.ElementType;\n label: string;\n onClick: () => void;\n /** Render in a destructive (red) hover state. */\n danger?: boolean;\n}\n\n/**\n * Standard trailing row actions — a group of icon buttons revealed on row\n * hover. Used in every table row and the phases list so actions look and\n * behave identically everywhere. The parent row must have the `group` class.\n */\nexport function RowActions({ actions }: { actions: RowAction[] }) {\n return (\n <div className=\"flex items-center justify-end gap-0.5\">\n {actions.map((a) => (\n <button\n key={a.label}\n type=\"button\"\n aria-label={a.label}\n title={a.label}\n onClick={(e) => {\n e.stopPropagation();\n a.onClick();\n }}\n className={`rounded p-1.5 text-muted transition-colors ${\n a.danger\n ? 'hover:bg-danger-bg hover:text-danger'\n : 'hover:bg-surface-raised hover:text-fg'\n }`}>\n <a.icon className=\"h-4 w-4\" strokeWidth={1.75} />\n </button>\n ))}\n </div>\n );\n}\n","import React from 'react';\nimport ReactMarkdown from 'react-markdown';\nimport remarkGfm from 'remark-gfm';\n\n/** Renders markdown with design-system typography. */\nexport function Markdown({ children }: { children: string }) {\n return (\n <div\n className={[\n 'font-sans text-[15px] leading-7 text-fg-secondary',\n '[&>*:first-child]:mt-0 [&>*:last-child]:mb-0',\n '[&_p]:my-3',\n '[&_h1]:mb-3 [&_h1]:mt-8 [&_h1]:text-2xl [&_h1]:font-bold [&_h1]:leading-snug [&_h1]:text-fg',\n '[&_h2]:mb-2.5 [&_h2]:mt-8 [&_h2]:text-xl [&_h2]:font-semibold [&_h2]:leading-snug [&_h2]:text-fg',\n '[&_h3]:mb-2 [&_h3]:mt-6 [&_h3]:text-base [&_h3]:font-semibold [&_h3]:text-fg',\n '[&_ul]:my-3.5 [&_ul]:list-disc [&_ul]:pl-6 [&_ol]:my-3.5 [&_ol]:list-decimal [&_ol]:pl-6',\n '[&_li]:my-1.5 [&_li]:pl-1.5 [&_li>p]:my-0',\n '[&_a]:text-accent [&_a]:underline [&_a]:underline-offset-2 [&_strong]:font-semibold [&_strong]:text-fg',\n '[&_blockquote]:my-4 [&_blockquote]:border-l-2 [&_blockquote]:border-accent [&_blockquote]:pl-4 [&_blockquote]:text-fg-secondary',\n '[&_code]:rounded [&_code]:bg-surface-strong [&_code]:px-1.5 [&_code]:py-0.5 [&_code]:font-mono [&_code]:text-[13px] [&_code]:text-fg-secondary',\n '[&_pre]:my-4 [&_pre]:overflow-x-auto [&_pre]:rounded-lg [&_pre]:bg-surface-raised [&_pre]:p-4 [&_pre_code]:bg-transparent [&_pre_code]:p-0',\n '[&_hr]:my-7 [&_hr]:border-border-strong',\n '[&_table]:my-4 [&_table]:w-full [&_table]:border-collapse [&_td]:border [&_td]:border-border-strong [&_td]:px-3 [&_td]:py-1.5 [&_th]:border [&_th]:border-border-strong [&_th]:bg-surface-raised [&_th]:px-3 [&_th]:py-1.5 [&_th]:text-left [&_th]:font-semibold',\n ].join(' ')}>\n <ReactMarkdown remarkPlugins={[remarkGfm]}>{children}</ReactMarkdown>\n </div>);\n\n}\n","import React from 'react';\nimport { Overlay } from './Overlay';\n\ntype Size = 'sm' | 'md' | 'lg';\n\ninterface ModalProps {\n open: boolean;\n onClose: () => void;\n title?: React.ReactNode;\n description?: React.ReactNode;\n footer?: React.ReactNode;\n size?: Size;\n hideCloseButton?: boolean;\n closeOnBackdrop?: boolean;\n closeOnEsc?: boolean;\n children: React.ReactNode;\n}\n\nconst SIZES: Record<Size, string> = {\n sm: 'max-w-sm',\n md: 'max-w-lg',\n lg: 'max-w-2xl'\n};\n\n/** Centered modal dialog with header / body / footer slots. */\nexport function Modal({\n open,\n onClose,\n title,\n description,\n footer,\n size = 'md',\n hideCloseButton,\n closeOnBackdrop,\n closeOnEsc,\n children\n}: ModalProps) {\n return (\n <Overlay\n open={open}\n onClose={onClose}\n position=\"center\"\n widthClassName={SIZES[size]}\n title={title}\n description={description}\n footer={footer}\n hideCloseButton={hideCloseButton}\n closeOnBackdrop={closeOnBackdrop}\n closeOnEsc={closeOnEsc}>\n\n {children}\n </Overlay>);\n\n}\n","import React from 'react';\nimport { Overlay } from './Overlay';\n\ntype Size = 'sm' | 'md' | 'lg';\n\ninterface DrawerProps {\n open: boolean;\n onClose: () => void;\n side?: 'right' | 'left';\n title?: React.ReactNode;\n description?: React.ReactNode;\n footer?: React.ReactNode;\n size?: Size;\n hideCloseButton?: boolean;\n closeOnBackdrop?: boolean;\n closeOnEsc?: boolean;\n children: React.ReactNode;\n}\n\nconst SIZES: Record<Size, string> = {\n sm: 'max-w-sm',\n md: 'max-w-md',\n lg: 'max-w-lg'\n};\n\n/** Side panel that slides in from the left or right edge. */\nexport function Drawer({\n open,\n onClose,\n side = 'right',\n title,\n description,\n footer,\n size = 'md',\n hideCloseButton,\n closeOnBackdrop,\n closeOnEsc,\n children\n}: DrawerProps) {\n return (\n <Overlay\n open={open}\n onClose={onClose}\n position={side}\n widthClassName={SIZES[size]}\n title={title}\n description={description}\n footer={footer}\n hideCloseButton={hideCloseButton}\n closeOnBackdrop={closeOnBackdrop}\n closeOnEsc={closeOnEsc}>\n\n {children}\n </Overlay>);\n\n}\n","import React from 'react';\nimport { AlertTriangleIcon } from 'lucide-react';\nimport { Modal } from './Modal';\nimport { Button } from './Button';\n\ninterface ConfirmDialogProps {\n open: boolean;\n onClose: () => void;\n title: string;\n message: React.ReactNode;\n confirmLabel?: string;\n cancelLabel?: string;\n onConfirm: () => void;\n variant?: 'default' | 'destructive';\n loading?: boolean;\n}\n\n/** Opinionated confirmation dialog built on Modal. */\nexport function ConfirmDialog({\n open,\n onClose,\n title,\n message,\n confirmLabel = 'Confirm',\n cancelLabel = 'Cancel',\n onConfirm,\n variant = 'default',\n loading = false\n}: ConfirmDialogProps) {\n const destructive = variant === 'destructive';\n return (\n <Modal\n open={open}\n onClose={onClose}\n size=\"sm\"\n title={title}\n footer={\n <>\n <Button variant=\"secondary\" onClick={onClose} disabled={loading}>\n {cancelLabel}\n </Button>\n <Button\n variant={destructive ? 'destructive' : 'primary'}\n onClick={onConfirm}\n disabled={loading}>\n\n {loading ? 'Working…' : confirmLabel}\n </Button>\n </>\n }>\n\n <div className=\"flex items-start gap-3\">\n {destructive &&\n <span className=\"flex h-9 w-9 flex-shrink-0 items-center justify-center rounded-full bg-danger-bg text-danger\">\n <AlertTriangleIcon\n className=\"h-5 w-5\"\n strokeWidth={2}\n aria-hidden=\"true\" />\n\n </span>\n }\n <p className=\"font-sans text-sm leading-relaxed text-fg-secondary\">\n {message}\n </p>\n </div>\n </Modal>);\n\n}\n","import React from 'react';\nimport { Button } from './Button';\nimport { DirtyStateIndicator, type DirtyState } from './DirtyStateIndicator';\n\ninterface SaveBarProps {\n dirty: boolean;\n onSave: () => void;\n onDiscard: () => void;\n state?: DirtyState;\n saveLabel?: string;\n discardLabel?: string;\n}\n\n/** Sticky action bar: Save (disabled until dirty) + Discard, with a state pill. */\nexport function SaveBar({\n dirty,\n onSave,\n onDiscard,\n state,\n saveLabel = 'Save',\n discardLabel = 'Discard'\n}: SaveBarProps) {\n const resolvedState: DirtyState = state ?? (dirty ? 'dirty' : 'clean');\n return (\n <div className=\"sticky bottom-0 z-10 flex items-center justify-between gap-4 border-t border-border-strong bg-surface px-1 py-3 backdrop-blur\">\n <DirtyStateIndicator state={resolvedState} />\n <div className=\"flex items-center gap-3\">\n <Button variant=\"secondary\" onClick={onDiscard} disabled={!dirty}>\n {discardLabel}\n </Button>\n <Button onClick={onSave} disabled={!dirty}>\n {saveLabel}\n </Button>\n </div>\n </div>);\n\n}\n","import { useEffect, useRef, type CSSProperties } from 'react';\nimport {\n useFloating,\n autoUpdate,\n offset,\n flip,\n shift,\n size,\n useDismiss,\n useRole,\n useInteractions,\n type Placement,\n type ExtendedRefs,\n type FloatingContext,\n type ReferenceType,\n type UseInteractionsReturn } from\n'@floating-ui/react';\n\n// App-wide guarantee: at most one usePopover-driven dropdown is open at a time.\n// Opening one closes whichever was open before.\nlet activeClose: (() => void) | null = null;\n\ninterface UsePopoverOptions {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n placement?: Placement;\n /** Distance in px between the trigger and the floating panel. */\n gap?: number;\n /** When true, the floating panel is constrained to (and matches) the trigger width. */\n matchWidth?: boolean;\n role?: 'menu' | 'listbox' | 'dialog';\n}\n\n/**\n * Shared, collision-aware popover positioning built on Floating UI.\n *\n * Provides flip (open upward when there's no room below), shift (stay in the\n * viewport horizontally), and size (cap the panel height to available space and\n * optionally match the trigger width). Also wires escape + outside-press dismissal.\n *\n * Spread getReferenceProps() on the trigger and getFloatingProps() on the panel,\n * attach refs.setReference / refs.setFloating, and apply floatingStyles to the panel.\n */\nexport function usePopover({\n open,\n onOpenChange,\n placement = 'bottom-start',\n gap = 6,\n matchWidth = false,\n role = 'menu'\n}: UsePopoverOptions): {\n refs: ExtendedRefs<ReferenceType>;\n floatingStyles: CSSProperties;\n context: FloatingContext<ReferenceType>;\n getReferenceProps: UseInteractionsReturn['getReferenceProps'];\n getFloatingProps: UseInteractionsReturn['getFloatingProps'];\n} {\n const { refs, floatingStyles, context } = useFloating({\n open,\n onOpenChange,\n placement,\n whileElementsMounted: autoUpdate,\n middleware: [\n offset(gap),\n flip({ padding: 8 }),\n shift({ padding: 8 }),\n size({\n padding: 8,\n apply({ availableHeight, rects, elements }) {\n Object.assign(elements.floating.style, {\n maxHeight: `${Math.max(160, availableHeight)}px`,\n ...(matchWidth ? { width: `${rects.reference.width}px` } : {})\n });\n }\n })]\n\n });\n\n // Coordinate single-open behavior across all popovers. Keep a stable closer\n // per instance so opening this one closes any other that's currently open.\n const onOpenChangeRef = useRef(onOpenChange);\n onOpenChangeRef.current = onOpenChange;\n const closeSelfRef = useRef<() => void>();\n if (!closeSelfRef.current) {\n closeSelfRef.current = () => onOpenChangeRef.current(false);\n }\n useEffect(() => {\n if (!open) return;\n if (activeClose && activeClose !== closeSelfRef.current) {\n activeClose();\n }\n activeClose = closeSelfRef.current!;\n return () => {\n if (activeClose === closeSelfRef.current) activeClose = null;\n };\n }, [open]);\n\n const dismiss = useDismiss(context, { outsidePress: true });\n const roleInteraction = useRole(context, { role });\n\n const { getReferenceProps, getFloatingProps } = useInteractions([\n dismiss,\n roleInteraction]\n );\n\n return {\n refs,\n floatingStyles,\n context,\n getReferenceProps,\n getFloatingProps\n };\n}","import React, { useState, Children, cloneElement, isValidElement, type ReactNode } from 'react';\nimport { AnimatePresence, motion } from 'framer-motion';\nimport { FloatingPortal } from '@floating-ui/react';\nimport { usePopover } from '../hooks/usePopover';\ninterface DropdownProps {\n trigger: ReactNode;\n children: ReactNode;\n align?: 'left' | 'right';\n className?: string;\n}\nexport function Dropdown({\n trigger,\n children,\n align = 'left',\n className = ''\n}: DropdownProps) {\n const [isOpen, setIsOpen] = useState(false);\n const { refs, floatingStyles, context, getReferenceProps, getFloatingProps } =\n usePopover({\n open: isOpen,\n onOpenChange: setIsOpen,\n placement: align === 'right' ? 'bottom-end' : 'bottom-start',\n role: 'menu'\n });\n return (\n <div className={`relative inline-block text-left ${className}`}>\n <div\n ref={refs.setReference}\n {...getReferenceProps({\n onClick: () => setIsOpen((o) => !o)\n })}\n className=\"inline-block\">\n \n {trigger}\n </div>\n\n <FloatingPortal>\n <AnimatePresence>\n {isOpen &&\n <div\n ref={refs.setFloating}\n style={floatingStyles}\n {...getFloatingProps()}\n className=\"z-50\">\n \n <motion.div\n initial={{\n opacity: 0,\n y: -4,\n scale: 0.98\n }}\n animate={{\n opacity: 1,\n y: 0,\n scale: 1\n }}\n exit={{\n opacity: 0,\n y: -4,\n scale: 0.98\n }}\n transition={{\n duration: 0.15,\n ease: 'easeOut'\n }}\n className=\"min-w-[200px] overflow-auto rounded-md border border-border bg-surface py-1 shadow-lg\">\n \n {/* Clone children so they close the menu on click */}\n {Children.map(children, (child) => {\n if (isValidElement(child)) {\n return cloneElement(child as React.ReactElement<any>, {\n onClick: (e: React.MouseEvent) => {\n if (child.props.onClick) child.props.onClick(e);\n setIsOpen(false);\n }\n });\n }\n return child;\n })}\n </motion.div>\n </div>\n }\n </AnimatePresence>\n </FloatingPortal>\n </div>);\n\n}\ninterface DropdownItemProps extends\n React.ButtonHTMLAttributes<HTMLButtonElement> {\n children: ReactNode;\n icon?: React.ElementType;\n danger?: boolean;\n}\nexport function DropdownItem({\n children,\n icon: Icon,\n danger,\n className = '',\n ...props\n}: DropdownItemProps) {\n return (\n <button\n type=\"button\"\n role=\"menuitem\"\n className={`flex w-full items-center gap-2 px-4 py-2 text-left font-sans text-sm transition-colors hover:bg-surface-raised focus:bg-surface-raised focus:outline-none ${danger ? 'text-red-600' : 'text-fg'} ${className}`}\n {...props}>\n \n {Icon && <Icon className=\"h-4 w-4\" strokeWidth={1.5} />}\n {children}\n </button>);\n\n}","import React, { useState } from 'react';\nimport { ChevronDownIcon, CheckIcon } from 'lucide-react';\nimport { AnimatePresence, motion } from 'framer-motion';\nimport { FloatingPortal } from '@floating-ui/react';\nimport { usePopover } from '../hooks/usePopover';\nexport interface SelectOption {\n value: string;\n label: string;\n}\nexport interface SelectProps {\n label?: string;\n placeholder?: string;\n options: SelectOption[];\n value?: string;\n onChange?: (value: string) => void;\n error?: boolean;\n helperText?: string;\n disabled?: boolean;\n className?: string;\n}\nexport function Select({\n label,\n placeholder = 'Select an option',\n options,\n value,\n onChange,\n error,\n helperText,\n disabled,\n className = ''\n}: SelectProps) {\n const [isOpen, setIsOpen] = useState(false);\n const { refs, floatingStyles, getReferenceProps, getFloatingProps } =\n usePopover({\n open: isOpen,\n onOpenChange: setIsOpen,\n placement: 'bottom-start',\n matchWidth: true,\n role: 'listbox'\n });\n const selectedOption = options.find((opt) => opt.value === value);\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (disabled) return;\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n setIsOpen(!isOpen);\n } else if (e.key === 'Escape') {\n setIsOpen(false);\n }\n };\n const handleSelect = (val: string) => {\n onChange?.(val);\n setIsOpen(false);\n };\n return (\n <div className={`flex w-full flex-col gap-1.5 ${className}`}>\n {label &&\n <label className=\"font-sans text-sm font-medium text-fg\">\n {label}\n </label>\n }\n <button\n ref={refs.setReference}\n type=\"button\"\n disabled={disabled}\n aria-haspopup=\"listbox\"\n aria-expanded={isOpen}\n {...getReferenceProps({\n onClick: () => !disabled && setIsOpen((o) => !o),\n onKeyDown: handleKeyDown\n })}\n className={`flex w-full items-center justify-between rounded border bg-surface px-3 py-2 text-left font-sans text-sm transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-1 disabled:cursor-not-allowed disabled:bg-surface-raised disabled:text-muted ${error ? 'border-red-500 focus-visible:border-red-500 focus-visible:ring-red-500' : 'border-border hover:border-border-strong focus-visible:border-accent focus-visible:ring-accent'}`}>\n \n <span className={selectedOption ? 'text-fg' : 'text-muted'}>\n {selectedOption ? selectedOption.label : placeholder}\n </span>\n <ChevronDownIcon\n className={`h-4 w-4 text-muted transition-transform duration-200 ${isOpen ? 'rotate-180' : ''}`}\n strokeWidth={1.5} />\n \n </button>\n\n <FloatingPortal>\n <AnimatePresence>\n {isOpen &&\n <div\n ref={refs.setFloating}\n style={floatingStyles}\n {...getFloatingProps()}\n className=\"z-50\">\n \n <motion.ul\n role=\"listbox\"\n initial={{\n opacity: 0,\n y: -4,\n scale: 0.98\n }}\n animate={{\n opacity: 1,\n y: 0,\n scale: 1\n }}\n exit={{\n opacity: 0,\n y: -4,\n scale: 0.98\n }}\n transition={{\n duration: 0.15,\n ease: 'easeOut'\n }}\n className=\"overflow-auto rounded-md border border-border bg-surface py-1 shadow-lg focus:outline-none\">\n \n {options.map((option) =>\n <li\n key={option.value}\n role=\"option\"\n aria-selected={value === option.value}\n onClick={() => handleSelect(option.value)}\n className={`relative flex cursor-pointer select-none items-center py-2 pl-3 pr-9 font-sans text-sm transition-colors hover:bg-surface-raised ${value === option.value ? 'bg-surface-raised font-medium text-accent' : 'text-fg'}`}>\n \n <span className=\"block truncate\">{option.label}</span>\n {value === option.value &&\n <span className=\"absolute inset-y-0 right-0 flex items-center pr-3 text-accent\">\n <CheckIcon className=\"h-4 w-4\" strokeWidth={2} />\n </span>\n }\n </li>\n )}\n </motion.ul>\n </div>\n }\n </AnimatePresence>\n </FloatingPortal>\n {helperText &&\n <span\n className={`font-sans text-xs ${error ? 'text-red-500' : 'text-muted'}`}>\n \n {helperText}\n </span>\n }\n </div>);\n\n}","import React, { useEffect, useRef, useState } from 'react';\nimport { ChevronDownIcon, CheckIcon, SearchIcon } from 'lucide-react';\nimport { AnimatePresence, motion } from 'framer-motion';\nimport { FloatingPortal } from '@floating-ui/react';\nimport { usePopover } from '../hooks/usePopover';\n\nexport interface ComboboxOption {\n value: string;\n label: string;\n}\nexport interface ComboboxProps {\n label?: string;\n placeholder?: string;\n options: ComboboxOption[];\n value?: string;\n onChange?: (value: string) => void;\n error?: boolean;\n helperText?: string;\n disabled?: boolean;\n className?: string;\n}\n\n/**\n * Searchable single-select, built on the shared usePopover (collision-aware\n * positioning + outside-press / escape dismissal + single-open guarantee).\n */\nexport function Combobox({\n label,\n placeholder = 'Search...',\n options,\n value,\n onChange,\n error,\n helperText,\n disabled,\n className = ''\n}: ComboboxProps) {\n const [isOpen, setIsOpen] = useState(false);\n const [query, setQuery] = useState('');\n const inputRef = useRef<HTMLInputElement>(null);\n const { refs, floatingStyles, getReferenceProps, getFloatingProps } =\n usePopover({\n open: isOpen,\n onOpenChange: (next) => {\n setIsOpen(next);\n if (!next) setQuery('');\n },\n placement: 'bottom-start',\n matchWidth: true,\n role: 'listbox'\n });\n\n useEffect(() => {\n if (isOpen) inputRef.current?.focus();\n }, [isOpen]);\n\n const selectedOption = options.find((opt) => opt.value === value);\n const filteredOptions =\n query === ''\n ? options\n : options.filter((option) =>\n option.label.toLowerCase().includes(query.toLowerCase())\n );\n\n const handleSelect = (val: string) => {\n onChange?.(val);\n setIsOpen(false);\n setQuery('');\n };\n\n return (\n <div className={`flex w-full flex-col gap-1.5 ${className}`}>\n {label &&\n <label className=\"font-sans text-sm font-medium text-fg\">\n {label}\n </label>\n }\n <button\n ref={refs.setReference}\n type=\"button\"\n disabled={disabled}\n aria-haspopup=\"listbox\"\n aria-expanded={isOpen}\n {...getReferenceProps({\n onClick: () => !disabled && setIsOpen((o) => !o)\n })}\n className={`flex w-full items-center justify-between rounded border bg-surface px-3 py-2 text-left font-sans text-sm transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-1 disabled:cursor-not-allowed disabled:bg-surface-raised disabled:text-muted ${error ? 'border-red-500 focus-visible:ring-red-500' : 'border-border hover:border-border-strong focus-visible:border-accent focus-visible:ring-accent'}`}>\n\n <span className={selectedOption ? 'text-fg' : 'text-muted'}>\n {selectedOption ? selectedOption.label : placeholder}\n </span>\n <ChevronDownIcon\n className={`h-4 w-4 text-muted transition-transform duration-200 ${isOpen ? 'rotate-180' : ''}`}\n strokeWidth={1.5} />\n\n </button>\n\n <FloatingPortal>\n <AnimatePresence>\n {isOpen &&\n <div\n ref={refs.setFloating}\n style={floatingStyles}\n {...getFloatingProps()}\n className=\"z-50\">\n\n <motion.div\n initial={{ opacity: 0, y: -4, scale: 0.98 }}\n animate={{ opacity: 1, y: 0, scale: 1 }}\n exit={{ opacity: 0, y: -4, scale: 0.98 }}\n transition={{ duration: 0.15, ease: 'easeOut' }}\n className=\"overflow-hidden rounded-md border border-border bg-surface shadow-lg\">\n\n <div className=\"flex items-center gap-2 border-b border-border px-3 py-2\">\n <SearchIcon className=\"h-4 w-4 flex-shrink-0 text-muted\" strokeWidth={1.5} />\n <input\n ref={inputRef}\n type=\"text\"\n className=\"w-full bg-transparent p-0 font-sans text-sm text-fg placeholder:text-muted focus:outline-none\"\n placeholder={placeholder}\n value={query}\n onChange={(e) => setQuery(e.target.value)} />\n\n </div>\n <ul role=\"listbox\" className=\"max-h-60 overflow-auto py-1\">\n {filteredOptions.length === 0 ?\n <li className=\"px-3 py-2 font-sans text-sm text-muted\">\n No results found.\n </li> :\n\n filteredOptions.map((option) =>\n <li\n key={option.value}\n role=\"option\"\n aria-selected={value === option.value}\n onClick={() => handleSelect(option.value)}\n className={`relative flex cursor-pointer select-none items-center py-2 pl-3 pr-9 font-sans text-sm transition-colors hover:bg-surface-raised ${value === option.value ? 'bg-surface-raised font-medium text-accent' : 'text-fg'}`}>\n\n <span className=\"block truncate\">{option.label}</span>\n {value === option.value &&\n <span className=\"absolute inset-y-0 right-0 flex items-center pr-3 text-accent\">\n <CheckIcon className=\"h-4 w-4\" strokeWidth={2} />\n </span>\n }\n </li>\n )\n }\n </ul>\n </motion.div>\n </div>\n }\n </AnimatePresence>\n </FloatingPortal>\n {helperText &&\n <span\n className={`font-sans text-xs ${error ? 'text-red-500' : 'text-muted'}`}>\n\n {helperText}\n </span>\n }\n </div>);\n\n}\n","import React, { useEffect, useMemo, useState, useRef, Fragment } from 'react';\nimport {\n ChevronDownIcon,\n XIcon,\n CheckIcon,\n SearchIcon,\n ListFilterIcon } from\n'lucide-react';\nimport { AnimatePresence, motion } from 'framer-motion';\nimport { FloatingPortal } from '@floating-ui/react';\nimport { usePopover } from '../hooks/usePopover';\nexport interface FilterOption {\n id: string;\n label: string;\n /** Hex color for the colored dot marker, e.g. \"#16A34A\". Optional if `avatar` is provided. */\n dotColor?: string;\n /** Initials to render as a small avatar marker instead of a dot, e.g. \"AB\". */\n avatar?: string;\n}\ninterface FiltersProps {\n options: FilterOption[];\n selectedIds: string[];\n onChange: (selectedIds: string[]) => void;\n label?: string;\n searchable?: boolean;\n searchPlaceholder?: string;\n}\nexport function Filters({\n options,\n selectedIds,\n onChange,\n label = 'Filter',\n searchable = false,\n searchPlaceholder\n}: FiltersProps) {\n const [isOpen, setIsOpen] = useState(false);\n const [query, setQuery] = useState('');\n const searchInputRef = useRef<HTMLInputElement>(null);\n const { refs, floatingStyles, getReferenceProps, getFloatingProps } =\n usePopover({\n open: isOpen,\n onOpenChange: setIsOpen,\n placement: 'bottom-start',\n role: 'listbox'\n });\n useEffect(() => {\n if (isOpen && searchable) {\n const id = window.setTimeout(() => searchInputRef.current?.focus(), 0);\n return () => window.clearTimeout(id);\n }\n if (!isOpen) setQuery('');\n }, [isOpen, searchable]);\n const toggleFilter = (id: string) => {\n if (selectedIds.includes(id)) {\n onChange(selectedIds.filter((selectedId) => selectedId !== id));\n } else {\n onChange([...selectedIds, id]);\n }\n };\n const clearFilters = () => onChange([]);\n const selectedOptions = options.filter((o) => selectedIds.includes(o.id));\n const hasSelection = selectedOptions.length > 0;\n const filteredOptions = useMemo(() => {\n if (!searchable || query.trim() === '') return options;\n const q = query.trim().toLowerCase();\n return options.filter((o) => o.label.toLowerCase().includes(q));\n }, [options, query, searchable]);\n const renderMarker = (opt: FilterOption, ringed = false) => {\n if (opt.avatar) {\n return (\n <span\n className={`flex h-4 w-4 items-center justify-center rounded-full bg-surface-avatar text-[8px] font-semibold uppercase text-fg ${ringed ? 'ring-2 ring-white' : ''}`}\n aria-hidden=\"true\">\n \n {opt.avatar.slice(0, 2)}\n </span>);\n\n }\n if (opt.dotColor) {\n return (\n <span\n className={`h-2 w-2 rounded-full ${ringed ? 'ring-2 ring-white' : ''}`}\n style={{\n backgroundColor: opt.dotColor\n }}\n aria-hidden=\"true\" />);\n\n\n }\n return null;\n };\n const renderSummary = () => {\n if (selectedOptions.length === 1) {\n const opt = selectedOptions[0]!;\n return (\n <span className=\"flex items-center gap-1.5 whitespace-nowrap\">\n {renderMarker(opt)}\n <span className=\"max-w-[120px] truncate text-accent\">\n {opt.label}\n </span>\n </span>);\n\n }\n return (\n <span className=\"flex items-center gap-1.5 whitespace-nowrap\">\n <span className=\"flex flex-shrink-0 -space-x-1\">\n {selectedOptions.slice(0, 3).map((opt) =>\n <Fragment key={opt.id}>{renderMarker(opt, true)}</Fragment>\n )}\n </span>\n <span className=\"whitespace-nowrap text-accent\">\n {selectedOptions.length} selected\n </span>\n </span>);\n\n };\n return (\n <div className=\"relative inline-block flex-shrink-0 text-left\">\n {/* Chip */}\n <div\n ref={refs.setReference}\n className=\"inline-flex items-stretch overflow-hidden rounded border border-border-strong bg-surface font-condensed text-sm font-medium leading-[17.5px] transition-colors\">\n \n <button\n type=\"button\"\n {...getReferenceProps({\n onClick: () => setIsOpen((o) => !o)\n })}\n aria-haspopup=\"listbox\"\n aria-expanded={isOpen}\n className=\"flex h-[38px] items-center gap-2 whitespace-nowrap px-3 transition-colors hover:bg-surface-raised focus:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-accent\">\n \n <ListFilterIcon\n className={`h-4 w-4 flex-shrink-0 ${hasSelection ? 'text-accent' : 'text-muted'}`}\n strokeWidth={1.5}\n aria-hidden=\"true\" />\n \n <span className={hasSelection ? 'text-accent' : 'text-fg'}>\n {label}\n </span>\n {hasSelection &&\n <>\n <span className=\"text-muted\">is</span>\n {renderSummary()}\n </>\n }\n {!hasSelection &&\n <ChevronDownIcon\n className={`h-4 w-4 text-muted transition-transform duration-200 ${isOpen ? 'rotate-180' : ''}`}\n aria-hidden=\"true\" />\n\n }\n </button>\n {hasSelection &&\n <button\n type=\"button\"\n onClick={clearFilters}\n aria-label={`Clear ${label} filter`}\n className=\"flex items-center border-l border-border-strong px-2 text-muted transition-colors hover:bg-surface-raised hover:text-fg focus:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-accent\">\n \n <XIcon className=\"h-3.5 w-3.5\" />\n </button>\n }\n </div>\n\n {/* Dropdown */}\n <FloatingPortal>\n <AnimatePresence>\n {isOpen &&\n <div\n ref={refs.setFloating}\n style={floatingStyles}\n {...getFloatingProps()}\n className=\"z-50\">\n \n <motion.div\n initial={{\n opacity: 0,\n y: -4,\n scale: 0.98\n }}\n animate={{\n opacity: 1,\n y: 0,\n scale: 1\n }}\n exit={{\n opacity: 0,\n y: -4,\n scale: 0.98\n }}\n transition={{\n duration: 0.15,\n ease: 'easeOut'\n }}\n className=\"flex min-w-[220px] flex-col overflow-hidden rounded-md border border-border bg-surface shadow-lg\">\n \n {searchable &&\n <div className=\"border-b border-border p-1.5\">\n <div className=\"relative\">\n <SearchIcon\n className=\"pointer-events-none absolute left-2 top-1/2 h-3.5 w-3.5 -translate-y-1/2 text-muted\"\n aria-hidden=\"true\" />\n \n <input\n ref={searchInputRef}\n type=\"text\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n placeholder={\n searchPlaceholder ??\n `Search ${label.toLowerCase()}...`\n }\n className=\"w-full rounded border border-transparent bg-surface-raised py-1.5 pl-7 pr-2 font-sans text-sm text-fg placeholder:text-muted focus:border-border focus:bg-surface focus:outline-none\"\n aria-label={`Search ${label}`} />\n \n </div>\n </div>\n }\n\n <div className=\"flex items-center justify-between border-b border-border px-3 py-2\">\n <span className=\"font-sans text-xs font-semibold uppercase tracking-wider text-muted\">\n {label}\n </span>\n {hasSelection &&\n <button\n type=\"button\"\n onClick={clearFilters}\n className=\"font-sans text-xs font-medium text-accent hover:underline focus:outline-none\">\n \n Clear all\n </button>\n }\n </div>\n\n <div\n role=\"listbox\"\n aria-multiselectable=\"true\"\n className=\"max-h-64 overflow-y-auto p-1\">\n \n {filteredOptions.length === 0 ?\n <div className=\"px-2 py-6 text-center font-sans text-sm text-muted\">\n No matches\n </div> :\n\n filteredOptions.map((option) => {\n const checked = selectedIds.includes(option.id);\n return (\n <button\n key={option.id}\n type=\"button\"\n role=\"option\"\n aria-selected={checked}\n onClick={() => toggleFilter(option.id)}\n className=\"flex w-full items-center gap-2.5 rounded px-2 py-1.5 text-left font-sans text-sm text-fg transition-colors hover:bg-surface-raised focus:bg-surface-raised focus:outline-none\">\n \n <span\n className={`flex h-[18px] w-[18px] items-center justify-center rounded border transition-colors ${checked ? 'border-accent bg-accent text-on-accent' : 'border-border-strong bg-surface'}`}\n aria-hidden=\"true\">\n \n {checked &&\n <CheckIcon className=\"h-3 w-3\" strokeWidth={3} />\n }\n </span>\n {renderMarker(option)}\n <span>{option.label}</span>\n </button>);\n\n })\n }\n </div>\n </motion.div>\n </div>\n }\n </AnimatePresence>\n </FloatingPortal>\n </div>);\n\n}","import React from 'react';\nimport {\n SearchIcon,\n ArrowUpIcon,\n ArrowDownIcon,\n ChevronsUpDownIcon } from\n'lucide-react';\nimport { Input } from './Input';\nimport { Filters, FilterOption } from './Filters';\nexport interface ColumnDef<T> {\n key: string;\n title: string;\n sortable?: boolean;\n render?: (item: T) => React.ReactNode;\n}\ninterface DataTableProps<\n T extends {\n id: string | number;\n }>\n{\n data: T[];\n columns: ColumnDef<T>[];\n // Search\n searchValue?: string;\n onSearchChange?: (val: string) => void;\n searchPlaceholder?: string;\n // Filters\n filterOptions?: FilterOption[];\n selectedFilters?: string[];\n onFilterChange?: (ids: string[]) => void;\n filterLabel?: string;\n onClearFilters?: () => void;\n /** Additional filter controls rendered next to the primary filter. */\n extraFilters?: React.ReactNode;\n /** Filter rendered first in the filters row (e.g. a project filter). */\n leadingFilter?: React.ReactNode;\n // Sorting (header-driven)\n sortKey?: string;\n sortDirection?: 'asc' | 'desc';\n onSortChange?: (key: string, dir: 'asc' | 'desc') => void;\n // Grouping\n isGroupRow?: (item: T) => boolean;\n renderGroupRow?: (item: T) => React.ReactNode;\n /** Called when a (non-group) row is clicked. Makes rows interactive. */\n onRowClick?: (item: T) => void;\n /** Trailing per-row actions (e.g. <RowActions>), revealed on row hover. */\n rowActions?: (item: T) => React.ReactNode;\n // Layout & extras\n emptyMessage?: string;\n resultsCount?: React.ReactNode;\n toolbarActions?: React.ReactNode;\n}\nexport function DataTable<\n T extends {\n id: string | number;\n }>(\n{\n data,\n columns,\n searchValue,\n onSearchChange,\n searchPlaceholder = 'Search...',\n filterOptions,\n selectedFilters,\n onFilterChange,\n filterLabel = 'Filter',\n onClearFilters,\n extraFilters,\n leadingFilter,\n sortKey,\n sortDirection,\n onSortChange,\n isGroupRow,\n renderGroupRow,\n onRowClick,\n rowActions,\n emptyMessage = 'No results found.',\n resultsCount,\n toolbarActions\n}: DataTableProps<T>) {\n const totalCols = columns.length + (rowActions ? 1 : 0);\n const hasFilters =\n (filterOptions && onFilterChange) || extraFilters || leadingFilter;\n const hasToolbar = onSearchChange || hasFilters || toolbarActions;\n const handleSortClick = (key: string) => {\n if (!onSortChange) return;\n if (sortKey === key) {\n onSortChange(key, sortDirection === 'asc' ? 'desc' : 'asc');\n } else {\n onSortChange(key, 'asc');\n }\n };\n return (\n <div className=\"flex w-full flex-col gap-4\">\n {hasToolbar &&\n <div className=\"flex flex-col gap-3\">\n {/* Row 1 — search + actions */}\n {(onSearchChange || toolbarActions) &&\n <div className=\"flex flex-wrap items-center gap-3\">\n {onSearchChange &&\n <div className=\"min-w-[160px] flex-1 sm:max-w-sm\">\n <Input\n placeholder={searchPlaceholder}\n value={searchValue}\n onChange={(e) => onSearchChange(e.target.value)}\n icon={SearchIcon} />\n\n </div>\n }\n {toolbarActions &&\n <div className=\"ml-auto flex items-center gap-3\">\n {toolbarActions}\n </div>\n }\n </div>\n }\n {/* Row 2 — filters (can wrap; multiselects go wide) */}\n {hasFilters &&\n <div className=\"flex flex-wrap items-center gap-3\">\n {leadingFilter}\n {filterOptions && selectedFilters && onFilterChange &&\n <Filters\n label={filterLabel}\n options={filterOptions}\n selectedIds={selectedFilters}\n onChange={onFilterChange} />\n\n }\n {extraFilters}\n </div>\n }\n </div>\n }\n\n {resultsCount &&\n <div className=\"font-sans text-sm text-muted\">{resultsCount}</div>\n }\n\n <div className=\"w-full overflow-x-auto rounded border border-border bg-surface shadow-[0px_0px_2px_rgba(0,0,0,0.1)]\">\n <table className=\"w-full border-collapse text-left font-sans text-sm\">\n <thead className=\"border-b border-border bg-surface-raised\">\n <tr>\n {columns.map((col) =>\n <th\n key={col.key}\n scope=\"col\"\n className={`border-r border-border-subtle px-5 py-3 font-medium text-muted last:border-r-0 ${col.sortable ? 'cursor-pointer select-none hover:bg-surface-raised' : ''} ${rowActions ? 'last:border-r' : ''}`}\n aria-sort={\n col.sortable && sortKey === col.key ?\n sortDirection === 'asc' ?\n 'ascending' :\n 'descending' :\n undefined\n }\n onClick={() => col.sortable && handleSortClick(col.key)}>\n\n <div className=\"flex items-center gap-1.5\">\n {col.title}\n {col.sortable &&\n <span className=\"text-muted\">\n {sortKey === col.key ?\n sortDirection === 'asc' ?\n <ArrowUpIcon className=\"h-3.5 w-3.5 text-fg\" /> :\n\n <ArrowDownIcon className=\"h-3.5 w-3.5 text-fg\" /> :\n\n\n <ChevronsUpDownIcon className=\"h-3.5 w-3.5 opacity-50\" />\n }\n </span>\n }\n </div>\n </th>\n )}\n {rowActions &&\n <th scope=\"col\" className=\"w-px px-3 py-3\">\n <span className=\"sr-only\">Actions</span>\n </th>\n }\n </tr>\n </thead>\n <tbody>\n {data.length === 0 ?\n <tr>\n <td\n colSpan={totalCols}\n className=\"px-5 py-8 text-center text-muted\">\n\n {emptyMessage}\n </td>\n </tr> :\n\n data.map((item) => {\n if (isGroupRow && isGroupRow(item) && renderGroupRow) {\n return (\n <tr\n key={item.id}\n className=\"border-b border-border bg-surface-raised\">\n\n <td colSpan={totalCols} className=\"px-5 py-2\">\n {renderGroupRow(item)}\n </td>\n </tr>);\n\n }\n return (\n <tr\n key={item.id}\n onClick={() => onRowClick?.(item)}\n className={`group border-b border-border-subtle transition-colors last:border-0 hover:bg-surface-raised ${onRowClick ? 'cursor-pointer' : ''}`}>\n\n {columns.map((col) =>\n <td key={col.key} className=\"border-r border-border-subtle px-5 py-3 text-fg last:border-r-0\">\n {col.render ? col.render(item) : (item as any)[col.key]}\n </td>\n )}\n {rowActions &&\n <td className=\"px-3 py-3 text-right align-middle\">\n {rowActions(item)}\n </td>\n }\n </tr>);\n\n })\n }\n </tbody>\n </table>\n </div>\n </div>);\n\n}","import React, { Fragment } from 'react';\nimport { ChevronRightIcon } from 'lucide-react';\n\nexport interface Crumb {\n label: string;\n href?: string;\n}\n\nexport interface BreadcrumbsProps {\n items: Crumb[];\n className?: string;\n /** Render a navigable (non-final) crumb. Defaults to a plain <a href>. */\n renderLink?: (item: Crumb, children: React.ReactNode) => React.ReactNode;\n}\n\n/** Path breadcrumb; non-final items with an `href` are links (router-agnostic). */\nexport function Breadcrumbs({ items, className = '', renderLink }: BreadcrumbsProps) {\n const linkClass = 'text-muted transition-colors hover:text-fg';\n return (\n <nav\n aria-label=\"Breadcrumb\"\n className={`flex items-center gap-1.5 font-sans text-sm ${className}`}>\n\n {items.map((item, i) => {\n const isLast = i === items.length - 1;\n const linkable = item.href && !isLast;\n return (\n <Fragment key={`${item.label}-${i}`}>\n {linkable ?\n renderLink ?\n renderLink(item, item.label) :\n\n <a href={item.href} className={linkClass}>\n {item.label}\n </a> :\n\n\n <span\n className={isLast ? 'font-medium text-fg' : 'text-muted'}\n aria-current={isLast ? 'page' : undefined}>\n\n {item.label}\n </span>\n }\n {!isLast &&\n <ChevronRightIcon\n className=\"h-3.5 w-3.5 flex-shrink-0 text-border-strong\"\n aria-hidden=\"true\" />\n\n }\n </Fragment>);\n\n })}\n </nav>);\n\n}\n"]}
|