@stll/ui 0.7.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +41 -5
- package/dist/components/application-rail.d.ts +20 -0
- package/dist/components/application-rail.js +52 -0
- package/dist/components/application-shell.js +1 -1
- package/dist/components/button-variants.d.ts +1 -1
- package/dist/components/combobox.d.ts +3 -2
- package/dist/components/combobox.js +35 -7
- package/dist/components/command.d.ts +2 -1
- package/dist/components/command.js +8 -2
- package/dist/components/input.d.ts +2 -1
- package/dist/components/input.js +9 -2
- package/dist/components/select.d.ts +2 -1
- package/dist/components/select.js +8 -2
- package/dist/components/textarea.d.ts +2 -1
- package/dist/components/textarea.js +9 -2
- package/dist/index.d.ts +7 -1
- package/dist/index.js +8 -2
- package/dist/inspector/index.d.ts +2 -1
- package/dist/inspector/index.js +2 -1
- package/dist/inspector/tabs.d.ts +16 -0
- package/dist/inspector/tabs.js +49 -0
- package/dist/kanban/grouping.d.ts +2 -0
- package/dist/kanban/grouping.js +1 -0
- package/dist/kanban/index.d.ts +4 -1
- package/dist/kanban/index.js +4 -1
- package/dist/kanban/matrix.d.ts +85 -0
- package/dist/kanban/matrix.js +121 -0
- package/dist/kanban/subgroup-board.d.ts +36 -0
- package/dist/kanban/subgroup-board.js +115 -0
- package/dist/kanban/virtual-cell.d.ts +33 -0
- package/dist/kanban/virtual-cell.js +58 -0
- package/dist/lib/control-size.d.ts +10 -0
- package/dist/lib/control-size.js +9 -0
- package/package.json +16 -1
package/dist/index.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { cn, composeRefs } from "./lib/utils.js";
|
|
2
2
|
import { Accordion, AccordionContent as AccordionPanel, AccordionItem, AccordionTrigger } from "./components/accordion.js";
|
|
3
|
+
import { PROPERTY_ROW_GRID, SIDE_RAIL_CONTAINER_CLASS, SIDE_RAIL_ICON_BUTTON_SIZE, SIDE_RAIL_TAB_ICON_SIZE, SIDE_RAIL_WIDTH, TOOLBAR_ROW_HEIGHT, TOOLBAR_ROW_HEIGHT_PX } from "./inspector/layout-tokens.js";
|
|
4
|
+
import { APPLICATION_RAIL_BUTTON_SIZE, APPLICATION_RAIL_ICON_SIZE, APPLICATION_RAIL_WIDTH, ApplicationRail, ApplicationRailButton, ApplicationRailContent, ApplicationRailFooter, ApplicationRailHeader, ApplicationRailMenu, ApplicationRailSeparator } from "./components/application-rail.js";
|
|
3
5
|
import { OVERLAY_LAYER_CLASS_NAMES } from "./lib/overlay-layer.js";
|
|
4
6
|
import { Tooltip, TooltipContent as TooltipPopup, TooltipCreateHandle, TooltipProvider, TooltipTrigger } from "./components/tooltip.js";
|
|
5
7
|
import { AlertDialog, AlertDialogBackdrop, AlertDialogClose, AlertDialogContent as AlertDialogPopup, AlertDialogCreateHandle, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogPanel, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AlertDialogViewport } from "./components/alert-dialog.js";
|
|
@@ -14,6 +16,7 @@ import { Button } from "./components/button.js";
|
|
|
14
16
|
import { Checkbox } from "./components/checkbox.js";
|
|
15
17
|
import { ColorPicker, ColorPickerContent, DEFAULT_PRESETS } from "./components/color-picker.js";
|
|
16
18
|
import { containedEventHandler, containedHandler } from "./hooks/use-contained-handler.js";
|
|
19
|
+
import { CONTROL_SIZE, CONTROL_SIZES } from "./lib/control-size.js";
|
|
17
20
|
import { contentDir, isStructuredInputType, useContentDir } from "./hooks/use-content-dir.js";
|
|
18
21
|
import { Input } from "./components/input.js";
|
|
19
22
|
import { ScrollArea, ScrollBar } from "./components/scroll-area.js";
|
|
@@ -58,9 +61,9 @@ import { duplicateColumnIds, findTableColumn, hideableColumnIds, sortableColumnI
|
|
|
58
61
|
import { DataTable } from "./data-table/table.js";
|
|
59
62
|
import { useIsMobile } from "./hooks/use-mobile.js";
|
|
60
63
|
import { useViewportWidth } from "./hooks/use-viewport-width.js";
|
|
61
|
-
import { PROPERTY_ROW_GRID, SIDE_RAIL_CONTAINER_CLASS, SIDE_RAIL_ICON_BUTTON_SIZE, SIDE_RAIL_TAB_ICON_SIZE, SIDE_RAIL_WIDTH, TOOLBAR_ROW_HEIGHT, TOOLBAR_ROW_HEIGHT_PX } from "./inspector/layout-tokens.js";
|
|
62
64
|
import { Inspector, InspectorActions, InspectorContent, InspectorDescription, InspectorEmptyRow, InspectorHeader, InspectorHeaderText, InspectorProperty, InspectorPropertyLabel, InspectorPropertyList, InspectorPropertyValue, InspectorRail, InspectorRailCell, InspectorRailIconButton, InspectorRailTab, InspectorSection, InspectorSectionTitle, InspectorTitle } from "./inspector/chrome.js";
|
|
63
65
|
import { InspectorDock } from "./inspector/dock.js";
|
|
66
|
+
import { InspectorTab, InspectorTabList, InspectorTabPanel, InspectorTabs } from "./inspector/tabs.js";
|
|
64
67
|
import { INSPECTOR_CONTENT_MIN_WIDTH, INSPECTOR_PANE_DEFAULT_WIDTH, INSPECTOR_PANE_MAX_WIDTH, INSPECTOR_PANE_MIN_WIDTH, INSPECTOR_RAIL_WIDTH, resolveInspectorDockWidth, resolveInspectorPaneMaxWidth, resolveInspectorPaneWidth, shouldForceSidebarCollapsed } from "./inspector/pane-width.js";
|
|
65
68
|
import { INSPECTOR_PANE_KEYBOARD_PAGE_STEP, INSPECTOR_PANE_KEYBOARD_STEP, parsePersistedPaneWidth, resolveDragWidth, resolveKeyboardWidth, useInspectorPaneWidth } from "./inspector/use-pane-width.js";
|
|
66
69
|
import { selectKanbanCardFieldIds } from "./kanban/card-properties.js";
|
|
@@ -70,6 +73,9 @@ import { KANBAN_MOUSE_ACTIVATION_DISTANCE, KANBAN_TOUCH_ACTIVATION_CONSTRAINT, K
|
|
|
70
73
|
import { KANBAN_DIRECTIONS, KANBAN_HORIZONTAL_EDGES, getKanbanHorizontalEdge } from "./kanban/sortable-edge.js";
|
|
71
74
|
import { KANBAN_BOARD_AUTO_SCROLL_SOURCES, registerKanbanBoardAutoScroll, registerKanbanCardDrag } from "./kanban/drag-interactions.js";
|
|
72
75
|
import { getKanbanGroupingPropertyId, getKanbanGroups, isKanbanGroupingRenderable, resolveKanbanGroupOptions, resolveKanbanGrouping, selectKanbanRows } from "./kanban/grouping.js";
|
|
76
|
+
import { KANBAN_BOARD_AXES, buildKanbanBoardMatrix, createKanbanDropIntent, orderKanbanCellsByColumns } from "./kanban/matrix.js";
|
|
77
|
+
import { KanbanSubgroupBoard } from "./kanban/subgroup-board.js";
|
|
78
|
+
import { KANBAN_VIRTUAL_CELL_PAGINATION, KanbanVirtualCell } from "./kanban/virtual-cell.js";
|
|
73
79
|
import { getInitials } from "./lib/initials.js";
|
|
74
80
|
import { emptyColor, optionColors, resolveOptionColor } from "./lib/option-color.js";
|
|
75
81
|
import { ReviewAuthorAvatar, UNKNOWN_AUTHOR_LABEL } from "./review/review-author-avatar.js";
|
|
@@ -79,4 +85,4 @@ import { ReviewDiffDeletion, ReviewDiffInsertion, ReviewDiffText, TRACKED_DELETI
|
|
|
79
85
|
import { ReviewOutOfDateNotice } from "./review/review-out-of-date-notice.js";
|
|
80
86
|
import { ReviewSeverityDot, ReviewStatusDot, reviewSeverityTone } from "./review/review-severity-dot.js";
|
|
81
87
|
import { ReviewStatusBadge } from "./review/review-status-badge.js";
|
|
82
|
-
export { 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, ApplicationShell, Avatar, AvatarFallback, AvatarImage, BidiText, Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, Button, 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_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, InspectorRailIconButton, InspectorRailTab, InspectorSection, InspectorSectionTitle, InspectorTitle, KANBAN_BOARD_AUTO_SCROLL_SOURCES, KANBAN_DIRECTIONS, KANBAN_HORIZONTAL_EDGES, KANBAN_MOUSE_ACTIVATION_DISTANCE, KANBAN_TOUCH_ACTIVATION_CONSTRAINT, KanbanCardShell, KanbanColumnHeader, KanbanDragHandle, KanbanSortableBoard, KanbanSortableColumns, KanbanSortableList, 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, assertConsecutiveCalendarDates, buttonAccessibleDisabledClass, buttonVariants, cn, composeRefs, containedEventHandler, containedHandler, contentDir, duplicateColumnIds, emptyColor, findTableColumn, getFirstWeekday, getInitials, getKanbanGroupingPropertyId, getKanbanGroups, getKanbanHorizontalEdge, getLocaleWeekInfo, getResourceCalendarPlacement, getWeekendDays, hideableColumnIds, isKanbanGroupingRenderable, isStructuredInputType, layoutResourceCalendarEntries, nextCalendarDate, optionColors, 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, useKanbanSortable, useKanbanSortableSensors, useLatest, useViewportWidth, visibleColumnIds };
|
|
88
|
+
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, ApplicationShell, Avatar, AvatarFallback, AvatarImage, 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_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, InspectorRailIconButton, InspectorRailTab, InspectorSection, InspectorSectionTitle, InspectorTab, InspectorTabList, InspectorTabPanel, InspectorTabs, InspectorTitle, KANBAN_BOARD_AUTO_SCROLL_SOURCES, KANBAN_BOARD_AXES, KANBAN_DIRECTIONS, KANBAN_HORIZONTAL_EDGES, KANBAN_MOUSE_ACTIVATION_DISTANCE, KANBAN_TOUCH_ACTIVATION_CONSTRAINT, KANBAN_VIRTUAL_CELL_PAGINATION, KanbanCardShell, 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, assertConsecutiveCalendarDates, buildKanbanBoardMatrix, buttonAccessibleDisabledClass, buttonVariants, cn, composeRefs, containedEventHandler, containedHandler, contentDir, createKanbanDropIntent, duplicateColumnIds, emptyColor, findTableColumn, getFirstWeekday, getInitials, getKanbanGroupingPropertyId, getKanbanGroups, getKanbanHorizontalEdge, getLocaleWeekInfo, getResourceCalendarPlacement, getWeekendDays, hideableColumnIds, isKanbanGroupingRenderable, isStructuredInputType, 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, useKanbanSortable, useKanbanSortableSensors, useLatest, useViewportWidth, visibleColumnIds };
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Inspector, InspectorActions, InspectorContent, InspectorDescription, InspectorEmptyRow, InspectorHeader, InspectorHeaderText, InspectorProperty, InspectorPropertyLabel, InspectorPropertyList, InspectorPropertyValue, InspectorRail, InspectorRailCell, InspectorRailIconButton, InspectorRailTab, InspectorSection, InspectorSectionTitle, InspectorTitle } from "./chrome.js";
|
|
2
2
|
import { InspectorDock } from "./dock.js";
|
|
3
|
+
import { InspectorTab, InspectorTabList, InspectorTabPanel, InspectorTabs } from "./tabs.js";
|
|
3
4
|
import { PROPERTY_ROW_GRID, SIDE_RAIL_CONTAINER_CLASS, SIDE_RAIL_ICON_BUTTON_SIZE, SIDE_RAIL_TAB_ICON_SIZE, SIDE_RAIL_WIDTH, TOOLBAR_ROW_HEIGHT, TOOLBAR_ROW_HEIGHT_PX } from "./layout-tokens.js";
|
|
4
5
|
import { INSPECTOR_CONTENT_MIN_WIDTH, INSPECTOR_PANE_DEFAULT_WIDTH, INSPECTOR_PANE_MAX_WIDTH, INSPECTOR_PANE_MIN_WIDTH, INSPECTOR_RAIL_WIDTH, resolveInspectorDockWidth, resolveInspectorPaneMaxWidth, resolveInspectorPaneWidth, shouldForceSidebarCollapsed } from "./pane-width.js";
|
|
5
6
|
import { INSPECTOR_PANE_KEYBOARD_PAGE_STEP, INSPECTOR_PANE_KEYBOARD_STEP, parsePersistedPaneWidth, resolveDragWidth, resolveKeyboardWidth, useInspectorPaneWidth } from "./use-pane-width.js";
|
|
6
|
-
export { INSPECTOR_CONTENT_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, Inspector, InspectorActions, InspectorContent, InspectorDescription, InspectorDock, InspectorEmptyRow, InspectorHeader, InspectorHeaderText, InspectorProperty, InspectorPropertyLabel, InspectorPropertyList, InspectorPropertyValue, InspectorRail, InspectorRailCell, InspectorRailIconButton, InspectorRailTab, InspectorSection, InspectorSectionTitle, InspectorTitle, PROPERTY_ROW_GRID, SIDE_RAIL_CONTAINER_CLASS, SIDE_RAIL_ICON_BUTTON_SIZE, SIDE_RAIL_TAB_ICON_SIZE, SIDE_RAIL_WIDTH, TOOLBAR_ROW_HEIGHT, TOOLBAR_ROW_HEIGHT_PX, parsePersistedPaneWidth, resolveDragWidth, resolveInspectorDockWidth, resolveInspectorPaneMaxWidth, resolveInspectorPaneWidth, resolveKeyboardWidth, shouldForceSidebarCollapsed, useInspectorPaneWidth };
|
|
7
|
+
export { INSPECTOR_CONTENT_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, Inspector, InspectorActions, InspectorContent, InspectorDescription, InspectorDock, InspectorEmptyRow, InspectorHeader, InspectorHeaderText, InspectorProperty, InspectorPropertyLabel, InspectorPropertyList, InspectorPropertyValue, InspectorRail, InspectorRailCell, InspectorRailIconButton, InspectorRailTab, InspectorSection, InspectorSectionTitle, InspectorTab, InspectorTabList, InspectorTabPanel, InspectorTabs, InspectorTitle, PROPERTY_ROW_GRID, SIDE_RAIL_CONTAINER_CLASS, SIDE_RAIL_ICON_BUTTON_SIZE, SIDE_RAIL_TAB_ICON_SIZE, SIDE_RAIL_WIDTH, TOOLBAR_ROW_HEIGHT, TOOLBAR_ROW_HEIGHT_PX, parsePersistedPaneWidth, resolveDragWidth, resolveInspectorDockWidth, resolveInspectorPaneMaxWidth, resolveInspectorPaneWidth, resolveKeyboardWidth, shouldForceSidebarCollapsed, useInspectorPaneWidth };
|
package/dist/inspector/index.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { PROPERTY_ROW_GRID, SIDE_RAIL_CONTAINER_CLASS, SIDE_RAIL_ICON_BUTTON_SIZE, SIDE_RAIL_TAB_ICON_SIZE, SIDE_RAIL_WIDTH, TOOLBAR_ROW_HEIGHT, TOOLBAR_ROW_HEIGHT_PX } from "./layout-tokens.js";
|
|
2
2
|
import { Inspector, InspectorActions, InspectorContent, InspectorDescription, InspectorEmptyRow, InspectorHeader, InspectorHeaderText, InspectorProperty, InspectorPropertyLabel, InspectorPropertyList, InspectorPropertyValue, InspectorRail, InspectorRailCell, InspectorRailIconButton, InspectorRailTab, InspectorSection, InspectorSectionTitle, InspectorTitle } from "./chrome.js";
|
|
3
3
|
import { InspectorDock } from "./dock.js";
|
|
4
|
+
import { InspectorTab, InspectorTabList, InspectorTabPanel, InspectorTabs } from "./tabs.js";
|
|
4
5
|
import { INSPECTOR_CONTENT_MIN_WIDTH, INSPECTOR_PANE_DEFAULT_WIDTH, INSPECTOR_PANE_MAX_WIDTH, INSPECTOR_PANE_MIN_WIDTH, INSPECTOR_RAIL_WIDTH, resolveInspectorDockWidth, resolveInspectorPaneMaxWidth, resolveInspectorPaneWidth, shouldForceSidebarCollapsed } from "./pane-width.js";
|
|
5
6
|
import { INSPECTOR_PANE_KEYBOARD_PAGE_STEP, INSPECTOR_PANE_KEYBOARD_STEP, parsePersistedPaneWidth, resolveDragWidth, resolveKeyboardWidth, useInspectorPaneWidth } from "./use-pane-width.js";
|
|
6
|
-
export { INSPECTOR_CONTENT_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, Inspector, InspectorActions, InspectorContent, InspectorDescription, InspectorDock, InspectorEmptyRow, InspectorHeader, InspectorHeaderText, InspectorProperty, InspectorPropertyLabel, InspectorPropertyList, InspectorPropertyValue, InspectorRail, InspectorRailCell, InspectorRailIconButton, InspectorRailTab, InspectorSection, InspectorSectionTitle, InspectorTitle, PROPERTY_ROW_GRID, SIDE_RAIL_CONTAINER_CLASS, SIDE_RAIL_ICON_BUTTON_SIZE, SIDE_RAIL_TAB_ICON_SIZE, SIDE_RAIL_WIDTH, TOOLBAR_ROW_HEIGHT, TOOLBAR_ROW_HEIGHT_PX, parsePersistedPaneWidth, resolveDragWidth, resolveInspectorDockWidth, resolveInspectorPaneMaxWidth, resolveInspectorPaneWidth, resolveKeyboardWidth, shouldForceSidebarCollapsed, useInspectorPaneWidth };
|
|
7
|
+
export { INSPECTOR_CONTENT_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, Inspector, InspectorActions, InspectorContent, InspectorDescription, InspectorDock, InspectorEmptyRow, InspectorHeader, InspectorHeaderText, InspectorProperty, InspectorPropertyLabel, InspectorPropertyList, InspectorPropertyValue, InspectorRail, InspectorRailCell, InspectorRailIconButton, InspectorRailTab, InspectorSection, InspectorSectionTitle, InspectorTab, InspectorTabList, InspectorTabPanel, InspectorTabs, InspectorTitle, PROPERTY_ROW_GRID, SIDE_RAIL_CONTAINER_CLASS, SIDE_RAIL_ICON_BUTTON_SIZE, SIDE_RAIL_TAB_ICON_SIZE, SIDE_RAIL_WIDTH, TOOLBAR_ROW_HEIGHT, TOOLBAR_ROW_HEIGHT_PX, parsePersistedPaneWidth, resolveDragWidth, resolveInspectorDockWidth, resolveInspectorPaneMaxWidth, resolveInspectorPaneWidth, resolveKeyboardWidth, shouldForceSidebarCollapsed, useInspectorPaneWidth };
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import * as React$1 from "react";
|
|
2
|
+
import { Tabs } from "@base-ui/react/tabs";
|
|
3
|
+
//#region src/inspector/tabs.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* A tabbed inspector keeps its content beside the same fixed-width rail as a
|
|
6
|
+
* docked inspector. The mobile layout moves the rail below the header rather
|
|
7
|
+
* than leaving a narrow column beside a full-screen sheet.
|
|
8
|
+
*/
|
|
9
|
+
declare const InspectorTabs: ({ className, ...props }: Omit<Tabs.Root.Props, "orientation">) => React$1.JSX.Element;
|
|
10
|
+
declare const INSPECTOR_RAIL_MEDIA_QUERY: "(min-width: 48rem)";
|
|
11
|
+
declare const resolveInspectorTabOrientation: (isRailLayout: boolean) => "horizontal" | "vertical";
|
|
12
|
+
declare const InspectorTabList: ({ className, ...props }: Tabs.List.Props) => React$1.JSX.Element;
|
|
13
|
+
declare const InspectorTab: ({ className, ...props }: Tabs.Tab.Props) => React$1.JSX.Element;
|
|
14
|
+
declare const InspectorTabPanel: ({ className, ...props }: Tabs.Panel.Props) => React$1.JSX.Element;
|
|
15
|
+
//#endregion
|
|
16
|
+
export { INSPECTOR_RAIL_MEDIA_QUERY, InspectorTab, InspectorTabList, InspectorTabPanel, InspectorTabs, resolveInspectorTabOrientation };
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cn } from "../lib/utils.js";
|
|
3
|
+
import { TOOLBAR_ROW_HEIGHT } from "./layout-tokens.js";
|
|
4
|
+
import { jsx } from "react/jsx-runtime";
|
|
5
|
+
import * as React$1 from "react";
|
|
6
|
+
import { Tabs } from "@base-ui/react/tabs";
|
|
7
|
+
//#region src/inspector/tabs.tsx
|
|
8
|
+
/**
|
|
9
|
+
* A tabbed inspector keeps its content beside the same fixed-width rail as a
|
|
10
|
+
* docked inspector. The mobile layout moves the rail below the header rather
|
|
11
|
+
* than leaving a narrow column beside a full-screen sheet.
|
|
12
|
+
*/
|
|
13
|
+
const InspectorTabs = ({ className, ...props }) => {
|
|
14
|
+
const isRailLayout = useInspectorRailLayout();
|
|
15
|
+
return /* @__PURE__ */ jsx(Tabs.Root, {
|
|
16
|
+
className: (state) => cn("grid h-full min-h-0 w-full grid-cols-1 grid-rows-[3rem_3rem_minmax(0,1fr)] overflow-hidden md:grid-cols-[3rem_minmax(0,1fr)] md:grid-rows-[3rem_minmax(0,1fr)]", resolveClassName(className, state)),
|
|
17
|
+
"data-slot": "inspector-tabs",
|
|
18
|
+
...props,
|
|
19
|
+
orientation: resolveInspectorTabOrientation(isRailLayout)
|
|
20
|
+
});
|
|
21
|
+
};
|
|
22
|
+
const INSPECTOR_RAIL_MEDIA_QUERY = "(min-width: 48rem)";
|
|
23
|
+
const resolveInspectorTabOrientation = (isRailLayout) => isRailLayout ? "vertical" : "horizontal";
|
|
24
|
+
const subscribeToInspectorRailLayout = (onChange) => {
|
|
25
|
+
const mediaQueryList = window.matchMedia(INSPECTOR_RAIL_MEDIA_QUERY);
|
|
26
|
+
mediaQueryList.addEventListener("change", onChange);
|
|
27
|
+
return () => mediaQueryList.removeEventListener("change", onChange);
|
|
28
|
+
};
|
|
29
|
+
const getInspectorRailLayoutSnapshot = () => window.matchMedia(INSPECTOR_RAIL_MEDIA_QUERY).matches;
|
|
30
|
+
const getServerInspectorRailLayoutSnapshot = () => false;
|
|
31
|
+
const useInspectorRailLayout = () => React$1.useSyncExternalStore(subscribeToInspectorRailLayout, getInspectorRailLayoutSnapshot, getServerInspectorRailLayoutSnapshot);
|
|
32
|
+
const resolveClassName = (value, state) => typeof value === "function" ? value(state) : value;
|
|
33
|
+
const InspectorTabList = ({ className, ...props }) => /* @__PURE__ */ jsx(Tabs.List, {
|
|
34
|
+
className: (state) => cn("bg-sidebar col-start-1 row-start-2 flex min-w-0 shrink-0 scrollbar-none overflow-x-auto overflow-y-hidden overscroll-x-contain border-b md:row-span-2 md:row-start-1 md:h-full md:flex-col md:overflow-x-hidden md:overflow-y-auto md:overscroll-y-contain md:border-s md:border-e md:border-b-0 [&::-webkit-scrollbar]:hidden", TOOLBAR_ROW_HEIGHT, "md:w-12", resolveClassName(className, state)),
|
|
35
|
+
"data-slot": "inspector-tab-list",
|
|
36
|
+
...props
|
|
37
|
+
});
|
|
38
|
+
const InspectorTab = ({ className, ...props }) => /* @__PURE__ */ jsx(Tabs.Tab, {
|
|
39
|
+
className: (state) => cn("group/tab text-muted-foreground hover:bg-accent hover:text-foreground focus-visible:ring-ring data-active:bg-background data-active:text-foreground data-active:before:bg-primary relative flex size-12 shrink-0 cursor-pointer items-center justify-center border-e transition-colors outline-none before:absolute before:inset-x-0 before:bottom-0 before:hidden before:h-0.5 focus-visible:z-10 focus-visible:ring-2 focus-visible:ring-inset data-active:before:block data-disabled:pointer-events-none data-disabled:opacity-60 md:w-full md:flex-none md:border-e-0 md:border-b md:before:inset-y-0 md:before:start-0 md:before:h-auto md:before:w-0.5", resolveClassName(className, state)),
|
|
40
|
+
"data-slot": "inspector-tab",
|
|
41
|
+
...props
|
|
42
|
+
});
|
|
43
|
+
const InspectorTabPanel = ({ className, ...props }) => /* @__PURE__ */ jsx(Tabs.Panel, {
|
|
44
|
+
className: (state) => cn("col-start-1 row-start-3 min-h-0 overflow-x-hidden overflow-y-auto overscroll-contain outline-none md:col-start-2 md:row-start-2", resolveClassName(className, state)),
|
|
45
|
+
"data-slot": "inspector-tab-panel",
|
|
46
|
+
...props
|
|
47
|
+
});
|
|
48
|
+
//#endregion
|
|
49
|
+
export { INSPECTOR_RAIL_MEDIA_QUERY, InspectorTab, InspectorTabList, InspectorTabPanel, InspectorTabs, resolveInspectorTabOrientation };
|
|
@@ -4,6 +4,7 @@ import { OptionColor } from "../lib/option-color.js";
|
|
|
4
4
|
type KanbanGroupOption = {
|
|
5
5
|
value: string;
|
|
6
6
|
label: string;
|
|
7
|
+
image?: string | null | undefined;
|
|
7
8
|
color?: string | undefined;
|
|
8
9
|
colorBg?: string | undefined;
|
|
9
10
|
optionColor?: OptionColor | undefined;
|
|
@@ -12,6 +13,7 @@ type KanbanGroupOption = {
|
|
|
12
13
|
type KanbanGroup = {
|
|
13
14
|
value: string | null;
|
|
14
15
|
label: string;
|
|
16
|
+
image?: string | null | undefined;
|
|
15
17
|
color?: string | undefined;
|
|
16
18
|
colorBg?: string | undefined;
|
|
17
19
|
optionColor?: OptionColor | undefined;
|
package/dist/kanban/grouping.js
CHANGED
|
@@ -62,6 +62,7 @@ const getKanbanGroups = (options, uncategorizedLabel) => {
|
|
|
62
62
|
const result = options.map((option) => ({
|
|
63
63
|
value: option.value,
|
|
64
64
|
label: option.label,
|
|
65
|
+
image: option.image,
|
|
65
66
|
color: option.color,
|
|
66
67
|
colorBg: option.colorBg,
|
|
67
68
|
optionColor: option.optionColor
|
package/dist/kanban/index.d.ts
CHANGED
|
@@ -5,4 +5,7 @@ import { KANBAN_MOUSE_ACTIVATION_DISTANCE, KANBAN_TOUCH_ACTIVATION_CONSTRAINT, K
|
|
|
5
5
|
import { KANBAN_DIRECTIONS, KANBAN_HORIZONTAL_EDGES, KanbanDirection, KanbanHorizontalEdge, getKanbanHorizontalEdge } from "./sortable-edge.js";
|
|
6
6
|
import { KANBAN_BOARD_AUTO_SCROLL_SOURCES, RegisterKanbanBoardAutoScrollOptions, RegisterKanbanCardDragOptions, registerKanbanBoardAutoScroll, registerKanbanCardDrag } from "./drag-interactions.js";
|
|
7
7
|
import { KanbanBuiltInGroup, KanbanGroup, KanbanGroupOption, KanbanGrouping, KanbanSchema, ResolveKanbanGroupingParams, getKanbanGroupingPropertyId, getKanbanGroups, isKanbanGroupingRenderable, resolveKanbanGroupOptions, resolveKanbanGrouping, selectKanbanRows } from "./grouping.js";
|
|
8
|
-
|
|
8
|
+
import { BuildKanbanBoardMatrixParams, CreateKanbanDropIntentParams, KANBAN_BOARD_AXES, KanbanBoardAxis, KanbanBoardCell, KanbanBoardCoordinate, KanbanBoardLane, KanbanBoardMatrix, KanbanDropAxisChange, KanbanDropIntent, OrderKanbanCellsByColumnsParams, ResolveKanbanGroupValueParams, buildKanbanBoardMatrix, createKanbanDropIntent, orderKanbanCellsByColumns } from "./matrix.js";
|
|
9
|
+
import { KanbanSubgroupBoard, KanbanSubgroupBoardProps, KanbanSubgroupCellContext, KanbanSubgroupColumnHeaderContext, KanbanSubgroupLaneIdentityContext } from "./subgroup-board.js";
|
|
10
|
+
import { KANBAN_VIRTUAL_CELL_PAGINATION, KanbanVirtualCell, KanbanVirtualCellPagination, KanbanVirtualCellProps } from "./virtual-cell.js";
|
|
11
|
+
export { type BuildKanbanBoardMatrixParams, type CreateKanbanDropIntentParams, KANBAN_BOARD_AUTO_SCROLL_SOURCES, KANBAN_BOARD_AXES, KANBAN_DIRECTIONS, KANBAN_HORIZONTAL_EDGES, KANBAN_MOUSE_ACTIVATION_DISTANCE, KANBAN_TOUCH_ACTIVATION_CONSTRAINT, KANBAN_VIRTUAL_CELL_PAGINATION, type KanbanBoardAxis, type KanbanBoardCell, type KanbanBoardCoordinate, type KanbanBoardLane, type KanbanBoardMatrix, type KanbanBuiltInGroup, type KanbanCardFieldSelection, KanbanCardShell, type KanbanCardShellProps, KanbanColumnHeader, type KanbanColumnHeaderProps, type KanbanDirection, KanbanDragHandle, type KanbanDragHandleProps, type KanbanDropAxisChange, type KanbanDropIntent, type KanbanGroup, type KanbanGroupOption, type KanbanGrouping, type KanbanHorizontalEdge, type KanbanSchema, type KanbanSortableBindings, KanbanSortableBoard, type KanbanSortableBoardProps, KanbanSortableColumns, type KanbanSortableColumnsProps, KanbanSortableList, type KanbanSortableListProps, KanbanSubgroupBoard, type KanbanSubgroupBoardProps, type KanbanSubgroupCellContext, type KanbanSubgroupColumnHeaderContext, type KanbanSubgroupLaneIdentityContext, KanbanVirtualCell, type KanbanVirtualCellPagination, type KanbanVirtualCellProps, type OrderKanbanCellsByColumnsParams, type RegisterKanbanBoardAutoScrollOptions, type RegisterKanbanCardDragOptions, type ResolveKanbanGroupValueParams, type ResolveKanbanGroupingParams, type UseKanbanSortableOptions, buildKanbanBoardMatrix, createKanbanDropIntent, getKanbanGroupingPropertyId, getKanbanGroups, getKanbanHorizontalEdge, isKanbanGroupingRenderable, orderKanbanCellsByColumns, registerKanbanBoardAutoScroll, registerKanbanCardDrag, resolveKanbanGroupOptions, resolveKanbanGrouping, selectKanbanCardFieldIds, selectKanbanRows, useKanbanSortable, useKanbanSortableSensors };
|
package/dist/kanban/index.js
CHANGED
|
@@ -5,4 +5,7 @@ import { KANBAN_MOUSE_ACTIVATION_DISTANCE, KANBAN_TOUCH_ACTIVATION_CONSTRAINT, K
|
|
|
5
5
|
import { KANBAN_DIRECTIONS, KANBAN_HORIZONTAL_EDGES, getKanbanHorizontalEdge } from "./sortable-edge.js";
|
|
6
6
|
import { KANBAN_BOARD_AUTO_SCROLL_SOURCES, registerKanbanBoardAutoScroll, registerKanbanCardDrag } from "./drag-interactions.js";
|
|
7
7
|
import { getKanbanGroupingPropertyId, getKanbanGroups, isKanbanGroupingRenderable, resolveKanbanGroupOptions, resolveKanbanGrouping, selectKanbanRows } from "./grouping.js";
|
|
8
|
-
|
|
8
|
+
import { KANBAN_BOARD_AXES, buildKanbanBoardMatrix, createKanbanDropIntent, orderKanbanCellsByColumns } from "./matrix.js";
|
|
9
|
+
import { KanbanSubgroupBoard } from "./subgroup-board.js";
|
|
10
|
+
import { KANBAN_VIRTUAL_CELL_PAGINATION, KanbanVirtualCell } from "./virtual-cell.js";
|
|
11
|
+
export { KANBAN_BOARD_AUTO_SCROLL_SOURCES, KANBAN_BOARD_AXES, KANBAN_DIRECTIONS, KANBAN_HORIZONTAL_EDGES, KANBAN_MOUSE_ACTIVATION_DISTANCE, KANBAN_TOUCH_ACTIVATION_CONSTRAINT, KANBAN_VIRTUAL_CELL_PAGINATION, KanbanCardShell, KanbanColumnHeader, KanbanDragHandle, KanbanSortableBoard, KanbanSortableColumns, KanbanSortableList, KanbanSubgroupBoard, KanbanVirtualCell, buildKanbanBoardMatrix, createKanbanDropIntent, getKanbanGroupingPropertyId, getKanbanGroups, getKanbanHorizontalEdge, isKanbanGroupingRenderable, orderKanbanCellsByColumns, registerKanbanBoardAutoScroll, registerKanbanCardDrag, resolveKanbanGroupOptions, resolveKanbanGrouping, selectKanbanCardFieldIds, selectKanbanRows, useKanbanSortable, useKanbanSortableSensors };
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { KanbanGroup, KanbanGrouping } from "./grouping.js";
|
|
2
|
+
//#region src/kanban/matrix.d.ts
|
|
3
|
+
/** Which axis of a board a grouping controls. */
|
|
4
|
+
declare const KANBAN_BOARD_AXES: {
|
|
5
|
+
readonly group: "group";
|
|
6
|
+
readonly subgroup: "subgroup";
|
|
7
|
+
};
|
|
8
|
+
type KanbanBoardAxis = (typeof KANBAN_BOARD_AXES)[keyof typeof KANBAN_BOARD_AXES];
|
|
9
|
+
/** The optional horizontal swimlane dimension is intentionally explicit. */
|
|
10
|
+
type KanbanBoardLane = {
|
|
11
|
+
type: "none";
|
|
12
|
+
} | {
|
|
13
|
+
group: KanbanGroup;
|
|
14
|
+
type: "group";
|
|
15
|
+
};
|
|
16
|
+
type KanbanBoardCoordinate = {
|
|
17
|
+
column: KanbanGroup;
|
|
18
|
+
lane: KanbanBoardLane;
|
|
19
|
+
};
|
|
20
|
+
type KanbanBoardCell<TRow> = {
|
|
21
|
+
coordinate: KanbanBoardCoordinate;
|
|
22
|
+
rows: TRow[];
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* The full, ordered cartesian board. Presentation may hide or collapse parts
|
|
26
|
+
* of it, but it must not derive cards independently: every board row is in
|
|
27
|
+
* exactly one cell here before that presentation step.
|
|
28
|
+
*/
|
|
29
|
+
type KanbanBoardMatrix<TRow> = {
|
|
30
|
+
cells: KanbanBoardCell<TRow>[];
|
|
31
|
+
columns: KanbanGroup[];
|
|
32
|
+
lanes: KanbanBoardLane[];
|
|
33
|
+
rows: TRow[];
|
|
34
|
+
};
|
|
35
|
+
type ResolveKanbanGroupValueParams<TRow, TProperty> = {
|
|
36
|
+
grouping: KanbanGrouping<TRow, TProperty>;
|
|
37
|
+
row: TRow;
|
|
38
|
+
};
|
|
39
|
+
type BuildKanbanBoardMatrixParams<TRow, TProperty> = {
|
|
40
|
+
/** The vertical board columns. This must be a renderable grouping. */
|
|
41
|
+
group: KanbanGrouping<TRow, TProperty>;
|
|
42
|
+
/** Optional horizontal swimlanes. `none` makes this a one-lane board. */
|
|
43
|
+
subgroup: KanbanGrouping<TRow, TProperty>;
|
|
44
|
+
rows: readonly TRow[];
|
|
45
|
+
uncategorizedLabel: string;
|
|
46
|
+
resolveGroupValue: (params: ResolveKanbanGroupValueParams<TRow, TProperty>) => string | null;
|
|
47
|
+
};
|
|
48
|
+
type OrderKanbanCellsByColumnsParams<TRow> = {
|
|
49
|
+
cells: readonly KanbanBoardCell<TRow>[];
|
|
50
|
+
columns: readonly KanbanGroup[];
|
|
51
|
+
};
|
|
52
|
+
/** Apply the visible header order to any lane's cells. */
|
|
53
|
+
declare const orderKanbanCellsByColumns: <TRow>({ cells, columns }: OrderKanbanCellsByColumnsParams<TRow>) => KanbanBoardCell<TRow>[];
|
|
54
|
+
/**
|
|
55
|
+
* Resolve the board's one source of placement truth.
|
|
56
|
+
*
|
|
57
|
+
* A subgroup never filters the primary board scope. A row outside a subgroup's
|
|
58
|
+
* declared values goes to its explicit No value lane, rather than disappearing.
|
|
59
|
+
*/
|
|
60
|
+
declare const buildKanbanBoardMatrix: <TRow, TProperty>({ group, subgroup, rows, uncategorizedLabel, resolveGroupValue }: BuildKanbanBoardMatrixParams<TRow, TProperty>) => KanbanBoardMatrix<TRow>;
|
|
61
|
+
type KanbanDropAxisChange = {
|
|
62
|
+
groupBy: string;
|
|
63
|
+
value: string | null;
|
|
64
|
+
};
|
|
65
|
+
/** A complete, atomic move request for a domain mutation adapter. */
|
|
66
|
+
type KanbanDropIntent<TCardId> = {
|
|
67
|
+
cardId: TCardId;
|
|
68
|
+
changes: readonly KanbanDropAxisChange[];
|
|
69
|
+
type: "move";
|
|
70
|
+
};
|
|
71
|
+
type CreateKanbanDropIntentParams<TRow, TProperty, TCardId> = {
|
|
72
|
+
cardId: TCardId;
|
|
73
|
+
group: KanbanGrouping<TRow, TProperty>;
|
|
74
|
+
source: KanbanBoardCoordinate;
|
|
75
|
+
subgroup: KanbanGrouping<TRow, TProperty>;
|
|
76
|
+
target: KanbanBoardCoordinate;
|
|
77
|
+
};
|
|
78
|
+
/**
|
|
79
|
+
* Builds a single mutation payload for a pointer, touch, or keyboard drop.
|
|
80
|
+
* Diagonal drops carry both changes together; an adapter must commit this
|
|
81
|
+
* intent atomically or reject it as a whole.
|
|
82
|
+
*/
|
|
83
|
+
declare const createKanbanDropIntent: <TRow, TProperty, TCardId>({ cardId, group, source, subgroup, target }: CreateKanbanDropIntentParams<TRow, TProperty, TCardId>) => KanbanDropIntent<TCardId> | null;
|
|
84
|
+
//#endregion
|
|
85
|
+
export { BuildKanbanBoardMatrixParams, CreateKanbanDropIntentParams, KANBAN_BOARD_AXES, KanbanBoardAxis, KanbanBoardCell, KanbanBoardCoordinate, KanbanBoardLane, KanbanBoardMatrix, KanbanDropAxisChange, KanbanDropIntent, OrderKanbanCellsByColumnsParams, ResolveKanbanGroupValueParams, buildKanbanBoardMatrix, createKanbanDropIntent, orderKanbanCellsByColumns };
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { getKanbanGroupingPropertyId, getKanbanGroups, isKanbanGroupingRenderable, resolveKanbanGroupOptions, selectKanbanRows } from "./grouping.js";
|
|
2
|
+
import { panic } from "better-result";
|
|
3
|
+
//#region src/kanban/matrix.ts
|
|
4
|
+
/** Which axis of a board a grouping controls. */
|
|
5
|
+
const KANBAN_BOARD_AXES = {
|
|
6
|
+
group: "group",
|
|
7
|
+
subgroup: "subgroup"
|
|
8
|
+
};
|
|
9
|
+
const optionValueKey = (value) => value === null ? "null" : `string:${value.length}:${value}`;
|
|
10
|
+
/** Apply the visible header order to any lane's cells. */
|
|
11
|
+
const orderKanbanCellsByColumns = ({ cells, columns }) => {
|
|
12
|
+
const orderByValue = new Map(columns.map((column, index) => [optionValueKey(column.value), index]));
|
|
13
|
+
const getColumnOrder = (cell) => {
|
|
14
|
+
return orderByValue.get(optionValueKey(cell.coordinate.column.value)) ?? panic("Visible Kanban cell has no column order");
|
|
15
|
+
};
|
|
16
|
+
return cells.filter((cell) => orderByValue.has(optionValueKey(cell.coordinate.column.value))).toSorted((left, right) => getColumnOrder(left) - getColumnOrder(right));
|
|
17
|
+
};
|
|
18
|
+
const cellKey = ({ column, lane }) => `${optionValueKey(column.value)}|${lane.type === "none" ? "none" : optionValueKey(lane.group.value)}`;
|
|
19
|
+
const groupContainsValue = (groups, value) => groups.some((group) => group.value === value);
|
|
20
|
+
const normalizeGroupValue = (groups, value) => groupContainsValue(groups, value) ? value : null;
|
|
21
|
+
const getRenderableGroups = (grouping, uncategorizedLabel) => {
|
|
22
|
+
if (!isKanbanGroupingRenderable(grouping)) return [];
|
|
23
|
+
return getKanbanGroups(resolveKanbanGroupOptions(grouping), uncategorizedLabel);
|
|
24
|
+
};
|
|
25
|
+
const makeLanes = (subgroup, uncategorizedLabel) => {
|
|
26
|
+
if (subgroup.type === "none") return [{ type: "none" }];
|
|
27
|
+
return getRenderableGroups(subgroup, uncategorizedLabel).map((group) => ({
|
|
28
|
+
group,
|
|
29
|
+
type: "group"
|
|
30
|
+
}));
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Resolve the board's one source of placement truth.
|
|
34
|
+
*
|
|
35
|
+
* A subgroup never filters the primary board scope. A row outside a subgroup's
|
|
36
|
+
* declared values goes to its explicit No value lane, rather than disappearing.
|
|
37
|
+
*/
|
|
38
|
+
const buildKanbanBoardMatrix = ({ group, subgroup, rows, uncategorizedLabel, resolveGroupValue }) => {
|
|
39
|
+
if (!isKanbanGroupingRenderable(group)) return {
|
|
40
|
+
cells: [],
|
|
41
|
+
columns: [],
|
|
42
|
+
lanes: [],
|
|
43
|
+
rows: []
|
|
44
|
+
};
|
|
45
|
+
const columns = getRenderableGroups(group, uncategorizedLabel);
|
|
46
|
+
const scopedRows = selectKanbanRows(rows, group);
|
|
47
|
+
const hasRenderableSubgroup = isKanbanGroupingRenderable(subgroup);
|
|
48
|
+
const lanes = hasRenderableSubgroup ? makeLanes(subgroup, uncategorizedLabel) : [{ type: "none" }];
|
|
49
|
+
const cells = [];
|
|
50
|
+
const cellsByKey = /* @__PURE__ */ new Map();
|
|
51
|
+
for (const lane of lanes) for (const column of columns) {
|
|
52
|
+
const coordinate = {
|
|
53
|
+
column,
|
|
54
|
+
lane
|
|
55
|
+
};
|
|
56
|
+
const cell = {
|
|
57
|
+
coordinate,
|
|
58
|
+
rows: []
|
|
59
|
+
};
|
|
60
|
+
cells.push(cell);
|
|
61
|
+
cellsByKey.set(cellKey(coordinate), cell);
|
|
62
|
+
}
|
|
63
|
+
for (const row of scopedRows) {
|
|
64
|
+
const columnValue = normalizeGroupValue(columns, resolveGroupValue({
|
|
65
|
+
grouping: group,
|
|
66
|
+
row
|
|
67
|
+
}));
|
|
68
|
+
const lane = !hasRenderableSubgroup ? { type: "none" } : {
|
|
69
|
+
group: {
|
|
70
|
+
value: normalizeGroupValue(lanes.filter((candidate) => candidate.type === "group").map((candidate) => candidate.group), resolveGroupValue({
|
|
71
|
+
grouping: subgroup,
|
|
72
|
+
row
|
|
73
|
+
})),
|
|
74
|
+
label: ""
|
|
75
|
+
},
|
|
76
|
+
type: "group"
|
|
77
|
+
};
|
|
78
|
+
const column = columns.find((candidate) => candidate.value === columnValue);
|
|
79
|
+
const resolvedLane = lane.type === "none" ? lane : lanes.find((candidate) => candidate.type === "group" && candidate.group.value === lane.group.value);
|
|
80
|
+
if (column === void 0 || resolvedLane === void 0) return panic("Kanban matrix cannot place a row in a declared cell");
|
|
81
|
+
const cell = cellsByKey.get(cellKey({
|
|
82
|
+
column,
|
|
83
|
+
lane: resolvedLane
|
|
84
|
+
}));
|
|
85
|
+
if (cell === void 0) return panic("Kanban matrix cell declaration is incomplete");
|
|
86
|
+
cell.rows.push(row);
|
|
87
|
+
}
|
|
88
|
+
return {
|
|
89
|
+
cells,
|
|
90
|
+
columns,
|
|
91
|
+
lanes,
|
|
92
|
+
rows: scopedRows
|
|
93
|
+
};
|
|
94
|
+
};
|
|
95
|
+
/**
|
|
96
|
+
* Builds a single mutation payload for a pointer, touch, or keyboard drop.
|
|
97
|
+
* Diagonal drops carry both changes together; an adapter must commit this
|
|
98
|
+
* intent atomically or reject it as a whole.
|
|
99
|
+
*/
|
|
100
|
+
const createKanbanDropIntent = ({ cardId, group, source, subgroup, target }) => {
|
|
101
|
+
const groupBy = getKanbanGroupingPropertyId(group);
|
|
102
|
+
const subgroupBy = getKanbanGroupingPropertyId(subgroup);
|
|
103
|
+
if (groupBy === null || subgroupBy !== null && subgroupBy === groupBy) return null;
|
|
104
|
+
const changes = [];
|
|
105
|
+
if (source.column.value !== target.column.value) changes.push({
|
|
106
|
+
groupBy,
|
|
107
|
+
value: target.column.value
|
|
108
|
+
});
|
|
109
|
+
if (subgroupBy !== null && source.lane.type === "group" && target.lane.type === "group" && source.lane.group.value !== target.lane.group.value) changes.push({
|
|
110
|
+
groupBy: subgroupBy,
|
|
111
|
+
value: target.lane.group.value
|
|
112
|
+
});
|
|
113
|
+
if (changes.length === 0) return null;
|
|
114
|
+
return {
|
|
115
|
+
cardId,
|
|
116
|
+
changes,
|
|
117
|
+
type: "move"
|
|
118
|
+
};
|
|
119
|
+
};
|
|
120
|
+
//#endregion
|
|
121
|
+
export { KANBAN_BOARD_AXES, buildKanbanBoardMatrix, createKanbanDropIntent, orderKanbanCellsByColumns };
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { KanbanGroup } from "./grouping.js";
|
|
2
|
+
import { KanbanBoardCell, KanbanBoardMatrix } from "./matrix.js";
|
|
3
|
+
import { ReactNode } from "react";
|
|
4
|
+
//#region src/kanban/subgroup-board.d.ts
|
|
5
|
+
type KanbanSubgroupColumnHeaderContext = {
|
|
6
|
+
column: KanbanGroup;
|
|
7
|
+
count: number;
|
|
8
|
+
};
|
|
9
|
+
type KanbanSubgroupLaneIdentityContext = {
|
|
10
|
+
group: KanbanGroup;
|
|
11
|
+
count: number;
|
|
12
|
+
};
|
|
13
|
+
type KanbanSubgroupCellContext<TRow> = {
|
|
14
|
+
cell: KanbanBoardCell<TRow>;
|
|
15
|
+
laneValue: string | null;
|
|
16
|
+
};
|
|
17
|
+
type KanbanSubgroupCollapseControl = {
|
|
18
|
+
isLaneCollapsed?: undefined;
|
|
19
|
+
onLaneCollapsedChange?: undefined;
|
|
20
|
+
} | {
|
|
21
|
+
isLaneCollapsed: (group: KanbanGroup, count: number) => boolean;
|
|
22
|
+
onLaneCollapsedChange: (group: KanbanGroup, collapsed: boolean) => void;
|
|
23
|
+
};
|
|
24
|
+
type KanbanSubgroupBoardProps<TRow> = {
|
|
25
|
+
matrix: KanbanBoardMatrix<TRow>;
|
|
26
|
+
renderColumnHeader: (context: KanbanSubgroupColumnHeaderContext) => ReactNode;
|
|
27
|
+
renderLaneIdentity: (context: KanbanSubgroupLaneIdentityContext) => ReactNode;
|
|
28
|
+
renderCell: (context: KanbanSubgroupCellContext<TRow>) => ReactNode;
|
|
29
|
+
formatCount?: ((count: number) => ReactNode) | undefined;
|
|
30
|
+
footer?: ReactNode;
|
|
31
|
+
className?: string | undefined;
|
|
32
|
+
} & KanbanSubgroupCollapseControl;
|
|
33
|
+
/** Reusable swimlane layout over the canonical two-axis Kanban matrix. */
|
|
34
|
+
declare const KanbanSubgroupBoard: <TRow>({ matrix, renderColumnHeader, renderLaneIdentity, renderCell, formatCount, isLaneCollapsed, onLaneCollapsedChange, footer, className }: KanbanSubgroupBoardProps<TRow>) => import("react").JSX.Element;
|
|
35
|
+
//#endregion
|
|
36
|
+
export { KanbanSubgroupBoard, KanbanSubgroupBoardProps, KanbanSubgroupCellContext, KanbanSubgroupColumnHeaderContext, KanbanSubgroupLaneIdentityContext };
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { cn } from "../lib/utils.js";
|
|
2
|
+
import { DirectionalIcon } from "../components/directional-icon.js";
|
|
3
|
+
import { ChevronDownIcon } from "lucide-react";
|
|
4
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
+
import { useMemo, useState } from "react";
|
|
6
|
+
//#region src/kanban/subgroup-board.tsx
|
|
7
|
+
const groupValueKey = (value) => value === null ? "null" : `value:${value.length}:${value}`;
|
|
8
|
+
/** Reusable swimlane layout over the canonical two-axis Kanban matrix. */
|
|
9
|
+
const KanbanSubgroupBoard = ({ matrix, renderColumnHeader, renderLaneIdentity, renderCell, formatCount = String, isLaneCollapsed, onLaneCollapsedChange, footer, className }) => {
|
|
10
|
+
const [collapsedLaneValues, setCollapsedLaneValues] = useState(() => /* @__PURE__ */ new Set());
|
|
11
|
+
const [expandedEmptyLaneValues, setExpandedEmptyLaneValues] = useState(() => /* @__PURE__ */ new Set());
|
|
12
|
+
const { cellsByLaneValue, countByColumnValue } = useMemo(() => {
|
|
13
|
+
const laneCells = /* @__PURE__ */ new Map();
|
|
14
|
+
const columnCounts = /* @__PURE__ */ new Map();
|
|
15
|
+
for (const cell of matrix.cells) {
|
|
16
|
+
columnCounts.set(cell.coordinate.column.value, (columnCounts.get(cell.coordinate.column.value) ?? 0) + cell.rows.length);
|
|
17
|
+
if (cell.coordinate.lane.type === "none") continue;
|
|
18
|
+
const laneValue = cell.coordinate.lane.group.value;
|
|
19
|
+
const currentLaneCells = laneCells.get(laneValue);
|
|
20
|
+
if (currentLaneCells) currentLaneCells.push(cell);
|
|
21
|
+
else laneCells.set(laneValue, [cell]);
|
|
22
|
+
}
|
|
23
|
+
return {
|
|
24
|
+
cellsByLaneValue: laneCells,
|
|
25
|
+
countByColumnValue: columnCounts
|
|
26
|
+
};
|
|
27
|
+
}, [matrix.cells]);
|
|
28
|
+
const setLaneCollapsed = (group, count, collapsed) => {
|
|
29
|
+
if (onLaneCollapsedChange) {
|
|
30
|
+
onLaneCollapsedChange(group, collapsed);
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
const value = group.value;
|
|
34
|
+
if (count === 0) {
|
|
35
|
+
setExpandedEmptyLaneValues((current) => {
|
|
36
|
+
const next = new Set(current);
|
|
37
|
+
if (collapsed) next.delete(value);
|
|
38
|
+
else next.add(value);
|
|
39
|
+
return next;
|
|
40
|
+
});
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
setCollapsedLaneValues((current) => {
|
|
44
|
+
const next = new Set(current);
|
|
45
|
+
if (collapsed) next.add(value);
|
|
46
|
+
else next.delete(value);
|
|
47
|
+
return next;
|
|
48
|
+
});
|
|
49
|
+
};
|
|
50
|
+
return /* @__PURE__ */ jsx("div", {
|
|
51
|
+
className: cn("h-full overflow-auto px-4 pb-4", className),
|
|
52
|
+
children: /* @__PURE__ */ jsxs("div", {
|
|
53
|
+
className: "min-w-max",
|
|
54
|
+
children: [
|
|
55
|
+
/* @__PURE__ */ jsx("div", {
|
|
56
|
+
className: "bg-background sticky top-0 z-20 flex gap-3 pt-4 pb-3",
|
|
57
|
+
children: matrix.columns.map((column) => /* @__PURE__ */ jsx("div", {
|
|
58
|
+
className: "w-[300px] shrink-0",
|
|
59
|
+
children: renderColumnHeader({
|
|
60
|
+
column,
|
|
61
|
+
count: countByColumnValue.get(column.value) ?? 0
|
|
62
|
+
})
|
|
63
|
+
}, groupValueKey(column.value)))
|
|
64
|
+
}),
|
|
65
|
+
matrix.lanes.map((lane) => {
|
|
66
|
+
if (lane.type === "none") return null;
|
|
67
|
+
const { group } = lane;
|
|
68
|
+
const cells = cellsByLaneValue.get(group.value) ?? [];
|
|
69
|
+
const count = cells.reduce((sum, cell) => sum + cell.rows.length, 0);
|
|
70
|
+
const defaultCollapsed = count === 0 ? !expandedEmptyLaneValues.has(group.value) : collapsedLaneValues.has(group.value);
|
|
71
|
+
const collapsed = isLaneCollapsed ? isLaneCollapsed(group, count) : defaultCollapsed;
|
|
72
|
+
return /* @__PURE__ */ jsxs("section", {
|
|
73
|
+
className: "border-border/60 border-b py-2 first:pt-0 last:border-b-0",
|
|
74
|
+
children: [/* @__PURE__ */ jsx("div", {
|
|
75
|
+
className: "bg-background/95 sticky start-0 z-10 flex min-h-11 items-center backdrop-blur-sm",
|
|
76
|
+
children: /* @__PURE__ */ jsxs("button", {
|
|
77
|
+
"aria-expanded": !collapsed,
|
|
78
|
+
className: "hover:bg-muted/60 flex min-h-11 items-center gap-2 rounded-lg px-2 text-start transition-[background-color]",
|
|
79
|
+
onClick: () => setLaneCollapsed(group, count, !collapsed),
|
|
80
|
+
type: "button",
|
|
81
|
+
children: [
|
|
82
|
+
/* @__PURE__ */ jsx(DirectionalIcon, {
|
|
83
|
+
className: cn("text-muted-foreground size-4 shrink-0 transition-transform", collapsed && "-rotate-90"),
|
|
84
|
+
flip: collapsed,
|
|
85
|
+
icon: ChevronDownIcon
|
|
86
|
+
}),
|
|
87
|
+
renderLaneIdentity({
|
|
88
|
+
group,
|
|
89
|
+
count
|
|
90
|
+
}),
|
|
91
|
+
/* @__PURE__ */ jsx("span", {
|
|
92
|
+
className: "text-muted-foreground text-xs tabular-nums",
|
|
93
|
+
children: formatCount(count)
|
|
94
|
+
})
|
|
95
|
+
]
|
|
96
|
+
})
|
|
97
|
+
}), !collapsed && /* @__PURE__ */ jsx("div", {
|
|
98
|
+
className: "flex gap-3 pb-1",
|
|
99
|
+
children: cells.map((cell) => /* @__PURE__ */ jsx("div", {
|
|
100
|
+
className: "w-[300px] shrink-0",
|
|
101
|
+
children: renderCell({
|
|
102
|
+
cell,
|
|
103
|
+
laneValue: group.value
|
|
104
|
+
})
|
|
105
|
+
}, groupValueKey(cell.coordinate.column.value)))
|
|
106
|
+
})]
|
|
107
|
+
}, groupValueKey(group.value));
|
|
108
|
+
}),
|
|
109
|
+
footer
|
|
110
|
+
]
|
|
111
|
+
})
|
|
112
|
+
});
|
|
113
|
+
};
|
|
114
|
+
//#endregion
|
|
115
|
+
export { KanbanSubgroupBoard };
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { Key, ReactNode, RefObject } from "react";
|
|
2
|
+
//#region src/kanban/virtual-cell.d.ts
|
|
3
|
+
declare const KANBAN_VIRTUAL_CELL_PAGINATION: {
|
|
4
|
+
readonly NONE: "none";
|
|
5
|
+
readonly CURSOR: "cursor";
|
|
6
|
+
};
|
|
7
|
+
type KanbanVirtualCellPagination = {
|
|
8
|
+
type: "none";
|
|
9
|
+
} | {
|
|
10
|
+
type: "cursor";
|
|
11
|
+
hasMore: boolean;
|
|
12
|
+
loading: boolean;
|
|
13
|
+
pageKey: string | number;
|
|
14
|
+
onRequestMore: () => void;
|
|
15
|
+
};
|
|
16
|
+
type KanbanVirtualCellProps<TRow> = {
|
|
17
|
+
rows: readonly TRow[];
|
|
18
|
+
getRowKey: (row: TRow) => Key;
|
|
19
|
+
renderRow: (row: TRow) => ReactNode;
|
|
20
|
+
pagination: KanbanVirtualCellPagination;
|
|
21
|
+
containerRef?: RefObject<HTMLDivElement | null> | undefined;
|
|
22
|
+
active?: boolean | undefined;
|
|
23
|
+
backgroundColor?: string | undefined;
|
|
24
|
+
footer?: ReactNode;
|
|
25
|
+
estimateSize?: number | undefined;
|
|
26
|
+
overscan?: number | undefined;
|
|
27
|
+
loadMoreThreshold?: number | undefined;
|
|
28
|
+
className?: string | undefined;
|
|
29
|
+
};
|
|
30
|
+
/** Bounded, virtualized Kanban cell with cursor-page request deduplication. */
|
|
31
|
+
declare const KanbanVirtualCell: <TRow>({ rows, getRowKey, renderRow, pagination, containerRef, active, backgroundColor, footer, estimateSize, overscan, loadMoreThreshold, className }: KanbanVirtualCellProps<TRow>) => import("react").JSX.Element;
|
|
32
|
+
//#endregion
|
|
33
|
+
export { KANBAN_VIRTUAL_CELL_PAGINATION, KanbanVirtualCell, KanbanVirtualCellPagination, KanbanVirtualCellProps };
|