@estiva-app/ui 0.30.0 → 0.31.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 +5 -1
- package/dist/CommandPalette.d.ts.map +1 -1
- package/dist/DialogShell.d.ts.map +1 -1
- package/dist/eslint/index.d.ts +1 -0
- package/dist/eslint/index.d.ts.map +1 -1
- package/dist/eslint/index.js +119 -22
- package/dist/eslint/index.js.map +4 -4
- package/dist/eslint/no-handmade-header.d.ts +17 -0
- package/dist/eslint/no-handmade-header.d.ts.map +1 -0
- package/dist/gates/app-checks.d.ts +1 -1
- package/dist/gates/app-checks.d.ts.map +1 -1
- package/dist/gates/index.js +4 -2
- package/dist/gates/index.js.map +2 -2
- package/dist/index.js +142 -123
- package/dist/index.js.map +4 -4
- package/package.json +1 -1
- package/registry.json +1 -1
- package/src/CommandPalette.tsx +1 -0
- package/src/ContainerHeader.mdx +3 -2
- package/src/DialogShell.tsx +22 -17
- package/src/eslint/index.test.ts +13 -9
- package/src/eslint/index.ts +4 -0
- package/src/eslint/no-handmade-header.test.ts +89 -0
- package/src/eslint/no-handmade-header.ts +153 -0
- package/src/gates/app-checks.ts +5 -3
- package/src/gates/create-app.test.ts +1 -1
- package/src/gates/gates.test.ts +1 -1
package/dist/index.js
CHANGED
|
@@ -2251,20 +2251,36 @@ import { useRef as useRef6 } from "react";
|
|
|
2251
2251
|
import { Dialog as Dialog3 } from "@base-ui/react/dialog";
|
|
2252
2252
|
import { AlertDialog } from "@base-ui/react/alert-dialog";
|
|
2253
2253
|
import { IconX as IconX5 } from "@tabler/icons-react";
|
|
2254
|
+
|
|
2255
|
+
// src/ContainerHeader.tsx
|
|
2256
|
+
import { IconChevronDown as IconChevronDown3 } from "@tabler/icons-react";
|
|
2254
2257
|
import { jsx as jsx34, jsxs as jsxs24 } from "react/jsx-runtime";
|
|
2258
|
+
function ContainerHeader({ title, chevron = false, actions, className }) {
|
|
2259
|
+
const text = typeof title === "string";
|
|
2260
|
+
return /* @__PURE__ */ jsxs24("div", { className: cn("flex h-12 shrink-0 items-center justify-between overflow-hidden border-b border-border-subtle py-2 pr-4 pl-5", className), children: [
|
|
2261
|
+
/* @__PURE__ */ jsx34("div", { className: cn("flex items-center gap-2 overflow-hidden", text ? "shrink-0" : "min-w-0 flex-1"), children: /* @__PURE__ */ jsxs24("div", { className: cn("flex items-center gap-1", text ? "shrink-0" : "min-w-0 flex-1"), children: [
|
|
2262
|
+
text ? /* @__PURE__ */ jsx34("span", { className: "whitespace-nowrap text-body-2-strong text-text-primary", children: title }) : /* @__PURE__ */ jsx34("div", { className: "min-w-0 flex-1", children: title }),
|
|
2263
|
+
chevron && /* @__PURE__ */ jsx34(IconChevronDown3, { size: 12, stroke: 1.5, className: "shrink-0 text-text-secondary" })
|
|
2264
|
+
] }) }),
|
|
2265
|
+
actions && /* @__PURE__ */ jsx34("div", { className: "flex shrink-0 items-center justify-end gap-3", children: /* @__PURE__ */ jsx34("div", { className: "flex shrink-0 items-center gap-1", children: actions }) })
|
|
2266
|
+
] });
|
|
2267
|
+
}
|
|
2268
|
+
|
|
2269
|
+
// src/DialogShell.tsx
|
|
2270
|
+
import { jsx as jsx35, jsxs as jsxs25 } from "react/jsx-runtime";
|
|
2255
2271
|
function DialogShell({ title, onClose, headerContent, footer, children, bodyClassName, bodyMaxHeight, width = 502, alert = false }) {
|
|
2256
2272
|
const Parts = alert ? AlertDialog : Dialog3;
|
|
2257
2273
|
const popupRef = useRef6(null);
|
|
2258
|
-
return /* @__PURE__ */
|
|
2274
|
+
return /* @__PURE__ */ jsx35(
|
|
2259
2275
|
Parts.Root,
|
|
2260
2276
|
{
|
|
2261
2277
|
open: true,
|
|
2262
2278
|
onOpenChange: (open) => {
|
|
2263
2279
|
if (!open) onClose();
|
|
2264
2280
|
},
|
|
2265
|
-
children: /* @__PURE__ */
|
|
2266
|
-
/* @__PURE__ */
|
|
2267
|
-
/* @__PURE__ */
|
|
2281
|
+
children: /* @__PURE__ */ jsxs25(Parts.Portal, { children: [
|
|
2282
|
+
/* @__PURE__ */ jsx35(Parts.Backdrop, { className: "fixed inset-0 z-40 bg-scrim" }),
|
|
2283
|
+
/* @__PURE__ */ jsx35("div", { className: "fixed inset-0 z-50 flex items-center justify-center pointer-events-none", children: /* @__PURE__ */ jsxs25(
|
|
2268
2284
|
Parts.Popup,
|
|
2269
2285
|
{
|
|
2270
2286
|
ref: popupRef,
|
|
@@ -2273,20 +2289,37 @@ function DialogShell({ title, onClose, headerContent, footer, children, bodyClas
|
|
|
2273
2289
|
className: "bg-bg-elevated border border-border-subtle rounded-lg shadow-lg pointer-events-auto flex flex-col overflow-hidden outline-none",
|
|
2274
2290
|
style: { width },
|
|
2275
2291
|
children: [
|
|
2276
|
-
/* @__PURE__ */
|
|
2277
|
-
|
|
2278
|
-
|
|
2279
|
-
Parts.
|
|
2280
|
-
|
|
2281
|
-
|
|
2282
|
-
|
|
2283
|
-
|
|
2284
|
-
|
|
2292
|
+
/* @__PURE__ */ jsx35(
|
|
2293
|
+
ContainerHeader,
|
|
2294
|
+
{
|
|
2295
|
+
title: headerContent ?? /* @__PURE__ */ jsx35(Parts.Title, { className: "text-h4 text-text-primary", render: /* @__PURE__ */ jsx35("span", {}), children: title }),
|
|
2296
|
+
actions: (
|
|
2297
|
+
/*
|
|
2298
|
+
The ✕ IS the `Close` part now, rather than a button that calls
|
|
2299
|
+
`onClose` beside one (stage 4, 2026-09-07). Stage 3 could not do
|
|
2300
|
+
this: an `IconButton` carrying a `tooltip` returned the tooltip
|
|
2301
|
+
wrapper `<div>` as its root, so the part composed onto the
|
|
2302
|
+
wrapper and not the button. Porting Tooltip removed the wrapper
|
|
2303
|
+
— the trigger is the button itself — and the composition works.
|
|
2304
|
+
|
|
2305
|
+
What it buys: the dialog closes through its own state machine,
|
|
2306
|
+
so the ✕, Escape and the outside press are one path with one
|
|
2307
|
+
reason attached, instead of one of the three going around.
|
|
2308
|
+
*/
|
|
2309
|
+
/* @__PURE__ */ jsx35(
|
|
2310
|
+
Parts.Close,
|
|
2311
|
+
{
|
|
2312
|
+
render: /* @__PURE__ */ jsx35(IconButton, { tooltip: "Close", "aria-label": "Close", children: /* @__PURE__ */ jsx35(IconX5, { size: 16, stroke: 1.5 }) })
|
|
2313
|
+
}
|
|
2314
|
+
)
|
|
2315
|
+
)
|
|
2316
|
+
}
|
|
2317
|
+
),
|
|
2285
2318
|
bodyMaxHeight ? (
|
|
2286
2319
|
// The line above the footer on a box of the shell's own, not pushed into ScrollArea (UIG-9).
|
|
2287
|
-
/* @__PURE__ */
|
|
2288
|
-
) : /* @__PURE__ */
|
|
2289
|
-
footer != null && /* @__PURE__ */
|
|
2320
|
+
/* @__PURE__ */ jsx35("div", { className: cn(footer != null && "border-b border-border-subtle"), children: /* @__PURE__ */ jsx35(ScrollArea, { viewportClassName: bodyMaxHeight, contentClassName: cn("pl-5 pr-4 py-4", bodyClassName), children }) })
|
|
2321
|
+
) : /* @__PURE__ */ jsx35("div", { className: cn("pl-5 pr-4 py-4", footer != null && "border-b border-border-subtle", bodyClassName), children }),
|
|
2322
|
+
footer != null && /* @__PURE__ */ jsx35("div", { className: "h-12 flex items-center justify-end gap-2 pl-5 pr-4 shrink-0", children: footer })
|
|
2290
2323
|
]
|
|
2291
2324
|
}
|
|
2292
2325
|
) })
|
|
@@ -2296,7 +2329,7 @@ function DialogShell({ title, onClose, headerContent, footer, children, bodyClas
|
|
|
2296
2329
|
}
|
|
2297
2330
|
|
|
2298
2331
|
// src/ConfirmDialog.tsx
|
|
2299
|
-
import { Fragment as Fragment6, jsx as
|
|
2332
|
+
import { Fragment as Fragment6, jsx as jsx36, jsxs as jsxs26 } from "react/jsx-runtime";
|
|
2300
2333
|
function ConfirmDialog({ title, children, confirmLabel, destructive = false, onConfirm, onClose }) {
|
|
2301
2334
|
const [busy, setBusy] = useState4(false);
|
|
2302
2335
|
const confirm = async () => {
|
|
@@ -2308,17 +2341,17 @@ function ConfirmDialog({ title, children, confirmLabel, destructive = false, onC
|
|
|
2308
2341
|
setBusy(false);
|
|
2309
2342
|
}
|
|
2310
2343
|
};
|
|
2311
|
-
return /* @__PURE__ */
|
|
2344
|
+
return /* @__PURE__ */ jsx36(
|
|
2312
2345
|
DialogShell,
|
|
2313
2346
|
{
|
|
2314
2347
|
alert: true,
|
|
2315
2348
|
title,
|
|
2316
2349
|
onClose,
|
|
2317
|
-
footer: /* @__PURE__ */
|
|
2318
|
-
/* @__PURE__ */
|
|
2319
|
-
/* @__PURE__ */
|
|
2350
|
+
footer: /* @__PURE__ */ jsxs26(Fragment6, { children: [
|
|
2351
|
+
/* @__PURE__ */ jsx36(Button, { variant: "muted", onClick: onClose, disabled: busy, children: "Cancel" }),
|
|
2352
|
+
/* @__PURE__ */ jsx36(Button, { variant: destructive ? "destructive" : "primary", onClick: () => void confirm(), disabled: busy, children: confirmLabel })
|
|
2320
2353
|
] }),
|
|
2321
|
-
children: /* @__PURE__ */
|
|
2354
|
+
children: /* @__PURE__ */ jsx36("div", { className: "flex flex-col gap-3 text-body-2 text-text-primary", children })
|
|
2322
2355
|
}
|
|
2323
2356
|
);
|
|
2324
2357
|
}
|
|
@@ -2327,7 +2360,7 @@ function ConfirmDialog({ title, children, confirmLabel, destructive = false, onC
|
|
|
2327
2360
|
import { useEffect as useEffect3, useRef as useRef7, useState as useState5 } from "react";
|
|
2328
2361
|
import { Field as BaseField4 } from "@base-ui/react/field";
|
|
2329
2362
|
import { Input as Input2 } from "@base-ui/react/input";
|
|
2330
|
-
import { jsx as
|
|
2363
|
+
import { jsx as jsx37 } from "react/jsx-runtime";
|
|
2331
2364
|
function EditableText({ value, display, displayNode, placeholder, onCommit, multiline = false, className, label, readOnly = false }) {
|
|
2332
2365
|
const [editing, setEditing] = useState5(false);
|
|
2333
2366
|
const [draft, setDraft] = useState5(value);
|
|
@@ -2385,7 +2418,7 @@ function EditableText({ value, display, displayNode, placeholder, onCommit, mult
|
|
|
2385
2418
|
written and never read. Read-only, this is a line of text: whatever
|
|
2386
2419
|
names the region around it (a `Field`, a `Property`) names this too.
|
|
2387
2420
|
*/
|
|
2388
|
-
/* @__PURE__ */
|
|
2421
|
+
/* @__PURE__ */ jsx37(
|
|
2389
2422
|
"div",
|
|
2390
2423
|
{
|
|
2391
2424
|
className: cn("w-full px-2 py-1", multiline && !displayNode && "whitespace-pre-wrap", display ?? value ? "text-text-primary" : "text-text-muted", className),
|
|
@@ -2395,11 +2428,11 @@ function EditableText({ value, display, displayNode, placeholder, onCommit, mult
|
|
|
2395
2428
|
);
|
|
2396
2429
|
}
|
|
2397
2430
|
if (editing) {
|
|
2398
|
-
return multiline ? /* @__PURE__ */
|
|
2431
|
+
return multiline ? /* @__PURE__ */ jsx37(
|
|
2399
2432
|
BaseField4.Control,
|
|
2400
2433
|
{
|
|
2401
2434
|
ref: fieldRef,
|
|
2402
|
-
render: /* @__PURE__ */
|
|
2435
|
+
render: /* @__PURE__ */ jsx37("textarea", { rows: 4 }),
|
|
2403
2436
|
"aria-label": label,
|
|
2404
2437
|
value: draft,
|
|
2405
2438
|
disabled: busy,
|
|
@@ -2408,7 +2441,7 @@ function EditableText({ value, display, displayNode, placeholder, onCommit, mult
|
|
|
2408
2441
|
onBlur: () => void commit(),
|
|
2409
2442
|
className: fieldClass
|
|
2410
2443
|
}
|
|
2411
|
-
) : /* @__PURE__ */
|
|
2444
|
+
) : /* @__PURE__ */ jsx37(
|
|
2412
2445
|
Input2,
|
|
2413
2446
|
{
|
|
2414
2447
|
ref: fieldRef,
|
|
@@ -2422,7 +2455,7 @@ function EditableText({ value, display, displayNode, placeholder, onCommit, mult
|
|
|
2422
2455
|
}
|
|
2423
2456
|
);
|
|
2424
2457
|
}
|
|
2425
|
-
return /* @__PURE__ */
|
|
2458
|
+
return /* @__PURE__ */ jsx37(
|
|
2426
2459
|
"button",
|
|
2427
2460
|
{
|
|
2428
2461
|
type: "button",
|
|
@@ -2442,7 +2475,7 @@ function EditableText({ value, display, displayNode, placeholder, onCommit, mult
|
|
|
2442
2475
|
// src/ErrorBoundary.tsx
|
|
2443
2476
|
import { Component } from "react";
|
|
2444
2477
|
import { IconAlertTriangle as IconAlertTriangle2 } from "@tabler/icons-react";
|
|
2445
|
-
import { jsx as
|
|
2478
|
+
import { jsx as jsx38 } from "react/jsx-runtime";
|
|
2446
2479
|
var ErrorBoundary = class extends Component {
|
|
2447
2480
|
state = { hasError: false };
|
|
2448
2481
|
static getDerivedStateFromError() {
|
|
@@ -2453,22 +2486,22 @@ var ErrorBoundary = class extends Component {
|
|
|
2453
2486
|
}
|
|
2454
2487
|
render() {
|
|
2455
2488
|
if (!this.state.hasError) return this.props.children;
|
|
2456
|
-
const message = /* @__PURE__ */
|
|
2489
|
+
const message = /* @__PURE__ */ jsx38(
|
|
2457
2490
|
EmptyState,
|
|
2458
2491
|
{
|
|
2459
|
-
icon: /* @__PURE__ */
|
|
2492
|
+
icon: /* @__PURE__ */ jsx38(IconAlertTriangle2, { size: 16, stroke: 1.5 }),
|
|
2460
2493
|
message: `Something went wrong${this.props.label ? ` in the ${this.props.label}` : ""}. Your data is safe \u2014 try again.`,
|
|
2461
2494
|
action: { label: "Try again", onClick: () => this.setState({ hasError: false }) }
|
|
2462
2495
|
}
|
|
2463
2496
|
);
|
|
2464
2497
|
if (this.props.frame) return this.props.frame(message);
|
|
2465
|
-
return this.props.fallbackClassName ? /* @__PURE__ */
|
|
2498
|
+
return this.props.fallbackClassName ? /* @__PURE__ */ jsx38("div", { className: this.props.fallbackClassName, children: message }) : message;
|
|
2466
2499
|
}
|
|
2467
2500
|
};
|
|
2468
2501
|
|
|
2469
2502
|
// src/ProgressBar.tsx
|
|
2470
2503
|
import { Progress } from "@base-ui/react/progress";
|
|
2471
|
-
import { jsx as
|
|
2504
|
+
import { jsx as jsx39 } from "react/jsx-runtime";
|
|
2472
2505
|
var TRACK_CLASSES = {
|
|
2473
2506
|
default: "h-1.5 w-full overflow-hidden rounded-full bg-bg-inset",
|
|
2474
2507
|
// 4px, Katerina's ruling of 14 September; Peek's own bar is 3px until it takes this one.
|
|
@@ -2481,13 +2514,13 @@ var INDICATOR_CLASSES = {
|
|
|
2481
2514
|
function ProgressBar({ value, max, label, variant = "default", className }) {
|
|
2482
2515
|
return (
|
|
2483
2516
|
// `max={0}` needs no guard: Base UI reads the 0/0 share as an empty bar.
|
|
2484
|
-
/* @__PURE__ */
|
|
2517
|
+
/* @__PURE__ */ jsx39(Progress.Root, { value, max, "aria-label": label, className, children: /* @__PURE__ */ jsx39(Progress.Track, { className: TRACK_CLASSES[variant], children: /* @__PURE__ */ jsx39(Progress.Indicator, { className: INDICATOR_CLASSES[variant] }) }) })
|
|
2485
2518
|
);
|
|
2486
2519
|
}
|
|
2487
2520
|
|
|
2488
2521
|
// src/Breadcrumb.tsx
|
|
2489
2522
|
import { Fragment as Fragment7, useCallback as useCallback2, useLayoutEffect as useLayoutEffect4, useRef as useRef8, useState as useState6 } from "react";
|
|
2490
|
-
import { jsx as
|
|
2523
|
+
import { jsx as jsx40, jsxs as jsxs27 } from "react/jsx-runtime";
|
|
2491
2524
|
function Breadcrumb({ items, className }) {
|
|
2492
2525
|
const navRef = useRef8(null);
|
|
2493
2526
|
const labelRefs = useRef8([]);
|
|
@@ -2507,7 +2540,7 @@ function Breadcrumb({ items, className }) {
|
|
|
2507
2540
|
observer.observe(nav);
|
|
2508
2541
|
return () => observer.disconnect();
|
|
2509
2542
|
}, [measure, items]);
|
|
2510
|
-
return /* @__PURE__ */
|
|
2543
|
+
return /* @__PURE__ */ jsx40("nav", { ref: navRef, "aria-label": "Breadcrumb", className: cn("flex min-w-0 items-center gap-1.5 text-body-2", className), children: items.map((item, index) => {
|
|
2511
2544
|
const last = index === items.length - 1;
|
|
2512
2545
|
const tone = item.muted || last && item.mono ? "text-text-muted" : last ? "text-text-primary" : "text-text-secondary";
|
|
2513
2546
|
const text = cn(
|
|
@@ -2528,25 +2561,25 @@ function Breadcrumb({ items, className }) {
|
|
|
2528
2561
|
// on a box around it, which the link takes them from, rather than
|
|
2529
2562
|
// pushed into it (UIG-9); the link is still the one element that
|
|
2530
2563
|
// truncates and is measured.
|
|
2531
|
-
/* @__PURE__ */
|
|
2532
|
-
) : /* @__PURE__ */
|
|
2533
|
-
return /* @__PURE__ */
|
|
2534
|
-
index > 0 && /* @__PURE__ */
|
|
2535
|
-
item.icon && /* @__PURE__ */
|
|
2564
|
+
/* @__PURE__ */ jsx40("span", { className: cn("flex min-w-0", item.mono && "shrink-0 font-mono text-caption", tone, "hover:text-text-primary"), children: /* @__PURE__ */ jsx40(Link, { ref: setLabelRef, variant: "plain", truncate: true, href: item.href, onClick: item.onClick, children: item.label }) })
|
|
2565
|
+
) : /* @__PURE__ */ jsx40("span", { ref: setLabelRef, className: text, "aria-current": last ? "page" : void 0, children: item.label });
|
|
2566
|
+
return /* @__PURE__ */ jsxs27(Fragment7, { children: [
|
|
2567
|
+
index > 0 && /* @__PURE__ */ jsx40("span", { "aria-hidden": "true", className: "shrink-0 text-text-muted", children: "/" }),
|
|
2568
|
+
item.icon && /* @__PURE__ */ jsx40("span", { "aria-hidden": "true", className: cn("flex shrink-0", tone), children: item.icon }),
|
|
2536
2569
|
truncated.has(index) ? (
|
|
2537
2570
|
// `min-w-0 shrink` undoes the wrapper's own shrink-0 — the crumb
|
|
2538
2571
|
// must keep truncating inside it, or wrapping it would widen the
|
|
2539
2572
|
// trail and the tooltip would never be needed again.
|
|
2540
|
-
/* @__PURE__ */
|
|
2573
|
+
/* @__PURE__ */ jsx40(WithTooltip, { label: item.label, wrapperClassName: "min-w-0 shrink", children: crumb })
|
|
2541
2574
|
) : crumb
|
|
2542
2575
|
] }, `${item.label}-${index}`);
|
|
2543
2576
|
}) });
|
|
2544
2577
|
}
|
|
2545
2578
|
|
|
2546
2579
|
// src/NavItem.tsx
|
|
2547
|
-
import { jsx as
|
|
2580
|
+
import { jsx as jsx41, jsxs as jsxs28 } from "react/jsx-runtime";
|
|
2548
2581
|
function NavItem({ label, href, count, countLabel, active = false, icon, className, ...props }) {
|
|
2549
|
-
return /* @__PURE__ */
|
|
2582
|
+
return /* @__PURE__ */ jsxs28(
|
|
2550
2583
|
"a",
|
|
2551
2584
|
{
|
|
2552
2585
|
href,
|
|
@@ -2561,9 +2594,9 @@ function NavItem({ label, href, count, countLabel, active = false, icon, classNa
|
|
|
2561
2594
|
),
|
|
2562
2595
|
...props,
|
|
2563
2596
|
children: [
|
|
2564
|
-
icon && /* @__PURE__ */
|
|
2565
|
-
/* @__PURE__ */
|
|
2566
|
-
count ? /* @__PURE__ */
|
|
2597
|
+
icon && /* @__PURE__ */ jsx41("span", { className: "flex shrink-0 items-center", children: icon }),
|
|
2598
|
+
/* @__PURE__ */ jsx41("span", { className: "flex-1 truncate", children: label }),
|
|
2599
|
+
count ? /* @__PURE__ */ jsx41(WithTooltip, { label: countLabel ?? `${count} open`, children: /* @__PURE__ */ jsx41("span", { className: "min-w-4 shrink-0 text-center font-mono text-caption tabular-nums text-text-muted", children: count }) }) : null
|
|
2567
2600
|
]
|
|
2568
2601
|
}
|
|
2569
2602
|
);
|
|
@@ -2572,7 +2605,7 @@ function NavItem({ label, href, count, countLabel, active = false, icon, classNa
|
|
|
2572
2605
|
// src/Popover.tsx
|
|
2573
2606
|
import { useMemo as useMemo3 } from "react";
|
|
2574
2607
|
import { Popover as BasePopover } from "@base-ui/react/popover";
|
|
2575
|
-
import { jsx as
|
|
2608
|
+
import { jsx as jsx42, jsxs as jsxs29 } from "react/jsx-runtime";
|
|
2576
2609
|
var GAP5 = 4;
|
|
2577
2610
|
var VIEWPORT_PAD5 = 8;
|
|
2578
2611
|
function Popover({ trigger, anchor, align = "left", side = "bottom", open, onOpenChange, finalFocus, actionsRef, ariaLabel, children, className, contentClassName, maxHeight }) {
|
|
@@ -2581,7 +2614,7 @@ function Popover({ trigger, anchor, align = "left", side = "bottom", open, onOpe
|
|
|
2581
2614
|
if (anchor instanceof Element) return anchor;
|
|
2582
2615
|
return { getBoundingClientRect: () => anchor };
|
|
2583
2616
|
}, [anchor]);
|
|
2584
|
-
return /* @__PURE__ */
|
|
2617
|
+
return /* @__PURE__ */ jsxs29(
|
|
2585
2618
|
BasePopover.Root,
|
|
2586
2619
|
{
|
|
2587
2620
|
open,
|
|
@@ -2589,8 +2622,8 @@ function Popover({ trigger, anchor, align = "left", side = "bottom", open, onOpe
|
|
|
2589
2622
|
actionsRef,
|
|
2590
2623
|
modal: false,
|
|
2591
2624
|
children: [
|
|
2592
|
-
trigger && /* @__PURE__ */
|
|
2593
|
-
/* @__PURE__ */
|
|
2625
|
+
trigger && /* @__PURE__ */ jsx42(BasePopover.Trigger, { render: trigger, disabled: triggerDisabled(trigger) }),
|
|
2626
|
+
/* @__PURE__ */ jsx42(BasePopover.Portal, { children: /* @__PURE__ */ jsx42(
|
|
2594
2627
|
BasePopover.Positioner,
|
|
2595
2628
|
{
|
|
2596
2629
|
anchor: anchorTarget,
|
|
@@ -2599,20 +2632,20 @@ function Popover({ trigger, anchor, align = "left", side = "bottom", open, onOpe
|
|
|
2599
2632
|
sideOffset: GAP5,
|
|
2600
2633
|
collisionPadding: VIEWPORT_PAD5,
|
|
2601
2634
|
className: "z-50 data-[anchor-hidden]:hidden",
|
|
2602
|
-
children: /* @__PURE__ */
|
|
2635
|
+
children: /* @__PURE__ */ jsx42(
|
|
2603
2636
|
BasePopover.Popup,
|
|
2604
2637
|
{
|
|
2605
2638
|
"aria-label": ariaLabel,
|
|
2606
2639
|
initialFocus: trigger ? void 0 : false,
|
|
2607
2640
|
finalFocus,
|
|
2608
2641
|
className: cn("min-w-[180px] outline-none p-0", className),
|
|
2609
|
-
render: /* @__PURE__ */
|
|
2610
|
-
children: /* @__PURE__ */
|
|
2642
|
+
render: /* @__PURE__ */ jsx42(MenuPanel, {}),
|
|
2643
|
+
children: /* @__PURE__ */ jsx42(
|
|
2611
2644
|
ScrollArea,
|
|
2612
2645
|
{
|
|
2613
2646
|
viewportClassName: maxHeight ?? "max-h-[var(--available-height)]",
|
|
2614
2647
|
contentClassName: cn("flex flex-col p-2", contentClassName),
|
|
2615
|
-
children: /* @__PURE__ */
|
|
2648
|
+
children: /* @__PURE__ */ jsx42(DividerInPanel.Provider, { value: true, children })
|
|
2616
2649
|
}
|
|
2617
2650
|
)
|
|
2618
2651
|
}
|
|
@@ -2626,9 +2659,9 @@ function Popover({ trigger, anchor, align = "left", side = "bottom", open, onOpe
|
|
|
2626
2659
|
|
|
2627
2660
|
// src/Toolbar.tsx
|
|
2628
2661
|
import { Toolbar as BaseToolbar } from "@base-ui/react/toolbar";
|
|
2629
|
-
import { jsx as
|
|
2662
|
+
import { jsx as jsx43 } from "react/jsx-runtime";
|
|
2630
2663
|
function Toolbar({ "aria-label": ariaLabel, orientation = "horizontal", loopFocus = true, surface = true, children, className }) {
|
|
2631
|
-
const strip = /* @__PURE__ */
|
|
2664
|
+
const strip = /* @__PURE__ */ jsx43(
|
|
2632
2665
|
BaseToolbar.Root,
|
|
2633
2666
|
{
|
|
2634
2667
|
"aria-label": ariaLabel,
|
|
@@ -2639,27 +2672,27 @@ function Toolbar({ "aria-label": ariaLabel, orientation = "horizontal", loopFocu
|
|
|
2639
2672
|
}
|
|
2640
2673
|
);
|
|
2641
2674
|
if (!surface) return strip;
|
|
2642
|
-
return /* @__PURE__ */
|
|
2675
|
+
return /* @__PURE__ */ jsx43(MenuPanel, { className: "w-fit p-1", children: strip });
|
|
2643
2676
|
}
|
|
2644
2677
|
function ToolbarButton({ ref, disabled, disabledReason, ...props }) {
|
|
2645
|
-
return /* @__PURE__ */
|
|
2678
|
+
return /* @__PURE__ */ jsx43(
|
|
2646
2679
|
BaseToolbar.Button,
|
|
2647
2680
|
{
|
|
2648
2681
|
ref,
|
|
2649
2682
|
disabled: disabled || !!disabledReason,
|
|
2650
2683
|
focusableWhenDisabled: true,
|
|
2651
|
-
render: /* @__PURE__ */
|
|
2684
|
+
render: /* @__PURE__ */ jsx43(IconButton, { disabled, disabledReason, ...props })
|
|
2652
2685
|
}
|
|
2653
2686
|
);
|
|
2654
2687
|
}
|
|
2655
2688
|
function ToolbarLink({ ref, href, ...props }) {
|
|
2656
|
-
return /* @__PURE__ */
|
|
2689
|
+
return /* @__PURE__ */ jsx43(BaseToolbar.Link, { ref, render: /* @__PURE__ */ jsx43(IconButton, { href, ...props }) });
|
|
2657
2690
|
}
|
|
2658
2691
|
function ToolbarInput({ size, ...props }) {
|
|
2659
|
-
return /* @__PURE__ */
|
|
2692
|
+
return /* @__PURE__ */ jsx43(BaseToolbar.Input, { render: /* @__PURE__ */ jsx43(TextInput, { size }), ...props });
|
|
2660
2693
|
}
|
|
2661
2694
|
function ToolbarSeparator({ className }) {
|
|
2662
|
-
return /* @__PURE__ */
|
|
2695
|
+
return /* @__PURE__ */ jsx43(
|
|
2663
2696
|
BaseToolbar.Separator,
|
|
2664
2697
|
{
|
|
2665
2698
|
orientation: "vertical",
|
|
@@ -2669,9 +2702,9 @@ function ToolbarSeparator({ className }) {
|
|
|
2669
2702
|
}
|
|
2670
2703
|
|
|
2671
2704
|
// src/ReactionPicker.tsx
|
|
2672
|
-
import { jsx as
|
|
2705
|
+
import { jsx as jsx44 } from "react/jsx-runtime";
|
|
2673
2706
|
function ReactionPicker({ options, onSelect, "aria-label": ariaLabel = "Reactions", surface = true, className }) {
|
|
2674
|
-
return /* @__PURE__ */
|
|
2707
|
+
return /* @__PURE__ */ jsx44(Toolbar, { "aria-label": ariaLabel, surface, className: cn("gap-0.5", className), children: options.map((option) => (
|
|
2675
2708
|
/*
|
|
2676
2709
|
A `ToolbarButton`, not a button in a tooltip wrapper. The wrapper
|
|
2677
2710
|
would become the toolbar's item and the button inside it would never
|
|
@@ -2681,14 +2714,14 @@ function ReactionPicker({ options, onSelect, "aria-label": ariaLabel = "Reaction
|
|
|
2681
2714
|
The tooltip names it for a pointer, `aria-label` for everything else,
|
|
2682
2715
|
and both say the meaning rather than the glyph.
|
|
2683
2716
|
*/
|
|
2684
|
-
/* @__PURE__ */
|
|
2717
|
+
/* @__PURE__ */ jsx44(
|
|
2685
2718
|
ToolbarButton,
|
|
2686
2719
|
{
|
|
2687
2720
|
"aria-label": option.label,
|
|
2688
2721
|
tooltip: option.label,
|
|
2689
2722
|
onClick: () => onSelect(option.emoji),
|
|
2690
2723
|
className: "size-7",
|
|
2691
|
-
children: /* @__PURE__ */
|
|
2724
|
+
children: /* @__PURE__ */ jsx44("span", { "aria-hidden": "true", className: "text-h3 leading-none", children: option.emoji })
|
|
2692
2725
|
},
|
|
2693
2726
|
option.emoji
|
|
2694
2727
|
)
|
|
@@ -2697,23 +2730,23 @@ function ReactionPicker({ options, onSelect, "aria-label": ariaLabel = "Reaction
|
|
|
2697
2730
|
|
|
2698
2731
|
// src/PreviewCard.tsx
|
|
2699
2732
|
import { PreviewCard as BasePreviewCard } from "@base-ui/react/preview-card";
|
|
2700
|
-
import { jsx as
|
|
2733
|
+
import { jsx as jsx45, jsxs as jsxs30 } from "react/jsx-runtime";
|
|
2701
2734
|
var GAP6 = 12;
|
|
2702
2735
|
var VIEWPORT_PAD6 = 8;
|
|
2703
2736
|
var OPEN_DELAY2 = 350;
|
|
2704
2737
|
var CLOSE_DELAY = 200;
|
|
2705
2738
|
function PreviewCard({ content, children, side = "right", delay = OPEN_DELAY2, closeDelay = CLOSE_DELAY, className, contentClassName, wrapperClassName }) {
|
|
2706
|
-
return /* @__PURE__ */
|
|
2707
|
-
/* @__PURE__ */
|
|
2739
|
+
return /* @__PURE__ */ jsxs30(BasePreviewCard.Root, { children: [
|
|
2740
|
+
/* @__PURE__ */ jsx45(
|
|
2708
2741
|
BasePreviewCard.Trigger,
|
|
2709
2742
|
{
|
|
2710
2743
|
delay,
|
|
2711
2744
|
closeDelay,
|
|
2712
|
-
render: /* @__PURE__ */
|
|
2745
|
+
render: /* @__PURE__ */ jsx45("span", { className: cn("inline-flex", wrapperClassName) }),
|
|
2713
2746
|
children
|
|
2714
2747
|
}
|
|
2715
2748
|
),
|
|
2716
|
-
/* @__PURE__ */
|
|
2749
|
+
/* @__PURE__ */ jsx45(BasePreviewCard.Portal, { children: /* @__PURE__ */ jsx45(
|
|
2717
2750
|
BasePreviewCard.Positioner,
|
|
2718
2751
|
{
|
|
2719
2752
|
side,
|
|
@@ -2721,12 +2754,12 @@ function PreviewCard({ content, children, side = "right", delay = OPEN_DELAY2, c
|
|
|
2721
2754
|
sideOffset: GAP6,
|
|
2722
2755
|
collisionPadding: VIEWPORT_PAD6,
|
|
2723
2756
|
className: "z-50 data-[anchor-hidden]:hidden",
|
|
2724
|
-
children: /* @__PURE__ */
|
|
2757
|
+
children: /* @__PURE__ */ jsx45(
|
|
2725
2758
|
BasePreviewCard.Popup,
|
|
2726
2759
|
{
|
|
2727
2760
|
className: cn("w-[360px] p-0 outline-none", className),
|
|
2728
|
-
render: /* @__PURE__ */
|
|
2729
|
-
children: /* @__PURE__ */
|
|
2761
|
+
render: /* @__PURE__ */ jsx45(MenuPanel, {}),
|
|
2762
|
+
children: /* @__PURE__ */ jsx45(ScrollArea, { viewportClassName: "max-h-[min(300px,var(--available-height))]", contentClassName: cn("flex flex-col gap-3 p-3", contentClassName), children: content })
|
|
2730
2763
|
}
|
|
2731
2764
|
)
|
|
2732
2765
|
}
|
|
@@ -2735,15 +2768,15 @@ function PreviewCard({ content, children, side = "right", delay = OPEN_DELAY2, c
|
|
|
2735
2768
|
}
|
|
2736
2769
|
|
|
2737
2770
|
// src/Rail.tsx
|
|
2738
|
-
import { jsx as
|
|
2771
|
+
import { jsx as jsx46 } from "react/jsx-runtime";
|
|
2739
2772
|
function Rail({ "aria-label": ariaLabel = "Navigation", children, className }) {
|
|
2740
|
-
return /* @__PURE__ */
|
|
2773
|
+
return /* @__PURE__ */ jsx46("nav", { "aria-label": ariaLabel, className: cn("flex w-16 shrink-0 flex-col items-start gap-2 px-2 py-3", className), children });
|
|
2741
2774
|
}
|
|
2742
2775
|
|
|
2743
2776
|
// src/RailItem.tsx
|
|
2744
|
-
import { jsx as
|
|
2777
|
+
import { jsx as jsx47, jsxs as jsxs31 } from "react/jsx-runtime";
|
|
2745
2778
|
function RailItem({ href, icon, label, active = false, className, ...props }) {
|
|
2746
|
-
return /* @__PURE__ */
|
|
2779
|
+
return /* @__PURE__ */ jsxs31(
|
|
2747
2780
|
"a",
|
|
2748
2781
|
{
|
|
2749
2782
|
href,
|
|
@@ -2751,14 +2784,14 @@ function RailItem({ href, icon, label, active = false, className, ...props }) {
|
|
|
2751
2784
|
className: cn("group flex h-12 w-full shrink-0 flex-col items-center gap-0.5 px-2 py-0.5", className),
|
|
2752
2785
|
...props,
|
|
2753
2786
|
children: [
|
|
2754
|
-
/* @__PURE__ */
|
|
2787
|
+
/* @__PURE__ */ jsx47(
|
|
2755
2788
|
"div",
|
|
2756
2789
|
{
|
|
2757
2790
|
className: cn(
|
|
2758
2791
|
"flex items-center justify-center rounded-lg p-2 transition-colors",
|
|
2759
2792
|
active ? "bg-bg-selected" : "group-hover:bg-bg-hover"
|
|
2760
2793
|
),
|
|
2761
|
-
children: /* @__PURE__ */
|
|
2794
|
+
children: /* @__PURE__ */ jsx47(
|
|
2762
2795
|
"span",
|
|
2763
2796
|
{
|
|
2764
2797
|
className: cn(
|
|
@@ -2770,27 +2803,27 @@ function RailItem({ href, icon, label, active = false, className, ...props }) {
|
|
|
2770
2803
|
)
|
|
2771
2804
|
}
|
|
2772
2805
|
),
|
|
2773
|
-
/* @__PURE__ */
|
|
2806
|
+
/* @__PURE__ */ jsx47("span", { className: cn("text-center text-menu", active ? "text-text-primary" : "text-text-secondary"), children: label })
|
|
2774
2807
|
]
|
|
2775
2808
|
}
|
|
2776
2809
|
);
|
|
2777
2810
|
}
|
|
2778
2811
|
|
|
2779
2812
|
// src/Sidebar.tsx
|
|
2780
|
-
import { jsx as
|
|
2813
|
+
import { jsx as jsx48 } from "react/jsx-runtime";
|
|
2781
2814
|
function Sidebar({ "aria-label": ariaLabel = "Workspace", children, className }) {
|
|
2782
|
-
return /* @__PURE__ */
|
|
2815
|
+
return /* @__PURE__ */ jsx48(
|
|
2783
2816
|
"nav",
|
|
2784
2817
|
{
|
|
2785
2818
|
"aria-label": ariaLabel,
|
|
2786
2819
|
className: cn("flex w-60 shrink-0 flex-col border-r border-border-default bg-bg-surface", className),
|
|
2787
|
-
children: /* @__PURE__ */
|
|
2820
|
+
children: /* @__PURE__ */ jsx48(ScrollArea, { className: "min-h-0 flex-1", contentClassName: "flex flex-col gap-px px-2.5 py-3", children })
|
|
2788
2821
|
}
|
|
2789
2822
|
);
|
|
2790
2823
|
}
|
|
2791
2824
|
|
|
2792
2825
|
// src/Property.tsx
|
|
2793
|
-
import { jsx as
|
|
2826
|
+
import { jsx as jsx49, jsxs as jsxs32 } from "react/jsx-runtime";
|
|
2794
2827
|
var VALUE_CLASSES = "contents";
|
|
2795
2828
|
function Property({ label, layout = "row", children, className }) {
|
|
2796
2829
|
if (layout === "stacked") {
|
|
@@ -2798,23 +2831,23 @@ function Property({ label, layout = "row", children, className }) {
|
|
|
2798
2831
|
// gap-3 — the one label-above-content distance (Katerina, 2026-09-01):
|
|
2799
2832
|
// Peek's topic-details sections already sit at 12px, Ship's rail was
|
|
2800
2833
|
// 6px, and unifying means the bigger, calmer one.
|
|
2801
|
-
/* @__PURE__ */
|
|
2802
|
-
/* @__PURE__ */
|
|
2803
|
-
/* @__PURE__ */
|
|
2834
|
+
/* @__PURE__ */ jsxs32("dl", { className: cn("flex flex-col gap-3", className), children: [
|
|
2835
|
+
/* @__PURE__ */ jsx49("dt", { className: "text-menu uppercase tracking-widest text-text-secondary", children: label }),
|
|
2836
|
+
/* @__PURE__ */ jsx49("dd", { className: VALUE_CLASSES, children })
|
|
2804
2837
|
] })
|
|
2805
2838
|
);
|
|
2806
2839
|
}
|
|
2807
|
-
return /* @__PURE__ */
|
|
2808
|
-
/* @__PURE__ */
|
|
2809
|
-
/* @__PURE__ */
|
|
2840
|
+
return /* @__PURE__ */ jsxs32("dl", { className: cn("flex items-center gap-2", className), children: [
|
|
2841
|
+
/* @__PURE__ */ jsx49("dt", { className: "w-[68px] shrink-0 text-caption text-text-secondary", children: label }),
|
|
2842
|
+
/* @__PURE__ */ jsx49("dd", { className: VALUE_CLASSES, children })
|
|
2810
2843
|
] });
|
|
2811
2844
|
}
|
|
2812
2845
|
|
|
2813
2846
|
// src/Reaction.tsx
|
|
2814
2847
|
import { Toggle } from "@base-ui/react/toggle";
|
|
2815
|
-
import { jsx as
|
|
2848
|
+
import { jsx as jsx50, jsxs as jsxs33 } from "react/jsx-runtime";
|
|
2816
2849
|
function Reaction({ emoji, count, pressed = false, className, ...props }) {
|
|
2817
|
-
return /* @__PURE__ */
|
|
2850
|
+
return /* @__PURE__ */ jsxs33(
|
|
2818
2851
|
Toggle,
|
|
2819
2852
|
{
|
|
2820
2853
|
pressed,
|
|
@@ -2836,8 +2869,8 @@ function Reaction({ emoji, count, pressed = false, className, ...props }) {
|
|
|
2836
2869
|
),
|
|
2837
2870
|
...props,
|
|
2838
2871
|
children: [
|
|
2839
|
-
/* @__PURE__ */
|
|
2840
|
-
/* @__PURE__ */
|
|
2872
|
+
/* @__PURE__ */ jsx50("span", { "aria-hidden": "true", className: "shrink-0 text-body-1 leading-none", children: emoji }),
|
|
2873
|
+
/* @__PURE__ */ jsx50("span", { className: "text-chip signal:font-mono signal:text-small signal:font-semibold signal:tabular-nums", children: count })
|
|
2841
2874
|
]
|
|
2842
2875
|
}
|
|
2843
2876
|
);
|
|
@@ -2846,9 +2879,9 @@ function Reaction({ emoji, count, pressed = false, className, ...props }) {
|
|
|
2846
2879
|
// src/SearchInput.tsx
|
|
2847
2880
|
import "react";
|
|
2848
2881
|
import { Input as Input3 } from "@base-ui/react/input";
|
|
2849
|
-
import { jsx as
|
|
2882
|
+
import { jsx as jsx51, jsxs as jsxs34 } from "react/jsx-runtime";
|
|
2850
2883
|
function SearchInput({ shortcut, className, placeholder = "Search\u2026", ...props }) {
|
|
2851
|
-
return /* @__PURE__ */
|
|
2884
|
+
return /* @__PURE__ */ jsxs34(
|
|
2852
2885
|
"div",
|
|
2853
2886
|
{
|
|
2854
2887
|
className: cn(
|
|
@@ -2860,7 +2893,7 @@ function SearchInput({ shortcut, className, placeholder = "Search\u2026", ...pro
|
|
|
2860
2893
|
className
|
|
2861
2894
|
),
|
|
2862
2895
|
children: [
|
|
2863
|
-
/* @__PURE__ */
|
|
2896
|
+
/* @__PURE__ */ jsx51(
|
|
2864
2897
|
Input3,
|
|
2865
2898
|
{
|
|
2866
2899
|
className: "flex-1 min-w-0 bg-transparent text-input-value text-text-primary placeholder:text-text-muted outline-none",
|
|
@@ -2868,7 +2901,7 @@ function SearchInput({ shortcut, className, placeholder = "Search\u2026", ...pro
|
|
|
2868
2901
|
...props
|
|
2869
2902
|
}
|
|
2870
2903
|
),
|
|
2871
|
-
shortcut && /* @__PURE__ */
|
|
2904
|
+
shortcut && /* @__PURE__ */ jsx51(Kbd, { children: shortcut })
|
|
2872
2905
|
]
|
|
2873
2906
|
}
|
|
2874
2907
|
);
|
|
@@ -2877,17 +2910,17 @@ function SearchInput({ shortcut, className, placeholder = "Search\u2026", ...pro
|
|
|
2877
2910
|
// src/SectionHeader.tsx
|
|
2878
2911
|
import { IconChevronRight as IconChevronRight2 } from "@tabler/icons-react";
|
|
2879
2912
|
import { useRender } from "@base-ui/react/use-render";
|
|
2880
|
-
import { Fragment as Fragment8, jsx as
|
|
2913
|
+
import { Fragment as Fragment8, jsx as jsx52, jsxs as jsxs35 } from "react/jsx-runtime";
|
|
2881
2914
|
function SectionHeader({ title, chevron = false, isExpanded = true, onToggle, trailing, actions, showActions = "hover", hover = "fill", render, className }) {
|
|
2882
2915
|
const titleElement = useRender({
|
|
2883
|
-
render: render ?? (chevron ? /* @__PURE__ */
|
|
2916
|
+
render: render ?? (chevron ? /* @__PURE__ */ jsx52("button", { type: "button", onClick: onToggle, "aria-expanded": isExpanded }) : /* @__PURE__ */ jsx52("span", {})),
|
|
2884
2917
|
props: {
|
|
2885
2918
|
// `text-left`: a button centres its text. `h-full` and `flex-1`: the
|
|
2886
2919
|
// whole row up to the actions is the hit target, as it was when the
|
|
2887
2920
|
// row itself carried the click.
|
|
2888
2921
|
className: "flex h-full min-w-0 flex-1 items-center gap-1 text-left",
|
|
2889
|
-
children: /* @__PURE__ */
|
|
2890
|
-
chevron && /* @__PURE__ */
|
|
2922
|
+
children: /* @__PURE__ */ jsxs35(Fragment8, { children: [
|
|
2923
|
+
chevron && /* @__PURE__ */ jsx52(
|
|
2891
2924
|
IconChevronRight2,
|
|
2892
2925
|
{
|
|
2893
2926
|
size: 12,
|
|
@@ -2895,11 +2928,11 @@ function SectionHeader({ title, chevron = false, isExpanded = true, onToggle, tr
|
|
|
2895
2928
|
className: cn("shrink-0 text-text-secondary transition-transform duration-150", isExpanded && "rotate-90")
|
|
2896
2929
|
}
|
|
2897
2930
|
),
|
|
2898
|
-
/* @__PURE__ */
|
|
2931
|
+
/* @__PURE__ */ jsx52(SectionLabel, { children: title })
|
|
2899
2932
|
] })
|
|
2900
2933
|
}
|
|
2901
2934
|
});
|
|
2902
|
-
return /* @__PURE__ */
|
|
2935
|
+
return /* @__PURE__ */ jsxs35(
|
|
2903
2936
|
"div",
|
|
2904
2937
|
{
|
|
2905
2938
|
className: cn(
|
|
@@ -2912,15 +2945,15 @@ function SectionHeader({ title, chevron = false, isExpanded = true, onToggle, tr
|
|
|
2912
2945
|
),
|
|
2913
2946
|
children: [
|
|
2914
2947
|
titleElement,
|
|
2915
|
-
trailing != null && /* @__PURE__ */
|
|
2916
|
-
actions && actions.length > 0 && /* @__PURE__ */
|
|
2948
|
+
trailing != null && /* @__PURE__ */ jsx52("div", { className: "flex shrink-0 items-center", children: trailing }),
|
|
2949
|
+
actions && actions.length > 0 && /* @__PURE__ */ jsx52(
|
|
2917
2950
|
"div",
|
|
2918
2951
|
{
|
|
2919
2952
|
className: cn(
|
|
2920
2953
|
"-mr-1 flex shrink-0 items-center gap-1",
|
|
2921
2954
|
showActions === "hover" && "opacity-0 transition-opacity focus-within:opacity-100 group-hover:opacity-100"
|
|
2922
2955
|
),
|
|
2923
|
-
children: actions.map((action) => /* @__PURE__ */
|
|
2956
|
+
children: actions.map((action) => /* @__PURE__ */ jsx52(IconButton, { tooltip: action.tooltip, "aria-label": action.tooltip, onClick: action.onClick, children: action.icon }, action.tooltip))
|
|
2924
2957
|
}
|
|
2925
2958
|
)
|
|
2926
2959
|
]
|
|
@@ -2928,20 +2961,6 @@ function SectionHeader({ title, chevron = false, isExpanded = true, onToggle, tr
|
|
|
2928
2961
|
);
|
|
2929
2962
|
}
|
|
2930
2963
|
|
|
2931
|
-
// src/ContainerHeader.tsx
|
|
2932
|
-
import { IconChevronDown as IconChevronDown3 } from "@tabler/icons-react";
|
|
2933
|
-
import { jsx as jsx52, jsxs as jsxs35 } from "react/jsx-runtime";
|
|
2934
|
-
function ContainerHeader({ title, chevron = false, actions, className }) {
|
|
2935
|
-
const text = typeof title === "string";
|
|
2936
|
-
return /* @__PURE__ */ jsxs35("div", { className: cn("flex h-12 shrink-0 items-center justify-between overflow-hidden border-b border-border-subtle py-2 pr-4 pl-5", className), children: [
|
|
2937
|
-
/* @__PURE__ */ jsx52("div", { className: cn("flex items-center gap-2 overflow-hidden", text ? "shrink-0" : "min-w-0 flex-1"), children: /* @__PURE__ */ jsxs35("div", { className: cn("flex items-center gap-1", text ? "shrink-0" : "min-w-0 flex-1"), children: [
|
|
2938
|
-
text ? /* @__PURE__ */ jsx52("span", { className: "whitespace-nowrap text-body-2-strong text-text-primary", children: title }) : /* @__PURE__ */ jsx52("div", { className: "min-w-0 flex-1", children: title }),
|
|
2939
|
-
chevron && /* @__PURE__ */ jsx52(IconChevronDown3, { size: 12, stroke: 1.5, className: "shrink-0 text-text-secondary" })
|
|
2940
|
-
] }) }),
|
|
2941
|
-
actions && /* @__PURE__ */ jsx52("div", { className: "flex shrink-0 items-center justify-end gap-3", children: /* @__PURE__ */ jsx52("div", { className: "flex shrink-0 items-center gap-1", children: actions }) })
|
|
2942
|
-
] });
|
|
2943
|
-
}
|
|
2944
|
-
|
|
2945
2964
|
// src/ListColumn.tsx
|
|
2946
2965
|
import { jsx as jsx53, jsxs as jsxs36 } from "react/jsx-runtime";
|
|
2947
2966
|
function Column({ title, chevron = false, actions, above, collapsed = false, children, className, broken = false }) {
|