@stll/ui 0.66.0 → 0.68.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 (70) 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/table.js +1 -1
  41. package/dist/components/tabs.js +1 -1
  42. package/dist/components/textarea.js +2 -2
  43. package/dist/components/toast.js +3 -3
  44. package/dist/components/tooltip.js +1 -1
  45. package/dist/components/truncated-text.js +2 -2
  46. package/dist/components/view-toolbar.d.ts +5 -1
  47. package/dist/components/view-toolbar.js +6 -2
  48. package/dist/components/workspace-shell.js +3 -3
  49. package/dist/data-table/table.js +1 -1
  50. package/dist/index.js +34 -34
  51. package/dist/inspector/chrome.js +1 -1
  52. package/dist/inspector/dock.js +1 -1
  53. package/dist/inspector/entity-tab.js +2 -2
  54. package/dist/inspector/facet-bar.js +4 -4
  55. package/dist/inspector/index.js +2 -2
  56. package/dist/kanban/card-shell.js +1 -1
  57. package/dist/kanban/cell-action.js +1 -1
  58. package/dist/kanban/column-band-header.js +1 -1
  59. package/dist/kanban/index.js +5 -5
  60. package/dist/kanban/sortable-interactions.js +2 -2
  61. package/dist/kanban/subgroup-board.js +4 -4
  62. package/dist/kanban/virtual-cell.js +2 -2
  63. package/dist/lib/native-context-menu.d.ts +24 -0
  64. package/dist/lib/native-context-menu.js +85 -0
  65. package/dist/review/review-author-avatar.js +1 -1
  66. package/dist/review/review-comment-card.js +2 -2
  67. package/dist/review/review-decision-actions.js +1 -1
  68. package/dist/review/review-out-of-date-notice.js +1 -1
  69. package/dist/styles/theme.css +23 -23
  70. 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. */
@@ -82,7 +82,7 @@ const SortableHead = ({ children, sortDirection = null, onSort, trailing, classN
82
82
  children: /* @__PURE__ */ jsxs("span", {
83
83
  className: "inline-flex items-center gap-1",
84
84
  children: [/* @__PURE__ */ jsxs(Button, {
85
- className: cn("min-w-0 gap-1", endAligned ? "-me-3 flex-row-reverse" : "-ms-3"),
85
+ className: cn("min-w-0 gap-1 px-2.5", endAligned ? "-me-2.5 flex-row-reverse" : "-ms-2.5"),
86
86
  onClick: onSort,
87
87
  type: "button",
88
88
  variant: "muted",
@@ -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,6 +1,10 @@
1
1
  import { Button } from "./button.js";
2
2
  import { ComponentProps } from "react";
3
- /** Shared view controls stay compact and scroll horizontally on small screens. */
3
+ /**
4
+ * Shared view controls stay compact and scroll horizontally on small screens:
5
+ * the row never grows past its container, so a control past the edge is
6
+ * scrolled to rather than clipped.
7
+ */
4
8
  export declare const ViewToolbarChrome: ({ className, ...props }: ComponentProps<"div">) => import("react").JSX.Element;
5
9
  type ViewFilterButtonProps = Omit<ComponentProps<typeof Button>, "children" | "size" | "variant" | "aria-label" | "title"> & {
6
10
  label: string;
@@ -3,9 +3,13 @@ import { cn } from "../lib/utils.js";
3
3
  import { Button } from "./button.js";
4
4
  import { jsx } from "react/jsx-runtime";
5
5
  // src/components/view-toolbar.tsx
6
- /** Shared view controls stay compact and scroll horizontally on small screens. */
6
+ /**
7
+ * Shared view controls stay compact and scroll horizontally on small screens:
8
+ * the row never grows past its container, so a control past the edge is
9
+ * scrolled to rather than clipped.
10
+ */
7
11
  const ViewToolbarChrome = ({ className, ...props }) => /* @__PURE__ */ jsx("div", {
8
- className: cn("flex min-w-0 shrink-0 [scrollbar-width:none] flex-nowrap items-center gap-1 overflow-x-auto px-2 py-1 [-ms-overflow-style:none] md:flex-wrap md:overflow-visible [&::-webkit-scrollbar]:hidden", className),
12
+ className: cn("flex max-w-full min-w-0 shrink-0 [scrollbar-width:none] flex-nowrap items-center gap-1 overflow-x-auto px-2 py-1 [-ms-overflow-style:none] md:flex-wrap md:overflow-visible [&::-webkit-scrollbar]:hidden", className),
9
13
  ...props
10
14
  });
11
15
  const ViewFilterButton = ({ label, ...props }) => /* @__PURE__ */ jsx(Button, {
@@ -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
  /**