@eocrm/design-system 0.0.0-stage → 0.6.18
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/AI-PRIMER.md +341 -0
- package/LICENSE +202 -0
- package/README.md +266 -2
- package/docs/components/Accordion.md +114 -0
- package/docs/components/AgentAvatar.md +58 -0
- package/docs/components/Alert.md +81 -0
- package/docs/components/AppLayout.md +70 -0
- package/docs/components/Avatar.md +49 -0
- package/docs/components/AvatarGroup.md +47 -0
- package/docs/components/Badge.md +60 -0
- package/docs/components/Banner.md +89 -0
- package/docs/components/BrandIcon.md +32 -0
- package/docs/components/Breadcrumb.md +72 -0
- package/docs/components/Button.md +107 -0
- package/docs/components/ButtonGroup.md +78 -0
- package/docs/components/Calendar.md +158 -0
- package/docs/components/Card.md +165 -0
- package/docs/components/CatalogPicker.md +83 -0
- package/docs/components/Chart.md +114 -0
- package/docs/components/ChatBubble.md +55 -0
- package/docs/components/ChatLauncher.md +97 -0
- package/docs/components/Checkbox.md +55 -0
- package/docs/components/CircularProgress.md +53 -0
- package/docs/components/Cluster.md +96 -0
- package/docs/components/Code.md +35 -0
- package/docs/components/CodeBlock.md +67 -0
- package/docs/components/ColorPicker.md +115 -0
- package/docs/components/ConfirmationPopover.md +70 -0
- package/docs/components/Constrain.md +39 -0
- package/docs/components/CurrencySelect.md +57 -0
- package/docs/components/CursorPagination.md +43 -0
- package/docs/components/DashboardCanvas.md +79 -0
- package/docs/components/DashboardWidget.md +131 -0
- package/docs/components/DataTable.md +88 -0
- package/docs/components/DatePicker.md +68 -0
- package/docs/components/DateRangePicker.md +71 -0
- package/docs/components/DateStrip.md +56 -0
- package/docs/components/DefinitionList.md +82 -0
- package/docs/components/Divider.md +57 -0
- package/docs/components/Dot.md +26 -0
- package/docs/components/Drawer.md +94 -0
- package/docs/components/DropdownMenu.md +299 -0
- package/docs/components/EmojiPicker.md +84 -0
- package/docs/components/EmptyState.md +55 -0
- package/docs/components/EntityChip.md +102 -0
- package/docs/components/ErrorState.md +72 -0
- package/docs/components/Field.md +91 -0
- package/docs/components/FileUpload.md +109 -0
- package/docs/components/FilterChip.md +88 -0
- package/docs/components/FlowCanvas.md +108 -0
- package/docs/components/FormRow.md +31 -0
- package/docs/components/FormSection.md +37 -0
- package/docs/components/Grid.md +103 -0
- package/docs/components/Highlight.md +75 -0
- package/docs/components/HighlightedText.md +50 -0
- package/docs/components/IconPicker.md +134 -0
- package/docs/components/IconTile.md +30 -0
- package/docs/components/Image.md +84 -0
- package/docs/components/ImageCrop.md +163 -0
- package/docs/components/Indent.md +31 -0
- package/docs/components/InlineDatePicker.md +58 -0
- package/docs/components/InlineDateRangePicker.md +57 -0
- package/docs/components/Input.md +54 -0
- package/docs/components/Kanban.md +122 -0
- package/docs/components/Kbd.md +41 -0
- package/docs/components/Lightbox.md +105 -0
- package/docs/components/Link.md +65 -0
- package/docs/components/LinkCard.md +41 -0
- package/docs/components/LiquidEditor.md +84 -0
- package/docs/components/List.md +68 -0
- package/docs/components/LiveRegion.md +29 -0
- package/docs/components/LocaleProvider.md +25 -0
- package/docs/components/Logo.md +41 -0
- package/docs/components/Masonry.md +48 -0
- package/docs/components/MediaTile.md +95 -0
- package/docs/components/Modal.md +107 -0
- package/docs/components/MoneyInput.md +62 -0
- package/docs/components/OptionsPicker.md +123 -0
- package/docs/components/OtpInput.md +65 -0
- package/docs/components/Page.md +35 -0
- package/docs/components/PageHeader.md +133 -0
- package/docs/components/Pagination.md +44 -0
- package/docs/components/Palette.md +32 -0
- package/docs/components/PasswordInput.md +45 -0
- package/docs/components/PasswordStrengthMeter.md +27 -0
- package/docs/components/PersonDisplay.md +153 -0
- package/docs/components/PhoneInput.md +54 -0
- package/docs/components/PillMenu.md +91 -0
- package/docs/components/Popover.md +127 -0
- package/docs/components/Progress.md +56 -0
- package/docs/components/QrCode.md +34 -0
- package/docs/components/Radio.md +37 -0
- package/docs/components/RadioGroup.md +56 -0
- package/docs/components/Rail.md +191 -0
- package/docs/components/RelativeDateInput.md +114 -0
- package/docs/components/RichText.md +44 -0
- package/docs/components/RichTextEditor.md +112 -0
- package/docs/components/Screen.md +37 -0
- package/docs/components/ScrollArea.md +39 -0
- package/docs/components/Select.md +131 -0
- package/docs/components/SettingRow.md +98 -0
- package/docs/components/Skeleton.md +68 -0
- package/docs/components/Slider.md +92 -0
- package/docs/components/SlotGrid.md +55 -0
- package/docs/components/SocialButton.md +31 -0
- package/docs/components/Sortable.md +127 -0
- package/docs/components/SortableGroup.md +52 -0
- package/docs/components/Sparkline.md +51 -0
- package/docs/components/Split.md +76 -0
- package/docs/components/Stack.md +59 -0
- package/docs/components/StagePath.md +66 -0
- package/docs/components/StatGroup.md +61 -0
- package/docs/components/StatTile.md +58 -0
- package/docs/components/Sticky.md +69 -0
- package/docs/components/Switch.md +89 -0
- package/docs/components/Table.md +184 -0
- package/docs/components/TableOfContents.md +76 -0
- package/docs/components/Tabs.md +94 -0
- package/docs/components/Text.md +63 -0
- package/docs/components/Textarea.md +59 -0
- package/docs/components/Thread.md +52 -0
- package/docs/components/TimeField.md +70 -0
- package/docs/components/Timeline.md +57 -0
- package/docs/components/Title.md +54 -0
- package/docs/components/ToastViewport.md +61 -0
- package/docs/components/Tooltip.md +63 -0
- package/docs/components/TopBar.md +214 -0
- package/docs/components/Tour.md +85 -0
- package/docs/components/TreeView.md +113 -0
- package/docs/components/VisuallyHidden.md +43 -0
- package/docs/components/WidgetPreview.md +54 -0
- package/docs/components/useBelowBreakpoint.md +11 -0
- package/docs/components/useMonth.md +18 -0
- package/docs/setup.md +51 -0
- package/docs/theming.md +95 -0
- package/docs/tokens.md +123 -0
- package/docs/transient-state.md +56 -0
- package/package.json +86 -4
- package/src/_meta/manifest.ts +293 -0
- package/src/app/AppProvider.tsx +78 -0
- package/src/app/index.ts +3 -0
- package/src/app/themeTokens.ts +95 -0
- package/src/calendar/dateMath.ts +114 -0
- package/src/calendar/formatters.ts +75 -0
- package/src/calendar/index.ts +39 -0
- package/src/calendar/types.ts +36 -0
- package/src/calendar/useAgenda.ts +70 -0
- package/src/calendar/useDay.ts +51 -0
- package/src/calendar/useMonth.ts +82 -0
- package/src/calendar/useWeek.ts +62 -0
- package/src/calendar/weekInfo.ts +83 -0
- package/src/components/Accordion/Accordion.module.scss +304 -0
- package/src/components/Accordion/Accordion.tokens.scss +64 -0
- package/src/components/Accordion/Accordion.tsx +272 -0
- package/src/components/Accordion/AccordionContent.tsx +36 -0
- package/src/components/Accordion/AccordionItem.tsx +66 -0
- package/src/components/Accordion/AccordionTrigger.tsx +121 -0
- package/src/components/Accordion/context.ts +47 -0
- package/src/components/Accordion/index.ts +14 -0
- package/src/components/Alert/Alert.module.scss +92 -0
- package/src/components/Alert/Alert.tokens.scss +60 -0
- package/src/components/Alert/Alert.tsx +136 -0
- package/src/components/Alert/index.ts +2 -0
- package/src/components/AppLayout/AppLayout.module.scss +130 -0
- package/src/components/AppLayout/AppLayout.tokens.scss +27 -0
- package/src/components/AppLayout/AppLayout.tsx +211 -0
- package/src/components/AppLayout/index.ts +2 -0
- package/src/components/Avatar/AgentAvatar.module.scss +117 -0
- package/src/components/Avatar/AgentAvatar.tsx +122 -0
- package/src/components/Avatar/Avatar.module.scss +181 -0
- package/src/components/Avatar/Avatar.tokens.scss +107 -0
- package/src/components/Avatar/Avatar.tsx +210 -0
- package/src/components/Avatar/AvatarGroup.module.scss +128 -0
- package/src/components/Avatar/AvatarGroup.tsx +119 -0
- package/src/components/Avatar/AvatarGroupContext.tsx +20 -0
- package/src/components/Avatar/index.ts +6 -0
- package/src/components/Badge/Badge.module.scss +124 -0
- package/src/components/Badge/Badge.tokens.scss +74 -0
- package/src/components/Badge/Badge.tsx +164 -0
- package/src/components/Badge/index.ts +2 -0
- package/src/components/Banner/Banner.module.scss +73 -0
- package/src/components/Banner/Banner.tokens.scss +51 -0
- package/src/components/Banner/Banner.tsx +138 -0
- package/src/components/Banner/index.ts +2 -0
- package/src/components/BrandIcon/BrandIcon.module.scss +5 -0
- package/src/components/BrandIcon/BrandIcon.tsx +99 -0
- package/src/components/BrandIcon/index.ts +2 -0
- package/src/components/Breadcrumb/Breadcrumb.module.scss +32 -0
- package/src/components/Breadcrumb/Breadcrumb.tokens.scss +9 -0
- package/src/components/Breadcrumb/Breadcrumb.tsx +146 -0
- package/src/components/Breadcrumb/index.ts +2 -0
- package/src/components/Button/Button.module.scss +167 -0
- package/src/components/Button/Button.tokens.scss +90 -0
- package/src/components/Button/Button.tsx +205 -0
- package/src/components/Button/index.ts +2 -0
- package/src/components/ButtonGroup/ButtonGroup.module.scss +134 -0
- package/src/components/ButtonGroup/ButtonGroup.tokens.scss +42 -0
- package/src/components/ButtonGroup/ButtonGroup.tsx +278 -0
- package/src/components/ButtonGroup/ButtonGroupItem.tsx +74 -0
- package/src/components/ButtonGroup/context.ts +45 -0
- package/src/components/ButtonGroup/index.ts +2 -0
- package/src/components/Calendar/AgendaView.module.scss +231 -0
- package/src/components/Calendar/AgendaView.tsx +214 -0
- package/src/components/Calendar/AllDayBand.module.scss +18 -0
- package/src/components/Calendar/AllDayBand.tsx +75 -0
- package/src/components/Calendar/Calendar.module.scss +23 -0
- package/src/components/Calendar/Calendar.tokens.scss +262 -0
- package/src/components/Calendar/Calendar.tsx +370 -0
- package/src/components/Calendar/DayCell.module.scss +30 -0
- package/src/components/Calendar/DayCell.tsx +50 -0
- package/src/components/Calendar/DayView.module.scss +10 -0
- package/src/components/Calendar/DayView.tsx +163 -0
- package/src/components/Calendar/EventChip.module.scss +171 -0
- package/src/components/Calendar/EventChip.tsx +115 -0
- package/src/components/Calendar/HourGrid.module.scss +123 -0
- package/src/components/Calendar/HourGrid.tsx +381 -0
- package/src/components/Calendar/MonthView.module.scss +99 -0
- package/src/components/Calendar/MonthView.tsx +296 -0
- package/src/components/Calendar/TimedEvent.module.scss +205 -0
- package/src/components/Calendar/TimedEvent.tsx +247 -0
- package/src/components/Calendar/ViewSwitcher.module.scss +3 -0
- package/src/components/Calendar/ViewSwitcher.tsx +47 -0
- package/src/components/Calendar/WeekView.module.scss +10 -0
- package/src/components/Calendar/WeekView.tsx +137 -0
- package/src/components/Calendar/eventColor.ts +60 -0
- package/src/components/Calendar/index.ts +18 -0
- package/src/components/Calendar/types.ts +451 -0
- package/src/components/Calendar/useEventDrag.ts +783 -0
- package/src/components/Calendar/utils.ts +622 -0
- package/src/components/Card/Card.module.scss +264 -0
- package/src/components/Card/Card.tokens.scss +55 -0
- package/src/components/Card/Card.tsx +170 -0
- package/src/components/Card/CardBody.tsx +45 -0
- package/src/components/Card/CardHeader.tsx +113 -0
- package/src/components/Card/CardList.tsx +24 -0
- package/src/components/Card/CardListRow.tsx +24 -0
- package/src/components/Card/index.ts +7 -0
- package/src/components/CatalogPicker/CatalogPicker.module.scss +193 -0
- package/src/components/CatalogPicker/CatalogPicker.tokens.scss +26 -0
- package/src/components/CatalogPicker/CatalogPicker.tsx +339 -0
- package/src/components/CatalogPicker/index.ts +2 -0
- package/src/components/Chart/Chart.module.scss +287 -0
- package/src/components/Chart/Chart.tokens.scss +63 -0
- package/src/components/Chart/Chart.tsx +607 -0
- package/src/components/Chart/ChartLegend.tsx +99 -0
- package/src/components/Chart/ChartTable.tsx +62 -0
- package/src/components/Chart/ChartTooltip.tsx +91 -0
- package/src/components/Chart/chartModel.ts +689 -0
- package/src/components/Chart/index.ts +2 -0
- package/src/components/ChatBubble/ChatBubble.module.scss +93 -0
- package/src/components/ChatBubble/ChatBubble.tokens.scss +17 -0
- package/src/components/ChatBubble/ChatBubble.tsx +61 -0
- package/src/components/ChatBubble/ChatBubbleList.tsx +27 -0
- package/src/components/ChatBubble/index.ts +3 -0
- package/src/components/ChatLauncher/ChatLauncher.module.scss +68 -0
- package/src/components/ChatLauncher/ChatLauncher.tokens.scss +27 -0
- package/src/components/ChatLauncher/ChatLauncher.tsx +202 -0
- package/src/components/ChatLauncher/index.ts +2 -0
- package/src/components/ChatLauncher/isAtBottom.ts +12 -0
- package/src/components/Checkbox/Checkbox.module.scss +147 -0
- package/src/components/Checkbox/Checkbox.tokens.scss +44 -0
- package/src/components/Checkbox/Checkbox.tsx +188 -0
- package/src/components/Checkbox/index.ts +2 -0
- package/src/components/CircularProgress/CircularProgress.module.scss +133 -0
- package/src/components/CircularProgress/CircularProgress.tokens.scss +40 -0
- package/src/components/CircularProgress/CircularProgress.tsx +139 -0
- package/src/components/CircularProgress/index.ts +7 -0
- package/src/components/Cluster/Cluster.module.scss +145 -0
- package/src/components/Cluster/Cluster.tokens.scss +11 -0
- package/src/components/Cluster/Cluster.tsx +215 -0
- package/src/components/Cluster/index.ts +2 -0
- package/src/components/Code/Code.module.scss +28 -0
- package/src/components/Code/Code.tokens.scss +15 -0
- package/src/components/Code/Code.tsx +44 -0
- package/src/components/Code/index.ts +2 -0
- package/src/components/CodeBlock/CodeBlock.module.scss +146 -0
- package/src/components/CodeBlock/CodeBlock.tokens.scss +27 -0
- package/src/components/CodeBlock/CodeBlock.tsx +274 -0
- package/src/components/CodeBlock/highlight.ts +179 -0
- package/src/components/CodeBlock/index.ts +8 -0
- package/src/components/CodeBlock/sampleSync.ts +42 -0
- package/src/components/ColorPicker/ColorPicker.module.scss +286 -0
- package/src/components/ColorPicker/ColorPicker.tokens.scss +60 -0
- package/src/components/ColorPicker/ColorPicker.tsx +367 -0
- package/src/components/ColorPicker/ColorPickerPanel.tsx +265 -0
- package/src/components/ColorPicker/SVSquare.tsx +189 -0
- package/src/components/ColorPicker/colorMath.ts +141 -0
- package/src/components/ColorPicker/index.ts +6 -0
- package/src/components/ConfirmationPopover/ConfirmationPopover.module.scss +39 -0
- package/src/components/ConfirmationPopover/ConfirmationPopover.tokens.scss +13 -0
- package/src/components/ConfirmationPopover/ConfirmationPopover.tsx +395 -0
- package/src/components/ConfirmationPopover/index.ts +2 -0
- package/src/components/Constrain/Constrain.module.scss +99 -0
- package/src/components/Constrain/Constrain.tsx +79 -0
- package/src/components/Constrain/index.ts +2 -0
- package/src/components/CurrencySelect/CurrencySelect.module.scss +7 -0
- package/src/components/CurrencySelect/CurrencySelect.tsx +167 -0
- package/src/components/CurrencySelect/index.ts +3 -0
- package/src/components/CursorPagination/CursorPagination.module.scss +69 -0
- package/src/components/CursorPagination/CursorPagination.tokens.scss +32 -0
- package/src/components/CursorPagination/CursorPagination.tsx +121 -0
- package/src/components/CursorPagination/index.ts +2 -0
- package/src/components/DashboardCanvas/DashboardCanvas.module.scss +360 -0
- package/src/components/DashboardCanvas/DashboardCanvas.tokens.scss +48 -0
- package/src/components/DashboardCanvas/DashboardCanvas.tsx +1270 -0
- package/src/components/DashboardCanvas/DashboardCanvasItem.tsx +140 -0
- package/src/components/DashboardCanvas/DashboardCanvasSection.tsx +174 -0
- package/src/components/DashboardCanvas/engine.ts +363 -0
- package/src/components/DashboardCanvas/index.ts +9 -0
- package/src/components/DashboardWidget/DashboardWidget.module.scss +100 -0
- package/src/components/DashboardWidget/DashboardWidget.tokens.scss +16 -0
- package/src/components/DashboardWidget/DashboardWidget.tsx +188 -0
- package/src/components/DashboardWidget/index.ts +7 -0
- package/src/components/DataTable/BodyRow.tsx +197 -0
- package/src/components/DataTable/ColumnVisibilityTrigger.module.scss +7 -0
- package/src/components/DataTable/ColumnVisibilityTrigger.tsx +105 -0
- package/src/components/DataTable/DataTable.module.scss +511 -0
- package/src/components/DataTable/DataTable.tokens.scss +80 -0
- package/src/components/DataTable/DataTable.tsx +734 -0
- package/src/components/DataTable/HeaderCell.module.scss +215 -0
- package/src/components/DataTable/HeaderCell.tsx +440 -0
- package/src/components/DataTable/columnShift.ts +117 -0
- package/src/components/DataTable/index.ts +23 -0
- package/src/components/DataTable/pinStyle.ts +47 -0
- package/src/components/DataTable/reorderColumns.ts +66 -0
- package/src/components/DataTable/types.ts +289 -0
- package/src/components/DataTable/useColumnDragShift.ts +216 -0
- package/src/components/DataTable/useDataTable.ts +372 -0
- package/src/components/DataTable/useResizeHandle.ts +97 -0
- package/src/components/DatePicker/DatePicker.module.scss +180 -0
- package/src/components/DatePicker/DatePicker.tokens.scss +152 -0
- package/src/components/DatePicker/DatePicker.tsx +664 -0
- package/src/components/DatePicker/DatePickerGrid.module.scss +172 -0
- package/src/components/DatePicker/DatePickerGrid.tsx +341 -0
- package/src/components/DatePicker/InlineDatePicker.module.scss +32 -0
- package/src/components/DatePicker/InlineDatePicker.tsx +201 -0
- package/src/components/DatePicker/index.ts +4 -0
- package/src/components/DatePicker/utils.ts +364 -0
- package/src/components/DateRangePicker/DateRangePicker.module.scss +237 -0
- package/src/components/DateRangePicker/DateRangePicker.tokens.scss +78 -0
- package/src/components/DateRangePicker/DateRangePicker.tsx +720 -0
- package/src/components/DateRangePicker/InlineDateRangePicker.module.scss +94 -0
- package/src/components/DateRangePicker/InlineDateRangePicker.tsx +376 -0
- package/src/components/DateRangePicker/index.ts +5 -0
- package/src/components/DateRangePicker/utils.ts +151 -0
- package/src/components/DateStrip/DateStrip.module.scss +78 -0
- package/src/components/DateStrip/DateStrip.tokens.scss +23 -0
- package/src/components/DateStrip/DateStrip.tsx +205 -0
- package/src/components/DateStrip/index.ts +2 -0
- package/src/components/DefinitionList/DefinitionList.module.scss +102 -0
- package/src/components/DefinitionList/DefinitionList.tokens.scss +29 -0
- package/src/components/DefinitionList/DefinitionList.tsx +198 -0
- package/src/components/DefinitionList/index.ts +9 -0
- package/src/components/Divider/Divider.module.scss +144 -0
- package/src/components/Divider/Divider.tokens.scss +21 -0
- package/src/components/Divider/Divider.tsx +103 -0
- package/src/components/Divider/index.ts +2 -0
- package/src/components/Dot/Dot.module.scss +40 -0
- package/src/components/Dot/Dot.tokens.scss +4 -0
- package/src/components/Dot/Dot.tsx +45 -0
- package/src/components/Dot/index.ts +2 -0
- package/src/components/Drawer/Body.tsx +23 -0
- package/src/components/Drawer/Close.tsx +35 -0
- package/src/components/Drawer/Content.tsx +93 -0
- package/src/components/Drawer/Drawer.module.scss +232 -0
- package/src/components/Drawer/Drawer.tokens.scss +38 -0
- package/src/components/Drawer/Drawer.tsx +23 -0
- package/src/components/Drawer/DrawerRoot.tsx +190 -0
- package/src/components/Drawer/Footer.tsx +24 -0
- package/src/components/Drawer/Header.tsx +64 -0
- package/src/components/Drawer/Overlay.tsx +82 -0
- package/src/components/Drawer/context.ts +44 -0
- package/src/components/Drawer/index.ts +12 -0
- package/src/components/Drawer/useDragToClose.ts +149 -0
- package/src/components/DropdownMenu/CheckboxItem.tsx +144 -0
- package/src/components/DropdownMenu/Content.tsx +419 -0
- package/src/components/DropdownMenu/DropdownMenu.module.scss +280 -0
- package/src/components/DropdownMenu/DropdownMenu.tokens.scss +88 -0
- package/src/components/DropdownMenu/DropdownMenu.tsx +43 -0
- package/src/components/DropdownMenu/Group.tsx +76 -0
- package/src/components/DropdownMenu/Item.tsx +148 -0
- package/src/components/DropdownMenu/ItemIndicator.tsx +30 -0
- package/src/components/DropdownMenu/Radio.tsx +178 -0
- package/src/components/DropdownMenu/Root.tsx +100 -0
- package/src/components/DropdownMenu/Sub.tsx +332 -0
- package/src/components/DropdownMenu/Trigger.tsx +76 -0
- package/src/components/DropdownMenu/context.ts +65 -0
- package/src/components/DropdownMenu/index.ts +20 -0
- package/src/components/EmojiPicker/EmojiPicker.module.scss +84 -0
- package/src/components/EmojiPicker/EmojiPicker.tokens.scss +24 -0
- package/src/components/EmojiPicker/EmojiPicker.tsx +341 -0
- package/src/components/EmojiPicker/emojiData.ts +245 -0
- package/src/components/EmojiPicker/index.ts +3 -0
- package/src/components/EmptyState/EmptyState.module.scss +102 -0
- package/src/components/EmptyState/EmptyState.tokens.scss +28 -0
- package/src/components/EmptyState/EmptyState.tsx +112 -0
- package/src/components/EmptyState/index.ts +7 -0
- package/src/components/EntityChip/EntityChip.module.scss +275 -0
- package/src/components/EntityChip/EntityChip.tokens.scss +66 -0
- package/src/components/EntityChip/EntityChip.tsx +649 -0
- package/src/components/EntityChip/index.ts +10 -0
- package/src/components/ErrorState/ErrorState.module.scss +105 -0
- package/src/components/ErrorState/ErrorState.tokens.scss +32 -0
- package/src/components/ErrorState/ErrorState.tsx +125 -0
- package/src/components/ErrorState/index.ts +8 -0
- package/src/components/Field/Field.module.scss +46 -0
- package/src/components/Field/Field.tsx +185 -0
- package/src/components/Field/index.ts +2 -0
- package/src/components/FileUpload/FileUpload.module.scss +187 -0
- package/src/components/FileUpload/FileUpload.tokens.scss +81 -0
- package/src/components/FileUpload/FileUpload.tsx +569 -0
- package/src/components/FileUpload/formatBytes.ts +34 -0
- package/src/components/FileUpload/iconForFile.ts +40 -0
- package/src/components/FileUpload/index.ts +2 -0
- package/src/components/FilterChip/FilterChip.module.scss +61 -0
- package/src/components/FilterChip/FilterChip.tokens.scss +25 -0
- package/src/components/FilterChip/FilterChip.tsx +208 -0
- package/src/components/FilterChip/index.ts +5 -0
- package/src/components/FlowCanvas/FlowCanvas.module.scss +329 -0
- package/src/components/FlowCanvas/FlowCanvas.tokens.scss +45 -0
- package/src/components/FlowCanvas/FlowCanvas.tsx +1867 -0
- package/src/components/FlowCanvas/FlowControls.tsx +46 -0
- package/src/components/FlowCanvas/FlowEdge.tsx +58 -0
- package/src/components/FlowCanvas/FlowNode.tsx +76 -0
- package/src/components/FlowCanvas/edgePath.ts +85 -0
- package/src/components/FlowCanvas/index.ts +4 -0
- package/src/components/FlowCanvas/layout.ts +148 -0
- package/src/components/FlowCanvas/spatialNav.ts +76 -0
- package/src/components/FlowCanvas/types.ts +59 -0
- package/src/components/FlowCanvas/useViewport.ts +122 -0
- package/src/components/FormRow/FormRow.module.scss +2 -0
- package/src/components/FormRow/FormRow.tsx +37 -0
- package/src/components/FormRow/index.ts +2 -0
- package/src/components/FormSection/FormSection.module.scss +24 -0
- package/src/components/FormSection/FormSection.tsx +46 -0
- package/src/components/FormSection/index.ts +2 -0
- package/src/components/Grid/Grid.module.scss +162 -0
- package/src/components/Grid/Grid.tokens.scss +13 -0
- package/src/components/Grid/Grid.tsx +226 -0
- package/src/components/Grid/GridItem.tsx +77 -0
- package/src/components/Grid/index.ts +11 -0
- package/src/components/Highlight/Highlight.module.scss +43 -0
- package/src/components/Highlight/Highlight.tokens.scss +35 -0
- package/src/components/Highlight/Highlight.tsx +164 -0
- package/src/components/Highlight/HighlightOverlay.tsx +100 -0
- package/src/components/Highlight/index.ts +2 -0
- package/src/components/HighlightedText/HighlightedText.module.scss +11 -0
- package/src/components/HighlightedText/HighlightedText.tokens.scss +9 -0
- package/src/components/HighlightedText/HighlightedText.tsx +50 -0
- package/src/components/HighlightedText/highlightRanges.ts +44 -0
- package/src/components/HighlightedText/index.ts +2 -0
- package/src/components/IconPicker/IconPicker.module.scss +175 -0
- package/src/components/IconPicker/IconPicker.tokens.scss +40 -0
- package/src/components/IconPicker/IconPicker.tsx +629 -0
- package/src/components/IconPicker/index.ts +9 -0
- package/src/components/IconTile/IconTile.module.scss +57 -0
- package/src/components/IconTile/IconTile.tokens.scss +16 -0
- package/src/components/IconTile/IconTile.tsx +91 -0
- package/src/components/IconTile/index.ts +2 -0
- package/src/components/Image/Image.module.scss +266 -0
- package/src/components/Image/Image.tokens.scss +55 -0
- package/src/components/Image/Image.tsx +342 -0
- package/src/components/Image/index.ts +2 -0
- package/src/components/ImageCrop/ImageCrop.module.scss +274 -0
- package/src/components/ImageCrop/ImageCrop.tokens.scss +33 -0
- package/src/components/ImageCrop/ImageCrop.tsx +542 -0
- package/src/components/ImageCrop/cropGeometry.ts +120 -0
- package/src/components/ImageCrop/extractCropBlob.ts +140 -0
- package/src/components/ImageCrop/index.ts +11 -0
- package/src/components/ImageCrop/useCropPreview.ts +161 -0
- package/src/components/Indent/Indent.module.scss +33 -0
- package/src/components/Indent/Indent.tokens.scss +10 -0
- package/src/components/Indent/Indent.tsx +46 -0
- package/src/components/Indent/index.ts +2 -0
- package/src/components/Input/Input.module.scss +99 -0
- package/src/components/Input/Input.tokens.scss +54 -0
- package/src/components/Input/Input.tsx +105 -0
- package/src/components/Input/Suggestions.tsx +260 -0
- package/src/components/Input/index.ts +2 -0
- package/src/components/Kanban/Kanban.module.scss +39 -0
- package/src/components/Kanban/Kanban.tokens.scss +15 -0
- package/src/components/Kanban/Kanban.tsx +951 -0
- package/src/components/Kanban/index.ts +7 -0
- package/src/components/Kbd/Kbd.module.scss +47 -0
- package/src/components/Kbd/Kbd.tokens.scss +26 -0
- package/src/components/Kbd/Kbd.tsx +73 -0
- package/src/components/Kbd/index.ts +2 -0
- package/src/components/Lightbox/Lightbox.module.scss +283 -0
- package/src/components/Lightbox/Lightbox.tokens.scss +36 -0
- package/src/components/Lightbox/Lightbox.tsx +506 -0
- package/src/components/Lightbox/index.ts +2 -0
- package/src/components/Link/Link.module.scss +78 -0
- package/src/components/Link/Link.tokens.scss +28 -0
- package/src/components/Link/Link.tsx +114 -0
- package/src/components/Link/index.ts +2 -0
- package/src/components/LinkCard/LinkCard.module.scss +92 -0
- package/src/components/LinkCard/LinkCard.tokens.scss +9 -0
- package/src/components/LinkCard/LinkCard.tsx +72 -0
- package/src/components/LinkCard/index.ts +2 -0
- package/src/components/LiquidEditor/AutocompleteMenu.tsx +133 -0
- package/src/components/LiquidEditor/HighlightLayer.tsx +53 -0
- package/src/components/LiquidEditor/InsertVariableMenu.tsx +81 -0
- package/src/components/LiquidEditor/LiquidEditor.module.scss +339 -0
- package/src/components/LiquidEditor/LiquidEditor.tokens.scss +81 -0
- package/src/components/LiquidEditor/LiquidEditor.tsx +412 -0
- package/src/components/LiquidEditor/PreviewPane.tsx +29 -0
- package/src/components/LiquidEditor/caretCoordinates.ts +97 -0
- package/src/components/LiquidEditor/index.ts +7 -0
- package/src/components/LiquidEditor/liquidFilters.ts +23 -0
- package/src/components/LiquidEditor/liquidTokenizer.ts +235 -0
- package/src/components/LiquidEditor/types.ts +101 -0
- package/src/components/LiquidEditor/useLiquidAutocomplete.ts +178 -0
- package/src/components/List/List.module.scss +105 -0
- package/src/components/List/List.tokens.scss +42 -0
- package/src/components/List/List.tsx +124 -0
- package/src/components/List/index.ts +9 -0
- package/src/components/LiveRegion/LiveRegion.module.scss +3 -0
- package/src/components/LiveRegion/LiveRegion.tsx +116 -0
- package/src/components/LiveRegion/index.ts +2 -0
- package/src/components/Logo/Logo.module.scss +139 -0
- package/src/components/Logo/Logo.tokens.scss +14 -0
- package/src/components/Logo/Logo.tsx +126 -0
- package/src/components/Logo/index.ts +2 -0
- package/src/components/Masonry/Masonry.module.scss +42 -0
- package/src/components/Masonry/Masonry.tokens.scss +8 -0
- package/src/components/Masonry/Masonry.tsx +136 -0
- package/src/components/Masonry/index.ts +2 -0
- package/src/components/Masonry/masonryUtils.ts +42 -0
- package/src/components/MediaTile/MediaTile.module.scss +183 -0
- package/src/components/MediaTile/MediaTile.tokens.scss +60 -0
- package/src/components/MediaTile/MediaTile.tsx +208 -0
- package/src/components/MediaTile/index.ts +8 -0
- package/src/components/Modal/Body.tsx +27 -0
- package/src/components/Modal/Close.tsx +45 -0
- package/src/components/Modal/Content.tsx +98 -0
- package/src/components/Modal/Footer.tsx +28 -0
- package/src/components/Modal/Header.tsx +51 -0
- package/src/components/Modal/Modal.module.scss +262 -0
- package/src/components/Modal/Modal.tokens.scss +50 -0
- package/src/components/Modal/Modal.tsx +23 -0
- package/src/components/Modal/ModalRoot.tsx +299 -0
- package/src/components/Modal/Overlay.tsx +101 -0
- package/src/components/Modal/context.ts +60 -0
- package/src/components/Modal/index.ts +11 -0
- package/src/components/MoneyInput/MoneyInput.module.scss +57 -0
- package/src/components/MoneyInput/MoneyInput.tsx +433 -0
- package/src/components/MoneyInput/index.ts +2 -0
- package/src/components/OptionsPicker/OptionsPicker.module.scss +216 -0
- package/src/components/OptionsPicker/OptionsPicker.tokens.scss +68 -0
- package/src/components/OptionsPicker/OptionsPicker.tsx +936 -0
- package/src/components/OptionsPicker/index.ts +9 -0
- package/src/components/OtpInput/OtpInput.module.scss +69 -0
- package/src/components/OtpInput/OtpInput.tokens.scss +45 -0
- package/src/components/OtpInput/OtpInput.tsx +368 -0
- package/src/components/OtpInput/index.ts +2 -0
- package/src/components/Page/Page.module.scss +30 -0
- package/src/components/Page/Page.tokens.scss +11 -0
- package/src/components/Page/Page.tsx +53 -0
- package/src/components/Page/index.ts +2 -0
- package/src/components/PageHeader/PageHeader.module.scss +197 -0
- package/src/components/PageHeader/PageHeader.tokens.scss +41 -0
- package/src/components/PageHeader/PageHeader.tsx +310 -0
- package/src/components/PageHeader/index.ts +20 -0
- package/src/components/Pagination/Pagination.module.scss +117 -0
- package/src/components/Pagination/Pagination.tokens.scss +54 -0
- package/src/components/Pagination/Pagination.tsx +165 -0
- package/src/components/Pagination/index.ts +4 -0
- package/src/components/Pagination/paginationRange.ts +72 -0
- package/src/components/PasswordInput/PasswordInput.module.scss +120 -0
- package/src/components/PasswordInput/PasswordInput.tokens.scss +44 -0
- package/src/components/PasswordInput/PasswordInput.tsx +210 -0
- package/src/components/PasswordInput/index.ts +2 -0
- package/src/components/PasswordStrengthMeter/PasswordStrengthMeter.module.scss +80 -0
- package/src/components/PasswordStrengthMeter/PasswordStrengthMeter.tokens.scss +40 -0
- package/src/components/PasswordStrengthMeter/PasswordStrengthMeter.tsx +96 -0
- package/src/components/PasswordStrengthMeter/index.ts +2 -0
- package/src/components/PersonDisplay/PersonDisplay.module.scss +180 -0
- package/src/components/PersonDisplay/PersonDisplay.tokens.scss +35 -0
- package/src/components/PersonDisplay/PersonDisplay.tsx +420 -0
- package/src/components/PersonDisplay/index.ts +10 -0
- package/src/components/PhoneInput/PhoneInput.module.scss +23 -0
- package/src/components/PhoneInput/PhoneInput.tsx +271 -0
- package/src/components/PhoneInput/index.ts +4 -0
- package/src/components/PhoneInput/phone.ts +128 -0
- package/src/components/PillMenu/PillMenu.module.scss +117 -0
- package/src/components/PillMenu/PillMenu.tokens.scss +22 -0
- package/src/components/PillMenu/PillMenu.tsx +324 -0
- package/src/components/PillMenu/index.ts +2 -0
- package/src/components/Popover/Anchor.tsx +37 -0
- package/src/components/Popover/Close.tsx +45 -0
- package/src/components/Popover/Content.tsx +213 -0
- package/src/components/Popover/Heading.tsx +33 -0
- package/src/components/Popover/Popover.module.scss +177 -0
- package/src/components/Popover/Popover.tokens.scss +22 -0
- package/src/components/Popover/Popover.tsx +23 -0
- package/src/components/Popover/PopoverRoot.tsx +75 -0
- package/src/components/Popover/Trigger.tsx +86 -0
- package/src/components/Popover/context.ts +22 -0
- package/src/components/Popover/index.ts +7 -0
- package/src/components/Progress/Progress.module.scss +110 -0
- package/src/components/Progress/Progress.tokens.scss +44 -0
- package/src/components/Progress/Progress.tsx +129 -0
- package/src/components/Progress/index.ts +2 -0
- package/src/components/QrCode/QrCode.module.scss +97 -0
- package/src/components/QrCode/QrCode.tokens.scss +17 -0
- package/src/components/QrCode/QrCode.tsx +233 -0
- package/src/components/QrCode/index.ts +2 -0
- package/src/components/QrCode/qr.ts +161 -0
- package/src/components/Radio/Radio.module.scss +175 -0
- package/src/components/Radio/Radio.tokens.scss +59 -0
- package/src/components/Radio/Radio.tsx +127 -0
- package/src/components/Radio/RadioGroup.module.scss +42 -0
- package/src/components/Radio/RadioGroup.tsx +120 -0
- package/src/components/Radio/RadioGroupContext.tsx +30 -0
- package/src/components/Radio/index.ts +4 -0
- package/src/components/Rail/Rail.module.scss +510 -0
- package/src/components/Rail/Rail.tokens.scss +92 -0
- package/src/components/Rail/Rail.tsx +287 -0
- package/src/components/Rail/RailCollapseToggle.tsx +57 -0
- package/src/components/Rail/RailFooter.tsx +17 -0
- package/src/components/Rail/RailGroup.tsx +728 -0
- package/src/components/Rail/RailGroupContext.ts +9 -0
- package/src/components/Rail/RailHeader.tsx +23 -0
- package/src/components/Rail/RailItem.tsx +119 -0
- package/src/components/Rail/RailSection.tsx +39 -0
- package/src/components/Rail/RailSpacer.tsx +19 -0
- package/src/components/Rail/index.ts +9 -0
- package/src/components/RelativeDateInput/RelativeDateInput.module.scss +15 -0
- package/src/components/RelativeDateInput/RelativeDateInput.tokens.scss +6 -0
- package/src/components/RelativeDateInput/RelativeDateInput.tsx +474 -0
- package/src/components/RelativeDateInput/index.ts +10 -0
- package/src/components/RelativeDateInput/relativeDate.ts +127 -0
- package/src/components/RichText/RichText.module.scss +5 -0
- package/src/components/RichText/RichText.tsx +70 -0
- package/src/components/RichText/RichTextAttachment.module.scss +82 -0
- package/src/components/RichText/RichTextAttachment.tsx +122 -0
- package/src/components/RichText/_prose.scss +79 -0
- package/src/components/RichText/attachmentIcon.tsx +24 -0
- package/src/components/RichText/engine/attachment.ts +154 -0
- package/src/components/RichText/engine/autolink.ts +64 -0
- package/src/components/RichText/engine/blockUnit.ts +174 -0
- package/src/components/RichText/engine/colorMarks.ts +85 -0
- package/src/components/RichText/engine/escape.ts +11 -0
- package/src/components/RichText/engine/fromHtml.ts +353 -0
- package/src/components/RichText/engine/fromMarkdown.ts +20 -0
- package/src/components/RichText/engine/inlines.ts +82 -0
- package/src/components/RichText/engine/listDepths.ts +32 -0
- package/src/components/RichText/engine/marks.ts +80 -0
- package/src/components/RichText/engine/mdToHtml.ts +178 -0
- package/src/components/RichText/engine/model.ts +157 -0
- package/src/components/RichText/engine/position.ts +118 -0
- package/src/components/RichText/engine/renderDoc.tsx +395 -0
- package/src/components/RichText/engine/renderLink.ts +15 -0
- package/src/components/RichText/engine/renderMention.ts +16 -0
- package/src/components/RichText/engine/safeHref.ts +22 -0
- package/src/components/RichText/engine/toHtml.ts +154 -0
- package/src/components/RichText/engine/toMarkdown.ts +97 -0
- package/src/components/RichText/engine/transforms.ts +434 -0
- package/src/components/RichText/imageMaxHeightStyle.ts +10 -0
- package/src/components/RichText/index.ts +31 -0
- package/src/components/RichTextEditor/RichTextAttachmentConfig.tsx +264 -0
- package/src/components/RichTextEditor/RichTextBlockControls.tsx +365 -0
- package/src/components/RichTextEditor/RichTextBlockMenu.tsx +162 -0
- package/src/components/RichTextEditor/RichTextColorMenu.tsx +115 -0
- package/src/components/RichTextEditor/RichTextEditor.module.scss +298 -0
- package/src/components/RichTextEditor/RichTextEditor.tsx +1910 -0
- package/src/components/RichTextEditor/RichTextImageResizer.tsx +131 -0
- package/src/components/RichTextEditor/RichTextLinkEditor.tsx +151 -0
- package/src/components/RichTextEditor/RichTextMentionMenu.tsx +99 -0
- package/src/components/RichTextEditor/RichTextToolbar.tsx +379 -0
- package/src/components/RichTextEditor/autolinkInput.ts +65 -0
- package/src/components/RichTextEditor/blockDrop.ts +9 -0
- package/src/components/RichTextEditor/blockReflow.ts +62 -0
- package/src/components/RichTextEditor/commands.ts +300 -0
- package/src/components/RichTextEditor/history.ts +93 -0
- package/src/components/RichTextEditor/icons.tsx +152 -0
- package/src/components/RichTextEditor/imageSize.ts +70 -0
- package/src/components/RichTextEditor/index.ts +5 -0
- package/src/components/RichTextEditor/input.ts +209 -0
- package/src/components/RichTextEditor/inputRules.ts +71 -0
- package/src/components/RichTextEditor/links.ts +103 -0
- package/src/components/RichTextEditor/mentionContext.ts +37 -0
- package/src/components/RichTextEditor/mentions.ts +28 -0
- package/src/components/RichTextEditor/preventSelectionLoss.ts +15 -0
- package/src/components/RichTextEditor/selection.ts +415 -0
- package/src/components/RichTextEditor/shortcuts.ts +44 -0
- package/src/components/RichTextEditor/useAnchoredFloating.ts +50 -0
- package/src/components/RichTextEditor/useAttachmentConfig.ts +134 -0
- package/src/components/RichTextEditor/useDismissOnOutsidePointerDown.ts +26 -0
- package/src/components/RichTextEditor/useLinkEditor.ts +107 -0
- package/src/components/RichTextEditor/useMention.ts +226 -0
- package/src/components/RichTextEditor/useOverlayRect.ts +73 -0
- package/src/components/RichTextEditor/useUpload.ts +246 -0
- package/src/components/Screen/Screen.module.scss +46 -0
- package/src/components/Screen/Screen.tokens.scss +20 -0
- package/src/components/Screen/Screen.tsx +97 -0
- package/src/components/Screen/index.ts +2 -0
- package/src/components/ScrollArea/ScrollArea.module.scss +39 -0
- package/src/components/ScrollArea/ScrollArea.tokens.scss +15 -0
- package/src/components/ScrollArea/ScrollArea.tsx +154 -0
- package/src/components/ScrollArea/index.ts +2 -0
- package/src/components/Select/Chip.tsx +45 -0
- package/src/components/Select/Empty.tsx +39 -0
- package/src/components/Select/Error.tsx +51 -0
- package/src/components/Select/HiddenInputs.tsx +44 -0
- package/src/components/Select/Listbox.tsx +557 -0
- package/src/components/Select/Loading.tsx +30 -0
- package/src/components/Select/Select.module.scss +512 -0
- package/src/components/Select/Select.tokens.scss +140 -0
- package/src/components/Select/Select.tsx +685 -0
- package/src/components/Select/Trigger.tsx +952 -0
- package/src/components/Select/context.ts +101 -0
- package/src/components/Select/emptyStateText.ts +19 -0
- package/src/components/Select/index.ts +9 -0
- package/src/components/Select/useSelectState.ts +157 -0
- package/src/components/Select/utils-types.ts +7 -0
- package/src/components/Select/utils.ts +122 -0
- package/src/components/SettingRow/SettingRow.module.scss +166 -0
- package/src/components/SettingRow/SettingRow.tokens.scss +37 -0
- package/src/components/SettingRow/SettingRow.tsx +242 -0
- package/src/components/SettingRow/index.ts +7 -0
- package/src/components/Skeleton/Skeleton.module.scss +55 -0
- package/src/components/Skeleton/Skeleton.tokens.scss +17 -0
- package/src/components/Skeleton/Skeleton.tsx +131 -0
- package/src/components/Skeleton/index.ts +4 -0
- package/src/components/Skeleton/useSkeletonVisibility.ts +95 -0
- package/src/components/Slider/Slider.module.scss +293 -0
- package/src/components/Slider/Slider.tokens.scss +98 -0
- package/src/components/Slider/Slider.tsx +624 -0
- package/src/components/Slider/index.ts +9 -0
- package/src/components/SlotGrid/SlotGrid.module.scss +61 -0
- package/src/components/SlotGrid/SlotGrid.tokens.scss +21 -0
- package/src/components/SlotGrid/SlotGrid.tsx +111 -0
- package/src/components/SlotGrid/index.ts +2 -0
- package/src/components/SocialButton/SocialButton.module.scss +4 -0
- package/src/components/SocialButton/SocialButton.tsx +40 -0
- package/src/components/SocialButton/index.ts +2 -0
- package/src/components/Sortable/Sortable.module.scss +177 -0
- package/src/components/Sortable/Sortable.tokens.scss +27 -0
- package/src/components/Sortable/Sortable.tsx +572 -0
- package/src/components/Sortable/containerAwareCollision.ts +125 -0
- package/src/components/Sortable/index.ts +13 -0
- package/src/components/SortableGroup/SortableGroup.module.scss +23 -0
- package/src/components/SortableGroup/SortableGroup.tsx +315 -0
- package/src/components/SortableGroup/index.ts +4 -0
- package/src/components/SortableGroup/moveSortableItem.ts +39 -0
- package/src/components/Sparkline/Sparkline.module.scss +28 -0
- package/src/components/Sparkline/Sparkline.tokens.scss +7 -0
- package/src/components/Sparkline/Sparkline.tsx +133 -0
- package/src/components/Sparkline/index.ts +2 -0
- package/src/components/Sparkline/sparklineModel.ts +119 -0
- package/src/components/Split/Split.module.scss +158 -0
- package/src/components/Split/Split.tokens.scss +10 -0
- package/src/components/Split/Split.tsx +231 -0
- package/src/components/Split/index.ts +2 -0
- package/src/components/Stack/Stack.module.scss +67 -0
- package/src/components/Stack/Stack.tokens.scss +11 -0
- package/src/components/Stack/Stack.tsx +100 -0
- package/src/components/Stack/index.ts +2 -0
- package/src/components/StagePath/StagePath.module.scss +255 -0
- package/src/components/StagePath/StagePath.tokens.scss +43 -0
- package/src/components/StagePath/StagePath.tsx +176 -0
- package/src/components/StagePath/index.ts +2 -0
- package/src/components/StatGroup/StatGroup.module.scss +6 -0
- package/src/components/StatGroup/StatGroup.tsx +70 -0
- package/src/components/StatGroup/StatGroupContext.ts +10 -0
- package/src/components/StatGroup/StatTile.module.scss +99 -0
- package/src/components/StatGroup/StatTile.tokens.scss +35 -0
- package/src/components/StatGroup/StatTile.tsx +143 -0
- package/src/components/StatGroup/index.ts +4 -0
- package/src/components/Sticky/Sticky.module.scss +98 -0
- package/src/components/Sticky/Sticky.tokens.scss +17 -0
- package/src/components/Sticky/Sticky.tsx +103 -0
- package/src/components/Sticky/index.ts +2 -0
- package/src/components/Switch/Switch.module.scss +182 -0
- package/src/components/Switch/Switch.tokens.scss +59 -0
- package/src/components/Switch/Switch.tsx +214 -0
- package/src/components/Switch/index.ts +2 -0
- package/src/components/Table/Table.module.scss +308 -0
- package/src/components/Table/Table.tokens.scss +79 -0
- package/src/components/Table/Table.tsx +381 -0
- package/src/components/Table/index.ts +15 -0
- package/src/components/TableOfContents/TableOfContents.module.scss +83 -0
- package/src/components/TableOfContents/TableOfContents.tokens.scss +26 -0
- package/src/components/TableOfContents/TableOfContents.tsx +192 -0
- package/src/components/TableOfContents/activeSection.ts +18 -0
- package/src/components/TableOfContents/index.ts +2 -0
- package/src/components/Tabs/Tabs.module.scss +359 -0
- package/src/components/Tabs/Tabs.tokens.scss +50 -0
- package/src/components/Tabs/Tabs.tsx +538 -0
- package/src/components/Tabs/index.ts +2 -0
- package/src/components/Text/Text.module.scss +115 -0
- package/src/components/Text/Text.tokens.scss +55 -0
- package/src/components/Text/Text.tsx +197 -0
- package/src/components/Text/index.ts +2 -0
- package/src/components/Textarea/Textarea.module.scss +94 -0
- package/src/components/Textarea/Textarea.tokens.scss +48 -0
- package/src/components/Textarea/Textarea.tsx +246 -0
- package/src/components/Textarea/index.ts +2 -0
- package/src/components/Thread/Thread.module.scss +161 -0
- package/src/components/Thread/Thread.tokens.scss +32 -0
- package/src/components/Thread/Thread.tsx +176 -0
- package/src/components/Thread/index.ts +2 -0
- package/src/components/TimeField/TimeField.module.scss +232 -0
- package/src/components/TimeField/TimeField.tsx +793 -0
- package/src/components/TimeField/index.ts +2 -0
- package/src/components/Timeline/Timeline.module.scss +58 -0
- package/src/components/Timeline/Timeline.tokens.scss +13 -0
- package/src/components/Timeline/Timeline.tsx +53 -0
- package/src/components/Timeline/index.ts +2 -0
- package/src/components/Title/Title.module.scss +84 -0
- package/src/components/Title/Title.tokens.scss +37 -0
- package/src/components/Title/Title.tsx +150 -0
- package/src/components/Title/index.ts +2 -0
- package/src/components/Toast/Toast.module.scss +299 -0
- package/src/components/Toast/Toast.tokens.scss +65 -0
- package/src/components/Toast/Toast.tsx +122 -0
- package/src/components/Toast/ToastViewport.tsx +166 -0
- package/src/components/Toast/api.ts +175 -0
- package/src/components/Toast/index.ts +5 -0
- package/src/components/Toast/store.ts +133 -0
- package/src/components/Toast/useToastTimer.ts +94 -0
- package/src/components/Tooltip/Tooltip.module.scss +99 -0
- package/src/components/Tooltip/Tooltip.tokens.scss +23 -0
- package/src/components/Tooltip/Tooltip.tsx +341 -0
- package/src/components/Tooltip/index.ts +2 -0
- package/src/components/TopBar/TopBar.module.scss +235 -0
- package/src/components/TopBar/TopBar.tokens.scss +79 -0
- package/src/components/TopBar/TopBar.tsx +87 -0
- package/src/components/TopBar/TopBarEnd.tsx +20 -0
- package/src/components/TopBar/TopBarIconButton.tsx +86 -0
- package/src/components/TopBar/TopBarSearch.tsx +319 -0
- package/src/components/TopBar/TopBarSearchPanel.tsx +268 -0
- package/src/components/TopBar/TopBarStart.tsx +20 -0
- package/src/components/TopBar/index.ts +11 -0
- package/src/components/Tour/Spotlight.tsx +121 -0
- package/src/components/Tour/Tour.module.scss +210 -0
- package/src/components/Tour/Tour.tokens.scss +58 -0
- package/src/components/Tour/Tour.tsx +617 -0
- package/src/components/Tour/index.ts +2 -0
- package/src/components/Tour/useTourTarget.ts +115 -0
- package/src/components/TreeView/TreeView.module.scss +268 -0
- package/src/components/TreeView/TreeView.tokens.scss +36 -0
- package/src/components/TreeView/TreeView.tsx +536 -0
- package/src/components/TreeView/index.ts +3 -0
- package/src/components/TreeView/treeModel.ts +224 -0
- package/src/components/VisuallyHidden/VisuallyHidden.module.scss +7 -0
- package/src/components/VisuallyHidden/VisuallyHidden.tsx +29 -0
- package/src/components/VisuallyHidden/index.ts +2 -0
- package/src/components/WidgetPreview/WidgetPreview.module.scss +11 -0
- package/src/components/WidgetPreview/WidgetPreview.tokens.scss +26 -0
- package/src/components/WidgetPreview/WidgetPreview.tsx +36 -0
- package/src/components/WidgetPreview/WidgetShape.module.scss +140 -0
- package/src/components/WidgetPreview/WidgetShape.tsx +159 -0
- package/src/components/WidgetPreview/index.ts +2 -0
- package/src/components/_internal/Trend.tsx +27 -0
- package/src/components/_internal/choiceTile.scss +74 -0
- package/src/components/_internal/collapse.scss +10 -0
- package/src/components/_internal/collapse.ts +58 -0
- package/src/components/_internal/currency.ts +257 -0
- package/src/components/_internal/dragAnnouncements.ts +200 -0
- package/src/components/_internal/fieldWiring.ts +225 -0
- package/src/components/_internal/gridSpan.ts +54 -0
- package/src/components/_internal/isoDay.ts +35 -0
- package/src/components/_internal/letterKey.ts +26 -0
- package/src/components/_internal/overlay/focusRestore.ts +21 -0
- package/src/components/_internal/overlay/index.ts +12 -0
- package/src/components/_internal/overlay/tourHold.ts +23 -0
- package/src/components/_internal/overlay/useFocusTrap.ts +120 -0
- package/src/components/_internal/overlay/useInOverlay.ts +81 -0
- package/src/components/_internal/overlay/useOverlayStack.ts +232 -0
- package/src/components/_internal/overlay/useScrollLock.ts +112 -0
- package/src/components/_internal/refs.ts +48 -0
- package/src/components/_internal/statusColor.ts +26 -0
- package/src/components/_internal/timeUtils.ts +23 -0
- package/src/components/_internal/useAsyncOptions.ts +145 -0
- package/src/components/_internal/useClippedTooltip.ts +50 -0
- package/src/components/_internal/useControllableState.ts +50 -0
- package/src/components.manifest.json +1141 -0
- package/src/hooks/useBelowBreakpoint.ts +58 -0
- package/src/i18n/I18nProvider.tsx +52 -0
- package/src/i18n/LocaleProvider.tsx +17 -0
- package/src/i18n/en.ts +648 -0
- package/src/i18n/format.ts +71 -0
- package/src/i18n/index.ts +13 -0
- package/src/i18n/messages.ts +1275 -0
- package/src/i18n/ru.ts +677 -0
- package/src/i18n/useLocale.ts +19 -0
- package/src/i18n/useTranslation.ts +58 -0
- package/src/index.ts +913 -0
- package/src/palette/index.ts +2 -0
- package/src/palette/palette.ts +108 -0
- package/src/styles/dark.scss +4 -0
- package/src/styles/global.scss +7 -0
- package/src/styles/mixins.scss +143 -0
- package/src/styles/reset.scss +78 -0
- package/src/styles/tokens.scss +18 -0
- package/src/styles/typography.scss +44 -0
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
@use './Split.tokens';
|
|
2
|
+
@use '../_internal/collapse' as bp;
|
|
3
|
+
|
|
4
|
+
.split {
|
|
5
|
+
display: grid;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
// Column templates. The aside track is driven by --split-aside-width (set
|
|
9
|
+
// inline from the asideWidth prop; defaults to `auto` = intrinsic). `1fr` and
|
|
10
|
+
// `auto` are intrinsic grid keywords, not raw lengths (same as Grid).
|
|
11
|
+
.sideStart {
|
|
12
|
+
grid-template-columns: var(--split-aside-width, auto) 1fr;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
.sideEnd {
|
|
16
|
+
grid-template-columns: 1fr var(--split-aside-width, auto);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// Collapsible splits use shrink-safe tracks: the pinned aside width holds
|
|
20
|
+
// while space is available, then both tracks can contract without overflow as
|
|
21
|
+
// the container narrows. The container query cannot re-template its own query
|
|
22
|
+
// container, so this must be set before the children span every track.
|
|
23
|
+
.sideStart.collapsible {
|
|
24
|
+
grid-template-columns:
|
|
25
|
+
minmax(0, var(--split-aside-width, auto))
|
|
26
|
+
minmax(0, 1fr);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
.sideEnd.collapsible {
|
|
30
|
+
grid-template-columns:
|
|
31
|
+
minmax(0, 1fr)
|
|
32
|
+
minmax(0, var(--split-aside-width, auto));
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// No aside cell: one full-width track. Same specificity as `.sideX.collapsible`
|
|
36
|
+
// and declared after it, so it wins.
|
|
37
|
+
.split.noAside {
|
|
38
|
+
grid-template-columns: minmax(0, 1fr);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// Aside cell — intrinsic width comes from the grid track; min-width:0 lets very
|
|
42
|
+
// long aside content shrink rather than blow out the `auto` track. (Also gives
|
|
43
|
+
// the class a real declaration so CSS Modules emits it for the `.aside` hook.)
|
|
44
|
+
.aside {
|
|
45
|
+
min-width: 0;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// The main pane shrinks instead of overflowing or pushing the aside wider.
|
|
49
|
+
.main {
|
|
50
|
+
min-width: 0;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Gap presets — mirror Stack/Cluster/Grid scale + camelCase naming.
|
|
54
|
+
.gapXs {
|
|
55
|
+
gap: var(--split-gap-xs);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
.gapSm {
|
|
59
|
+
gap: var(--split-gap-sm);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
.gapMd {
|
|
63
|
+
gap: var(--split-gap-md);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
.gapLg {
|
|
67
|
+
gap: var(--split-gap-lg);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.gapXl {
|
|
71
|
+
gap: var(--split-gap-xl);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
.gap2xl {
|
|
75
|
+
gap: var(--split-gap-2xl);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// Cross-axis alignment of the two panes.
|
|
79
|
+
.alignStart {
|
|
80
|
+
align-items: start;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
.alignStretch {
|
|
84
|
+
align-items: stretch;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
.alignCenter {
|
|
88
|
+
align-items: center;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// --- collapseBelow -----------------------------------------------------
|
|
92
|
+
// Only splits with `collapseBelow` become size containers, so existing splits
|
|
93
|
+
// get zero containment changes (container-type: inline-size zeroes the
|
|
94
|
+
// element's intrinsic-width contribution — see Split.tsx's anti-pattern note).
|
|
95
|
+
.collapsible {
|
|
96
|
+
container-type: inline-size;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// Below the container threshold both panes span every track, so the split
|
|
100
|
+
// renders as one stacked column — in DOM order (aside-then-main for
|
|
101
|
+
// side="start", main-then-aside for side="end"; no `order` flip, so visual
|
|
102
|
+
// order stays in sync with tab order). Same mechanism as Grid's collapseBelow:
|
|
103
|
+
// the query targets the CHILDREN, because an element can never query its own
|
|
104
|
+
// size container — a rule on `.collapsible` itself would resolve against the
|
|
105
|
+
// nearest ANCESTOR container instead and silently never match. Spanning the
|
|
106
|
+
// children also neutralizes .sideStart / .sideEnd (grid-template-columns is
|
|
107
|
+
// the only thing those set) for both side values at once.
|
|
108
|
+
// Double class (.collapsible.collapseXx) keeps specificity above any
|
|
109
|
+
// single-class consumer rule regardless of CSS bundle emission order.
|
|
110
|
+
|
|
111
|
+
// A <Sticky> that IS the aside (the documented record-detail composition) is
|
|
112
|
+
// neutralized to a plain block once stacked (#558): pinned + viewport-capped
|
|
113
|
+
// + overscroll-contained, it would become a near-viewport-tall inner scroll
|
|
114
|
+
// box on a phone that traps the swipe. Matched by Sticky's `data-sticky` hook
|
|
115
|
+
// (CSS Modules hashes its class names). Direct child only — Stickies nested
|
|
116
|
+
// deeper in the aside (e.g. a list's sticky header) keep working.
|
|
117
|
+
@mixin unstick-aside {
|
|
118
|
+
> .aside > [data-sticky] {
|
|
119
|
+
// stylelint-disable-next-line property-disallowed-list -- undoing Sticky's own position when Split stacks, not placing a component
|
|
120
|
+
position: static;
|
|
121
|
+
max-height: none;
|
|
122
|
+
overflow-y: visible;
|
|
123
|
+
overscroll-behavior: auto;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
@container (max-width: #{bp.$collapse-sm}) {
|
|
128
|
+
.collapsible.collapseSm > * {
|
|
129
|
+
// stylelint-disable-next-line property-disallowed-list -- collapse override is Split's own internal grid placement, same sanction as Grid's collapse rules
|
|
130
|
+
grid-column: 1 / -1;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
.collapsible.collapseSm {
|
|
134
|
+
@include unstick-aside;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
@container (max-width: #{bp.$collapse-md}) {
|
|
139
|
+
.collapsible.collapseMd > * {
|
|
140
|
+
// stylelint-disable-next-line property-disallowed-list -- collapse override is Split's own internal grid placement, same sanction as Grid's collapse rules
|
|
141
|
+
grid-column: 1 / -1;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
.collapsible.collapseMd {
|
|
145
|
+
@include unstick-aside;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
@container (max-width: #{bp.$collapse-lg}) {
|
|
150
|
+
.collapsible.collapseLg > * {
|
|
151
|
+
// stylelint-disable-next-line property-disallowed-list -- collapse override is Split's own internal grid placement, same sanction as Grid's collapse rules
|
|
152
|
+
grid-column: 1 / -1;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
.collapsible.collapseLg {
|
|
156
|
+
@include unstick-aside;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// Split.tokens.scss — Component-scoped tokens for <Split>. Gap mirrors the
|
|
2
|
+
// shared space scale (same values as Stack/Cluster/Grid).
|
|
3
|
+
:root {
|
|
4
|
+
--split-gap-xs: var(--space-1);
|
|
5
|
+
--split-gap-sm: var(--space-2);
|
|
6
|
+
--split-gap-md: var(--space-3);
|
|
7
|
+
--split-gap-lg: var(--space-4);
|
|
8
|
+
--split-gap-xl: var(--space-6);
|
|
9
|
+
--split-gap-2xl: var(--space-8);
|
|
10
|
+
}
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
import {
|
|
2
|
+
forwardRef,
|
|
3
|
+
useLayoutEffect,
|
|
4
|
+
useRef,
|
|
5
|
+
useState,
|
|
6
|
+
type CSSProperties,
|
|
7
|
+
type HTMLAttributes,
|
|
8
|
+
type ReactNode,
|
|
9
|
+
} from 'react';
|
|
10
|
+
import clsx from 'clsx';
|
|
11
|
+
import styles from './Split.module.scss';
|
|
12
|
+
import { COLLAPSE_BREAKPOINT_PX, type CollapseBreakpoint } from '../_internal/collapse';
|
|
13
|
+
import { mergeRefs } from '../_internal/refs';
|
|
14
|
+
|
|
15
|
+
/** Which side the `aside` pane sits on. RTL-aware (DOM + column order flip together). */
|
|
16
|
+
export type SplitSide = 'start' | 'end';
|
|
17
|
+
|
|
18
|
+
/** Gap between the two panes. Same scale as Stack/Cluster/Grid. */
|
|
19
|
+
export type SplitGap = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl';
|
|
20
|
+
|
|
21
|
+
/** Cross-axis (vertical) alignment of the two panes. */
|
|
22
|
+
export type SplitAlign = 'start' | 'stretch' | 'center';
|
|
23
|
+
|
|
24
|
+
export interface SplitProps extends HTMLAttributes<HTMLDivElement> {
|
|
25
|
+
/**
|
|
26
|
+
* The narrow, intrinsic-width pane — a vertical `Tabs` rail, filter list, or nav column.
|
|
27
|
+
* `null` / `false` / `undefined` renders no aside cell at all (no empty track or gap),
|
|
28
|
+
* so content can be conditionally moved out of the aside; `main` then fills the split.
|
|
29
|
+
*/
|
|
30
|
+
aside?: ReactNode;
|
|
31
|
+
/**
|
|
32
|
+
* Which side `aside` sits on.
|
|
33
|
+
* - `'start'` (default) — leading edge (left in LTR).
|
|
34
|
+
* - `'end'` — trailing edge (right in LTR).
|
|
35
|
+
*/
|
|
36
|
+
side?: SplitSide;
|
|
37
|
+
/**
|
|
38
|
+
* `aside` column width.
|
|
39
|
+
* - `'auto'` (default) — intrinsic; sizes to the pane's content.
|
|
40
|
+
* - a CSS length (e.g. `'240px'`) — pins the column so `main` doesn't reflow
|
|
41
|
+
* when `aside` content changes width.
|
|
42
|
+
*/
|
|
43
|
+
asideWidth?: string;
|
|
44
|
+
/**
|
|
45
|
+
* Gap between the two panes, in pixels:
|
|
46
|
+
* `xs` (4) / `sm` (8) / `md` (12, default) / `lg` (16) / `xl` (24) / `2xl` (32).
|
|
47
|
+
* Same scale as Stack, Cluster, and Grid.
|
|
48
|
+
*/
|
|
49
|
+
gap?: SplitGap;
|
|
50
|
+
/**
|
|
51
|
+
* Cross-axis (vertical) alignment of the panes.
|
|
52
|
+
* - `'start'` (default) — panes hug the top.
|
|
53
|
+
* - `'stretch'` — `aside` matches `main`'s height (full-height bordered rail).
|
|
54
|
+
* - `'center'` — panes vertically centered.
|
|
55
|
+
*/
|
|
56
|
+
align?: SplitAlign;
|
|
57
|
+
/**
|
|
58
|
+
* Stack the two panes vertically when the SPLIT'S OWN width (container
|
|
59
|
+
* query, not viewport) drops below the preset: `sm` 480px / `md` 640px /
|
|
60
|
+
* `lg` 768px. Same scale as `Grid`'s `collapseBelow`. Without it a pinned
|
|
61
|
+
* `asideWidth` rail squeezes `main` to nothing on narrow screens.
|
|
62
|
+
*
|
|
63
|
+
* A pinned `asideWidth` is preserved while the panes are side-by-side and
|
|
64
|
+
* space is available, but can shrink as the container narrows so the stacked
|
|
65
|
+
* panes stay within the split.
|
|
66
|
+
*
|
|
67
|
+
* Collapsed panes stack in **DOM order**, not always aside-first: with
|
|
68
|
+
* the default `side="start"` that's aside → main; with `side="end"` it's
|
|
69
|
+
* main → aside, because that's the order the panes are in the DOM. Forcing
|
|
70
|
+
* aside-first when collapsed would need CSS `order`, which desynchronizes
|
|
71
|
+
* visual order from tab order — an a11y defect. If you need the aside on top
|
|
72
|
+
* when stacked, use `side="start"`.
|
|
73
|
+
*
|
|
74
|
+
* A `<Sticky>` passed as the `aside` stops pinning (and drops its `scroll`
|
|
75
|
+
* height cap) while stacked, so it can't trap the page scroll on a phone.
|
|
76
|
+
*
|
|
77
|
+
* ❌ Anti-pattern: a `collapseBelow` split must get its width from its
|
|
78
|
+
* parent. `container-type: inline-size` zeroes the split's contribution to
|
|
79
|
+
* intrinsic sizing, so in an intrinsic-width context (another `Split`'s
|
|
80
|
+
* default `auto` aside track, a `Cluster` item, `width: max-content`) it
|
|
81
|
+
* renders at width 0 — give the parent a concrete width instead. The split
|
|
82
|
+
* also becomes the containing block for absolutely-positioned descendants
|
|
83
|
+
* (layout containment). Splits without the prop pay none of this.
|
|
84
|
+
*/
|
|
85
|
+
collapseBelow?: CollapseBreakpoint;
|
|
86
|
+
/**
|
|
87
|
+
* Called with `true` when a `collapseBelow` split stacks and `false` when it
|
|
88
|
+
* goes back side by side — on mount with the initial state (twice under
|
|
89
|
+
* React StrictMode in development), then on
|
|
90
|
+
* every change. Ignored without `collapseBelow`.
|
|
91
|
+
*
|
|
92
|
+
* Use it to move content you own between placements so DOM order matches
|
|
93
|
+
* visual order in both states, instead of CSS `order` — e.g. render a
|
|
94
|
+
* comment thread at the end of `main` while side by side and after the
|
|
95
|
+
* `<Split>` once stacked, or a status switcher at the top of the aside vs.
|
|
96
|
+
* above the split.
|
|
97
|
+
*
|
|
98
|
+
* It measures the SPLIT'S OWN content width against the same inclusive
|
|
99
|
+
* threshold its container query uses (a `ResizeObserver`, read
|
|
100
|
+
* synchronously on mount so the first paint is already right), so it agrees
|
|
101
|
+
* with the CSS where `useBelowBreakpoint` — which measures the viewport —
|
|
102
|
+
* would not beside an app sidebar. The same state is on the root as
|
|
103
|
+
* `data-collapsed="true" | "false"`.
|
|
104
|
+
*/
|
|
105
|
+
onCollapsedChange?: (collapsed: boolean) => void;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Content-box inline size — what `container-type: inline-size` queries. Read
|
|
110
|
+
* from the computed (layout) width, not `getBoundingClientRect()`, which a
|
|
111
|
+
* CSS transform scales: a Split inside a Modal mid-`scale(0.96)` entrance
|
|
112
|
+
* measured ~4% narrow, and a ResizeObserver never re-fires for transforms.
|
|
113
|
+
*/
|
|
114
|
+
function contentWidth(el: HTMLElement): number {
|
|
115
|
+
const cs = getComputedStyle(el);
|
|
116
|
+
const px = (v: string) => parseFloat(v) || 0;
|
|
117
|
+
const width = px(cs.width);
|
|
118
|
+
if (cs.boxSizing !== 'border-box') return width;
|
|
119
|
+
return (
|
|
120
|
+
width -
|
|
121
|
+
px(cs.paddingLeft) -
|
|
122
|
+
px(cs.paddingRight) -
|
|
123
|
+
px(cs.borderLeftWidth) -
|
|
124
|
+
px(cs.borderRightWidth)
|
|
125
|
+
);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
const gapClass: Record<SplitGap, string> = {
|
|
129
|
+
xs: styles.gapXs,
|
|
130
|
+
sm: styles.gapSm,
|
|
131
|
+
md: styles.gapMd,
|
|
132
|
+
lg: styles.gapLg,
|
|
133
|
+
xl: styles.gapXl,
|
|
134
|
+
'2xl': styles.gap2xl,
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
const collapseClass: Record<CollapseBreakpoint, string> = {
|
|
138
|
+
sm: styles.collapseSm,
|
|
139
|
+
md: styles.collapseMd,
|
|
140
|
+
lg: styles.collapseLg,
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
const alignClass: Record<SplitAlign, string> = {
|
|
144
|
+
start: styles.alignStart,
|
|
145
|
+
stretch: styles.alignStretch,
|
|
146
|
+
center: styles.alignCenter,
|
|
147
|
+
};
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Master-detail layout: an intrinsic-width `aside` pane beside a filling main pane, via CSS grid.
|
|
151
|
+
* @see docs/components/Split.md
|
|
152
|
+
*/
|
|
153
|
+
export const Split = forwardRef<HTMLDivElement, SplitProps>(function Split(
|
|
154
|
+
{
|
|
155
|
+
aside,
|
|
156
|
+
children,
|
|
157
|
+
side = 'start',
|
|
158
|
+
asideWidth = 'auto',
|
|
159
|
+
gap = 'md',
|
|
160
|
+
align = 'start',
|
|
161
|
+
collapseBelow,
|
|
162
|
+
onCollapsedChange,
|
|
163
|
+
className,
|
|
164
|
+
style,
|
|
165
|
+
...props
|
|
166
|
+
},
|
|
167
|
+
ref,
|
|
168
|
+
) {
|
|
169
|
+
const rootRef = useRef<HTMLDivElement>(null);
|
|
170
|
+
const [collapsed, setCollapsed] = useState<boolean>();
|
|
171
|
+
const onChangeRef = useRef(onCollapsedChange);
|
|
172
|
+
onChangeRef.current = onCollapsedChange;
|
|
173
|
+
|
|
174
|
+
useLayoutEffect(() => {
|
|
175
|
+
const el = rootRef.current;
|
|
176
|
+
if (!collapseBelow || !el) {
|
|
177
|
+
setCollapsed(undefined);
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
let last: boolean | undefined;
|
|
181
|
+
const measure = () => {
|
|
182
|
+
// Inclusive, like `@container (max-width: …)`.
|
|
183
|
+
const next = contentWidth(el) <= COLLAPSE_BREAKPOINT_PX[collapseBelow];
|
|
184
|
+
if (next === last) return;
|
|
185
|
+
last = next;
|
|
186
|
+
setCollapsed(next);
|
|
187
|
+
onChangeRef.current?.(next);
|
|
188
|
+
};
|
|
189
|
+
measure();
|
|
190
|
+
if (typeof ResizeObserver === 'undefined') return;
|
|
191
|
+
const observer = new ResizeObserver(measure);
|
|
192
|
+
observer.observe(el);
|
|
193
|
+
return () => observer.disconnect();
|
|
194
|
+
}, [collapseBelow]);
|
|
195
|
+
|
|
196
|
+
const hasAside = aside !== null && aside !== undefined && aside !== false;
|
|
197
|
+
const asideCell = hasAside ? <div className={styles.aside}>{aside}</div> : null;
|
|
198
|
+
const mainCell = <div className={styles.main}>{children}</div>;
|
|
199
|
+
return (
|
|
200
|
+
<div
|
|
201
|
+
ref={mergeRefs(ref, rootRef)}
|
|
202
|
+
data-collapsed={collapsed === undefined ? undefined : String(collapsed)}
|
|
203
|
+
className={clsx(
|
|
204
|
+
styles.split,
|
|
205
|
+
side === 'end' ? styles.sideEnd : styles.sideStart,
|
|
206
|
+
gapClass[gap],
|
|
207
|
+
alignClass[align],
|
|
208
|
+
!hasAside && styles.noAside,
|
|
209
|
+
collapseBelow && styles.collapsible,
|
|
210
|
+
collapseBelow && collapseClass[collapseBelow],
|
|
211
|
+
className,
|
|
212
|
+
)}
|
|
213
|
+
// asideWidth → custom property the SCSS grid template reads. Consumer
|
|
214
|
+
// `style` spread AFTER so they can still override anything.
|
|
215
|
+
style={{ '--split-aside-width': asideWidth, ...style } as CSSProperties}
|
|
216
|
+
{...props}
|
|
217
|
+
>
|
|
218
|
+
{side === 'end' ? (
|
|
219
|
+
<>
|
|
220
|
+
{mainCell}
|
|
221
|
+
{asideCell}
|
|
222
|
+
</>
|
|
223
|
+
) : (
|
|
224
|
+
<>
|
|
225
|
+
{asideCell}
|
|
226
|
+
{mainCell}
|
|
227
|
+
</>
|
|
228
|
+
)}
|
|
229
|
+
</div>
|
|
230
|
+
);
|
|
231
|
+
});
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
@use './Stack.tokens';
|
|
2
|
+
|
|
3
|
+
.stack {
|
|
4
|
+
display: flex;
|
|
5
|
+
flex-direction: column;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
// Opt-in, via the `minWidth0` prop. As a flex or grid ITEM a Stack keeps the
|
|
9
|
+
// default `min-width: auto`, which floors it at its content's min-content size —
|
|
10
|
+
// so a `<Text truncate>` inside never gets the chance to ellipsize and a clipping
|
|
11
|
+
// ancestor hard-cuts it instead (issue #475).
|
|
12
|
+
// This only means anything while `.stack`'s overflow is non-scrollable: per CSS
|
|
13
|
+
// Flexbox §4.5 a flex item keeps its automatic minimum size until its computed
|
|
14
|
+
// overflow becomes scrollable. Giving `.stack` `overflow: hidden`/`auto`/`scroll`
|
|
15
|
+
// would therefore remove the floor by itself and make this prop dead code — but
|
|
16
|
+
// `overflow: clip` would NOT, because clip is non-scrollable and still floors.
|
|
17
|
+
// Measured; do not assume any overflow value will do.
|
|
18
|
+
// Deliberately NOT on the base `.stack` class: that would let every Stack in the
|
|
19
|
+
// codebase shrink below its content, changing layout for existing consumers. It
|
|
20
|
+
// was tried and reverted. The measurement that settled it was taken on Cluster
|
|
21
|
+
// (see Cluster.module.scss) rather than here, but the mechanism is the same one
|
|
22
|
+
// both share: a container permitted to shrink volunteers for shrink, and any
|
|
23
|
+
// non-truncatable content inside it then overflows and is clipped by the
|
|
24
|
+
// nearest `overflow: hidden` ancestor.
|
|
25
|
+
.minWidth0 {
|
|
26
|
+
min-width: 0;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
.gapXs {
|
|
30
|
+
gap: var(--stack-gap-xs);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
.gapSm {
|
|
34
|
+
gap: var(--stack-gap-sm);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
.gapMd {
|
|
38
|
+
gap: var(--stack-gap-md);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
.gapLg {
|
|
42
|
+
gap: var(--stack-gap-lg);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
.gapXl {
|
|
46
|
+
gap: var(--stack-gap-xl);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
.gap2xl {
|
|
50
|
+
gap: var(--stack-gap-2xl);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
.alignStart {
|
|
54
|
+
align-items: flex-start;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
.alignCenter {
|
|
58
|
+
align-items: center;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
.alignEnd {
|
|
62
|
+
align-items: flex-end;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
.alignStretch {
|
|
66
|
+
align-items: stretch;
|
|
67
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// Stack.tokens.scss — Component-scoped tokens for <Stack>. Each token
|
|
2
|
+
// defaults to the primitive the SCSS used before this migration.
|
|
3
|
+
:root {
|
|
4
|
+
// Gap per size
|
|
5
|
+
--stack-gap-xs: var(--space-1);
|
|
6
|
+
--stack-gap-sm: var(--space-2);
|
|
7
|
+
--stack-gap-md: var(--space-3);
|
|
8
|
+
--stack-gap-lg: var(--space-4);
|
|
9
|
+
--stack-gap-xl: var(--space-6);
|
|
10
|
+
--stack-gap-2xl: var(--space-8);
|
|
11
|
+
}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { forwardRef, type HTMLAttributes } from 'react';
|
|
2
|
+
import clsx from 'clsx';
|
|
3
|
+
import styles from './Stack.module.scss';
|
|
4
|
+
|
|
5
|
+
/** Vertical gap between children. Values in pixels: 4 / 8 / 12 / 16 / 24 / 32. */
|
|
6
|
+
export type StackGap = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl';
|
|
7
|
+
|
|
8
|
+
/** Cross-axis (horizontal) alignment of children inside the stack. */
|
|
9
|
+
export type StackAlign = 'start' | 'center' | 'end' | 'stretch';
|
|
10
|
+
|
|
11
|
+
export interface StackProps extends HTMLAttributes<HTMLDivElement> {
|
|
12
|
+
/**
|
|
13
|
+
* Gap between children, in pixels:
|
|
14
|
+
* `xs` (4) / `sm` (8) / `md` (12, default) / `lg` (16) / `xl` (24) / `2xl` (32).
|
|
15
|
+
*/
|
|
16
|
+
gap?: StackGap;
|
|
17
|
+
/**
|
|
18
|
+
* Cross-axis alignment.
|
|
19
|
+
* - `stretch` (default) — children fill the stack's horizontal width.
|
|
20
|
+
* - `start` / `center` / `end` — left, center, right alignment.
|
|
21
|
+
*/
|
|
22
|
+
align?: StackAlign;
|
|
23
|
+
/**
|
|
24
|
+
* Lets the container shrink below its content's intrinsic width
|
|
25
|
+
* (`min-width: 0`), so a `<Text truncate>` inside can ellipsize instead of
|
|
26
|
+
* being hard-cut by a clipping ancestor.
|
|
27
|
+
*
|
|
28
|
+
* Only bites when the Stack is itself an item of a **row** flex container (or
|
|
29
|
+
* a grid item) that clips — what decides is the PARENT's main axis, not the
|
|
30
|
+
* Stack's own direction. That is the two-line label beside a fixed badge, or
|
|
31
|
+
* a detail column in a squeezed toolbar. Without it the flex default
|
|
32
|
+
* (`min-width: auto`) floors the Stack at its widest line and the ellipsis
|
|
33
|
+
* never appears. That floor applies because a Stack sets no `overflow` — per CSS
|
|
34
|
+
* Flexbox §4.5 a flex item keeps its automatic minimum size while its computed
|
|
35
|
+
* `overflow` is non-scrollable (`visible` or `clip`); the scrollable values
|
|
36
|
+
* (`hidden`/`auto`/`scroll`) drop it to `0`.
|
|
37
|
+
*
|
|
38
|
+
* It is a **no-op** when the Stack sits in another `Stack` (the automatic
|
|
39
|
+
* minimum size applies only on the flex MAIN axis, so there is no horizontal
|
|
40
|
+
* floor), or in a plain block or table cell (that minimum applies to flex and
|
|
41
|
+
* grid ITEMS only, so `min-width: auto` is just `0` there). A table cell is
|
|
42
|
+
* a no-op for a different reason than it looks: auto table layout floors the
|
|
43
|
+
* cell at its content's min-content width regardless, so what makes text
|
|
44
|
+
* truncate there is `table-layout: fixed` or a `max-width` on the cell — not
|
|
45
|
+
* this prop.
|
|
46
|
+
*
|
|
47
|
+
* Opt-in rather than the default on purpose: a container that CAN shrink
|
|
48
|
+
* also VOLUNTEERS for shrink, so turning it on where the content is NOT
|
|
49
|
+
* truncatable (buttons, badges, icons) lets that content be clipped
|
|
50
|
+
* instead. Set it on the container whose text should give way, not on one
|
|
51
|
+
* holding controls.
|
|
52
|
+
*
|
|
53
|
+
* Related: `<Constrain flex="grow">` applies the same `min-width: 0` but
|
|
54
|
+
* also forces `flex: 1 1 0`, and renders a `<div>` — reach for this prop
|
|
55
|
+
* when you want only the shrink permission, or when you are inside a
|
|
56
|
+
* `<button>`/`<a>`/`<label>` where a `<div>` is invalid HTML.
|
|
57
|
+
*
|
|
58
|
+
* @default false
|
|
59
|
+
*/
|
|
60
|
+
minWidth0?: boolean;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const gapClass: Record<StackGap, string> = {
|
|
64
|
+
xs: styles.gapXs,
|
|
65
|
+
sm: styles.gapSm,
|
|
66
|
+
md: styles.gapMd,
|
|
67
|
+
lg: styles.gapLg,
|
|
68
|
+
xl: styles.gapXl,
|
|
69
|
+
'2xl': styles.gap2xl,
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
const alignClass: Record<StackAlign, string> = {
|
|
73
|
+
start: styles.alignStart,
|
|
74
|
+
center: styles.alignCenter,
|
|
75
|
+
end: styles.alignEnd,
|
|
76
|
+
stretch: styles.alignStretch,
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Vertical layout primitive that stacks children with consistent spacing.
|
|
81
|
+
* @see docs/components/Stack.md
|
|
82
|
+
*/
|
|
83
|
+
export const Stack = forwardRef<HTMLDivElement, StackProps>(function Stack(
|
|
84
|
+
{ gap = 'md', align = 'stretch', minWidth0 = false, className, ...props },
|
|
85
|
+
ref,
|
|
86
|
+
) {
|
|
87
|
+
return (
|
|
88
|
+
<div
|
|
89
|
+
ref={ref}
|
|
90
|
+
className={clsx(
|
|
91
|
+
styles.stack,
|
|
92
|
+
gapClass[gap],
|
|
93
|
+
alignClass[align],
|
|
94
|
+
minWidth0 && styles.minWidth0,
|
|
95
|
+
className,
|
|
96
|
+
)}
|
|
97
|
+
{...props}
|
|
98
|
+
/>
|
|
99
|
+
);
|
|
100
|
+
});
|