@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 +14 -0
- package/dist/components/panel-section/index.js +2 -1
- package/dist/components/panel-section/panel-section.js +15 -0
- package/dist/components/panel-section/panel-section.meta.js +32 -0
- package/dist/file-hashes.json +5 -5
- package/dist/index.d.ts +36 -6
- package/dist/index.js +1 -1
- package/llms/components/panel-section.md +28 -0
- package/llms-full.txt +28 -0
- package/llms.txt +1 -1
- package/package.json +1 -1
- package/registry.json +29 -1
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">
|
package/dist/file-hashes.json
CHANGED
|
@@ -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": "
|
|
307
|
-
"dist/components/panel-section/panel-section.js": "
|
|
308
|
-
"dist/components/panel-section/panel-section.meta.js": "
|
|
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": "
|
|
475
|
-
"dist/index.js": "
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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.
|
|
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.
|
|
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
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.
|
|
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
|
],
|