@stll/ui 0.23.1 → 0.25.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 CHANGED
@@ -33,8 +33,10 @@ convenience; the subpaths are the real surface, and in-repo code uses those.
33
33
  ## Workspace shell
34
34
 
35
35
  `WorkspaceShell` is the complete desktop and tablet application frame. It
36
- keeps navigation, sticky top chrome, the active route, and a required
37
- inline-end dock as sibling surfaces inside one dynamic viewport. Route content
36
+ keeps navigation, sticky top chrome, the active route, and an optional
37
+ inline-end dock as sibling surfaces inside one dynamic viewport. A host with
38
+ nothing for the inline-end edge omits `endDock`, and the content column
39
+ extends to the frame's edge instead of reserving width for an empty rail. Route content
38
40
  is the sole scroller, so a feature cannot accidentally render an app inside
39
41
  the app.
40
42
 
@@ -10,8 +10,8 @@
10
10
  */
11
11
  declare const buttonAccessibleDisabledClass = "cursor-not-allowed opacity-64";
12
12
  declare const buttonVariants: (props?: ({
13
- size?: "xs" | "sm" | "icon" | "default" | "lg" | "chip" | "icon-lg" | "icon-sm" | "icon-xl" | "icon-xs" | "xl" | null | undefined;
14
- variant?: "link" | "destructive" | "outline" | "default" | "destructive-outline" | "ghost" | "secondary" | null | undefined;
13
+ size?: "default" | "chip" | "icon" | "icon-lg" | "icon-sm" | "icon-xl" | "icon-xs" | "lg" | "sm" | "xl" | "xs" | null | undefined;
14
+ variant?: "link" | "default" | "destructive" | "destructive-outline" | "ghost" | "outline" | "secondary" | null | undefined;
15
15
  } & import("class-variance-authority/types").ClassProp) | undefined) => string;
16
16
  //#endregion
17
17
  export { buttonAccessibleDisabledClass, buttonVariants };
@@ -82,8 +82,8 @@ declare const SidebarGroupContent: ({ className, ...props }: React.ComponentProp
82
82
  declare const SidebarMenu: ({ className, ...props }: React.ComponentProps<"ul">) => import("react").JSX.Element;
83
83
  declare const SidebarMenuItem: ({ className, ...props }: React.ComponentProps<"li">) => import("react").JSX.Element;
84
84
  declare const sidebarMenuButtonVariants: (props?: ({
85
- variant?: "outline" | "default" | null | undefined;
86
- size?: "sm" | "default" | "lg" | "rail" | null | undefined;
85
+ variant?: "default" | "outline" | null | undefined;
86
+ size?: "default" | "lg" | "sm" | "rail" | null | undefined;
87
87
  } & import("class-variance-authority/types").ClassProp) | undefined) => string;
88
88
  declare const SidebarMenuButton: ({ asChild, isActive, variant, size, tooltip, className, ...props }: React.ComponentProps<"button"> & {
89
89
  asChild?: boolean;
@@ -31,8 +31,12 @@ type WorkspaceShellProps = {
31
31
  navigation: WorkspaceNavigation;
32
32
  /** Sticky route chrome; managed navigation exposes its compact trigger here. */
33
33
  topBar: (context: WorkspaceTopBarContext) => ReactElement;
34
- /** Permanent inline-end rail or inspector dock. */
35
- endDock: ReactElement;
34
+ /**
35
+ * Inline-end rail or inspector dock. Omit it and the shell mounts no end
36
+ * dock at all: no rail, none of its inline-end width reservation, and the
37
+ * content column extends to the frame's inline-end edge.
38
+ */
39
+ endDock?: ReactElement | undefined;
36
40
  /** Active route content. */
37
41
  children: ReactNode;
38
42
  };
@@ -40,6 +44,9 @@ type WorkspaceShellProps = {
40
44
  * Stella's complete authenticated workspace frame. It owns the dynamic
41
45
  * viewport, sibling rail geometry, sticky top chrome, and sole content
42
46
  * scroller so product routes cannot create an app inside the app.
47
+ *
48
+ * The end dock is optional: a host with nothing to put on the inline-end edge
49
+ * omits it rather than reserving width for an empty rail.
43
50
  */
44
51
  declare const WorkspaceShell: ({ children, endDock, navigation, topBar }: WorkspaceShellProps) => import("react").JSX.Element;
45
52
  type WorkspaceEndRailChatAction = {
@@ -1,5 +1,6 @@
1
1
  "use client";
2
2
  import { cn } from "../lib/utils.js";
3
+ import { SHELL_CHROME_LAYER_CLASS_NAME } from "../lib/overlay-layer.js";
3
4
  import { useIsMobile } from "../hooks/use-mobile.js";
4
5
  import { InspectorRail, InspectorRailCell, InspectorRailContent, InspectorRailFooter, InspectorRailIconButton } from "../inspector/chrome.js";
5
6
  import { Sheet, SheetContent as SheetPopup, SheetTitle, SheetTrigger } from "./sheet.js";
@@ -11,6 +12,9 @@ import { useEffect } from "react";
11
12
  * Stella's complete authenticated workspace frame. It owns the dynamic
12
13
  * viewport, sibling rail geometry, sticky top chrome, and sole content
13
14
  * scroller so product routes cannot create an app inside the app.
15
+ *
16
+ * The end dock is optional: a host with nothing to put on the inline-end edge
17
+ * omits it rather than reserving width for an empty rail.
14
18
  */
15
19
  const WorkspaceShell = ({ children, endDock, navigation, topBar }) => {
16
20
  const isCompact = useIsMobile();
@@ -40,7 +44,7 @@ const WorkspaceShell = ({ children, endDock, navigation, topBar }) => {
40
44
  className: cn("bg-background relative flex w-full min-w-0 flex-1 flex-col overflow-hidden", "md:peer-data-[variant=inset]:m-2 md:peer-data-[variant=inset]:ms-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow-sm md:peer-data-[variant=inset]:peer-data-[state=collapsed]:ms-2"),
41
45
  "data-slot": "workspace-shell-main",
42
46
  children: [/* @__PURE__ */ jsx("div", {
43
- className: "bg-background sticky top-0 z-20 shrink-0",
47
+ className: cn("bg-background sticky top-0 shrink-0", SHELL_CHROME_LAYER_CLASS_NAME),
44
48
  "data-slot": "workspace-shell-top-bar",
45
49
  children: topBar({ compactNavigationTrigger })
46
50
  }), /* @__PURE__ */ jsx("div", {
package/dist/index.d.ts CHANGED
@@ -3,7 +3,7 @@ import { CalendarDateRange, ResourceCalendarLaneLayout, ResourceCalendarLanePlac
3
3
  import { ResourceCalendar, ResourceCalendarColumn, ResourceCalendarEntry, ResourceCalendarEntryTone, ResourceCalendarResource } from "./calendar/resource-calendar.js";
4
4
  import "./calendar/index.js";
5
5
  import { Accordion, AccordionContent as AccordionPanel, AccordionItem, AccordionTrigger } from "./components/accordion.js";
6
- import { BOARD_DRAG_OVERLAY_Z_INDEX, OVERLAY_COLLISION_PADDING, OVERLAY_LAYER_CLASS_NAMES, OverlayLayer } from "./lib/overlay-layer.js";
6
+ import { BOARD_DRAG_OVERLAY_Z_INDEX, OVERLAY_COLLISION_PADDING, OVERLAY_LAYER_CLASS_NAMES, OverlayLayer, SHELL_CHROME_LAYER_CLASS_NAME } from "./lib/overlay-layer.js";
7
7
  import { AlertDialog, AlertDialogBackdrop, AlertDialogClose, AlertDialogContent as AlertDialogPopup, AlertDialogCreateHandle, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogPanel, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AlertDialogViewport } from "./components/alert-dialog.js";
8
8
  import { APPLICATION_RAIL_BUTTON_SIZE, APPLICATION_RAIL_ICON_SIZE, APPLICATION_RAIL_WIDTH, ApplicationRail, ApplicationRailButton, ApplicationRailContent, ApplicationRailFooter, ApplicationRailHeader, ApplicationRailMenu, ApplicationRailSeparator } from "./components/application-rail.js";
9
9
  import { Avatar, AvatarFallback, AvatarImage } from "./components/avatar.js";
@@ -79,11 +79,12 @@ import { KanbanBuiltInGroup, KanbanColumnBand, KanbanGroup, KanbanGroupOption, K
79
79
  import { BuildKanbanBoardMatrixParams, CreateKanbanDropIntentParams, KANBAN_BOARD_AXES, KanbanBoardAxis, KanbanBoardCell, KanbanBoardColumn, KanbanBoardCoordinate, KanbanBoardDestination, KanbanBoardLane, KanbanBoardMatrix, KanbanDropAxisChange, KanbanDropIntent, OrderKanbanCellsByColumnsParams, ResolveKanbanGroupValueParams, buildKanbanBoardMatrix, createKanbanDropIntent, getKanbanBoardColumnIdentity, getKanbanBoardLaneIdentity, orderKanbanCellsByColumns } from "./kanban/matrix.js";
80
80
  import { KANBAN_COLLAPSED_BAND_WIDTH_CLASS, KANBAN_COLLAPSED_BAND_WIDTH_PX, KANBAN_COLUMN_GAP_PX, KANBAN_COLUMN_WIDTH_CLASS, KANBAN_COLUMN_WIDTH_PX, KanbanColumnBandSpan, hasKanbanColumnBands, resolveKanbanColumnBands } from "./kanban/column-bands.js";
81
81
  import { KanbanColumnHeader, KanbanColumnHeaderProps } from "./kanban/column-header.js";
82
+ import { KANBAN_BAND_CAPTION_ROW_HEIGHT, KANBAN_BAND_CAPTION_ROW_HEIGHT_PX, KANBAN_CHROME_ROW_HEIGHT, KANBAN_CHROME_ROW_HEIGHT_PX } from "./kanban/layout-tokens.js";
82
83
  import { KANBAN_BOARD_COLLISION_DETECTION, KanbanCellVirtualNavigation, KanbanSortableCellPosition, KanbanVirtualScrollRequest, kanbanKeyboardCoordinates } from "./kanban/sortable-interactions.logic.js";
83
84
  import { KANBAN_BOARD_AUTO_SCROLL_OPTIONS, KANBAN_DRAG_OVERLAY_Z_INDEX, KANBAN_MOUSE_ACTIVATION_DISTANCE, KANBAN_SORTABLE_ACTIVATION_MODES, KANBAN_TOUCH_ACTIVATION_CONSTRAINT, KanbanCardDragSurface, KanbanCardDragSurfaceProps, KanbanDragCancelEvent, KanbanDragEndEvent, KanbanDragHandle, KanbanDragHandleProps, KanbanDragOverEvent, KanbanDragStartEvent, KanbanSortableActivationMode, KanbanSortableBindings, KanbanSortableBoard, KanbanSortableBoardProps, KanbanSortableColumns, KanbanSortableColumnsProps, KanbanSortableList, KanbanSortableListProps, UseKanbanDropTargetOptions, UseKanbanSortableOptions, useKanbanDropTarget, useKanbanSortable, useKanbanSortableSensors } from "./kanban/sortable-interactions.js";
84
85
  import { KANBAN_DIRECTIONS, KANBAN_HORIZONTAL_EDGES, KanbanDirection, KanbanHorizontalEdge, getKanbanHorizontalEdge } from "./kanban/sortable-edge.js";
85
86
  import { KANBAN_BOARD_AUTO_SCROLL_SOURCES, KANBAN_CARD_DRAG_MIME, RegisterKanbanBoardAutoScrollOptions, RegisterKanbanCardDragOptions, registerKanbanBoardAutoScroll, registerKanbanCardDrag } from "./kanban/drag-interactions.js";
86
- import { KanbanSubgroupBandHeaderContext, KanbanSubgroupBoard, KanbanSubgroupBoardProps, KanbanSubgroupCellContext, KanbanSubgroupCollapsedBandCellContext, KanbanSubgroupColumnHeaderContext, KanbanSubgroupLaneIdentityContext } from "./kanban/subgroup-board.js";
87
+ import { KanbanSubgroupBandHeaderContext, KanbanSubgroupBoard, KanbanSubgroupBoardProps, KanbanSubgroupCellContext, KanbanSubgroupCollapsedBandCellContext, KanbanSubgroupColumnHeaderContext, KanbanSubgroupLaneColumnActionContext, KanbanSubgroupLaneColumnSummaryContext, KanbanSubgroupLaneIdentityContext } from "./kanban/subgroup-board.js";
87
88
  import { KANBAN_BAND_PEEK_DELAY_MS, KANBAN_BAND_PEEK_LINGER_MS } from "./kanban/band-peek.js";
88
89
  import { KANBAN_CARD_STICKY_TOP_VAR, KANBAN_STICKY_TOP_VAR, KanbanCollapsedBandCaption, KanbanCollapsedBandCaptionProps } from "./kanban/sticky-lane.js";
89
90
  import { KANBAN_VIRTUAL_CELL_PAGINATION, KanbanVirtualCell, KanbanVirtualCellPagination, KanbanVirtualCellProps, KanbanVirtualCellSortableContext } from "./kanban/virtual-cell.js";
@@ -98,4 +99,4 @@ import { ReviewDiffDeletion, ReviewDiffInsertion, ReviewDiffSegment, ReviewDiffS
98
99
  import { ReviewOutOfDateNotice, ReviewOutOfDateReason, ReviewOutOfDateTone } from "./review/review-out-of-date-notice.js";
99
100
  import { ReviewStatusBadge, ReviewStatusSize, ReviewStatusTone, ReviewStatusVariant } from "./review/review-status-badge.js";
100
101
  import { ReviewSeverityDot, ReviewSeverityLevel, ReviewStatusDot, reviewSeverityTone } from "./review/review-severity-dot.js";
101
- export { APPLICATION_RAIL_BUTTON_SIZE, APPLICATION_RAIL_ICON_SIZE, APPLICATION_RAIL_WIDTH, Accordion, AccordionPanel as AccordionContent, AccordionPanel, AccordionItem, AccordionTrigger, AlertDialog, AlertDialogBackdrop, AlertDialogBackdrop as AlertDialogOverlay, AlertDialogClose, AlertDialogPopup as AlertDialogContent, AlertDialogPopup, AlertDialogCreateHandle, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogPanel, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AlertDialogViewport, AnchoredToastProvider, ApplicationRail, ApplicationRailButton, ApplicationRailContent, ApplicationRailFooter, ApplicationRailHeader, ApplicationRailMenu, ApplicationRailSeparator, Avatar, AvatarFallback, AvatarImage, BOARD_DRAG_OVERLAY_Z_INDEX, type BidiDirection, BidiText, type BidiTextProps, Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, type BuildKanbanBoardMatrixParams, Button, CONTROL_SIZE, CONTROL_SIZES, CalendarCell, type CalendarDateRange, CalendarEntryButton, CalendarEntrySurface, CalendarGrid, CalendarHeaderCell, CalendarHeaderRow, Checkbox, ColorPicker, ColorPickerContent, type ColorPickerContentProps, type ColorPickerProps, type ColorPreset, ColorVariants, Combobox, ComboboxChip, ComboboxChips, ComboboxChipsInput, ComboboxClear, ComboboxCollection, ComboboxEmpty, ComboboxGroup, ComboboxGroupLabel, ComboboxInput, ComboboxItem, ComboboxList, ComboboxPopup, ComboboxRow, ComboboxSeparator, ComboboxStatus, ComboboxTrigger, ComboboxValue, Command, CommandCollection, CommandDialog, CommandDialogPopup, CommandDialogTrigger, CommandEmpty, CommandFooter, CommandGroup, CommandGroupLabel, CommandInput, CommandItem, CommandList, CommandPanel, CommandSeparator, CommandShortcut, type ControlSize, type CreateKanbanDropIntentParams, DEFAULT_PRESETS, DataTable, type DataTableAriaSort, type DataTableColumn, type DataTableProps, type DataTableRowAction, DatePickerPopover, type DatePickerPopoverProps, DestructiveActionConfirmation, DestructiveConfirmDialog, type DestructiveConfirmDialogProps, Dialog, DialogBackdrop, DialogBackdrop as DialogOverlay, DialogClose, DialogPopup as DialogContent, DialogPopup, DialogCreateHandle, DialogDescription, DialogFooter, DialogHeader, DialogPanel, DialogPortal, DialogTitle, DialogTrigger, DialogViewport, DirectionalIcon, DiscordLogoIcon, Menu as DropdownMenu, Menu, MenuCheckboxItem as DropdownMenuCheckboxItem, MenuCheckboxItem, MenuPopup as DropdownMenuContent, MenuPopup, MenuCreateHandle as DropdownMenuCreateHandle, MenuCreateHandle, MenuGroup as DropdownMenuGroup, MenuGroup, MenuItem as DropdownMenuItem, MenuItem, MenuGroupLabel as DropdownMenuLabel, MenuGroupLabel, MenuPortal as DropdownMenuPortal, MenuPortal, MenuRadioGroup as DropdownMenuRadioGroup, MenuRadioGroup, MenuRadioItem as DropdownMenuRadioItem, MenuRadioItem, MenuSeparator as DropdownMenuSeparator, MenuSeparator, MenuShortcut as DropdownMenuShortcut, MenuShortcut, MenuSub as DropdownMenuSub, MenuSub, MenuSubPopup as DropdownMenuSubContent, MenuSubPopup, MenuSubTrigger as DropdownMenuSubTrigger, MenuSubTrigger, MenuTrigger as DropdownMenuTrigger, MenuTrigger, Field, FieldControl, FieldDescription, FieldError, FieldItem, FieldLabel, FieldValidity, Form, Frame, FrameDescription, FrameFooter, FrameHeader, FramePanel, FrameTitle, GitHubLogoIcon, HexColorPicker, type HexColorPickerProps, PreviewCard as HoverCard, PreviewCard, PreviewCardPopup as HoverCardContent, PreviewCardPopup, PreviewCardTrigger as HoverCardTrigger, PreviewCardTrigger, INSPECTOR_CONTENT_MIN_WIDTH, INSPECTOR_EDITOR_MIN_WIDTH, INSPECTOR_PANE_DEFAULT_WIDTH, INSPECTOR_PANE_KEYBOARD_PAGE_STEP, INSPECTOR_PANE_KEYBOARD_STEP, INSPECTOR_PANE_MAX_WIDTH, INSPECTOR_PANE_MIN_WIDTH, INSPECTOR_RAIL_WIDTH, Input, InputGroup, InputGroupAddon, InputGroupInput, InputGroupText, InputGroupTextarea, InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot, type InputProps, Inspector, InspectorActions, InspectorContent, InspectorDescription, InspectorDock, InspectorEmptyRow, InspectorEntityTab, InspectorFacetBar, InspectorHeader, InspectorHeaderText, InspectorProperty, InspectorPropertyLabel, InspectorPropertyList, InspectorPropertyValue, InspectorRail, InspectorRailCell, InspectorRailContent, InspectorRailFooter, InspectorRailIconButton, InspectorRailTab, InspectorSection, InspectorSectionTitle, InspectorTab, InspectorTabList, InspectorTabPanel, InspectorTabs, InspectorTitle, KANBAN_BAND_PEEK_DELAY_MS, KANBAN_BAND_PEEK_LINGER_MS, KANBAN_BOARD_AUTO_SCROLL_OPTIONS, KANBAN_BOARD_AUTO_SCROLL_SOURCES, KANBAN_BOARD_AXES, KANBAN_BOARD_COLLISION_DETECTION, KANBAN_CARD_DRAG_MIME, KANBAN_CARD_STICKY_TOP_VAR, KANBAN_COLLAPSED_BAND_WIDTH_CLASS, KANBAN_COLLAPSED_BAND_WIDTH_PX, KANBAN_COLUMN_GAP_PX, KANBAN_COLUMN_WIDTH_CLASS, KANBAN_COLUMN_WIDTH_PX, KANBAN_DIRECTIONS, KANBAN_DRAG_OVERLAY_Z_INDEX, KANBAN_HORIZONTAL_EDGES, KANBAN_MOUSE_ACTIVATION_DISTANCE, KANBAN_SORTABLE_ACTIVATION_MODES, KANBAN_STICKY_TOP_VAR, KANBAN_TOUCH_ACTIVATION_CONSTRAINT, KANBAN_VIRTUAL_CELL_PAGINATION, type KanbanBandToggleActivation, type KanbanBoardAxis, type KanbanBoardCell, type KanbanBoardColumn, type KanbanBoardCoordinate, type KanbanBoardDestination, type KanbanBoardLane, type KanbanBoardMatrix, type KanbanBuiltInGroup, KanbanCardDragSurface, type KanbanCardDragSurfaceProps, type KanbanCardFieldSelection, KanbanCardShell, type KanbanCardShellProps, KanbanCellAction, type KanbanCellActionProps, type KanbanCellVirtualNavigation, KanbanCollapsedBandCaption, type KanbanCollapsedBandCaptionProps, type KanbanColumnBand, KanbanColumnBandHeader, type KanbanColumnBandHeaderProps, type KanbanColumnBandSpan, KanbanColumnHeader, type KanbanColumnHeaderProps, type KanbanDirection, type KanbanDragCancelEvent, type KanbanDragEndEvent, KanbanDragHandle, type KanbanDragHandleProps, type KanbanDragOverEvent, type KanbanDragStartEvent, type KanbanDropAxisChange, type KanbanDropIntent, type KanbanGroup, type KanbanGroupOption, type KanbanGrouping, type KanbanHorizontalEdge, type KanbanSchema, type KanbanSortableActivationMode, type KanbanSortableBindings, KanbanSortableBoard, type KanbanSortableBoardProps, type KanbanSortableCellPosition, KanbanSortableColumns, type KanbanSortableColumnsProps, KanbanSortableList, type KanbanSortableListProps, type KanbanSubgroupBandHeaderContext, KanbanSubgroupBoard, type KanbanSubgroupBoardProps, type KanbanSubgroupCellContext, type KanbanSubgroupCollapsedBandCellContext, type KanbanSubgroupColumnHeaderContext, type KanbanSubgroupLaneIdentityContext, KanbanVirtualCell, type KanbanVirtualCellPagination, type KanbanVirtualCellProps, type KanbanVirtualCellSortableContext, type KanbanVirtualScrollRequest, Label, MenuPreviewLayout, OVERLAY_COLLISION_PADDING, OVERLAY_LAYER_CLASS_NAMES, OptionColor, type OrderKanbanCellsByColumnsParams, OutlineItem, OutlineRail, OutlineRailProps, OverlayLayer, PROPERTY_ROW_GRID, Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious, Popover, PopoverClose, PopoverPopup as PopoverContent, PopoverPopup, PopoverCreateHandle, PopoverDescription, PopoverPanel, PopoverTitle, PopoverTrigger, PreviewCardPrimitive, PreviewPane, type RegisterKanbanBoardAutoScrollOptions, type RegisterKanbanCardDragOptions, type ResolveKanbanGroupValueParams, type ResolveKanbanGroupingParams, ResourceCalendar, type ResourceCalendarColumn, type ResourceCalendarEntry, type ResourceCalendarEntryTone, type ResourceCalendarLaneLayout, type ResourceCalendarLanePlacement, type ResourceCalendarPlacement, type ResourceCalendarResource, ReviewAuthorAvatar, ReviewCommentAuthor, ReviewCommentCard, ReviewDecisionActions, ReviewDecisionSize, ReviewDecisionState, ReviewDiffDeletion, ReviewDiffInsertion, ReviewDiffSegment, ReviewDiffSegmentType, ReviewDiffText, ReviewOutOfDateNotice, ReviewOutOfDateReason, ReviewOutOfDateTone, ReviewSeverityDot, ReviewSeverityLevel, ReviewStatusBadge, ReviewStatusDot, ReviewStatusSize, ReviewStatusTone, ReviewStatusVariant, SIDEBAR_WIDTH_ICON_PX, SIDEBAR_WIDTH_PX, SIDE_RAIL_CONTAINER_CLASS, SIDE_RAIL_ICON_BUTTON_SIZE, SIDE_RAIL_TAB_ICON_SIZE, SIDE_RAIL_WIDTH, ScrollArea, ScrollBar, ScrollToTop, ScrollToTopProps, SecretInput, type SecretInputProps, SegmentedIconToggle, Select, SelectPopup as SelectContent, SelectPopup, SelectGroup, SelectGroupLabel, SelectItem, SelectSeparator, SelectTrigger, SelectValue, Separator, Sheet, SheetBackdrop, SheetBackdrop as SheetOverlay, SheetClose, SheetPopup as SheetContent, SheetPopup, SheetDescription, SheetFooter, SheetHeader, SheetPanel, SheetPortal, type SheetSide, SheetTitle, SheetTrigger, Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, Skeleton, type SortDirection, SortableHead, StellaMark, StellaWordmarkLatin, TOAST_RIGHT_OFFSET_VAR, TOOLBAR_ROW_HEIGHT, TOOLBAR_ROW_HEIGHT_PX, TRACKED_DELETION_STYLE, TRACKED_INSERTION_STYLE, Table, TableBody, TableCaption, TableCell, type TableColumnCapabilities, type TableColumnDescriptor, TableFooter, TableHead, TableHeader, TableRow, type TableSchema, Tabs, TabsPanel as TabsContent, TabsPanel, TabsList, TabsTab, TabsTab as TabsTrigger, TextSeparator, Textarea, type TextareaProps, type ToastPosition, ToastProvider, Tooltip, TooltipPopup as TooltipContent, TooltipPopup, TooltipCreateHandle, TooltipProvider, TooltipTrigger, UNKNOWN_AUTHOR_LABEL, type UseKanbanDropTargetOptions, type UseKanbanSortableOptions, UserText, type WorkspaceCompactNavigation, WorkspaceEndRail, type WorkspaceEndRailChatAction, type WorkspaceEndRailProps, type WorkspaceNavigation, WorkspaceShell, type WorkspaceShellProps, type WorkspaceTopBarContext, assertConsecutiveCalendarDates, buildKanbanBoardMatrix, buttonAccessibleDisabledClass, buttonVariants, cn, composeRefs, containedEventHandler, containedHandler, contentDir, createKanbanDropIntent, duplicateColumnIds, emptyColor, entityTabGlyph, findTableColumn, getFirstWeekday, getInitials, getKanbanBoardColumnIdentity, getKanbanBoardLaneIdentity, getKanbanGroupingPropertyId, getKanbanGroups, getKanbanHorizontalEdge, getLocaleWeekInfo, getResourceCalendarPlacement, getWeekendDays, hasKanbanColumnBands, hideableColumnIds, isKanbanGroupingRenderable, isStructuredInputType, kanbanKeyboardCoordinates, layoutResourceCalendarEntries, nextCalendarDate, optionColors, orderKanbanCellsByColumns, parsePersistedPaneWidth, registerKanbanBoardAutoScroll, registerKanbanCardDrag, resolveDragWidth, resolveInspectorDockWidth, resolveInspectorPaneMaxWidth, resolveInspectorPaneWidth, resolveKanbanColumnBands, resolveKanbanGroupOptions, resolveKanbanGrouping, resolveKeyboardWidth, resolveOptionColor, reviewDiffSegmentKeys, reviewSeverityTone, selectKanbanCardFieldIds, selectKanbanRows, shouldForceSidebarCollapsed, sortableColumnIds, stellaToast, tableColumnIds, tableColumnSizing, useComboboxFilter, useContentDir, useDestructiveActionConfirmation, useInspectorPaneWidth, useIsMobile, useKanbanDropTarget, useKanbanSortable, useKanbanSortableSensors, useLatest, useSidebar, useSidebarInlineSize, useViewportWidth, visibleColumnIds };
102
+ export { APPLICATION_RAIL_BUTTON_SIZE, APPLICATION_RAIL_ICON_SIZE, APPLICATION_RAIL_WIDTH, Accordion, AccordionPanel as AccordionContent, AccordionPanel, AccordionItem, AccordionTrigger, AlertDialog, AlertDialogBackdrop, AlertDialogBackdrop as AlertDialogOverlay, AlertDialogClose, AlertDialogPopup as AlertDialogContent, AlertDialogPopup, AlertDialogCreateHandle, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogPanel, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AlertDialogViewport, AnchoredToastProvider, ApplicationRail, ApplicationRailButton, ApplicationRailContent, ApplicationRailFooter, ApplicationRailHeader, ApplicationRailMenu, ApplicationRailSeparator, Avatar, AvatarFallback, AvatarImage, BOARD_DRAG_OVERLAY_Z_INDEX, type BidiDirection, BidiText, type BidiTextProps, Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, type BuildKanbanBoardMatrixParams, Button, CONTROL_SIZE, CONTROL_SIZES, CalendarCell, type CalendarDateRange, CalendarEntryButton, CalendarEntrySurface, CalendarGrid, CalendarHeaderCell, CalendarHeaderRow, Checkbox, ColorPicker, ColorPickerContent, type ColorPickerContentProps, type ColorPickerProps, type ColorPreset, ColorVariants, Combobox, ComboboxChip, ComboboxChips, ComboboxChipsInput, ComboboxClear, ComboboxCollection, ComboboxEmpty, ComboboxGroup, ComboboxGroupLabel, ComboboxInput, ComboboxItem, ComboboxList, ComboboxPopup, ComboboxRow, ComboboxSeparator, ComboboxStatus, ComboboxTrigger, ComboboxValue, Command, CommandCollection, CommandDialog, CommandDialogPopup, CommandDialogTrigger, CommandEmpty, CommandFooter, CommandGroup, CommandGroupLabel, CommandInput, CommandItem, CommandList, CommandPanel, CommandSeparator, CommandShortcut, type ControlSize, type CreateKanbanDropIntentParams, DEFAULT_PRESETS, DataTable, type DataTableAriaSort, type DataTableColumn, type DataTableProps, type DataTableRowAction, DatePickerPopover, type DatePickerPopoverProps, DestructiveActionConfirmation, DestructiveConfirmDialog, type DestructiveConfirmDialogProps, Dialog, DialogBackdrop, DialogBackdrop as DialogOverlay, DialogClose, DialogPopup as DialogContent, DialogPopup, DialogCreateHandle, DialogDescription, DialogFooter, DialogHeader, DialogPanel, DialogPortal, DialogTitle, DialogTrigger, DialogViewport, DirectionalIcon, DiscordLogoIcon, Menu as DropdownMenu, Menu, MenuCheckboxItem as DropdownMenuCheckboxItem, MenuCheckboxItem, MenuPopup as DropdownMenuContent, MenuPopup, MenuCreateHandle as DropdownMenuCreateHandle, MenuCreateHandle, MenuGroup as DropdownMenuGroup, MenuGroup, MenuItem as DropdownMenuItem, MenuItem, MenuGroupLabel as DropdownMenuLabel, MenuGroupLabel, MenuPortal as DropdownMenuPortal, MenuPortal, MenuRadioGroup as DropdownMenuRadioGroup, MenuRadioGroup, MenuRadioItem as DropdownMenuRadioItem, MenuRadioItem, MenuSeparator as DropdownMenuSeparator, MenuSeparator, MenuShortcut as DropdownMenuShortcut, MenuShortcut, MenuSub as DropdownMenuSub, MenuSub, MenuSubPopup as DropdownMenuSubContent, MenuSubPopup, MenuSubTrigger as DropdownMenuSubTrigger, MenuSubTrigger, MenuTrigger as DropdownMenuTrigger, MenuTrigger, Field, FieldControl, FieldDescription, FieldError, FieldItem, FieldLabel, FieldValidity, Form, Frame, FrameDescription, FrameFooter, FrameHeader, FramePanel, FrameTitle, GitHubLogoIcon, HexColorPicker, type HexColorPickerProps, PreviewCard as HoverCard, PreviewCard, PreviewCardPopup as HoverCardContent, PreviewCardPopup, PreviewCardTrigger as HoverCardTrigger, PreviewCardTrigger, INSPECTOR_CONTENT_MIN_WIDTH, INSPECTOR_EDITOR_MIN_WIDTH, INSPECTOR_PANE_DEFAULT_WIDTH, INSPECTOR_PANE_KEYBOARD_PAGE_STEP, INSPECTOR_PANE_KEYBOARD_STEP, INSPECTOR_PANE_MAX_WIDTH, INSPECTOR_PANE_MIN_WIDTH, INSPECTOR_RAIL_WIDTH, Input, InputGroup, InputGroupAddon, InputGroupInput, InputGroupText, InputGroupTextarea, InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot, type InputProps, Inspector, InspectorActions, InspectorContent, InspectorDescription, InspectorDock, InspectorEmptyRow, InspectorEntityTab, InspectorFacetBar, InspectorHeader, InspectorHeaderText, InspectorProperty, InspectorPropertyLabel, InspectorPropertyList, InspectorPropertyValue, InspectorRail, InspectorRailCell, InspectorRailContent, InspectorRailFooter, InspectorRailIconButton, InspectorRailTab, InspectorSection, InspectorSectionTitle, InspectorTab, InspectorTabList, InspectorTabPanel, InspectorTabs, InspectorTitle, KANBAN_BAND_CAPTION_ROW_HEIGHT, KANBAN_BAND_CAPTION_ROW_HEIGHT_PX, KANBAN_BAND_PEEK_DELAY_MS, KANBAN_BAND_PEEK_LINGER_MS, KANBAN_BOARD_AUTO_SCROLL_OPTIONS, KANBAN_BOARD_AUTO_SCROLL_SOURCES, KANBAN_BOARD_AXES, KANBAN_BOARD_COLLISION_DETECTION, KANBAN_CARD_DRAG_MIME, KANBAN_CARD_STICKY_TOP_VAR, KANBAN_CHROME_ROW_HEIGHT, KANBAN_CHROME_ROW_HEIGHT_PX, KANBAN_COLLAPSED_BAND_WIDTH_CLASS, KANBAN_COLLAPSED_BAND_WIDTH_PX, KANBAN_COLUMN_GAP_PX, KANBAN_COLUMN_WIDTH_CLASS, KANBAN_COLUMN_WIDTH_PX, KANBAN_DIRECTIONS, KANBAN_DRAG_OVERLAY_Z_INDEX, KANBAN_HORIZONTAL_EDGES, KANBAN_MOUSE_ACTIVATION_DISTANCE, KANBAN_SORTABLE_ACTIVATION_MODES, KANBAN_STICKY_TOP_VAR, KANBAN_TOUCH_ACTIVATION_CONSTRAINT, KANBAN_VIRTUAL_CELL_PAGINATION, type KanbanBandToggleActivation, type KanbanBoardAxis, type KanbanBoardCell, type KanbanBoardColumn, type KanbanBoardCoordinate, type KanbanBoardDestination, type KanbanBoardLane, type KanbanBoardMatrix, type KanbanBuiltInGroup, KanbanCardDragSurface, type KanbanCardDragSurfaceProps, type KanbanCardFieldSelection, KanbanCardShell, type KanbanCardShellProps, KanbanCellAction, type KanbanCellActionProps, type KanbanCellVirtualNavigation, KanbanCollapsedBandCaption, type KanbanCollapsedBandCaptionProps, type KanbanColumnBand, KanbanColumnBandHeader, type KanbanColumnBandHeaderProps, type KanbanColumnBandSpan, KanbanColumnHeader, type KanbanColumnHeaderProps, type KanbanDirection, type KanbanDragCancelEvent, type KanbanDragEndEvent, KanbanDragHandle, type KanbanDragHandleProps, type KanbanDragOverEvent, type KanbanDragStartEvent, type KanbanDropAxisChange, type KanbanDropIntent, type KanbanGroup, type KanbanGroupOption, type KanbanGrouping, type KanbanHorizontalEdge, type KanbanSchema, type KanbanSortableActivationMode, type KanbanSortableBindings, KanbanSortableBoard, type KanbanSortableBoardProps, type KanbanSortableCellPosition, KanbanSortableColumns, type KanbanSortableColumnsProps, KanbanSortableList, type KanbanSortableListProps, type KanbanSubgroupBandHeaderContext, KanbanSubgroupBoard, type KanbanSubgroupBoardProps, type KanbanSubgroupCellContext, type KanbanSubgroupCollapsedBandCellContext, type KanbanSubgroupColumnHeaderContext, type KanbanSubgroupLaneColumnActionContext, type KanbanSubgroupLaneColumnSummaryContext, type KanbanSubgroupLaneIdentityContext, KanbanVirtualCell, type KanbanVirtualCellPagination, type KanbanVirtualCellProps, type KanbanVirtualCellSortableContext, type KanbanVirtualScrollRequest, Label, MenuPreviewLayout, OVERLAY_COLLISION_PADDING, OVERLAY_LAYER_CLASS_NAMES, OptionColor, type OrderKanbanCellsByColumnsParams, OutlineItem, OutlineRail, OutlineRailProps, OverlayLayer, PROPERTY_ROW_GRID, Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious, Popover, PopoverClose, PopoverPopup as PopoverContent, PopoverPopup, PopoverCreateHandle, PopoverDescription, PopoverPanel, PopoverTitle, PopoverTrigger, PreviewCardPrimitive, PreviewPane, type RegisterKanbanBoardAutoScrollOptions, type RegisterKanbanCardDragOptions, type ResolveKanbanGroupValueParams, type ResolveKanbanGroupingParams, ResourceCalendar, type ResourceCalendarColumn, type ResourceCalendarEntry, type ResourceCalendarEntryTone, type ResourceCalendarLaneLayout, type ResourceCalendarLanePlacement, type ResourceCalendarPlacement, type ResourceCalendarResource, ReviewAuthorAvatar, ReviewCommentAuthor, ReviewCommentCard, ReviewDecisionActions, ReviewDecisionSize, ReviewDecisionState, ReviewDiffDeletion, ReviewDiffInsertion, ReviewDiffSegment, ReviewDiffSegmentType, ReviewDiffText, ReviewOutOfDateNotice, ReviewOutOfDateReason, ReviewOutOfDateTone, ReviewSeverityDot, ReviewSeverityLevel, ReviewStatusBadge, ReviewStatusDot, ReviewStatusSize, ReviewStatusTone, ReviewStatusVariant, SHELL_CHROME_LAYER_CLASS_NAME, SIDEBAR_WIDTH_ICON_PX, SIDEBAR_WIDTH_PX, SIDE_RAIL_CONTAINER_CLASS, SIDE_RAIL_ICON_BUTTON_SIZE, SIDE_RAIL_TAB_ICON_SIZE, SIDE_RAIL_WIDTH, ScrollArea, ScrollBar, ScrollToTop, ScrollToTopProps, SecretInput, type SecretInputProps, SegmentedIconToggle, Select, SelectPopup as SelectContent, SelectPopup, SelectGroup, SelectGroupLabel, SelectItem, SelectSeparator, SelectTrigger, SelectValue, Separator, Sheet, SheetBackdrop, SheetBackdrop as SheetOverlay, SheetClose, SheetPopup as SheetContent, SheetPopup, SheetDescription, SheetFooter, SheetHeader, SheetPanel, SheetPortal, type SheetSide, SheetTitle, SheetTrigger, Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, Skeleton, type SortDirection, SortableHead, StellaMark, StellaWordmarkLatin, TOAST_RIGHT_OFFSET_VAR, TOOLBAR_ROW_HEIGHT, TOOLBAR_ROW_HEIGHT_PX, TRACKED_DELETION_STYLE, TRACKED_INSERTION_STYLE, Table, TableBody, TableCaption, TableCell, type TableColumnCapabilities, type TableColumnDescriptor, TableFooter, TableHead, TableHeader, TableRow, type TableSchema, Tabs, TabsPanel as TabsContent, TabsPanel, TabsList, TabsTab, TabsTab as TabsTrigger, TextSeparator, Textarea, type TextareaProps, type ToastPosition, ToastProvider, Tooltip, TooltipPopup as TooltipContent, TooltipPopup, TooltipCreateHandle, TooltipProvider, TooltipTrigger, UNKNOWN_AUTHOR_LABEL, type UseKanbanDropTargetOptions, type UseKanbanSortableOptions, UserText, type WorkspaceCompactNavigation, WorkspaceEndRail, type WorkspaceEndRailChatAction, type WorkspaceEndRailProps, type WorkspaceNavigation, WorkspaceShell, type WorkspaceShellProps, type WorkspaceTopBarContext, assertConsecutiveCalendarDates, buildKanbanBoardMatrix, buttonAccessibleDisabledClass, buttonVariants, cn, composeRefs, containedEventHandler, containedHandler, contentDir, createKanbanDropIntent, duplicateColumnIds, emptyColor, entityTabGlyph, findTableColumn, getFirstWeekday, getInitials, getKanbanBoardColumnIdentity, getKanbanBoardLaneIdentity, getKanbanGroupingPropertyId, getKanbanGroups, getKanbanHorizontalEdge, getLocaleWeekInfo, getResourceCalendarPlacement, getWeekendDays, hasKanbanColumnBands, hideableColumnIds, isKanbanGroupingRenderable, isStructuredInputType, kanbanKeyboardCoordinates, layoutResourceCalendarEntries, nextCalendarDate, optionColors, orderKanbanCellsByColumns, parsePersistedPaneWidth, registerKanbanBoardAutoScroll, registerKanbanCardDrag, resolveDragWidth, resolveInspectorDockWidth, resolveInspectorPaneMaxWidth, resolveInspectorPaneWidth, resolveKanbanColumnBands, resolveKanbanGroupOptions, resolveKanbanGrouping, resolveKeyboardWidth, resolveOptionColor, reviewDiffSegmentKeys, reviewSeverityTone, selectKanbanCardFieldIds, selectKanbanRows, shouldForceSidebarCollapsed, sortableColumnIds, stellaToast, tableColumnIds, tableColumnSizing, useComboboxFilter, useContentDir, useDestructiveActionConfirmation, useInspectorPaneWidth, useIsMobile, useKanbanDropTarget, useKanbanSortable, useKanbanSortableSensors, useLatest, useSidebar, useSidebarInlineSize, useViewportWidth, visibleColumnIds };
package/dist/index.js CHANGED
@@ -2,7 +2,7 @@ import { cn, composeRefs } from "./lib/utils.js";
2
2
  import { Accordion, AccordionContent as AccordionPanel, AccordionItem, AccordionTrigger } from "./components/accordion.js";
3
3
  import { PROPERTY_ROW_GRID, SIDE_RAIL_CONTAINER_CLASS, SIDE_RAIL_ICON_BUTTON_SIZE, SIDE_RAIL_TAB_ICON_SIZE, SIDE_RAIL_WIDTH, TOOLBAR_ROW_HEIGHT, TOOLBAR_ROW_HEIGHT_PX } from "./inspector/layout-tokens.js";
4
4
  import { APPLICATION_RAIL_BUTTON_SIZE, APPLICATION_RAIL_ICON_SIZE, APPLICATION_RAIL_WIDTH, ApplicationRail, ApplicationRailButton, ApplicationRailContent, ApplicationRailFooter, ApplicationRailHeader, ApplicationRailMenu, ApplicationRailSeparator } from "./components/application-rail.js";
5
- import { BOARD_DRAG_OVERLAY_Z_INDEX, OVERLAY_COLLISION_PADDING, OVERLAY_LAYER_CLASS_NAMES } from "./lib/overlay-layer.js";
5
+ import { BOARD_DRAG_OVERLAY_Z_INDEX, OVERLAY_COLLISION_PADDING, OVERLAY_LAYER_CLASS_NAMES, SHELL_CHROME_LAYER_CLASS_NAME } from "./lib/overlay-layer.js";
6
6
  import { Tooltip, TooltipContent as TooltipPopup, TooltipCreateHandle, TooltipProvider, TooltipTrigger } from "./components/tooltip.js";
7
7
  import { AlertDialog, AlertDialogBackdrop, AlertDialogClose, AlertDialogContent as AlertDialogPopup, AlertDialogCreateHandle, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogPanel, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AlertDialogViewport } from "./components/alert-dialog.js";
8
8
  import { useIsMobile } from "./hooks/use-mobile.js";
@@ -72,6 +72,7 @@ import { INSPECTOR_PANE_KEYBOARD_PAGE_STEP, INSPECTOR_PANE_KEYBOARD_STEP, parseP
72
72
  import { selectKanbanCardFieldIds } from "./kanban/card-properties.js";
73
73
  import { KANBAN_CARD_STICKY_TOP_VAR, KANBAN_STICKY_TOP_VAR, KanbanCollapsedBandCaption } from "./kanban/sticky-lane.js";
74
74
  import { KanbanCardShell } from "./kanban/card-shell.js";
75
+ import { KANBAN_BAND_CAPTION_ROW_HEIGHT, KANBAN_BAND_CAPTION_ROW_HEIGHT_PX, KANBAN_CHROME_ROW_HEIGHT, KANBAN_CHROME_ROW_HEIGHT_PX } from "./kanban/layout-tokens.js";
75
76
  import { KanbanCellAction } from "./kanban/cell-action.js";
76
77
  import { KanbanColumnBandHeader } from "./kanban/column-band-header.js";
77
78
  import { getKanbanGroupingPropertyId, getKanbanGroups, isKanbanGroupingRenderable, resolveKanbanGroupOptions, resolveKanbanGrouping, selectKanbanRows } from "./kanban/grouping.js";
@@ -94,4 +95,4 @@ import { ReviewDiffDeletion, ReviewDiffInsertion, ReviewDiffText, TRACKED_DELETI
94
95
  import { ReviewOutOfDateNotice } from "./review/review-out-of-date-notice.js";
95
96
  import { ReviewSeverityDot, ReviewStatusDot, reviewSeverityTone } from "./review/review-severity-dot.js";
96
97
  import { ReviewStatusBadge } from "./review/review-status-badge.js";
97
- export { APPLICATION_RAIL_BUTTON_SIZE, APPLICATION_RAIL_ICON_SIZE, APPLICATION_RAIL_WIDTH, Accordion, AccordionPanel as AccordionContent, AccordionPanel, AccordionItem, AccordionTrigger, AlertDialog, AlertDialogBackdrop, AlertDialogBackdrop as AlertDialogOverlay, AlertDialogClose, AlertDialogPopup as AlertDialogContent, AlertDialogPopup, AlertDialogCreateHandle, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogPanel, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AlertDialogViewport, AnchoredToastProvider, ApplicationRail, ApplicationRailButton, ApplicationRailContent, ApplicationRailFooter, ApplicationRailHeader, ApplicationRailMenu, ApplicationRailSeparator, Avatar, AvatarFallback, AvatarImage, BOARD_DRAG_OVERLAY_Z_INDEX, BidiText, Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, Button, CONTROL_SIZE, CONTROL_SIZES, CalendarCell, CalendarEntryButton, CalendarEntrySurface, CalendarGrid, CalendarHeaderCell, CalendarHeaderRow, Checkbox, ColorPicker, ColorPickerContent, Combobox, ComboboxChip, ComboboxChips, ComboboxChipsInput, ComboboxClear, ComboboxCollection, ComboboxEmpty, ComboboxGroup, ComboboxGroupLabel, ComboboxInput, ComboboxItem, ComboboxList, ComboboxPopup, ComboboxRow, ComboboxSeparator, ComboboxStatus, ComboboxTrigger, ComboboxValue, Command, CommandCollection, CommandDialog, CommandDialogPopup, CommandDialogTrigger, CommandEmpty, CommandFooter, CommandGroup, CommandGroupLabel, CommandInput, CommandItem, CommandList, CommandPanel, CommandSeparator, CommandShortcut, DEFAULT_PRESETS, DataTable, DatePickerPopover, DestructiveActionConfirmation, DestructiveConfirmDialog, Dialog, DialogBackdrop, DialogBackdrop as DialogOverlay, DialogClose, DialogPopup as DialogContent, DialogPopup, DialogCreateHandle, DialogDescription, DialogFooter, DialogHeader, DialogPanel, DialogPortal, DialogTitle, DialogTrigger, DialogViewport, DirectionalIcon, DiscordLogoIcon, Menu as DropdownMenu, Menu, MenuCheckboxItem as DropdownMenuCheckboxItem, MenuCheckboxItem, MenuPopup as DropdownMenuContent, MenuPopup, MenuCreateHandle as DropdownMenuCreateHandle, MenuCreateHandle, MenuGroup as DropdownMenuGroup, MenuGroup, MenuItem as DropdownMenuItem, MenuItem, MenuGroupLabel as DropdownMenuLabel, MenuGroupLabel, MenuPortal as DropdownMenuPortal, MenuPortal, MenuRadioGroup as DropdownMenuRadioGroup, MenuRadioGroup, MenuRadioItem as DropdownMenuRadioItem, MenuRadioItem, MenuSeparator as DropdownMenuSeparator, MenuSeparator, MenuShortcut as DropdownMenuShortcut, MenuShortcut, MenuSub as DropdownMenuSub, MenuSub, MenuSubPopup as DropdownMenuSubContent, MenuSubPopup, MenuSubTrigger as DropdownMenuSubTrigger, MenuSubTrigger, MenuTrigger as DropdownMenuTrigger, MenuTrigger, Field, FieldControl, FieldDescription, FieldError, FieldItem, FieldLabel, FieldValidity, Form, Frame, FrameDescription, FrameFooter, FrameHeader, FramePanel, FrameTitle, GitHubLogoIcon, HexColorPicker, PreviewCard as HoverCard, PreviewCard, PreviewCardPopup as HoverCardContent, PreviewCardPopup, PreviewCardTrigger as HoverCardTrigger, PreviewCardTrigger, INSPECTOR_CONTENT_MIN_WIDTH, INSPECTOR_EDITOR_MIN_WIDTH, INSPECTOR_PANE_DEFAULT_WIDTH, INSPECTOR_PANE_KEYBOARD_PAGE_STEP, INSPECTOR_PANE_KEYBOARD_STEP, INSPECTOR_PANE_MAX_WIDTH, INSPECTOR_PANE_MIN_WIDTH, INSPECTOR_RAIL_WIDTH, Input, InputGroup, InputGroupAddon, InputGroupInput, InputGroupText, InputGroupTextarea, InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot, Inspector, InspectorActions, InspectorContent, InspectorDescription, InspectorDock, InspectorEmptyRow, InspectorEntityTab, InspectorFacetBar, InspectorHeader, InspectorHeaderText, InspectorProperty, InspectorPropertyLabel, InspectorPropertyList, InspectorPropertyValue, InspectorRail, InspectorRailCell, InspectorRailContent, InspectorRailFooter, InspectorRailIconButton, InspectorRailTab, InspectorSection, InspectorSectionTitle, InspectorTab, InspectorTabList, InspectorTabPanel, InspectorTabs, InspectorTitle, KANBAN_BAND_PEEK_DELAY_MS, KANBAN_BAND_PEEK_LINGER_MS, KANBAN_BOARD_AUTO_SCROLL_OPTIONS, KANBAN_BOARD_AUTO_SCROLL_SOURCES, KANBAN_BOARD_AXES, KANBAN_BOARD_COLLISION_DETECTION, KANBAN_CARD_DRAG_MIME, KANBAN_CARD_STICKY_TOP_VAR, KANBAN_COLLAPSED_BAND_WIDTH_CLASS, KANBAN_COLLAPSED_BAND_WIDTH_PX, KANBAN_COLUMN_GAP_PX, KANBAN_COLUMN_WIDTH_CLASS, KANBAN_COLUMN_WIDTH_PX, KANBAN_DIRECTIONS, KANBAN_DRAG_OVERLAY_Z_INDEX, KANBAN_HORIZONTAL_EDGES, KANBAN_MOUSE_ACTIVATION_DISTANCE, KANBAN_SORTABLE_ACTIVATION_MODES, KANBAN_STICKY_TOP_VAR, KANBAN_TOUCH_ACTIVATION_CONSTRAINT, KANBAN_VIRTUAL_CELL_PAGINATION, KanbanCardDragSurface, KanbanCardShell, KanbanCellAction, KanbanCollapsedBandCaption, KanbanColumnBandHeader, KanbanColumnHeader, KanbanDragHandle, KanbanSortableBoard, KanbanSortableColumns, KanbanSortableList, KanbanSubgroupBoard, KanbanVirtualCell, Label, MenuPreviewLayout, OVERLAY_COLLISION_PADDING, OVERLAY_LAYER_CLASS_NAMES, OutlineRail, PROPERTY_ROW_GRID, Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious, Popover, PopoverClose, PopoverPopup as PopoverContent, PopoverPopup, PopoverCreateHandle, PopoverDescription, PopoverPanel, PopoverTitle, PopoverTrigger, PreviewCardPrimitive, PreviewPane, ResourceCalendar, ReviewAuthorAvatar, ReviewCommentCard, ReviewDecisionActions, ReviewDiffDeletion, ReviewDiffInsertion, ReviewDiffText, ReviewOutOfDateNotice, ReviewSeverityDot, ReviewStatusBadge, ReviewStatusDot, SIDEBAR_WIDTH_ICON_PX, SIDEBAR_WIDTH_PX, SIDE_RAIL_CONTAINER_CLASS, SIDE_RAIL_ICON_BUTTON_SIZE, SIDE_RAIL_TAB_ICON_SIZE, SIDE_RAIL_WIDTH, ScrollArea, ScrollBar, ScrollToTop, SecretInput, SegmentedIconToggle, Select, SelectPopup as SelectContent, SelectPopup, SelectGroup, SelectGroupLabel, SelectItem, SelectSeparator, SelectTrigger, SelectValue, Separator, Sheet, SheetBackdrop, SheetBackdrop as SheetOverlay, SheetClose, SheetPopup as SheetContent, SheetPopup, SheetDescription, SheetFooter, SheetHeader, SheetPanel, SheetPortal, SheetTitle, SheetTrigger, Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, Skeleton, SortableHead, StellaMark, StellaWordmarkLatin, TOAST_RIGHT_OFFSET_VAR, TOOLBAR_ROW_HEIGHT, TOOLBAR_ROW_HEIGHT_PX, TRACKED_DELETION_STYLE, TRACKED_INSERTION_STYLE, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs, TabsPanel as TabsContent, TabsPanel, TabsList, TabsTab, TabsTab as TabsTrigger, TextSeparator, Textarea, ToastProvider, Tooltip, TooltipPopup as TooltipContent, TooltipPopup, TooltipCreateHandle, TooltipProvider, TooltipTrigger, UNKNOWN_AUTHOR_LABEL, UserText, WorkspaceEndRail, WorkspaceShell, assertConsecutiveCalendarDates, buildKanbanBoardMatrix, buttonAccessibleDisabledClass, buttonVariants, cn, composeRefs, containedEventHandler, containedHandler, contentDir, createKanbanDropIntent, duplicateColumnIds, emptyColor, entityTabGlyph, findTableColumn, getFirstWeekday, getInitials, getKanbanBoardColumnIdentity, getKanbanBoardLaneIdentity, getKanbanGroupingPropertyId, getKanbanGroups, getKanbanHorizontalEdge, getLocaleWeekInfo, getResourceCalendarPlacement, getWeekendDays, hasKanbanColumnBands, hideableColumnIds, isKanbanGroupingRenderable, isStructuredInputType, kanbanKeyboardCoordinates, layoutResourceCalendarEntries, nextCalendarDate, optionColors, orderKanbanCellsByColumns, parsePersistedPaneWidth, registerKanbanBoardAutoScroll, registerKanbanCardDrag, resolveDragWidth, resolveInspectorDockWidth, resolveInspectorPaneMaxWidth, resolveInspectorPaneWidth, resolveKanbanColumnBands, resolveKanbanGroupOptions, resolveKanbanGrouping, resolveKeyboardWidth, resolveOptionColor, reviewDiffSegmentKeys, reviewSeverityTone, selectKanbanCardFieldIds, selectKanbanRows, shouldForceSidebarCollapsed, sortableColumnIds, stellaToast, tableColumnIds, tableColumnSizing, useComboboxFilter, useContentDir, useDestructiveActionConfirmation, useInspectorPaneWidth, useIsMobile, useKanbanDropTarget, useKanbanSortable, useKanbanSortableSensors, useLatest, useSidebar, useSidebarInlineSize, useViewportWidth, visibleColumnIds };
98
+ export { APPLICATION_RAIL_BUTTON_SIZE, APPLICATION_RAIL_ICON_SIZE, APPLICATION_RAIL_WIDTH, Accordion, AccordionPanel as AccordionContent, AccordionPanel, AccordionItem, AccordionTrigger, AlertDialog, AlertDialogBackdrop, AlertDialogBackdrop as AlertDialogOverlay, AlertDialogClose, AlertDialogPopup as AlertDialogContent, AlertDialogPopup, AlertDialogCreateHandle, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogPanel, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AlertDialogViewport, AnchoredToastProvider, ApplicationRail, ApplicationRailButton, ApplicationRailContent, ApplicationRailFooter, ApplicationRailHeader, ApplicationRailMenu, ApplicationRailSeparator, Avatar, AvatarFallback, AvatarImage, BOARD_DRAG_OVERLAY_Z_INDEX, BidiText, Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, Button, CONTROL_SIZE, CONTROL_SIZES, CalendarCell, CalendarEntryButton, CalendarEntrySurface, CalendarGrid, CalendarHeaderCell, CalendarHeaderRow, Checkbox, ColorPicker, ColorPickerContent, Combobox, ComboboxChip, ComboboxChips, ComboboxChipsInput, ComboboxClear, ComboboxCollection, ComboboxEmpty, ComboboxGroup, ComboboxGroupLabel, ComboboxInput, ComboboxItem, ComboboxList, ComboboxPopup, ComboboxRow, ComboboxSeparator, ComboboxStatus, ComboboxTrigger, ComboboxValue, Command, CommandCollection, CommandDialog, CommandDialogPopup, CommandDialogTrigger, CommandEmpty, CommandFooter, CommandGroup, CommandGroupLabel, CommandInput, CommandItem, CommandList, CommandPanel, CommandSeparator, CommandShortcut, DEFAULT_PRESETS, DataTable, DatePickerPopover, DestructiveActionConfirmation, DestructiveConfirmDialog, Dialog, DialogBackdrop, DialogBackdrop as DialogOverlay, DialogClose, DialogPopup as DialogContent, DialogPopup, DialogCreateHandle, DialogDescription, DialogFooter, DialogHeader, DialogPanel, DialogPortal, DialogTitle, DialogTrigger, DialogViewport, DirectionalIcon, DiscordLogoIcon, Menu as DropdownMenu, Menu, MenuCheckboxItem as DropdownMenuCheckboxItem, MenuCheckboxItem, MenuPopup as DropdownMenuContent, MenuPopup, MenuCreateHandle as DropdownMenuCreateHandle, MenuCreateHandle, MenuGroup as DropdownMenuGroup, MenuGroup, MenuItem as DropdownMenuItem, MenuItem, MenuGroupLabel as DropdownMenuLabel, MenuGroupLabel, MenuPortal as DropdownMenuPortal, MenuPortal, MenuRadioGroup as DropdownMenuRadioGroup, MenuRadioGroup, MenuRadioItem as DropdownMenuRadioItem, MenuRadioItem, MenuSeparator as DropdownMenuSeparator, MenuSeparator, MenuShortcut as DropdownMenuShortcut, MenuShortcut, MenuSub as DropdownMenuSub, MenuSub, MenuSubPopup as DropdownMenuSubContent, MenuSubPopup, MenuSubTrigger as DropdownMenuSubTrigger, MenuSubTrigger, MenuTrigger as DropdownMenuTrigger, MenuTrigger, Field, FieldControl, FieldDescription, FieldError, FieldItem, FieldLabel, FieldValidity, Form, Frame, FrameDescription, FrameFooter, FrameHeader, FramePanel, FrameTitle, GitHubLogoIcon, HexColorPicker, PreviewCard as HoverCard, PreviewCard, PreviewCardPopup as HoverCardContent, PreviewCardPopup, PreviewCardTrigger as HoverCardTrigger, PreviewCardTrigger, INSPECTOR_CONTENT_MIN_WIDTH, INSPECTOR_EDITOR_MIN_WIDTH, INSPECTOR_PANE_DEFAULT_WIDTH, INSPECTOR_PANE_KEYBOARD_PAGE_STEP, INSPECTOR_PANE_KEYBOARD_STEP, INSPECTOR_PANE_MAX_WIDTH, INSPECTOR_PANE_MIN_WIDTH, INSPECTOR_RAIL_WIDTH, Input, InputGroup, InputGroupAddon, InputGroupInput, InputGroupText, InputGroupTextarea, InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot, Inspector, InspectorActions, InspectorContent, InspectorDescription, InspectorDock, InspectorEmptyRow, InspectorEntityTab, InspectorFacetBar, InspectorHeader, InspectorHeaderText, InspectorProperty, InspectorPropertyLabel, InspectorPropertyList, InspectorPropertyValue, InspectorRail, InspectorRailCell, InspectorRailContent, InspectorRailFooter, InspectorRailIconButton, InspectorRailTab, InspectorSection, InspectorSectionTitle, InspectorTab, InspectorTabList, InspectorTabPanel, InspectorTabs, InspectorTitle, KANBAN_BAND_CAPTION_ROW_HEIGHT, KANBAN_BAND_CAPTION_ROW_HEIGHT_PX, KANBAN_BAND_PEEK_DELAY_MS, KANBAN_BAND_PEEK_LINGER_MS, KANBAN_BOARD_AUTO_SCROLL_OPTIONS, KANBAN_BOARD_AUTO_SCROLL_SOURCES, KANBAN_BOARD_AXES, KANBAN_BOARD_COLLISION_DETECTION, KANBAN_CARD_DRAG_MIME, KANBAN_CARD_STICKY_TOP_VAR, KANBAN_CHROME_ROW_HEIGHT, KANBAN_CHROME_ROW_HEIGHT_PX, KANBAN_COLLAPSED_BAND_WIDTH_CLASS, KANBAN_COLLAPSED_BAND_WIDTH_PX, KANBAN_COLUMN_GAP_PX, KANBAN_COLUMN_WIDTH_CLASS, KANBAN_COLUMN_WIDTH_PX, KANBAN_DIRECTIONS, KANBAN_DRAG_OVERLAY_Z_INDEX, KANBAN_HORIZONTAL_EDGES, KANBAN_MOUSE_ACTIVATION_DISTANCE, KANBAN_SORTABLE_ACTIVATION_MODES, KANBAN_STICKY_TOP_VAR, KANBAN_TOUCH_ACTIVATION_CONSTRAINT, KANBAN_VIRTUAL_CELL_PAGINATION, KanbanCardDragSurface, KanbanCardShell, KanbanCellAction, KanbanCollapsedBandCaption, KanbanColumnBandHeader, KanbanColumnHeader, KanbanDragHandle, KanbanSortableBoard, KanbanSortableColumns, KanbanSortableList, KanbanSubgroupBoard, KanbanVirtualCell, Label, MenuPreviewLayout, OVERLAY_COLLISION_PADDING, OVERLAY_LAYER_CLASS_NAMES, OutlineRail, PROPERTY_ROW_GRID, Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious, Popover, PopoverClose, PopoverPopup as PopoverContent, PopoverPopup, PopoverCreateHandle, PopoverDescription, PopoverPanel, PopoverTitle, PopoverTrigger, PreviewCardPrimitive, PreviewPane, ResourceCalendar, ReviewAuthorAvatar, ReviewCommentCard, ReviewDecisionActions, ReviewDiffDeletion, ReviewDiffInsertion, ReviewDiffText, ReviewOutOfDateNotice, ReviewSeverityDot, ReviewStatusBadge, ReviewStatusDot, SHELL_CHROME_LAYER_CLASS_NAME, SIDEBAR_WIDTH_ICON_PX, SIDEBAR_WIDTH_PX, SIDE_RAIL_CONTAINER_CLASS, SIDE_RAIL_ICON_BUTTON_SIZE, SIDE_RAIL_TAB_ICON_SIZE, SIDE_RAIL_WIDTH, ScrollArea, ScrollBar, ScrollToTop, SecretInput, SegmentedIconToggle, Select, SelectPopup as SelectContent, SelectPopup, SelectGroup, SelectGroupLabel, SelectItem, SelectSeparator, SelectTrigger, SelectValue, Separator, Sheet, SheetBackdrop, SheetBackdrop as SheetOverlay, SheetClose, SheetPopup as SheetContent, SheetPopup, SheetDescription, SheetFooter, SheetHeader, SheetPanel, SheetPortal, SheetTitle, SheetTrigger, Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, Skeleton, SortableHead, StellaMark, StellaWordmarkLatin, TOAST_RIGHT_OFFSET_VAR, TOOLBAR_ROW_HEIGHT, TOOLBAR_ROW_HEIGHT_PX, TRACKED_DELETION_STYLE, TRACKED_INSERTION_STYLE, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs, TabsPanel as TabsContent, TabsPanel, TabsList, TabsTab, TabsTab as TabsTrigger, TextSeparator, Textarea, ToastProvider, Tooltip, TooltipPopup as TooltipContent, TooltipPopup, TooltipCreateHandle, TooltipProvider, TooltipTrigger, UNKNOWN_AUTHOR_LABEL, UserText, WorkspaceEndRail, WorkspaceShell, assertConsecutiveCalendarDates, buildKanbanBoardMatrix, buttonAccessibleDisabledClass, buttonVariants, cn, composeRefs, containedEventHandler, containedHandler, contentDir, createKanbanDropIntent, duplicateColumnIds, emptyColor, entityTabGlyph, findTableColumn, getFirstWeekday, getInitials, getKanbanBoardColumnIdentity, getKanbanBoardLaneIdentity, getKanbanGroupingPropertyId, getKanbanGroups, getKanbanHorizontalEdge, getLocaleWeekInfo, getResourceCalendarPlacement, getWeekendDays, hasKanbanColumnBands, hideableColumnIds, isKanbanGroupingRenderable, isStructuredInputType, kanbanKeyboardCoordinates, layoutResourceCalendarEntries, nextCalendarDate, optionColors, orderKanbanCellsByColumns, parsePersistedPaneWidth, registerKanbanBoardAutoScroll, registerKanbanCardDrag, resolveDragWidth, resolveInspectorDockWidth, resolveInspectorPaneMaxWidth, resolveInspectorPaneWidth, resolveKanbanColumnBands, resolveKanbanGroupOptions, resolveKanbanGrouping, resolveKeyboardWidth, resolveOptionColor, reviewDiffSegmentKeys, reviewSeverityTone, selectKanbanCardFieldIds, selectKanbanRows, shouldForceSidebarCollapsed, sortableColumnIds, stellaToast, tableColumnIds, tableColumnSizing, useComboboxFilter, useContentDir, useDestructiveActionConfirmation, useInspectorPaneWidth, useIsMobile, useKanbanDropTarget, useKanbanSortable, useKanbanSortableSensors, useLatest, useSidebar, useSidebarInlineSize, useViewportWidth, visibleColumnIds };
@@ -4,12 +4,37 @@ type KanbanCardShellProps = {
4
4
  children: ReactNode;
5
5
  /** Overlay slot pinned to the top-end corner (row actions). */
6
6
  actions?: ReactNode;
7
+ /**
8
+ * Whether `actions` are drawn at all times or only once the card is under
9
+ * the pointer. `"hover"` also hands their placement to the shell, so the
10
+ * quiet actions of every board rest in the same corner and a caller passes
11
+ * bare icon buttons; `"always"` (the default) leaves a caller's own overlay
12
+ * exactly where it put it.
13
+ *
14
+ * While they are hidden they are also inert: they take no pointer events at
15
+ * all, so a touch anywhere over the card — including the corner they will
16
+ * appear in — reaches the card itself. A hidden overlay that still answered
17
+ * a press would sit as a small dead zone on every card, and a long press
18
+ * landing in it would never start the card's drag.
19
+ *
20
+ * Each pointer has its own way in. A pointer that hovers reveals them by
21
+ * hovering the card; the keyboard reveals them by tabbing into them, which
22
+ * being inert to a pointer never blocked. A finger has neither, so `active`
23
+ * is its route: the card a tap opened shows its actions for as long as it
24
+ * stays open. A board that never marks a card active leaves touch without
25
+ * one, and should keep `"always"`.
26
+ */
27
+ actionsVisibility?: "always" | "hover" | undefined;
7
28
  /**
8
29
  * The card's identity row: whatever says which card this is, held at the top
9
30
  * of the card while the card scrolls past under it, and released where the
10
31
  * card ends. A card taller than the viewport otherwise loses its own name
11
32
  * halfway down. Omit it and the card renders exactly as it did before.
12
33
  *
34
+ * The row runs the card's full width and the actions overlay leads the same
35
+ * corner over it, so leave the row's end side clear of anything the actions
36
+ * would cover.
37
+ *
13
38
  * Booleans are excluded so `condition && <Row />` cannot reach the slot: a
14
39
  * `false` React renders as nothing would still leave the row's divider and
15
40
  * spacing behind. Write the absent case as `condition ? <Row /> : null`.
@@ -41,6 +66,6 @@ type KanbanCardShellProps = {
41
66
  * Nothing here clips its overflow: a pinned identity row stops sticking the
42
67
  * moment anything between it and the scroll container clips.
43
68
  */
44
- declare const KanbanCardShell: ({ children, actions, stickyHeader, active, onOpen, bodyRef, dragRef, className }: KanbanCardShellProps) => import("react").JSX.Element;
69
+ declare const KanbanCardShell: ({ children, actions, actionsVisibility, stickyHeader, active, onOpen, bodyRef, dragRef, className }: KanbanCardShellProps) => import("react").JSX.Element;
45
70
  //#endregion
46
71
  export { KanbanCardShell, KanbanCardShellProps };
@@ -15,7 +15,7 @@ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
15
15
  * Nothing here clips its overflow: a pinned identity row stops sticking the
16
16
  * moment anything between it and the scroll container clips.
17
17
  */
18
- const KanbanCardShell = ({ children, actions, stickyHeader, active, onOpen, bodyRef, dragRef, className }) => {
18
+ const KanbanCardShell = ({ children, actions, actionsVisibility = "always", stickyHeader, active, onOpen, bodyRef, dragRef, className }) => {
19
19
  const body = /* @__PURE__ */ jsxs(Fragment, { children: [
20
20
  stickyHeader === void 0 || stickyHeader === null ? null : /* @__PURE__ */ jsx("div", {
21
21
  className: cn(STICKY_HEADER_CLASS, KANBAN_CARD_STICKY_TOP_CLASS),
@@ -23,10 +23,15 @@ const KanbanCardShell = ({ children, actions, stickyHeader, active, onOpen, body
23
23
  children: stickyHeader
24
24
  }),
25
25
  children,
26
- actions
26
+ actionsVisibility === "hover" && actions !== void 0 ? /* @__PURE__ */ jsx("div", {
27
+ className: HOVER_ACTIONS_CLASS,
28
+ "data-kanban-card-actions": "hover",
29
+ children: actions
30
+ }) : actions
27
31
  ] });
28
32
  if (!onOpen) return /* @__PURE__ */ jsx("div", {
29
33
  className: "group/card",
34
+ "data-active": active ? "true" : void 0,
30
35
  ref: dragRef,
31
36
  children: /* @__PURE__ */ jsx("div", {
32
37
  className: cn(CARD_CLASS, active && ACTIVE_CLASS, className),
@@ -36,6 +41,7 @@ const KanbanCardShell = ({ children, actions, stickyHeader, active, onOpen, body
36
41
  });
37
42
  return /* @__PURE__ */ jsx("div", {
38
43
  className: "group/card",
44
+ "data-active": active ? "true" : void 0,
39
45
  ref: dragRef,
40
46
  children: /* @__PURE__ */ jsx("div", {
41
47
  className: cn(CARD_CLASS, "cursor-pointer transition-shadow hover:shadow-md", active && ACTIVE_CLASS, className),
@@ -59,11 +65,46 @@ const ACTIVE_CLASS = "ring-primary/30 ring-2";
59
65
  * passes behind it instead of reading through it, ruled off with the card's own
60
66
  * border weight.
61
67
  *
62
- * No `z-index`: being positioned is already enough to paint over the card's
63
- * flow content, and taking a layer would put the row over the `actions`
64
- * overlay, which callers anchor to the same corner with no layer of its own.
65
- * Tree order settles the rest, and the row renders before `actions`.
68
+ * `bg-card` on its own is not enough: a consumer is free to define that token
69
+ * with an alpha channel, and a translucent pinned row lets the very cards it
70
+ * is holding back read through it. The card colour goes down as a flat
71
+ * gradient layer over the opaque page background instead, which is the card's
72
+ * own surface at full opacity whatever the token turns out to be.
73
+ *
74
+ * The row takes a layer of its own. Being positioned only beats the card's
75
+ * flow content: a card whose body carries positioned controls of its own (a
76
+ * band of selects at its foot, say) renders them after the row, and tree order
77
+ * alone paints them straight over the name of the card they belong to. An
78
+ * overlay meant to stay reachable over the row takes the same layer and wins
79
+ * on tree order, which is what the hover `actions` slot below does; a caller
80
+ * anchoring its own always-visible overlay to that corner does the same.
81
+ */
82
+ const STICKY_HEADER_CLASS = "bg-background bg-[linear-gradient(var(--color-card),var(--color-card))] sticky z-10 mb-2 border-b pb-2";
83
+ /**
84
+ * Where the shell puts the actions it reveals on hover.
85
+ *
86
+ * The overlay takes a layer of its own here, unlike the always-visible slot:
87
+ * it has to stay over the pinned identity row that leads the same corner, and
88
+ * the row now takes a layer too. Sharing it is enough, because the overlay is
89
+ * rendered after the row. An open menu holds the actions on through its
90
+ * trigger's `aria-expanded`, or the trigger would disappear from under the
91
+ * popup it just opened.
92
+ *
93
+ * The fade is decoration: a reader who asked for less motion still gets the
94
+ * actions, they simply arrive at once.
95
+ *
96
+ * Every state that shows them also makes them answer a pointer again, and
97
+ * nothing else does: an invisible overlay that still took a press would leave
98
+ * a small dead zone in the corner of every card, and on a touch device that
99
+ * dead zone swallows the long press that starts the card's drag. Hiding alone
100
+ * would not have been enough — a transparent element is still the topmost hit.
101
+ * Focus is unaffected by `pointer-events`, so the keyboard path is untouched.
102
+ *
103
+ * The active card is what leaves a finger a way in, since it has neither
104
+ * hover nor tab: the card a tap opened keeps its actions out while it is
105
+ * open. It reads the state off the group rather than its own card box, so
106
+ * the pair stays in one class string.
66
107
  */
67
- const STICKY_HEADER_CLASS = "bg-card sticky mb-2 border-b pb-2";
108
+ const HOVER_ACTIONS_CLASS = "absolute end-1.5 top-1.5 z-10 flex items-center gap-0.5 opacity-0 pointer-events-none transition-opacity group-hover/card:pointer-events-auto group-hover/card:opacity-100 group-data-[active=true]/card:pointer-events-auto group-data-[active=true]/card:opacity-100 focus-within:pointer-events-auto focus-within:opacity-100 has-[[aria-expanded=true]]:pointer-events-auto has-[[aria-expanded=true]]:opacity-100 motion-reduce:transition-none";
68
109
  //#endregion
69
110
  export { KanbanCardShell };
@@ -3,12 +3,20 @@ import { ComponentProps } from "react";
3
3
  //#region src/kanban/cell-action.d.ts
4
4
  type KanbanCellActionProps = Omit<ComponentProps<typeof Button>, "variant">;
5
5
  /**
6
- * The quiet action at the end of a cell: a full-width ghost row that adds a
7
- * card to that column and lane.
6
+ * The quiet action at the end of a cell: a full-width row that adds a card to
7
+ * that column and lane.
8
8
  *
9
9
  * Every board rendered its own copy of this row and the copies drifted in
10
10
  * height, tone, and icon size. One primitive keeps the footer of every cell on
11
11
  * the same rhythm as a card, so an empty cell and a full one end the same way.
12
+ *
13
+ * It is drawn as the outline of a card rather than as a button: the row stands
14
+ * where the next card will, so a dashed card-shaped slot says what pressing it
15
+ * produces, which a ghost button in the same place never did. It stays a
16
+ * `Button` underneath for the focus ring and the coarse-pointer touch target
17
+ * the variant already carries; only the height is restated per breakpoint,
18
+ * since the button's own size drops a step at `sm` and the row has to hold the
19
+ * board's chrome rhythm at every width.
12
20
  */
13
21
  declare const KanbanCellAction: ({ children, className, ...props }: KanbanCellActionProps) => import("react").JSX.Element;
14
22
  //#endregion
@@ -1,18 +1,27 @@
1
1
  import { cn } from "../lib/utils.js";
2
2
  import { Button } from "../components/button.js";
3
+ import "./layout-tokens.js";
3
4
  import { PlusIcon } from "lucide-react";
4
5
  import { jsx, jsxs } from "react/jsx-runtime";
5
6
  //#region src/kanban/cell-action.tsx
6
7
  /**
7
- * The quiet action at the end of a cell: a full-width ghost row that adds a
8
- * card to that column and lane.
8
+ * The quiet action at the end of a cell: a full-width row that adds a card to
9
+ * that column and lane.
9
10
  *
10
11
  * Every board rendered its own copy of this row and the copies drifted in
11
12
  * height, tone, and icon size. One primitive keeps the footer of every cell on
12
13
  * the same rhythm as a card, so an empty cell and a full one end the same way.
14
+ *
15
+ * It is drawn as the outline of a card rather than as a button: the row stands
16
+ * where the next card will, so a dashed card-shaped slot says what pressing it
17
+ * produces, which a ghost button in the same place never did. It stays a
18
+ * `Button` underneath for the focus ring and the coarse-pointer touch target
19
+ * the variant already carries; only the height is restated per breakpoint,
20
+ * since the button's own size drops a step at `sm` and the row has to hold the
21
+ * board's chrome rhythm at every width.
13
22
  */
14
23
  const KanbanCellAction = ({ children, className, ...props }) => /* @__PURE__ */ jsxs(Button, {
15
- className: cn("text-muted-foreground hover:text-foreground min-h-11 w-full justify-start gap-1.5", className),
24
+ className: cn("border-border/70 text-muted-foreground hover:bg-muted/40 hover:text-foreground flex w-full items-center justify-start gap-1.5 rounded-lg border border-dashed px-3 text-sm", "h-9", "sm:h-9", className),
16
25
  "data-slot": "kanban-cell-action",
17
26
  ...props,
18
27
  variant: "ghost",
@@ -30,8 +30,12 @@ type KanbanColumnBandHeaderProps = {
30
30
  actions?: ReactNode;
31
31
  };
32
32
  /**
33
- * The band line above a run of columns: one 28px row of toggle, swatch, name,
34
- * and count, so a band costs the board a caption's height and nothing more.
33
+ * The band line above a run of columns: one `KANBAN_BAND_CAPTION_ROW_HEIGHT`
34
+ * row of toggle, swatch, name, and count.
35
+ *
36
+ * The line carries the chrome row height and sets its name a step heavier than
37
+ * a column title, because the band names the columns under it: a smaller label
38
+ * on a shorter line read as subordinate to the very columns it groups.
35
39
  * Folded, only the toggle remains in this line; the band's name moves down
36
40
  * into the narrow column body, where the height is already there.
37
41
  */
@@ -1,37 +1,42 @@
1
1
  import { cn } from "../lib/utils.js";
2
2
  import { DirectionalIcon } from "../components/directional-icon.js";
3
+ import { KANBAN_CHROME_TOGGLE_COARSE_TARGET_CLASS } from "./layout-tokens.js";
3
4
  import { ChevronDownIcon } from "lucide-react";
4
5
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
5
6
  //#region src/kanban/column-band-header.tsx
6
7
  /**
7
- * The band line above a run of columns: one 28px row of toggle, swatch, name,
8
- * and count, so a band costs the board a caption's height and nothing more.
8
+ * The band line above a run of columns: one `KANBAN_BAND_CAPTION_ROW_HEIGHT`
9
+ * row of toggle, swatch, name, and count.
10
+ *
11
+ * The line carries the chrome row height and sets its name a step heavier than
12
+ * a column title, because the band names the columns under it: a smaller label
13
+ * on a shorter line read as subordinate to the very columns it groups.
9
14
  * Folded, only the toggle remains in this line; the band's name moves down
10
15
  * into the narrow column body, where the height is already there.
11
16
  */
12
17
  const KanbanColumnBandHeader = ({ title, swatch, meta, collapsed, compact = collapsed, toggleLabel, onCollapsedChange, actions }) => /* @__PURE__ */ jsxs("div", {
13
- className: cn("flex h-7 items-center gap-1", compact ? "justify-center" : "pe-1"),
18
+ className: cn("flex items-center gap-1", "h-9", compact ? "justify-center" : "pe-1"),
14
19
  "data-collapsed": collapsed ? "" : void 0,
15
20
  "data-compact": compact ? "" : void 0,
16
21
  "data-slot": "kanban-column-band-header",
17
22
  children: [/* @__PURE__ */ jsx("button", {
18
23
  "aria-expanded": !collapsed,
19
24
  "aria-label": toggleLabel,
20
- className: "hover:bg-muted/60 text-muted-foreground hover:text-foreground flex size-6 shrink-0 items-center justify-center rounded-md transition-[background-color]",
25
+ className: cn("hover:bg-muted/60 text-muted-foreground hover:text-foreground flex size-7 shrink-0 items-center justify-center rounded-md transition-[background-color]", KANBAN_CHROME_TOGGLE_COARSE_TARGET_CLASS),
21
26
  onClick: (event) => onCollapsedChange(!collapsed, { viaPointer: event.detail > 0 }),
22
27
  title: toggleLabel,
23
28
  type: "button",
24
29
  children: /* @__PURE__ */ jsx(DirectionalIcon, {
25
- className: cn("size-3.5 transition-transform", collapsed && "-rotate-90"),
30
+ className: cn("size-4 transition-transform", collapsed && "-rotate-90"),
26
31
  flip: collapsed,
27
32
  icon: ChevronDownIcon
28
33
  })
29
34
  }), compact ? null : /* @__PURE__ */ jsxs(Fragment, { children: [
30
35
  swatch,
31
36
  /* @__PURE__ */ jsxs("span", {
32
- className: "flex min-w-0 flex-1 items-baseline gap-1.5 truncate text-xs font-medium",
37
+ className: "flex min-w-0 flex-1 items-baseline gap-1.5 truncate text-sm font-semibold",
33
38
  children: [title, meta !== void 0 && /* @__PURE__ */ jsx("span", {
34
- className: "text-muted-foreground font-normal tabular-nums",
39
+ className: "text-muted-foreground text-xs font-normal tabular-nums",
35
40
  children: meta
36
41
  })]
37
42
  }),
@@ -20,10 +20,10 @@ type KanbanColumnHeaderProps = {
20
20
  * The column header row: one rhythm for the swatch, the name, the count, the
21
21
  * calculation, and the column's controls, so every board's header lines up.
22
22
  *
23
- * Fixed at `TOOLBAR_ROW_HEIGHT`, the same height as the page header, the view
24
- * switcher, and the inspector rail's cells, so a column's top edge lines up
25
- * with every other chrome row above the board. The title clips instead of
26
- * wrapping so a long name can never grow the row past that height.
23
+ * Fixed at `KANBAN_CHROME_ROW_HEIGHT`, the height a lane's own rows take, so
24
+ * every chrome row on the board sits on one rhythm and a column's top edge
25
+ * lines up with the lane rows under it. The title clips instead of wrapping
26
+ * so a long name can never grow the row past that height.
27
27
  */
28
28
  declare const KanbanColumnHeader: ({ swatch, title, meta, calculation, dragHandle, actions, className }: KanbanColumnHeaderProps) => import("react").JSX.Element;
29
29
  //#endregion
@@ -1,26 +1,32 @@
1
1
  import { cn } from "../lib/utils.js";
2
- import { TOOLBAR_ROW_HEIGHT } from "../inspector/layout-tokens.js";
2
+ import "./layout-tokens.js";
3
3
  import { jsx, jsxs } from "react/jsx-runtime";
4
4
  //#region src/kanban/column-header.tsx
5
5
  /**
6
6
  * The column header row: one rhythm for the swatch, the name, the count, the
7
7
  * calculation, and the column's controls, so every board's header lines up.
8
8
  *
9
- * Fixed at `TOOLBAR_ROW_HEIGHT`, the same height as the page header, the view
10
- * switcher, and the inspector rail's cells, so a column's top edge lines up
11
- * with every other chrome row above the board. The title clips instead of
12
- * wrapping so a long name can never grow the row past that height.
9
+ * Fixed at `KANBAN_CHROME_ROW_HEIGHT`, the height a lane's own rows take, so
10
+ * every chrome row on the board sits on one rhythm and a column's top edge
11
+ * lines up with the lane rows under it. The title clips instead of wrapping
12
+ * so a long name can never grow the row past that height.
13
13
  */
14
14
  const KanbanColumnHeader = ({ swatch, title, meta, calculation, dragHandle, actions, className }) => /* @__PURE__ */ jsxs("div", {
15
- className: cn("flex items-center gap-2 px-3", TOOLBAR_ROW_HEIGHT, className),
15
+ className: cn("flex items-center gap-2 px-3", "h-9", className),
16
16
  children: [
17
- swatch,
18
- /* @__PURE__ */ jsxs("span", {
19
- className: "flex min-w-0 flex-1 items-center gap-1.5 truncate",
20
- children: [title, meta !== void 0 && /* @__PURE__ */ jsx("span", {
21
- className: "text-muted-foreground text-xs",
22
- children: meta
23
- })]
17
+ /* @__PURE__ */ jsx("div", {
18
+ className: "flex min-w-0 flex-1",
19
+ children: /* @__PURE__ */ jsxs("div", {
20
+ className: "sticky start-0 z-10 flex w-fit max-w-full items-center gap-2 bg-inherit",
21
+ "data-kanban-column-title": "",
22
+ children: [swatch, /* @__PURE__ */ jsxs("span", {
23
+ className: "flex min-w-0 flex-1 items-center gap-1.5 truncate",
24
+ children: [title, meta !== void 0 && /* @__PURE__ */ jsx("span", {
25
+ className: "text-muted-foreground text-xs",
26
+ children: meta
27
+ })]
28
+ })]
29
+ })
24
30
  }),
25
31
  calculation,
26
32
  dragHandle,
@@ -6,12 +6,13 @@ import { KanbanBuiltInGroup, KanbanColumnBand, KanbanGroup, KanbanGroupOption, K
6
6
  import { BuildKanbanBoardMatrixParams, CreateKanbanDropIntentParams, KANBAN_BOARD_AXES, KanbanBoardAxis, KanbanBoardCell, KanbanBoardColumn, KanbanBoardCoordinate, KanbanBoardDestination, KanbanBoardLane, KanbanBoardMatrix, KanbanDropAxisChange, KanbanDropIntent, OrderKanbanCellsByColumnsParams, ResolveKanbanGroupValueParams, buildKanbanBoardMatrix, createKanbanDropIntent, getKanbanBoardColumnIdentity, getKanbanBoardLaneIdentity, orderKanbanCellsByColumns } from "./matrix.js";
7
7
  import { KANBAN_COLLAPSED_BAND_WIDTH_CLASS, KANBAN_COLLAPSED_BAND_WIDTH_PX, KANBAN_COLUMN_GAP_PX, KANBAN_COLUMN_WIDTH_CLASS, KANBAN_COLUMN_WIDTH_PX, KanbanColumnBandSpan, hasKanbanColumnBands, resolveKanbanColumnBands } from "./column-bands.js";
8
8
  import { KanbanColumnHeader, KanbanColumnHeaderProps } from "./column-header.js";
9
+ import { KANBAN_BAND_CAPTION_ROW_HEIGHT, KANBAN_BAND_CAPTION_ROW_HEIGHT_PX, KANBAN_CHROME_ROW_HEIGHT, KANBAN_CHROME_ROW_HEIGHT_PX } from "./layout-tokens.js";
9
10
  import { KANBAN_BOARD_COLLISION_DETECTION, KanbanCellVirtualNavigation, KanbanSortableCellPosition, KanbanVirtualScrollRequest, kanbanKeyboardCoordinates } from "./sortable-interactions.logic.js";
10
11
  import { KANBAN_BOARD_AUTO_SCROLL_OPTIONS, KANBAN_DRAG_OVERLAY_Z_INDEX, KANBAN_MOUSE_ACTIVATION_DISTANCE, KANBAN_SORTABLE_ACTIVATION_MODES, KANBAN_TOUCH_ACTIVATION_CONSTRAINT, KanbanCardDragSurface, KanbanCardDragSurfaceProps, KanbanDragCancelEvent, KanbanDragEndEvent, KanbanDragHandle, KanbanDragHandleProps, KanbanDragOverEvent, KanbanDragStartEvent, KanbanSortableActivationMode, KanbanSortableBindings, KanbanSortableBoard, KanbanSortableBoardProps, KanbanSortableColumns, KanbanSortableColumnsProps, KanbanSortableList, KanbanSortableListProps, UseKanbanDropTargetOptions, UseKanbanSortableOptions, useKanbanDropTarget, useKanbanSortable, useKanbanSortableSensors } from "./sortable-interactions.js";
11
12
  import { KANBAN_DIRECTIONS, KANBAN_HORIZONTAL_EDGES, KanbanDirection, KanbanHorizontalEdge, getKanbanHorizontalEdge } from "./sortable-edge.js";
12
13
  import { KANBAN_BOARD_AUTO_SCROLL_SOURCES, KANBAN_CARD_DRAG_MIME, RegisterKanbanBoardAutoScrollOptions, RegisterKanbanCardDragOptions, registerKanbanBoardAutoScroll, registerKanbanCardDrag } from "./drag-interactions.js";
13
- import { KanbanSubgroupBandHeaderContext, KanbanSubgroupBoard, KanbanSubgroupBoardProps, KanbanSubgroupCellContext, KanbanSubgroupCollapsedBandCellContext, KanbanSubgroupColumnHeaderContext, KanbanSubgroupLaneIdentityContext } from "./subgroup-board.js";
14
+ import { KanbanSubgroupBandHeaderContext, KanbanSubgroupBoard, KanbanSubgroupBoardProps, KanbanSubgroupCellContext, KanbanSubgroupCollapsedBandCellContext, KanbanSubgroupColumnHeaderContext, KanbanSubgroupLaneColumnActionContext, KanbanSubgroupLaneColumnSummaryContext, KanbanSubgroupLaneIdentityContext } from "./subgroup-board.js";
14
15
  import { KANBAN_BAND_PEEK_DELAY_MS, KANBAN_BAND_PEEK_LINGER_MS } from "./band-peek.js";
15
16
  import { KANBAN_CARD_STICKY_TOP_VAR, KANBAN_STICKY_TOP_VAR, KanbanCollapsedBandCaption, KanbanCollapsedBandCaptionProps } from "./sticky-lane.js";
16
17
  import { KANBAN_VIRTUAL_CELL_PAGINATION, KanbanVirtualCell, KanbanVirtualCellPagination, KanbanVirtualCellProps, KanbanVirtualCellSortableContext } from "./virtual-cell.js";
17
- export { type BuildKanbanBoardMatrixParams, type CreateKanbanDropIntentParams, KANBAN_BAND_PEEK_DELAY_MS, KANBAN_BAND_PEEK_LINGER_MS, KANBAN_BOARD_AUTO_SCROLL_OPTIONS, KANBAN_BOARD_AUTO_SCROLL_SOURCES, KANBAN_BOARD_AXES, KANBAN_BOARD_COLLISION_DETECTION, KANBAN_CARD_DRAG_MIME, KANBAN_CARD_STICKY_TOP_VAR, KANBAN_COLLAPSED_BAND_WIDTH_CLASS, KANBAN_COLLAPSED_BAND_WIDTH_PX, KANBAN_COLUMN_GAP_PX, KANBAN_COLUMN_WIDTH_CLASS, KANBAN_COLUMN_WIDTH_PX, KANBAN_DIRECTIONS, KANBAN_DRAG_OVERLAY_Z_INDEX, KANBAN_HORIZONTAL_EDGES, KANBAN_MOUSE_ACTIVATION_DISTANCE, KANBAN_SORTABLE_ACTIVATION_MODES, KANBAN_STICKY_TOP_VAR, KANBAN_TOUCH_ACTIVATION_CONSTRAINT, KANBAN_VIRTUAL_CELL_PAGINATION, type KanbanBandToggleActivation, type KanbanBoardAxis, type KanbanBoardCell, type KanbanBoardColumn, type KanbanBoardCoordinate, type KanbanBoardDestination, type KanbanBoardLane, type KanbanBoardMatrix, type KanbanBuiltInGroup, KanbanCardDragSurface, type KanbanCardDragSurfaceProps, type KanbanCardFieldSelection, KanbanCardShell, type KanbanCardShellProps, KanbanCellAction, type KanbanCellActionProps, type KanbanCellVirtualNavigation, KanbanCollapsedBandCaption, type KanbanCollapsedBandCaptionProps, type KanbanColumnBand, KanbanColumnBandHeader, type KanbanColumnBandHeaderProps, type KanbanColumnBandSpan, KanbanColumnHeader, type KanbanColumnHeaderProps, type KanbanDirection, type KanbanDragCancelEvent, type KanbanDragEndEvent, KanbanDragHandle, type KanbanDragHandleProps, type KanbanDragOverEvent, type KanbanDragStartEvent, type KanbanDropAxisChange, type KanbanDropIntent, type KanbanGroup, type KanbanGroupOption, type KanbanGrouping, type KanbanHorizontalEdge, type KanbanSchema, type KanbanSortableActivationMode, type KanbanSortableBindings, KanbanSortableBoard, type KanbanSortableBoardProps, type KanbanSortableCellPosition, KanbanSortableColumns, type KanbanSortableColumnsProps, KanbanSortableList, type KanbanSortableListProps, type KanbanSubgroupBandHeaderContext, KanbanSubgroupBoard, type KanbanSubgroupBoardProps, type KanbanSubgroupCellContext, type KanbanSubgroupCollapsedBandCellContext, type KanbanSubgroupColumnHeaderContext, type KanbanSubgroupLaneIdentityContext, KanbanVirtualCell, type KanbanVirtualCellPagination, type KanbanVirtualCellProps, type KanbanVirtualCellSortableContext, type KanbanVirtualScrollRequest, type OrderKanbanCellsByColumnsParams, type RegisterKanbanBoardAutoScrollOptions, type RegisterKanbanCardDragOptions, type ResolveKanbanGroupValueParams, type ResolveKanbanGroupingParams, type UseKanbanDropTargetOptions, type UseKanbanSortableOptions, buildKanbanBoardMatrix, createKanbanDropIntent, getKanbanBoardColumnIdentity, getKanbanBoardLaneIdentity, getKanbanGroupingPropertyId, getKanbanGroups, getKanbanHorizontalEdge, hasKanbanColumnBands, isKanbanGroupingRenderable, kanbanKeyboardCoordinates, orderKanbanCellsByColumns, registerKanbanBoardAutoScroll, registerKanbanCardDrag, resolveKanbanColumnBands, resolveKanbanGroupOptions, resolveKanbanGrouping, selectKanbanCardFieldIds, selectKanbanRows, useKanbanDropTarget, useKanbanSortable, useKanbanSortableSensors };
18
+ export { type BuildKanbanBoardMatrixParams, type CreateKanbanDropIntentParams, KANBAN_BAND_CAPTION_ROW_HEIGHT, KANBAN_BAND_CAPTION_ROW_HEIGHT_PX, KANBAN_BAND_PEEK_DELAY_MS, KANBAN_BAND_PEEK_LINGER_MS, KANBAN_BOARD_AUTO_SCROLL_OPTIONS, KANBAN_BOARD_AUTO_SCROLL_SOURCES, KANBAN_BOARD_AXES, KANBAN_BOARD_COLLISION_DETECTION, KANBAN_CARD_DRAG_MIME, KANBAN_CARD_STICKY_TOP_VAR, KANBAN_CHROME_ROW_HEIGHT, KANBAN_CHROME_ROW_HEIGHT_PX, KANBAN_COLLAPSED_BAND_WIDTH_CLASS, KANBAN_COLLAPSED_BAND_WIDTH_PX, KANBAN_COLUMN_GAP_PX, KANBAN_COLUMN_WIDTH_CLASS, KANBAN_COLUMN_WIDTH_PX, KANBAN_DIRECTIONS, KANBAN_DRAG_OVERLAY_Z_INDEX, KANBAN_HORIZONTAL_EDGES, KANBAN_MOUSE_ACTIVATION_DISTANCE, KANBAN_SORTABLE_ACTIVATION_MODES, KANBAN_STICKY_TOP_VAR, KANBAN_TOUCH_ACTIVATION_CONSTRAINT, KANBAN_VIRTUAL_CELL_PAGINATION, type KanbanBandToggleActivation, type KanbanBoardAxis, type KanbanBoardCell, type KanbanBoardColumn, type KanbanBoardCoordinate, type KanbanBoardDestination, type KanbanBoardLane, type KanbanBoardMatrix, type KanbanBuiltInGroup, KanbanCardDragSurface, type KanbanCardDragSurfaceProps, type KanbanCardFieldSelection, KanbanCardShell, type KanbanCardShellProps, KanbanCellAction, type KanbanCellActionProps, type KanbanCellVirtualNavigation, KanbanCollapsedBandCaption, type KanbanCollapsedBandCaptionProps, type KanbanColumnBand, KanbanColumnBandHeader, type KanbanColumnBandHeaderProps, type KanbanColumnBandSpan, KanbanColumnHeader, type KanbanColumnHeaderProps, type KanbanDirection, type KanbanDragCancelEvent, type KanbanDragEndEvent, KanbanDragHandle, type KanbanDragHandleProps, type KanbanDragOverEvent, type KanbanDragStartEvent, type KanbanDropAxisChange, type KanbanDropIntent, type KanbanGroup, type KanbanGroupOption, type KanbanGrouping, type KanbanHorizontalEdge, type KanbanSchema, type KanbanSortableActivationMode, type KanbanSortableBindings, KanbanSortableBoard, type KanbanSortableBoardProps, type KanbanSortableCellPosition, KanbanSortableColumns, type KanbanSortableColumnsProps, KanbanSortableList, type KanbanSortableListProps, type KanbanSubgroupBandHeaderContext, KanbanSubgroupBoard, type KanbanSubgroupBoardProps, type KanbanSubgroupCellContext, type KanbanSubgroupCollapsedBandCellContext, type KanbanSubgroupColumnHeaderContext, type KanbanSubgroupLaneColumnActionContext, type KanbanSubgroupLaneColumnSummaryContext, type KanbanSubgroupLaneIdentityContext, KanbanVirtualCell, type KanbanVirtualCellPagination, type KanbanVirtualCellProps, type KanbanVirtualCellSortableContext, type KanbanVirtualScrollRequest, type OrderKanbanCellsByColumnsParams, type RegisterKanbanBoardAutoScrollOptions, type RegisterKanbanCardDragOptions, type ResolveKanbanGroupValueParams, type ResolveKanbanGroupingParams, type UseKanbanDropTargetOptions, type UseKanbanSortableOptions, buildKanbanBoardMatrix, createKanbanDropIntent, getKanbanBoardColumnIdentity, getKanbanBoardLaneIdentity, getKanbanGroupingPropertyId, getKanbanGroups, getKanbanHorizontalEdge, hasKanbanColumnBands, isKanbanGroupingRenderable, kanbanKeyboardCoordinates, orderKanbanCellsByColumns, registerKanbanBoardAutoScroll, registerKanbanCardDrag, resolveKanbanColumnBands, resolveKanbanGroupOptions, resolveKanbanGrouping, selectKanbanCardFieldIds, selectKanbanRows, useKanbanDropTarget, useKanbanSortable, useKanbanSortableSensors };
@@ -1,6 +1,7 @@
1
1
  import { selectKanbanCardFieldIds } from "./card-properties.js";
2
2
  import { KANBAN_CARD_STICKY_TOP_VAR, KANBAN_STICKY_TOP_VAR, KanbanCollapsedBandCaption } from "./sticky-lane.js";
3
3
  import { KanbanCardShell } from "./card-shell.js";
4
+ import { KANBAN_BAND_CAPTION_ROW_HEIGHT, KANBAN_BAND_CAPTION_ROW_HEIGHT_PX, KANBAN_CHROME_ROW_HEIGHT, KANBAN_CHROME_ROW_HEIGHT_PX } from "./layout-tokens.js";
4
5
  import { KanbanCellAction } from "./cell-action.js";
5
6
  import { KanbanColumnBandHeader } from "./column-band-header.js";
6
7
  import { getKanbanGroupingPropertyId, getKanbanGroups, isKanbanGroupingRenderable, resolveKanbanGroupOptions, resolveKanbanGrouping, selectKanbanRows } from "./grouping.js";
@@ -14,4 +15,4 @@ import { KANBAN_BOARD_AUTO_SCROLL_SOURCES, KANBAN_CARD_DRAG_MIME, registerKanban
14
15
  import { KANBAN_BAND_PEEK_DELAY_MS, KANBAN_BAND_PEEK_LINGER_MS } from "./band-peek.js";
15
16
  import { KanbanSubgroupBoard } from "./subgroup-board.js";
16
17
  import { KANBAN_VIRTUAL_CELL_PAGINATION, KanbanVirtualCell } from "./virtual-cell.js";
17
- export { KANBAN_BAND_PEEK_DELAY_MS, KANBAN_BAND_PEEK_LINGER_MS, KANBAN_BOARD_AUTO_SCROLL_OPTIONS, KANBAN_BOARD_AUTO_SCROLL_SOURCES, KANBAN_BOARD_AXES, KANBAN_BOARD_COLLISION_DETECTION, KANBAN_CARD_DRAG_MIME, KANBAN_CARD_STICKY_TOP_VAR, KANBAN_COLLAPSED_BAND_WIDTH_CLASS, KANBAN_COLLAPSED_BAND_WIDTH_PX, KANBAN_COLUMN_GAP_PX, KANBAN_COLUMN_WIDTH_CLASS, KANBAN_COLUMN_WIDTH_PX, KANBAN_DIRECTIONS, KANBAN_DRAG_OVERLAY_Z_INDEX, KANBAN_HORIZONTAL_EDGES, KANBAN_MOUSE_ACTIVATION_DISTANCE, KANBAN_SORTABLE_ACTIVATION_MODES, KANBAN_STICKY_TOP_VAR, KANBAN_TOUCH_ACTIVATION_CONSTRAINT, KANBAN_VIRTUAL_CELL_PAGINATION, KanbanCardDragSurface, KanbanCardShell, KanbanCellAction, KanbanCollapsedBandCaption, KanbanColumnBandHeader, KanbanColumnHeader, KanbanDragHandle, KanbanSortableBoard, KanbanSortableColumns, KanbanSortableList, KanbanSubgroupBoard, KanbanVirtualCell, buildKanbanBoardMatrix, createKanbanDropIntent, getKanbanBoardColumnIdentity, getKanbanBoardLaneIdentity, getKanbanGroupingPropertyId, getKanbanGroups, getKanbanHorizontalEdge, hasKanbanColumnBands, isKanbanGroupingRenderable, kanbanKeyboardCoordinates, orderKanbanCellsByColumns, registerKanbanBoardAutoScroll, registerKanbanCardDrag, resolveKanbanColumnBands, resolveKanbanGroupOptions, resolveKanbanGrouping, selectKanbanCardFieldIds, selectKanbanRows, useKanbanDropTarget, useKanbanSortable, useKanbanSortableSensors };
18
+ export { KANBAN_BAND_CAPTION_ROW_HEIGHT, KANBAN_BAND_CAPTION_ROW_HEIGHT_PX, KANBAN_BAND_PEEK_DELAY_MS, KANBAN_BAND_PEEK_LINGER_MS, KANBAN_BOARD_AUTO_SCROLL_OPTIONS, KANBAN_BOARD_AUTO_SCROLL_SOURCES, KANBAN_BOARD_AXES, KANBAN_BOARD_COLLISION_DETECTION, KANBAN_CARD_DRAG_MIME, KANBAN_CARD_STICKY_TOP_VAR, KANBAN_CHROME_ROW_HEIGHT, KANBAN_CHROME_ROW_HEIGHT_PX, KANBAN_COLLAPSED_BAND_WIDTH_CLASS, KANBAN_COLLAPSED_BAND_WIDTH_PX, KANBAN_COLUMN_GAP_PX, KANBAN_COLUMN_WIDTH_CLASS, KANBAN_COLUMN_WIDTH_PX, KANBAN_DIRECTIONS, KANBAN_DRAG_OVERLAY_Z_INDEX, KANBAN_HORIZONTAL_EDGES, KANBAN_MOUSE_ACTIVATION_DISTANCE, KANBAN_SORTABLE_ACTIVATION_MODES, KANBAN_STICKY_TOP_VAR, KANBAN_TOUCH_ACTIVATION_CONSTRAINT, KANBAN_VIRTUAL_CELL_PAGINATION, KanbanCardDragSurface, KanbanCardShell, KanbanCellAction, KanbanCollapsedBandCaption, KanbanColumnBandHeader, KanbanColumnHeader, KanbanDragHandle, KanbanSortableBoard, KanbanSortableColumns, KanbanSortableList, KanbanSubgroupBoard, KanbanVirtualCell, buildKanbanBoardMatrix, createKanbanDropIntent, getKanbanBoardColumnIdentity, getKanbanBoardLaneIdentity, getKanbanGroupingPropertyId, getKanbanGroups, getKanbanHorizontalEdge, hasKanbanColumnBands, isKanbanGroupingRenderable, kanbanKeyboardCoordinates, orderKanbanCellsByColumns, registerKanbanBoardAutoScroll, registerKanbanCardDrag, resolveKanbanColumnBands, resolveKanbanGroupOptions, resolveKanbanGrouping, selectKanbanCardFieldIds, selectKanbanRows, useKanbanDropTarget, useKanbanSortable, useKanbanSortableSensors };
@@ -0,0 +1,51 @@
1
+ //#region src/kanban/layout-tokens.d.ts
2
+ /**
3
+ * The heights the board's chrome rows are built from.
4
+ *
5
+ * A board stacks several rows of chrome above the first card — the band
6
+ * caption, the column headers, a lane's identity and its per-column
7
+ * summaries — and every one of them is pinned at some point, so their heights
8
+ * are what a card's own pinned row is offset by. Naming them once keeps the
9
+ * rows on a single rhythm and keeps the pixel value that offsets a sticky
10
+ * control in step with the class that draws the row.
11
+ */
12
+ /**
13
+ * Where the board's chrome stacks: its header block at `z-20`, a lane's own
14
+ * row at `z-10` under it. Both stay below the shell's chrome
15
+ * (`SHELL_CHROME_LAYER_CLASS_NAME`), which pins a top bar around whatever the
16
+ * board is rendered in: when the shell's content column rather than the board
17
+ * is the scroll container, board and shell chrome are pinned in the same
18
+ * scroller, and equal z-indexes would leave paint order to decide.
19
+ */
20
+ /**
21
+ * The column header row and a lane's rows: a *fixed* height, tighter than the
22
+ * inspector's 48px toolbar row, because a board shows three of these before
23
+ * the first card and each one costs the cards their space. Fixed rather than
24
+ * minimum: a row that grows with its content moves every offset below it.
25
+ */
26
+ declare const KANBAN_CHROME_ROW_HEIGHT: "h-9";
27
+ declare const KANBAN_CHROME_ROW_HEIGHT_PX: 36;
28
+ /**
29
+ * The band caption line, on the chrome row height like everything else: a band
30
+ * names the run of columns under it, so its caption reads as their parent. A
31
+ * shorter line with a smaller label read as a note *about* the header row, and
32
+ * left a group looking subordinate to its own columns.
33
+ *
34
+ * Still named for the caption, because that row is the one a caller composes
35
+ * against when it renders a band header of its own.
36
+ */
37
+ declare const KANBAN_BAND_CAPTION_ROW_HEIGHT: "h-9";
38
+ declare const KANBAN_BAND_CAPTION_ROW_HEIGHT_PX: 36;
39
+ /**
40
+ * A finger's 44px target on a control the chrome row keeps at its own height.
41
+ *
42
+ * The same pseudo-element the shared `Button` extends its own targets with:
43
+ * the visible control keeps the row's height, and only the touch surface
44
+ * grows. The surface is a fixed 44px centred on the control rather than an
45
+ * inset off its edges, so a 28px toggle and a 36px one both reach the same
46
+ * distance either way, and neither spills into the row underneath: an inset
47
+ * grows a short control downwards by whatever it is short by.
48
+ */
49
+ declare const KANBAN_CHROME_TOGGLE_COARSE_TARGET_CLASS = "relative pointer-coarse:after:absolute pointer-coarse:after:inset-x-0 pointer-coarse:after:top-1/2 pointer-coarse:after:h-11 pointer-coarse:after:-translate-y-1/2";
50
+ //#endregion
51
+ export { KANBAN_BAND_CAPTION_ROW_HEIGHT, KANBAN_BAND_CAPTION_ROW_HEIGHT_PX, KANBAN_CHROME_ROW_HEIGHT, KANBAN_CHROME_ROW_HEIGHT_PX, KANBAN_CHROME_TOGGLE_COARSE_TARGET_CLASS };
@@ -0,0 +1,51 @@
1
+ //#region src/kanban/layout-tokens.ts
2
+ /**
3
+ * The heights the board's chrome rows are built from.
4
+ *
5
+ * A board stacks several rows of chrome above the first card — the band
6
+ * caption, the column headers, a lane's identity and its per-column
7
+ * summaries — and every one of them is pinned at some point, so their heights
8
+ * are what a card's own pinned row is offset by. Naming them once keeps the
9
+ * rows on a single rhythm and keeps the pixel value that offsets a sticky
10
+ * control in step with the class that draws the row.
11
+ */
12
+ /**
13
+ * Where the board's chrome stacks: its header block at `z-20`, a lane's own
14
+ * row at `z-10` under it. Both stay below the shell's chrome
15
+ * (`SHELL_CHROME_LAYER_CLASS_NAME`), which pins a top bar around whatever the
16
+ * board is rendered in: when the shell's content column rather than the board
17
+ * is the scroll container, board and shell chrome are pinned in the same
18
+ * scroller, and equal z-indexes would leave paint order to decide.
19
+ */
20
+ /**
21
+ * The column header row and a lane's rows: a *fixed* height, tighter than the
22
+ * inspector's 48px toolbar row, because a board shows three of these before
23
+ * the first card and each one costs the cards their space. Fixed rather than
24
+ * minimum: a row that grows with its content moves every offset below it.
25
+ */
26
+ const KANBAN_CHROME_ROW_HEIGHT = "h-9";
27
+ const KANBAN_CHROME_ROW_HEIGHT_PX = 36;
28
+ /**
29
+ * The band caption line, on the chrome row height like everything else: a band
30
+ * names the run of columns under it, so its caption reads as their parent. A
31
+ * shorter line with a smaller label read as a note *about* the header row, and
32
+ * left a group looking subordinate to its own columns.
33
+ *
34
+ * Still named for the caption, because that row is the one a caller composes
35
+ * against when it renders a band header of its own.
36
+ */
37
+ const KANBAN_BAND_CAPTION_ROW_HEIGHT = "h-9";
38
+ const KANBAN_BAND_CAPTION_ROW_HEIGHT_PX = 36;
39
+ /**
40
+ * A finger's 44px target on a control the chrome row keeps at its own height.
41
+ *
42
+ * The same pseudo-element the shared `Button` extends its own targets with:
43
+ * the visible control keeps the row's height, and only the touch surface
44
+ * grows. The surface is a fixed 44px centred on the control rather than an
45
+ * inset off its edges, so a 28px toggle and a 36px one both reach the same
46
+ * distance either way, and neither spills into the row underneath: an inset
47
+ * grows a short control downwards by whatever it is short by.
48
+ */
49
+ const KANBAN_CHROME_TOGGLE_COARSE_TARGET_CLASS = "relative pointer-coarse:after:absolute pointer-coarse:after:inset-x-0 pointer-coarse:after:top-1/2 pointer-coarse:after:h-11 pointer-coarse:after:-translate-y-1/2";
50
+ //#endregion
51
+ export { KANBAN_BAND_CAPTION_ROW_HEIGHT, KANBAN_BAND_CAPTION_ROW_HEIGHT_PX, KANBAN_CHROME_ROW_HEIGHT, KANBAN_CHROME_ROW_HEIGHT_PX, KANBAN_CHROME_TOGGLE_COARSE_TARGET_CLASS };
@@ -59,7 +59,7 @@ const KanbanCollapsedBandCaption = ({ className, label, meta }) => /* @__PURE__
59
59
  className: cn("text-muted-foreground sticky flex w-full flex-col items-center gap-2 self-start py-2 text-xs", KANBAN_STICKY_TOP_CLASS, className),
60
60
  "data-kanban-collapsed-band-caption": "",
61
61
  children: [/* @__PURE__ */ jsx("span", {
62
- className: "max-h-40 truncate font-medium [writing-mode:vertical-rl]",
62
+ className: "max-h-40 truncate font-semibold [writing-mode:vertical-rl]",
63
63
  children: label
64
64
  }), /* @__PURE__ */ jsx("span", {
65
65
  className: "tabular-nums",
@@ -11,6 +11,17 @@ type KanbanSubgroupLaneIdentityContext = {
11
11
  group: KanbanGroup;
12
12
  count: number;
13
13
  };
14
+ /** One column's cell in a lane's own row, and what that cell stands for. */
15
+ type KanbanSubgroupLaneColumnSummaryContext = {
16
+ lane: KanbanGroup;
17
+ column: KanbanBoardColumn;
18
+ /** Rows in this lane/column intersection, including zero. */
19
+ count: number;
20
+ };
21
+ type KanbanSubgroupLaneColumnActionContext = {
22
+ lane: KanbanGroup;
23
+ column: KanbanBoardColumn;
24
+ };
14
25
  type KanbanSubgroupCellContext<TRow> = {
15
26
  cell: KanbanBoardCell<TRow>;
16
27
  /** Number of rows in this lane/column intersection, including zero. */
@@ -66,6 +77,18 @@ type KanbanSubgroupBoardProps<TRow> = {
66
77
  renderColumnHeader: (context: KanbanSubgroupColumnHeaderContext) => ReactNode;
67
78
  renderLaneIdentity: (context: KanbanSubgroupLaneIdentityContext) => ReactNode;
68
79
  renderCell: (context: KanbanSubgroupCellContext<TRow>) => ReactNode;
80
+ /**
81
+ * What a lane's own row says about one column: its count by default. The
82
+ * row is pinned, so this is the one line about a column that survives a
83
+ * scroll down a lane hundreds of cards tall — a calculation belongs here
84
+ * rather than at the end of a cell nobody reaches.
85
+ */
86
+ renderLaneColumnSummary?: ((context: KanbanSubgroupLaneColumnSummaryContext) => ReactNode) | undefined;
87
+ /**
88
+ * The control at the end of a lane's cell for one column, such as adding a
89
+ * card straight into that intersection. None by default.
90
+ */
91
+ renderLaneColumnAction?: ((context: KanbanSubgroupLaneColumnActionContext) => ReactNode) | undefined;
69
92
  /**
70
93
  * The line above a band's columns. Defaults to `KanbanColumnBandHeader`
71
94
  * with the band's label and count.
@@ -115,6 +138,11 @@ type KanbanSubgroupBoardProps<TRow> = {
115
138
  /**
116
139
  * Reusable swimlane layout over the canonical two-axis Kanban matrix.
117
140
  *
141
+ * Every lane leads with a row of its own, pinned on both axes: its name at the
142
+ * visible inline edge, and beside each column what that column holds in this
143
+ * lane, so a reader deep inside a lane still knows which lane it is and what
144
+ * is around them.
145
+ *
118
146
  * Columns that carry band metadata render under a one-line band caption and
119
147
  * can be collapsed as a run: the band folds into one narrow slot in every
120
148
  * row, whose cells stay reachable (a host renders its drop target in them),
@@ -124,6 +152,6 @@ type KanbanSubgroupBoardProps<TRow> = {
124
152
  * in every state; the caption line never grows past its own height, so a
125
153
  * folded band costs no vertical space.
126
154
  */
127
- declare const KanbanSubgroupBoard: <TRow>({ matrix, renderColumnHeader, renderLaneIdentity, renderCell, renderBandHeader, renderCollapsedBandCell, formatBandToggleLabel, formatCount, isLaneCollapsed, onLaneCollapsedChange, isBandCollapsed, onBandCollapsedChange, footer, className, dragOverBandId, isDragging }: KanbanSubgroupBoardProps<TRow>) => import("react").JSX.Element;
155
+ declare const KanbanSubgroupBoard: <TRow>({ matrix, renderColumnHeader, renderLaneIdentity, renderCell, renderLaneColumnSummary, renderLaneColumnAction, renderBandHeader, renderCollapsedBandCell, formatBandToggleLabel, formatCount, isLaneCollapsed, onLaneCollapsedChange, isBandCollapsed, onBandCollapsedChange, footer, className, dragOverBandId, isDragging }: KanbanSubgroupBoardProps<TRow>) => import("react").JSX.Element;
128
156
  //#endregion
129
- export { KanbanSubgroupBandHeaderContext, KanbanSubgroupBoard, KanbanSubgroupBoardProps, KanbanSubgroupCellContext, KanbanSubgroupCollapsedBandCellContext, KanbanSubgroupColumnHeaderContext, KanbanSubgroupLaneIdentityContext };
157
+ export { KanbanSubgroupBandHeaderContext, KanbanSubgroupBoard, KanbanSubgroupBoardProps, KanbanSubgroupCellContext, KanbanSubgroupCollapsedBandCellContext, KanbanSubgroupColumnHeaderContext, KanbanSubgroupLaneColumnActionContext, KanbanSubgroupLaneColumnSummaryContext, KanbanSubgroupLaneIdentityContext };
@@ -1,6 +1,7 @@
1
1
  import { cn } from "../lib/utils.js";
2
2
  import { DirectionalIcon } from "../components/directional-icon.js";
3
- import { KANBAN_STICKY_TOP_VAR, KanbanCollapsedBandCaption } from "./sticky-lane.js";
3
+ import { KANBAN_STICKY_TOP_CLASS, KANBAN_STICKY_TOP_VAR, KanbanCollapsedBandCaption } from "./sticky-lane.js";
4
+ import { KANBAN_CHROME_TOGGLE_COARSE_TARGET_CLASS } from "./layout-tokens.js";
4
5
  import { KanbanColumnBandHeader } from "./column-band-header.js";
5
6
  import { KANBAN_COLLAPSED_BAND_WIDTH_CLASS, KANBAN_COLUMN_WIDTH_CLASS, resolveKanbanColumnBands } from "./column-bands.js";
6
7
  import { KANBAN_CARD_DRAG_MIME } from "./drag-interactions.js";
@@ -9,6 +10,17 @@ import { ChevronDownIcon } from "lucide-react";
9
10
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
10
11
  import { useEffect, useMemo, useRef, useState } from "react";
11
12
  //#region src/kanban/subgroup-board.tsx
13
+ /**
14
+ * How far a lane's own pinned row reaches: its identity line over the line of
15
+ * per-column summaries, each fixed at the chrome row height.
16
+ *
17
+ * Stated rather than measured, because both lines are fixed by construction —
18
+ * a caller's summary or action renders inside a row that cannot grow — and the
19
+ * cells below have to know the offset before the first paint, or every card's
20
+ * pinned identity row spends that frame parked where the lane row is about
21
+ * to be.
22
+ */
23
+ const LANE_ROW_HEIGHT_PX = 72;
12
24
  const groupValueKey = (value) => value === null ? "null" : `value:${value.length}:${value}`;
13
25
  const columnKey = (column) => column.type === "group" ? `group:${groupValueKey(column.group.value)}` : `destination:${column.destination.id}`;
14
26
  const spanKey = (span) => span.band === null ? `single:${span.columns.map(columnKey).join("|")}` : `band:${span.band.id}`;
@@ -16,6 +28,11 @@ const rowsIn = (cells) => cells.reduce((sum, cell) => sum + cell.rows.length, 0)
16
28
  /**
17
29
  * Reusable swimlane layout over the canonical two-axis Kanban matrix.
18
30
  *
31
+ * Every lane leads with a row of its own, pinned on both axes: its name at the
32
+ * visible inline edge, and beside each column what that column holds in this
33
+ * lane, so a reader deep inside a lane still knows which lane it is and what
34
+ * is around them.
35
+ *
19
36
  * Columns that carry band metadata render under a one-line band caption and
20
37
  * can be collapsed as a run: the band folds into one narrow slot in every
21
38
  * row, whose cells stay reachable (a host renders its drop target in them),
@@ -25,7 +42,7 @@ const rowsIn = (cells) => cells.reduce((sum, cell) => sum + cell.rows.length, 0)
25
42
  * in every state; the caption line never grows past its own height, so a
26
43
  * folded band costs no vertical space.
27
44
  */
28
- const KanbanSubgroupBoard = ({ matrix, renderColumnHeader, renderLaneIdentity, renderCell, renderBandHeader, renderCollapsedBandCell, formatBandToggleLabel, formatCount = String, isLaneCollapsed, onLaneCollapsedChange, isBandCollapsed, onBandCollapsedChange, footer, className, dragOverBandId, isDragging }) => {
45
+ const KanbanSubgroupBoard = ({ matrix, renderColumnHeader, renderLaneIdentity, renderCell, renderLaneColumnSummary, renderLaneColumnAction, renderBandHeader, renderCollapsedBandCell, formatBandToggleLabel, formatCount = String, isLaneCollapsed, onLaneCollapsedChange, isBandCollapsed, onBandCollapsedChange, footer, className, dragOverBandId, isDragging }) => {
29
46
  const [collapsedLaneValues, setCollapsedLaneValues] = useState(() => /* @__PURE__ */ new Set());
30
47
  const [expandedEmptyLaneValues, setExpandedEmptyLaneValues] = useState(() => /* @__PURE__ */ new Set());
31
48
  const [collapsedBandIds, setCollapsedBandIds] = useState(() => /* @__PURE__ */ new Set());
@@ -221,7 +238,7 @@ const KanbanSubgroupBoard = ({ matrix, renderColumnHeader, renderLaneIdentity, r
221
238
  const foldedCount = (span, cells) => {
222
239
  const count = rowsIn(cellsOf(span, cells));
223
240
  return /* @__PURE__ */ jsx("div", {
224
- className: "flex justify-center",
241
+ className: cn("flex items-center justify-center", "h-9"),
225
242
  "data-kanban-lane-column-count": count,
226
243
  children: /* @__PURE__ */ jsx("span", {
227
244
  className: "text-muted-foreground text-xs tabular-nums",
@@ -229,7 +246,33 @@ const KanbanSubgroupBoard = ({ matrix, renderColumnHeader, renderLaneIdentity, r
229
246
  })
230
247
  });
231
248
  };
249
+ /** One column's cell in a lane's row: what it holds, then what it offers. */
250
+ const laneColumnCell = (group, column, count) => /* @__PURE__ */ jsxs("div", {
251
+ className: cn("flex items-center gap-1 px-3", "h-9"),
252
+ "data-kanban-lane-column-count": count,
253
+ children: [renderLaneColumnSummary ? renderLaneColumnSummary({
254
+ column,
255
+ count,
256
+ lane: group
257
+ }) : /* @__PURE__ */ jsx("span", {
258
+ className: "text-muted-foreground text-xs tabular-nums",
259
+ children: formatCount(count)
260
+ }), renderLaneColumnAction === void 0 ? null : /* @__PURE__ */ jsx("span", {
261
+ className: "ms-auto flex items-center",
262
+ children: renderLaneColumnAction({
263
+ column,
264
+ lane: group
265
+ })
266
+ })]
267
+ });
232
268
  const stickyTopStyle = { [KANBAN_STICKY_TOP_VAR]: `${String(headerHeight)}px` };
269
+ /**
270
+ * What a lane's cells find pinned above them: the board's header and the
271
+ * lane's own row. Restating the offset rather than adding to the inherited
272
+ * one, because a custom property that reads itself is a cycle and resolves
273
+ * to nothing at all.
274
+ */
275
+ const laneCellsStickyTopStyle = { [KANBAN_STICKY_TOP_VAR]: `${String(headerHeight + LANE_ROW_HEIGHT_PX)}px` };
233
276
  return /* @__PURE__ */ jsx("div", {
234
277
  className: cn("h-full overflow-auto px-4 pb-4", className),
235
278
  style: stickyTopStyle,
@@ -237,7 +280,7 @@ const KanbanSubgroupBoard = ({ matrix, renderColumnHeader, renderLaneIdentity, r
237
280
  className: "min-w-max",
238
281
  children: [
239
282
  /* @__PURE__ */ jsxs("div", {
240
- className: "bg-background sticky top-0 z-20 pt-2 pb-2",
283
+ className: "bg-background sticky top-0 z-20",
241
284
  "data-kanban-board-header": "",
242
285
  ref: headerRef,
243
286
  children: [hasBands ? /* @__PURE__ */ jsx("div", {
@@ -265,7 +308,11 @@ const KanbanSubgroupBoard = ({ matrix, renderColumnHeader, renderLaneIdentity, r
265
308
  onDragLeave: (event) => {
266
309
  if (leavesElement(event) && isKanbanCardDragEvent(event)) peek.openDragLeave(band.id);
267
310
  },
268
- children: bandHeader(band, span)
311
+ children: /* @__PURE__ */ jsx("div", {
312
+ className: "bg-background sticky start-0 z-10 w-fit max-w-full",
313
+ "data-kanban-band-caption": "",
314
+ children: bandHeader(band, span)
315
+ })
269
316
  }, spanKey(span));
270
317
  })
271
318
  }) : null, renderRow({
@@ -299,12 +346,15 @@ const KanbanSubgroupBoard = ({ matrix, renderColumnHeader, renderLaneIdentity, r
299
346
  const cellFor = (column) => cells.find((candidate) => columnKey(candidate.coordinate.column) === columnKey(column));
300
347
  return /* @__PURE__ */ jsxs("section", {
301
348
  className: "border-border/60 border-b py-1 first:pt-0 last:border-b-0",
302
- children: [
303
- /* @__PURE__ */ jsx("div", {
304
- className: "bg-background/95 sticky start-0 z-10 flex min-h-11 items-center backdrop-blur-sm",
349
+ children: [/* @__PURE__ */ jsxs("div", {
350
+ className: cn("bg-background sticky z-10", KANBAN_STICKY_TOP_CLASS),
351
+ "data-kanban-lane-row": "",
352
+ children: [/* @__PURE__ */ jsx("div", {
353
+ className: cn("bg-background sticky start-0 z-10 flex w-fit items-center", "h-9"),
354
+ "data-kanban-lane-identity": "",
305
355
  children: /* @__PURE__ */ jsxs("button", {
306
356
  "aria-expanded": !collapsed,
307
- className: "hover:bg-muted/60 flex min-h-11 items-center gap-2 rounded-lg px-2 text-start transition-[background-color]",
357
+ className: cn("hover:bg-muted/60 flex items-center gap-2 rounded-lg px-2 text-start transition-[background-color]", "h-9", KANBAN_CHROME_TOGGLE_COARSE_TARGET_CLASS),
308
358
  onClick: () => setLaneCollapsed(group, count, !collapsed),
309
359
  type: "button",
310
360
  children: [
@@ -323,23 +373,14 @@ const KanbanSubgroupBoard = ({ matrix, renderColumnHeader, renderLaneIdentity, r
323
373
  })
324
374
  ]
325
375
  })
326
- }),
327
- collapsed && renderRow({
328
- label: "Lane column counts",
329
- renderColumn: (column) => {
330
- const columnRows = cellFor(column)?.rows.length ?? 0;
331
- return /* @__PURE__ */ jsx("div", {
332
- className: "px-3",
333
- "data-kanban-lane-column-count": columnRows,
334
- children: /* @__PURE__ */ jsx("span", {
335
- className: "text-muted-foreground text-xs tabular-nums",
336
- children: formatCount(columnRows)
337
- })
338
- });
339
- },
376
+ }), renderRow({
377
+ label: "Lane column summaries",
378
+ renderColumn: (column) => laneColumnCell(group, column, cellFor(column)?.rows.length ?? 0),
340
379
  renderFoldedBand: (_band, span) => foldedCount(span, cells)
341
- }),
342
- !collapsed && renderRow({
380
+ })]
381
+ }), !collapsed && /* @__PURE__ */ jsx("div", {
382
+ style: laneCellsStickyTopStyle,
383
+ children: renderRow({
343
384
  className: "pb-1",
344
385
  renderColumn: (column, band) => {
345
386
  const cell = cellFor(column);
@@ -352,7 +393,7 @@ const KanbanSubgroupBoard = ({ matrix, renderColumnHeader, renderLaneIdentity, r
352
393
  },
353
394
  renderFoldedBand: (band, span) => foldedCell(band, span, cells, group.value)
354
395
  })
355
- ]
396
+ })]
356
397
  }, groupValueKey(group.value));
357
398
  }),
358
399
  footer
@@ -5,6 +5,6 @@ declare const CONTROL_SIZE: Readonly<{
5
5
  readonly lg: "lg";
6
6
  }>;
7
7
  type ControlSize = (typeof CONTROL_SIZE)[keyof typeof CONTROL_SIZE];
8
- declare const CONTROL_SIZES: readonly ("sm" | "default" | "lg")[];
8
+ declare const CONTROL_SIZES: readonly ("default" | "lg" | "sm")[];
9
9
  //#endregion
10
10
  export { CONTROL_SIZE, CONTROL_SIZES, type ControlSize };
@@ -1,5 +1,18 @@
1
1
  //#region src/lib/overlay-layer.d.ts
2
2
  declare const BOARD_DRAG_OVERLAY_Z_INDEX = 75;
3
+ /**
4
+ * The shell's own sticky chrome: its top bar, and anything else the shell pins
5
+ * around a view.
6
+ *
7
+ * Not part of the ladder below, which is for portalled surfaces: this one
8
+ * stays in flow, so it only ever competes with the sticky chrome a view paints
9
+ * inside the shell's scroller. A kanban board pins its header at z-20 and a
10
+ * lane's row at z-10, and when the shell's content column (not the board) is
11
+ * the scroll container the two tie and paint order decides which one wins.
12
+ * Stated one step above that, and far below every portalled surface here,
13
+ * which must still cover the shell.
14
+ */
15
+ declare const SHELL_CHROME_LAYER_CLASS_NAME = "z-30";
3
16
  declare const OVERLAY_LAYER_CLASS_NAMES: {
4
17
  /** Docked composer, suggestion chips, and other in-pane floating chrome. */
5
18
  readonly chrome: "z-[80]";
@@ -27,4 +40,4 @@ type OverlayLayer = keyof typeof OVERLAY_LAYER_CLASS_NAMES;
27
40
  */
28
41
  declare const OVERLAY_COLLISION_PADDING = 8;
29
42
  //#endregion
30
- export { BOARD_DRAG_OVERLAY_Z_INDEX, OVERLAY_COLLISION_PADDING, OVERLAY_LAYER_CLASS_NAMES, OverlayLayer };
43
+ export { BOARD_DRAG_OVERLAY_Z_INDEX, OVERLAY_COLLISION_PADDING, OVERLAY_LAYER_CLASS_NAMES, OverlayLayer, SHELL_CHROME_LAYER_CLASS_NAME };
@@ -1,5 +1,18 @@
1
1
  //#region src/lib/overlay-layer.ts
2
2
  const BOARD_DRAG_OVERLAY_Z_INDEX = 75;
3
+ /**
4
+ * The shell's own sticky chrome: its top bar, and anything else the shell pins
5
+ * around a view.
6
+ *
7
+ * Not part of the ladder below, which is for portalled surfaces: this one
8
+ * stays in flow, so it only ever competes with the sticky chrome a view paints
9
+ * inside the shell's scroller. A kanban board pins its header at z-20 and a
10
+ * lane's row at z-10, and when the shell's content column (not the board) is
11
+ * the scroll container the two tie and paint order decides which one wins.
12
+ * Stated one step above that, and far below every portalled surface here,
13
+ * which must still cover the shell.
14
+ */
15
+ const SHELL_CHROME_LAYER_CLASS_NAME = "z-30";
3
16
  const OVERLAY_LAYER_CLASS_NAMES = {
4
17
  /** Docked composer, suggestion chips, and other in-pane floating chrome. */
5
18
  chrome: "z-[80]",
@@ -26,4 +39,4 @@ const OVERLAY_LAYER_CLASS_NAMES = {
26
39
  */
27
40
  const OVERLAY_COLLISION_PADDING = 8;
28
41
  //#endregion
29
- export { BOARD_DRAG_OVERLAY_Z_INDEX, OVERLAY_COLLISION_PADDING, OVERLAY_LAYER_CLASS_NAMES };
42
+ export { BOARD_DRAG_OVERLAY_Z_INDEX, OVERLAY_COLLISION_PADDING, OVERLAY_LAYER_CLASS_NAMES, SHELL_CHROME_LAYER_CLASS_NAME };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stll/ui",
3
- "version": "0.23.1",
3
+ "version": "0.25.0",
4
4
  "description": "Stella's design system: bidi-aware React primitives built on Base UI, the dockable inspector pane, and the Tailwind v4 theme they are styled with.",
5
5
  "keywords": [
6
6
  "base-ui",
@@ -581,7 +581,7 @@
581
581
  "typecheck": "bun ../../packages/scripts/src/tsc-native.ts --noEmit",
582
582
  "lint": "cd ../.. && bun --bun oxlint -c oxlint.config.ts --report-unused-disable-directives-severity=error --deny-warnings --type-aware packages/ui",
583
583
  "lint:fix": "cd ../.. && bun --bun oxlint -c oxlint.config.ts --type-aware --fix packages/ui",
584
- "format": "oxfmt .",
584
+ "format": "bun ../../scripts/run-oxfmt.ts .",
585
585
  "prepack": "bun run build"
586
586
  },
587
587
  "dependencies": {
@@ -593,8 +593,8 @@
593
593
  "tailwind-merge": "^3.6.0"
594
594
  },
595
595
  "devDependencies": {
596
- "@atlaskit/pragmatic-drag-and-drop": "^3.0.0",
597
- "@atlaskit/pragmatic-drag-and-drop-auto-scroll": "^3.1.0",
596
+ "@atlaskit/pragmatic-drag-and-drop": "^3.1.0",
597
+ "@atlaskit/pragmatic-drag-and-drop-auto-scroll": "^3.2.0",
598
598
  "@base-ui/react": "1.7.0",
599
599
  "@dnd-kit/core": "^6.3.1",
600
600
  "@dnd-kit/sortable": "^10.0.0",
@@ -604,7 +604,7 @@
604
604
  "@tanstack/react-virtual": "^3.14.10",
605
605
  "@types/react": "^19.2.17",
606
606
  "@types/react-dom": "^19.2.3",
607
- "bun-types": "1.4.0",
607
+ "bun-types": "1.4.1",
608
608
  "react": "^19.2.8",
609
609
  "react-dom": "^19.2.8",
610
610
  "tailwindcss": "4.3.3",
@@ -612,8 +612,8 @@
612
612
  "vite": "8.2.1"
613
613
  },
614
614
  "peerDependencies": {
615
- "@atlaskit/pragmatic-drag-and-drop": "^3.0.0",
616
- "@atlaskit/pragmatic-drag-and-drop-auto-scroll": "^3.1.0",
615
+ "@atlaskit/pragmatic-drag-and-drop": "^3.1.0",
616
+ "@atlaskit/pragmatic-drag-and-drop-auto-scroll": "^3.2.0",
617
617
  "@base-ui/react": "^1.7.0",
618
618
  "@dnd-kit/core": "^6.3.1",
619
619
  "@dnd-kit/sortable": "^10.0.0",