@stll/ui 0.66.0 → 0.67.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.
Files changed (67) hide show
  1. package/dist/calendar/day-calendar.js +2 -2
  2. package/dist/components/alert-dialog.js +1 -1
  3. package/dist/components/animated-preview.js +1 -1
  4. package/dist/components/application-rail.js +1 -1
  5. package/dist/components/button.js +2 -2
  6. package/dist/components/checkbox.js +2 -2
  7. package/dist/components/color-picker.js +4 -4
  8. package/dist/components/combobox.js +4 -4
  9. package/dist/components/command.js +3 -3
  10. package/dist/components/composer.js +1 -1
  11. package/dist/components/context-menu.d.ts +10 -1
  12. package/dist/components/context-menu.js +9 -2
  13. package/dist/components/court-filter.js +2 -2
  14. package/dist/components/date-picker-popover.js +3 -3
  15. package/dist/components/destructive-action-confirmation.js +1 -1
  16. package/dist/components/details-grid.js +1 -1
  17. package/dist/components/dialog.js +3 -3
  18. package/dist/components/document-identity-badge.js +1 -1
  19. package/dist/components/entity-actions.d.ts +34 -0
  20. package/dist/components/entity-actions.js +132 -0
  21. package/dist/components/file-input.js +1 -1
  22. package/dist/components/hex-color-picker.js +1 -1
  23. package/dist/components/horizontal-scroller.js +2 -2
  24. package/dist/components/identity-text.js +1 -1
  25. package/dist/components/inline-rename.js +1 -1
  26. package/dist/components/input-group.js +3 -3
  27. package/dist/components/input.js +2 -2
  28. package/dist/components/kbd.js +1 -1
  29. package/dist/components/matter-icon.js +1 -1
  30. package/dist/components/menu.js +2 -2
  31. package/dist/components/number-input.js +1 -1
  32. package/dist/components/outline-rail.js +4 -4
  33. package/dist/components/popover.js +1 -1
  34. package/dist/components/segmented-icon-toggle.js +1 -1
  35. package/dist/components/select.js +3 -3
  36. package/dist/components/sheet.js +2 -2
  37. package/dist/components/sheet.native.js +1 -1
  38. package/dist/components/sidebar.js +4 -4
  39. package/dist/components/split-button.js +1 -1
  40. package/dist/components/tabs.js +1 -1
  41. package/dist/components/textarea.js +2 -2
  42. package/dist/components/toast.js +3 -3
  43. package/dist/components/tooltip.js +1 -1
  44. package/dist/components/truncated-text.js +2 -2
  45. package/dist/components/workspace-shell.js +3 -3
  46. package/dist/data-table/table.js +1 -1
  47. package/dist/index.js +34 -34
  48. package/dist/inspector/chrome.js +1 -1
  49. package/dist/inspector/dock.js +1 -1
  50. package/dist/inspector/entity-tab.js +2 -2
  51. package/dist/inspector/facet-bar.js +4 -4
  52. package/dist/inspector/index.js +2 -2
  53. package/dist/kanban/card-shell.js +1 -1
  54. package/dist/kanban/cell-action.js +1 -1
  55. package/dist/kanban/column-band-header.js +1 -1
  56. package/dist/kanban/index.js +5 -5
  57. package/dist/kanban/sortable-interactions.js +2 -2
  58. package/dist/kanban/subgroup-board.js +4 -4
  59. package/dist/kanban/virtual-cell.js +2 -2
  60. package/dist/lib/native-context-menu.d.ts +24 -0
  61. package/dist/lib/native-context-menu.js +85 -0
  62. package/dist/review/review-author-avatar.js +1 -1
  63. package/dist/review/review-comment-card.js +2 -2
  64. package/dist/review/review-decision-actions.js +1 -1
  65. package/dist/review/review-out-of-date-notice.js +1 -1
  66. package/dist/styles/theme.css +23 -23
  67. package/package.json +14 -6
@@ -1,11 +1,11 @@
1
1
  "use client";
2
2
  import { XIcon } from "../icons.js";
3
- import { cn } from "../lib/utils.js";
4
3
  import { OVERLAY_LAYER_CLASS_NAMES } from "../lib/overlay-layer.js";
5
4
  import "../lib/safe-area.js";
6
- import { renderTooltipTrigger } from "./tooltip-trigger-helper.js";
5
+ import { cn } from "../lib/utils.js";
7
6
  import { Button } from "./button.js";
8
7
  import { ScrollArea } from "./scroll-area.js";
8
+ import { renderTooltipTrigger } from "./tooltip-trigger-helper.js";
9
9
  import { jsx, jsxs } from "react/jsx-runtime";
10
10
  import { Dialog } from "@base-ui/react/dialog";
11
11
  // src/components/sheet.tsx
@@ -1,5 +1,5 @@
1
- import { Text as Text$1 } from "./text.native.js";
2
1
  import { Button } from "./button.native.js";
2
+ import { Text as Text$1 } from "./text.native.js";
3
3
  import { jsx } from "react/jsx-runtime";
4
4
  import { createContext, use } from "react";
5
5
  import { KeyboardAvoidingView, Modal, Platform, ScrollView, View } from "react-native";
@@ -1,15 +1,15 @@
1
1
  "use client";
2
+ import { useIsMobile } from "../hooks/use-mobile.js";
2
3
  import { PanelLeftIcon, PanelRightIcon } from "../icons.js";
4
+ import { Slot } from "../lib/slot.js";
3
5
  import { cn } from "../lib/utils.js";
4
- import { Tooltip, TooltipContent as TooltipPopup, TooltipTrigger } from "./tooltip.js";
5
- import { useIsMobile } from "../hooks/use-mobile.js";
6
6
  import { Button } from "./button.js";
7
- import { Sheet, SheetContent as SheetPopup, SheetDescription, SheetHeader, SheetTitle } from "./sheet.js";
8
7
  import { Input } from "./input.js";
9
8
  import { Separator } from "./separator.js";
10
- import { Slot } from "../lib/slot.js";
9
+ import { Sheet, SheetContent as SheetPopup, SheetDescription, SheetHeader, SheetTitle } from "./sheet.js";
11
10
  import { deriveSidebarState, nextOpenMobile, nextRequestedOpen, resolveSidebarLayout, resolveSidebarOpen } from "./sidebar.logic.js";
12
11
  import { Skeleton } from "./skeleton.js";
12
+ import { Tooltip, TooltipContent as TooltipPopup, TooltipTrigger } from "./tooltip.js";
13
13
  import { jsx, jsxs } from "react/jsx-runtime";
14
14
  import { createContext, use, useId, useState } from "react";
15
15
  import { mergeProps } from "@base-ui/react/merge-props";
@@ -2,8 +2,8 @@
2
2
  import { ChevronDownIcon } from "../icons.js";
3
3
  import { cn } from "../lib/utils.js";
4
4
  import { BUTTON_CONTENT, Button } from "./button.js";
5
- import { Popover, PopoverTrigger } from "./popover.js";
6
5
  import { DropdownMenu as Menu, DropdownMenuTrigger as MenuTrigger } from "./menu.js";
6
+ import { Popover, PopoverTrigger } from "./popover.js";
7
7
  import { jsx, jsxs } from "react/jsx-runtime";
8
8
  // src/components/split-button.tsx
9
9
  /** Two independent actions share quiet chrome; only the chevron opens the secondary surface. */
@@ -1,6 +1,6 @@
1
1
  "use client";
2
- import { cn, composeRefs } from "../lib/utils.js";
3
2
  import { hasTabOrderChanged, revealActiveTab } from "../lib/tab-order.js";
3
+ import { cn, composeRefs } from "../lib/utils.js";
4
4
  import { jsx, jsxs } from "react/jsx-runtime";
5
5
  import { useEffect, useLayoutEffect, useRef, useState } from "react";
6
6
  import { Tabs as Tabs$1 } from "@base-ui/react/tabs";
@@ -1,7 +1,7 @@
1
1
  "use client";
2
- import { cn } from "../lib/utils.js";
3
- import { CONTROL_SIZE } from "../lib/control-size.js";
4
2
  import { useContentDir } from "../hooks/use-content-dir.js";
3
+ import { CONTROL_SIZE } from "../lib/control-size.js";
4
+ import { cn } from "../lib/utils.js";
5
5
  import { INLINE_FIELD_CLASS_NAME } from "./input-control.js";
6
6
  import { jsx, jsxs } from "react/jsx-runtime";
7
7
  import { useState } from "react";
@@ -1,9 +1,9 @@
1
1
  "use client";
2
2
  import { CircleAlertIcon, CircleCheckIcon, InfoIcon, TriangleAlertIcon, XIcon } from "../icons.js";
3
- import { cn } from "../lib/utils.js";
4
3
  import { SAFE_AREA_TOAST_GEOMETRY_CLASS_NAME } from "../lib/safe-area.js";
5
- import { Loader } from "./loader.js";
4
+ import { cn } from "../lib/utils.js";
6
5
  import { buttonVariants } from "./button.js";
6
+ import { Loader } from "./loader.js";
7
7
  import { ScrollArea } from "./scroll-area.js";
8
8
  import { jsx, jsxs } from "react/jsx-runtime";
9
9
  import * as React$1 from "react";
@@ -108,7 +108,7 @@ const Toasts = ({ position }) => {
108
108
  "data-slot": "toast-action",
109
109
  children: toastItem.actionProps.children
110
110
  }), /* @__PURE__ */ jsx(Toast.Close, {
111
- className: "text-muted-foreground hover:text-foreground shrink-0 cursor-pointer rounded p-0.5 select-none",
111
+ className: "text-muted-foreground hover:text-foreground shrink-0 cursor-pointer rounded-sm p-0.5 select-none",
112
112
  "data-slot": "toast-close",
113
113
  "aria-label": "Close notification",
114
114
  children: /* @__PURE__ */ jsx(XIcon, { className: "size-4" })
@@ -1,7 +1,7 @@
1
1
  "use client";
2
- import { cn } from "../lib/utils.js";
3
2
  import { OVERLAY_LAYER_CLASS_NAMES } from "../lib/overlay-layer.js";
4
3
  import { CONTENT_SIZED_POSITIONER_CLASS_NAME, IN_FLOW_POPUP_CLASS_NAME } from "../lib/positioner-sizing.js";
4
+ import { cn } from "../lib/utils.js";
5
5
  import { Kbd } from "./kbd.js";
6
6
  import { jsx, jsxs } from "react/jsx-runtime";
7
7
  import { Tooltip as Tooltip$1 } from "@base-ui/react/tooltip";
@@ -1,8 +1,8 @@
1
1
  "use client";
2
- import { cn } from "../lib/utils.js";
3
- import { Tooltip, TooltipContent as TooltipPopup, TooltipTrigger } from "./tooltip.js";
4
2
  import { containedEventHandler } from "../hooks/use-contained-handler.js";
3
+ import { cn } from "../lib/utils.js";
5
4
  import { Popover, PopoverContent as PopoverPopup } from "./popover.js";
5
+ import { Tooltip, TooltipContent as TooltipPopup, TooltipTrigger } from "./tooltip.js";
6
6
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
7
7
  import * as React$1 from "react";
8
8
  import { mergeProps } from "@base-ui/react/merge-props";
@@ -1,10 +1,10 @@
1
1
  "use client";
2
+ import { useIsMobile } from "../hooks/use-mobile.js";
2
3
  import { NewChatIcon } from "../icons.js";
3
- import { cn } from "../lib/utils.js";
4
+ import { InspectorRail, InspectorRailCell, InspectorRailContent, InspectorRailFooter, InspectorRailIconButton } from "../inspector/chrome.js";
4
5
  import { SHELL_CHROME_LAYER_CLASS_NAME } from "../lib/overlay-layer.js";
5
6
  import { SAFE_AREA_BOTTOM_EDGE_CLASS_NAME, SAFE_AREA_TOP_EDGE_CLASS_NAME } from "../lib/safe-area.js";
6
- import { useIsMobile } from "../hooks/use-mobile.js";
7
- import { InspectorRail, InspectorRailCell, InspectorRailContent, InspectorRailFooter, InspectorRailIconButton } from "../inspector/chrome.js";
7
+ import { cn } from "../lib/utils.js";
8
8
  import { Sheet, SheetContent as SheetPopup, SheetTitle, SheetTrigger } from "./sheet.js";
9
9
  import { jsx, jsxs } from "react/jsx-runtime";
10
10
  import { useEffect } from "react";
@@ -1,7 +1,7 @@
1
- import { cn } from "../lib/utils.js";
2
1
  import { Button } from "../components/button.js";
3
2
  import { Skeleton } from "../components/skeleton.js";
4
3
  import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "../components/table.js";
4
+ import { cn } from "../lib/utils.js";
5
5
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
6
6
  // src/data-table/table.tsx
7
7
  const DataTable = ({ columns, emptyLabel, getRowProps, isLoading = false, loadingLabel, loadingRowCount = DEFAULT_LOADING_ROW_COUNT, rowAction, rowKey, rows }) => {
package/dist/index.js CHANGED
@@ -1,84 +1,84 @@
1
- import { cn, composeRefs } from "./lib/utils.js";
2
1
  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
2
  import { APPLICATION_RAIL_BUTTON_SIZE, APPLICATION_RAIL_ICON_SIZE, APPLICATION_RAIL_WIDTH, ApplicationRail, ApplicationRailButton, ApplicationRailContent, ApplicationRailFooter, ApplicationRailHeader, ApplicationRailMenu, ApplicationRailSeparator } from "./components/application-rail.js";
5
- import { BOARD_DRAG_OVERLAY_Z_INDEX, OVERLAY_COLLISION_PADDING, OVERLAY_LAYER_CLASS_NAMES, SHELL_CHROME_LAYER_CLASS_NAME } from "./lib/overlay-layer.js";
6
- import { Kbd, formatKeys, kbdPlatformOf, useKbdPlatform } from "./components/kbd.js";
7
- import { TOOLTIP_OPEN_DELAY_MS, Tooltip, TooltipContent as TooltipPopup, TooltipCreateHandle, TooltipFactTrigger, TooltipProvider, TooltipTrigger } from "./components/tooltip.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";
8
4
  import { AlertDialog, AlertDialogBackdrop, AlertDialogClose, AlertDialogContent as AlertDialogPopup, AlertDialogCreateHandle, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogPanel, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AlertDialogViewport } from "./components/alert-dialog.js";
9
- import { useIsMobile } from "./hooks/use-mobile.js";
10
- import { BidiText, UserText, stripDirectionalControls, withoutDirectionalControls } from "./components/bidi-text.js";
11
- import { Inspector, InspectorActions, InspectorContent, InspectorDescription, InspectorEmptyRow, InspectorHeader, InspectorHeaderText, InspectorProperty, InspectorPropertyLabel, InspectorPropertyList, InspectorPropertyValue, InspectorRail, InspectorRailCell, InspectorRailContent, InspectorRailFooter, InspectorRailIconButton, InspectorRailTab, InspectorSection, InspectorSectionTitle, InspectorTitle } from "./inspector/chrome.js";
12
- import { StellaMark } from "./components/stella-mark.js";
13
- import { BUTTON_CONTENT, BUTTON_SIZE_CONTENT, Button, ButtonTextRun, buttonAccessibleDisabledClass, buttonVariants } from "./components/button.js";
14
- import { ScrollArea, ScrollBar } from "./components/scroll-area.js";
15
- import { Sheet, SheetBackdrop, SheetClose, SheetContent as SheetPopup, SheetDescription, SheetFooter, SheetHeader, SheetPanel, SheetPortal, SheetTitle, SheetTrigger } from "./components/sheet.js";
16
5
  import { WorkspaceEndRail, WorkspaceShell } from "./components/workspace-shell.js";
17
6
  import { Avatar, AvatarFallback, AvatarImage } from "./components/avatar.js";
18
7
  import { Badge, badgeVariants } from "./components/badge.js";
8
+ import { BidiText, UserText, stripDirectionalControls, withoutDirectionalControls } from "./components/bidi-text.js";
19
9
  import { DiscordLogoIcon, GitHubLogoIcon, XLogoIcon } from "./components/brand-icons.js";
20
- import { DirectionalIcon } from "./components/directional-icon.js";
21
10
  import { Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator } from "./components/breadcrumb.js";
11
+ import { Inspector, InspectorActions, InspectorContent, InspectorDescription, InspectorEmptyRow, InspectorHeader, InspectorHeaderText, InspectorProperty, InspectorPropertyLabel, InspectorPropertyList, InspectorPropertyValue, InspectorRail, InspectorRailCell, InspectorRailContent, InspectorRailFooter, InspectorRailIconButton, InspectorRailTab, InspectorSection, InspectorSectionTitle, InspectorTitle } from "./inspector/chrome.js";
12
+ import { BUTTON_CONTENT, BUTTON_SIZE_CONTENT, Button, ButtonTextRun, buttonAccessibleDisabledClass, buttonVariants } from "./components/button.js";
22
13
  import { Checkbox } from "./components/checkbox.js";
23
14
  import { Collapsible, CollapsiblePanel, CollapsibleTrigger } from "./components/collapsible.js";
24
15
  import { ColorPicker, ColorPickerContent, DEFAULT_PRESETS } from "./components/color-picker.js";
25
- import { containedEventHandler, containedHandler } from "./hooks/use-contained-handler.js";
26
- import { CONTROL_SIZE, CONTROL_SIZES } from "./lib/control-size.js";
27
- import { contentDir, isStructuredInputType, useContentDir } from "./hooks/use-content-dir.js";
28
- import { Input } from "./components/input.js";
29
16
  import { Combobox, ComboboxChip, ComboboxChips, ComboboxChipsInput, ComboboxClear, ComboboxCollection, ComboboxEmpty, ComboboxGroup, ComboboxGroupLabel, ComboboxInput, ComboboxItem, ComboboxList, ComboboxPopup, ComboboxRow, ComboboxSeparator, ComboboxStatus, ComboboxTrigger, ComboboxValue } from "./components/combobox.js";
30
- import { DialogFormState } from "./components/dialog-form-state.js";
31
- import { DIALOG_MOBILE_LAYOUT, DIALOG_SIZE_CLASS_NAMES, Dialog, DialogBackdrop, DialogClose, DialogContent as DialogPopup, DialogCreateHandle, DialogDescription, DialogFooter, DialogHeader, DialogPanel, DialogPortal, DialogProvider, DialogTitle, DialogTrigger, DialogViewport } from "./components/dialog.js";
32
17
  import { Command, CommandCollection, CommandDialog, CommandDialogPopup, CommandDialogTrigger, CommandEmpty, CommandFooter, CommandGroup, CommandGroupLabel, CommandInput, CommandItem, CommandList, CommandPanel, CommandSeparator, CommandShortcut } from "./components/command.js";
33
18
  import { COPIED_RESET_MS, CopyButton, CopyFeedback, useCopiedFeedback, useCopyConfirmation } from "./components/copy-button.js";
34
19
  import { CalendarCell, CalendarEntryButton, CalendarEntrySurface, CalendarGrid, CalendarHeaderCell, CalendarHeaderRow } from "./calendar/primitives.js";
35
- import { assertConsecutiveCalendarDates, getResourceCalendarPlacement, layoutResourceCalendarEntries, nextCalendarDate } from "./calendar/resource-calendar.logic.js";
36
20
  import { ResourceCalendar } from "./calendar/resource-calendar.js";
37
- import { getFirstWeekday, getLocaleWeekInfo, getWeekendDays } from "./lib/week.js";
38
- import { Popover, PopoverClose, PopoverContent as PopoverPopup, PopoverCreateHandle, PopoverDescription, PopoverPanel, PopoverTitle, PopoverTrigger } from "./components/popover.js";
39
- import { useLatest } from "./hooks/use-latest.js";
40
- import { Select, SelectContent as SelectPopup, SelectGroup, SelectGroupLabel, SelectItem, SelectSeparator, SelectTrigger, SelectValue } from "./components/select.js";
21
+ import { assertConsecutiveCalendarDates, getResourceCalendarPlacement, layoutResourceCalendarEntries, nextCalendarDate } from "./calendar/resource-calendar.logic.js";
41
22
  import { DatePickerPopover } from "./components/date-picker-popover.js";
42
23
  import { DetailsGrid, DetailsItem } from "./components/details-grid.js";
43
- import { Field, FieldControl, FieldDescription, FieldError, FieldItem, FieldLabel, FieldValidity } from "./components/field.js";
44
24
  import { DestructiveActionConfirmation, useDestructiveActionConfirmation } from "./components/destructive-action-confirmation.js";
45
25
  import { DestructiveConfirmDialog } from "./components/destructive-confirm-dialog.js";
26
+ import { DIALOG_MOBILE_LAYOUT, DIALOG_SIZE_CLASS_NAMES, Dialog, DialogBackdrop, DialogClose, DialogContent as DialogPopup, DialogCreateHandle, DialogDescription, DialogFooter, DialogHeader, DialogPanel, DialogPortal, DialogProvider, DialogTitle, DialogTrigger, DialogViewport } from "./components/dialog.js";
27
+ import { DirectionalIcon } from "./components/directional-icon.js";
28
+ import { Field, FieldControl, FieldDescription, FieldError, FieldItem, FieldLabel, FieldValidity } from "./components/field.js";
46
29
  import { FileInput } from "./components/file-input.js";
30
+ import { DialogFormState } from "./components/dialog-form-state.js";
47
31
  import { Form, formVariants } from "./components/form.js";
48
32
  import { Frame, FrameDescription, FrameFooter, FrameHeader, FramePanel, FrameTitle } from "./components/frame.js";
49
33
  import { HexColorPicker } from "./components/hex-color-picker.js";
34
+ import { Input } from "./components/input.js";
50
35
  import { InlineRenameInput } from "./components/inline-rename.js";
51
- import { Textarea } from "./components/textarea.js";
52
36
  import { InputGroup, InputGroupAddon, InputGroupInput, InputGroupText, InputGroupTextarea } from "./components/input-group.js";
53
37
  import { List, ListEmpty, ListGroup, ListGroupAction, ListGroupCount, ListGroupDescription, ListGroupHeader, ListGroupHeading, ListGroupTitle, ListItem, ListItemActions, ListItemContent, ListItemDescription, ListItemMedia, ListItemStatus, ListItemTitle } from "./components/list.js";
54
38
  import { SearchField } from "./components/search-field.js";
55
39
  import { InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot } from "./components/input-otp.js";
40
+ import { Kbd, formatKeys, kbdPlatformOf, useKbdPlatform } from "./components/kbd.js";
56
41
  import { Label } from "./components/label.js";
57
42
  import { DropdownMenu as Menu, DropdownMenuCheckboxItem as MenuCheckboxItem, DropdownMenuContent as MenuPopup, DropdownMenuCreateHandle as MenuCreateHandle, DropdownMenuGroup as MenuGroup, DropdownMenuItem as MenuItem, DropdownMenuLabel as MenuGroupLabel, DropdownMenuLinkItem as MenuLinkItem, DropdownMenuPortal as MenuPortal, DropdownMenuRadioGroup as MenuRadioGroup, DropdownMenuRadioItem as MenuRadioItem, DropdownMenuSeparator as MenuSeparator, DropdownMenuShortcut as MenuShortcut, DropdownMenuSub as MenuSub, DropdownMenuSubContent as MenuSubPopup, DropdownMenuSubTrigger as MenuSubTrigger, DropdownMenuTrigger as MenuTrigger, MenuAnchor } from "./components/menu.js";
58
43
  import { MenuSection } from "./components/menu-section.js";
59
- import { getInitials } from "./lib/initials.js";
60
- import { ReviewAuthorAvatar, UNKNOWN_AUTHOR_LABEL } from "./review/review-author-avatar.js";
61
44
  import { OUTLINE_CONTROL_MIN_SIZE, OUTLINE_EMPHASIS, OutlineRail, outlineEntryText } from "./components/outline-rail.js";
62
45
  import { Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious } from "./components/pagination.js";
46
+ import { Popover, PopoverClose, PopoverContent as PopoverPopup, PopoverCreateHandle, PopoverDescription, PopoverPanel, PopoverTitle, PopoverTrigger } from "./components/popover.js";
63
47
  import { HoverCard as PreviewCard, HoverCardContent as PreviewCardPopup, HoverCardTrigger as PreviewCardTrigger, PreviewCardPrimitive } from "./components/preview-card.js";
64
48
  import { MenuPreviewLayout, PreviewPane } from "./components/preview-pane.js";
65
49
  import { LEGAL_TEXT_CLASS_NAME, Prose } from "./components/prose.js";
50
+ import { ScrollArea, ScrollBar } from "./components/scroll-area.js";
66
51
  import { ScrollToTop } from "./components/scroll-to-top.js";
67
52
  import { SecretInput } from "./components/secret-input.js";
68
- import { Toggle } from "./components/toggle.js";
69
- import { ToggleGroup, ToggleGroupItem } from "./components/toggle-group.js";
70
53
  import { SegmentedIconToggle } from "./components/segmented-icon-toggle.js";
54
+ import { Select, SelectContent as SelectPopup, SelectGroup, SelectGroupLabel, SelectItem, SelectSeparator, SelectTrigger, SelectValue } from "./components/select.js";
71
55
  import { ResizeSeparator, Separator, TextSeparator } from "./components/separator.js";
72
- import { Skeleton } from "./components/skeleton.js";
56
+ import { Sheet, SheetBackdrop, SheetClose, SheetContent as SheetPopup, SheetDescription, SheetFooter, SheetHeader, SheetPanel, SheetPortal, SheetTitle, SheetTrigger } from "./components/sheet.js";
73
57
  import { PanelTrigger, SIDEBAR_WIDTH_ICON_PX, SIDEBAR_WIDTH_PX, Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarIdentityButton, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, sidebarIdentityTriggerClassName, useSidebar, useSidebarInlineSize, useSidebarLayout } from "./components/sidebar.js";
58
+ import { Skeleton } from "./components/skeleton.js";
59
+ import { StellaMark } from "./components/stella-mark.js";
74
60
  import { StellaWordmarkLatin } from "./components/stella-wordmark.js";
75
61
  import { SortableHead, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow } from "./components/table.js";
76
62
  import { Tabs, TabsContent as TabsPanel, TabsList, TabsTab } from "./components/tabs.js";
63
+ import { Textarea } from "./components/textarea.js";
77
64
  import { AnchoredToastProvider, TOAST_RIGHT_OFFSET_VAR, ToastProvider, resolveToastUpdateTimeout, stellaToast, toastCountdownMs, toastDedupeId } from "./components/toast.js";
65
+ import { Toggle } from "./components/toggle.js";
66
+ import { ToggleGroup, ToggleGroupItem } from "./components/toggle-group.js";
67
+ import { TOOLTIP_OPEN_DELAY_MS, Tooltip, TooltipContent as TooltipPopup, TooltipCreateHandle, TooltipFactTrigger, TooltipProvider, TooltipTrigger } from "./components/tooltip.js";
78
68
  import { TruncatedText, isTextOverflowing } from "./components/truncated-text.js";
69
+ import { containedEventHandler, containedHandler } from "./hooks/use-contained-handler.js";
70
+ import { contentDir, isStructuredInputType, useContentDir } from "./hooks/use-content-dir.js";
71
+ import { useLatest } from "./hooks/use-latest.js";
72
+ import { useIsMobile } from "./hooks/use-mobile.js";
73
+ import { useViewportWidth } from "./hooks/use-viewport-width.js";
74
+ import { CONTROL_SIZE, CONTROL_SIZES } from "./lib/control-size.js";
75
+ import { getInitials } from "./lib/initials.js";
76
+ import { emptyColor, optionColors, resolveOptionColor } from "./lib/option-color.js";
77
+ import { BOARD_DRAG_OVERLAY_Z_INDEX, OVERLAY_COLLISION_PADDING, OVERLAY_LAYER_CLASS_NAMES, SHELL_CHROME_LAYER_CLASS_NAME } from "./lib/overlay-layer.js";
78
+ import { typedCharacter } from "./lib/typed-character.js";
79
79
  import { duplicateColumnIds, findTableColumn, hideableColumnIds, sortableColumnIds, tableColumnIds, tableColumnSizing, visibleColumnIds } from "./data-table/schema.js";
80
80
  import { DataTable } from "./data-table/table.js";
81
- import { useViewportWidth } from "./hooks/use-viewport-width.js";
81
+ import { cn, composeRefs } from "./lib/utils.js";
82
82
  import { INSPECTOR_CONTENT_MIN_WIDTH, INSPECTOR_EDITOR_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";
83
83
  import { InspectorDock } from "./inspector/dock.js";
84
84
  import { InspectorEntityTab, entityTabGlyph } from "./inspector/entity-tab.js";
@@ -100,9 +100,9 @@ import { KANBAN_DIRECTIONS, KANBAN_HORIZONTAL_EDGES, getKanbanHorizontalEdge } f
100
100
  import { KANBAN_BOARD_AUTO_SCROLL_SOURCES, KANBAN_CARD_DRAG_MIME, registerKanbanBoardAutoScroll, registerKanbanCardDrag } from "./kanban/drag-interactions.js";
101
101
  import { KANBAN_BAND_PEEK_DELAY_MS, KANBAN_BAND_PEEK_LINGER_MS } from "./kanban/band-peek.js";
102
102
  import { KanbanSubgroupBoard } from "./kanban/subgroup-board.js";
103
- import { emptyColor, optionColors, resolveOptionColor } from "./lib/option-color.js";
103
+ import { getFirstWeekday, getLocaleWeekInfo, getWeekendDays } from "./lib/week.js";
104
104
  import { KANBAN_VIRTUAL_CELL_PAGINATION, KanbanVirtualCell } from "./kanban/virtual-cell.js";
105
- import { typedCharacter } from "./lib/typed-character.js";
105
+ import { ReviewAuthorAvatar, UNKNOWN_AUTHOR_LABEL } from "./review/review-author-avatar.js";
106
106
  import { ReviewCommentCard } from "./review/review-comment-card.js";
107
107
  import { ReviewDecisionActions } from "./review/review-decision-actions.js";
108
108
  import { ReviewDiffDeletion, ReviewDiffInsertion, ReviewDiffText, TRACKED_DELETION_STYLE, TRACKED_INSERTION_STYLE, reviewDiffSegmentKeys } from "./review/review-diff-text.js";
@@ -1,6 +1,6 @@
1
+ import { withoutDirectionalControls } from "../components/bidi-text.js";
1
2
  import { cn } from "../lib/utils.js";
2
3
  import { PROPERTY_ROW_GRID, SIDE_RAIL_CONTAINER_CLASS, SIDE_RAIL_ICON_BUTTON_SIZE, TOOLBAR_ROW_HEIGHT } from "./layout-tokens.js";
3
- import { withoutDirectionalControls } from "../components/bidi-text.js";
4
4
  import { jsx } from "react/jsx-runtime";
5
5
  // src/inspector/chrome.tsx
6
6
  /**
@@ -1,6 +1,6 @@
1
1
  import { EllipsisIcon } from "../icons.js";
2
- import { cn } from "../lib/utils.js";
3
2
  import { SHELL_CHROME_LAYER_CLASS_NAME } from "../lib/overlay-layer.js";
3
+ import { cn } from "../lib/utils.js";
4
4
  import "./pane-width.js";
5
5
  import { jsx, jsxs } from "react/jsx-runtime";
6
6
  // src/inspector/dock.tsx
@@ -1,7 +1,7 @@
1
- import { cn } from "../lib/utils.js";
2
1
  import { Tooltip, TooltipContent as TooltipPopup, TooltipTrigger } from "../components/tooltip.js";
3
- import { InspectorRailTab } from "./chrome.js";
4
2
  import { containedEventHandler } from "../hooks/use-contained-handler.js";
3
+ import { cn } from "../lib/utils.js";
4
+ import { InspectorRailTab } from "./chrome.js";
5
5
  import { resolveEntityTabActivateHandler, resolveEntityTabCloseHandler } from "./entity-tab.logic.js";
6
6
  import { jsx, jsxs } from "react/jsx-runtime";
7
7
  // src/inspector/entity-tab.tsx
@@ -1,10 +1,10 @@
1
- import { ChevronDownIcon } from "../icons.js";
2
- import { cn } from "../lib/utils.js";
3
- import { TOOLBAR_ROW_HEIGHT } from "./layout-tokens.js";
4
- import { Tooltip, TooltipContent as TooltipPopup, TooltipTrigger } from "../components/tooltip.js";
5
1
  import { Button } from "../components/button.js";
6
2
  import { DropdownMenu as Menu, DropdownMenuContent as MenuPopup, DropdownMenuItem as MenuItem, DropdownMenuTrigger as MenuTrigger } from "../components/menu.js";
3
+ import { Tooltip, TooltipContent as TooltipPopup, TooltipTrigger } from "../components/tooltip.js";
4
+ import { ChevronDownIcon } from "../icons.js";
5
+ import { cn } from "../lib/utils.js";
7
6
  import { resolveFacetOverflow } from "./facet-bar.logic.js";
7
+ import { TOOLBAR_ROW_HEIGHT } from "./layout-tokens.js";
8
8
  import { jsx, jsxs } from "react/jsx-runtime";
9
9
  import { useEffect, useRef, useState } from "react";
10
10
  // src/inspector/facet-bar.tsx
@@ -1,8 +1,8 @@
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
1
  import { Inspector, InspectorActions, InspectorContent, InspectorDescription, InspectorEmptyRow, InspectorHeader, InspectorHeaderText, InspectorProperty, InspectorPropertyLabel, InspectorPropertyList, InspectorPropertyValue, InspectorRail, InspectorRailCell, InspectorRailContent, InspectorRailFooter, InspectorRailIconButton, InspectorRailTab, InspectorSection, InspectorSectionTitle, InspectorTitle } from "./chrome.js";
3
- import { INSPECTOR_CONTENT_MIN_WIDTH, INSPECTOR_EDITOR_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";
4
2
  import { InspectorDock } from "./dock.js";
5
3
  import { InspectorEntityTab, entityTabGlyph } from "./entity-tab.js";
6
4
  import { InspectorFacetBar } from "./facet-bar.js";
5
+ 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";
6
+ import { INSPECTOR_CONTENT_MIN_WIDTH, INSPECTOR_EDITOR_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";
7
7
  import { INSPECTOR_PANE_KEYBOARD_PAGE_STEP, INSPECTOR_PANE_KEYBOARD_STEP, resolveDragWidth, resolveKeyboardWidth, useInspectorPaneWidth } from "./use-pane-width.js";
8
8
  export { 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, Inspector, InspectorActions, InspectorContent, InspectorDescription, InspectorDock, InspectorEmptyRow, InspectorEntityTab, InspectorFacetBar, InspectorHeader, InspectorHeaderText, InspectorProperty, InspectorPropertyLabel, InspectorPropertyList, InspectorPropertyValue, InspectorRail, InspectorRailCell, InspectorRailContent, InspectorRailFooter, 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, entityTabGlyph, resolveDragWidth, resolveInspectorDockWidth, resolveInspectorPaneMaxWidth, resolveInspectorPaneWidth, resolveKeyboardWidth, shouldForceSidebarCollapsed, useInspectorPaneWidth };
@@ -1,5 +1,5 @@
1
- import { cn } from "../lib/utils.js";
2
1
  import { containedEventHandler } from "../hooks/use-contained-handler.js";
2
+ import { cn } from "../lib/utils.js";
3
3
  import { KANBAN_CARD_STICKY_TOP_CLASS } from "./sticky-lane.js";
4
4
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
5
5
  // src/kanban/card-shell.tsx
@@ -1,6 +1,6 @@
1
+ import { Button } from "../components/button.js";
1
2
  import { PlusIcon } from "../icons.js";
2
3
  import { cn } from "../lib/utils.js";
3
- import { Button } from "../components/button.js";
4
4
  import "./layout-tokens.js";
5
5
  import { jsx, jsxs } from "react/jsx-runtime";
6
6
  // src/kanban/cell-action.tsx
@@ -1,6 +1,6 @@
1
+ import { DirectionalIcon } from "../components/directional-icon.js";
1
2
  import { ChevronDownIcon } from "../icons.js";
2
3
  import { cn } from "../lib/utils.js";
3
- import { DirectionalIcon } from "../components/directional-icon.js";
4
4
  import { KANBAN_CHROME_TOGGLE_COARSE_TARGET_CLASS } from "./layout-tokens.js";
5
5
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
6
6
  // src/kanban/column-band-header.tsx
@@ -1,18 +1,18 @@
1
1
  import { selectKanbanCardFieldIds } from "./card-properties.js";
2
- import { KANBAN_CARD_STICKY_TOP_VAR, KANBAN_STICKY_TOP_VAR, KanbanCollapsedBandCaption } from "./sticky-lane.js";
3
2
  import { KanbanCardShell } from "./card-shell.js";
4
- import { KANBAN_BAND_CAPTION_ROW_HEIGHT, KANBAN_BAND_CAPTION_ROW_HEIGHT_PX, KANBAN_CHROME_ROW_HEIGHT, KANBAN_CHROME_ROW_HEIGHT_PX } from "./layout-tokens.js";
5
3
  import { KanbanCellAction } from "./cell-action.js";
6
4
  import { KanbanColumnBandHeader } from "./column-band-header.js";
7
- import { getKanbanGroupingPropertyId, getKanbanGroups, isKanbanGroupingRenderable, resolveKanbanGroupOptions, resolveKanbanGrouping, selectKanbanRows } from "./grouping.js";
8
- import { KANBAN_BOARD_AXES, buildKanbanBoardMatrix, createKanbanDropIntent, getKanbanBoardColumnIdentity, getKanbanBoardLaneIdentity, orderKanbanCellsByColumns } from "./matrix.js";
9
5
  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";
10
6
  import { KanbanColumnHeader } from "./column-header.js";
11
- import { KANBAN_BOARD_COLLISION_DETECTION, kanbanKeyboardCoordinates } from "./sortable-interactions.logic.js";
7
+ import { KANBAN_BAND_CAPTION_ROW_HEIGHT, KANBAN_BAND_CAPTION_ROW_HEIGHT_PX, KANBAN_CHROME_ROW_HEIGHT, KANBAN_CHROME_ROW_HEIGHT_PX } from "./layout-tokens.js";
12
8
  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, useKanbanDropTarget, useKanbanSortable, useKanbanSortableSensors } from "./sortable-interactions.js";
13
9
  import { KANBAN_DIRECTIONS, KANBAN_HORIZONTAL_EDGES, getKanbanHorizontalEdge } from "./sortable-edge.js";
14
10
  import { KANBAN_BOARD_AUTO_SCROLL_SOURCES, KANBAN_CARD_DRAG_MIME, registerKanbanBoardAutoScroll, registerKanbanCardDrag } from "./drag-interactions.js";
11
+ import { KANBAN_BOARD_COLLISION_DETECTION, kanbanKeyboardCoordinates } from "./sortable-interactions.logic.js";
12
+ import { getKanbanGroupingPropertyId, getKanbanGroups, isKanbanGroupingRenderable, resolveKanbanGroupOptions, resolveKanbanGrouping, selectKanbanRows } from "./grouping.js";
13
+ import { KANBAN_BOARD_AXES, buildKanbanBoardMatrix, createKanbanDropIntent, getKanbanBoardColumnIdentity, getKanbanBoardLaneIdentity, orderKanbanCellsByColumns } from "./matrix.js";
15
14
  import { KANBAN_BAND_PEEK_DELAY_MS, KANBAN_BAND_PEEK_LINGER_MS } from "./band-peek.js";
16
15
  import { KanbanSubgroupBoard } from "./subgroup-board.js";
16
+ import { KANBAN_CARD_STICKY_TOP_VAR, KANBAN_STICKY_TOP_VAR, KanbanCollapsedBandCaption } from "./sticky-lane.js";
17
17
  import { KANBAN_VIRTUAL_CELL_PAGINATION, KanbanVirtualCell } from "./virtual-cell.js";
18
18
  export { KANBAN_BAND_CAPTION_ROW_HEIGHT, KANBAN_BAND_CAPTION_ROW_HEIGHT_PX, KANBAN_BAND_PEEK_DELAY_MS, KANBAN_BAND_PEEK_LINGER_MS, KANBAN_BOARD_AUTO_SCROLL_OPTIONS, KANBAN_BOARD_AUTO_SCROLL_SOURCES, KANBAN_BOARD_AXES, KANBAN_BOARD_COLLISION_DETECTION, KANBAN_CARD_DRAG_MIME, KANBAN_CARD_STICKY_TOP_VAR, KANBAN_CHROME_ROW_HEIGHT, KANBAN_CHROME_ROW_HEIGHT_PX, KANBAN_COLLAPSED_BAND_WIDTH_CLASS, KANBAN_COLLAPSED_BAND_WIDTH_PX, KANBAN_COLUMN_GAP_PX, KANBAN_COLUMN_WIDTH_CLASS, KANBAN_COLUMN_WIDTH_PX, KANBAN_DIRECTIONS, KANBAN_DRAG_OVERLAY_Z_INDEX, KANBAN_HORIZONTAL_EDGES, KANBAN_MOUSE_ACTIVATION_DISTANCE, KANBAN_SORTABLE_ACTIVATION_MODES, KANBAN_STICKY_TOP_VAR, KANBAN_TOUCH_ACTIVATION_CONSTRAINT, KANBAN_VIRTUAL_CELL_PAGINATION, KanbanCardDragSurface, KanbanCardShell, KanbanCellAction, KanbanCollapsedBandCaption, KanbanColumnBandHeader, KanbanColumnHeader, KanbanDragHandle, KanbanSortableBoard, KanbanSubgroupBoard, KanbanVirtualCell, buildKanbanBoardMatrix, createKanbanDropIntent, getKanbanBoardColumnIdentity, getKanbanBoardLaneIdentity, getKanbanGroupingPropertyId, getKanbanGroups, getKanbanHorizontalEdge, hasKanbanColumnBands, isKanbanGroupingRenderable, kanbanKeyboardCoordinates, orderKanbanCellsByColumns, registerKanbanBoardAutoScroll, registerKanbanCardDrag, resolveKanbanColumnBands, resolveKanbanGroupOptions, resolveKanbanGrouping, selectKanbanCardFieldIds, selectKanbanRows, useKanbanDropTarget, useKanbanSortable, useKanbanSortableSensors };
@@ -1,8 +1,8 @@
1
1
  "use client";
2
+ import { Button } from "../components/button.js";
2
3
  import { GripVerticalIcon } from "../icons.js";
3
- import { cn } from "../lib/utils.js";
4
4
  import "../lib/overlay-layer.js";
5
- import { Button } from "../components/button.js";
5
+ import { cn } from "../lib/utils.js";
6
6
  import { KANBAN_BOARD_COLLISION_DETECTION, KANBAN_DROP_TARGET_TYPES, clearKanbanKeyboardTarget, getKanbanKeyboardTargetState, isKanbanDropSettled, kanbanKeyboardCoordinates } from "./sortable-interactions.logic.js";
7
7
  import { isActiveTouchChange } from "./touch-identity.js";
8
8
  import { jsx, jsxs } from "react/jsx-runtime";
@@ -1,12 +1,12 @@
1
+ import { DirectionalIcon } from "../components/directional-icon.js";
1
2
  import { ChevronDownIcon } from "../icons.js";
2
3
  import { cn } from "../lib/utils.js";
3
- import { DirectionalIcon } from "../components/directional-icon.js";
4
- import { KANBAN_STICKY_TOP_CLASS, KANBAN_STICKY_TOP_VAR, KanbanCollapsedBandCaption } from "./sticky-lane.js";
5
- import { KANBAN_CHROME_TOGGLE_COARSE_TARGET_CLASS } from "./layout-tokens.js";
4
+ import { createBandPeekController } from "./band-peek.js";
6
5
  import { KanbanColumnBandHeader } from "./column-band-header.js";
7
6
  import { KANBAN_COLLAPSED_BAND_WIDTH_CLASS, KANBAN_COLUMN_WIDTH_CLASS, resolveKanbanColumnBands } from "./column-bands.js";
8
7
  import { KANBAN_CARD_DRAG_MIME } from "./drag-interactions.js";
9
- import { createBandPeekController } from "./band-peek.js";
8
+ import { KANBAN_CHROME_TOGGLE_COARSE_TARGET_CLASS } from "./layout-tokens.js";
9
+ import { KANBAN_STICKY_TOP_CLASS, KANBAN_STICKY_TOP_VAR, KanbanCollapsedBandCaption } from "./sticky-lane.js";
10
10
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
11
11
  import { useEffect, useMemo, useRef, useState } from "react";
12
12
  // src/kanban/subgroup-board.tsx
@@ -1,7 +1,7 @@
1
+ import { resolveOptionColor } from "../lib/option-color.js";
1
2
  import { cn } from "../lib/utils.js";
2
- import { KANBAN_CARD_STICKY_TOP_VAR, KANBAN_STICKY_TOP_CLASS, resolveKanbanCardStickyTop } from "./sticky-lane.js";
3
3
  import { useKanbanDropTarget } from "./sortable-interactions.js";
4
- import { resolveOptionColor } from "../lib/option-color.js";
4
+ import { KANBAN_CARD_STICKY_TOP_VAR, KANBAN_STICKY_TOP_CLASS, resolveKanbanCardStickyTop } from "./sticky-lane.js";
5
5
  import { jsx, jsxs } from "react/jsx-runtime";
6
6
  import { useId, useLayoutEffect, useRef, useState } from "react";
7
7
  import { useDndContext } from "@dnd-kit/core";
@@ -0,0 +1,24 @@
1
+ /** Why a right-click keeps the native menu, or null when stella may take it. */
2
+ export type NativeContextMenuReason = "editable" | "link" | "selection" | "shift";
3
+ type ContextMenuEventLike = {
4
+ readonly shiftKey: boolean;
5
+ readonly target: EventTarget | null;
6
+ };
7
+ /** The element is, or sits inside, text the user can edit. */
8
+ export declare const isEditableContextMenuTarget: (element: Element) => boolean;
9
+ /** The element is, or sits inside, a link with a destination. */
10
+ export declare const isLinkContextMenuTarget: (element: Element) => boolean;
11
+ /** A non-empty text selection covers the element. */
12
+ export declare const isSelectedTextContextMenuTarget: (element: Element) => boolean;
13
+ /**
14
+ * Why this right-click keeps the browser's menu on an object, or null when
15
+ * the object's own actions open instead.
16
+ */
17
+ export declare const nativeContextMenuReason: (event: ContextMenuEventLike) => NativeContextMenuReason | null;
18
+ /**
19
+ * The narrower rule a desktop webview applies to a right-click nothing in the
20
+ * page handled: only editable or selected text keeps a (text) menu, since
21
+ * the webview's native menu elsewhere offers browser items such as reload.
22
+ */
23
+ export declare const nativeTextContextMenuReason: (event: Pick<ContextMenuEventLike, "target">) => Extract<NativeContextMenuReason, "editable" | "selection"> | null;
24
+ export {};
@@ -0,0 +1,85 @@
1
+ // src/lib/native-context-menu.ts
2
+ /** Input types whose value is text a user edits; the others are controls. */
3
+ const NON_TEXT_INPUT_TYPES = /* @__PURE__ */ new Set([
4
+ "button",
5
+ "checkbox",
6
+ "color",
7
+ "file",
8
+ "hidden",
9
+ "image",
10
+ "radio",
11
+ "range",
12
+ "reset",
13
+ "submit"
14
+ ]);
15
+ /** The element a right-click landed on; a text node answers for its parent. */
16
+ const elementOf = (target) => {
17
+ if (target instanceof Element) return target;
18
+ if (target instanceof Node) return target.parentElement;
19
+ return null;
20
+ };
21
+ /**
22
+ * What a `contenteditable` value means under the HTML standard: its keywords
23
+ * match ASCII case-insensitively, the empty string means "true", and an
24
+ * invalid value inherits from the parent.
25
+ */
26
+ const contentEditableState = (value) => {
27
+ if (value === null) return "inherit";
28
+ switch (value.toLowerCase()) {
29
+ case "":
30
+ case "true":
31
+ case "plaintext-only": return "editable";
32
+ case "false": return "not-editable";
33
+ default: return "inherit";
34
+ }
35
+ };
36
+ /** The element is, or sits inside, text the user can edit. */
37
+ const isEditableContextMenuTarget = (element) => {
38
+ const field = element.closest("input, textarea");
39
+ if (field !== null) {
40
+ const type = field.getAttribute("type")?.toLowerCase() ?? "text";
41
+ if (field.tagName.toLowerCase() === "textarea") return true;
42
+ return !NON_TEXT_INPUT_TYPES.has(type);
43
+ }
44
+ for (let current = element.closest("[contenteditable]"); current !== null; current = current.parentElement?.closest("[contenteditable]") ?? null) {
45
+ const state = contentEditableState(current.getAttribute("contenteditable"));
46
+ if (state !== "inherit") return state === "editable";
47
+ }
48
+ return false;
49
+ };
50
+ /** The element is, or sits inside, a link with a destination. */
51
+ const isLinkContextMenuTarget = (element) => element.closest("a[href]") !== null;
52
+ /** A non-empty text selection covers the element. */
53
+ const isSelectedTextContextMenuTarget = (element) => {
54
+ const selection = element.ownerDocument.defaultView?.getSelection() ?? null;
55
+ if (selection === null || selection.isCollapsed) return false;
56
+ if (selection.toString().trim() === "") return false;
57
+ for (let index = 0; index < selection.rangeCount; index += 1) if (selection.getRangeAt(index).intersectsNode(element)) return true;
58
+ return false;
59
+ };
60
+ /**
61
+ * Why this right-click keeps the browser's menu on an object, or null when
62
+ * the object's own actions open instead.
63
+ */
64
+ const nativeContextMenuReason = (event) => {
65
+ if (event.shiftKey) return "shift";
66
+ const element = elementOf(event.target);
67
+ if (element === null) return null;
68
+ if (isEditableContextMenuTarget(element)) return "editable";
69
+ if (isSelectedTextContextMenuTarget(element)) return "selection";
70
+ if (isLinkContextMenuTarget(element)) return "link";
71
+ return null;
72
+ };
73
+ /**
74
+ * The narrower rule a desktop webview applies to a right-click nothing in the
75
+ * page handled: only editable or selected text keeps a (text) menu, since
76
+ * the webview's native menu elsewhere offers browser items such as reload.
77
+ */
78
+ const nativeTextContextMenuReason = (event) => {
79
+ const element = elementOf(event.target);
80
+ if (element === null) return null;
81
+ if (isEditableContextMenuTarget(element)) return "editable";
82
+ if (isSelectedTextContextMenuTarget(element)) return "selection";
83
+ return null;
84
+ };
85
+ export { isEditableContextMenuTarget, isLinkContextMenuTarget, isSelectedTextContextMenuTarget, nativeContextMenuReason, nativeTextContextMenuReason };
@@ -1,6 +1,6 @@
1
- import { cn } from "../lib/utils.js";
2
1
  import { Avatar, AvatarFallback, AvatarImage } from "../components/avatar.js";
3
2
  import { getInitials } from "../lib/initials.js";
3
+ import { cn } from "../lib/utils.js";
4
4
  import { jsx, jsxs } from "react/jsx-runtime";
5
5
  // src/review/review-author-avatar.tsx
6
6
  /**
@@ -1,7 +1,7 @@
1
- import { CheckIcon, RotateCcwIcon, Trash2Icon } from "../icons.js";
2
- import { cn } from "../lib/utils.js";
3
1
  import { BidiText } from "../components/bidi-text.js";
4
2
  import { Button } from "../components/button.js";
3
+ import { CheckIcon, RotateCcwIcon, Trash2Icon } from "../icons.js";
4
+ import { cn } from "../lib/utils.js";
5
5
  import { ReviewAuthorAvatar } from "./review-author-avatar.js";
6
6
  import { jsx, jsxs } from "react/jsx-runtime";
7
7
  import { Temporal } from "temporal-polyfill/full";
@@ -1,6 +1,6 @@
1
+ import { Button } from "../components/button.js";
1
2
  import { CheckIcon, RotateCcwIcon, XIcon } from "../icons.js";
2
3
  import { cn } from "../lib/utils.js";
3
- import { Button } from "../components/button.js";
4
4
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
5
5
  import { panic } from "better-result";
6
6
  // src/review/review-decision-actions.tsx
@@ -1,5 +1,5 @@
1
- import { cn } from "../lib/utils.js";
2
1
  import { Button } from "../components/button.js";
2
+ import { cn } from "../lib/utils.js";
3
3
  import { jsx, jsxs } from "react/jsx-runtime";
4
4
  // src/review/review-out-of-date-notice.tsx
5
5
  /**