@sableui/react 0.10.0 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # What's new
2
2
 
3
+ ## 0.11.0
4
+
5
+ - **New: `PropertyGroup`, a collapsible group inside a PanelSection.** The
6
+ row names the group, summarises its value while closed (a word, a few
7
+ swatches, or both), and opens with +/− to the rows beneath. It's sized for
8
+ a tool panel, where an Accordion is page furniture. Groups open
9
+ independently and stack with a hairline between them.
10
+ - **sableui.com's Customize panel: the Color section is rebuilt on it.**
11
+ It now reads Brand color, then Primary action (with colour dots), then
12
+ three groups: Color palette (the families and Pull to brand), Tones (tones
13
+ and status) and Neutrals. Each group summarises itself with its own
14
+ swatches, and Tones and Neutrals are chosen from a list that previews what
15
+ each option would paint. The section has its own Reset.
16
+
3
17
  ## 0.10.0
4
18
 
5
19
  A palette generated from the theme, numbered extra tones, and sample content that isn't a marketplace.
@@ -1,8 +1,9 @@
1
1
  // src/components/panel-section/index.ts
2
- import { PanelSection, PropertyPair, PropertyRow } from "./panel-section.js";
2
+ import { PanelSection, PropertyGroup, PropertyPair, PropertyRow } from "./panel-section.js";
3
3
  import { panelSectionMeta } from "./panel-section.meta.js";
4
4
  export {
5
5
  PanelSection,
6
+ PropertyGroup,
6
7
  PropertyPair,
7
8
  PropertyRow,
8
9
  panelSectionMeta
@@ -1,8 +1,10 @@
1
1
  "use client";
2
2
 
3
3
  // src/components/panel-section/panel-section.tsx
4
+ import { Icon } from "../../icon/index.js";
4
5
  import { cn } from "../../lib/cn.js";
5
6
  import { beginScrub } from "../../lib/scrub-gesture.js";
7
+ import { Collapsible, CollapsiblePanel, CollapsibleTrigger } from "../collapsible/collapsible.js";
6
8
  import { jsx, jsxs } from "react/jsx-runtime";
7
9
  function PanelSection({
8
10
  title,
@@ -108,8 +110,21 @@ function PropertyPair({ labels, className, children, ...props }) {
108
110
  ] });
109
111
  }
110
112
  PropertyPair.displayName = "PropertyPair";
113
+ function PropertyGroup({ label, summary, className, children, ...props }) {
114
+ return /* @__PURE__ */ jsxs(Collapsible, { className: cn("border-t border-hairline", className), ...props, children: [
115
+ /* @__PURE__ */ jsxs(CollapsibleTrigger, { className: "group/property-group flex h-(--control-sm) w-full items-center gap-2 rounded-xs text-start motion-interactive focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring", children: [
116
+ /* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1 truncate text-ui-md text-foreground", children: label }),
117
+ summary != null ? /* @__PURE__ */ jsx("span", { className: "flex min-w-0 shrink items-center gap-2 truncate text-ui-md text-muted-foreground", children: summary }) : null,
118
+ /* @__PURE__ */ jsx(Icon, { name: "plus", className: "shrink-0 text-xs text-muted-foreground group-data-[panel-open]/property-group:hidden" }),
119
+ /* @__PURE__ */ jsx(Icon, { name: "minus", className: "hidden shrink-0 text-xs text-muted-foreground group-data-[panel-open]/property-group:block" })
120
+ ] }),
121
+ /* @__PURE__ */ jsx(CollapsiblePanel, { children: /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-1.5 pt-0.5 pb-2", children }) })
122
+ ] });
123
+ }
124
+ PropertyGroup.displayName = "PropertyGroup";
111
125
  export {
112
126
  PanelSection,
127
+ PropertyGroup,
113
128
  PropertyPair,
114
129
  PropertyRow
115
130
  };
@@ -60,6 +60,11 @@ var panelSectionMeta = {
60
60
  name: "PropertyPair",
61
61
  required: false,
62
62
  description: "Two controls side by side, with optional captions above each."
63
+ },
64
+ {
65
+ name: "PropertyGroup",
66
+ required: false,
67
+ description: "A set of properties folded behind one row that names the group and summarises its value, opening with +/\u2212 to the controls beneath."
63
68
  }
64
69
  ]
65
70
  },
@@ -89,9 +94,15 @@ var panelSectionMeta = {
89
94
  name: "PropertyPair",
90
95
  type: "{ labels?: [ReactNode, ReactNode] }",
91
96
  description: "Two controls side by side in a 2-up grid, with optional captions above each."
97
+ },
98
+ {
99
+ name: "PropertyGroup",
100
+ type: "{ label: ReactNode; summary?: ReactNode; defaultOpen?: boolean; open?: boolean; onOpenChange?: (open: boolean) => void }",
101
+ description: "A collapsible set of properties inside a section, at the panel's scale (an Accordion is page furniture). The row shows the label, then the summary (the group's value, readable while closed: a word, a few swatches, or both), then a + that turns to \u2212 when open. Groups open independently and stack with a hairline between them. Built on Collapsible."
92
102
  }
93
103
  ],
94
104
  a11y: [
105
+ "PropertyGroup's row is a real button with aria-expanded (Collapsible); its summary is part of the button's name, so a closed group still announces its value.",
95
106
  "PropertyRow renders a real <label>; pass htmlFor with the control's id so clicking the label focuses it.",
96
107
  "The section title is an h3, so panels contribute a real heading outline rather than styled divs.",
97
108
  "`hint` is exposed as the label's title attribute \u2014 keep the essential meaning in the label itself, since title text is not reliably announced.",
@@ -99,6 +110,27 @@ var panelSectionMeta = {
99
110
  ],
100
111
  tokensUsed: ["foreground", "muted-foreground", "hairline"],
101
112
  examples: [
113
+ {
114
+ label: "Groups that fold behind their value",
115
+ code: `<PanelSection title="Color">
116
+ <PropertyGroup label="Tones" summary="Brand only">
117
+ <PropertyRow label="Scheme">
118
+ <Select value="brand">
119
+ <SelectTrigger size="xs" />
120
+ <SelectContent>
121
+ <SelectItem value="brand">Brand only</SelectItem>
122
+ <SelectItem value="harmonize">Harmonize</SelectItem>
123
+ </SelectContent>
124
+ </Select>
125
+ </PropertyRow>
126
+ </PropertyGroup>
127
+ <PropertyGroup label="Grid" summary="8px">
128
+ <PropertyRow label="Size">
129
+ <ScrubField label="Grid size" value={8} min={1} max={64} suffix="px" />
130
+ </PropertyRow>
131
+ </PropertyGroup>
132
+ </PanelSection>`
133
+ },
102
134
  {
103
135
  label: "Blending section, 2-up",
104
136
  code: `<PanelSection title="Blending">
@@ -303,9 +303,9 @@
303
303
  "dist/components/panel-group/index.js": "8589d6450207f608",
304
304
  "dist/components/panel-group/panel-group.js": "c473a2d520fe8261",
305
305
  "dist/components/panel-group/panel-group.meta.js": "01aa9dd4ecaa2f51",
306
- "dist/components/panel-section/index.js": "9f8c3d0a6668ba85",
307
- "dist/components/panel-section/panel-section.js": "55dd272454076682",
308
- "dist/components/panel-section/panel-section.meta.js": "566e0823da5c6972",
306
+ "dist/components/panel-section/index.js": "055470e0a68862e6",
307
+ "dist/components/panel-section/panel-section.js": "63f5d7e43aa3fac5",
308
+ "dist/components/panel-section/panel-section.meta.js": "fd4e8f37b0edfd5e",
309
309
  "dist/components/phone/index.js": "956a5f3563a1e665",
310
310
  "dist/components/phone/phone.js": "72c74b0134619fdf",
311
311
  "dist/components/phone/phone.meta.js": "6653edae4b4cb9ff",
@@ -471,8 +471,8 @@
471
471
  "dist/icon-sets/brands.js": "9a37d8739f14f2a9",
472
472
  "dist/icon-sets/reicon.d.ts": "52f6e41dc8137b4e",
473
473
  "dist/icon-sets/reicon.js": "89a930f17cc90cde",
474
- "dist/index.d.ts": "f8ac35e27e3846bf",
475
- "dist/index.js": "ff812f2ebe7eed90",
474
+ "dist/index.d.ts": "798dee76b8ecf0a4",
475
+ "dist/index.js": "245552095995fc9c",
476
476
  "dist/ios/chrome.css": "a7ca9e3735d8658e",
477
477
  "dist/ios/chrome.js": "37091fef7b68bd28",
478
478
  "dist/ios/frame.css": "dd2703c944ce575a",
package/dist/index.d.ts CHANGED
@@ -2746,11 +2746,11 @@ type SeparatorProps$1 = Omit<ComponentProps<typeof Menu$1.Separator>, "className
2746
2746
  };
2747
2747
  /** A hairline rule between item runs. Bleeds past the popup padding. */
2748
2748
  declare function MenuSeparator({ className, ...props }: SeparatorProps$1): react.JSX.Element;
2749
- type GroupProps$2 = Omit<ComponentProps<typeof Menu$1.Group>, "className"> & {
2749
+ type GroupProps$3 = Omit<ComponentProps<typeof Menu$1.Group>, "className"> & {
2750
2750
  className?: string;
2751
2751
  };
2752
2752
  /** Groups related items with a label for screen readers. */
2753
- declare function MenuGroup({ className, ...props }: GroupProps$2): react.JSX.Element;
2753
+ declare function MenuGroup({ className, ...props }: GroupProps$3): react.JSX.Element;
2754
2754
  type GroupLabelProps$2 = Omit<ComponentProps<typeof Menu$1.GroupLabel>, "className"> & {
2755
2755
  className?: string;
2756
2756
  };
@@ -3989,11 +3989,11 @@ type SeparatorProps = Omit<ComponentProps<typeof ContextMenu$1.Separator>, "clas
3989
3989
  };
3990
3990
  /** A hairline rule between item runs. Bleeds past the popup padding. */
3991
3991
  declare function ContextMenuSeparator({ className, ...props }: SeparatorProps): react.JSX.Element;
3992
- type GroupProps$1 = Omit<ComponentProps<typeof ContextMenu$1.Group>, "className"> & {
3992
+ type GroupProps$2 = Omit<ComponentProps<typeof ContextMenu$1.Group>, "className"> & {
3993
3993
  className?: string;
3994
3994
  };
3995
3995
  /** Groups related items with a label for screen readers. */
3996
- declare function ContextMenuGroup({ className, ...props }: GroupProps$1): react.JSX.Element;
3996
+ declare function ContextMenuGroup({ className, ...props }: GroupProps$2): react.JSX.Element;
3997
3997
  type GroupLabelProps = Omit<ComponentProps<typeof ContextMenu$1.GroupLabel>, "className"> & {
3998
3998
  className?: string;
3999
3999
  };
@@ -4679,6 +4679,36 @@ declare function PropertyPair({ labels, className, children, ...props }: PairPro
4679
4679
  declare namespace PropertyPair {
4680
4680
  var displayName: string;
4681
4681
  }
4682
+ type GroupProps$1 = Omit<ComponentProps<typeof Collapsible>, "children" | "className"> & {
4683
+ /** The group's name. */
4684
+ label: ReactNode;
4685
+ /**
4686
+ * What the group is set to, readable while it is closed: a value ("Cool",
4687
+ * "200% pull"), a few swatches, or both. Sits before the indicator.
4688
+ */
4689
+ summary?: ReactNode;
4690
+ className?: string;
4691
+ children: ReactNode;
4692
+ };
4693
+ /**
4694
+ * PropertyGroup — a set of properties that folds behind one row, inside a
4695
+ * PanelSection: the row names the group and summarises its value, and opens to
4696
+ * the controls beneath it. The +/− tools use for "more here" (Figma's
4697
+ * collapsible layer properties), at the panel's own scale — an Accordion is
4698
+ * page furniture, its title-sized trigger twice the height of a property row.
4699
+ *
4700
+ * Each group opens on its own, so two can be compared side by side. Groups
4701
+ * stack with a hairline between them; the summary is what keeps a closed
4702
+ * group honest, so give it the value, not a restatement of the label.
4703
+ *
4704
+ * <PropertyGroup label="Neutrals" summary="Cool">
4705
+ * <PropertyRow label="Tint">…</PropertyRow>
4706
+ * </PropertyGroup>
4707
+ */
4708
+ declare function PropertyGroup({ label, summary, className, children, ...props }: GroupProps$1): react.JSX.Element;
4709
+ declare namespace PropertyGroup {
4710
+ var displayName: string;
4711
+ }
4682
4712
 
4683
4713
  declare const panelSectionMeta: ComponentMeta;
4684
4714
 
@@ -8443,6 +8473,6 @@ declare const PALETTE_TONES: readonly ["tone-1", "tone-2", "tone-3", "tone-info"
8443
8473
  /** Everything the palette names: neutral, the families, then the tone scales. */
8444
8474
  declare const PALETTE_SCALES: readonly ["neutral", ...string[], "tone-1", "tone-2", "tone-3", "tone-info", "tone-warning", "success", "destructive"];
8445
8475
 
8446
- declare const SABLE_UI_VERSION: "0.10.0";
8476
+ declare const SABLE_UI_VERSION: "0.11.0";
8447
8477
 
8448
- export { Accordion, AccordionItem, AccordionPanel, AccordionTrigger, AlertDialog, AlertDialogClose, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogTitle, AlertDialogTrigger, AppHeader, type AppHeaderProps, AppShell, type AppShellProps, AreaChart, type AreaChartProps, type ArtTone, Attachment, type AttachmentProps, Avatar, AvatarFallback, AvatarGroup, AvatarGroupCount, type AvatarGroupCountProps, type AvatarGroupProps, AvatarImage, type AvatarProps, AvatarRoot, BADGE_APPEARANCES, BADGE_TONES, Badge, type BadgeAppearance, type BadgeProps, type BadgeTone, Banner, type BannerProps, BarChart, type BarChartProps, BottomNav, BottomNavItem, type BottomNavItemProps, BreadcrumbItem, type BreadcrumbItemProps, BreadcrumbLink, type BreadcrumbLinkProps, BreadcrumbPage, type BreadcrumbPageProps, BreadcrumbSeparator, type BreadcrumbSeparatorProps, Breadcrumbs, type BreadcrumbsProps, Browser, type BrowserProps, Bubble, type BubbleProps, BubbleReaction, type BubbleReactionProps, BubbleReactions, type BubbleReactionsProps, Button, type ButtonBleed, type ButtonProps, CHART_SERIES_COUNT, COMPONENT_GROUPS, COMPONENT_TAXONOMY, Calendar, type CalendarProps, Card, CardAction, CardContent, type CardContentProps, CardDescription, CardFooter, type CardFooterProps, CardHeader, CardList, type CardProps, CardTitle, type CardTitleProps, Carousel, type CarouselProps, type CarouselSlidesToShow, type ChartCategories, type ChartCenterLabel, type ChartCurve, type ChartDatum, type ChartSeries, type ChartTone, type ChartTooltipIndicator, type ChartTooltipOptions, type ChartValueFormatter, ChatComposer, type ChatComposerProps, Checkbox, CheckboxCard, type CheckboxCardProps, type CheckboxCardTone, CheckboxGroup, type CheckboxGroupProps, Code, CodeBlock, type CodeBlockProps, CodeHighlightProvider, type CodeHighlighter, type CodeProps, Collapsible, CollapsibleIndicator, CollapsiblePanel, CollapsibleTrigger, ColorField, type ColorFieldProps, Combobox, ComboboxChips, ComboboxClear, ComboboxContent, ComboboxEmpty, ComboboxGroup, ComboboxGroupLabel, ComboboxInput, ComboboxItem, type ComboboxItemGroup, ComboboxItemIndicator, ComboboxList, ComboboxPortal, type ComboboxProps, ComboboxValue, ComboboxVirtualList, type ComboboxVirtualListProps, type CommandFilter, type CommandItem, CommandMenu, CommandMenuGroup, type CommandMenuGroupProps, CommandMenuItem, type CommandMenuItemProps, CommandMenuPanel, type CommandMenuPanelProps, type CommandMenuProps, CommandMenuTrigger, type CommandMenuTriggerProps, type ComponentGroup, type ComponentGuidance, ComponentMeta, type ComponentRegister, type ConstraintFlag, ContextCard, ContextCardArrow, ContextCardContent, ContextCardPortal, ContextCardTrigger, ContextMenu, ContextMenuContent, ContextMenuGroup, ContextMenuGroupLabel, ContextMenuItem, ContextMenuPortal, ContextMenuSeparator, ContextMenuTrigger, DataTable, type DataTableColumn, type DataTableProps, type DataTableRowKey, DatePicker, type DatePickerProps, DateTile, type DateTileProps, Density, DensityProvider, Density as DensityValue, DestructiveActionModal, type DestructiveActionModalProps, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, type DialogSize, DialogTitle, DialogTrigger, DisclosurePicker, DisclosurePickerEmpty, DisclosurePickerList, type DisclosurePickerListProps, DisclosurePickerOption, type DisclosurePickerOptionProps, DisclosurePickerPanel, type DisclosurePickerPanelProps, type DisclosurePickerProps, type DisclosurePickerSearch, DisclosurePickerTrigger, type DisclosurePickerTriggerProps, EmptyState, type EmptyStateProps, Entity, type EntityProps, Feedback, type FeedbackData, type FeedbackProps, type FeedbackRating, Field, type FieldProps, Fieldset, FieldsetContent, FieldsetDescription, FieldsetFooter, FieldsetLegend, type FieldsetVariant, FileDropzone, type FileDropzoneProps, type FileRejection, type FileRejectionCode, FontPicker, type FontPickerFont, type FontPickerOption, type FontPickerProps, Form, type FormProps, GlidingHighlight, type GlidingHighlightProps, GradientArt, type GradientArtProps, type Hsv, InlineStatus, type InlineStatusProps, type StatusTone as InlineTone, Input, type InputProps$1 as InputProps, Kbd, KbdGroup, type KbdGroupProps, type KbdProps, Label, type LabelProps$2 as LabelProps, LineChart, type LineChartProps, Marker, type MarkerProps, Marquee, type MarqueeProps, MediaImage, type MediaImageProps, MediaTile, type MediaTileProps, Menu, MenuCheckboxItem, MenuContent, MenuGroup, MenuGroupLabel, MenuItem, MenuPortal, MenuRadioGroup, MenuRadioItem, MenuSeparator, MenuSubmenu, MenuSubmenuTrigger, MenuTrigger, Message, type MessageProps, MessageScroller, type MessageScrollerHandle, type MessageScrollerProps, Meter, MeterIndicator, MeterLabel, type MeterSize, type MeterTone, MeterTrack, MeterValue, MiddleTruncate, type MiddleTruncateProps, type MotionPolicy, MotionProvider, type MotionProviderProps, Note, type NoteAction, type NoteProps, NotificationBadge, type NotificationBadgeProps, NumberField, type NumberFieldProps, type OrbMode, type OrbSize, OtpField, type OtpFieldProps, OverflowMenu, type OverflowMenuProps, PALETTE_COLORS, PALETTE_FAMILIES, PALETTE_SCALES, PALETTE_STEPS, PALETTE_TONES, PageHeader, type PageHeaderProps, PageLoader, type PageLoaderProps, Pagination, type PaginationProps, type PaletteColor, type PaletteFamily, type PaletteStep, Panel, PanelGroup, PanelResizer, type PanelResizerProps, PanelSection, type PanelWidthBounds, Phone, type PhoneProps, PieChart, type PieChartProps, Pill, type PillProps, Popover, PopoverArrow, PopoverClose, PopoverContent, PopoverDescription, PopoverPortal, PopoverTitle, PopoverTrigger, Presence, type PresenceProps, type Presentation, PresentationProvider, Progress, ProgressIndicator, ProgressLabel, type ProgressSize, ProgressTrack, ProgressValue, PropertyPair, PropertyRow, RadarChart, type RadarChartProps, RadialChart, type RadialChartProps, Radio, RadioCard, type RadioCardProps, type RadioCardTone, RadioGroup, RelativeTime, type RelativeTimeProps, Reveal, type RevealProps, type Rgb, SABLE_UI_VERSION, SEGMENTED_BAR_TONES, STATUS_TONES, STATUS_TONE_ICON, type ScrollCommandOptions, Scroller, type ScrollerProps, ScrubField, type ScrubFieldProps, SearchInput, type SearchInputProps, SectionHeader, type SectionHeaderProps, SegmentedBar, type SegmentedBarProps, type SegmentedBarSegment, type SegmentedBarTone, Select, SelectContent, SelectGroup, SelectGroupLabel, SelectItem, SelectPortal, SelectSeparator, SelectTrigger, SelectValue, Separator, type SeparatorProps$3 as SeparatorProps, SettingsMenu, type SettingsMenuProps, SettingsRow, type SettingsRowProps, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetList, SheetPortal, SheetTitle, SheetTrigger, ShowMore, type ShowMoreProps, SideNav, type SideNavActiveVariant, SideNavGroup, type SideNavGroupProps, SideNavItem, type SideNavItemProps, type SideNavProps, type SideNavSize, Sidebar, SidebarBrand, type SidebarBrandProps, SidebarFooter, SidebarHeader, SidebarItem, type SidebarItemProps, SidebarNav, type SidebarProps, SimpleTooltip, Skeleton, SkipLink, Slider, SliderControl, SliderIndicator, SliderRoot, SliderThumb, SliderTrack, SliderValue, Sparkline, type SparklineProps, Spinner, type SpinnerProps, StatusBar, StatusBarGroup, StatusBarSeparator, StatusDot, type StatusDotProps, type StatusTone, type StepStatus, Stepper, StepperItem, type StepperItemProps, type StepperOrientation, type StepperProps, StreamingText, type StreamingTextProps, Switch, TRANSPARENT, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs, TabsPanel as TabsContent, TabsList, TabsPanel, TabsTrigger, TextReveal, type TextRevealProps, Textarea, type TextareaProps, ThemeId, ThemeManifest, ThemeMode$1 as ThemeManifestMode, type ThemeMode, ThemePreview, type ThemePreviewProps, ThemeSelector, type ThemeSelectorProps, ThemeSwitcher, type ThemeSwitcherProps, ThinkingOrb, type ThinkingOrbProps, ToastAction, type ToastApi, ToastClose, ToastContent, ToastDescription, type ToastManagerApi, type ToastOptions, type ToastPosition, ToastProvider, type ToastProviderProps, ToastRoot, ToastTitle, type ToastType, ToastViewport, Toggle, ToggleGroup, type ToggleGroupAppearance, Toggle as ToggleGroupItem, Toolbar, ToolbarButton, type ToolbarButtonProps, ToolbarGroup, type ToolbarGroupProps, ToolbarInput, type ToolbarInputProps, ToolbarLink, type ToolbarLinkProps, type ToolbarProps, ToolbarSeparator, type ToolbarSeparatorProps, Tooltip, TooltipArrow, TooltipContent, TooltipPortal, TooltipProvider, TooltipTrigger, Tree, TreeAddRow, TreeEmpty, TreeRow, TreeSection, type UseCopyOptions, type UseCopyResult, type UseInViewOptions, type UsePanelWidthOptions, Video, type VideoProps, ViewTransitionName, type ViewTransitionNameProps, Workspace, WorkspaceBar, WorkspaceCanvas, accordionMeta, appHeaderMeta, appShellMeta, areaChartMeta, attachmentMeta, avatarGroupVariants, avatarMeta, avatarVariants, badgeMeta, badgeVariants, bannerMeta, bannerVariants, barChartMeta, bottomNavMeta, breadcrumbsMeta, browserMeta, bubbleMeta, buttonMeta, buttonVariants, calendarMeta, cardMeta, carouselMeta, chartColor, toneColor as chartToneColor, chatComposerMeta, checkboxCardMeta, checkboxMeta, cn, codeBlockMeta, codeMeta, collapsibleMeta, colorFieldMeta, comboboxMeta, commandMenuMeta, componentGuidance, componentLabel, componentSlug, componentsInGroup, contextCardMeta, contextMenuMeta, dataTableMeta, datePickerMeta, dateTileMeta, destructiveActionModalMeta, dialogMeta, disclosurePickerMeta, emptyStateMeta, entityMeta, feedbackMeta, fieldsetMeta, fileDropzoneMeta, fileDropzoneVariants, fontPickerMeta, formMeta, formatFileSize, formatHex, glidingHighlightMeta, gradientArtMeta, hsvToRgb, hueColor, inlineStatusMeta, inputMeta, isPaletteColor, isTransparent, kbdMeta, labelMeta, lineChartMeta, markerMeta, marqueeMeta, mediaImageMeta, mediaTileMeta, menuMeta, messageMeta, messageScrollerMeta, meterIndicatorVariants, meterMeta, meterTrackVariants, middleTruncateMeta, noteMeta, noteVariants, notificationBadgeMeta, notificationCountVariants, notificationDotVariants, numberFieldMeta, otpFieldMeta, overflowMenuMeta, pageHeaderMeta, pageLoaderMeta, paginationMeta, panelGroupMeta, panelSectionMeta, parseHex, phoneMeta, pieChartMeta, pillMeta, pillVariants, popoverMeta, progressMeta, progressTrackVariants, radarChartMeta, radialChartMeta, radioCardMeta, radioMeta, relativeTimeMeta, rgbToHsv, scrollerMeta, scrubFieldMeta, searchInputMeta, sectionHeaderMeta, segmentedBarMeta, segmentedBarSegmentVariants, segmentedBarVariants, selectMeta, separatorMeta, settingsMenuMeta, sheetMeta, sheetVariants, showMoreMeta, sideNavMeta, sidebarMeta, skeletonMeta, sliderMeta, sparklineMeta, spinnerMeta, startViewTransition, statusBarMeta, statusDotMeta, statusDotVariants, stepperConnectorVariants, stepperIndicatorVariants, stepperMeta, streamingTextMeta, supportsViewTransitions, switchMeta, tableMeta, tabsMeta, textareaMeta, themeSelectorMeta, themeSwitcherMeta, thinkingOrbMeta, toast, toastMeta, toggleMeta, toolbarGroupVariants, toolbarMeta, toolbarSeparatorVariants, toolbarVariants, tooltipMeta, treeIndent, treeMeta, useAnchoredDensity, useComboboxFilteredItems, useCommandMenuShortcut, useCopy, useDensity, useDisclosurePicker, useInView, useMotion, usePanelWidth, usePresentation, useReducedMotion, useScrollActivity, useSidebar, useToast, useToastManager, useTypeTier, videoMeta, workspaceMeta };
8478
+ export { Accordion, AccordionItem, AccordionPanel, AccordionTrigger, AlertDialog, AlertDialogClose, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogTitle, AlertDialogTrigger, AppHeader, type AppHeaderProps, AppShell, type AppShellProps, AreaChart, type AreaChartProps, type ArtTone, Attachment, type AttachmentProps, Avatar, AvatarFallback, AvatarGroup, AvatarGroupCount, type AvatarGroupCountProps, type AvatarGroupProps, AvatarImage, type AvatarProps, AvatarRoot, BADGE_APPEARANCES, BADGE_TONES, Badge, type BadgeAppearance, type BadgeProps, type BadgeTone, Banner, type BannerProps, BarChart, type BarChartProps, BottomNav, BottomNavItem, type BottomNavItemProps, BreadcrumbItem, type BreadcrumbItemProps, BreadcrumbLink, type BreadcrumbLinkProps, BreadcrumbPage, type BreadcrumbPageProps, BreadcrumbSeparator, type BreadcrumbSeparatorProps, Breadcrumbs, type BreadcrumbsProps, Browser, type BrowserProps, Bubble, type BubbleProps, BubbleReaction, type BubbleReactionProps, BubbleReactions, type BubbleReactionsProps, Button, type ButtonBleed, type ButtonProps, CHART_SERIES_COUNT, COMPONENT_GROUPS, COMPONENT_TAXONOMY, Calendar, type CalendarProps, Card, CardAction, CardContent, type CardContentProps, CardDescription, CardFooter, type CardFooterProps, CardHeader, CardList, type CardProps, CardTitle, type CardTitleProps, Carousel, type CarouselProps, type CarouselSlidesToShow, type ChartCategories, type ChartCenterLabel, type ChartCurve, type ChartDatum, type ChartSeries, type ChartTone, type ChartTooltipIndicator, type ChartTooltipOptions, type ChartValueFormatter, ChatComposer, type ChatComposerProps, Checkbox, CheckboxCard, type CheckboxCardProps, type CheckboxCardTone, CheckboxGroup, type CheckboxGroupProps, Code, CodeBlock, type CodeBlockProps, CodeHighlightProvider, type CodeHighlighter, type CodeProps, Collapsible, CollapsibleIndicator, CollapsiblePanel, CollapsibleTrigger, ColorField, type ColorFieldProps, Combobox, ComboboxChips, ComboboxClear, ComboboxContent, ComboboxEmpty, ComboboxGroup, ComboboxGroupLabel, ComboboxInput, ComboboxItem, type ComboboxItemGroup, ComboboxItemIndicator, ComboboxList, ComboboxPortal, type ComboboxProps, ComboboxValue, ComboboxVirtualList, type ComboboxVirtualListProps, type CommandFilter, type CommandItem, CommandMenu, CommandMenuGroup, type CommandMenuGroupProps, CommandMenuItem, type CommandMenuItemProps, CommandMenuPanel, type CommandMenuPanelProps, type CommandMenuProps, CommandMenuTrigger, type CommandMenuTriggerProps, type ComponentGroup, type ComponentGuidance, ComponentMeta, type ComponentRegister, type ConstraintFlag, ContextCard, ContextCardArrow, ContextCardContent, ContextCardPortal, ContextCardTrigger, ContextMenu, ContextMenuContent, ContextMenuGroup, ContextMenuGroupLabel, ContextMenuItem, ContextMenuPortal, ContextMenuSeparator, ContextMenuTrigger, DataTable, type DataTableColumn, type DataTableProps, type DataTableRowKey, DatePicker, type DatePickerProps, DateTile, type DateTileProps, Density, DensityProvider, Density as DensityValue, DestructiveActionModal, type DestructiveActionModalProps, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, type DialogSize, DialogTitle, DialogTrigger, DisclosurePicker, DisclosurePickerEmpty, DisclosurePickerList, type DisclosurePickerListProps, DisclosurePickerOption, type DisclosurePickerOptionProps, DisclosurePickerPanel, type DisclosurePickerPanelProps, type DisclosurePickerProps, type DisclosurePickerSearch, DisclosurePickerTrigger, type DisclosurePickerTriggerProps, EmptyState, type EmptyStateProps, Entity, type EntityProps, Feedback, type FeedbackData, type FeedbackProps, type FeedbackRating, Field, type FieldProps, Fieldset, FieldsetContent, FieldsetDescription, FieldsetFooter, FieldsetLegend, type FieldsetVariant, FileDropzone, type FileDropzoneProps, type FileRejection, type FileRejectionCode, FontPicker, type FontPickerFont, type FontPickerOption, type FontPickerProps, Form, type FormProps, GlidingHighlight, type GlidingHighlightProps, GradientArt, type GradientArtProps, type Hsv, InlineStatus, type InlineStatusProps, type StatusTone as InlineTone, Input, type InputProps$1 as InputProps, Kbd, KbdGroup, type KbdGroupProps, type KbdProps, Label, type LabelProps$2 as LabelProps, LineChart, type LineChartProps, Marker, type MarkerProps, Marquee, type MarqueeProps, MediaImage, type MediaImageProps, MediaTile, type MediaTileProps, Menu, MenuCheckboxItem, MenuContent, MenuGroup, MenuGroupLabel, MenuItem, MenuPortal, MenuRadioGroup, MenuRadioItem, MenuSeparator, MenuSubmenu, MenuSubmenuTrigger, MenuTrigger, Message, type MessageProps, MessageScroller, type MessageScrollerHandle, type MessageScrollerProps, Meter, MeterIndicator, MeterLabel, type MeterSize, type MeterTone, MeterTrack, MeterValue, MiddleTruncate, type MiddleTruncateProps, type MotionPolicy, MotionProvider, type MotionProviderProps, Note, type NoteAction, type NoteProps, NotificationBadge, type NotificationBadgeProps, NumberField, type NumberFieldProps, type OrbMode, type OrbSize, OtpField, type OtpFieldProps, OverflowMenu, type OverflowMenuProps, PALETTE_COLORS, PALETTE_FAMILIES, PALETTE_SCALES, PALETTE_STEPS, PALETTE_TONES, PageHeader, type PageHeaderProps, PageLoader, type PageLoaderProps, Pagination, type PaginationProps, type PaletteColor, type PaletteFamily, type PaletteStep, Panel, PanelGroup, PanelResizer, type PanelResizerProps, PanelSection, type PanelWidthBounds, Phone, type PhoneProps, PieChart, type PieChartProps, Pill, type PillProps, Popover, PopoverArrow, PopoverClose, PopoverContent, PopoverDescription, PopoverPortal, PopoverTitle, PopoverTrigger, Presence, type PresenceProps, type Presentation, PresentationProvider, Progress, ProgressIndicator, ProgressLabel, type ProgressSize, ProgressTrack, ProgressValue, PropertyGroup, PropertyPair, PropertyRow, RadarChart, type RadarChartProps, RadialChart, type RadialChartProps, Radio, RadioCard, type RadioCardProps, type RadioCardTone, RadioGroup, RelativeTime, type RelativeTimeProps, Reveal, type RevealProps, type Rgb, SABLE_UI_VERSION, SEGMENTED_BAR_TONES, STATUS_TONES, STATUS_TONE_ICON, type ScrollCommandOptions, Scroller, type ScrollerProps, ScrubField, type ScrubFieldProps, SearchInput, type SearchInputProps, SectionHeader, type SectionHeaderProps, SegmentedBar, type SegmentedBarProps, type SegmentedBarSegment, type SegmentedBarTone, Select, SelectContent, SelectGroup, SelectGroupLabel, SelectItem, SelectPortal, SelectSeparator, SelectTrigger, SelectValue, Separator, type SeparatorProps$3 as SeparatorProps, SettingsMenu, type SettingsMenuProps, SettingsRow, type SettingsRowProps, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetList, SheetPortal, SheetTitle, SheetTrigger, ShowMore, type ShowMoreProps, SideNav, type SideNavActiveVariant, SideNavGroup, type SideNavGroupProps, SideNavItem, type SideNavItemProps, type SideNavProps, type SideNavSize, Sidebar, SidebarBrand, type SidebarBrandProps, SidebarFooter, SidebarHeader, SidebarItem, type SidebarItemProps, SidebarNav, type SidebarProps, SimpleTooltip, Skeleton, SkipLink, Slider, SliderControl, SliderIndicator, SliderRoot, SliderThumb, SliderTrack, SliderValue, Sparkline, type SparklineProps, Spinner, type SpinnerProps, StatusBar, StatusBarGroup, StatusBarSeparator, StatusDot, type StatusDotProps, type StatusTone, type StepStatus, Stepper, StepperItem, type StepperItemProps, type StepperOrientation, type StepperProps, StreamingText, type StreamingTextProps, Switch, TRANSPARENT, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs, TabsPanel as TabsContent, TabsList, TabsPanel, TabsTrigger, TextReveal, type TextRevealProps, Textarea, type TextareaProps, ThemeId, ThemeManifest, ThemeMode$1 as ThemeManifestMode, type ThemeMode, ThemePreview, type ThemePreviewProps, ThemeSelector, type ThemeSelectorProps, ThemeSwitcher, type ThemeSwitcherProps, ThinkingOrb, type ThinkingOrbProps, ToastAction, type ToastApi, ToastClose, ToastContent, ToastDescription, type ToastManagerApi, type ToastOptions, type ToastPosition, ToastProvider, type ToastProviderProps, ToastRoot, ToastTitle, type ToastType, ToastViewport, Toggle, ToggleGroup, type ToggleGroupAppearance, Toggle as ToggleGroupItem, Toolbar, ToolbarButton, type ToolbarButtonProps, ToolbarGroup, type ToolbarGroupProps, ToolbarInput, type ToolbarInputProps, ToolbarLink, type ToolbarLinkProps, type ToolbarProps, ToolbarSeparator, type ToolbarSeparatorProps, Tooltip, TooltipArrow, TooltipContent, TooltipPortal, TooltipProvider, TooltipTrigger, Tree, TreeAddRow, TreeEmpty, TreeRow, TreeSection, type UseCopyOptions, type UseCopyResult, type UseInViewOptions, type UsePanelWidthOptions, Video, type VideoProps, ViewTransitionName, type ViewTransitionNameProps, Workspace, WorkspaceBar, WorkspaceCanvas, accordionMeta, appHeaderMeta, appShellMeta, areaChartMeta, attachmentMeta, avatarGroupVariants, avatarMeta, avatarVariants, badgeMeta, badgeVariants, bannerMeta, bannerVariants, barChartMeta, bottomNavMeta, breadcrumbsMeta, browserMeta, bubbleMeta, buttonMeta, buttonVariants, calendarMeta, cardMeta, carouselMeta, chartColor, toneColor as chartToneColor, chatComposerMeta, checkboxCardMeta, checkboxMeta, cn, codeBlockMeta, codeMeta, collapsibleMeta, colorFieldMeta, comboboxMeta, commandMenuMeta, componentGuidance, componentLabel, componentSlug, componentsInGroup, contextCardMeta, contextMenuMeta, dataTableMeta, datePickerMeta, dateTileMeta, destructiveActionModalMeta, dialogMeta, disclosurePickerMeta, emptyStateMeta, entityMeta, feedbackMeta, fieldsetMeta, fileDropzoneMeta, fileDropzoneVariants, fontPickerMeta, formMeta, formatFileSize, formatHex, glidingHighlightMeta, gradientArtMeta, hsvToRgb, hueColor, inlineStatusMeta, inputMeta, isPaletteColor, isTransparent, kbdMeta, labelMeta, lineChartMeta, markerMeta, marqueeMeta, mediaImageMeta, mediaTileMeta, menuMeta, messageMeta, messageScrollerMeta, meterIndicatorVariants, meterMeta, meterTrackVariants, middleTruncateMeta, noteMeta, noteVariants, notificationBadgeMeta, notificationCountVariants, notificationDotVariants, numberFieldMeta, otpFieldMeta, overflowMenuMeta, pageHeaderMeta, pageLoaderMeta, paginationMeta, panelGroupMeta, panelSectionMeta, parseHex, phoneMeta, pieChartMeta, pillMeta, pillVariants, popoverMeta, progressMeta, progressTrackVariants, radarChartMeta, radialChartMeta, radioCardMeta, radioMeta, relativeTimeMeta, rgbToHsv, scrollerMeta, scrubFieldMeta, searchInputMeta, sectionHeaderMeta, segmentedBarMeta, segmentedBarSegmentVariants, segmentedBarVariants, selectMeta, separatorMeta, settingsMenuMeta, sheetMeta, sheetVariants, showMoreMeta, sideNavMeta, sidebarMeta, skeletonMeta, sliderMeta, sparklineMeta, spinnerMeta, startViewTransition, statusBarMeta, statusDotMeta, statusDotVariants, stepperConnectorVariants, stepperIndicatorVariants, stepperMeta, streamingTextMeta, supportsViewTransitions, switchMeta, tableMeta, tabsMeta, textareaMeta, themeSelectorMeta, themeSwitcherMeta, thinkingOrbMeta, toast, toastMeta, toggleMeta, toolbarGroupVariants, toolbarMeta, toolbarSeparatorVariants, toolbarVariants, tooltipMeta, treeIndent, treeMeta, useAnchoredDensity, useComboboxFilteredItems, useCommandMenuShortcut, useCopy, useDensity, useDisclosurePicker, useInView, useMotion, usePanelWidth, usePresentation, useReducedMotion, useScrollActivity, useSidebar, useToast, useToastManager, useTypeTier, videoMeta, workspaceMeta };
package/dist/index.js CHANGED
@@ -163,7 +163,7 @@ import { useScrollActivity } from "./lib/use-scroll-activity.js";
163
163
  import { useCopy } from "./lib/use-copy.js";
164
164
  import { STATUS_TONES, STATUS_TONE_ICON } from "./lib/status-tone.js";
165
165
  import { PALETTE_COLORS, PALETTE_FAMILIES, PALETTE_SCALES, PALETTE_STEPS, PALETTE_TONES, isPaletteColor } from "./lib/palette.js";
166
- var SABLE_UI_VERSION = "0.10.0";
166
+ var SABLE_UI_VERSION = "0.11.0";
167
167
  export {
168
168
  ART_TOKENS,
169
169
  CHART_SERIES_COUNT,
@@ -27,6 +27,7 @@ Use PanelSection to group properties inside an inspector or docked panel, with P
27
27
  | Header | yes | The section title in the UI section tier, with an optional trailing action. |
28
28
  | PropertyRow | no | One property: label left, control right. `stacked` moves the control to its own line for full-width controls. |
29
29
  | PropertyPair | no | Two controls side by side, with optional captions above each. |
30
+ | PropertyGroup | no | A set of properties folded behind one row that names the group and summarises its value, opening with +/− to the controls beneath. |
30
31
 
31
32
  ## Subcomponents
32
33
 
@@ -34,6 +35,7 @@ Use PanelSection to group properties inside an inspector or docked panel, with P
34
35
  | --- | --- | --- |
35
36
  | PropertyRow | { label: ReactNode; htmlFor?: string; hint?: string; stacked?: boolean; scrub?: { value, onValueChange, step?, min?, max?, onGestureStart?, onGestureEnd?, disabled? } } | One property line. `hint` becomes the label's hover explanation; `stacked` puts the control on its own line. `scrub` makes the property NAME a drag handle for its value — the Figma/Framer/Paper convention, and the answer for a numeric row with no honest glyph to put in a ScrubField (a schema-generated `levels` or `seed`, where a `#` would be noise pretending to be meaning). Opt-in and additive: a row without it is unchanged. The label stays a real `<label htmlFor>` — a 2px jitter threshold keeps a click a click, and the click synthesised after a real drag is swallowed so a scrub does not also select the field's text. |
36
37
  | PropertyPair | { labels?: [ReactNode, ReactNode] } | Two controls side by side in a 2-up grid, with optional captions above each. |
38
+ | PropertyGroup | { label: ReactNode; summary?: ReactNode; defaultOpen?: boolean; open?: boolean; onOpenChange?: (open: boolean) => void } | A collapsible set of properties inside a section, at the panel's scale (an Accordion is page furniture). The row shows the label, then the summary (the group's value, readable while closed: a word, a few swatches, or both), then a + that turns to − when open. Groups open independently and stack with a hairline between them. Built on Collapsible. |
37
39
 
38
40
  ## Props
39
41
 
@@ -48,6 +50,7 @@ Use PanelSection to group properties inside an inspector or docked panel, with P
48
50
 
49
51
  ## Accessibility
50
52
 
53
+ - PropertyGroup's row is a real button with aria-expanded (Collapsible); its summary is part of the button's name, so a closed group still announces its value.
51
54
  - PropertyRow renders a real <label>; pass htmlFor with the control's id so clicking the label focuses it.
52
55
  - The section title is an h3, so panels contribute a real heading outline rather than styled divs.
53
56
  - `hint` is exposed as the label's title attribute — keep the essential meaning in the label itself, since title text is not reliably announced.
@@ -59,6 +62,31 @@ Use PanelSection to group properties inside an inspector or docked panel, with P
59
62
 
60
63
  ## Examples
61
64
 
65
+ ### Groups that fold behind their value
66
+
67
+ ```tsx
68
+ import { PanelSection, PropertyGroup, PropertyRow, ScrubField, Select, SelectContent, SelectItem, SelectTrigger } from "@sableui/react"
69
+
70
+ <PanelSection title="Color">
71
+ <PropertyGroup label="Tones" summary="Brand only">
72
+ <PropertyRow label="Scheme">
73
+ <Select value="brand">
74
+ <SelectTrigger size="xs" />
75
+ <SelectContent>
76
+ <SelectItem value="brand">Brand only</SelectItem>
77
+ <SelectItem value="harmonize">Harmonize</SelectItem>
78
+ </SelectContent>
79
+ </Select>
80
+ </PropertyRow>
81
+ </PropertyGroup>
82
+ <PropertyGroup label="Grid" summary="8px">
83
+ <PropertyRow label="Size">
84
+ <ScrubField label="Grid size" value={8} min={1} max={64} suffix="px" />
85
+ </PropertyRow>
86
+ </PropertyGroup>
87
+ </PanelSection>
88
+ ```
89
+
62
90
  ### Blending section, 2-up
63
91
 
64
92
  ```tsx
package/llms-full.txt CHANGED
@@ -16813,6 +16813,7 @@ Use PanelSection to group properties inside an inspector or docked panel, with P
16813
16813
  | Header | yes | The section title in the UI section tier, with an optional trailing action. |
16814
16814
  | PropertyRow | no | One property: label left, control right. `stacked` moves the control to its own line for full-width controls. |
16815
16815
  | PropertyPair | no | Two controls side by side, with optional captions above each. |
16816
+ | PropertyGroup | no | A set of properties folded behind one row that names the group and summarises its value, opening with +/− to the controls beneath. |
16816
16817
 
16817
16818
  ## Subcomponents
16818
16819
 
@@ -16820,6 +16821,7 @@ Use PanelSection to group properties inside an inspector or docked panel, with P
16820
16821
  | --- | --- | --- |
16821
16822
  | PropertyRow | { label: ReactNode; htmlFor?: string; hint?: string; stacked?: boolean; scrub?: { value, onValueChange, step?, min?, max?, onGestureStart?, onGestureEnd?, disabled? } } | One property line. `hint` becomes the label's hover explanation; `stacked` puts the control on its own line. `scrub` makes the property NAME a drag handle for its value — the Figma/Framer/Paper convention, and the answer for a numeric row with no honest glyph to put in a ScrubField (a schema-generated `levels` or `seed`, where a `#` would be noise pretending to be meaning). Opt-in and additive: a row without it is unchanged. The label stays a real `<label htmlFor>` — a 2px jitter threshold keeps a click a click, and the click synthesised after a real drag is swallowed so a scrub does not also select the field's text. |
16822
16823
  | PropertyPair | { labels?: [ReactNode, ReactNode] } | Two controls side by side in a 2-up grid, with optional captions above each. |
16824
+ | PropertyGroup | { label: ReactNode; summary?: ReactNode; defaultOpen?: boolean; open?: boolean; onOpenChange?: (open: boolean) => void } | A collapsible set of properties inside a section, at the panel's scale (an Accordion is page furniture). The row shows the label, then the summary (the group's value, readable while closed: a word, a few swatches, or both), then a + that turns to − when open. Groups open independently and stack with a hairline between them. Built on Collapsible. |
16823
16825
 
16824
16826
  ## Props
16825
16827
 
@@ -16834,6 +16836,7 @@ Use PanelSection to group properties inside an inspector or docked panel, with P
16834
16836
 
16835
16837
  ## Accessibility
16836
16838
 
16839
+ - PropertyGroup's row is a real button with aria-expanded (Collapsible); its summary is part of the button's name, so a closed group still announces its value.
16837
16840
  - PropertyRow renders a real <label>; pass htmlFor with the control's id so clicking the label focuses it.
16838
16841
  - The section title is an h3, so panels contribute a real heading outline rather than styled divs.
16839
16842
  - `hint` is exposed as the label's title attribute — keep the essential meaning in the label itself, since title text is not reliably announced.
@@ -16845,6 +16848,31 @@ Use PanelSection to group properties inside an inspector or docked panel, with P
16845
16848
 
16846
16849
  ## Examples
16847
16850
 
16851
+ ### Groups that fold behind their value
16852
+
16853
+ ```tsx
16854
+ import { PanelSection, PropertyGroup, PropertyRow, ScrubField, Select, SelectContent, SelectItem, SelectTrigger } from "@sableui/react"
16855
+
16856
+ <PanelSection title="Color">
16857
+ <PropertyGroup label="Tones" summary="Brand only">
16858
+ <PropertyRow label="Scheme">
16859
+ <Select value="brand">
16860
+ <SelectTrigger size="xs" />
16861
+ <SelectContent>
16862
+ <SelectItem value="brand">Brand only</SelectItem>
16863
+ <SelectItem value="harmonize">Harmonize</SelectItem>
16864
+ </SelectContent>
16865
+ </Select>
16866
+ </PropertyRow>
16867
+ </PropertyGroup>
16868
+ <PropertyGroup label="Grid" summary="8px">
16869
+ <PropertyRow label="Size">
16870
+ <ScrubField label="Grid size" value={8} min={1} max={64} suffix="px" />
16871
+ </PropertyRow>
16872
+ </PropertyGroup>
16873
+ </PanelSection>
16874
+ ```
16875
+
16848
16876
  ### Blending section, 2-up
16849
16877
 
16850
16878
  ```tsx
package/llms.txt CHANGED
@@ -426,7 +426,7 @@ import { Button, Card, IconProvider, MotionProvider, SableThemeProvider, useSabl
426
426
  - **PageLoader** — Full-screen branded loading splash: the screen fades in, the mark breathes, and an indeterminate Progress bar pulses beneath it. → [`llms/components/page-loader.md`](./llms/components/page-loader.md)
427
427
  - **Pagination** — Page navigation built from our own Button + Icon (no Base UI). → [`llms/components/pagination.md`](./llms/components/pagination.md)
428
428
  - **PanelGroup** — A row of docked chrome panels around a flexible centre, with draggable and keyboard-resizable edges and optional persisted widths. *Parts:* Panel, PanelResizer, usePanelWidth. → [`llms/components/panel-group.md`](./llms/components/panel-group.md)
429
- - **PanelSection** — A flush group of property rows inside a docked panel — eyebrow header, hairline separator, rows beneath. *Parts:* PropertyRow, PropertyPair. → [`llms/components/panel-section.md`](./llms/components/panel-section.md)
429
+ - **PanelSection** — A flush group of property rows inside a docked panel — eyebrow header, hairline separator, rows beneath. *Parts:* PropertyRow, PropertyPair, PropertyGroup. → [`llms/components/panel-section.md`](./llms/components/panel-section.md)
430
430
  - **Phone** — A current smartphone frame at iPhone proportions: a dark body with a titanium band, thin bezels, an island, an optional status bar and a scrollable screen. → [`llms/components/phone.md`](./llms/components/phone.md)
431
431
  - **PieChart** — **BETA.** Parts of a whole as slices: a pie or donut, concentric rings for several measures, a total in the hole, slice labels inside or out, and an active slice that pulls outward. → [`llms/components/pie-chart.md`](./llms/components/pie-chart.md)
432
432
  - **Pill** — A chip someone clicks: a filter, a tag choice, an option in a row. → [`llms/components/pill.md`](./llms/components/pill.md)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sableui/react",
3
- "version": "0.10.0",
3
+ "version": "0.11.0",
4
4
  "description": "Sable: themeable React components, layout patterns, and tools for coding agents.",
5
5
  "type": "module",
6
6
  "sideEffects": [
package/registry.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://sable.design/registry.schema.json",
3
3
  "name": "@sableui/react",
4
- "version": "0.10.0",
4
+ "version": "0.11.0",
5
5
  "description": "Themeable React components, semantic tokens, layout patterns, presets, and package-owned agent skills. Default theme: Sable.",
6
6
  "engine": {
7
7
  "behavior": "@base-ui/react",
@@ -13578,6 +13578,11 @@
13578
13578
  "name": "PropertyPair",
13579
13579
  "required": false,
13580
13580
  "description": "Two controls side by side, with optional captions above each."
13581
+ },
13582
+ {
13583
+ "name": "PropertyGroup",
13584
+ "required": false,
13585
+ "description": "A set of properties folded behind one row that names the group and summarises its value, opening with +/− to the controls beneath."
13581
13586
  }
13582
13587
  ]
13583
13588
  },
@@ -13613,6 +13618,11 @@
13613
13618
  "name": "PropertyPair",
13614
13619
  "type": "{ labels?: [ReactNode, ReactNode] }",
13615
13620
  "description": "Two controls side by side in a 2-up grid, with optional captions above each."
13621
+ },
13622
+ {
13623
+ "name": "PropertyGroup",
13624
+ "type": "{ label: ReactNode; summary?: ReactNode; defaultOpen?: boolean; open?: boolean; onOpenChange?: (open: boolean) => void }",
13625
+ "description": "A collapsible set of properties inside a section, at the panel's scale (an Accordion is page furniture). The row shows the label, then the summary (the group's value, readable while closed: a word, a few swatches, or both), then a + that turns to − when open. Groups open independently and stack with a hairline between them. Built on Collapsible."
13616
13626
  }
13617
13627
  ],
13618
13628
  "tokensUsed": [
@@ -13621,12 +13631,18 @@
13621
13631
  "hairline"
13622
13632
  ],
13623
13633
  "a11y": [
13634
+ "PropertyGroup's row is a real button with aria-expanded (Collapsible); its summary is part of the button's name, so a closed group still announces its value.",
13624
13635
  "PropertyRow renders a real <label>; pass htmlFor with the control's id so clicking the label focuses it.",
13625
13636
  "The section title is an h3, so panels contribute a real heading outline rather than styled divs.",
13626
13637
  "`hint` is exposed as the label's title attribute — keep the essential meaning in the label itself, since title text is not reliably announced.",
13627
13638
  "A `scrub` label does not replace keyboard editing and must not be the only way to set the value: the drag is a pointer affordance, so the control it names still has to accept typing and arrow keys. It also keeps its `htmlFor` behaviour, which is the reason the gesture arms on a 2px threshold rather than on pointerdown."
13628
13639
  ],
13629
13640
  "examples": [
13641
+ {
13642
+ "label": "Groups that fold behind their value",
13643
+ "code": "<PanelSection title=\"Color\">\n <PropertyGroup label=\"Tones\" summary=\"Brand only\">\n <PropertyRow label=\"Scheme\">\n <Select value=\"brand\">\n <SelectTrigger size=\"xs\" />\n <SelectContent>\n <SelectItem value=\"brand\">Brand only</SelectItem>\n <SelectItem value=\"harmonize\">Harmonize</SelectItem>\n </SelectContent>\n </Select>\n </PropertyRow>\n </PropertyGroup>\n <PropertyGroup label=\"Grid\" summary=\"8px\">\n <PropertyRow label=\"Size\">\n <ScrubField label=\"Grid size\" value={8} min={1} max={64} suffix=\"px\" />\n </PropertyRow>\n </PropertyGroup>\n</PanelSection>",
13644
+ "imports": "import { PanelSection, PropertyGroup, PropertyRow, ScrubField, Select, SelectContent, SelectItem, SelectTrigger } from \"@sableui/react\""
13645
+ },
13630
13646
  {
13631
13647
  "label": "Blending section, 2-up",
13632
13648
  "code": "<PanelSection title=\"Blending\">\n <PropertyPair>\n <ScrubField label=\"Opacity\" value={100} min={0} max={100} suffix=\"%\" />\n <Select value=\"normal\">\n <SelectTrigger size=\"xs\" />\n <SelectContent>\n <SelectItem value=\"normal\">Normal</SelectItem>\n <SelectItem value=\"multiply\">Multiply</SelectItem>\n </SelectContent>\n </Select>\n </PropertyPair>\n</PanelSection>",
@@ -25487,6 +25503,18 @@
25487
25503
  "render",
25488
25504
  "style"
25489
25505
  ],
25506
+ "PropertyGroup": [
25507
+ "children",
25508
+ "className",
25509
+ "defaultOpen",
25510
+ "disabled",
25511
+ "label",
25512
+ "onOpenChange",
25513
+ "open",
25514
+ "render",
25515
+ "style",
25516
+ "summary"
25517
+ ],
25490
25518
  "PropertyPair": [
25491
25519
  "labels"
25492
25520
  ],