@neasg/design-system 0.4.35 → 0.4.95

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 (54) hide show
  1. package/dist/activity-card.d.ts +29 -0
  2. package/dist/activity-card.js +65 -0
  3. package/dist/autocomplete.d.ts +84 -0
  4. package/dist/autocomplete.js +267 -0
  5. package/dist/avatar.d.ts +3 -1
  6. package/dist/avatar.js +27 -10
  7. package/dist/badge.js +1 -1
  8. package/dist/button.d.ts +1 -1
  9. package/dist/button.js +1 -0
  10. package/dist/calendar.js +1 -1
  11. package/dist/card.d.ts +1 -1
  12. package/dist/card.js +1 -1
  13. package/dist/compound-search-input.d.ts +8 -0
  14. package/dist/compound-search-input.js +9 -0
  15. package/dist/date-input.js +3 -3
  16. package/dist/dialog.d.ts +3 -1
  17. package/dist/dialog.js +6 -2
  18. package/dist/draggable-tabs.js +9 -8
  19. package/dist/index.d.ts +12 -4
  20. package/dist/index.js +6 -2
  21. package/dist/label-value-grid.js +6 -4
  22. package/dist/layout.d.ts +39 -6
  23. package/dist/layout.js +118 -42
  24. package/dist/lib/utils.js +1 -0
  25. package/dist/message-item.d.ts +23 -3
  26. package/dist/message-item.js +115 -16
  27. package/dist/notification.d.ts +14 -3
  28. package/dist/notification.js +32 -7
  29. package/dist/popover-menu.d.ts +4 -2
  30. package/dist/popover-menu.js +65 -5
  31. package/dist/popover.d.ts +5 -2
  32. package/dist/popover.js +3 -3
  33. package/dist/rich-text-editor.d.ts +2 -1
  34. package/dist/rich-text-editor.js +28 -3
  35. package/dist/routing-timeline.d.ts +7 -2
  36. package/dist/routing-timeline.js +67 -29
  37. package/dist/search-input.d.ts +4 -0
  38. package/dist/search-input.js +2 -2
  39. package/dist/select-primitive.js +1 -1
  40. package/dist/select.d.ts +3 -1
  41. package/dist/select.js +9 -4
  42. package/dist/status-dot.d.ts +13 -0
  43. package/dist/status-dot.js +19 -0
  44. package/dist/styles.css +0 -19
  45. package/dist/table-column-filter.js +7 -5
  46. package/dist/table.d.ts +9 -1
  47. package/dist/table.js +25 -11
  48. package/dist/tabs.d.ts +1 -1
  49. package/dist/tabs.js +6 -4
  50. package/dist/textarea.d.ts +1 -0
  51. package/dist/textarea.js +3 -2
  52. package/dist/theme-switcher.d.ts +3 -1
  53. package/dist/theme-switcher.js +8 -2
  54. package/package.json +1 -1
@@ -164,11 +164,11 @@ const DateInput = React.forwardRef((props, ref) => {
164
164
  }
165
165
  };
166
166
  const disabledDays = (date) => isDateOutsideBounds(date, minDate, maxDate);
167
- const calendarContent = (_jsx(_Fragment, { children: props.mode === "range" ? (_jsx(Calendar, { mode: "range", selected: selectedRange, onSelect: handleRangeSelect, disabled: disabledDays, defaultMonth: (_b = selectedRange === null || selectedRange === void 0 ? void 0 : selectedRange.from) !== null && _b !== void 0 ? _b : selectedRange === null || selectedRange === void 0 ? void 0 : selectedRange.to, numberOfMonths: (_c = props.numberOfMonths) !== null && _c !== void 0 ? _c : 2, showOutsideDays: false, autoFocus: true })) : (_jsx(Calendar, { mode: "single", selected: selectedDate, onSelect: handleSelect, disabled: disabledDays, defaultMonth: selectedDate, autoFocus: true })) }));
167
+ const calendarContent = (_jsx(_Fragment, { children: props.mode === "range" ? (_jsx(Calendar, { mode: "range", selected: selectedRange, onSelect: handleRangeSelect, disabled: disabledDays, defaultMonth: (_b = selectedRange === null || selectedRange === void 0 ? void 0 : selectedRange.from) !== null && _b !== void 0 ? _b : selectedRange === null || selectedRange === void 0 ? void 0 : selectedRange.to, numberOfMonths: (_c = props.numberOfMonths) !== null && _c !== void 0 ? _c : 2, showOutsideDays: false, className: "[&_.rdp-month:not(:first-of-type)]:hidden sm:[&_.rdp-month:not(:first-of-type)]:flex", autoFocus: true })) : (_jsx(Calendar, { mode: "single", selected: selectedDate, onSelect: handleSelect, disabled: disabledDays, defaultMonth: selectedDate, autoFocus: true })) }));
168
168
  if (appearance === "inline") {
169
- return (_jsxs("span", { className: cn("inline-flex", className), "data-disabled": disabled ? "true" : undefined, "data-invalid": isInvalid ? "true" : undefined, children: [_jsx(Popover, { open: open, onOpenChange: handleOpenChange, align: "start", title: popoverTitle, surface: popoverTitle ? "menu" : "panel", contentClassName: "w-auto p-0", trigger: _jsxs("button", { ref: ref, type: "button", id: inputId, disabled: disabled, "aria-invalid": isInvalid ? "true" : undefined, "aria-describedby": [descriptionId, errorId].filter(Boolean).join(" ") || undefined, className: cn("inline-flex cursor-pointer items-baseline rounded-sm border-0 bg-transparent p-0 font-medium text-interactive underline decoration-interactive/40 underline-offset-4 transition-colors hover:decoration-interactive focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50", !displayValue && "text-muted-foreground decoration-border", isInvalid && "text-destructive decoration-destructive", triggerClassName), children: [_jsxs("span", { className: "sr-only", children: [label, ": "] }), _jsx("span", { children: displayValue !== null && displayValue !== void 0 ? displayValue : placeholder })] }), children: calendarContent }), showDescription ? (_jsx("span", { id: descriptionId, className: "sr-only", children: description })) : null, error ? (_jsx("span", { id: errorId, role: "alert", className: "sr-only", children: error })) : null] }));
169
+ return (_jsxs("span", { className: cn("inline-flex", className), "data-disabled": disabled ? "true" : undefined, "data-invalid": isInvalid ? "true" : undefined, children: [_jsx(Popover, { open: open, onOpenChange: handleOpenChange, align: "start", title: popoverTitle, surface: popoverTitle ? "menu" : "panel", collisionPadding: 8, contentClassName: "max-h-[var(--radix-popover-content-available-height)] w-auto overflow-auto p-0 [&_[data-slot=popover-title]]:px-3", trigger: _jsxs("button", { ref: ref, type: "button", id: inputId, disabled: disabled, "aria-invalid": isInvalid ? "true" : undefined, "aria-describedby": [descriptionId, errorId].filter(Boolean).join(" ") || undefined, className: cn("inline-flex cursor-pointer items-baseline rounded-sm border-0 bg-transparent p-0 font-medium text-interactive underline decoration-interactive/40 underline-offset-4 transition-colors hover:decoration-interactive focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50", !displayValue && "text-muted-foreground decoration-border", isInvalid && "text-destructive decoration-destructive", triggerClassName), children: [_jsxs("span", { className: "sr-only", children: [label, ": "] }), _jsx("span", { children: displayValue !== null && displayValue !== void 0 ? displayValue : placeholder })] }), children: calendarContent }), showDescription ? (_jsx("span", { id: descriptionId, className: "sr-only", children: description })) : null, error ? (_jsx("span", { id: errorId, role: "alert", className: "sr-only", children: error })) : null] }));
170
170
  }
171
- return (_jsxs(Field, { className: className, "data-disabled": disabled ? "true" : undefined, "data-invalid": isInvalid ? "true" : undefined, children: [_jsx(FieldLabel, { htmlFor: inputId, className: cn(hideLabel && "sr-only", labelClassName), children: label }), _jsxs("div", { className: "relative", children: [_jsx(Popover, { open: open, onOpenChange: handleOpenChange, align: "start", title: popoverTitle, surface: popoverTitle ? "menu" : "panel", contentClassName: "w-auto p-0", trigger: _jsx("button", { ref: ref, type: "button", id: inputId, disabled: disabled, "aria-invalid": isInvalid ? "true" : undefined, "aria-describedby": [descriptionId, errorId].filter(Boolean).join(" ") || undefined, className: cn(inputControlClassName, "relative cursor-pointer pr-9 text-left", showClearButton && "pr-16", !displayValue && "text-muted-foreground", isInvalid && "border-destructive focus-visible:ring-destructive", triggerClassName), children: _jsx("span", { className: "block truncate", children: displayValue !== null && displayValue !== void 0 ? displayValue : placeholder }) }), children: calendarContent }), _jsxs("span", { "aria-hidden": showClearButton ? undefined : true, className: "pointer-events-none absolute inset-y-0 right-3 flex items-center gap-2 text-muted-foreground", children: [showClearButton ? (_jsx("button", { type: "button", "aria-label": resolvedClearLabel, onClick: handleClear, className: "pointer-events-auto inline-flex h-4 w-4 cursor-pointer items-center justify-center rounded-sm text-muted-foreground transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:cursor-not-allowed", children: _jsx(XIcon, { size: 14, className: "flex items-center justify-center" }) })) : null, _jsx(CalendarIcon, { "aria-hidden": "true", className: "h-4 w-4 shrink-0", strokeWidth: 2 })] })] }), showDescription ? (_jsx(FieldDescription, { id: descriptionId, className: descriptionClassName, children: description })) : null, _jsx(FieldError, { id: errorId, className: errorClassName, children: error })] }));
171
+ return (_jsxs(Field, { className: className, "data-disabled": disabled ? "true" : undefined, "data-invalid": isInvalid ? "true" : undefined, children: [_jsx(FieldLabel, { htmlFor: inputId, className: cn(hideLabel && "sr-only", labelClassName), children: label }), _jsxs("div", { className: "relative", children: [_jsx(Popover, { open: open, onOpenChange: handleOpenChange, align: "start", title: popoverTitle, surface: popoverTitle ? "menu" : "panel", collisionPadding: 8, contentClassName: "max-h-[var(--radix-popover-content-available-height)] w-auto overflow-auto p-0 [&_[data-slot=popover-title]]:px-3", trigger: _jsx("button", { ref: ref, type: "button", id: inputId, disabled: disabled, "aria-invalid": isInvalid ? "true" : undefined, "aria-describedby": [descriptionId, errorId].filter(Boolean).join(" ") || undefined, className: cn(inputControlClassName, "relative cursor-pointer pr-9 text-left", showClearButton && "pr-16", !displayValue && "text-muted-foreground", isInvalid && "border-destructive focus-visible:ring-destructive", triggerClassName), children: _jsx("span", { className: "block truncate", children: displayValue !== null && displayValue !== void 0 ? displayValue : placeholder }) }), children: calendarContent }), _jsxs("span", { "aria-hidden": showClearButton ? undefined : true, className: "pointer-events-none absolute inset-y-0 right-3 flex items-center gap-2 text-muted-foreground", children: [showClearButton ? (_jsx("button", { type: "button", "aria-label": resolvedClearLabel, onClick: handleClear, className: "pointer-events-auto inline-flex h-4 w-4 cursor-pointer items-center justify-center rounded-sm text-muted-foreground transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:cursor-not-allowed", children: _jsx(XIcon, { size: 14, className: "flex items-center justify-center" }) })) : null, _jsx(CalendarIcon, { "aria-hidden": "true", className: "h-4 w-4 shrink-0", strokeWidth: 2 })] })] }), showDescription ? (_jsx(FieldDescription, { id: descriptionId, className: descriptionClassName, children: description })) : null, _jsx(FieldError, { id: errorId, className: errorClassName, children: error })] }));
172
172
  });
173
173
  DateInput.displayName = "DateInput";
174
174
  export { DateInput };
package/dist/dialog.d.ts CHANGED
@@ -23,6 +23,8 @@ export interface DialogProps {
23
23
  contentClassName?: string;
24
24
  bodyClassName?: string;
25
25
  hideCloseButton?: boolean;
26
+ /** Whether a pointer interaction outside the dialog closes it. */
27
+ closeOnOutsideClick?: boolean;
26
28
  }
27
- declare function Dialog({ open, defaultOpen, onOpenChange, modal, trigger, title, description, children, footer, primaryAction, secondaryAction, contentClassName, bodyClassName, hideCloseButton, }: DialogProps): import("react/jsx-runtime").JSX.Element;
29
+ declare function Dialog({ open, defaultOpen, onOpenChange, modal, trigger, title, description, children, footer, primaryAction, secondaryAction, contentClassName, bodyClassName, hideCloseButton, closeOnOutsideClick, }: DialogProps): import("react/jsx-runtime").JSX.Element;
28
30
  export { Dialog };
package/dist/dialog.js CHANGED
@@ -31,7 +31,7 @@ function renderDialogAction({ action, close, defaultVariant, }) {
31
31
  }
32
32
  }, children: label }));
33
33
  }
34
- function Dialog({ open, defaultOpen, onOpenChange, modal, trigger, title, description, children, footer, primaryAction, secondaryAction, contentClassName, bodyClassName, hideCloseButton, }) {
34
+ function Dialog({ open, defaultOpen, onOpenChange, modal, trigger, title, description, children, footer, primaryAction, secondaryAction, contentClassName, bodyClassName, hideCloseButton = false, closeOnOutsideClick = false, }) {
35
35
  const [isOpen, setIsOpen] = useControllableOpen({
36
36
  open,
37
37
  defaultOpen,
@@ -43,7 +43,11 @@ function Dialog({ open, defaultOpen, onOpenChange, modal, trigger, title, descri
43
43
  const body = resolveDialogRenderable(children, helpers);
44
44
  const customFooter = resolveDialogRenderable(footer, helpers);
45
45
  const hasFooter = Boolean(customFooter || primaryAction || secondaryAction);
46
- return (_jsxs(DialogRoot, { open: isOpen, onOpenChange: setIsOpen, modal: modal, children: [trigger ? _jsx(DialogTrigger, { asChild: true, children: trigger }) : null, _jsxs(DialogSurface, { className: contentClassName, hideCloseButton: hideCloseButton, children: [_jsxs(DialogHeader, { children: [_jsx(DialogTitle, { children: title }), description ? (_jsx(DialogDescription, { children: description })) : null] }), body ? _jsx("div", { className: cn("grid gap-4", bodyClassName), children: body }) : null, hasFooter ? (_jsx(DialogFooter, { children: customFooter !== null && customFooter !== void 0 ? customFooter : (_jsxs(_Fragment, { children: [secondaryAction
46
+ return (_jsxs(DialogRoot, { open: isOpen, onOpenChange: setIsOpen, modal: modal, children: [trigger ? _jsx(DialogTrigger, { asChild: true, children: trigger }) : null, _jsxs(DialogSurface, { ...(!description ? { "aria-describedby": undefined } : {}), className: contentClassName, hideCloseButton: hideCloseButton, onPointerDownOutside: (event) => {
47
+ if (!closeOnOutsideClick) {
48
+ event.preventDefault();
49
+ }
50
+ }, children: [_jsxs(DialogHeader, { children: [_jsx(DialogTitle, { children: title }), description ? (_jsx(DialogDescription, { children: description })) : null] }), body ? _jsx("div", { className: cn("grid gap-4", bodyClassName), children: body }) : null, hasFooter ? (_jsx(DialogFooter, { children: customFooter !== null && customFooter !== void 0 ? customFooter : (_jsxs(_Fragment, { children: [secondaryAction
47
51
  ? renderDialogAction({
48
52
  action: secondaryAction,
49
53
  close: helpers.close,
@@ -3,12 +3,13 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { DndContext, closestCenter, KeyboardSensor, PointerSensor, useSensor, useSensors, } from "@dnd-kit/core";
4
4
  import { SortableContext, horizontalListSortingStrategy, sortableKeyboardCoordinates, useSortable, } from "@dnd-kit/sortable";
5
5
  import { CSS } from "@dnd-kit/utilities";
6
+ import { GripVertical } from "lucide-react";
6
7
  import { XIcon } from "./animated-icons/x";
7
8
  import { Badge } from "./badge";
8
9
  import { GuidanceTip } from "./guidance-tip";
9
10
  import { cn } from "./lib/utils";
10
11
  import { Tooltip } from "./tooltip";
11
- function TabButton({ item, dragHandleProps, }) {
12
+ function TabButton({ item, dragHandleProps, showDivider = false, }) {
12
13
  var _a, _b, _c;
13
14
  const isDraggable = Boolean(dragHandleProps);
14
15
  const labelClassName = item.labelClassName
@@ -16,17 +17,17 @@ function TabButton({ item, dragHandleProps, }) {
16
17
  : item.active
17
18
  ? "text-foreground"
18
19
  : "text-muted-foreground hover:text-foreground";
19
- const content = (_jsxs("div", { className: cn("group flex items-center gap-1.5 border-b-2 px-2.5 transition-colors select-none", item.disabled
20
+ const content = (_jsxs("div", { className: cn("group/draggable-tab relative -mb-px flex items-center gap-1.5 border-b-[3px] px-2.5 transition-colors select-none", item.disabled
20
21
  ? "cursor-not-allowed opacity-50"
21
22
  : isDraggable
22
23
  ? "cursor-grab active:cursor-grabbing"
23
24
  : "cursor-pointer", item.active
24
25
  ? (_a = item.activeClassName) !== null && _a !== void 0 ? _a : "border-[hsl(var(--tab-indicator))] bg-transparent hover:bg-transparent"
25
- : (_b = item.inactiveClassName) !== null && _b !== void 0 ? _b : "border-transparent hover:bg-[hsl(var(--tab-trigger-hover-background))]", item.className), ...dragHandleProps, children: [_jsxs("button", { type: "button", onClick: item.disabled ? undefined : item.onSelect, disabled: item.disabled, className: cn("flex cursor-pointer items-center gap-1.5 py-2 pr-1 text-sm font-medium whitespace-nowrap disabled:cursor-not-allowed", labelClassName), children: [item.badge ? (_jsx(Badge, { variant: item.badge.variant, bordered: item.badge.bordered, size: "icon", children: item.badge.label })) : null, item.leading, item.label, item.trailing] }), item.onClose ? (_jsx("button", { type: "button", onClick: (event) => {
26
+ : (_b = item.inactiveClassName) !== null && _b !== void 0 ? _b : "border-transparent hover:bg-[hsl(var(--tab-trigger-hover-background))]", item.className), ...dragHandleProps, children: [isDraggable ? (_jsx("span", { "data-slot": "draggable-tab-grip", "aria-hidden": "true", className: "pointer-events-none absolute left-0 top-1/2 z-10 inline-flex h-5 w-4 -translate-x-1/2 -translate-y-1/2 items-center justify-center rounded border border-border bg-background text-muted-foreground opacity-0 shadow-sm transition-opacity group-hover/draggable-tab:opacity-100 group-has-[:focus-visible]/draggable-tab:opacity-100", children: _jsx(GripVertical, { className: "h-3 w-3" }) })) : null, _jsxs("button", { type: "button", onClick: item.disabled ? undefined : item.onSelect, disabled: item.disabled, className: cn("flex cursor-pointer items-center gap-1.5 py-2 pr-1 text-sm font-medium whitespace-nowrap disabled:cursor-not-allowed", labelClassName), children: [item.badge ? (_jsx(Badge, { variant: item.badge.variant, bordered: item.badge.bordered, size: "icon", children: item.badge.label })) : null, item.leading, item.label, item.trailing] }), item.onClose ? (_jsx("button", { type: "button", onClick: (event) => {
26
27
  var _a;
27
28
  event.stopPropagation();
28
29
  (_a = item.onClose) === null || _a === void 0 ? void 0 : _a.call(item);
29
- }, className: cn("cursor-pointer rounded p-1 text-muted-foreground hover:text-foreground", item.closeButtonClassName), "aria-label": "Close tab", children: _jsx(XIcon, { size: 12 }) })) : null] }));
30
+ }, className: cn("cursor-pointer rounded p-1 text-muted-foreground hover:text-foreground", item.closeButtonClassName), "aria-label": "Close tab", children: _jsx(XIcon, { size: 12 }) })) : null, showDivider ? (_jsx("span", { "data-slot": "draggable-tab-divider", "aria-hidden": "true", className: "pointer-events-none absolute -right-0.5 top-1/2 h-4 w-px -translate-y-1/2 bg-[hsl(var(--layout-surface-border))]" })) : null] }));
30
31
  if (item.guidance) {
31
32
  return _jsx(GuidanceTip, { ...item.guidance, trigger: content });
32
33
  }
@@ -35,13 +36,13 @@ function TabButton({ item, dragHandleProps, }) {
35
36
  }
36
37
  return (_jsx(Tooltip, { content: item.tooltip, side: (_c = item.tooltipSide) !== null && _c !== void 0 ? _c : "bottom", contentClassName: item.tooltipContentClassName, children: content }));
37
38
  }
38
- function SortableTab({ item }) {
39
- const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({ id: item.id });
39
+ function SortableTab({ item, showDivider, }) {
40
+ const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({ id: item.id, disabled: item.disabled });
40
41
  return (_jsx("div", { ref: setNodeRef, style: {
41
42
  transform: CSS.Transform.toString(transform),
42
43
  transition,
43
44
  zIndex: isDragging ? 50 : undefined,
44
- }, className: cn(isDragging && "opacity-50 shadow-lg"), children: _jsx(TabButton, { item: item, dragHandleProps: { ...attributes, ...listeners } }) }));
45
+ }, className: cn(isDragging && "opacity-50 shadow-lg"), children: _jsx(TabButton, { item: item, showDivider: showDivider, dragHandleProps: item.disabled ? undefined : { ...attributes, ...listeners } }) }));
45
46
  }
46
47
  function DraggableTabs({ staticTabs = [], tabs, onReorder, className, ...props }) {
47
48
  const sensors = useSensors(useSensor(PointerSensor, {
@@ -61,6 +62,6 @@ function DraggableTabs({ staticTabs = [], tabs, onReorder, className, ...props }
61
62
  onReorder(oldIndex, newIndex);
62
63
  }
63
64
  };
64
- return (_jsxs("div", { "data-slot": "draggable-tabs", className: cn("flex items-end gap-1 border-b overflow-x-auto overflow-y-hidden bg-transparent", "border-[hsl(var(--layout-surface-border))]", className), ...props, children: [staticTabs.map((tab) => (_jsx(TabButton, { item: tab }, tab.id))), _jsx(DndContext, { sensors: sensors, collisionDetection: closestCenter, onDragEnd: handleDragEnd, children: _jsx(SortableContext, { items: tabs.map((tab) => tab.id), strategy: horizontalListSortingStrategy, children: tabs.map((tab) => (_jsx(SortableTab, { item: tab }, tab.id))) }) })] }));
65
+ return (_jsxs("div", { "data-slot": "draggable-tabs", className: cn("flex items-end gap-1 border-b overflow-x-auto overflow-y-hidden bg-transparent", "border-[hsl(var(--layout-surface-border))]", className), ...props, children: [staticTabs.map((tab, index) => (_jsx(TabButton, { item: tab, showDivider: index < staticTabs.length - 1 || tabs.length > 0 }, tab.id))), _jsx(DndContext, { sensors: sensors, collisionDetection: closestCenter, onDragEnd: handleDragEnd, children: _jsx(SortableContext, { items: tabs.map((tab) => tab.id), strategy: horizontalListSortingStrategy, children: tabs.map((tab, index) => (_jsx(SortableTab, { item: tab, showDivider: index < tabs.length - 1 }, tab.id))) }) })] }));
65
66
  }
66
67
  export { DraggableTabs };
package/dist/index.d.ts CHANGED
@@ -7,11 +7,13 @@ export { Alert, AlertAction, AlertConsent, alertVariants, } from "./alert";
7
7
  export type { AlertActionProps, AlertConsentProps, AlertProps, } from "./alert";
8
8
  export { AlertStack } from "./alert-stack";
9
9
  export type { AlertStackProps } from "./alert-stack";
10
+ export { ActivityCard, ActivityCardActor, ActivityCardContent, } from "./activity-card";
11
+ export type { ActivityCardActorProps, ActivityCardContentProps, ActivityCardDensity, ActivityCardIconTone, ActivityCardProps, } from "./activity-card";
10
12
  export { Badge, badgeVariants } from "./badge";
11
13
  export { Card, CardGrid, CardSplitGrid, CardList, CardListItem, } from "./card";
12
14
  export type { CardGridProps, CardListItemProps, CardListProps, CardProps, CardSplitGridProps, } from "./card";
13
15
  export type { BadgeProps } from "./badge";
14
- export { MessageAttachmentRow, MessageItem, MessageNewDivider, MessageThread, formatMessageDate, } from "./message-item";
16
+ export { MessageAttachmentRow, MessageItem, MessageNewDivider, MessageThread, formatMessageCardTimestamp, formatMessageDate, } from "./message-item";
15
17
  export type { MessageAttachmentRowProps, MessageItemAttachment, MessageItemData, MessageItemProps, MessageNewDividerProps, MessageThreadProps, } from "./message-item";
16
18
  export { formatNotificationTimestamp, NotificationItem, NotificationList, NotificationPopover, NotificationTrigger, } from "./notification";
17
19
  export type { NotificationAction, NotificationFilter, NotificationIcon, NotificationItemData, NotificationItemProps, NotificationKind, NotificationListProps, NotificationPopoverProps, NotificationTimestamp, NotificationTriggerProps, NotificationTone, FormatNotificationTimestampOptions, } from "./notification";
@@ -30,6 +32,8 @@ export { DateInput } from "./date-input";
30
32
  export type { DateInputProps, DateInputRangeProps, DateInputSingleProps, DateRangeInputValue, } from "./date-input";
31
33
  export { CountBadge } from "./count-badge";
32
34
  export type { CountBadgeProps } from "./count-badge";
35
+ export { StatusDot } from "./status-dot";
36
+ export type { StatusDotProps, StatusDotSize, StatusDotVariant, } from "./status-dot";
33
37
  export { EmptyState } from "./empty-state";
34
38
  export type { EmptyStateProps } from "./empty-state";
35
39
  export { EditableTable } from "./editable-table";
@@ -90,6 +94,10 @@ export { PopoverMenuContent, PopoverMenuCheckboxItem, PopoverMenuHeader, Popover
90
94
  export type { PopoverMenuContentProps, PopoverMenuCheckboxItemProps, PopoverMenuHeaderProps, PopoverMenuSectionProps, PopoverMenuItemProps, PopoverMenuDividerProps, PopoverMenuFooterActionProps, PopoverMenuFooterMetaProps, PopoverMenuFooterProps, PopoverMenuGroupProps, PopoverMenuGroupLabelProps, PopoverMenuSearchProps, PopoverMenuScrollAreaProps, PopoverMenuViewProps, } from "./popover-menu";
91
95
  export { SearchInput } from "./search-input";
92
96
  export type { SearchInputProps } from "./search-input";
97
+ export { CompoundSearchInput } from "./compound-search-input";
98
+ export type { CompoundSearchInputProps } from "./compound-search-input";
99
+ export { Autocomplete, AutocompleteOptions, AutocompletePopover, useAutocompleteController, } from "./autocomplete";
100
+ export type { AutocompleteController, AutocompleteControllerOptions, AutocompleteOption, AutocompleteOptionGroup, AutocompleteOptionRenderState, AutocompleteOptionsProps, AutocompletePopoverProps, AutocompleteProps, AutocompleteStateContent, } from "./autocomplete";
93
101
  export { SectionNav } from "./section-nav";
94
102
  export type { SectionNavItem, SectionNavProps } from "./section-nav";
95
103
  export { GovtMasthead } from "./govt-masthead";
@@ -111,8 +119,8 @@ export type { TextareaProps } from "./textarea";
111
119
  export { DraggableTabs, type DraggableTabBadge, type DraggableTabGuidance, type DraggableTabItem, type DraggableTabsProps, } from "./draggable-tabs";
112
120
  export { Drawer, } from "./drawer";
113
121
  export type { DrawerAction, DrawerProps, DrawerSide } from "./drawer";
114
- export { DashboardContent, DashboardLayout, DashboardRightPanel, DashboardRightPanelBody, DashboardRightPanelHeader, DashboardRightPanelSection, DashboardRightPanelTabs, DashboardSidebar, DashboardSidebarProfile, DashboardSidebarProfilePopover, SidebarProvider, useSidebar, } from "./layout";
115
- export type { DashboardContentProps, DashboardLayoutProps, DashboardRightPanelBodyProps, DashboardRightPanelHeaderProps, DashboardRightPanelMode, DashboardRightPanelProps, DashboardRightPanelSectionProps, DashboardRightPanelTabsProps, DashboardSidebarNavDropdownItem, DashboardSidebarNavGroup, DashboardSidebarNavItem, DashboardSidebarNavLinkItem, DashboardSidebarProfileProps, DashboardSidebarProfilePopoverProps, } from "./layout";
122
+ export { DashboardActionPanel, DashboardActionPanelEmptyState, DashboardContent, DashboardLayout, DashboardRightPanel, DashboardRightPanelBody, DashboardRightPanelHeader, DashboardRightPanelSection, DashboardRightPanelTabs, DashboardSidebar, DashboardSidebarProfile, DashboardSidebarProfilePopover, SidebarProvider, useSidebar, } from "./layout";
123
+ export type { DashboardActionPanelProps, DashboardActionPanelEmptyStateProps, DashboardContentProps, DashboardLayoutProps, DashboardRightPanelBodyProps, DashboardRightPanelHeaderProps, DashboardRightPanelMode, DashboardRightPanelProps, DashboardRightPanelSectionProps, DashboardRightPanelTabsProps, DashboardSidebarNavDropdownItem, DashboardSidebarNavGroup, DashboardSidebarNavItem, DashboardSidebarNavLinkItem, DashboardSidebarProfileProps, DashboardSidebarProfilePopoverProps, } from "./layout";
116
124
  export { PageHeader } from "./page-header";
117
125
  export { PageLayout, PageLayoutContext, PageLayoutControls, PageLayoutHeader, PageLayoutSection, PageLayoutStack, PageLayoutTitle, pageLayoutGapClassNames, pageLayoutStackGapClassNames, } from "./page-layout";
118
126
  export type { PageLayoutGap, PageLayoutProps, PageLayoutStackGap, PageLayoutStackProps, PageLayoutTitleProps, } from "./page-layout";
@@ -134,7 +142,7 @@ export type { TableColumnVisibilityMenuProps } from "./table-column-visibility";
134
142
  export { useTableSort } from "./use-table-sort";
135
143
  export type { UseTableSortOptions, UseTableSortReturn, } from "./use-table-sort";
136
144
  export { Table, TableRoot, TableContainer, TableHeader, TableBody, TableFooter, TableHead, TableRow, TableCell, TableRowHeader, TableCaption, TableRowSkeleton, TABLE_SKELETON_PRESETS, } from "./table";
137
- export type { TableColumn, TableColumnWidths, TableProps, TableResizeMode, TableRowExpansionProps, TableRowTone, TableSortDirection, TableSortingProps, TableSkeletonConfig, TableRowSkeletonProps, } from "./table";
145
+ export type { TableColumn, TableColumnWidths, TableProps, TableResizeMode, TableRowExpansionProps, TableRowIndicatorProps, TableRowTone, TableSortDirection, TableSortingProps, TableSkeletonConfig, TableRowSkeletonProps, } from "./table";
138
146
  export type { TableColumnFilter, TableColumnFilterOption, TableDateColumnFilter, TableDateRangeColumnFilter, TableOptionsColumnFilter, TableTextColumnFilter, } from "./table-column-filter";
139
147
  export { Tabs, SubTabs, TabsRoot, TabWithDropdown, type TabsItem, type TabsItemLabel, type TabsItemLabelProps, type TabsProps, type SubTabsItem, type SubTabsProps, TabsList, TabsTrigger, TabsContent, type TabWithDropdownProps, useTabsContext, type TabDropdownSection, } from "./tabs";
140
148
  export { Tooltip, TooltipRoot, TooltipTrigger, TooltipContent, TooltipProvider, type TooltipProps, } from "./tooltip";
package/dist/index.js CHANGED
@@ -3,9 +3,10 @@ export { AvatarProfilePopover, AvatarProfilePopoverContent, AvatarProfilePopover
3
3
  export * from "./animated-icons";
4
4
  export { Alert, AlertAction, AlertConsent, alertVariants, } from "./alert";
5
5
  export { AlertStack } from "./alert-stack";
6
+ export { ActivityCard, ActivityCardActor, ActivityCardContent, } from "./activity-card";
6
7
  export { Badge, badgeVariants } from "./badge";
7
8
  export { Card, CardGrid, CardSplitGrid, CardList, CardListItem, } from "./card";
8
- export { MessageAttachmentRow, MessageItem, MessageNewDivider, MessageThread, formatMessageDate, } from "./message-item";
9
+ export { MessageAttachmentRow, MessageItem, MessageNewDivider, MessageThread, formatMessageCardTimestamp, formatMessageDate, } from "./message-item";
9
10
  export { formatNotificationTimestamp, NotificationItem, NotificationList, NotificationPopover, NotificationTrigger, } from "./notification";
10
11
  export { RoutingTimeline } from "./routing-timeline";
11
12
  export { RichTextEditor, formatFileSize, replaceTemplateVariables, sanitizeRichTextHtml, } from "./rich-text-editor";
@@ -15,6 +16,7 @@ export { Switch } from "./switch";
15
16
  export { ThemeSwitcher } from "./theme-switcher";
16
17
  export { DateInput } from "./date-input";
17
18
  export { CountBadge } from "./count-badge";
19
+ export { StatusDot } from "./status-dot";
18
20
  export { EmptyState } from "./empty-state";
19
21
  export { EditableTable } from "./editable-table";
20
22
  export { EditButton } from "./edit-button";
@@ -46,6 +48,8 @@ export { useFileUpload } from "./use-file-upload";
46
48
  export { Popover, PopoverTitle } from "./popover";
47
49
  export { PopoverMenuContent, PopoverMenuCheckboxItem, PopoverMenuHeader, PopoverMenuSection, PopoverMenuItem, PopoverMenuDivider, PopoverMenuFooter, PopoverMenuFooterAction, PopoverMenuFooterMeta, PopoverMenuGroup, PopoverMenuGroupLabel, PopoverMenuSearch, PopoverMenuScrollArea, PopoverMenuView, } from "./popover-menu";
48
50
  export { SearchInput } from "./search-input";
51
+ export { CompoundSearchInput } from "./compound-search-input";
52
+ export { Autocomplete, AutocompleteOptions, AutocompletePopover, useAutocompleteController, } from "./autocomplete";
49
53
  export { SectionNav } from "./section-nav";
50
54
  export { GovtMasthead } from "./govt-masthead";
51
55
  export { GuidanceTip } from "./guidance-tip";
@@ -57,7 +61,7 @@ export { useViewportThreshold } from "./use-viewport-threshold";
57
61
  export { Textarea } from "./textarea";
58
62
  export { DraggableTabs, } from "./draggable-tabs";
59
63
  export { Drawer, } from "./drawer";
60
- export { DashboardContent, DashboardLayout, DashboardRightPanel, DashboardRightPanelBody, DashboardRightPanelHeader, DashboardRightPanelSection, DashboardRightPanelTabs, DashboardSidebar, DashboardSidebarProfile, DashboardSidebarProfilePopover, SidebarProvider, useSidebar, } from "./layout";
64
+ export { DashboardActionPanel, DashboardActionPanelEmptyState, DashboardContent, DashboardLayout, DashboardRightPanel, DashboardRightPanelBody, DashboardRightPanelHeader, DashboardRightPanelSection, DashboardRightPanelTabs, DashboardSidebar, DashboardSidebarProfile, DashboardSidebarProfilePopover, SidebarProvider, useSidebar, } from "./layout";
61
65
  export { PageHeader } from "./page-header";
62
66
  export { PageLayout, PageLayoutContext, PageLayoutControls, PageLayoutHeader, PageLayoutSection, PageLayoutStack, PageLayoutTitle, pageLayoutGapClassNames, pageLayoutStackGapClassNames, } from "./page-layout";
63
67
  export { WorkspaceHeader } from "./workspace-header";
@@ -32,14 +32,14 @@ function LabelValueGrid({ items, columns = 4, density = "default", className, it
32
32
  const element = containerRef.current;
33
33
  if (!element)
34
34
  return;
35
- const GAP_PX = 24;
36
35
  let frameId = null;
37
36
  const updateColumns = () => {
38
37
  const width = getAvailableWidth(element);
39
38
  if (width <= 0) {
40
39
  return;
41
40
  }
42
- setResolvedColumns(getResponsiveColumnCount(width, columns, resolvedMinColumnWidth, GAP_PX));
41
+ const columnGap = Number.parseFloat(window.getComputedStyle(element).columnGap) || 0;
42
+ setResolvedColumns(getResponsiveColumnCount(width, columns, resolvedMinColumnWidth, columnGap));
43
43
  };
44
44
  const requestUpdate = () => {
45
45
  if (frameId !== null) {
@@ -63,8 +63,10 @@ function LabelValueGrid({ items, columns = 4, density = "default", className, it
63
63
  window.removeEventListener("resize", requestUpdate);
64
64
  observer.disconnect();
65
65
  };
66
- }, [columns, resolvedMinColumnWidth]);
67
- return (_jsx("div", { ref: containerRef, className: cn("grid auto-rows-fr items-start gap-x-6 gap-y-6", className), style: {
66
+ }, [columns, density, resolvedMinColumnWidth]);
67
+ return (_jsx("div", { ref: containerRef, className: cn("grid items-start", density === "compact"
68
+ ? "auto-rows-auto gap-x-4 gap-y-3"
69
+ : "auto-rows-fr gap-x-6 gap-y-6", className), style: {
68
70
  ...style,
69
71
  gridTemplateColumns: `repeat(${resolvedColumns}, minmax(0, 1fr))`,
70
72
  }, ...props, children: resolvedItems.map((item, index) => {
package/dist/layout.d.ts CHANGED
@@ -2,10 +2,13 @@ import * as React from "react";
2
2
  import { type AvatarProfileProps } from "./avatar";
3
3
  import { type AvatarProfilePopoverProps } from "./avatar-profile-popover";
4
4
  import { type CountBadgeProps } from "./count-badge";
5
+ import { type EmptyStateProps } from "./empty-state";
5
6
  import { type TabsProps } from "./tabs";
6
7
  export type DashboardRightPanelMode = "responsive" | "persistent";
7
8
  type SidebarContextType = {
8
9
  isCollapsed: boolean;
10
+ isContentCollapsed: boolean;
11
+ isContentVisible: boolean;
9
12
  toggle: () => void;
10
13
  collapse: () => void;
11
14
  };
@@ -60,10 +63,14 @@ export interface DashboardSidebarProps extends React.HTMLAttributes<HTMLElement>
60
63
  logo?: React.ReactNode | ((context: {
61
64
  isCollapsed: boolean;
62
65
  }) => React.ReactNode);
66
+ /** Replaces the default expand chevron while the sidebar is collapsed. */
67
+ collapsedToggleIcon?: React.ReactNode;
63
68
  search?: React.ReactNode | ((context: {
64
69
  isCollapsed: boolean;
65
70
  }) => React.ReactNode);
66
71
  navGroups?: DashboardSidebarNavGroup[];
72
+ /** Shows a divider between sidebar search and navigation. */
73
+ showNavigationDivider?: boolean;
67
74
  footerItems?: DashboardSidebarNavItem[];
68
75
  footer?: React.ReactNode | ((context: {
69
76
  isCollapsed: boolean;
@@ -123,7 +130,7 @@ export interface DashboardSidebarProfilePopoverProps extends Omit<DashboardSideb
123
130
  }
124
131
  declare function DashboardSidebarProfile({ isCollapsed, ...props }: DashboardSidebarProfileProps): import("react/jsx-runtime").JSX.Element;
125
132
  declare function DashboardSidebarProfilePopover({ align, alignOffset, avoidCollisions, children, collisionPadding, contentClassName, defaultOpen, modal, onOpenChange, open, side, sideOffset, triggerAriaLabel, triggerClassName, ...profileProps }: DashboardSidebarProfilePopoverProps): import("react/jsx-runtime").JSX.Element;
126
- declare function DashboardSidebar({ className, children, logo, search, navGroups, footerItems, footer, toggleAriaLabel, ...props }: DashboardSidebarProps): import("react/jsx-runtime").JSX.Element;
133
+ declare function DashboardSidebar({ className, children, logo, collapsedToggleIcon, search, navGroups, showNavigationDivider, footerItems, footer, toggleAriaLabel, ...props }: DashboardSidebarProps): import("react/jsx-runtime").JSX.Element;
127
134
  export interface DashboardContentProps extends React.HTMLAttributes<HTMLElement> {
128
135
  hasSidebar?: boolean;
129
136
  rightPanel?: React.ReactNode;
@@ -142,16 +149,38 @@ export interface DashboardContentProps extends React.HTMLAttributes<HTMLElement>
142
149
  surfaceClassName?: string;
143
150
  }
144
151
  export interface DashboardRightPanelProps extends React.HTMLAttributes<HTMLDivElement> {
152
+ /** `plain` uses the base background used by Figma two-panel workflows. */
153
+ surface?: "default" | "plain";
154
+ }
155
+ export interface DashboardActionPanelProps extends Omit<DashboardRightPanelProps, "surface" | "title"> {
156
+ /** Stable identity that can be used by a future movable-panel controller. */
157
+ panelId?: string;
158
+ headerSpacing?: DashboardRightPanelHeaderProps["spacing"];
159
+ title: React.ReactNode;
160
+ subtitle?: React.ReactNode;
161
+ badge?: React.ReactNode;
162
+ action?: React.ReactNode;
163
+ headerChildren?: React.ReactNode;
164
+ }
165
+ export interface DashboardActionPanelEmptyStateProps extends EmptyStateProps {
145
166
  }
146
167
  export interface DashboardRightPanelHeaderProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "title"> {
168
+ /** Fixed 16px card inset for composed message panels. */
169
+ spacing?: "default" | "comfortable";
147
170
  title: React.ReactNode;
148
171
  subtitle?: React.ReactNode;
149
172
  badge?: React.ReactNode;
150
173
  action?: React.ReactNode;
151
174
  }
152
175
  export interface DashboardRightPanelBodyProps extends React.HTMLAttributes<HTMLDivElement> {
176
+ /** Inset used by the panel body. `spacious` matches wide two-panel workflows. */
177
+ spacing?: "default" | "comfortable" | "spacious";
178
+ /** Removes the body top inset so the first item follows the panel header without a second gap. */
179
+ topInset?: "default" | "none";
153
180
  /** Fixed footer content such as a composer or action bar. */
154
181
  footer?: React.ReactNode;
182
+ /** Adds a full-width divider and an independently padded footer surface. */
183
+ footerVariant?: "inline" | "separated";
155
184
  /** Class names applied to the scrollable body content when `footer` is provided. */
156
185
  contentClassName?: string;
157
186
  /** Class names applied to the fixed footer wrapper. */
@@ -164,11 +193,15 @@ export interface DashboardRightPanelSectionProps extends Omit<React.HTMLAttribut
164
193
  descriptionClassName?: string;
165
194
  }
166
195
  export interface DashboardRightPanelTabsProps extends TabsProps {
196
+ /** Inset around the segmented tab list. */
197
+ spacing?: "default" | "spacious";
167
198
  }
168
199
  declare function DashboardRightPanelSection({ className, title, description, titleClassName, descriptionClassName, children, ...props }: DashboardRightPanelSectionProps): import("react/jsx-runtime").JSX.Element;
169
- declare function DashboardRightPanelTabs({ className, listWrapperClassName, panelClassName, ...props }: DashboardRightPanelTabsProps): import("react/jsx-runtime").JSX.Element;
170
- declare function DashboardRightPanel({ className, ...props }: DashboardRightPanelProps): import("react/jsx-runtime").JSX.Element;
171
- declare function DashboardRightPanelHeader({ className, title, subtitle, badge, action, children, ...props }: DashboardRightPanelHeaderProps): import("react/jsx-runtime").JSX.Element;
172
- declare function DashboardRightPanelBody({ className, contentClassName, footer, footerClassName, children, ...props }: DashboardRightPanelBodyProps): import("react/jsx-runtime").JSX.Element;
200
+ declare function DashboardRightPanelTabs({ className, listWrapperClassName, panelClassName, spacing, size, ...props }: DashboardRightPanelTabsProps): import("react/jsx-runtime").JSX.Element;
201
+ declare const DashboardRightPanel: React.ForwardRefExoticComponent<DashboardRightPanelProps & React.RefAttributes<HTMLDivElement>>;
202
+ declare function DashboardRightPanelHeader({ className, spacing, title, subtitle, badge, action, children, ...props }: DashboardRightPanelHeaderProps): import("react/jsx-runtime").JSX.Element;
203
+ declare const DashboardActionPanel: React.ForwardRefExoticComponent<DashboardActionPanelProps & React.RefAttributes<HTMLDivElement>>;
204
+ declare function DashboardActionPanelEmptyState(props: DashboardActionPanelEmptyStateProps): import("react/jsx-runtime").JSX.Element;
205
+ declare function DashboardRightPanelBody({ className, contentClassName, footer, footerVariant, footerClassName, spacing, topInset, children, ...props }: DashboardRightPanelBodyProps): import("react/jsx-runtime").JSX.Element;
173
206
  declare function DashboardContent({ className, hasSidebar, rightPanel, rightPanelClassName, rightPanelFallbackTrigger, rightPanelMode, rightPanelResizable, rightPanelCollapsible, rightPanelCollapsed, defaultRightPanelCollapsed, onRightPanelCollapsedChange, rightPanelDefaultWidth, rightPanelMinWidth, rightPanelMaxWidth, rightPanelAutoCollapseSidebarBreakpoint, surfaceClassName, children, ...props }: DashboardContentProps): import("react/jsx-runtime").JSX.Element;
174
- export { DashboardLayout, DashboardSidebar, DashboardSidebarProfile, DashboardSidebarProfilePopover, DashboardContent, DashboardRightPanel, DashboardRightPanelHeader, DashboardRightPanelBody, DashboardRightPanelSection, DashboardRightPanelTabs, };
207
+ export { DashboardLayout, DashboardSidebar, DashboardSidebarProfile, DashboardSidebarProfilePopover, DashboardContent, DashboardActionPanel, DashboardActionPanelEmptyState, DashboardRightPanel, DashboardRightPanelHeader, DashboardRightPanelBody, DashboardRightPanelSection, DashboardRightPanelTabs, };