@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,572 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Children,
|
|
3
|
+
createContext,
|
|
4
|
+
forwardRef,
|
|
5
|
+
isValidElement,
|
|
6
|
+
useContext,
|
|
7
|
+
useMemo,
|
|
8
|
+
useRef,
|
|
9
|
+
useState,
|
|
10
|
+
type ButtonHTMLAttributes,
|
|
11
|
+
type HTMLAttributes,
|
|
12
|
+
type ReactNode,
|
|
13
|
+
} from 'react';
|
|
14
|
+
import {
|
|
15
|
+
closestCenter,
|
|
16
|
+
DndContext,
|
|
17
|
+
DragOverlay,
|
|
18
|
+
KeyboardSensor,
|
|
19
|
+
PointerSensor,
|
|
20
|
+
useSensor,
|
|
21
|
+
useSensors,
|
|
22
|
+
type DragEndEvent,
|
|
23
|
+
type DragStartEvent,
|
|
24
|
+
type Modifier,
|
|
25
|
+
} from '@dnd-kit/core';
|
|
26
|
+
import {
|
|
27
|
+
SortableContext,
|
|
28
|
+
rectSortingStrategy,
|
|
29
|
+
sortableKeyboardCoordinates,
|
|
30
|
+
useSortable,
|
|
31
|
+
verticalListSortingStrategy,
|
|
32
|
+
} from '@dnd-kit/sortable';
|
|
33
|
+
import { CSS, type Transform } from '@dnd-kit/utilities';
|
|
34
|
+
import clsx from 'clsx';
|
|
35
|
+
import { useTranslation } from '../../i18n/useTranslation';
|
|
36
|
+
import { mergeRefs } from '../_internal/refs';
|
|
37
|
+
import { useFloatingSurface } from '../_internal/overlay';
|
|
38
|
+
import {
|
|
39
|
+
resolveGridItemSpan,
|
|
40
|
+
resolveCollapsedGridItemSpan,
|
|
41
|
+
type GridItemSpan,
|
|
42
|
+
} from '../_internal/gridSpan';
|
|
43
|
+
import {
|
|
44
|
+
CollapseColumnsContext,
|
|
45
|
+
COLLAPSE_BREAKPOINTS,
|
|
46
|
+
collapseTrackTemplate,
|
|
47
|
+
type CollapseBreakpoint,
|
|
48
|
+
type CollapseColumnsMap,
|
|
49
|
+
} from '../_internal/collapse';
|
|
50
|
+
import { sortableTarget, useDragAccessibility } from '../_internal/dragAnnouncements';
|
|
51
|
+
import styles from './Sortable.module.scss';
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Layout arrangement of the sortable items.
|
|
55
|
+
* - `'list'` (default) — a single vertical column (`verticalListSortingStrategy`).
|
|
56
|
+
* - `'grid'` — a `columns`-track CSS grid where items carry column spans and
|
|
57
|
+
* siblings reflow in 2D during a drag (`rectSortingStrategy`).
|
|
58
|
+
*/
|
|
59
|
+
export type SortableArrangement = 'list' | 'grid';
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Payload fired by `onReorder` after a successful drag-drop or keyboard move.
|
|
63
|
+
* Consumer applies the move via an immutable `arrayMove(items, from, to)`
|
|
64
|
+
* (3-line utility, not shipped by the library; `@dnd-kit/sortable` ships an
|
|
65
|
+
* `arrayMove` consumers can import if they want).
|
|
66
|
+
*/
|
|
67
|
+
export interface SortableReorderEvent {
|
|
68
|
+
from: number;
|
|
69
|
+
to: number;
|
|
70
|
+
id: string | number;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Clamp a drag `transform` so the dragged node (`nodeRect`) stays within
|
|
75
|
+
* `boundingRect`. Pure function mirroring dnd-kit's `restrictToBoundingRect`;
|
|
76
|
+
* exported so the clamp math can be unit-tested without a real DOM / drag.
|
|
77
|
+
*
|
|
78
|
+
* `scaleX` / `scaleY` pass through untouched — only the translation is clamped.
|
|
79
|
+
*/
|
|
80
|
+
export function restrictTransformToRect(
|
|
81
|
+
transform: Transform,
|
|
82
|
+
nodeRect: { top: number; bottom: number; left: number; right: number },
|
|
83
|
+
boundingRect: { top: number; left: number; width: number; height: number },
|
|
84
|
+
): Transform {
|
|
85
|
+
const value = { ...transform };
|
|
86
|
+
if (nodeRect.top + transform.y <= boundingRect.top) {
|
|
87
|
+
value.y = boundingRect.top - nodeRect.top;
|
|
88
|
+
} else if (nodeRect.bottom + transform.y >= boundingRect.top + boundingRect.height) {
|
|
89
|
+
value.y = boundingRect.top + boundingRect.height - nodeRect.bottom;
|
|
90
|
+
}
|
|
91
|
+
if (nodeRect.left + transform.x <= boundingRect.left) {
|
|
92
|
+
value.x = boundingRect.left - nodeRect.left;
|
|
93
|
+
} else if (nodeRect.right + transform.x >= boundingRect.left + boundingRect.width) {
|
|
94
|
+
value.x = boundingRect.left + boundingRect.width - nodeRect.right;
|
|
95
|
+
}
|
|
96
|
+
return value;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export interface SortableProps extends HTMLAttributes<HTMLOListElement> {
|
|
100
|
+
/**
|
|
101
|
+
* Fires after a drag or keyboard move with the new position. Consumer
|
|
102
|
+
* holds the items array and re-renders with the new order.
|
|
103
|
+
*
|
|
104
|
+
* Not fired if the drop position equals the source position (no-op).
|
|
105
|
+
*/
|
|
106
|
+
onReorder?: (event: SortableReorderEvent) => void;
|
|
107
|
+
/**
|
|
108
|
+
* When `true` (default), the dragged item is clamped to the list's bounding
|
|
109
|
+
* box — it can't be dragged outside the `<ol>`. Set `false` for free-drag
|
|
110
|
+
* (the item can be dragged anywhere on the page). For a vertical list this
|
|
111
|
+
* constrains the drag vertically to the list's extent.
|
|
112
|
+
*/
|
|
113
|
+
restrictToContainer?: boolean;
|
|
114
|
+
/**
|
|
115
|
+
* Layout arrangement of the items.
|
|
116
|
+
* - `'list'` (default) — single vertical column; existing behavior unchanged.
|
|
117
|
+
* - `'grid'` — the `<ol>` becomes a `columns`-track CSS grid. Items carry
|
|
118
|
+
* column spans (`Sortable.Item span`), rows are equal-height, and siblings
|
|
119
|
+
* reflow in 2D during a drag. Reorder semantics stay order-based (a drop
|
|
120
|
+
* reorders the flow; nothing here persists an x/y position).
|
|
121
|
+
*/
|
|
122
|
+
arrangement?: SortableArrangement;
|
|
123
|
+
/**
|
|
124
|
+
* Number of equal-width grid tracks. Only applies when `arrangement="grid"`
|
|
125
|
+
* (ignored for a list). Default `12`, matching `Grid.Item`'s 12-column
|
|
126
|
+
* fraction spans (`'25%'`→3 … `'75%'`→9 tracks). Set another count for a
|
|
127
|
+
* simpler grid, but the named fraction spans then won't map to their
|
|
128
|
+
* fraction (documented, not validated — same as `Grid`).
|
|
129
|
+
*/
|
|
130
|
+
columns?: number;
|
|
131
|
+
/**
|
|
132
|
+
* Responsive collapse for the grid arrangement — mirrors `Grid`'s
|
|
133
|
+
* `collapseBelow` exactly (same breakpoints, same container-query
|
|
134
|
+
* mechanism). Ignored unless `arrangement="grid"`.
|
|
135
|
+
* - `'sm' | 'md' | 'lg'` — below the container-width threshold (480 / 640 /
|
|
136
|
+
* 768px of the LIST'S OWN width) every item spans the full row: a single
|
|
137
|
+
* visual column.
|
|
138
|
+
* - `{ lg?: n, md?: n, sm?: n }` — graduated: below each breakpoint the grid
|
|
139
|
+
* re-templates to that many columns and item spans clamp to fit (a span
|
|
140
|
+
* wider than the step becomes a full row). E.g. `{ md: 6, sm: 1 }`.
|
|
141
|
+
*
|
|
142
|
+
* ❌ Anti-pattern: a collapsible Sortable must get its width from its
|
|
143
|
+
* parent — `container-type: inline-size` zeroes the list's contribution to
|
|
144
|
+
* intrinsic sizing (same caveat as `Grid`'s `collapseBelow`).
|
|
145
|
+
*
|
|
146
|
+
* ⚠️ The map form (and ONLY the map form) wraps the `<ol>` in an extra
|
|
147
|
+
* `<div>` carrying `container-type: inline-size` — re-templating the `<ol>`
|
|
148
|
+
* requires querying an ancestor, not the `<ol>` itself. A `> child` selector
|
|
149
|
+
* aimed at the list from its parent hits that wrapper instead, and layout the
|
|
150
|
+
* parent applies via `className` lands on the `<ol>` inside it. `ref`,
|
|
151
|
+
* `className`, `style` and spread props all stay on the `<ol>`.
|
|
152
|
+
*/
|
|
153
|
+
collapseBelow?: CollapseBreakpoint | CollapseColumnsMap;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
export interface SortableItemProps extends Omit<HTMLAttributes<HTMLLIElement>, 'id'> {
|
|
157
|
+
/**
|
|
158
|
+
* Stable identifier for this item. Used by dnd-kit for tracking the item
|
|
159
|
+
* across reorders. String or number — typically the consumer's database id.
|
|
160
|
+
*/
|
|
161
|
+
id: string | number;
|
|
162
|
+
/** Item content — typically a `<Card>` or a row of text + icons. */
|
|
163
|
+
children: ReactNode;
|
|
164
|
+
/**
|
|
165
|
+
* Column span, only meaningful under `<Sortable arrangement="grid">`
|
|
166
|
+
* (ignored in a list). Mirrors `Grid.Item`'s `span` exactly:
|
|
167
|
+
* - number — `span N` of the grid's `columns`.
|
|
168
|
+
* - `'25%' | '33%' | '50%' | '67%' | '75%'` — fractions of a 12-column grid.
|
|
169
|
+
* - `'100%'` / `'full'` — the entire row (`1 / -1`); safe with any `columns`.
|
|
170
|
+
* Omit for a single track (auto placement).
|
|
171
|
+
*/
|
|
172
|
+
span?: GridItemSpan;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
export interface SortableHandleProps extends ButtonHTMLAttributes<HTMLButtonElement> {
|
|
176
|
+
/**
|
|
177
|
+
* Decorative content — typically a grip icon (e.g. `<GripVertical size={14} />`).
|
|
178
|
+
* Rendered inside the Handle's `<button>` wrapped with `aria-hidden`.
|
|
179
|
+
*/
|
|
180
|
+
children?: ReactNode;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
export interface SortableItemContextValue {
|
|
184
|
+
listeners: ReturnType<typeof useSortable>['listeners'];
|
|
185
|
+
attributes: ReturnType<typeof useSortable>['attributes'];
|
|
186
|
+
setActivatorNodeRef: ReturnType<typeof useSortable>['setActivatorNodeRef'];
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
export const SortableItemContext = createContext<SortableItemContextValue | null>(null);
|
|
190
|
+
|
|
191
|
+
// Inert context for the DragOverlay clone — the overlay is a static visual; its
|
|
192
|
+
// Handle (if any) must render without wiring real drag listeners.
|
|
193
|
+
const OVERLAY_ITEM_CONTEXT: SortableItemContextValue = {
|
|
194
|
+
listeners: undefined,
|
|
195
|
+
attributes: {} as SortableItemContextValue['attributes'],
|
|
196
|
+
setActivatorNodeRef: () => {},
|
|
197
|
+
};
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* Recursively check whether the children subtree contains a `Sortable.Handle`.
|
|
201
|
+
* Used by `Sortable.Item` to decide whether to attach drag listeners to itself
|
|
202
|
+
* (no Handle present) or rely on the Handle to attach them.
|
|
203
|
+
*
|
|
204
|
+
* **Limitation:** only walks `React.Children` and direct `props.children`.
|
|
205
|
+
* If a consumer wraps `<Sortable.Handle>` inside their own custom component
|
|
206
|
+
* (e.g. `<TaskRow>` whose JSX internally renders the Handle), the walk sees
|
|
207
|
+
* `<TaskRow>` but not the Handle inside it — the Item is classified as
|
|
208
|
+
* no-Handle and gets whole-item drag. Workaround: put `<Sortable.Handle>` at
|
|
209
|
+
* the same JSX nesting level as the rest of the Item's content.
|
|
210
|
+
*/
|
|
211
|
+
function containsHandle(children: ReactNode): boolean {
|
|
212
|
+
let found = false;
|
|
213
|
+
function walk(node: ReactNode) {
|
|
214
|
+
if (found) return;
|
|
215
|
+
if (!isValidElement(node)) return;
|
|
216
|
+
if (node.type === SortableHandle) {
|
|
217
|
+
found = true;
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
const { children: nested } = node.props as { children?: ReactNode };
|
|
221
|
+
if (nested != null) Children.forEach(nested, walk);
|
|
222
|
+
}
|
|
223
|
+
Children.forEach(children, walk);
|
|
224
|
+
return found;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
const collapseClass: Record<CollapseBreakpoint, string> = {
|
|
228
|
+
sm: styles.collapseSm,
|
|
229
|
+
md: styles.collapseMd,
|
|
230
|
+
lg: styles.collapseLg,
|
|
231
|
+
};
|
|
232
|
+
const stepClass: Record<CollapseBreakpoint, string> = {
|
|
233
|
+
sm: styles.stepSm,
|
|
234
|
+
md: styles.stepMd,
|
|
235
|
+
lg: styles.stepLg,
|
|
236
|
+
};
|
|
237
|
+
|
|
238
|
+
const SortableRoot = forwardRef<HTMLOListElement, SortableProps>(function SortableRoot(
|
|
239
|
+
{
|
|
240
|
+
onReorder,
|
|
241
|
+
restrictToContainer = true,
|
|
242
|
+
arrangement = 'list',
|
|
243
|
+
columns = 12,
|
|
244
|
+
collapseBelow,
|
|
245
|
+
className,
|
|
246
|
+
style,
|
|
247
|
+
children,
|
|
248
|
+
...rest
|
|
249
|
+
},
|
|
250
|
+
ref,
|
|
251
|
+
) {
|
|
252
|
+
const isGrid = arrangement === 'grid';
|
|
253
|
+
const collapse = isGrid ? collapseBelow : undefined;
|
|
254
|
+
const collapseMap = typeof collapse === 'object' ? collapse : undefined;
|
|
255
|
+
const collapseKeys = collapseMap
|
|
256
|
+
? COLLAPSE_BREAKPOINTS.filter((b) => collapseMap[b] !== undefined)
|
|
257
|
+
: [];
|
|
258
|
+
const [activeId, setActiveId] = useState<string | number | null>(null);
|
|
259
|
+
// #282: a keyboard drag is an Escape-consuming MODE (Escape cancels the
|
|
260
|
+
// drag). Register it as a floating surface while active so a host Modal/Drawer
|
|
261
|
+
// yields that Escape — the drag cancels, the host survives that press.
|
|
262
|
+
useFloatingSurface(activeId != null);
|
|
263
|
+
// Internal handle on the <ol> so the restrict modifier can read the live
|
|
264
|
+
// list rect, independent of whether the consumer forwards a ref.
|
|
265
|
+
const olRef = useRef<HTMLOListElement | null>(null);
|
|
266
|
+
|
|
267
|
+
const itemIds = useMemo(() => {
|
|
268
|
+
const ids: (string | number)[] = [];
|
|
269
|
+
Children.forEach(children, (child) => {
|
|
270
|
+
if (isValidElement(child) && child.type === SortableItem) {
|
|
271
|
+
ids.push((child.props as SortableItemProps).id);
|
|
272
|
+
}
|
|
273
|
+
});
|
|
274
|
+
return ids;
|
|
275
|
+
}, [children]);
|
|
276
|
+
|
|
277
|
+
// The active item's content, rendered into the DragOverlay clone. Looking it
|
|
278
|
+
// up by id (rather than capturing a snapshot on drag-start) keeps the overlay
|
|
279
|
+
// in sync if the consumer's item content re-renders mid-drag.
|
|
280
|
+
const activeChildren = useMemo<ReactNode>(() => {
|
|
281
|
+
if (activeId == null) return null;
|
|
282
|
+
let content: ReactNode = null;
|
|
283
|
+
Children.forEach(children, (child) => {
|
|
284
|
+
if (
|
|
285
|
+
isValidElement(child) &&
|
|
286
|
+
child.type === SortableItem &&
|
|
287
|
+
(child.props as SortableItemProps).id === activeId
|
|
288
|
+
) {
|
|
289
|
+
content = (child.props as SortableItemProps).children;
|
|
290
|
+
}
|
|
291
|
+
});
|
|
292
|
+
return content;
|
|
293
|
+
}, [activeId, children]);
|
|
294
|
+
|
|
295
|
+
const sensors = useSensors(
|
|
296
|
+
useSensor(PointerSensor, { activationConstraint: { distance: 5 } }),
|
|
297
|
+
useSensor(KeyboardSensor, { coordinateGetter: sortableKeyboardCoordinates }),
|
|
298
|
+
);
|
|
299
|
+
|
|
300
|
+
const handleDragStart = (event: DragStartEvent) => {
|
|
301
|
+
setActiveId(event.active.id as string | number);
|
|
302
|
+
};
|
|
303
|
+
|
|
304
|
+
const handleDragEnd = (event: DragEndEvent) => {
|
|
305
|
+
setActiveId(null);
|
|
306
|
+
const { active, over } = event;
|
|
307
|
+
if (!over || active.id === over.id) return;
|
|
308
|
+
const from = itemIds.indexOf(active.id as string | number);
|
|
309
|
+
const to = itemIds.indexOf(over.id as string | number);
|
|
310
|
+
if (from < 0 || to < 0) return;
|
|
311
|
+
onReorder?.({ from, to, id: active.id as string | number });
|
|
312
|
+
};
|
|
313
|
+
|
|
314
|
+
const handleDragCancel = () => {
|
|
315
|
+
setActiveId(null);
|
|
316
|
+
};
|
|
317
|
+
|
|
318
|
+
// SSR-safe reduced-motion probe; disables the overlay's drop animation.
|
|
319
|
+
const prefersReducedMotion =
|
|
320
|
+
typeof window !== 'undefined' &&
|
|
321
|
+
typeof window.matchMedia === 'function' &&
|
|
322
|
+
window.matchMedia('(prefers-reduced-motion: reduce)').matches;
|
|
323
|
+
|
|
324
|
+
// Modifier that confines the drag transform to the live <ol> bounding box.
|
|
325
|
+
// A modifier is a pure `(args) => Transform`; we read the list rect from the
|
|
326
|
+
// internal ref rather than dnd-kit's `containerNodeRect` (which is unreliable
|
|
327
|
+
// through the DragOverlay portal). Memoized once — it closes over the ref,
|
|
328
|
+
// so it always sees the current node.
|
|
329
|
+
const restrictModifier = useMemo<Modifier>(
|
|
330
|
+
() =>
|
|
331
|
+
({ transform, draggingNodeRect }) => {
|
|
332
|
+
const container = olRef.current?.getBoundingClientRect();
|
|
333
|
+
if (!draggingNodeRect || !container) return transform;
|
|
334
|
+
return restrictTransformToRect(transform, draggingNodeRect, container);
|
|
335
|
+
},
|
|
336
|
+
[],
|
|
337
|
+
);
|
|
338
|
+
const modifiers = restrictToContainer ? [restrictModifier] : undefined;
|
|
339
|
+
|
|
340
|
+
// Localized screen-reader announcements (Hard rule 9). Every droppable here
|
|
341
|
+
// IS a sortable item, so dnd-kit's own `data.sortable` supplies the slot and
|
|
342
|
+
// `sortableTarget` needs no help; the item's name comes from the `aria-label`
|
|
343
|
+
// / rendered text `<Sortable.Item>` publishes below.
|
|
344
|
+
const accessibility = useDragAccessibility(sortableTarget);
|
|
345
|
+
|
|
346
|
+
const ol = (
|
|
347
|
+
<ol
|
|
348
|
+
ref={mergeRefs(olRef, ref)}
|
|
349
|
+
className={clsx(
|
|
350
|
+
isGrid ? styles.grid : styles.list,
|
|
351
|
+
// String form only: those rules query descendants, so the <ol> can be
|
|
352
|
+
// its own container. The map form's container is the wrapper below.
|
|
353
|
+
typeof collapse === 'string' && styles.collapsible,
|
|
354
|
+
typeof collapse === 'string' && collapseClass[collapse],
|
|
355
|
+
...collapseKeys.map((b) => stepClass[b]),
|
|
356
|
+
className,
|
|
357
|
+
)}
|
|
358
|
+
// In grid mode the <ol> owns the track template; inject the column
|
|
359
|
+
// count as a custom prop AFTER the consumer's style so it wins
|
|
360
|
+
// (mirrors Grid's --grid-columns). List mode leaves style untouched.
|
|
361
|
+
style={
|
|
362
|
+
isGrid
|
|
363
|
+
? {
|
|
364
|
+
...style,
|
|
365
|
+
...Object.fromEntries(
|
|
366
|
+
collapseKeys.map((b) => [
|
|
367
|
+
`--sortable-columns-${b}`,
|
|
368
|
+
collapseTrackTemplate(collapseMap![b]!),
|
|
369
|
+
]),
|
|
370
|
+
),
|
|
371
|
+
['--sortable-columns' as string]: columns,
|
|
372
|
+
}
|
|
373
|
+
: style
|
|
374
|
+
}
|
|
375
|
+
{...rest}
|
|
376
|
+
>
|
|
377
|
+
{children}
|
|
378
|
+
</ol>
|
|
379
|
+
);
|
|
380
|
+
|
|
381
|
+
// Map form only: the step rules re-template the <ol> itself, and a container
|
|
382
|
+
// query never matches its own container — so the size container has to be a
|
|
383
|
+
// wrapper. `ref`, `className`, `style` and `{...rest}` all stay on the <ol>.
|
|
384
|
+
const list =
|
|
385
|
+
collapseMap && collapseKeys.length > 0 ? <div className={styles.stepContainer}>{ol}</div> : ol;
|
|
386
|
+
|
|
387
|
+
const tree = (
|
|
388
|
+
<DndContext
|
|
389
|
+
accessibility={accessibility}
|
|
390
|
+
sensors={sensors}
|
|
391
|
+
modifiers={modifiers}
|
|
392
|
+
// Grid: closestCenter is dnd-kit's idiomatic pairing for a 2D sortable
|
|
393
|
+
// grid — the dragged cell reflows to the nearest slot without needing to
|
|
394
|
+
// physically overlap it (the default rectIntersection requires overlap,
|
|
395
|
+
// which reads as sticky/unpredictable when cells vary in span). List
|
|
396
|
+
// keeps the default (undefined) so its behavior is unchanged.
|
|
397
|
+
collisionDetection={isGrid ? closestCenter : undefined}
|
|
398
|
+
onDragStart={handleDragStart}
|
|
399
|
+
onDragEnd={handleDragEnd}
|
|
400
|
+
onDragCancel={handleDragCancel}
|
|
401
|
+
>
|
|
402
|
+
<SortableContext
|
|
403
|
+
items={itemIds}
|
|
404
|
+
strategy={isGrid ? rectSortingStrategy : verticalListSortingStrategy}
|
|
405
|
+
>
|
|
406
|
+
{list}
|
|
407
|
+
</SortableContext>
|
|
408
|
+
{/* The dragged item lives in a portaled, fixed-position overlay that owns
|
|
409
|
+
the drag + drop animation. The list <li> becomes an invisible
|
|
410
|
+
placeholder during drag, so a late/async order update from onReorder
|
|
411
|
+
can never leave a stale dnd-kit transform on a list <li> (#165). The
|
|
412
|
+
overlay is the *visible* drag, so it must carry the restrict modifier
|
|
413
|
+
too — DndContext alone constrains the underlying item transform. */}
|
|
414
|
+
<DragOverlay modifiers={modifiers} dropAnimation={prefersReducedMotion ? null : undefined}>
|
|
415
|
+
{activeChildren != null ? (
|
|
416
|
+
<SortableItemContext.Provider value={OVERLAY_ITEM_CONTEXT}>
|
|
417
|
+
<div className={clsx(styles.item, styles.overlayItem)} data-dragging="true">
|
|
418
|
+
{activeChildren}
|
|
419
|
+
</div>
|
|
420
|
+
</SortableItemContext.Provider>
|
|
421
|
+
) : null}
|
|
422
|
+
</DragOverlay>
|
|
423
|
+
</DndContext>
|
|
424
|
+
);
|
|
425
|
+
|
|
426
|
+
return collapseMap && collapseKeys.length > 0 ? (
|
|
427
|
+
<CollapseColumnsContext.Provider value={collapseMap}>{tree}</CollapseColumnsContext.Provider>
|
|
428
|
+
) : (
|
|
429
|
+
tree
|
|
430
|
+
);
|
|
431
|
+
});
|
|
432
|
+
SortableRoot.displayName = 'Sortable';
|
|
433
|
+
|
|
434
|
+
/**
|
|
435
|
+
* One reorderable item in a `<Sortable>`; renders an `<li>` with a stable `id`.
|
|
436
|
+
* @see docs/components/Sortable.md
|
|
437
|
+
*/
|
|
438
|
+
export const SortableItem = forwardRef<HTMLLIElement, SortableItemProps>(function SortableItem(
|
|
439
|
+
{ id, span, className, children, ...rest },
|
|
440
|
+
ref,
|
|
441
|
+
) {
|
|
442
|
+
// Announcement label: the consumer's `aria-label`, else the item's RENDERED
|
|
443
|
+
// text — so a drag says "Review pricing page mocks, position 2 of 3" instead
|
|
444
|
+
// of dnd-kit's raw id, and a collapsed menu inside the item contributes
|
|
445
|
+
// nothing (see `dragLabelOf`).
|
|
446
|
+
const liRef = useRef<HTMLLIElement | null>(null);
|
|
447
|
+
const dragLabel = rest['aria-label'];
|
|
448
|
+
const data = useMemo(() => ({ dragLabel, dragNode: liRef }), [dragLabel]);
|
|
449
|
+
|
|
450
|
+
const {
|
|
451
|
+
setNodeRef,
|
|
452
|
+
setActivatorNodeRef,
|
|
453
|
+
listeners,
|
|
454
|
+
attributes,
|
|
455
|
+
transform,
|
|
456
|
+
transition,
|
|
457
|
+
isDragging,
|
|
458
|
+
} = useSortable({ id, data });
|
|
459
|
+
|
|
460
|
+
const hasHandle = useMemo(() => containsHandle(children), [children]);
|
|
461
|
+
|
|
462
|
+
const collapseMap = useContext(CollapseColumnsContext);
|
|
463
|
+
|
|
464
|
+
const ctxValue = useMemo<SortableItemContextValue>(
|
|
465
|
+
() => ({ listeners, attributes, setActivatorNodeRef }),
|
|
466
|
+
[listeners, attributes, setActivatorNodeRef],
|
|
467
|
+
);
|
|
468
|
+
|
|
469
|
+
const setRef = (node: HTMLLIElement | null) => {
|
|
470
|
+
liRef.current = node;
|
|
471
|
+
setNodeRef(node);
|
|
472
|
+
// When no Handle is present, the Item itself is the drag activator —
|
|
473
|
+
// dnd-kit uses this ref to scope keyboard / pointer events.
|
|
474
|
+
if (!hasHandle) setActivatorNodeRef(node);
|
|
475
|
+
if (typeof ref === 'function') ref(node);
|
|
476
|
+
else if (ref) ref.current = node;
|
|
477
|
+
};
|
|
478
|
+
|
|
479
|
+
return (
|
|
480
|
+
<SortableItemContext.Provider value={ctxValue}>
|
|
481
|
+
<li
|
|
482
|
+
ref={setRef}
|
|
483
|
+
style={{
|
|
484
|
+
transform: CSS.Transform.toString(transform),
|
|
485
|
+
transition,
|
|
486
|
+
// The DragOverlay renders the dragged item's visual; the in-list copy
|
|
487
|
+
// is an invisible placeholder so it never carries a stale drag/drop
|
|
488
|
+
// transform when onReorder commits the new order asynchronously (#165).
|
|
489
|
+
opacity: isDragging ? 0 : undefined,
|
|
490
|
+
// Grid-arrangement column span. Always stamped (default 'auto') so a
|
|
491
|
+
// span-less item never inherits a spanned ancestor's custom property;
|
|
492
|
+
// ignored by the CSS in list mode (grid-column is inert on a flex
|
|
493
|
+
// child). Mirrors Grid.Item.
|
|
494
|
+
['--sortable-item-span' as string]: resolveGridItemSpan(span) ?? 'auto',
|
|
495
|
+
// Per-breakpoint clamped span for a graduated (map-form)
|
|
496
|
+
// `collapseBelow` ancestor — same always-stamp rationale as
|
|
497
|
+
// `--sortable-item-span` (custom properties inherit).
|
|
498
|
+
...(collapseMap
|
|
499
|
+
? Object.fromEntries(
|
|
500
|
+
(Object.keys(collapseMap) as CollapseBreakpoint[]).map((b) => [
|
|
501
|
+
`--sortable-item-span-${b}`,
|
|
502
|
+
resolveCollapsedGridItemSpan(span, collapseMap[b]!),
|
|
503
|
+
]),
|
|
504
|
+
)
|
|
505
|
+
: undefined),
|
|
506
|
+
}}
|
|
507
|
+
data-dragging={isDragging ? 'true' : undefined}
|
|
508
|
+
className={clsx(styles.item, className)}
|
|
509
|
+
// Listeners + attributes go on the Item only when no Handle is present.
|
|
510
|
+
// When a Handle exists, the Handle attaches them via context.
|
|
511
|
+
// dnd-kit drag attrs spread BEFORE {...rest} on Item (consumer rest wins).
|
|
512
|
+
// The Handle does the inverse: drag attrs after rest so they cannot be
|
|
513
|
+
// disabled. Item is more permissive — consumer may legitimately want to
|
|
514
|
+
// pre-empt drag on a per-item basis.
|
|
515
|
+
{...(hasHandle ? {} : listeners)}
|
|
516
|
+
{...(hasHandle ? {} : attributes)}
|
|
517
|
+
{...rest}
|
|
518
|
+
>
|
|
519
|
+
{children}
|
|
520
|
+
</li>
|
|
521
|
+
</SortableItemContext.Provider>
|
|
522
|
+
);
|
|
523
|
+
});
|
|
524
|
+
SortableItem.displayName = 'SortableItem';
|
|
525
|
+
|
|
526
|
+
/**
|
|
527
|
+
* Optional drag-origin marker inside a `<Sortable.Item>`; when present, only the Handle initiates drag.
|
|
528
|
+
* @see docs/components/Sortable.md
|
|
529
|
+
*/
|
|
530
|
+
export const SortableHandle = forwardRef<HTMLButtonElement, SortableHandleProps>(
|
|
531
|
+
function SortableHandle({ className, children, 'aria-label': ariaLabel, ...rest }, ref) {
|
|
532
|
+
const t = useTranslation();
|
|
533
|
+
const ctx = useContext(SortableItemContext);
|
|
534
|
+
if (!ctx) {
|
|
535
|
+
throw new Error('<Sortable.Handle> must be rendered inside a <Sortable.Item>.');
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
const setRef = (node: HTMLButtonElement | null) => {
|
|
539
|
+
ctx.setActivatorNodeRef(node);
|
|
540
|
+
if (typeof ref === 'function') ref(node);
|
|
541
|
+
else if (ref) ref.current = node;
|
|
542
|
+
};
|
|
543
|
+
|
|
544
|
+
return (
|
|
545
|
+
<button
|
|
546
|
+
ref={setRef}
|
|
547
|
+
type="button"
|
|
548
|
+
aria-label={ariaLabel || t('drag.handleLabel')}
|
|
549
|
+
className={clsx(styles.handle, className)}
|
|
550
|
+
{...rest}
|
|
551
|
+
// {...listeners} + {...attributes} AFTER {...rest} so consumer spread
|
|
552
|
+
// cannot disable drag detection. data-sortable-handle is a structural
|
|
553
|
+
// marker for tests / styling.
|
|
554
|
+
data-sortable-handle="true"
|
|
555
|
+
{...ctx.listeners}
|
|
556
|
+
{...ctx.attributes}
|
|
557
|
+
>
|
|
558
|
+
<span aria-hidden="true">{children}</span>
|
|
559
|
+
</button>
|
|
560
|
+
);
|
|
561
|
+
},
|
|
562
|
+
);
|
|
563
|
+
SortableHandle.displayName = 'SortableHandle';
|
|
564
|
+
|
|
565
|
+
/**
|
|
566
|
+
* Drag-to-reorder list (single column) with `Sortable.Item` and `Sortable.Handle`, in list or grid arrangement.
|
|
567
|
+
* @see docs/components/Sortable.md
|
|
568
|
+
*/
|
|
569
|
+
export const Sortable = Object.assign(SortableRoot, {
|
|
570
|
+
Item: SortableItem,
|
|
571
|
+
Handle: SortableHandle,
|
|
572
|
+
});
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
// Container-aware collision detection for multi-container sortable boards
|
|
2
|
+
// (Kanban, SortableGroup). Pure function so it's unit-testable with synthetic
|
|
3
|
+
// rects; imported by both components' DndContexts.
|
|
4
|
+
import {
|
|
5
|
+
closestCorners,
|
|
6
|
+
pointerWithin,
|
|
7
|
+
type CollisionDetection,
|
|
8
|
+
type DroppableContainer,
|
|
9
|
+
} from '@dnd-kit/core';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* A CONTAINER droppable (a `<Kanban.Column>` / `<SortableGroup.Group>`) as
|
|
13
|
+
* opposed to an ITEM droppable (a card). Containers register via plain
|
|
14
|
+
* `useDroppable`, so they carry no `data.sortable`; items register via
|
|
15
|
+
* `useSortable`, which adds it.
|
|
16
|
+
*/
|
|
17
|
+
const isContainer = (droppable: DroppableContainer) => droppable.data.current?.sortable == null;
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* `closestCorners`, but the pointer's containing container wins first.
|
|
21
|
+
*
|
|
22
|
+
* Why: with plain `closestCorners`, every card registers as a droppable
|
|
23
|
+
* alongside the column containers, and ranking is by corner distance of the
|
|
24
|
+
* DRAGGED RECT — not by where the pointer is. Next to a tall column, an
|
|
25
|
+
* empty/sparse sibling column stretches (flex align-items: stretch) far
|
|
26
|
+
* beyond its content, so its corners sit hundreds of pixels from the dragged
|
|
27
|
+
* card while a same-Y card in the SOURCE column sits one column-gap away.
|
|
28
|
+
* The source card out-ranks the geometrically-containing target column, the
|
|
29
|
+
* cross-column transit is never detected, and the drop silently resolves as
|
|
30
|
+
* a same-column no-op (#367).
|
|
31
|
+
*
|
|
32
|
+
* Strategy:
|
|
33
|
+
* 1. No pointer (keyboard drags pass `pointerCoordinates: null`) → plain
|
|
34
|
+
* `closestCorners` over everything — keyboard behavior unchanged.
|
|
35
|
+
* 2. Find the container droppable the pointer is inside (`pointerWithin`
|
|
36
|
+
* over containers only). Containers are droppables registered via plain
|
|
37
|
+
* `useDroppable` — they carry no `data.sortable`; card/item droppables
|
|
38
|
+
* registered via `useSortable` do.
|
|
39
|
+
* 3. Pointer inside a container → rank with `closestCorners` restricted to
|
|
40
|
+
* that container plus the droppables whose center lies inside it (its own
|
|
41
|
+
* cards). An empty column is its only candidate, so it wins; over a card,
|
|
42
|
+
* the card wins; below the last card, the nearest of card/column wins —
|
|
43
|
+
* both resolve to "append" downstream.
|
|
44
|
+
* 4. Pointer in no container (board gap / outside) → plain `closestCorners`.
|
|
45
|
+
*/
|
|
46
|
+
export const containerAwareClosestCorners: CollisionDetection = (args) => {
|
|
47
|
+
const { droppableContainers, droppableRects, pointerCoordinates } = args;
|
|
48
|
+
if (!pointerCoordinates) return closestCorners(args);
|
|
49
|
+
|
|
50
|
+
const containers = droppableContainers.filter(isContainer);
|
|
51
|
+
const within = pointerWithin({ ...args, droppableContainers: containers });
|
|
52
|
+
const containerId = within[0]?.id;
|
|
53
|
+
const containerRect = containerId != null ? droppableRects.get(containerId) : undefined;
|
|
54
|
+
if (containerId == null || !containerRect) return closestCorners(args);
|
|
55
|
+
|
|
56
|
+
const candidates = droppableContainers.filter((d) => {
|
|
57
|
+
if (d.id === containerId) return true;
|
|
58
|
+
const rect = droppableRects.get(d.id);
|
|
59
|
+
if (!rect) return false;
|
|
60
|
+
const cx = rect.left + rect.width / 2;
|
|
61
|
+
const cy = rect.top + rect.height / 2;
|
|
62
|
+
return (
|
|
63
|
+
cx >= containerRect.left &&
|
|
64
|
+
cx <= containerRect.right &&
|
|
65
|
+
cy >= containerRect.top &&
|
|
66
|
+
cy <= containerRect.bottom
|
|
67
|
+
);
|
|
68
|
+
});
|
|
69
|
+
return closestCorners({ ...args, droppableContainers: candidates });
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* True when the pointer sits outside the collective bounding box of every
|
|
74
|
+
* CONTAINER droppable — i.e. the drag is over unrelated page content rather
|
|
75
|
+
* than over the board. Callers use it to reject a drop that collision
|
|
76
|
+
* detection nonetheless resolved to a container (#387).
|
|
77
|
+
*
|
|
78
|
+
* It has to be asked separately because no collision detector can answer it:
|
|
79
|
+
* `closestCorners` — which `containerAwareClosestCorners` falls back to
|
|
80
|
+
* whenever the pointer is in no container — pushes a collision for EVERY
|
|
81
|
+
* measured droppable and uses distance only to rank them, never to reject. So
|
|
82
|
+
* `over` is never null, and "released nowhere" is indistinguishable from
|
|
83
|
+
* "released on the nearest column" from the drop handler's side.
|
|
84
|
+
*
|
|
85
|
+
* Collective bounding box, not each container's own rect: a board with a `gap`
|
|
86
|
+
* between columns has pointer positions inside the board but inside no column.
|
|
87
|
+
* Per-rect testing would cancel those, and a release in a 12px gutter means the
|
|
88
|
+
* column beside it — which is exactly what `closestCorners` returns. Only
|
|
89
|
+
* leaving the band of columns entirely is a cancel. Containers only (never the
|
|
90
|
+
* cards') so a pointer in a sparse column's empty space stays a valid drop,
|
|
91
|
+
* which is the whole point of #367.
|
|
92
|
+
*
|
|
93
|
+
* Returns false whenever it cannot tell — no pointer (keyboard drags pass
|
|
94
|
+
* `pointerCoordinates: null`) or nothing measured (jsdom lays nothing out) —
|
|
95
|
+
* so an unmeasurable board keeps committing to the nearest container instead of
|
|
96
|
+
* cancelling every drop.
|
|
97
|
+
*/
|
|
98
|
+
export function isPointerOutsideContainers({
|
|
99
|
+
droppableContainers,
|
|
100
|
+
droppableRects,
|
|
101
|
+
pointerCoordinates,
|
|
102
|
+
}: Pick<
|
|
103
|
+
Parameters<CollisionDetection>[0],
|
|
104
|
+
'droppableContainers' | 'droppableRects' | 'pointerCoordinates'
|
|
105
|
+
>): boolean {
|
|
106
|
+
if (!pointerCoordinates) return false;
|
|
107
|
+
|
|
108
|
+
let left = Infinity;
|
|
109
|
+
let top = Infinity;
|
|
110
|
+
let right = -Infinity;
|
|
111
|
+
let bottom = -Infinity;
|
|
112
|
+
for (const droppable of droppableContainers) {
|
|
113
|
+
if (!isContainer(droppable)) continue;
|
|
114
|
+
const rect = droppableRects.get(droppable.id);
|
|
115
|
+
if (!rect) continue;
|
|
116
|
+
left = Math.min(left, rect.left);
|
|
117
|
+
top = Math.min(top, rect.top);
|
|
118
|
+
right = Math.max(right, rect.right);
|
|
119
|
+
bottom = Math.max(bottom, rect.bottom);
|
|
120
|
+
}
|
|
121
|
+
if (left === Infinity) return false;
|
|
122
|
+
|
|
123
|
+
const { x, y } = pointerCoordinates;
|
|
124
|
+
return x < left || x > right || y < top || y > bottom;
|
|
125
|
+
}
|