@eocrm/design-system 0.0.0-stage → 0.6.17
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/README.md +262 -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 +82 -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,88 @@
|
|
|
1
|
+
// DropdownMenu.tokens.scss — Component-scoped tokens for <DropdownMenu>. Each token defaults to the primitive the SCSS used before this migration. Covers the floating panel surface, per-item hover/checked/danger states, separator, group label, indicator, and submenu trigger.
|
|
2
|
+
@use '../Badge/Badge.tokens';
|
|
3
|
+
|
|
4
|
+
:root {
|
|
5
|
+
// Panel surface
|
|
6
|
+
--dropdown-menu-bg: var(--color-bg);
|
|
7
|
+
--dropdown-menu-border-color: var(--color-border);
|
|
8
|
+
--dropdown-menu-radius: var(--radius-md);
|
|
9
|
+
--dropdown-menu-shadow: var(--shadow-md);
|
|
10
|
+
--dropdown-menu-padding: var(--space-1);
|
|
11
|
+
--dropdown-menu-gap: var(--space-0);
|
|
12
|
+
--dropdown-menu-min-width: var(--size-dropdown-min-width);
|
|
13
|
+
--dropdown-menu-z: var(--z-dropdown);
|
|
14
|
+
|
|
15
|
+
// Entrance transition. Note: the `opacity: var(--opacity-hidden)` reference
|
|
16
|
+
// inside @starting-style is kept as the primitive directly — a unit test
|
|
17
|
+
// pins that exact substring (DropdownMenu.test.tsx → "animation hook"
|
|
18
|
+
// contract). Re-routing it through a component token would break the test.
|
|
19
|
+
--dropdown-menu-transition: var(--transition-base);
|
|
20
|
+
|
|
21
|
+
// Item
|
|
22
|
+
--dropdown-menu-item-gap: var(--space-2);
|
|
23
|
+
--dropdown-menu-item-padding-y: var(--space-1);
|
|
24
|
+
--dropdown-menu-item-padding-x: var(--space-2);
|
|
25
|
+
--dropdown-menu-item-radius: var(--radius-sm);
|
|
26
|
+
--dropdown-menu-item-font-size: var(--font-size-md);
|
|
27
|
+
--dropdown-menu-item-line-height: var(--line-height-normal);
|
|
28
|
+
--dropdown-menu-item-fg: var(--color-fg);
|
|
29
|
+
--dropdown-menu-item-bg-hover: var(--color-bg-muted);
|
|
30
|
+
--dropdown-menu-item-fg-disabled: var(--color-fg-disabled);
|
|
31
|
+
|
|
32
|
+
// Item — danger tone
|
|
33
|
+
--dropdown-menu-item-fg-danger: var(--color-danger);
|
|
34
|
+
--dropdown-menu-item-bg-danger-hover: var(--color-bg-danger-subtle);
|
|
35
|
+
|
|
36
|
+
// Item — checked state (accent-tinted with left accent)
|
|
37
|
+
--dropdown-menu-item-bg-checked: var(--color-accent-subtle-bg);
|
|
38
|
+
--dropdown-menu-item-fg-checked: var(--color-fg);
|
|
39
|
+
--dropdown-menu-item-accent-checked: var(--color-accent);
|
|
40
|
+
--dropdown-menu-item-accent-width-checked: var(--border-width-emphasis);
|
|
41
|
+
|
|
42
|
+
// Icon slot
|
|
43
|
+
--dropdown-menu-icon-size: var(--space-4);
|
|
44
|
+
--dropdown-menu-icon-fg: var(--color-fg-subtle);
|
|
45
|
+
|
|
46
|
+
// Shortcut label. It is real text in the a11y tree, so 1.4.3 applies, and
|
|
47
|
+
// it's painted inside .item with no hover override, so it inherits
|
|
48
|
+
// --dropdown-menu-item-bg-hover (--color-bg-muted) on hover. #511: was
|
|
49
|
+
// --color-fg-subtle, which fails there; --color-fg-muted clears it, same as
|
|
50
|
+
// --dropdown-menu-meta-fg below.
|
|
51
|
+
// @contrast --color-fg-muted on --color-bg-muted = 5.10:1 light
|
|
52
|
+
// @contrast --color-fg-muted on --color-bg-muted = 5.60:1 dark
|
|
53
|
+
--dropdown-menu-shortcut-fg: var(--color-fg-muted);
|
|
54
|
+
--dropdown-menu-shortcut-font-size: var(--font-size-sm);
|
|
55
|
+
--dropdown-menu-shortcut-padding-left: var(--space-3);
|
|
56
|
+
|
|
57
|
+
// Meta label (trailing secondary text about the item itself — a region
|
|
58
|
+
// code, a count, a Badge). Deliberately NOT the shortcut treatment: the
|
|
59
|
+
// shortcut slot is free to evolve into key caps without repainting meta.
|
|
60
|
+
--dropdown-menu-meta-fg: var(--color-fg-muted);
|
|
61
|
+
--dropdown-menu-meta-font-size: var(--font-size-xs);
|
|
62
|
+
--dropdown-menu-meta-padding-left: var(--space-2);
|
|
63
|
+
|
|
64
|
+
// Separator
|
|
65
|
+
--dropdown-menu-separator-height: var(--space-2);
|
|
66
|
+
--dropdown-menu-separator-color: var(--color-border);
|
|
67
|
+
|
|
68
|
+
// Group
|
|
69
|
+
--dropdown-menu-group-padding-block: var(--space-1);
|
|
70
|
+
|
|
71
|
+
// Group label
|
|
72
|
+
--dropdown-menu-label-padding-y: var(--space-1);
|
|
73
|
+
--dropdown-menu-label-padding-x: var(--space-2);
|
|
74
|
+
--dropdown-menu-label-font-size: var(--font-size-xs);
|
|
75
|
+
--dropdown-menu-label-font-weight: var(--font-weight-semibold);
|
|
76
|
+
--dropdown-menu-label-letter-spacing: var(--letter-spacing-caps);
|
|
77
|
+
--dropdown-menu-label-fg: var(--color-fg-subtle);
|
|
78
|
+
|
|
79
|
+
// Indicator slot
|
|
80
|
+
--dropdown-menu-indicator-size: var(--size-dropdown-indicator);
|
|
81
|
+
|
|
82
|
+
// Submenu trigger
|
|
83
|
+
--dropdown-menu-sub-chevron-font-size: var(--font-size-md);
|
|
84
|
+
--dropdown-menu-sub-chevron-line-height: var(--line-height-none);
|
|
85
|
+
--dropdown-menu-sub-chevron-fg: var(--color-fg-subtle);
|
|
86
|
+
--dropdown-menu-sub-chevron-padding-left: var(--space-2);
|
|
87
|
+
--dropdown-menu-sub-trigger-bg-open: var(--color-bg-muted);
|
|
88
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { DropdownMenuRoot } from './Root';
|
|
2
|
+
import { Trigger } from './Trigger';
|
|
3
|
+
import { Content } from './Content';
|
|
4
|
+
import { Item, Separator } from './Item';
|
|
5
|
+
import { Group, Label } from './Group';
|
|
6
|
+
import { ItemIndicator } from './ItemIndicator';
|
|
7
|
+
import { CheckboxItem } from './CheckboxItem';
|
|
8
|
+
import { RadioGroup, RadioItem } from './Radio';
|
|
9
|
+
import { Sub, SubTrigger, SubContent } from './Sub';
|
|
10
|
+
|
|
11
|
+
export type { DropdownMenuProps } from './Root';
|
|
12
|
+
export type { DropdownMenuTriggerProps } from './Trigger';
|
|
13
|
+
export type { DropdownMenuContentProps, DropdownMenuSide, DropdownMenuAlign } from './Content';
|
|
14
|
+
export type {
|
|
15
|
+
DropdownMenuItemProps,
|
|
16
|
+
DropdownMenuItemTone,
|
|
17
|
+
DropdownMenuSeparatorProps,
|
|
18
|
+
} from './Item';
|
|
19
|
+
export type { DropdownMenuGroupProps, DropdownMenuLabelProps } from './Group';
|
|
20
|
+
export type { DropdownMenuItemIndicatorProps } from './ItemIndicator';
|
|
21
|
+
export type { DropdownMenuCheckboxItemProps } from './CheckboxItem';
|
|
22
|
+
export type { DropdownMenuRadioGroupProps, DropdownMenuRadioItemProps } from './Radio';
|
|
23
|
+
export type {
|
|
24
|
+
DropdownMenuSubProps,
|
|
25
|
+
DropdownMenuSubTriggerProps,
|
|
26
|
+
DropdownMenuSubContentProps,
|
|
27
|
+
} from './Sub';
|
|
28
|
+
|
|
29
|
+
export const DropdownMenu = Object.assign(DropdownMenuRoot, {
|
|
30
|
+
Trigger,
|
|
31
|
+
Content,
|
|
32
|
+
Item,
|
|
33
|
+
Separator,
|
|
34
|
+
Group,
|
|
35
|
+
Label,
|
|
36
|
+
ItemIndicator,
|
|
37
|
+
CheckboxItem,
|
|
38
|
+
RadioGroup,
|
|
39
|
+
RadioItem,
|
|
40
|
+
Sub,
|
|
41
|
+
SubTrigger,
|
|
42
|
+
SubContent,
|
|
43
|
+
});
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { forwardRef, useContext, useId, type HTMLAttributes, type ReactNode } from 'react';
|
|
2
|
+
import clsx from 'clsx';
|
|
3
|
+
import styles from './DropdownMenu.module.scss';
|
|
4
|
+
import { GroupContext } from './context';
|
|
5
|
+
import { sanitizeId } from '../_internal/refs';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Props for `<DropdownMenu.Group>`.
|
|
9
|
+
*
|
|
10
|
+
* Extends all standard `div` HTML attributes so consumers can attach
|
|
11
|
+
* `data-*`, `className`, event handlers, etc.
|
|
12
|
+
*/
|
|
13
|
+
export interface DropdownMenuGroupProps extends HTMLAttributes<HTMLDivElement> {
|
|
14
|
+
/** Menu items (and optionally a `<DropdownMenu.Label>`) to include in the group. */
|
|
15
|
+
children: ReactNode;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Accessible grouping wrapper for related menu items, labelled by a `DropdownMenu.Label` inside it.
|
|
20
|
+
* @see docs/components/DropdownMenu.md
|
|
21
|
+
*/
|
|
22
|
+
export const Group = forwardRef<HTMLDivElement, DropdownMenuGroupProps>(function Group(
|
|
23
|
+
{ children, className, ...rest },
|
|
24
|
+
ref,
|
|
25
|
+
) {
|
|
26
|
+
const reactId = useId();
|
|
27
|
+
const labelId = `dropdown-menu-label-${sanitizeId(reactId)}`;
|
|
28
|
+
return (
|
|
29
|
+
<GroupContext.Provider value={{ labelId }}>
|
|
30
|
+
{/* {...rest} first so role and aria-labelledby always win */}
|
|
31
|
+
<div
|
|
32
|
+
{...rest}
|
|
33
|
+
ref={ref}
|
|
34
|
+
role="group"
|
|
35
|
+
aria-labelledby={labelId}
|
|
36
|
+
className={clsx(styles.group, className)}
|
|
37
|
+
>
|
|
38
|
+
{children}
|
|
39
|
+
</div>
|
|
40
|
+
</GroupContext.Provider>
|
|
41
|
+
);
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Props for `<DropdownMenu.Label>`.
|
|
46
|
+
*
|
|
47
|
+
* Extends all standard `div` HTML attributes. When rendered inside a
|
|
48
|
+
* `<DropdownMenu.Group>`, the component controls the `id` attribute to
|
|
49
|
+
* satisfy the `aria-labelledby` contract — a consumer-supplied `id` is
|
|
50
|
+
* used only when outside a Group.
|
|
51
|
+
*/
|
|
52
|
+
export interface DropdownMenuLabelProps extends HTMLAttributes<HTMLDivElement> {
|
|
53
|
+
/** The label text content. */
|
|
54
|
+
children: ReactNode;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Non-interactive section heading inside a `DropdownMenu.Content`.
|
|
59
|
+
* @see docs/components/DropdownMenu.md
|
|
60
|
+
*/
|
|
61
|
+
|
|
62
|
+
export const Label = forwardRef<HTMLDivElement, DropdownMenuLabelProps>(function Label(
|
|
63
|
+
{ children, className, id: idProp, ...rest },
|
|
64
|
+
ref,
|
|
65
|
+
) {
|
|
66
|
+
const groupCtx = useContext(GroupContext);
|
|
67
|
+
// If inside a Group, use the group's label id so aria-labelledby resolves.
|
|
68
|
+
// Otherwise leave id as the consumer's (or undefined).
|
|
69
|
+
const id = idProp ?? groupCtx?.labelId;
|
|
70
|
+
return (
|
|
71
|
+
// {...rest} first so the resolved id (consumer prop ?? GroupContext) always wins.
|
|
72
|
+
<div {...rest} ref={ref} id={id} className={clsx(styles.label, className)}>
|
|
73
|
+
{children}
|
|
74
|
+
</div>
|
|
75
|
+
);
|
|
76
|
+
});
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import {
|
|
2
|
+
forwardRef,
|
|
3
|
+
useId,
|
|
4
|
+
useLayoutEffect,
|
|
5
|
+
useRef,
|
|
6
|
+
type HTMLAttributes,
|
|
7
|
+
type MouseEvent,
|
|
8
|
+
type ReactNode,
|
|
9
|
+
} from 'react';
|
|
10
|
+
import clsx from 'clsx';
|
|
11
|
+
import { useDropdownMenuContext } from './context';
|
|
12
|
+
import { mergeRefs } from '../_internal/refs';
|
|
13
|
+
import styles from './DropdownMenu.module.scss';
|
|
14
|
+
|
|
15
|
+
/** Item color treatment. */
|
|
16
|
+
export type DropdownMenuItemTone = 'default' | 'danger';
|
|
17
|
+
|
|
18
|
+
export interface DropdownMenuItemProps extends Omit<HTMLAttributes<HTMLDivElement>, 'onSelect'> {
|
|
19
|
+
/** Called when the item is activated (click or Enter/Space). The consumer performs the action. */
|
|
20
|
+
onSelect: () => void;
|
|
21
|
+
/**
|
|
22
|
+
* Visual tone.
|
|
23
|
+
* - `'default'` — normal action.
|
|
24
|
+
* - `'danger'` — destructive (Delete, Revoke, Remove). Reserve for irreversible operations.
|
|
25
|
+
*/
|
|
26
|
+
tone?: DropdownMenuItemTone;
|
|
27
|
+
/** Leading icon. Rendered in a fixed-size slot so labels stay aligned across items. */
|
|
28
|
+
icon?: ReactNode;
|
|
29
|
+
/** Trailing shortcut hint (e.g. `'⌘D'`). Visual cue only — does NOT register a global key handler. */
|
|
30
|
+
shortcut?: string;
|
|
31
|
+
/**
|
|
32
|
+
* Trailing secondary content *about the item itself* — a region code, a
|
|
33
|
+
* count, a `<Badge>`. Distinct from `shortcut`, which is a keyboard hint
|
|
34
|
+
* and is styled (and free to evolve) as one.
|
|
35
|
+
*
|
|
36
|
+
* `ReactNode`, so a Badge or Dot can go here. It is NOT `aria-hidden`, so
|
|
37
|
+
* it joins the item's accessible name ("demo RU" rather than a second
|
|
38
|
+
* identical "demo") — which is the point when the label alone is
|
|
39
|
+
* ambiguous. It is a prop, not a child, so it stays out of the typeahead
|
|
40
|
+
* label; type-to-select still matches the pure label text.
|
|
41
|
+
*
|
|
42
|
+
* Renders before `shortcut` when both are present, keeping the keyboard
|
|
43
|
+
* hint rightmost.
|
|
44
|
+
*/
|
|
45
|
+
meta?: ReactNode;
|
|
46
|
+
/** Disabled items are skipped by keyboard nav, dimmed, and don't fire `onSelect` on click. */
|
|
47
|
+
disabled?: boolean;
|
|
48
|
+
/**
|
|
49
|
+
* Whether to close the menu after `onSelect` fires. Defaults to `true`.
|
|
50
|
+
*
|
|
51
|
+
* Set to `false` when this item is wrapped in a Popover/ConfirmationPopover
|
|
52
|
+
* trigger — the trigger will open its panel on this click; closing the
|
|
53
|
+
* menu would unmount the popover before the user could interact with it.
|
|
54
|
+
* The menu can be dismissed separately (Escape or outside-click).
|
|
55
|
+
*/
|
|
56
|
+
closeOnSelect?: boolean;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* A selectable menu item that fires `onSelect` on activation.
|
|
61
|
+
* @see docs/components/DropdownMenu.md
|
|
62
|
+
*/
|
|
63
|
+
export const Item = forwardRef<HTMLDivElement, DropdownMenuItemProps>(function Item(
|
|
64
|
+
{
|
|
65
|
+
onSelect,
|
|
66
|
+
tone = 'default',
|
|
67
|
+
icon,
|
|
68
|
+
shortcut,
|
|
69
|
+
meta,
|
|
70
|
+
disabled = false,
|
|
71
|
+
closeOnSelect = true,
|
|
72
|
+
className,
|
|
73
|
+
children,
|
|
74
|
+
onClick: consumerOnClick,
|
|
75
|
+
...rest
|
|
76
|
+
},
|
|
77
|
+
forwardedRef,
|
|
78
|
+
) {
|
|
79
|
+
const ctx = useDropdownMenuContext('Item');
|
|
80
|
+
const itemRef = useRef<HTMLDivElement | null>(null);
|
|
81
|
+
const id = useId();
|
|
82
|
+
|
|
83
|
+
// String children become the typeahead label. Non-string fall back to '';
|
|
84
|
+
// typeahead won't match those, which is acceptable.
|
|
85
|
+
const label = typeof children === 'string' ? children : '';
|
|
86
|
+
|
|
87
|
+
// useLayoutEffect (not useEffect) so item registration completes BEFORE
|
|
88
|
+
// Content's parent useLayoutEffect runs to set activeIndex on open.
|
|
89
|
+
useLayoutEffect(() => {
|
|
90
|
+
return ctx.registerItem({ id, ref: itemRef, disabled, label });
|
|
91
|
+
}, [ctx, id, disabled, label]);
|
|
92
|
+
|
|
93
|
+
const index = ctx.itemsRef.current.findIndex((x) => x.id === id);
|
|
94
|
+
const isActive = index !== -1 && index === ctx.activeIndex;
|
|
95
|
+
|
|
96
|
+
const handleClick = (e: MouseEvent<HTMLDivElement>) => {
|
|
97
|
+
if (disabled) return;
|
|
98
|
+
// Run consumer's onClick first (e.g., injected by <Popover.Trigger> when
|
|
99
|
+
// this Item is wrapped as a popover trigger). Consumer can call
|
|
100
|
+
// `e.preventDefault()` to short-circuit the default onSelect+closeAll;
|
|
101
|
+
// otherwise we proceed.
|
|
102
|
+
consumerOnClick?.(e);
|
|
103
|
+
if (e.defaultPrevented) return;
|
|
104
|
+
onSelect();
|
|
105
|
+
if (closeOnSelect) ctx.closeAll();
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
return (
|
|
109
|
+
// {...rest} first so consumer-supplied props don't override the menuitem
|
|
110
|
+
// ARIA contract (role/tabIndex/aria-disabled) or our event wiring.
|
|
111
|
+
// onClick is owned by Item — we chain the consumer's onClick inside
|
|
112
|
+
// handleClick instead of letting {...rest} spread it (it would be
|
|
113
|
+
// overridden anyway by the explicit onClick below).
|
|
114
|
+
<div
|
|
115
|
+
{...rest}
|
|
116
|
+
ref={mergeRefs<HTMLDivElement>(itemRef, forwardedRef)}
|
|
117
|
+
role="menuitem"
|
|
118
|
+
tabIndex={isActive ? 0 : -1}
|
|
119
|
+
aria-disabled={disabled || undefined}
|
|
120
|
+
data-tone={tone}
|
|
121
|
+
className={clsx(styles.item, className)}
|
|
122
|
+
onClick={handleClick}
|
|
123
|
+
>
|
|
124
|
+
{icon !== undefined && <span className={styles.icon}>{icon}</span>}
|
|
125
|
+
<span className={styles.itemLabel}>{children}</span>
|
|
126
|
+
{meta !== undefined && <span className={styles.meta}>{meta}</span>}
|
|
127
|
+
{shortcut !== undefined && <span className={styles.shortcut}>{shortcut}</span>}
|
|
128
|
+
</div>
|
|
129
|
+
);
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
/** Visual divider between groups of items. Decorative — `role="separator"`. */
|
|
133
|
+
export interface DropdownMenuSeparatorProps extends HTMLAttributes<HTMLDivElement> {}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Decorative visual divider between groups of items (`role="separator"`, not focusable).
|
|
137
|
+
* @see docs/components/DropdownMenu.md
|
|
138
|
+
*/
|
|
139
|
+
export const Separator = forwardRef<HTMLDivElement, DropdownMenuSeparatorProps>(function Separator(
|
|
140
|
+
{ className, ...rest },
|
|
141
|
+
ref,
|
|
142
|
+
) {
|
|
143
|
+
return (
|
|
144
|
+
// {...rest} last; Separator is decorative and a consumer is free to
|
|
145
|
+
// override role/className for their own grouping conventions.
|
|
146
|
+
<div ref={ref} role="separator" className={clsx(styles.separator, className)} {...rest} />
|
|
147
|
+
);
|
|
148
|
+
});
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { forwardRef, type HTMLAttributes, type ReactNode } from 'react';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Props for `<DropdownMenu.ItemIndicator>`.
|
|
5
|
+
*
|
|
6
|
+
* Extends standard `span` HTML attributes so consumers can apply
|
|
7
|
+
* `className`, `style`, `data-*`, etc. to the indicator wrapper.
|
|
8
|
+
*/
|
|
9
|
+
export interface DropdownMenuItemIndicatorProps extends HTMLAttributes<HTMLSpanElement> {
|
|
10
|
+
/**
|
|
11
|
+
* Indicator content (icon, custom glyph, animated element) to render in the
|
|
12
|
+
* parent item's indicator slot. The parent — CheckboxItem or RadioItem —
|
|
13
|
+
* decides when this is rendered based on its own `checked` state.
|
|
14
|
+
*/
|
|
15
|
+
children?: ReactNode;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Marker for adding a custom indicator glyph alongside the tinted checked state of a `CheckboxItem` or `RadioItem`.
|
|
20
|
+
* @see docs/components/DropdownMenu.md
|
|
21
|
+
*/
|
|
22
|
+
export const ItemIndicator = forwardRef<HTMLSpanElement, DropdownMenuItemIndicatorProps>(
|
|
23
|
+
function ItemIndicator({ children, ...rest }, ref) {
|
|
24
|
+
return (
|
|
25
|
+
<span ref={ref} {...rest}>
|
|
26
|
+
{children}
|
|
27
|
+
</span>
|
|
28
|
+
);
|
|
29
|
+
},
|
|
30
|
+
);
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Children,
|
|
3
|
+
forwardRef,
|
|
4
|
+
isValidElement,
|
|
5
|
+
useId,
|
|
6
|
+
useLayoutEffect,
|
|
7
|
+
useRef,
|
|
8
|
+
type HTMLAttributes,
|
|
9
|
+
type MouseEvent,
|
|
10
|
+
type ReactNode,
|
|
11
|
+
} from 'react';
|
|
12
|
+
import clsx from 'clsx';
|
|
13
|
+
import styles from './DropdownMenu.module.scss';
|
|
14
|
+
import { RadioGroupContext, useDropdownMenuContext, useRadioGroupContext } from './context';
|
|
15
|
+
import { mergeRefs } from '../_internal/refs';
|
|
16
|
+
import { ItemIndicator } from './ItemIndicator';
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Props for `<DropdownMenu.RadioGroup>`.
|
|
20
|
+
*
|
|
21
|
+
* Extends standard `div` HTML attributes. `value` and `onValueChange` drive
|
|
22
|
+
* the controlled selection; they are also distributed to child `RadioItem`s
|
|
23
|
+
* via context, so no prop-drilling is required.
|
|
24
|
+
*/
|
|
25
|
+
export interface DropdownMenuRadioGroupProps extends HTMLAttributes<HTMLDivElement> {
|
|
26
|
+
/** The currently-selected value. Must match the `value` prop of one of the child RadioItems. */
|
|
27
|
+
value: string;
|
|
28
|
+
/** Called with the new value when a `<DropdownMenu.RadioItem>` is activated. */
|
|
29
|
+
onValueChange: (value: string) => void;
|
|
30
|
+
/** `<DropdownMenu.RadioItem>` children (and optionally `<DropdownMenu.Label>`). */
|
|
31
|
+
children: ReactNode;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Mutually exclusive selection group of `RadioItem`s, rendered as `role="radiogroup"`.
|
|
36
|
+
* @see docs/components/DropdownMenu.md
|
|
37
|
+
*/
|
|
38
|
+
export const RadioGroup = forwardRef<HTMLDivElement, DropdownMenuRadioGroupProps>(
|
|
39
|
+
function RadioGroup({ value, onValueChange, className, children, ...rest }, ref) {
|
|
40
|
+
return (
|
|
41
|
+
<RadioGroupContext.Provider value={{ value, onValueChange }}>
|
|
42
|
+
{/* {...rest} first so consumer props don't override role="radiogroup" */}
|
|
43
|
+
<div {...rest} ref={ref} role="radiogroup" className={clsx(styles.group, className)}>
|
|
44
|
+
{children}
|
|
45
|
+
</div>
|
|
46
|
+
</RadioGroupContext.Provider>
|
|
47
|
+
);
|
|
48
|
+
},
|
|
49
|
+
);
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Props for `<DropdownMenu.RadioItem>`.
|
|
53
|
+
*
|
|
54
|
+
* Extends standard `div` HTML attributes, omitting `onSelect` (selection is
|
|
55
|
+
* communicated via the parent `RadioGroup`'s `onValueChange`). The ARIA
|
|
56
|
+
* contract attributes (`role`, `aria-checked`, `aria-disabled`) are always
|
|
57
|
+
* set by the component.
|
|
58
|
+
*/
|
|
59
|
+
export interface DropdownMenuRadioItemProps extends Omit<
|
|
60
|
+
HTMLAttributes<HTMLDivElement>,
|
|
61
|
+
'onSelect'
|
|
62
|
+
> {
|
|
63
|
+
/** The value this item represents. Activating sets the parent RadioGroup's value to this. */
|
|
64
|
+
value: string;
|
|
65
|
+
/**
|
|
66
|
+
* Whether activating closes the entire menu chain. Defaults to `true` —
|
|
67
|
+
* radio selection IS the action; the menu's job is done once a value is chosen.
|
|
68
|
+
* Set to `false` for preview-style selection where the menu stays open.
|
|
69
|
+
*/
|
|
70
|
+
closeOnSelect?: boolean;
|
|
71
|
+
/** Disabled items don't fire `onValueChange`, are skipped by keyboard nav, and render dimmed. */
|
|
72
|
+
disabled?: boolean;
|
|
73
|
+
/**
|
|
74
|
+
* Leading icon, rendered in a fixed-size slot before the label (parity with
|
|
75
|
+
* `<DropdownMenu.Item icon>`). Prefer this over inlining an icon into
|
|
76
|
+
* `children`: typeahead derives its match string from the string children, so
|
|
77
|
+
* an inlined leading icon leaves the JSX whitespace `" "` as the first string
|
|
78
|
+
* child and breaks first-letter type-to-select. Passing the icon here keeps
|
|
79
|
+
* the typeahead label the pure label string. Mark the glyph `aria-hidden`.
|
|
80
|
+
*/
|
|
81
|
+
icon?: ReactNode;
|
|
82
|
+
/** Optional trailing shortcut hint (e.g. `'⌘N'`). Visual cue only — does NOT register a global key handler. */
|
|
83
|
+
shortcut?: string;
|
|
84
|
+
/**
|
|
85
|
+
* Trailing secondary content *about the item itself* — a region code, a
|
|
86
|
+
* count, a `<Badge>`. Distinct from `shortcut`, which is a keyboard hint
|
|
87
|
+
* and is styled (and free to evolve) as one.
|
|
88
|
+
*
|
|
89
|
+
* `ReactNode`, so a Badge or Dot can go here. It is NOT `aria-hidden`, so
|
|
90
|
+
* it joins the item's accessible name ("demo RU" rather than a second
|
|
91
|
+
* identical "demo") — which is the point when the label alone is
|
|
92
|
+
* ambiguous. It is a prop, not a child, so it stays out of the typeahead
|
|
93
|
+
* label; type-to-select still matches the pure label text.
|
|
94
|
+
*
|
|
95
|
+
* Renders before `shortcut` when both are present, keeping the keyboard
|
|
96
|
+
* hint rightmost.
|
|
97
|
+
*/
|
|
98
|
+
meta?: ReactNode;
|
|
99
|
+
/**
|
|
100
|
+
* Item content. May include a `<DropdownMenu.ItemIndicator>` as a direct
|
|
101
|
+
* child to provide a custom indicator glyph.
|
|
102
|
+
*/
|
|
103
|
+
children: ReactNode;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Single radio item (`role="menuitemradio"`) inside a `RadioGroup`; closes the menu on select by default.
|
|
108
|
+
* @see docs/components/DropdownMenu.md
|
|
109
|
+
*/
|
|
110
|
+
export const RadioItem = forwardRef<HTMLDivElement, DropdownMenuRadioItemProps>(function RadioItem(
|
|
111
|
+
{
|
|
112
|
+
value,
|
|
113
|
+
closeOnSelect = true,
|
|
114
|
+
disabled = false,
|
|
115
|
+
icon,
|
|
116
|
+
shortcut,
|
|
117
|
+
meta,
|
|
118
|
+
className,
|
|
119
|
+
children,
|
|
120
|
+
...rest
|
|
121
|
+
},
|
|
122
|
+
forwardedRef,
|
|
123
|
+
) {
|
|
124
|
+
const ctx = useDropdownMenuContext('RadioItem');
|
|
125
|
+
const groupCtx = useRadioGroupContext('RadioItem');
|
|
126
|
+
const itemRef = useRef<HTMLDivElement | null>(null);
|
|
127
|
+
const id = useId();
|
|
128
|
+
|
|
129
|
+
const checked = groupCtx.value === value;
|
|
130
|
+
|
|
131
|
+
// Extract any ItemIndicator from direct children.
|
|
132
|
+
const childrenArray = Children.toArray(children);
|
|
133
|
+
const indicator = childrenArray.find((c) => isValidElement(c) && c.type === ItemIndicator);
|
|
134
|
+
const labelContent = childrenArray.filter((c) => c !== indicator);
|
|
135
|
+
const labelText = labelContent.find((c): c is string => typeof c === 'string') ?? '';
|
|
136
|
+
|
|
137
|
+
useLayoutEffect(() => {
|
|
138
|
+
return ctx.registerItem({ id, ref: itemRef, disabled, label: labelText });
|
|
139
|
+
}, [ctx, id, disabled, labelText]);
|
|
140
|
+
|
|
141
|
+
const index = ctx.itemsRef.current.findIndex((x) => x.id === id);
|
|
142
|
+
const isActive = index !== -1 && index === ctx.activeIndex;
|
|
143
|
+
|
|
144
|
+
const handleClick = (_e: MouseEvent) => {
|
|
145
|
+
if (disabled) return;
|
|
146
|
+
groupCtx.onValueChange(value);
|
|
147
|
+
if (closeOnSelect) {
|
|
148
|
+
ctx.closeAll();
|
|
149
|
+
}
|
|
150
|
+
};
|
|
151
|
+
|
|
152
|
+
return (
|
|
153
|
+
// {...rest} first so consumer props don't override the menuitemradio ARIA contract.
|
|
154
|
+
<div
|
|
155
|
+
{...rest}
|
|
156
|
+
ref={mergeRefs<HTMLDivElement>(itemRef, forwardedRef)}
|
|
157
|
+
role="menuitemradio"
|
|
158
|
+
tabIndex={isActive ? 0 : -1}
|
|
159
|
+
aria-checked={checked}
|
|
160
|
+
aria-disabled={disabled || undefined}
|
|
161
|
+
className={clsx(styles.item, className)}
|
|
162
|
+
onClick={handleClick}
|
|
163
|
+
>
|
|
164
|
+
{/* Indicator slot only rendered when a custom ItemIndicator is provided.
|
|
165
|
+
Default checked state is conveyed via the row's tinted background +
|
|
166
|
+
left accent (.item[aria-checked='true'] in SCSS). */}
|
|
167
|
+
{indicator && (
|
|
168
|
+
<span aria-hidden="true" className={styles.indicatorSlot}>
|
|
169
|
+
{checked && indicator}
|
|
170
|
+
</span>
|
|
171
|
+
)}
|
|
172
|
+
{icon !== undefined && <span className={styles.icon}>{icon}</span>}
|
|
173
|
+
<span className={styles.itemLabel}>{labelContent}</span>
|
|
174
|
+
{meta !== undefined && <span className={styles.meta}>{meta}</span>}
|
|
175
|
+
{shortcut !== undefined && <span className={styles.shortcut}>{shortcut}</span>}
|
|
176
|
+
</div>
|
|
177
|
+
);
|
|
178
|
+
});
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { useCallback, useEffect, useId, useRef, useState, type ReactNode } from 'react';
|
|
2
|
+
import { DropdownMenuContext, type DropdownMenuContextValue, type RegisteredItem } from './context';
|
|
3
|
+
import { sanitizeId } from '../_internal/refs';
|
|
4
|
+
import { useFloatingSurface, useInOverlay } from '../_internal/overlay';
|
|
5
|
+
|
|
6
|
+
export interface DropdownMenuProps {
|
|
7
|
+
/** Must contain exactly one `<DropdownMenu.Trigger>` and one `<DropdownMenu.Content>`. */
|
|
8
|
+
children: ReactNode;
|
|
9
|
+
/**
|
|
10
|
+
* Controlled open state. Provide alongside `onOpenChange` to drive open
|
|
11
|
+
* externally. Omit both to let DropdownMenu own its own state (the common
|
|
12
|
+
* case).
|
|
13
|
+
*/
|
|
14
|
+
open?: boolean;
|
|
15
|
+
/** Fired whenever DropdownMenu wants to change open state. Required when `open` is provided. */
|
|
16
|
+
onOpenChange?: (open: boolean) => void;
|
|
17
|
+
/** Default open state for uncontrolled usage. Defaults to `false`. */
|
|
18
|
+
defaultOpen?: boolean;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Action menu that opens from a trigger button, implementing the WAI-ARIA menu pattern.
|
|
23
|
+
* @see docs/components/DropdownMenu.md
|
|
24
|
+
*/
|
|
25
|
+
export function DropdownMenuRoot({
|
|
26
|
+
children,
|
|
27
|
+
open: controlledOpen,
|
|
28
|
+
onOpenChange,
|
|
29
|
+
defaultOpen = false,
|
|
30
|
+
}: DropdownMenuProps) {
|
|
31
|
+
const isControlled = controlledOpen !== undefined;
|
|
32
|
+
const [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen);
|
|
33
|
+
const open = isControlled ? (controlledOpen as boolean) : uncontrolledOpen;
|
|
34
|
+
|
|
35
|
+
const setOpen = useCallback(
|
|
36
|
+
(next: boolean) => {
|
|
37
|
+
onOpenChange?.(next);
|
|
38
|
+
if (!isControlled) setUncontrolledOpen(next);
|
|
39
|
+
},
|
|
40
|
+
[isControlled, onOpenChange],
|
|
41
|
+
);
|
|
42
|
+
|
|
43
|
+
const triggerRef = useRef<HTMLElement | null>(null);
|
|
44
|
+
const inOverlay = useInOverlay(triggerRef, open);
|
|
45
|
+
// #274: hosts yield Escape while the menu (any level) is open — the
|
|
46
|
+
// menu's own capture listeners peel one level per press instead. The id lets
|
|
47
|
+
// Content defer to a DEEPER surface (e.g. a popover from an item) (#280).
|
|
48
|
+
const floatingId = useFloatingSurface(open);
|
|
49
|
+
const reactId = useId();
|
|
50
|
+
const contentId = `dropdown-menu-${sanitizeId(reactId)}`;
|
|
51
|
+
|
|
52
|
+
const [openIntent, setOpenIntent] = useState<'first' | 'last' | null>(null);
|
|
53
|
+
|
|
54
|
+
const itemsRef = useRef<RegisteredItem[]>([]);
|
|
55
|
+
const [activeIndex, setActiveIndex] = useState<number>(-1);
|
|
56
|
+
|
|
57
|
+
const registerItem = useCallback((item: RegisteredItem) => {
|
|
58
|
+
if (!itemsRef.current.some((x) => x.id === item.id)) {
|
|
59
|
+
itemsRef.current.push(item);
|
|
60
|
+
}
|
|
61
|
+
return () => {
|
|
62
|
+
itemsRef.current = itemsRef.current.filter((x) => x.id !== item.id);
|
|
63
|
+
};
|
|
64
|
+
}, []);
|
|
65
|
+
|
|
66
|
+
// Reset registry indicator when menu closes. The registry array itself is
|
|
67
|
+
// cleared by item unmount cleanups.
|
|
68
|
+
useEffect(() => {
|
|
69
|
+
if (!open) {
|
|
70
|
+
setActiveIndex(-1);
|
|
71
|
+
}
|
|
72
|
+
}, [open]);
|
|
73
|
+
|
|
74
|
+
const closeAll = useCallback(() => {
|
|
75
|
+
setOpen(false);
|
|
76
|
+
// preventScroll: focus() on the trigger after close shouldn't trigger
|
|
77
|
+
// browser auto-scroll if the page happens to be scrolled (trigger is
|
|
78
|
+
// already visible since the user just interacted with it).
|
|
79
|
+
triggerRef.current?.focus({ preventScroll: true });
|
|
80
|
+
}, [setOpen]);
|
|
81
|
+
|
|
82
|
+
const value: DropdownMenuContextValue = {
|
|
83
|
+
open,
|
|
84
|
+
setOpen,
|
|
85
|
+
triggerRef,
|
|
86
|
+
contentId,
|
|
87
|
+
openIntent,
|
|
88
|
+
setOpenIntent,
|
|
89
|
+
registerItem,
|
|
90
|
+
itemsRef,
|
|
91
|
+
activeIndex,
|
|
92
|
+
setActiveIndex,
|
|
93
|
+
closeAll,
|
|
94
|
+
depth: 0,
|
|
95
|
+
inOverlay,
|
|
96
|
+
floatingId,
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
return <DropdownMenuContext.Provider value={value}>{children}</DropdownMenuContext.Provider>;
|
|
100
|
+
}
|