@stll/ui 0.16.1 → 0.17.1
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 +25 -0
- package/dist/components/button-variants.d.ts +2 -2
- package/dist/index.d.ts +7 -5
- package/dist/index.js +6 -4
- package/dist/inspector/tabs.d.ts +1 -1
- package/dist/kanban/column-band-header.d.ts +32 -0
- package/dist/kanban/column-band-header.js +42 -0
- package/dist/kanban/column-bands.d.ts +41 -0
- package/dist/kanban/column-bands.js +52 -0
- package/dist/kanban/grouping.d.ts +13 -1
- package/dist/kanban/grouping.js +2 -1
- package/dist/kanban/index.d.ts +6 -4
- package/dist/kanban/index.js +6 -4
- package/dist/kanban/subgroup-board.d.ts +62 -4
- package/dist/kanban/subgroup-board.js +228 -39
- package/dist/lib/control-size.d.ts +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -211,6 +211,31 @@ Pointer and touch drops outside registered board targets cancel. Choose an
|
|
|
211
211
|
explicit `{ type: "handle" }` activation for the 44px handle, or `{ type:
|
|
212
212
|
"item" }` when the whole item is the intended activation surface.
|
|
213
213
|
|
|
214
|
+
### Column bands
|
|
215
|
+
|
|
216
|
+
Columns whose options carry a `band` (`KanbanColumnBand`, usually a status
|
|
217
|
+
property's option groups) render under one `KanbanColumnBandHeader` and fold
|
|
218
|
+
as a run. `resolveKanbanColumnBands` derives the bands from the column order
|
|
219
|
+
and rejects a band that resumes after another column, so a header can never
|
|
220
|
+
span two separate runs. A folded band takes one narrow slot in every row;
|
|
221
|
+
render a drop target in `renderCollapsedBandCell` to keep its hidden cells
|
|
222
|
+
reachable, and the slot peeks open while a pointer rests on it. Pass
|
|
223
|
+
`isBandCollapsed` and `onBandCollapsedChange` to persist the fold in a view.
|
|
224
|
+
|
|
225
|
+
```tsx
|
|
226
|
+
<KanbanSubgroupBoard
|
|
227
|
+
isBandCollapsed={(band) => collapsedBands.includes(band.id)}
|
|
228
|
+
matrix={matrix}
|
|
229
|
+
renderCell={renderCell}
|
|
230
|
+
renderCollapsedBandCell={({ band, cells, count }) => (
|
|
231
|
+
<FoldedDropTarget bandId={band.id} cells={cells} count={count} />
|
|
232
|
+
)}
|
|
233
|
+
renderColumnHeader={renderColumnHeader}
|
|
234
|
+
renderLaneIdentity={renderLaneIdentity}
|
|
235
|
+
onBandCollapsedChange={(band, collapsed) => saveFold(band.id, collapsed)}
|
|
236
|
+
/>
|
|
237
|
+
```
|
|
238
|
+
|
|
214
239
|
## Styles
|
|
215
240
|
|
|
216
241
|
No compiled CSS ships. The components carry Tailwind class names, so the
|
|
@@ -10,8 +10,8 @@
|
|
|
10
10
|
*/
|
|
11
11
|
declare const buttonAccessibleDisabledClass = "cursor-not-allowed opacity-64";
|
|
12
12
|
declare const buttonVariants: (props?: ({
|
|
13
|
-
size?: "
|
|
14
|
-
variant?: "link" | "default" | "destructive" | "
|
|
13
|
+
size?: "sm" | "default" | "lg" | "xs" | "icon" | "icon-lg" | "icon-sm" | "icon-xl" | "icon-xs" | "xl" | null | undefined;
|
|
14
|
+
variant?: "link" | "default" | "destructive" | "outline" | "destructive-outline" | "ghost" | "secondary" | null | undefined;
|
|
15
15
|
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
16
16
|
//#endregion
|
|
17
17
|
export { buttonAccessibleDisabledClass, buttonVariants };
|
package/dist/index.d.ts
CHANGED
|
@@ -70,15 +70,17 @@ import "./inspector/index.js";
|
|
|
70
70
|
import { KanbanCardFieldSelection, selectKanbanCardFieldIds } from "./kanban/card-properties.js";
|
|
71
71
|
import { KanbanCardShell, KanbanCardShellProps } from "./kanban/card-shell.js";
|
|
72
72
|
import { KanbanCellAction, KanbanCellActionProps } from "./kanban/cell-action.js";
|
|
73
|
+
import { KanbanColumnBandHeader, KanbanColumnBandHeaderProps } from "./kanban/column-band-header.js";
|
|
74
|
+
import { ColorVariants, OptionColor, emptyColor, optionColors, resolveOptionColor } from "./lib/option-color.js";
|
|
75
|
+
import { KanbanBuiltInGroup, KanbanColumnBand, KanbanGroup, KanbanGroupOption, KanbanGrouping, KanbanSchema, ResolveKanbanGroupingParams, getKanbanGroupingPropertyId, getKanbanGroups, isKanbanGroupingRenderable, resolveKanbanGroupOptions, resolveKanbanGrouping, selectKanbanRows } from "./kanban/grouping.js";
|
|
76
|
+
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";
|
|
77
|
+
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";
|
|
73
78
|
import { KanbanColumnHeader, KanbanColumnHeaderProps } from "./kanban/column-header.js";
|
|
74
79
|
import { KANBAN_BOARD_COLLISION_DETECTION, KanbanCellVirtualNavigation, KanbanSortableCellPosition, KanbanVirtualScrollRequest, kanbanKeyboardCoordinates } from "./kanban/sortable-interactions.logic.js";
|
|
75
80
|
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";
|
|
76
81
|
import { KANBAN_DIRECTIONS, KANBAN_HORIZONTAL_EDGES, KanbanDirection, KanbanHorizontalEdge, getKanbanHorizontalEdge } from "./kanban/sortable-edge.js";
|
|
77
82
|
import { KANBAN_BOARD_AUTO_SCROLL_SOURCES, RegisterKanbanBoardAutoScrollOptions, RegisterKanbanCardDragOptions, registerKanbanBoardAutoScroll, registerKanbanCardDrag } from "./kanban/drag-interactions.js";
|
|
78
|
-
import {
|
|
79
|
-
import { KanbanBuiltInGroup, KanbanGroup, KanbanGroupOption, KanbanGrouping, KanbanSchema, ResolveKanbanGroupingParams, getKanbanGroupingPropertyId, getKanbanGroups, isKanbanGroupingRenderable, resolveKanbanGroupOptions, resolveKanbanGrouping, selectKanbanRows } from "./kanban/grouping.js";
|
|
80
|
-
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";
|
|
81
|
-
import { KanbanSubgroupBoard, KanbanSubgroupBoardProps, KanbanSubgroupCellContext, KanbanSubgroupColumnHeaderContext, KanbanSubgroupLaneIdentityContext } from "./kanban/subgroup-board.js";
|
|
83
|
+
import { KANBAN_BAND_PEEK_DELAY_MS, KanbanSubgroupBandHeaderContext, KanbanSubgroupBoard, KanbanSubgroupBoardProps, KanbanSubgroupCellContext, KanbanSubgroupCollapsedBandCellContext, KanbanSubgroupColumnHeaderContext, KanbanSubgroupLaneIdentityContext } from "./kanban/subgroup-board.js";
|
|
82
84
|
import { KANBAN_VIRTUAL_CELL_PAGINATION, KanbanVirtualCell, KanbanVirtualCellPagination, KanbanVirtualCellProps, KanbanVirtualCellSortableContext } from "./kanban/virtual-cell.js";
|
|
83
85
|
import "./kanban/index.js";
|
|
84
86
|
import { getInitials } from "./lib/initials.js";
|
|
@@ -91,4 +93,4 @@ import { ReviewDiffDeletion, ReviewDiffInsertion, ReviewDiffSegment, ReviewDiffS
|
|
|
91
93
|
import { ReviewOutOfDateNotice, ReviewOutOfDateReason, ReviewOutOfDateTone } from "./review/review-out-of-date-notice.js";
|
|
92
94
|
import { ReviewStatusBadge, ReviewStatusSize, ReviewStatusTone, ReviewStatusVariant } from "./review/review-status-badge.js";
|
|
93
95
|
import { ReviewSeverityDot, ReviewSeverityLevel, ReviewStatusDot, reviewSeverityTone } from "./review/review-severity-dot.js";
|
|
94
|
-
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, InspectorHeader, InspectorHeaderText, InspectorProperty, InspectorPropertyLabel, InspectorPropertyList, InspectorPropertyValue, InspectorRail, InspectorRailCell, InspectorRailContent, InspectorRailFooter, InspectorRailIconButton, InspectorRailTab, InspectorSection, InspectorSectionTitle, InspectorTab, InspectorTabList, InspectorTabPanel, InspectorTabs, InspectorTitle, KANBAN_BOARD_AUTO_SCROLL_OPTIONS, KANBAN_BOARD_AUTO_SCROLL_SOURCES, KANBAN_BOARD_AXES, KANBAN_BOARD_COLLISION_DETECTION, KANBAN_DIRECTIONS, KANBAN_DRAG_OVERLAY_Z_INDEX, KANBAN_HORIZONTAL_EDGES, KANBAN_MOUSE_ACTIVATION_DISTANCE, KANBAN_SORTABLE_ACTIVATION_MODES, KANBAN_TOUCH_ACTIVATION_CONSTRAINT, KANBAN_VIRTUAL_CELL_PAGINATION, 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, 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, KanbanSubgroupBoard, type KanbanSubgroupBoardProps, type KanbanSubgroupCellContext, type KanbanSubgroupColumnHeaderContext, type KanbanSubgroupLaneIdentityContext, KanbanVirtualCell, type KanbanVirtualCellPagination, type KanbanVirtualCellProps, type KanbanVirtualCellSortableContext, type KanbanVirtualScrollRequest, Label, MenuPreviewLayout, 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, 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, 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, findTableColumn, getFirstWeekday, getInitials, getKanbanBoardColumnIdentity, getKanbanBoardLaneIdentity, getKanbanGroupingPropertyId, getKanbanGroups, getKanbanHorizontalEdge, getLocaleWeekInfo, getResourceCalendarPlacement, getWeekendDays, hideableColumnIds, isKanbanGroupingRenderable, isStructuredInputType, kanbanKeyboardCoordinates, layoutResourceCalendarEntries, nextCalendarDate, optionColors, orderKanbanCellsByColumns, parsePersistedPaneWidth, registerKanbanBoardAutoScroll, registerKanbanCardDrag, resolveDragWidth, resolveInspectorDockWidth, resolveInspectorPaneMaxWidth, resolveInspectorPaneWidth, resolveKanbanGroupOptions, resolveKanbanGrouping, resolveKeyboardWidth, resolveOptionColor, reviewDiffSegmentKeys, reviewSeverityTone, selectKanbanCardFieldIds, selectKanbanRows, shouldForceSidebarCollapsed, sortableColumnIds, stellaToast, tableColumnIds, tableColumnSizing, useComboboxFilter, useContentDir, useDestructiveActionConfirmation, useInspectorPaneWidth, useIsMobile, useKanbanDropTarget, useKanbanSortable, useKanbanSortableSensors, useLatest, useViewportWidth, visibleColumnIds };
|
|
96
|
+
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, 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_BOARD_AUTO_SCROLL_OPTIONS, KANBAN_BOARD_AUTO_SCROLL_SOURCES, KANBAN_BOARD_AXES, KANBAN_BOARD_COLLISION_DETECTION, 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_TOUCH_ACTIVATION_CONSTRAINT, KANBAN_VIRTUAL_CELL_PAGINATION, 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, 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_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, 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, 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, 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, useViewportWidth, visibleColumnIds };
|
package/dist/index.js
CHANGED
|
@@ -69,14 +69,16 @@ import { INSPECTOR_PANE_KEYBOARD_PAGE_STEP, INSPECTOR_PANE_KEYBOARD_STEP, parseP
|
|
|
69
69
|
import { selectKanbanCardFieldIds } from "./kanban/card-properties.js";
|
|
70
70
|
import { KanbanCardShell } from "./kanban/card-shell.js";
|
|
71
71
|
import { KanbanCellAction } from "./kanban/cell-action.js";
|
|
72
|
+
import { KanbanColumnBandHeader } from "./kanban/column-band-header.js";
|
|
73
|
+
import { getKanbanGroupingPropertyId, getKanbanGroups, isKanbanGroupingRenderable, resolveKanbanGroupOptions, resolveKanbanGrouping, selectKanbanRows } from "./kanban/grouping.js";
|
|
74
|
+
import { KANBAN_BOARD_AXES, buildKanbanBoardMatrix, createKanbanDropIntent, getKanbanBoardColumnIdentity, getKanbanBoardLaneIdentity, orderKanbanCellsByColumns } from "./kanban/matrix.js";
|
|
75
|
+
import { KANBAN_COLLAPSED_BAND_WIDTH_CLASS, KANBAN_COLLAPSED_BAND_WIDTH_PX, KANBAN_COLUMN_GAP_PX, KANBAN_COLUMN_WIDTH_CLASS, KANBAN_COLUMN_WIDTH_PX, hasKanbanColumnBands, resolveKanbanColumnBands } from "./kanban/column-bands.js";
|
|
72
76
|
import { KanbanColumnHeader } from "./kanban/column-header.js";
|
|
73
77
|
import { KANBAN_BOARD_COLLISION_DETECTION, kanbanKeyboardCoordinates } from "./kanban/sortable-interactions.logic.js";
|
|
74
78
|
import { KANBAN_BOARD_AUTO_SCROLL_OPTIONS, KANBAN_DRAG_OVERLAY_Z_INDEX, KANBAN_MOUSE_ACTIVATION_DISTANCE, KANBAN_SORTABLE_ACTIVATION_MODES, KANBAN_TOUCH_ACTIVATION_CONSTRAINT, KanbanCardDragSurface, KanbanDragHandle, KanbanSortableBoard, KanbanSortableColumns, KanbanSortableList, useKanbanDropTarget, useKanbanSortable, useKanbanSortableSensors } from "./kanban/sortable-interactions.js";
|
|
75
79
|
import { KANBAN_DIRECTIONS, KANBAN_HORIZONTAL_EDGES, getKanbanHorizontalEdge } from "./kanban/sortable-edge.js";
|
|
76
80
|
import { KANBAN_BOARD_AUTO_SCROLL_SOURCES, registerKanbanBoardAutoScroll, registerKanbanCardDrag } from "./kanban/drag-interactions.js";
|
|
77
|
-
import {
|
|
78
|
-
import { KANBAN_BOARD_AXES, buildKanbanBoardMatrix, createKanbanDropIntent, getKanbanBoardColumnIdentity, getKanbanBoardLaneIdentity, orderKanbanCellsByColumns } from "./kanban/matrix.js";
|
|
79
|
-
import { KanbanSubgroupBoard } from "./kanban/subgroup-board.js";
|
|
81
|
+
import { KANBAN_BAND_PEEK_DELAY_MS, KanbanSubgroupBoard } from "./kanban/subgroup-board.js";
|
|
80
82
|
import { KANBAN_VIRTUAL_CELL_PAGINATION, KanbanVirtualCell } from "./kanban/virtual-cell.js";
|
|
81
83
|
import { getInitials } from "./lib/initials.js";
|
|
82
84
|
import { emptyColor, optionColors, resolveOptionColor } from "./lib/option-color.js";
|
|
@@ -87,4 +89,4 @@ import { ReviewDiffDeletion, ReviewDiffInsertion, ReviewDiffText, TRACKED_DELETI
|
|
|
87
89
|
import { ReviewOutOfDateNotice } from "./review/review-out-of-date-notice.js";
|
|
88
90
|
import { ReviewSeverityDot, ReviewStatusDot, reviewSeverityTone } from "./review/review-severity-dot.js";
|
|
89
91
|
import { ReviewStatusBadge } from "./review/review-status-badge.js";
|
|
90
|
-
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, InspectorHeader, InspectorHeaderText, InspectorProperty, InspectorPropertyLabel, InspectorPropertyList, InspectorPropertyValue, InspectorRail, InspectorRailCell, InspectorRailContent, InspectorRailFooter, InspectorRailIconButton, InspectorRailTab, InspectorSection, InspectorSectionTitle, InspectorTab, InspectorTabList, InspectorTabPanel, InspectorTabs, InspectorTitle, KANBAN_BOARD_AUTO_SCROLL_OPTIONS, KANBAN_BOARD_AUTO_SCROLL_SOURCES, KANBAN_BOARD_AXES, KANBAN_BOARD_COLLISION_DETECTION, KANBAN_DIRECTIONS, KANBAN_DRAG_OVERLAY_Z_INDEX, KANBAN_HORIZONTAL_EDGES, KANBAN_MOUSE_ACTIVATION_DISTANCE, KANBAN_SORTABLE_ACTIVATION_MODES, KANBAN_TOUCH_ACTIVATION_CONSTRAINT, KANBAN_VIRTUAL_CELL_PAGINATION, KanbanCardDragSurface, KanbanCardShell, KanbanCellAction, KanbanColumnHeader, KanbanDragHandle, KanbanSortableBoard, KanbanSortableColumns, KanbanSortableList, KanbanSubgroupBoard, KanbanVirtualCell, Label, MenuPreviewLayout, 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, 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, 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, findTableColumn, getFirstWeekday, getInitials, getKanbanBoardColumnIdentity, getKanbanBoardLaneIdentity, getKanbanGroupingPropertyId, getKanbanGroups, getKanbanHorizontalEdge, getLocaleWeekInfo, getResourceCalendarPlacement, getWeekendDays, hideableColumnIds, isKanbanGroupingRenderable, isStructuredInputType, kanbanKeyboardCoordinates, layoutResourceCalendarEntries, nextCalendarDate, optionColors, orderKanbanCellsByColumns, parsePersistedPaneWidth, registerKanbanBoardAutoScroll, registerKanbanCardDrag, resolveDragWidth, resolveInspectorDockWidth, resolveInspectorPaneMaxWidth, resolveInspectorPaneWidth, resolveKanbanGroupOptions, resolveKanbanGrouping, resolveKeyboardWidth, resolveOptionColor, reviewDiffSegmentKeys, reviewSeverityTone, selectKanbanCardFieldIds, selectKanbanRows, shouldForceSidebarCollapsed, sortableColumnIds, stellaToast, tableColumnIds, tableColumnSizing, useComboboxFilter, useContentDir, useDestructiveActionConfirmation, useInspectorPaneWidth, useIsMobile, useKanbanDropTarget, useKanbanSortable, useKanbanSortableSensors, useLatest, useViewportWidth, visibleColumnIds };
|
|
92
|
+
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, 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_BOARD_AUTO_SCROLL_OPTIONS, KANBAN_BOARD_AUTO_SCROLL_SOURCES, KANBAN_BOARD_AXES, KANBAN_BOARD_COLLISION_DETECTION, 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_TOUCH_ACTIVATION_CONSTRAINT, KANBAN_VIRTUAL_CELL_PAGINATION, KanbanCardDragSurface, KanbanCardShell, KanbanCellAction, KanbanColumnBandHeader, KanbanColumnHeader, KanbanDragHandle, KanbanSortableBoard, KanbanSortableColumns, KanbanSortableList, KanbanSubgroupBoard, KanbanVirtualCell, Label, MenuPreviewLayout, 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, 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, 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, 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, useViewportWidth, visibleColumnIds };
|
package/dist/inspector/tabs.d.ts
CHANGED
|
@@ -8,7 +8,7 @@ import { Tabs } from "@base-ui/react/tabs";
|
|
|
8
8
|
*/
|
|
9
9
|
declare const InspectorTabs: ({ className, ...props }: Omit<Tabs.Root.Props, "orientation">) => React$1.JSX.Element;
|
|
10
10
|
declare const INSPECTOR_RAIL_MEDIA_QUERY: "(min-width: 48rem)";
|
|
11
|
-
declare const resolveInspectorTabOrientation: (isRailLayout: boolean) => "
|
|
11
|
+
declare const resolveInspectorTabOrientation: (isRailLayout: boolean) => "vertical" | "horizontal";
|
|
12
12
|
declare const InspectorTabList: ({ className, ...props }: Tabs.List.Props) => React$1.JSX.Element;
|
|
13
13
|
declare const InspectorTab: ({ className, ...props }: Tabs.Tab.Props) => React$1.JSX.Element;
|
|
14
14
|
declare const InspectorTabPanel: ({ className, ...props }: Tabs.Panel.Props) => React$1.JSX.Element;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { ReactNode } from "react";
|
|
2
|
+
//#region src/kanban/column-band-header.d.ts
|
|
3
|
+
type KanbanColumnBandHeaderProps = {
|
|
4
|
+
/** The band name, or the control that has taken its place. */
|
|
5
|
+
title: ReactNode;
|
|
6
|
+
/** Colour swatch for the band. */
|
|
7
|
+
swatch?: ReactNode;
|
|
8
|
+
/** Short text after the name, such as the band's card count. */
|
|
9
|
+
meta?: ReactNode;
|
|
10
|
+
/** The band's persisted state; drives the toggle, its icon, and its label. */
|
|
11
|
+
collapsed: boolean;
|
|
12
|
+
/**
|
|
13
|
+
* Render only the toggle, for the narrow slot of a folded band. Defaults to
|
|
14
|
+
* `collapsed`; a board that peeks a collapsed band open passes `false` so
|
|
15
|
+
* the caption shows the name while the toggle still offers to pin it open.
|
|
16
|
+
*/
|
|
17
|
+
compact?: boolean | undefined;
|
|
18
|
+
/** Accessible name for the toggle, such as "Collapse To do". */
|
|
19
|
+
toggleLabel: string;
|
|
20
|
+
onCollapsedChange: (collapsed: boolean) => void;
|
|
21
|
+
/** Band menu or other controls, after the toggle. */
|
|
22
|
+
actions?: ReactNode;
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* The band line above a run of columns: one 28px row of toggle, swatch, name,
|
|
26
|
+
* and count, so a band costs the board a caption's height and nothing more.
|
|
27
|
+
* Folded, only the toggle remains in this line; the band's name moves down
|
|
28
|
+
* into the narrow column body, where the height is already there.
|
|
29
|
+
*/
|
|
30
|
+
declare const KanbanColumnBandHeader: ({ title, swatch, meta, collapsed, compact, toggleLabel, onCollapsedChange, actions }: KanbanColumnBandHeaderProps) => import("react").JSX.Element;
|
|
31
|
+
//#endregion
|
|
32
|
+
export { KanbanColumnBandHeader, KanbanColumnBandHeaderProps };
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { cn } from "../lib/utils.js";
|
|
2
|
+
import { DirectionalIcon } from "../components/directional-icon.js";
|
|
3
|
+
import { ChevronDownIcon } from "lucide-react";
|
|
4
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
+
//#region src/kanban/column-band-header.tsx
|
|
6
|
+
/**
|
|
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.
|
|
9
|
+
* Folded, only the toggle remains in this line; the band's name moves down
|
|
10
|
+
* into the narrow column body, where the height is already there.
|
|
11
|
+
*/
|
|
12
|
+
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"),
|
|
14
|
+
"data-collapsed": collapsed ? "" : void 0,
|
|
15
|
+
"data-compact": compact ? "" : void 0,
|
|
16
|
+
"data-slot": "kanban-column-band-header",
|
|
17
|
+
children: [/* @__PURE__ */ jsx("button", {
|
|
18
|
+
"aria-expanded": !collapsed,
|
|
19
|
+
"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]",
|
|
21
|
+
onClick: () => onCollapsedChange(!collapsed),
|
|
22
|
+
title: toggleLabel,
|
|
23
|
+
type: "button",
|
|
24
|
+
children: /* @__PURE__ */ jsx(DirectionalIcon, {
|
|
25
|
+
className: cn("size-3.5 transition-transform", collapsed && "-rotate-90"),
|
|
26
|
+
flip: collapsed,
|
|
27
|
+
icon: ChevronDownIcon
|
|
28
|
+
})
|
|
29
|
+
}), compact ? null : /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
30
|
+
swatch,
|
|
31
|
+
/* @__PURE__ */ jsxs("span", {
|
|
32
|
+
className: "flex min-w-0 flex-1 items-baseline gap-1.5 truncate text-xs font-medium",
|
|
33
|
+
children: [title, meta !== void 0 && /* @__PURE__ */ jsx("span", {
|
|
34
|
+
className: "text-muted-foreground font-normal tabular-nums",
|
|
35
|
+
children: meta
|
|
36
|
+
})]
|
|
37
|
+
}),
|
|
38
|
+
actions
|
|
39
|
+
] })]
|
|
40
|
+
});
|
|
41
|
+
//#endregion
|
|
42
|
+
export { KanbanColumnBandHeader };
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { KanbanColumnBand } from "./grouping.js";
|
|
2
|
+
import { KanbanBoardColumn } from "./matrix.js";
|
|
3
|
+
//#region src/kanban/column-bands.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Column bands: named runs of adjacent columns the board shows under one
|
|
6
|
+
* header and can collapse as a unit.
|
|
7
|
+
*
|
|
8
|
+
* A band is presentation over the column order, never a second axis: cards
|
|
9
|
+
* keep their column, and the matrix stays the placement authority. The board
|
|
10
|
+
* only needs to know which adjacent columns share a header, which is what
|
|
11
|
+
* `resolveKanbanColumnBands` derives from the columns' `band` metadata.
|
|
12
|
+
*/
|
|
13
|
+
/** Every board column takes this inline size; a collapsed band takes one lane. */
|
|
14
|
+
declare const KANBAN_COLUMN_WIDTH_CLASS = "w-[300px] shrink-0";
|
|
15
|
+
declare const KANBAN_COLUMN_WIDTH_PX = 300;
|
|
16
|
+
/** The `gap-3` between columns, so a band header can span its columns. */
|
|
17
|
+
declare const KANBAN_COLUMN_GAP_PX = 12;
|
|
18
|
+
/** A collapsed band folds its columns into one narrow lane. */
|
|
19
|
+
declare const KANBAN_COLLAPSED_BAND_WIDTH_CLASS = "w-12 shrink-0";
|
|
20
|
+
declare const KANBAN_COLLAPSED_BAND_WIDTH_PX = 48;
|
|
21
|
+
/**
|
|
22
|
+
* A run of adjacent columns under one header. `band` is `null` for a column
|
|
23
|
+
* that belongs to no band, which renders as a run of one without a header.
|
|
24
|
+
*/
|
|
25
|
+
type KanbanColumnBandSpan = {
|
|
26
|
+
band: KanbanColumnBand | null;
|
|
27
|
+
columns: KanbanBoardColumn[];
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Group the presented columns into bands, in column order.
|
|
31
|
+
*
|
|
32
|
+
* Bands must be contiguous: the same band id appearing again after a column
|
|
33
|
+
* of another band (or of none) is a programming error in the caller's schema,
|
|
34
|
+
* not a state to render, because a header that spans two separate runs has no
|
|
35
|
+
* meaning. The check fails loudly instead of silently drawing a second header.
|
|
36
|
+
*/
|
|
37
|
+
declare const resolveKanbanColumnBands: (columns: readonly KanbanBoardColumn[]) => KanbanColumnBandSpan[];
|
|
38
|
+
/** Whether any presented column carries band metadata. */
|
|
39
|
+
declare const hasKanbanColumnBands: (columns: readonly KanbanBoardColumn[]) => boolean;
|
|
40
|
+
//#endregion
|
|
41
|
+
export { 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 };
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { getKanbanBoardColumnIdentity } from "./matrix.js";
|
|
2
|
+
import { panic } from "better-result";
|
|
3
|
+
//#region src/kanban/column-bands.ts
|
|
4
|
+
/**
|
|
5
|
+
* Column bands: named runs of adjacent columns the board shows under one
|
|
6
|
+
* header and can collapse as a unit.
|
|
7
|
+
*
|
|
8
|
+
* A band is presentation over the column order, never a second axis: cards
|
|
9
|
+
* keep their column, and the matrix stays the placement authority. The board
|
|
10
|
+
* only needs to know which adjacent columns share a header, which is what
|
|
11
|
+
* `resolveKanbanColumnBands` derives from the columns' `band` metadata.
|
|
12
|
+
*/
|
|
13
|
+
/** Every board column takes this inline size; a collapsed band takes one lane. */
|
|
14
|
+
const KANBAN_COLUMN_WIDTH_CLASS = "w-[300px] shrink-0";
|
|
15
|
+
const KANBAN_COLUMN_WIDTH_PX = 300;
|
|
16
|
+
/** The `gap-3` between columns, so a band header can span its columns. */
|
|
17
|
+
const KANBAN_COLUMN_GAP_PX = 12;
|
|
18
|
+
/** A collapsed band folds its columns into one narrow lane. */
|
|
19
|
+
const KANBAN_COLLAPSED_BAND_WIDTH_CLASS = "w-12 shrink-0";
|
|
20
|
+
const KANBAN_COLLAPSED_BAND_WIDTH_PX = 48;
|
|
21
|
+
const bandOf = (column) => column.type === "group" ? column.group.band ?? null : null;
|
|
22
|
+
/**
|
|
23
|
+
* Group the presented columns into bands, in column order.
|
|
24
|
+
*
|
|
25
|
+
* Bands must be contiguous: the same band id appearing again after a column
|
|
26
|
+
* of another band (or of none) is a programming error in the caller's schema,
|
|
27
|
+
* not a state to render, because a header that spans two separate runs has no
|
|
28
|
+
* meaning. The check fails loudly instead of silently drawing a second header.
|
|
29
|
+
*/
|
|
30
|
+
const resolveKanbanColumnBands = (columns) => {
|
|
31
|
+
const spans = [];
|
|
32
|
+
const closedBandIds = /* @__PURE__ */ new Set();
|
|
33
|
+
for (const column of columns) {
|
|
34
|
+
const band = bandOf(column);
|
|
35
|
+
const last = spans.at(-1);
|
|
36
|
+
if (band !== null && last?.band?.id === band.id) {
|
|
37
|
+
last.columns.push(column);
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
if (last?.band !== null && last?.band !== void 0) closedBandIds.add(last.band.id);
|
|
41
|
+
if (band !== null && closedBandIds.has(band.id)) return panic(`Kanban column band "${band.id}" is not contiguous: it resumes at column ${getKanbanBoardColumnIdentity(column)}`);
|
|
42
|
+
spans.push({
|
|
43
|
+
band,
|
|
44
|
+
columns: [column]
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
return spans;
|
|
48
|
+
};
|
|
49
|
+
/** Whether any presented column carries band metadata. */
|
|
50
|
+
const hasKanbanColumnBands = (columns) => columns.some((column) => bandOf(column) !== null);
|
|
51
|
+
//#endregion
|
|
52
|
+
export { KANBAN_COLLAPSED_BAND_WIDTH_CLASS, KANBAN_COLLAPSED_BAND_WIDTH_PX, KANBAN_COLUMN_GAP_PX, KANBAN_COLUMN_WIDTH_CLASS, KANBAN_COLUMN_WIDTH_PX, hasKanbanColumnBands, resolveKanbanColumnBands };
|
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
import { OptionColor } from "../lib/option-color.js";
|
|
2
2
|
//#region src/kanban/grouping.d.ts
|
|
3
|
+
/**
|
|
4
|
+
* The band a column belongs to: a named run of adjacent columns the board
|
|
5
|
+
* shows under one header and can collapse as a unit. A status property's
|
|
6
|
+
* option groups ("To do", "In progress", "Done") are the usual source.
|
|
7
|
+
*/
|
|
8
|
+
type KanbanColumnBand = {
|
|
9
|
+
id: string;
|
|
10
|
+
label: string;
|
|
11
|
+
optionColor?: OptionColor | undefined;
|
|
12
|
+
};
|
|
3
13
|
/** One column, before the uncategorized bucket is appended. */
|
|
4
14
|
type KanbanGroupOption = {
|
|
5
15
|
value: string;
|
|
@@ -8,6 +18,7 @@ type KanbanGroupOption = {
|
|
|
8
18
|
color?: string | undefined;
|
|
9
19
|
colorBg?: string | undefined;
|
|
10
20
|
optionColor?: OptionColor | undefined;
|
|
21
|
+
band?: KanbanColumnBand | undefined;
|
|
11
22
|
};
|
|
12
23
|
/** A column, including the uncategorized bucket (`value: null`). */
|
|
13
24
|
type KanbanGroup = {
|
|
@@ -17,6 +28,7 @@ type KanbanGroup = {
|
|
|
17
28
|
color?: string | undefined;
|
|
18
29
|
colorBg?: string | undefined;
|
|
19
30
|
optionColor?: OptionColor | undefined;
|
|
31
|
+
band?: KanbanColumnBand | undefined;
|
|
20
32
|
};
|
|
21
33
|
/**
|
|
22
34
|
* A column source that is not a schema property, addressed by a reserved id.
|
|
@@ -83,4 +95,4 @@ declare const resolveKanbanGroupOptions: <TRow, TProperty, TGroupId extends stri
|
|
|
83
95
|
/** Append the uncategorized bucket (null value) after the options. */
|
|
84
96
|
declare const getKanbanGroups: (options: readonly KanbanGroupOption[], uncategorizedLabel: string) => KanbanGroup[];
|
|
85
97
|
//#endregion
|
|
86
|
-
export { KanbanBuiltInGroup, KanbanGroup, KanbanGroupOption, KanbanGrouping, KanbanSchema, ResolveKanbanGroupingParams, getKanbanGroupingPropertyId, getKanbanGroups, isKanbanGroupingRenderable, resolveKanbanGroupOptions, resolveKanbanGrouping, selectKanbanRows };
|
|
98
|
+
export { KanbanBuiltInGroup, KanbanColumnBand, KanbanGroup, KanbanGroupOption, KanbanGrouping, KanbanSchema, ResolveKanbanGroupingParams, getKanbanGroupingPropertyId, getKanbanGroups, isKanbanGroupingRenderable, resolveKanbanGroupOptions, resolveKanbanGrouping, selectKanbanRows };
|
package/dist/kanban/grouping.js
CHANGED
|
@@ -65,7 +65,8 @@ const getKanbanGroups = (options, uncategorizedLabel) => {
|
|
|
65
65
|
image: option.image,
|
|
66
66
|
color: option.color,
|
|
67
67
|
colorBg: option.colorBg,
|
|
68
|
-
optionColor: option.optionColor
|
|
68
|
+
optionColor: option.optionColor,
|
|
69
|
+
band: option.band
|
|
69
70
|
}));
|
|
70
71
|
result.push({
|
|
71
72
|
value: null,
|
package/dist/kanban/index.d.ts
CHANGED
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
import { KanbanCardFieldSelection, selectKanbanCardFieldIds } from "./card-properties.js";
|
|
2
2
|
import { KanbanCardShell, KanbanCardShellProps } from "./card-shell.js";
|
|
3
3
|
import { KanbanCellAction, KanbanCellActionProps } from "./cell-action.js";
|
|
4
|
+
import { KanbanColumnBandHeader, KanbanColumnBandHeaderProps } from "./column-band-header.js";
|
|
5
|
+
import { KanbanBuiltInGroup, KanbanColumnBand, KanbanGroup, KanbanGroupOption, KanbanGrouping, KanbanSchema, ResolveKanbanGroupingParams, getKanbanGroupingPropertyId, getKanbanGroups, isKanbanGroupingRenderable, resolveKanbanGroupOptions, resolveKanbanGrouping, selectKanbanRows } from "./grouping.js";
|
|
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
|
+
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";
|
|
4
8
|
import { KanbanColumnHeader, KanbanColumnHeaderProps } from "./column-header.js";
|
|
5
9
|
import { KANBAN_BOARD_COLLISION_DETECTION, KanbanCellVirtualNavigation, KanbanSortableCellPosition, KanbanVirtualScrollRequest, kanbanKeyboardCoordinates } from "./sortable-interactions.logic.js";
|
|
6
10
|
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";
|
|
7
11
|
import { KANBAN_DIRECTIONS, KANBAN_HORIZONTAL_EDGES, KanbanDirection, KanbanHorizontalEdge, getKanbanHorizontalEdge } from "./sortable-edge.js";
|
|
8
12
|
import { KANBAN_BOARD_AUTO_SCROLL_SOURCES, RegisterKanbanBoardAutoScrollOptions, RegisterKanbanCardDragOptions, registerKanbanBoardAutoScroll, registerKanbanCardDrag } from "./drag-interactions.js";
|
|
9
|
-
import {
|
|
10
|
-
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";
|
|
11
|
-
import { KanbanSubgroupBoard, KanbanSubgroupBoardProps, KanbanSubgroupCellContext, KanbanSubgroupColumnHeaderContext, KanbanSubgroupLaneIdentityContext } from "./subgroup-board.js";
|
|
13
|
+
import { KANBAN_BAND_PEEK_DELAY_MS, KanbanSubgroupBandHeaderContext, KanbanSubgroupBoard, KanbanSubgroupBoardProps, KanbanSubgroupCellContext, KanbanSubgroupCollapsedBandCellContext, KanbanSubgroupColumnHeaderContext, KanbanSubgroupLaneIdentityContext } from "./subgroup-board.js";
|
|
12
14
|
import { KANBAN_VIRTUAL_CELL_PAGINATION, KanbanVirtualCell, KanbanVirtualCellPagination, KanbanVirtualCellProps, KanbanVirtualCellSortableContext } from "./virtual-cell.js";
|
|
13
|
-
export { type BuildKanbanBoardMatrixParams, type CreateKanbanDropIntentParams, KANBAN_BOARD_AUTO_SCROLL_OPTIONS, KANBAN_BOARD_AUTO_SCROLL_SOURCES, KANBAN_BOARD_AXES, KANBAN_BOARD_COLLISION_DETECTION, KANBAN_DIRECTIONS, KANBAN_DRAG_OVERLAY_Z_INDEX, KANBAN_HORIZONTAL_EDGES, KANBAN_MOUSE_ACTIVATION_DISTANCE, KANBAN_SORTABLE_ACTIVATION_MODES, KANBAN_TOUCH_ACTIVATION_CONSTRAINT, KANBAN_VIRTUAL_CELL_PAGINATION, 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, 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, KanbanSubgroupBoard, type KanbanSubgroupBoardProps, type KanbanSubgroupCellContext, 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, isKanbanGroupingRenderable, kanbanKeyboardCoordinates, orderKanbanCellsByColumns, registerKanbanBoardAutoScroll, registerKanbanCardDrag, resolveKanbanGroupOptions, resolveKanbanGrouping, selectKanbanCardFieldIds, selectKanbanRows, useKanbanDropTarget, useKanbanSortable, useKanbanSortableSensors };
|
|
15
|
+
export { type BuildKanbanBoardMatrixParams, type CreateKanbanDropIntentParams, KANBAN_BAND_PEEK_DELAY_MS, KANBAN_BOARD_AUTO_SCROLL_OPTIONS, KANBAN_BOARD_AUTO_SCROLL_SOURCES, KANBAN_BOARD_AXES, KANBAN_BOARD_COLLISION_DETECTION, 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_TOUCH_ACTIVATION_CONSTRAINT, KANBAN_VIRTUAL_CELL_PAGINATION, 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, 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 };
|
package/dist/kanban/index.js
CHANGED
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
import { selectKanbanCardFieldIds } from "./card-properties.js";
|
|
2
2
|
import { KanbanCardShell } from "./card-shell.js";
|
|
3
3
|
import { KanbanCellAction } from "./cell-action.js";
|
|
4
|
+
import { KanbanColumnBandHeader } from "./column-band-header.js";
|
|
5
|
+
import { getKanbanGroupingPropertyId, getKanbanGroups, isKanbanGroupingRenderable, resolveKanbanGroupOptions, resolveKanbanGrouping, selectKanbanRows } from "./grouping.js";
|
|
6
|
+
import { KANBAN_BOARD_AXES, buildKanbanBoardMatrix, createKanbanDropIntent, getKanbanBoardColumnIdentity, getKanbanBoardLaneIdentity, orderKanbanCellsByColumns } from "./matrix.js";
|
|
7
|
+
import { KANBAN_COLLAPSED_BAND_WIDTH_CLASS, KANBAN_COLLAPSED_BAND_WIDTH_PX, KANBAN_COLUMN_GAP_PX, KANBAN_COLUMN_WIDTH_CLASS, KANBAN_COLUMN_WIDTH_PX, hasKanbanColumnBands, resolveKanbanColumnBands } from "./column-bands.js";
|
|
4
8
|
import { KanbanColumnHeader } from "./column-header.js";
|
|
5
9
|
import { KANBAN_BOARD_COLLISION_DETECTION, kanbanKeyboardCoordinates } from "./sortable-interactions.logic.js";
|
|
6
10
|
import { KANBAN_BOARD_AUTO_SCROLL_OPTIONS, KANBAN_DRAG_OVERLAY_Z_INDEX, KANBAN_MOUSE_ACTIVATION_DISTANCE, KANBAN_SORTABLE_ACTIVATION_MODES, KANBAN_TOUCH_ACTIVATION_CONSTRAINT, KanbanCardDragSurface, KanbanDragHandle, KanbanSortableBoard, KanbanSortableColumns, KanbanSortableList, useKanbanDropTarget, useKanbanSortable, useKanbanSortableSensors } from "./sortable-interactions.js";
|
|
7
11
|
import { KANBAN_DIRECTIONS, KANBAN_HORIZONTAL_EDGES, getKanbanHorizontalEdge } from "./sortable-edge.js";
|
|
8
12
|
import { KANBAN_BOARD_AUTO_SCROLL_SOURCES, registerKanbanBoardAutoScroll, registerKanbanCardDrag } from "./drag-interactions.js";
|
|
9
|
-
import {
|
|
10
|
-
import { KANBAN_BOARD_AXES, buildKanbanBoardMatrix, createKanbanDropIntent, getKanbanBoardColumnIdentity, getKanbanBoardLaneIdentity, orderKanbanCellsByColumns } from "./matrix.js";
|
|
11
|
-
import { KanbanSubgroupBoard } from "./subgroup-board.js";
|
|
13
|
+
import { KANBAN_BAND_PEEK_DELAY_MS, KanbanSubgroupBoard } from "./subgroup-board.js";
|
|
12
14
|
import { KANBAN_VIRTUAL_CELL_PAGINATION, KanbanVirtualCell } from "./virtual-cell.js";
|
|
13
|
-
export { KANBAN_BOARD_AUTO_SCROLL_OPTIONS, KANBAN_BOARD_AUTO_SCROLL_SOURCES, KANBAN_BOARD_AXES, KANBAN_BOARD_COLLISION_DETECTION, KANBAN_DIRECTIONS, KANBAN_DRAG_OVERLAY_Z_INDEX, KANBAN_HORIZONTAL_EDGES, KANBAN_MOUSE_ACTIVATION_DISTANCE, KANBAN_SORTABLE_ACTIVATION_MODES, KANBAN_TOUCH_ACTIVATION_CONSTRAINT, KANBAN_VIRTUAL_CELL_PAGINATION, KanbanCardDragSurface, KanbanCardShell, KanbanCellAction, KanbanColumnHeader, KanbanDragHandle, KanbanSortableBoard, KanbanSortableColumns, KanbanSortableList, KanbanSubgroupBoard, KanbanVirtualCell, buildKanbanBoardMatrix, createKanbanDropIntent, getKanbanBoardColumnIdentity, getKanbanBoardLaneIdentity, getKanbanGroupingPropertyId, getKanbanGroups, getKanbanHorizontalEdge, isKanbanGroupingRenderable, kanbanKeyboardCoordinates, orderKanbanCellsByColumns, registerKanbanBoardAutoScroll, registerKanbanCardDrag, resolveKanbanGroupOptions, resolveKanbanGrouping, selectKanbanCardFieldIds, selectKanbanRows, useKanbanDropTarget, useKanbanSortable, useKanbanSortableSensors };
|
|
15
|
+
export { KANBAN_BAND_PEEK_DELAY_MS, KANBAN_BOARD_AUTO_SCROLL_OPTIONS, KANBAN_BOARD_AUTO_SCROLL_SOURCES, KANBAN_BOARD_AXES, KANBAN_BOARD_COLLISION_DETECTION, 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_TOUCH_ACTIVATION_CONSTRAINT, KANBAN_VIRTUAL_CELL_PAGINATION, KanbanCardDragSurface, KanbanCardShell, KanbanCellAction, 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 };
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
import { KanbanGroup } from "./grouping.js";
|
|
1
|
+
import { KanbanColumnBand, KanbanGroup } from "./grouping.js";
|
|
2
2
|
import { KanbanBoardCell, KanbanBoardColumn, KanbanBoardMatrix } from "./matrix.js";
|
|
3
3
|
import { ReactNode } from "react";
|
|
4
4
|
//#region src/kanban/subgroup-board.d.ts
|
|
5
|
+
/** How long a pointer rests on a collapsed band before it peeks open. */
|
|
6
|
+
declare const KANBAN_BAND_PEEK_DELAY_MS = 400;
|
|
5
7
|
type KanbanSubgroupColumnHeaderContext = {
|
|
6
8
|
column: KanbanBoardColumn;
|
|
7
9
|
count: number;
|
|
@@ -16,6 +18,32 @@ type KanbanSubgroupCellContext<TRow> = {
|
|
|
16
18
|
count: number;
|
|
17
19
|
laneValue: string | null;
|
|
18
20
|
};
|
|
21
|
+
type KanbanSubgroupBandHeaderContext = {
|
|
22
|
+
band: KanbanColumnBand;
|
|
23
|
+
columns: KanbanBoardColumn[];
|
|
24
|
+
/** Rows across the band's columns, every lane included. */
|
|
25
|
+
count: number;
|
|
26
|
+
/** The persisted state the toggle reports and flips. */
|
|
27
|
+
collapsed: boolean;
|
|
28
|
+
/**
|
|
29
|
+
* Whether the band renders as one narrow slot right now. False while a
|
|
30
|
+
* collapsed band peeks open under the pointer, so a caption can show its
|
|
31
|
+
* name and offer to pin the band open.
|
|
32
|
+
*/
|
|
33
|
+
folded: boolean;
|
|
34
|
+
onCollapsedChange: (collapsed: boolean) => void;
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* One lane's slot for a collapsed band: the cells it hides, so a host can
|
|
38
|
+
* register the slot as a drop target that lands in the band's first column
|
|
39
|
+
* (or asks which), and the count it stands in for.
|
|
40
|
+
*/
|
|
41
|
+
type KanbanSubgroupCollapsedBandCellContext<TRow> = {
|
|
42
|
+
band: KanbanColumnBand;
|
|
43
|
+
cells: KanbanBoardCell<TRow>[];
|
|
44
|
+
count: number;
|
|
45
|
+
laneValue: string | null;
|
|
46
|
+
};
|
|
19
47
|
type KanbanSubgroupCollapseControl = {
|
|
20
48
|
isLaneCollapsed?: undefined;
|
|
21
49
|
onLaneCollapsedChange?: undefined;
|
|
@@ -28,11 +56,41 @@ type KanbanSubgroupBoardProps<TRow> = {
|
|
|
28
56
|
renderColumnHeader: (context: KanbanSubgroupColumnHeaderContext) => ReactNode;
|
|
29
57
|
renderLaneIdentity: (context: KanbanSubgroupLaneIdentityContext) => ReactNode;
|
|
30
58
|
renderCell: (context: KanbanSubgroupCellContext<TRow>) => ReactNode;
|
|
59
|
+
/**
|
|
60
|
+
* The line above a band's columns. Defaults to `KanbanColumnBandHeader`
|
|
61
|
+
* with the band's label and count.
|
|
62
|
+
*/
|
|
63
|
+
renderBandHeader?: ((context: KanbanSubgroupBandHeaderContext) => ReactNode) | undefined;
|
|
64
|
+
/**
|
|
65
|
+
* A lane's slot while its band is collapsed. Defaults to the band's name
|
|
66
|
+
* set vertically over the count; a host that accepts drops into a collapsed
|
|
67
|
+
* band renders its target here.
|
|
68
|
+
*/
|
|
69
|
+
renderCollapsedBandCell?: ((context: KanbanSubgroupCollapsedBandCellContext<TRow>) => ReactNode) | undefined;
|
|
70
|
+
/** Accessible name for a band's collapse toggle. */
|
|
71
|
+
formatBandToggleLabel?: ((band: KanbanColumnBand, collapsed: boolean) => string) | undefined;
|
|
72
|
+
/**
|
|
73
|
+
* Controlled band collapse. Omit both and the board keeps the collapsed
|
|
74
|
+
* bands itself; a persisted view supplies both.
|
|
75
|
+
*/
|
|
76
|
+
isBandCollapsed?: ((band: KanbanColumnBand) => boolean) | undefined;
|
|
77
|
+
onBandCollapsedChange?: ((band: KanbanColumnBand, collapsed: boolean) => void) | undefined;
|
|
31
78
|
formatCount?: ((count: number) => ReactNode) | undefined;
|
|
32
79
|
footer?: ReactNode;
|
|
33
80
|
className?: string | undefined;
|
|
34
81
|
} & KanbanSubgroupCollapseControl;
|
|
35
|
-
/**
|
|
36
|
-
|
|
82
|
+
/**
|
|
83
|
+
* Reusable swimlane layout over the canonical two-axis Kanban matrix.
|
|
84
|
+
*
|
|
85
|
+
* Columns that carry band metadata render under a one-line band caption and
|
|
86
|
+
* can be collapsed as a run: the band folds into one narrow slot in every
|
|
87
|
+
* row, whose cells stay reachable (a host renders its drop target in them),
|
|
88
|
+
* and peeks open while a pointer rests on it, so a drag can still land on a
|
|
89
|
+
* specific column inside. Every row is laid out span by span with the same
|
|
90
|
+
* widths, which is what keeps captions, headers, counts, and cells aligned
|
|
91
|
+
* in every state; the caption line never grows past its own height, so a
|
|
92
|
+
* folded band costs no vertical space.
|
|
93
|
+
*/
|
|
94
|
+
declare const KanbanSubgroupBoard: <TRow>({ matrix, renderColumnHeader, renderLaneIdentity, renderCell, renderBandHeader, renderCollapsedBandCell, formatBandToggleLabel, formatCount, isLaneCollapsed, onLaneCollapsedChange, isBandCollapsed, onBandCollapsedChange, footer, className }: KanbanSubgroupBoardProps<TRow>) => import("react").JSX.Element;
|
|
37
95
|
//#endregion
|
|
38
|
-
export { KanbanSubgroupBoard, KanbanSubgroupBoardProps, KanbanSubgroupCellContext, KanbanSubgroupColumnHeaderContext, KanbanSubgroupLaneIdentityContext };
|
|
96
|
+
export { KANBAN_BAND_PEEK_DELAY_MS, KanbanSubgroupBandHeaderContext, KanbanSubgroupBoard, KanbanSubgroupBoardProps, KanbanSubgroupCellContext, KanbanSubgroupCollapsedBandCellContext, KanbanSubgroupColumnHeaderContext, KanbanSubgroupLaneIdentityContext };
|
|
@@ -1,15 +1,34 @@
|
|
|
1
1
|
import { cn } from "../lib/utils.js";
|
|
2
2
|
import { DirectionalIcon } from "../components/directional-icon.js";
|
|
3
|
+
import { KanbanColumnBandHeader } from "./column-band-header.js";
|
|
4
|
+
import { KANBAN_COLLAPSED_BAND_WIDTH_CLASS, KANBAN_COLUMN_WIDTH_CLASS, resolveKanbanColumnBands } from "./column-bands.js";
|
|
3
5
|
import { ChevronDownIcon } from "lucide-react";
|
|
4
|
-
import { jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
-
import { useMemo, useState } from "react";
|
|
6
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
7
|
+
import { useEffect, useMemo, useRef, useState } from "react";
|
|
6
8
|
//#region src/kanban/subgroup-board.tsx
|
|
7
9
|
const groupValueKey = (value) => value === null ? "null" : `value:${value.length}:${value}`;
|
|
8
10
|
const columnKey = (column) => column.type === "group" ? `group:${groupValueKey(column.group.value)}` : `destination:${column.destination.id}`;
|
|
9
|
-
|
|
10
|
-
const
|
|
11
|
+
const spanKey = (span) => span.band === null ? `single:${span.columns.map(columnKey).join("|")}` : `band:${span.band.id}`;
|
|
12
|
+
const rowsIn = (cells) => cells.reduce((sum, cell) => sum + cell.rows.length, 0);
|
|
13
|
+
/** How long a pointer rests on a collapsed band before it peeks open. */
|
|
14
|
+
const KANBAN_BAND_PEEK_DELAY_MS = 400;
|
|
15
|
+
/**
|
|
16
|
+
* Reusable swimlane layout over the canonical two-axis Kanban matrix.
|
|
17
|
+
*
|
|
18
|
+
* Columns that carry band metadata render under a one-line band caption and
|
|
19
|
+
* can be collapsed as a run: the band folds into one narrow slot in every
|
|
20
|
+
* row, whose cells stay reachable (a host renders its drop target in them),
|
|
21
|
+
* and peeks open while a pointer rests on it, so a drag can still land on a
|
|
22
|
+
* specific column inside. Every row is laid out span by span with the same
|
|
23
|
+
* widths, which is what keeps captions, headers, counts, and cells aligned
|
|
24
|
+
* in every state; the caption line never grows past its own height, so a
|
|
25
|
+
* folded band costs no vertical space.
|
|
26
|
+
*/
|
|
27
|
+
const KanbanSubgroupBoard = ({ matrix, renderColumnHeader, renderLaneIdentity, renderCell, renderBandHeader, renderCollapsedBandCell, formatBandToggleLabel, formatCount = String, isLaneCollapsed, onLaneCollapsedChange, isBandCollapsed, onBandCollapsedChange, footer, className }) => {
|
|
11
28
|
const [collapsedLaneValues, setCollapsedLaneValues] = useState(() => /* @__PURE__ */ new Set());
|
|
12
29
|
const [expandedEmptyLaneValues, setExpandedEmptyLaneValues] = useState(() => /* @__PURE__ */ new Set());
|
|
30
|
+
const [collapsedBandIds, setCollapsedBandIds] = useState(() => /* @__PURE__ */ new Set());
|
|
31
|
+
const [peekingBandId, setPeekingBandId] = useState(null);
|
|
13
32
|
const { cellsByLaneValue, countByColumnValue, ungroupedCells } = useMemo(() => {
|
|
14
33
|
const laneCells = /* @__PURE__ */ new Map();
|
|
15
34
|
const columnCounts = /* @__PURE__ */ new Map();
|
|
@@ -32,6 +51,8 @@ const KanbanSubgroupBoard = ({ matrix, renderColumnHeader, renderLaneIdentity, r
|
|
|
32
51
|
ungroupedCells: cellsWithoutLane
|
|
33
52
|
};
|
|
34
53
|
}, [matrix.cells]);
|
|
54
|
+
const spans = useMemo(() => resolveKanbanColumnBands(matrix.columns), [matrix.columns]);
|
|
55
|
+
const hasBands = spans.some((span) => span.band !== null);
|
|
35
56
|
const setLaneCollapsed = (group, count, collapsed) => {
|
|
36
57
|
if (onLaneCollapsedChange) {
|
|
37
58
|
onLaneCollapsedChange(group, collapsed);
|
|
@@ -54,39 +75,170 @@ const KanbanSubgroupBoard = ({ matrix, renderColumnHeader, renderLaneIdentity, r
|
|
|
54
75
|
return next;
|
|
55
76
|
});
|
|
56
77
|
};
|
|
78
|
+
/** The band's persisted state: what the toggle reports and flips. */
|
|
79
|
+
const isBandCollapsedNow = (band) => isBandCollapsed ? isBandCollapsed(band) : collapsedBandIds.has(band.id);
|
|
80
|
+
/**
|
|
81
|
+
* Whether the band renders folded right now. A peek opens the layout
|
|
82
|
+
* without changing the persisted state, so a peeked band still reports
|
|
83
|
+
* itself collapsed and its toggle pins it open rather than closing it.
|
|
84
|
+
*/
|
|
85
|
+
const isBandFolded = (band) => peekingBandId !== band.id && isBandCollapsedNow(band);
|
|
86
|
+
const setBandCollapsed = (band, collapsed) => {
|
|
87
|
+
setPeekingBandId(null);
|
|
88
|
+
if (onBandCollapsedChange) {
|
|
89
|
+
onBandCollapsedChange(band, collapsed);
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
setCollapsedBandIds((current) => {
|
|
93
|
+
const next = new Set(current);
|
|
94
|
+
if (collapsed) next.add(band.id);
|
|
95
|
+
else next.delete(band.id);
|
|
96
|
+
return next;
|
|
97
|
+
});
|
|
98
|
+
};
|
|
99
|
+
const endPeek = () => setPeekingBandId(null);
|
|
100
|
+
const columnCount = (column) => countByColumnValue.get(columnKey(column)) ?? 0;
|
|
101
|
+
const cellsOf = (span, cells) => span.columns.flatMap((column) => cells.filter((cell) => columnKey(cell.coordinate.column) === columnKey(column)));
|
|
102
|
+
const spanWidth = (span) => span.columns.length * 300 + (span.columns.length - 1) * 12;
|
|
103
|
+
/**
|
|
104
|
+
* One row of the board, span by span. A folded band takes one narrow slot
|
|
105
|
+
* in every row; an open span lays its columns out at the column width.
|
|
106
|
+
*/
|
|
107
|
+
const renderRow = ({ className: rowClassName, label, renderColumn, renderFoldedBand }) => /* @__PURE__ */ jsx("div", {
|
|
108
|
+
"aria-label": label,
|
|
109
|
+
className: cn("flex gap-3", rowClassName),
|
|
110
|
+
children: spans.map((span) => {
|
|
111
|
+
const band = span.band;
|
|
112
|
+
if (band !== null && isBandFolded(band)) return /* @__PURE__ */ jsx(FoldedBandSlot, {
|
|
113
|
+
band,
|
|
114
|
+
className: KANBAN_COLLAPSED_BAND_WIDTH_CLASS,
|
|
115
|
+
onPeek: setPeekingBandId,
|
|
116
|
+
onPeekEnd: endPeek,
|
|
117
|
+
children: renderFoldedBand(band, span)
|
|
118
|
+
}, spanKey(span));
|
|
119
|
+
return /* @__PURE__ */ jsx("div", {
|
|
120
|
+
className: "flex gap-3",
|
|
121
|
+
"data-kanban-band": band?.id,
|
|
122
|
+
onPointerLeave: band !== null && peekingBandId === band.id ? endPeek : void 0,
|
|
123
|
+
children: span.columns.map((column) => /* @__PURE__ */ jsx("div", {
|
|
124
|
+
className: KANBAN_COLUMN_WIDTH_CLASS,
|
|
125
|
+
children: renderColumn(column)
|
|
126
|
+
}, columnKey(column)))
|
|
127
|
+
}, spanKey(span));
|
|
128
|
+
})
|
|
129
|
+
});
|
|
130
|
+
const bandHeader = (band, span) => {
|
|
131
|
+
const collapsed = isBandCollapsedNow(band);
|
|
132
|
+
const folded = isBandFolded(band);
|
|
133
|
+
const context = {
|
|
134
|
+
band,
|
|
135
|
+
collapsed,
|
|
136
|
+
columns: span.columns,
|
|
137
|
+
count: span.columns.reduce((sum, column) => sum + columnCount(column), 0),
|
|
138
|
+
folded,
|
|
139
|
+
onCollapsedChange: (next) => setBandCollapsed(band, next)
|
|
140
|
+
};
|
|
141
|
+
if (renderBandHeader) return /* @__PURE__ */ jsx(Fragment, { children: renderBandHeader(context) });
|
|
142
|
+
return /* @__PURE__ */ jsx(KanbanColumnBandHeader, {
|
|
143
|
+
collapsed,
|
|
144
|
+
compact: folded,
|
|
145
|
+
meta: formatCount(context.count),
|
|
146
|
+
title: band.label,
|
|
147
|
+
toggleLabel: formatBandToggleLabel ? formatBandToggleLabel(band, collapsed) : band.label,
|
|
148
|
+
onCollapsedChange: context.onCollapsedChange
|
|
149
|
+
});
|
|
150
|
+
};
|
|
151
|
+
const foldedCell = (band, span, cells, laneValue) => {
|
|
152
|
+
const bandCells = cellsOf(span, cells);
|
|
153
|
+
const count = rowsIn(bandCells);
|
|
154
|
+
if (renderCollapsedBandCell) return /* @__PURE__ */ jsx(Fragment, { children: renderCollapsedBandCell({
|
|
155
|
+
band,
|
|
156
|
+
cells: bandCells,
|
|
157
|
+
count,
|
|
158
|
+
laneValue
|
|
159
|
+
}) });
|
|
160
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
161
|
+
className: "text-muted-foreground flex flex-col items-center gap-2 py-2 text-xs",
|
|
162
|
+
"data-kanban-collapsed-band-count": count,
|
|
163
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
164
|
+
className: "max-h-40 truncate font-medium [writing-mode:vertical-rl]",
|
|
165
|
+
children: band.label
|
|
166
|
+
}), /* @__PURE__ */ jsx("span", {
|
|
167
|
+
className: "tabular-nums",
|
|
168
|
+
children: formatCount(count)
|
|
169
|
+
})]
|
|
170
|
+
});
|
|
171
|
+
};
|
|
172
|
+
const foldedCount = (span, cells) => {
|
|
173
|
+
const count = rowsIn(cellsOf(span, cells));
|
|
174
|
+
return /* @__PURE__ */ jsx("div", {
|
|
175
|
+
className: "flex justify-center",
|
|
176
|
+
"data-kanban-lane-column-count": count,
|
|
177
|
+
children: /* @__PURE__ */ jsx("span", {
|
|
178
|
+
className: "text-muted-foreground text-xs tabular-nums",
|
|
179
|
+
children: formatCount(count)
|
|
180
|
+
})
|
|
181
|
+
});
|
|
182
|
+
};
|
|
57
183
|
return /* @__PURE__ */ jsx("div", {
|
|
58
184
|
className: cn("h-full overflow-auto px-4 pb-4", className),
|
|
59
185
|
children: /* @__PURE__ */ jsxs("div", {
|
|
60
186
|
className: "min-w-max",
|
|
61
187
|
children: [
|
|
62
|
-
/* @__PURE__ */
|
|
63
|
-
className: "bg-background sticky top-0 z-20
|
|
64
|
-
children:
|
|
65
|
-
className: "
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
188
|
+
/* @__PURE__ */ jsxs("div", {
|
|
189
|
+
className: "bg-background sticky top-0 z-20 pt-4 pb-3",
|
|
190
|
+
children: [hasBands ? /* @__PURE__ */ jsx("div", {
|
|
191
|
+
className: "flex items-end gap-3 pb-1.5",
|
|
192
|
+
"data-kanban-band-row": "",
|
|
193
|
+
children: spans.map((span) => {
|
|
194
|
+
const band = span.band;
|
|
195
|
+
if (band === null) return /* @__PURE__ */ jsx("div", {
|
|
196
|
+
className: "shrink-0",
|
|
197
|
+
style: { width: `${String(spanWidth(span))}px` }
|
|
198
|
+
}, spanKey(span));
|
|
199
|
+
if (isBandFolded(band)) return /* @__PURE__ */ jsx(FoldedBandSlot, {
|
|
200
|
+
band,
|
|
201
|
+
className: cn("border-border/60 border-b", KANBAN_COLLAPSED_BAND_WIDTH_CLASS),
|
|
202
|
+
onPeek: setPeekingBandId,
|
|
203
|
+
onPeekEnd: endPeek,
|
|
204
|
+
children: bandHeader(band, span)
|
|
205
|
+
}, spanKey(span));
|
|
206
|
+
return /* @__PURE__ */ jsx("div", {
|
|
207
|
+
className: "border-border/60 shrink-0 border-b",
|
|
208
|
+
"data-kanban-band": band.id,
|
|
209
|
+
style: { width: `${String(spanWidth(span))}px` },
|
|
210
|
+
onPointerLeave: peekingBandId === band.id ? endPeek : void 0,
|
|
211
|
+
children: bandHeader(band, span)
|
|
212
|
+
}, spanKey(span));
|
|
69
213
|
})
|
|
70
|
-
},
|
|
214
|
+
}) : null, renderRow({
|
|
215
|
+
renderColumn: (column) => /* @__PURE__ */ jsx(Fragment, { children: renderColumnHeader({
|
|
216
|
+
column,
|
|
217
|
+
count: columnCount(column)
|
|
218
|
+
}) }),
|
|
219
|
+
renderFoldedBand: () => null
|
|
220
|
+
})]
|
|
71
221
|
}),
|
|
72
|
-
ungroupedCells.length === 0 ? null :
|
|
73
|
-
className: "
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
children: renderCell({
|
|
222
|
+
ungroupedCells.length === 0 ? null : renderRow({
|
|
223
|
+
className: "pb-1",
|
|
224
|
+
renderColumn: (column) => {
|
|
225
|
+
const cell = ungroupedCells.find((candidate) => columnKey(candidate.coordinate.column) === columnKey(column));
|
|
226
|
+
return cell === void 0 ? null : /* @__PURE__ */ jsx(Fragment, { children: renderCell({
|
|
77
227
|
cell,
|
|
78
228
|
count: cell.rows.length,
|
|
79
229
|
laneValue: null
|
|
80
|
-
})
|
|
81
|
-
},
|
|
230
|
+
}) });
|
|
231
|
+
},
|
|
232
|
+
renderFoldedBand: (band, span) => foldedCell(band, span, ungroupedCells, null)
|
|
82
233
|
}),
|
|
83
234
|
matrix.lanes.map((lane) => {
|
|
84
235
|
if (lane.type === "none") return null;
|
|
85
236
|
const { group } = lane;
|
|
86
237
|
const cells = cellsByLaneValue.get(group.value) ?? [];
|
|
87
|
-
const count = cells
|
|
238
|
+
const count = rowsIn(cells);
|
|
88
239
|
const defaultCollapsed = count === 0 ? !expandedEmptyLaneValues.has(group.value) : collapsedLaneValues.has(group.value);
|
|
89
240
|
const collapsed = isLaneCollapsed ? isLaneCollapsed(group, count) : defaultCollapsed;
|
|
241
|
+
const cellFor = (column) => cells.find((candidate) => columnKey(candidate.coordinate.column) === columnKey(column));
|
|
90
242
|
return /* @__PURE__ */ jsxs("section", {
|
|
91
243
|
className: "border-border/60 border-b py-2 first:pt-0 last:border-b-0",
|
|
92
244
|
children: [
|
|
@@ -114,28 +266,32 @@ const KanbanSubgroupBoard = ({ matrix, renderColumnHeader, renderLaneIdentity, r
|
|
|
114
266
|
]
|
|
115
267
|
})
|
|
116
268
|
}),
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
269
|
+
renderRow({
|
|
270
|
+
label: "Lane column counts",
|
|
271
|
+
renderColumn: (column) => {
|
|
272
|
+
const columnRows = cellFor(column)?.rows.length ?? 0;
|
|
273
|
+
return /* @__PURE__ */ jsx("div", {
|
|
274
|
+
className: "px-3",
|
|
275
|
+
"data-kanban-lane-column-count": columnRows,
|
|
276
|
+
children: /* @__PURE__ */ jsx("span", {
|
|
277
|
+
className: "text-muted-foreground text-xs tabular-nums",
|
|
278
|
+
children: formatCount(columnRows)
|
|
279
|
+
})
|
|
280
|
+
});
|
|
281
|
+
},
|
|
282
|
+
renderFoldedBand: (_band, span) => foldedCount(span, cells)
|
|
128
283
|
}),
|
|
129
|
-
!collapsed &&
|
|
130
|
-
className: "
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
children: renderCell({
|
|
284
|
+
!collapsed && renderRow({
|
|
285
|
+
className: "pb-1",
|
|
286
|
+
renderColumn: (column) => {
|
|
287
|
+
const cell = cellFor(column);
|
|
288
|
+
return cell === void 0 ? null : /* @__PURE__ */ jsx(Fragment, { children: renderCell({
|
|
134
289
|
cell,
|
|
135
290
|
count: cell.rows.length,
|
|
136
291
|
laneValue: group.value
|
|
137
|
-
})
|
|
138
|
-
},
|
|
292
|
+
}) });
|
|
293
|
+
},
|
|
294
|
+
renderFoldedBand: (band, span) => foldedCell(band, span, cells, group.value)
|
|
139
295
|
})
|
|
140
296
|
]
|
|
141
297
|
}, groupValueKey(group.value));
|
|
@@ -145,5 +301,38 @@ const KanbanSubgroupBoard = ({ matrix, renderColumnHeader, renderLaneIdentity, r
|
|
|
145
301
|
})
|
|
146
302
|
});
|
|
147
303
|
};
|
|
304
|
+
/**
|
|
305
|
+
* The narrow slot a folded band occupies in a row. A pointer resting on it
|
|
306
|
+
* for `KANBAN_BAND_PEEK_DELAY_MS` peeks the band open; leaving ends the peek
|
|
307
|
+
* and cancels a pending one, so a drag passing over it does not unfold it.
|
|
308
|
+
* The pointer must enter the slot after it appeared: a band folded under a
|
|
309
|
+
* resting pointer does not peek straight back open.
|
|
310
|
+
*/
|
|
311
|
+
const FoldedBandSlot = ({ band, children, className, onPeek, onPeekEnd }) => {
|
|
312
|
+
const timer = useRef(null);
|
|
313
|
+
useEffect(() => () => {
|
|
314
|
+
if (timer.current !== null) clearTimeout(timer.current);
|
|
315
|
+
}, []);
|
|
316
|
+
return /* @__PURE__ */ jsx("div", {
|
|
317
|
+
className,
|
|
318
|
+
"data-kanban-band": band.id,
|
|
319
|
+
"data-kanban-band-collapsed": "",
|
|
320
|
+
onPointerMove: () => {
|
|
321
|
+
if (timer.current !== null) return;
|
|
322
|
+
timer.current = setTimeout(() => {
|
|
323
|
+
timer.current = null;
|
|
324
|
+
onPeek(band.id);
|
|
325
|
+
}, 400);
|
|
326
|
+
},
|
|
327
|
+
onPointerLeave: () => {
|
|
328
|
+
if (timer.current !== null) {
|
|
329
|
+
clearTimeout(timer.current);
|
|
330
|
+
timer.current = null;
|
|
331
|
+
}
|
|
332
|
+
onPeekEnd();
|
|
333
|
+
},
|
|
334
|
+
children
|
|
335
|
+
});
|
|
336
|
+
};
|
|
148
337
|
//#endregion
|
|
149
|
-
export { KanbanSubgroupBoard };
|
|
338
|
+
export { KANBAN_BAND_PEEK_DELAY_MS, KanbanSubgroupBoard };
|
|
@@ -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 ("
|
|
8
|
+
declare const CONTROL_SIZES: readonly ("sm" | "default" | "lg")[];
|
|
9
9
|
//#endregion
|
|
10
10
|
export { CONTROL_SIZE, CONTROL_SIZES, type ControlSize };
|
package/package.json
CHANGED