@eocrm/design-system 0.0.0-stage → 0.6.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AI-PRIMER.md +341 -0
- package/LICENSE +202 -0
- package/README.md +266 -2
- package/docs/components/Accordion.md +114 -0
- package/docs/components/AgentAvatar.md +58 -0
- package/docs/components/Alert.md +81 -0
- package/docs/components/AppLayout.md +70 -0
- package/docs/components/Avatar.md +49 -0
- package/docs/components/AvatarGroup.md +47 -0
- package/docs/components/Badge.md +60 -0
- package/docs/components/Banner.md +89 -0
- package/docs/components/BrandIcon.md +32 -0
- package/docs/components/Breadcrumb.md +72 -0
- package/docs/components/Button.md +107 -0
- package/docs/components/ButtonGroup.md +78 -0
- package/docs/components/Calendar.md +158 -0
- package/docs/components/Card.md +165 -0
- package/docs/components/CatalogPicker.md +83 -0
- package/docs/components/Chart.md +114 -0
- package/docs/components/ChatBubble.md +55 -0
- package/docs/components/ChatLauncher.md +97 -0
- package/docs/components/Checkbox.md +55 -0
- package/docs/components/CircularProgress.md +53 -0
- package/docs/components/Cluster.md +96 -0
- package/docs/components/Code.md +35 -0
- package/docs/components/CodeBlock.md +67 -0
- package/docs/components/ColorPicker.md +115 -0
- package/docs/components/ConfirmationPopover.md +70 -0
- package/docs/components/Constrain.md +39 -0
- package/docs/components/CurrencySelect.md +57 -0
- package/docs/components/CursorPagination.md +43 -0
- package/docs/components/DashboardCanvas.md +79 -0
- package/docs/components/DashboardWidget.md +131 -0
- package/docs/components/DataTable.md +88 -0
- package/docs/components/DatePicker.md +68 -0
- package/docs/components/DateRangePicker.md +71 -0
- package/docs/components/DateStrip.md +56 -0
- package/docs/components/DefinitionList.md +82 -0
- package/docs/components/Divider.md +57 -0
- package/docs/components/Dot.md +26 -0
- package/docs/components/Drawer.md +94 -0
- package/docs/components/DropdownMenu.md +299 -0
- package/docs/components/EmojiPicker.md +84 -0
- package/docs/components/EmptyState.md +55 -0
- package/docs/components/EntityChip.md +102 -0
- package/docs/components/ErrorState.md +72 -0
- package/docs/components/Field.md +91 -0
- package/docs/components/FileUpload.md +109 -0
- package/docs/components/FilterChip.md +88 -0
- package/docs/components/FlowCanvas.md +108 -0
- package/docs/components/FormRow.md +31 -0
- package/docs/components/FormSection.md +37 -0
- package/docs/components/Grid.md +103 -0
- package/docs/components/Highlight.md +75 -0
- package/docs/components/HighlightedText.md +50 -0
- package/docs/components/IconPicker.md +134 -0
- package/docs/components/IconTile.md +30 -0
- package/docs/components/Image.md +84 -0
- package/docs/components/ImageCrop.md +163 -0
- package/docs/components/Indent.md +31 -0
- package/docs/components/InlineDatePicker.md +58 -0
- package/docs/components/InlineDateRangePicker.md +57 -0
- package/docs/components/Input.md +54 -0
- package/docs/components/Kanban.md +122 -0
- package/docs/components/Kbd.md +41 -0
- package/docs/components/Lightbox.md +105 -0
- package/docs/components/Link.md +65 -0
- package/docs/components/LinkCard.md +41 -0
- package/docs/components/LiquidEditor.md +84 -0
- package/docs/components/List.md +68 -0
- package/docs/components/LiveRegion.md +29 -0
- package/docs/components/LocaleProvider.md +25 -0
- package/docs/components/Logo.md +41 -0
- package/docs/components/Masonry.md +48 -0
- package/docs/components/MediaTile.md +95 -0
- package/docs/components/Modal.md +107 -0
- package/docs/components/MoneyInput.md +62 -0
- package/docs/components/OptionsPicker.md +123 -0
- package/docs/components/OtpInput.md +65 -0
- package/docs/components/Page.md +35 -0
- package/docs/components/PageHeader.md +133 -0
- package/docs/components/Pagination.md +44 -0
- package/docs/components/Palette.md +32 -0
- package/docs/components/PasswordInput.md +45 -0
- package/docs/components/PasswordStrengthMeter.md +27 -0
- package/docs/components/PersonDisplay.md +153 -0
- package/docs/components/PhoneInput.md +54 -0
- package/docs/components/PillMenu.md +91 -0
- package/docs/components/Popover.md +127 -0
- package/docs/components/Progress.md +56 -0
- package/docs/components/QrCode.md +34 -0
- package/docs/components/Radio.md +37 -0
- package/docs/components/RadioGroup.md +56 -0
- package/docs/components/Rail.md +191 -0
- package/docs/components/RelativeDateInput.md +114 -0
- package/docs/components/RichText.md +44 -0
- package/docs/components/RichTextEditor.md +112 -0
- package/docs/components/Screen.md +37 -0
- package/docs/components/ScrollArea.md +39 -0
- package/docs/components/Select.md +131 -0
- package/docs/components/SettingRow.md +98 -0
- package/docs/components/Skeleton.md +68 -0
- package/docs/components/Slider.md +92 -0
- package/docs/components/SlotGrid.md +55 -0
- package/docs/components/SocialButton.md +31 -0
- package/docs/components/Sortable.md +127 -0
- package/docs/components/SortableGroup.md +52 -0
- package/docs/components/Sparkline.md +51 -0
- package/docs/components/Split.md +76 -0
- package/docs/components/Stack.md +59 -0
- package/docs/components/StagePath.md +66 -0
- package/docs/components/StatGroup.md +61 -0
- package/docs/components/StatTile.md +58 -0
- package/docs/components/Sticky.md +69 -0
- package/docs/components/Switch.md +89 -0
- package/docs/components/Table.md +184 -0
- package/docs/components/TableOfContents.md +76 -0
- package/docs/components/Tabs.md +94 -0
- package/docs/components/Text.md +63 -0
- package/docs/components/Textarea.md +59 -0
- package/docs/components/Thread.md +52 -0
- package/docs/components/TimeField.md +70 -0
- package/docs/components/Timeline.md +57 -0
- package/docs/components/Title.md +54 -0
- package/docs/components/ToastViewport.md +61 -0
- package/docs/components/Tooltip.md +63 -0
- package/docs/components/TopBar.md +214 -0
- package/docs/components/Tour.md +85 -0
- package/docs/components/TreeView.md +113 -0
- package/docs/components/VisuallyHidden.md +43 -0
- package/docs/components/WidgetPreview.md +54 -0
- package/docs/components/useBelowBreakpoint.md +11 -0
- package/docs/components/useMonth.md +18 -0
- package/docs/setup.md +51 -0
- package/docs/theming.md +95 -0
- package/docs/tokens.md +123 -0
- package/docs/transient-state.md +56 -0
- package/package.json +86 -4
- package/src/_meta/manifest.ts +293 -0
- package/src/app/AppProvider.tsx +78 -0
- package/src/app/index.ts +3 -0
- package/src/app/themeTokens.ts +95 -0
- package/src/calendar/dateMath.ts +114 -0
- package/src/calendar/formatters.ts +75 -0
- package/src/calendar/index.ts +39 -0
- package/src/calendar/types.ts +36 -0
- package/src/calendar/useAgenda.ts +70 -0
- package/src/calendar/useDay.ts +51 -0
- package/src/calendar/useMonth.ts +82 -0
- package/src/calendar/useWeek.ts +62 -0
- package/src/calendar/weekInfo.ts +83 -0
- package/src/components/Accordion/Accordion.module.scss +304 -0
- package/src/components/Accordion/Accordion.tokens.scss +64 -0
- package/src/components/Accordion/Accordion.tsx +272 -0
- package/src/components/Accordion/AccordionContent.tsx +36 -0
- package/src/components/Accordion/AccordionItem.tsx +66 -0
- package/src/components/Accordion/AccordionTrigger.tsx +121 -0
- package/src/components/Accordion/context.ts +47 -0
- package/src/components/Accordion/index.ts +14 -0
- package/src/components/Alert/Alert.module.scss +92 -0
- package/src/components/Alert/Alert.tokens.scss +60 -0
- package/src/components/Alert/Alert.tsx +136 -0
- package/src/components/Alert/index.ts +2 -0
- package/src/components/AppLayout/AppLayout.module.scss +130 -0
- package/src/components/AppLayout/AppLayout.tokens.scss +27 -0
- package/src/components/AppLayout/AppLayout.tsx +211 -0
- package/src/components/AppLayout/index.ts +2 -0
- package/src/components/Avatar/AgentAvatar.module.scss +117 -0
- package/src/components/Avatar/AgentAvatar.tsx +122 -0
- package/src/components/Avatar/Avatar.module.scss +181 -0
- package/src/components/Avatar/Avatar.tokens.scss +107 -0
- package/src/components/Avatar/Avatar.tsx +210 -0
- package/src/components/Avatar/AvatarGroup.module.scss +128 -0
- package/src/components/Avatar/AvatarGroup.tsx +119 -0
- package/src/components/Avatar/AvatarGroupContext.tsx +20 -0
- package/src/components/Avatar/index.ts +6 -0
- package/src/components/Badge/Badge.module.scss +124 -0
- package/src/components/Badge/Badge.tokens.scss +74 -0
- package/src/components/Badge/Badge.tsx +164 -0
- package/src/components/Badge/index.ts +2 -0
- package/src/components/Banner/Banner.module.scss +73 -0
- package/src/components/Banner/Banner.tokens.scss +51 -0
- package/src/components/Banner/Banner.tsx +138 -0
- package/src/components/Banner/index.ts +2 -0
- package/src/components/BrandIcon/BrandIcon.module.scss +5 -0
- package/src/components/BrandIcon/BrandIcon.tsx +99 -0
- package/src/components/BrandIcon/index.ts +2 -0
- package/src/components/Breadcrumb/Breadcrumb.module.scss +32 -0
- package/src/components/Breadcrumb/Breadcrumb.tokens.scss +9 -0
- package/src/components/Breadcrumb/Breadcrumb.tsx +146 -0
- package/src/components/Breadcrumb/index.ts +2 -0
- package/src/components/Button/Button.module.scss +167 -0
- package/src/components/Button/Button.tokens.scss +90 -0
- package/src/components/Button/Button.tsx +205 -0
- package/src/components/Button/index.ts +2 -0
- package/src/components/ButtonGroup/ButtonGroup.module.scss +134 -0
- package/src/components/ButtonGroup/ButtonGroup.tokens.scss +42 -0
- package/src/components/ButtonGroup/ButtonGroup.tsx +278 -0
- package/src/components/ButtonGroup/ButtonGroupItem.tsx +74 -0
- package/src/components/ButtonGroup/context.ts +45 -0
- package/src/components/ButtonGroup/index.ts +2 -0
- package/src/components/Calendar/AgendaView.module.scss +231 -0
- package/src/components/Calendar/AgendaView.tsx +214 -0
- package/src/components/Calendar/AllDayBand.module.scss +18 -0
- package/src/components/Calendar/AllDayBand.tsx +75 -0
- package/src/components/Calendar/Calendar.module.scss +23 -0
- package/src/components/Calendar/Calendar.tokens.scss +262 -0
- package/src/components/Calendar/Calendar.tsx +370 -0
- package/src/components/Calendar/DayCell.module.scss +30 -0
- package/src/components/Calendar/DayCell.tsx +50 -0
- package/src/components/Calendar/DayView.module.scss +10 -0
- package/src/components/Calendar/DayView.tsx +163 -0
- package/src/components/Calendar/EventChip.module.scss +171 -0
- package/src/components/Calendar/EventChip.tsx +115 -0
- package/src/components/Calendar/HourGrid.module.scss +123 -0
- package/src/components/Calendar/HourGrid.tsx +381 -0
- package/src/components/Calendar/MonthView.module.scss +99 -0
- package/src/components/Calendar/MonthView.tsx +296 -0
- package/src/components/Calendar/TimedEvent.module.scss +205 -0
- package/src/components/Calendar/TimedEvent.tsx +247 -0
- package/src/components/Calendar/ViewSwitcher.module.scss +3 -0
- package/src/components/Calendar/ViewSwitcher.tsx +47 -0
- package/src/components/Calendar/WeekView.module.scss +10 -0
- package/src/components/Calendar/WeekView.tsx +137 -0
- package/src/components/Calendar/eventColor.ts +60 -0
- package/src/components/Calendar/index.ts +18 -0
- package/src/components/Calendar/types.ts +451 -0
- package/src/components/Calendar/useEventDrag.ts +783 -0
- package/src/components/Calendar/utils.ts +622 -0
- package/src/components/Card/Card.module.scss +264 -0
- package/src/components/Card/Card.tokens.scss +55 -0
- package/src/components/Card/Card.tsx +170 -0
- package/src/components/Card/CardBody.tsx +45 -0
- package/src/components/Card/CardHeader.tsx +113 -0
- package/src/components/Card/CardList.tsx +24 -0
- package/src/components/Card/CardListRow.tsx +24 -0
- package/src/components/Card/index.ts +7 -0
- package/src/components/CatalogPicker/CatalogPicker.module.scss +193 -0
- package/src/components/CatalogPicker/CatalogPicker.tokens.scss +26 -0
- package/src/components/CatalogPicker/CatalogPicker.tsx +339 -0
- package/src/components/CatalogPicker/index.ts +2 -0
- package/src/components/Chart/Chart.module.scss +287 -0
- package/src/components/Chart/Chart.tokens.scss +63 -0
- package/src/components/Chart/Chart.tsx +607 -0
- package/src/components/Chart/ChartLegend.tsx +99 -0
- package/src/components/Chart/ChartTable.tsx +62 -0
- package/src/components/Chart/ChartTooltip.tsx +91 -0
- package/src/components/Chart/chartModel.ts +689 -0
- package/src/components/Chart/index.ts +2 -0
- package/src/components/ChatBubble/ChatBubble.module.scss +93 -0
- package/src/components/ChatBubble/ChatBubble.tokens.scss +17 -0
- package/src/components/ChatBubble/ChatBubble.tsx +61 -0
- package/src/components/ChatBubble/ChatBubbleList.tsx +27 -0
- package/src/components/ChatBubble/index.ts +3 -0
- package/src/components/ChatLauncher/ChatLauncher.module.scss +68 -0
- package/src/components/ChatLauncher/ChatLauncher.tokens.scss +27 -0
- package/src/components/ChatLauncher/ChatLauncher.tsx +202 -0
- package/src/components/ChatLauncher/index.ts +2 -0
- package/src/components/ChatLauncher/isAtBottom.ts +12 -0
- package/src/components/Checkbox/Checkbox.module.scss +147 -0
- package/src/components/Checkbox/Checkbox.tokens.scss +44 -0
- package/src/components/Checkbox/Checkbox.tsx +188 -0
- package/src/components/Checkbox/index.ts +2 -0
- package/src/components/CircularProgress/CircularProgress.module.scss +133 -0
- package/src/components/CircularProgress/CircularProgress.tokens.scss +40 -0
- package/src/components/CircularProgress/CircularProgress.tsx +139 -0
- package/src/components/CircularProgress/index.ts +7 -0
- package/src/components/Cluster/Cluster.module.scss +145 -0
- package/src/components/Cluster/Cluster.tokens.scss +11 -0
- package/src/components/Cluster/Cluster.tsx +215 -0
- package/src/components/Cluster/index.ts +2 -0
- package/src/components/Code/Code.module.scss +28 -0
- package/src/components/Code/Code.tokens.scss +15 -0
- package/src/components/Code/Code.tsx +44 -0
- package/src/components/Code/index.ts +2 -0
- package/src/components/CodeBlock/CodeBlock.module.scss +146 -0
- package/src/components/CodeBlock/CodeBlock.tokens.scss +27 -0
- package/src/components/CodeBlock/CodeBlock.tsx +274 -0
- package/src/components/CodeBlock/highlight.ts +179 -0
- package/src/components/CodeBlock/index.ts +8 -0
- package/src/components/CodeBlock/sampleSync.ts +42 -0
- package/src/components/ColorPicker/ColorPicker.module.scss +286 -0
- package/src/components/ColorPicker/ColorPicker.tokens.scss +60 -0
- package/src/components/ColorPicker/ColorPicker.tsx +367 -0
- package/src/components/ColorPicker/ColorPickerPanel.tsx +265 -0
- package/src/components/ColorPicker/SVSquare.tsx +189 -0
- package/src/components/ColorPicker/colorMath.ts +141 -0
- package/src/components/ColorPicker/index.ts +6 -0
- package/src/components/ConfirmationPopover/ConfirmationPopover.module.scss +39 -0
- package/src/components/ConfirmationPopover/ConfirmationPopover.tokens.scss +13 -0
- package/src/components/ConfirmationPopover/ConfirmationPopover.tsx +395 -0
- package/src/components/ConfirmationPopover/index.ts +2 -0
- package/src/components/Constrain/Constrain.module.scss +99 -0
- package/src/components/Constrain/Constrain.tsx +79 -0
- package/src/components/Constrain/index.ts +2 -0
- package/src/components/CurrencySelect/CurrencySelect.module.scss +7 -0
- package/src/components/CurrencySelect/CurrencySelect.tsx +167 -0
- package/src/components/CurrencySelect/index.ts +3 -0
- package/src/components/CursorPagination/CursorPagination.module.scss +69 -0
- package/src/components/CursorPagination/CursorPagination.tokens.scss +32 -0
- package/src/components/CursorPagination/CursorPagination.tsx +121 -0
- package/src/components/CursorPagination/index.ts +2 -0
- package/src/components/DashboardCanvas/DashboardCanvas.module.scss +360 -0
- package/src/components/DashboardCanvas/DashboardCanvas.tokens.scss +48 -0
- package/src/components/DashboardCanvas/DashboardCanvas.tsx +1270 -0
- package/src/components/DashboardCanvas/DashboardCanvasItem.tsx +140 -0
- package/src/components/DashboardCanvas/DashboardCanvasSection.tsx +174 -0
- package/src/components/DashboardCanvas/engine.ts +363 -0
- package/src/components/DashboardCanvas/index.ts +9 -0
- package/src/components/DashboardWidget/DashboardWidget.module.scss +100 -0
- package/src/components/DashboardWidget/DashboardWidget.tokens.scss +16 -0
- package/src/components/DashboardWidget/DashboardWidget.tsx +188 -0
- package/src/components/DashboardWidget/index.ts +7 -0
- package/src/components/DataTable/BodyRow.tsx +197 -0
- package/src/components/DataTable/ColumnVisibilityTrigger.module.scss +7 -0
- package/src/components/DataTable/ColumnVisibilityTrigger.tsx +105 -0
- package/src/components/DataTable/DataTable.module.scss +511 -0
- package/src/components/DataTable/DataTable.tokens.scss +80 -0
- package/src/components/DataTable/DataTable.tsx +734 -0
- package/src/components/DataTable/HeaderCell.module.scss +215 -0
- package/src/components/DataTable/HeaderCell.tsx +440 -0
- package/src/components/DataTable/columnShift.ts +117 -0
- package/src/components/DataTable/index.ts +23 -0
- package/src/components/DataTable/pinStyle.ts +47 -0
- package/src/components/DataTable/reorderColumns.ts +66 -0
- package/src/components/DataTable/types.ts +289 -0
- package/src/components/DataTable/useColumnDragShift.ts +216 -0
- package/src/components/DataTable/useDataTable.ts +372 -0
- package/src/components/DataTable/useResizeHandle.ts +97 -0
- package/src/components/DatePicker/DatePicker.module.scss +180 -0
- package/src/components/DatePicker/DatePicker.tokens.scss +152 -0
- package/src/components/DatePicker/DatePicker.tsx +664 -0
- package/src/components/DatePicker/DatePickerGrid.module.scss +172 -0
- package/src/components/DatePicker/DatePickerGrid.tsx +341 -0
- package/src/components/DatePicker/InlineDatePicker.module.scss +32 -0
- package/src/components/DatePicker/InlineDatePicker.tsx +201 -0
- package/src/components/DatePicker/index.ts +4 -0
- package/src/components/DatePicker/utils.ts +364 -0
- package/src/components/DateRangePicker/DateRangePicker.module.scss +237 -0
- package/src/components/DateRangePicker/DateRangePicker.tokens.scss +78 -0
- package/src/components/DateRangePicker/DateRangePicker.tsx +720 -0
- package/src/components/DateRangePicker/InlineDateRangePicker.module.scss +94 -0
- package/src/components/DateRangePicker/InlineDateRangePicker.tsx +376 -0
- package/src/components/DateRangePicker/index.ts +5 -0
- package/src/components/DateRangePicker/utils.ts +151 -0
- package/src/components/DateStrip/DateStrip.module.scss +78 -0
- package/src/components/DateStrip/DateStrip.tokens.scss +23 -0
- package/src/components/DateStrip/DateStrip.tsx +205 -0
- package/src/components/DateStrip/index.ts +2 -0
- package/src/components/DefinitionList/DefinitionList.module.scss +102 -0
- package/src/components/DefinitionList/DefinitionList.tokens.scss +29 -0
- package/src/components/DefinitionList/DefinitionList.tsx +198 -0
- package/src/components/DefinitionList/index.ts +9 -0
- package/src/components/Divider/Divider.module.scss +144 -0
- package/src/components/Divider/Divider.tokens.scss +21 -0
- package/src/components/Divider/Divider.tsx +103 -0
- package/src/components/Divider/index.ts +2 -0
- package/src/components/Dot/Dot.module.scss +40 -0
- package/src/components/Dot/Dot.tokens.scss +4 -0
- package/src/components/Dot/Dot.tsx +45 -0
- package/src/components/Dot/index.ts +2 -0
- package/src/components/Drawer/Body.tsx +23 -0
- package/src/components/Drawer/Close.tsx +35 -0
- package/src/components/Drawer/Content.tsx +93 -0
- package/src/components/Drawer/Drawer.module.scss +232 -0
- package/src/components/Drawer/Drawer.tokens.scss +38 -0
- package/src/components/Drawer/Drawer.tsx +23 -0
- package/src/components/Drawer/DrawerRoot.tsx +190 -0
- package/src/components/Drawer/Footer.tsx +24 -0
- package/src/components/Drawer/Header.tsx +64 -0
- package/src/components/Drawer/Overlay.tsx +82 -0
- package/src/components/Drawer/context.ts +44 -0
- package/src/components/Drawer/index.ts +12 -0
- package/src/components/Drawer/useDragToClose.ts +149 -0
- package/src/components/DropdownMenu/CheckboxItem.tsx +144 -0
- package/src/components/DropdownMenu/Content.tsx +419 -0
- package/src/components/DropdownMenu/DropdownMenu.module.scss +280 -0
- package/src/components/DropdownMenu/DropdownMenu.tokens.scss +88 -0
- package/src/components/DropdownMenu/DropdownMenu.tsx +43 -0
- package/src/components/DropdownMenu/Group.tsx +76 -0
- package/src/components/DropdownMenu/Item.tsx +148 -0
- package/src/components/DropdownMenu/ItemIndicator.tsx +30 -0
- package/src/components/DropdownMenu/Radio.tsx +178 -0
- package/src/components/DropdownMenu/Root.tsx +100 -0
- package/src/components/DropdownMenu/Sub.tsx +332 -0
- package/src/components/DropdownMenu/Trigger.tsx +76 -0
- package/src/components/DropdownMenu/context.ts +65 -0
- package/src/components/DropdownMenu/index.ts +20 -0
- package/src/components/EmojiPicker/EmojiPicker.module.scss +84 -0
- package/src/components/EmojiPicker/EmojiPicker.tokens.scss +24 -0
- package/src/components/EmojiPicker/EmojiPicker.tsx +341 -0
- package/src/components/EmojiPicker/emojiData.ts +245 -0
- package/src/components/EmojiPicker/index.ts +3 -0
- package/src/components/EmptyState/EmptyState.module.scss +102 -0
- package/src/components/EmptyState/EmptyState.tokens.scss +28 -0
- package/src/components/EmptyState/EmptyState.tsx +112 -0
- package/src/components/EmptyState/index.ts +7 -0
- package/src/components/EntityChip/EntityChip.module.scss +275 -0
- package/src/components/EntityChip/EntityChip.tokens.scss +66 -0
- package/src/components/EntityChip/EntityChip.tsx +649 -0
- package/src/components/EntityChip/index.ts +10 -0
- package/src/components/ErrorState/ErrorState.module.scss +105 -0
- package/src/components/ErrorState/ErrorState.tokens.scss +32 -0
- package/src/components/ErrorState/ErrorState.tsx +125 -0
- package/src/components/ErrorState/index.ts +8 -0
- package/src/components/Field/Field.module.scss +46 -0
- package/src/components/Field/Field.tsx +185 -0
- package/src/components/Field/index.ts +2 -0
- package/src/components/FileUpload/FileUpload.module.scss +187 -0
- package/src/components/FileUpload/FileUpload.tokens.scss +81 -0
- package/src/components/FileUpload/FileUpload.tsx +569 -0
- package/src/components/FileUpload/formatBytes.ts +34 -0
- package/src/components/FileUpload/iconForFile.ts +40 -0
- package/src/components/FileUpload/index.ts +2 -0
- package/src/components/FilterChip/FilterChip.module.scss +61 -0
- package/src/components/FilterChip/FilterChip.tokens.scss +25 -0
- package/src/components/FilterChip/FilterChip.tsx +208 -0
- package/src/components/FilterChip/index.ts +5 -0
- package/src/components/FlowCanvas/FlowCanvas.module.scss +329 -0
- package/src/components/FlowCanvas/FlowCanvas.tokens.scss +45 -0
- package/src/components/FlowCanvas/FlowCanvas.tsx +1867 -0
- package/src/components/FlowCanvas/FlowControls.tsx +46 -0
- package/src/components/FlowCanvas/FlowEdge.tsx +58 -0
- package/src/components/FlowCanvas/FlowNode.tsx +76 -0
- package/src/components/FlowCanvas/edgePath.ts +85 -0
- package/src/components/FlowCanvas/index.ts +4 -0
- package/src/components/FlowCanvas/layout.ts +148 -0
- package/src/components/FlowCanvas/spatialNav.ts +76 -0
- package/src/components/FlowCanvas/types.ts +59 -0
- package/src/components/FlowCanvas/useViewport.ts +122 -0
- package/src/components/FormRow/FormRow.module.scss +2 -0
- package/src/components/FormRow/FormRow.tsx +37 -0
- package/src/components/FormRow/index.ts +2 -0
- package/src/components/FormSection/FormSection.module.scss +24 -0
- package/src/components/FormSection/FormSection.tsx +46 -0
- package/src/components/FormSection/index.ts +2 -0
- package/src/components/Grid/Grid.module.scss +162 -0
- package/src/components/Grid/Grid.tokens.scss +13 -0
- package/src/components/Grid/Grid.tsx +226 -0
- package/src/components/Grid/GridItem.tsx +77 -0
- package/src/components/Grid/index.ts +11 -0
- package/src/components/Highlight/Highlight.module.scss +43 -0
- package/src/components/Highlight/Highlight.tokens.scss +35 -0
- package/src/components/Highlight/Highlight.tsx +164 -0
- package/src/components/Highlight/HighlightOverlay.tsx +100 -0
- package/src/components/Highlight/index.ts +2 -0
- package/src/components/HighlightedText/HighlightedText.module.scss +11 -0
- package/src/components/HighlightedText/HighlightedText.tokens.scss +9 -0
- package/src/components/HighlightedText/HighlightedText.tsx +50 -0
- package/src/components/HighlightedText/highlightRanges.ts +44 -0
- package/src/components/HighlightedText/index.ts +2 -0
- package/src/components/IconPicker/IconPicker.module.scss +175 -0
- package/src/components/IconPicker/IconPicker.tokens.scss +40 -0
- package/src/components/IconPicker/IconPicker.tsx +629 -0
- package/src/components/IconPicker/index.ts +9 -0
- package/src/components/IconTile/IconTile.module.scss +57 -0
- package/src/components/IconTile/IconTile.tokens.scss +16 -0
- package/src/components/IconTile/IconTile.tsx +91 -0
- package/src/components/IconTile/index.ts +2 -0
- package/src/components/Image/Image.module.scss +266 -0
- package/src/components/Image/Image.tokens.scss +55 -0
- package/src/components/Image/Image.tsx +342 -0
- package/src/components/Image/index.ts +2 -0
- package/src/components/ImageCrop/ImageCrop.module.scss +274 -0
- package/src/components/ImageCrop/ImageCrop.tokens.scss +33 -0
- package/src/components/ImageCrop/ImageCrop.tsx +542 -0
- package/src/components/ImageCrop/cropGeometry.ts +120 -0
- package/src/components/ImageCrop/extractCropBlob.ts +140 -0
- package/src/components/ImageCrop/index.ts +11 -0
- package/src/components/ImageCrop/useCropPreview.ts +161 -0
- package/src/components/Indent/Indent.module.scss +33 -0
- package/src/components/Indent/Indent.tokens.scss +10 -0
- package/src/components/Indent/Indent.tsx +46 -0
- package/src/components/Indent/index.ts +2 -0
- package/src/components/Input/Input.module.scss +99 -0
- package/src/components/Input/Input.tokens.scss +54 -0
- package/src/components/Input/Input.tsx +105 -0
- package/src/components/Input/Suggestions.tsx +260 -0
- package/src/components/Input/index.ts +2 -0
- package/src/components/Kanban/Kanban.module.scss +39 -0
- package/src/components/Kanban/Kanban.tokens.scss +15 -0
- package/src/components/Kanban/Kanban.tsx +951 -0
- package/src/components/Kanban/index.ts +7 -0
- package/src/components/Kbd/Kbd.module.scss +47 -0
- package/src/components/Kbd/Kbd.tokens.scss +26 -0
- package/src/components/Kbd/Kbd.tsx +73 -0
- package/src/components/Kbd/index.ts +2 -0
- package/src/components/Lightbox/Lightbox.module.scss +283 -0
- package/src/components/Lightbox/Lightbox.tokens.scss +36 -0
- package/src/components/Lightbox/Lightbox.tsx +506 -0
- package/src/components/Lightbox/index.ts +2 -0
- package/src/components/Link/Link.module.scss +78 -0
- package/src/components/Link/Link.tokens.scss +28 -0
- package/src/components/Link/Link.tsx +114 -0
- package/src/components/Link/index.ts +2 -0
- package/src/components/LinkCard/LinkCard.module.scss +92 -0
- package/src/components/LinkCard/LinkCard.tokens.scss +9 -0
- package/src/components/LinkCard/LinkCard.tsx +72 -0
- package/src/components/LinkCard/index.ts +2 -0
- package/src/components/LiquidEditor/AutocompleteMenu.tsx +133 -0
- package/src/components/LiquidEditor/HighlightLayer.tsx +53 -0
- package/src/components/LiquidEditor/InsertVariableMenu.tsx +81 -0
- package/src/components/LiquidEditor/LiquidEditor.module.scss +339 -0
- package/src/components/LiquidEditor/LiquidEditor.tokens.scss +81 -0
- package/src/components/LiquidEditor/LiquidEditor.tsx +412 -0
- package/src/components/LiquidEditor/PreviewPane.tsx +29 -0
- package/src/components/LiquidEditor/caretCoordinates.ts +97 -0
- package/src/components/LiquidEditor/index.ts +7 -0
- package/src/components/LiquidEditor/liquidFilters.ts +23 -0
- package/src/components/LiquidEditor/liquidTokenizer.ts +235 -0
- package/src/components/LiquidEditor/types.ts +101 -0
- package/src/components/LiquidEditor/useLiquidAutocomplete.ts +178 -0
- package/src/components/List/List.module.scss +105 -0
- package/src/components/List/List.tokens.scss +42 -0
- package/src/components/List/List.tsx +124 -0
- package/src/components/List/index.ts +9 -0
- package/src/components/LiveRegion/LiveRegion.module.scss +3 -0
- package/src/components/LiveRegion/LiveRegion.tsx +116 -0
- package/src/components/LiveRegion/index.ts +2 -0
- package/src/components/Logo/Logo.module.scss +139 -0
- package/src/components/Logo/Logo.tokens.scss +14 -0
- package/src/components/Logo/Logo.tsx +126 -0
- package/src/components/Logo/index.ts +2 -0
- package/src/components/Masonry/Masonry.module.scss +42 -0
- package/src/components/Masonry/Masonry.tokens.scss +8 -0
- package/src/components/Masonry/Masonry.tsx +136 -0
- package/src/components/Masonry/index.ts +2 -0
- package/src/components/Masonry/masonryUtils.ts +42 -0
- package/src/components/MediaTile/MediaTile.module.scss +183 -0
- package/src/components/MediaTile/MediaTile.tokens.scss +60 -0
- package/src/components/MediaTile/MediaTile.tsx +208 -0
- package/src/components/MediaTile/index.ts +8 -0
- package/src/components/Modal/Body.tsx +27 -0
- package/src/components/Modal/Close.tsx +45 -0
- package/src/components/Modal/Content.tsx +98 -0
- package/src/components/Modal/Footer.tsx +28 -0
- package/src/components/Modal/Header.tsx +51 -0
- package/src/components/Modal/Modal.module.scss +262 -0
- package/src/components/Modal/Modal.tokens.scss +50 -0
- package/src/components/Modal/Modal.tsx +23 -0
- package/src/components/Modal/ModalRoot.tsx +299 -0
- package/src/components/Modal/Overlay.tsx +101 -0
- package/src/components/Modal/context.ts +60 -0
- package/src/components/Modal/index.ts +11 -0
- package/src/components/MoneyInput/MoneyInput.module.scss +57 -0
- package/src/components/MoneyInput/MoneyInput.tsx +433 -0
- package/src/components/MoneyInput/index.ts +2 -0
- package/src/components/OptionsPicker/OptionsPicker.module.scss +216 -0
- package/src/components/OptionsPicker/OptionsPicker.tokens.scss +68 -0
- package/src/components/OptionsPicker/OptionsPicker.tsx +936 -0
- package/src/components/OptionsPicker/index.ts +9 -0
- package/src/components/OtpInput/OtpInput.module.scss +69 -0
- package/src/components/OtpInput/OtpInput.tokens.scss +45 -0
- package/src/components/OtpInput/OtpInput.tsx +368 -0
- package/src/components/OtpInput/index.ts +2 -0
- package/src/components/Page/Page.module.scss +30 -0
- package/src/components/Page/Page.tokens.scss +11 -0
- package/src/components/Page/Page.tsx +53 -0
- package/src/components/Page/index.ts +2 -0
- package/src/components/PageHeader/PageHeader.module.scss +197 -0
- package/src/components/PageHeader/PageHeader.tokens.scss +41 -0
- package/src/components/PageHeader/PageHeader.tsx +310 -0
- package/src/components/PageHeader/index.ts +20 -0
- package/src/components/Pagination/Pagination.module.scss +117 -0
- package/src/components/Pagination/Pagination.tokens.scss +54 -0
- package/src/components/Pagination/Pagination.tsx +165 -0
- package/src/components/Pagination/index.ts +4 -0
- package/src/components/Pagination/paginationRange.ts +72 -0
- package/src/components/PasswordInput/PasswordInput.module.scss +120 -0
- package/src/components/PasswordInput/PasswordInput.tokens.scss +44 -0
- package/src/components/PasswordInput/PasswordInput.tsx +210 -0
- package/src/components/PasswordInput/index.ts +2 -0
- package/src/components/PasswordStrengthMeter/PasswordStrengthMeter.module.scss +80 -0
- package/src/components/PasswordStrengthMeter/PasswordStrengthMeter.tokens.scss +40 -0
- package/src/components/PasswordStrengthMeter/PasswordStrengthMeter.tsx +96 -0
- package/src/components/PasswordStrengthMeter/index.ts +2 -0
- package/src/components/PersonDisplay/PersonDisplay.module.scss +180 -0
- package/src/components/PersonDisplay/PersonDisplay.tokens.scss +35 -0
- package/src/components/PersonDisplay/PersonDisplay.tsx +420 -0
- package/src/components/PersonDisplay/index.ts +10 -0
- package/src/components/PhoneInput/PhoneInput.module.scss +23 -0
- package/src/components/PhoneInput/PhoneInput.tsx +271 -0
- package/src/components/PhoneInput/index.ts +4 -0
- package/src/components/PhoneInput/phone.ts +128 -0
- package/src/components/PillMenu/PillMenu.module.scss +117 -0
- package/src/components/PillMenu/PillMenu.tokens.scss +22 -0
- package/src/components/PillMenu/PillMenu.tsx +324 -0
- package/src/components/PillMenu/index.ts +2 -0
- package/src/components/Popover/Anchor.tsx +37 -0
- package/src/components/Popover/Close.tsx +45 -0
- package/src/components/Popover/Content.tsx +213 -0
- package/src/components/Popover/Heading.tsx +33 -0
- package/src/components/Popover/Popover.module.scss +177 -0
- package/src/components/Popover/Popover.tokens.scss +22 -0
- package/src/components/Popover/Popover.tsx +23 -0
- package/src/components/Popover/PopoverRoot.tsx +75 -0
- package/src/components/Popover/Trigger.tsx +86 -0
- package/src/components/Popover/context.ts +22 -0
- package/src/components/Popover/index.ts +7 -0
- package/src/components/Progress/Progress.module.scss +110 -0
- package/src/components/Progress/Progress.tokens.scss +44 -0
- package/src/components/Progress/Progress.tsx +129 -0
- package/src/components/Progress/index.ts +2 -0
- package/src/components/QrCode/QrCode.module.scss +97 -0
- package/src/components/QrCode/QrCode.tokens.scss +17 -0
- package/src/components/QrCode/QrCode.tsx +233 -0
- package/src/components/QrCode/index.ts +2 -0
- package/src/components/QrCode/qr.ts +161 -0
- package/src/components/Radio/Radio.module.scss +175 -0
- package/src/components/Radio/Radio.tokens.scss +59 -0
- package/src/components/Radio/Radio.tsx +127 -0
- package/src/components/Radio/RadioGroup.module.scss +42 -0
- package/src/components/Radio/RadioGroup.tsx +120 -0
- package/src/components/Radio/RadioGroupContext.tsx +30 -0
- package/src/components/Radio/index.ts +4 -0
- package/src/components/Rail/Rail.module.scss +510 -0
- package/src/components/Rail/Rail.tokens.scss +92 -0
- package/src/components/Rail/Rail.tsx +287 -0
- package/src/components/Rail/RailCollapseToggle.tsx +57 -0
- package/src/components/Rail/RailFooter.tsx +17 -0
- package/src/components/Rail/RailGroup.tsx +728 -0
- package/src/components/Rail/RailGroupContext.ts +9 -0
- package/src/components/Rail/RailHeader.tsx +23 -0
- package/src/components/Rail/RailItem.tsx +119 -0
- package/src/components/Rail/RailSection.tsx +39 -0
- package/src/components/Rail/RailSpacer.tsx +19 -0
- package/src/components/Rail/index.ts +9 -0
- package/src/components/RelativeDateInput/RelativeDateInput.module.scss +15 -0
- package/src/components/RelativeDateInput/RelativeDateInput.tokens.scss +6 -0
- package/src/components/RelativeDateInput/RelativeDateInput.tsx +474 -0
- package/src/components/RelativeDateInput/index.ts +10 -0
- package/src/components/RelativeDateInput/relativeDate.ts +127 -0
- package/src/components/RichText/RichText.module.scss +5 -0
- package/src/components/RichText/RichText.tsx +70 -0
- package/src/components/RichText/RichTextAttachment.module.scss +82 -0
- package/src/components/RichText/RichTextAttachment.tsx +122 -0
- package/src/components/RichText/_prose.scss +79 -0
- package/src/components/RichText/attachmentIcon.tsx +24 -0
- package/src/components/RichText/engine/attachment.ts +154 -0
- package/src/components/RichText/engine/autolink.ts +64 -0
- package/src/components/RichText/engine/blockUnit.ts +174 -0
- package/src/components/RichText/engine/colorMarks.ts +85 -0
- package/src/components/RichText/engine/escape.ts +11 -0
- package/src/components/RichText/engine/fromHtml.ts +353 -0
- package/src/components/RichText/engine/fromMarkdown.ts +20 -0
- package/src/components/RichText/engine/inlines.ts +82 -0
- package/src/components/RichText/engine/listDepths.ts +32 -0
- package/src/components/RichText/engine/marks.ts +80 -0
- package/src/components/RichText/engine/mdToHtml.ts +178 -0
- package/src/components/RichText/engine/model.ts +157 -0
- package/src/components/RichText/engine/position.ts +118 -0
- package/src/components/RichText/engine/renderDoc.tsx +395 -0
- package/src/components/RichText/engine/renderLink.ts +15 -0
- package/src/components/RichText/engine/renderMention.ts +16 -0
- package/src/components/RichText/engine/safeHref.ts +22 -0
- package/src/components/RichText/engine/toHtml.ts +154 -0
- package/src/components/RichText/engine/toMarkdown.ts +97 -0
- package/src/components/RichText/engine/transforms.ts +434 -0
- package/src/components/RichText/imageMaxHeightStyle.ts +10 -0
- package/src/components/RichText/index.ts +31 -0
- package/src/components/RichTextEditor/RichTextAttachmentConfig.tsx +264 -0
- package/src/components/RichTextEditor/RichTextBlockControls.tsx +365 -0
- package/src/components/RichTextEditor/RichTextBlockMenu.tsx +162 -0
- package/src/components/RichTextEditor/RichTextColorMenu.tsx +115 -0
- package/src/components/RichTextEditor/RichTextEditor.module.scss +298 -0
- package/src/components/RichTextEditor/RichTextEditor.tsx +1910 -0
- package/src/components/RichTextEditor/RichTextImageResizer.tsx +131 -0
- package/src/components/RichTextEditor/RichTextLinkEditor.tsx +151 -0
- package/src/components/RichTextEditor/RichTextMentionMenu.tsx +99 -0
- package/src/components/RichTextEditor/RichTextToolbar.tsx +379 -0
- package/src/components/RichTextEditor/autolinkInput.ts +65 -0
- package/src/components/RichTextEditor/blockDrop.ts +9 -0
- package/src/components/RichTextEditor/blockReflow.ts +62 -0
- package/src/components/RichTextEditor/commands.ts +300 -0
- package/src/components/RichTextEditor/history.ts +93 -0
- package/src/components/RichTextEditor/icons.tsx +152 -0
- package/src/components/RichTextEditor/imageSize.ts +70 -0
- package/src/components/RichTextEditor/index.ts +5 -0
- package/src/components/RichTextEditor/input.ts +209 -0
- package/src/components/RichTextEditor/inputRules.ts +71 -0
- package/src/components/RichTextEditor/links.ts +103 -0
- package/src/components/RichTextEditor/mentionContext.ts +37 -0
- package/src/components/RichTextEditor/mentions.ts +28 -0
- package/src/components/RichTextEditor/preventSelectionLoss.ts +15 -0
- package/src/components/RichTextEditor/selection.ts +415 -0
- package/src/components/RichTextEditor/shortcuts.ts +44 -0
- package/src/components/RichTextEditor/useAnchoredFloating.ts +50 -0
- package/src/components/RichTextEditor/useAttachmentConfig.ts +134 -0
- package/src/components/RichTextEditor/useDismissOnOutsidePointerDown.ts +26 -0
- package/src/components/RichTextEditor/useLinkEditor.ts +107 -0
- package/src/components/RichTextEditor/useMention.ts +226 -0
- package/src/components/RichTextEditor/useOverlayRect.ts +73 -0
- package/src/components/RichTextEditor/useUpload.ts +246 -0
- package/src/components/Screen/Screen.module.scss +46 -0
- package/src/components/Screen/Screen.tokens.scss +20 -0
- package/src/components/Screen/Screen.tsx +97 -0
- package/src/components/Screen/index.ts +2 -0
- package/src/components/ScrollArea/ScrollArea.module.scss +39 -0
- package/src/components/ScrollArea/ScrollArea.tokens.scss +15 -0
- package/src/components/ScrollArea/ScrollArea.tsx +154 -0
- package/src/components/ScrollArea/index.ts +2 -0
- package/src/components/Select/Chip.tsx +45 -0
- package/src/components/Select/Empty.tsx +39 -0
- package/src/components/Select/Error.tsx +51 -0
- package/src/components/Select/HiddenInputs.tsx +44 -0
- package/src/components/Select/Listbox.tsx +557 -0
- package/src/components/Select/Loading.tsx +30 -0
- package/src/components/Select/Select.module.scss +512 -0
- package/src/components/Select/Select.tokens.scss +140 -0
- package/src/components/Select/Select.tsx +685 -0
- package/src/components/Select/Trigger.tsx +952 -0
- package/src/components/Select/context.ts +101 -0
- package/src/components/Select/emptyStateText.ts +19 -0
- package/src/components/Select/index.ts +9 -0
- package/src/components/Select/useSelectState.ts +157 -0
- package/src/components/Select/utils-types.ts +7 -0
- package/src/components/Select/utils.ts +122 -0
- package/src/components/SettingRow/SettingRow.module.scss +166 -0
- package/src/components/SettingRow/SettingRow.tokens.scss +37 -0
- package/src/components/SettingRow/SettingRow.tsx +242 -0
- package/src/components/SettingRow/index.ts +7 -0
- package/src/components/Skeleton/Skeleton.module.scss +55 -0
- package/src/components/Skeleton/Skeleton.tokens.scss +17 -0
- package/src/components/Skeleton/Skeleton.tsx +131 -0
- package/src/components/Skeleton/index.ts +4 -0
- package/src/components/Skeleton/useSkeletonVisibility.ts +95 -0
- package/src/components/Slider/Slider.module.scss +293 -0
- package/src/components/Slider/Slider.tokens.scss +98 -0
- package/src/components/Slider/Slider.tsx +624 -0
- package/src/components/Slider/index.ts +9 -0
- package/src/components/SlotGrid/SlotGrid.module.scss +61 -0
- package/src/components/SlotGrid/SlotGrid.tokens.scss +21 -0
- package/src/components/SlotGrid/SlotGrid.tsx +111 -0
- package/src/components/SlotGrid/index.ts +2 -0
- package/src/components/SocialButton/SocialButton.module.scss +4 -0
- package/src/components/SocialButton/SocialButton.tsx +40 -0
- package/src/components/SocialButton/index.ts +2 -0
- package/src/components/Sortable/Sortable.module.scss +177 -0
- package/src/components/Sortable/Sortable.tokens.scss +27 -0
- package/src/components/Sortable/Sortable.tsx +572 -0
- package/src/components/Sortable/containerAwareCollision.ts +125 -0
- package/src/components/Sortable/index.ts +13 -0
- package/src/components/SortableGroup/SortableGroup.module.scss +23 -0
- package/src/components/SortableGroup/SortableGroup.tsx +315 -0
- package/src/components/SortableGroup/index.ts +4 -0
- package/src/components/SortableGroup/moveSortableItem.ts +39 -0
- package/src/components/Sparkline/Sparkline.module.scss +28 -0
- package/src/components/Sparkline/Sparkline.tokens.scss +7 -0
- package/src/components/Sparkline/Sparkline.tsx +133 -0
- package/src/components/Sparkline/index.ts +2 -0
- package/src/components/Sparkline/sparklineModel.ts +119 -0
- package/src/components/Split/Split.module.scss +158 -0
- package/src/components/Split/Split.tokens.scss +10 -0
- package/src/components/Split/Split.tsx +231 -0
- package/src/components/Split/index.ts +2 -0
- package/src/components/Stack/Stack.module.scss +67 -0
- package/src/components/Stack/Stack.tokens.scss +11 -0
- package/src/components/Stack/Stack.tsx +100 -0
- package/src/components/Stack/index.ts +2 -0
- package/src/components/StagePath/StagePath.module.scss +255 -0
- package/src/components/StagePath/StagePath.tokens.scss +43 -0
- package/src/components/StagePath/StagePath.tsx +176 -0
- package/src/components/StagePath/index.ts +2 -0
- package/src/components/StatGroup/StatGroup.module.scss +6 -0
- package/src/components/StatGroup/StatGroup.tsx +70 -0
- package/src/components/StatGroup/StatGroupContext.ts +10 -0
- package/src/components/StatGroup/StatTile.module.scss +99 -0
- package/src/components/StatGroup/StatTile.tokens.scss +35 -0
- package/src/components/StatGroup/StatTile.tsx +143 -0
- package/src/components/StatGroup/index.ts +4 -0
- package/src/components/Sticky/Sticky.module.scss +98 -0
- package/src/components/Sticky/Sticky.tokens.scss +17 -0
- package/src/components/Sticky/Sticky.tsx +103 -0
- package/src/components/Sticky/index.ts +2 -0
- package/src/components/Switch/Switch.module.scss +182 -0
- package/src/components/Switch/Switch.tokens.scss +59 -0
- package/src/components/Switch/Switch.tsx +214 -0
- package/src/components/Switch/index.ts +2 -0
- package/src/components/Table/Table.module.scss +308 -0
- package/src/components/Table/Table.tokens.scss +79 -0
- package/src/components/Table/Table.tsx +381 -0
- package/src/components/Table/index.ts +15 -0
- package/src/components/TableOfContents/TableOfContents.module.scss +83 -0
- package/src/components/TableOfContents/TableOfContents.tokens.scss +26 -0
- package/src/components/TableOfContents/TableOfContents.tsx +192 -0
- package/src/components/TableOfContents/activeSection.ts +18 -0
- package/src/components/TableOfContents/index.ts +2 -0
- package/src/components/Tabs/Tabs.module.scss +359 -0
- package/src/components/Tabs/Tabs.tokens.scss +50 -0
- package/src/components/Tabs/Tabs.tsx +538 -0
- package/src/components/Tabs/index.ts +2 -0
- package/src/components/Text/Text.module.scss +115 -0
- package/src/components/Text/Text.tokens.scss +55 -0
- package/src/components/Text/Text.tsx +197 -0
- package/src/components/Text/index.ts +2 -0
- package/src/components/Textarea/Textarea.module.scss +94 -0
- package/src/components/Textarea/Textarea.tokens.scss +48 -0
- package/src/components/Textarea/Textarea.tsx +246 -0
- package/src/components/Textarea/index.ts +2 -0
- package/src/components/Thread/Thread.module.scss +161 -0
- package/src/components/Thread/Thread.tokens.scss +32 -0
- package/src/components/Thread/Thread.tsx +176 -0
- package/src/components/Thread/index.ts +2 -0
- package/src/components/TimeField/TimeField.module.scss +232 -0
- package/src/components/TimeField/TimeField.tsx +793 -0
- package/src/components/TimeField/index.ts +2 -0
- package/src/components/Timeline/Timeline.module.scss +58 -0
- package/src/components/Timeline/Timeline.tokens.scss +13 -0
- package/src/components/Timeline/Timeline.tsx +53 -0
- package/src/components/Timeline/index.ts +2 -0
- package/src/components/Title/Title.module.scss +84 -0
- package/src/components/Title/Title.tokens.scss +37 -0
- package/src/components/Title/Title.tsx +150 -0
- package/src/components/Title/index.ts +2 -0
- package/src/components/Toast/Toast.module.scss +299 -0
- package/src/components/Toast/Toast.tokens.scss +65 -0
- package/src/components/Toast/Toast.tsx +122 -0
- package/src/components/Toast/ToastViewport.tsx +166 -0
- package/src/components/Toast/api.ts +175 -0
- package/src/components/Toast/index.ts +5 -0
- package/src/components/Toast/store.ts +133 -0
- package/src/components/Toast/useToastTimer.ts +94 -0
- package/src/components/Tooltip/Tooltip.module.scss +99 -0
- package/src/components/Tooltip/Tooltip.tokens.scss +23 -0
- package/src/components/Tooltip/Tooltip.tsx +341 -0
- package/src/components/Tooltip/index.ts +2 -0
- package/src/components/TopBar/TopBar.module.scss +235 -0
- package/src/components/TopBar/TopBar.tokens.scss +79 -0
- package/src/components/TopBar/TopBar.tsx +87 -0
- package/src/components/TopBar/TopBarEnd.tsx +20 -0
- package/src/components/TopBar/TopBarIconButton.tsx +86 -0
- package/src/components/TopBar/TopBarSearch.tsx +319 -0
- package/src/components/TopBar/TopBarSearchPanel.tsx +268 -0
- package/src/components/TopBar/TopBarStart.tsx +20 -0
- package/src/components/TopBar/index.ts +11 -0
- package/src/components/Tour/Spotlight.tsx +121 -0
- package/src/components/Tour/Tour.module.scss +210 -0
- package/src/components/Tour/Tour.tokens.scss +58 -0
- package/src/components/Tour/Tour.tsx +617 -0
- package/src/components/Tour/index.ts +2 -0
- package/src/components/Tour/useTourTarget.ts +115 -0
- package/src/components/TreeView/TreeView.module.scss +268 -0
- package/src/components/TreeView/TreeView.tokens.scss +36 -0
- package/src/components/TreeView/TreeView.tsx +536 -0
- package/src/components/TreeView/index.ts +3 -0
- package/src/components/TreeView/treeModel.ts +224 -0
- package/src/components/VisuallyHidden/VisuallyHidden.module.scss +7 -0
- package/src/components/VisuallyHidden/VisuallyHidden.tsx +29 -0
- package/src/components/VisuallyHidden/index.ts +2 -0
- package/src/components/WidgetPreview/WidgetPreview.module.scss +11 -0
- package/src/components/WidgetPreview/WidgetPreview.tokens.scss +26 -0
- package/src/components/WidgetPreview/WidgetPreview.tsx +36 -0
- package/src/components/WidgetPreview/WidgetShape.module.scss +140 -0
- package/src/components/WidgetPreview/WidgetShape.tsx +159 -0
- package/src/components/WidgetPreview/index.ts +2 -0
- package/src/components/_internal/Trend.tsx +27 -0
- package/src/components/_internal/choiceTile.scss +74 -0
- package/src/components/_internal/collapse.scss +10 -0
- package/src/components/_internal/collapse.ts +58 -0
- package/src/components/_internal/currency.ts +257 -0
- package/src/components/_internal/dragAnnouncements.ts +200 -0
- package/src/components/_internal/fieldWiring.ts +225 -0
- package/src/components/_internal/gridSpan.ts +54 -0
- package/src/components/_internal/isoDay.ts +35 -0
- package/src/components/_internal/letterKey.ts +26 -0
- package/src/components/_internal/overlay/focusRestore.ts +21 -0
- package/src/components/_internal/overlay/index.ts +12 -0
- package/src/components/_internal/overlay/tourHold.ts +23 -0
- package/src/components/_internal/overlay/useFocusTrap.ts +120 -0
- package/src/components/_internal/overlay/useInOverlay.ts +81 -0
- package/src/components/_internal/overlay/useOverlayStack.ts +232 -0
- package/src/components/_internal/overlay/useScrollLock.ts +112 -0
- package/src/components/_internal/refs.ts +48 -0
- package/src/components/_internal/statusColor.ts +26 -0
- package/src/components/_internal/timeUtils.ts +23 -0
- package/src/components/_internal/useAsyncOptions.ts +145 -0
- package/src/components/_internal/useClippedTooltip.ts +50 -0
- package/src/components/_internal/useControllableState.ts +50 -0
- package/src/components.manifest.json +1141 -0
- package/src/hooks/useBelowBreakpoint.ts +58 -0
- package/src/i18n/I18nProvider.tsx +52 -0
- package/src/i18n/LocaleProvider.tsx +17 -0
- package/src/i18n/en.ts +648 -0
- package/src/i18n/format.ts +71 -0
- package/src/i18n/index.ts +13 -0
- package/src/i18n/messages.ts +1275 -0
- package/src/i18n/ru.ts +677 -0
- package/src/i18n/useLocale.ts +19 -0
- package/src/i18n/useTranslation.ts +58 -0
- package/src/index.ts +913 -0
- package/src/palette/index.ts +2 -0
- package/src/palette/palette.ts +108 -0
- package/src/styles/dark.scss +4 -0
- package/src/styles/global.scss +7 -0
- package/src/styles/mixins.scss +143 -0
- package/src/styles/reset.scss +78 -0
- package/src/styles/tokens.scss +18 -0
- package/src/styles/typography.scss +44 -0
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
import {
|
|
2
|
+
useCallback,
|
|
3
|
+
useEffect,
|
|
4
|
+
useId,
|
|
5
|
+
useLayoutEffect,
|
|
6
|
+
useRef,
|
|
7
|
+
useState,
|
|
8
|
+
type CSSProperties,
|
|
9
|
+
type ReactNode,
|
|
10
|
+
type RefObject,
|
|
11
|
+
} from 'react';
|
|
12
|
+
import {
|
|
13
|
+
ModalContext,
|
|
14
|
+
type ModalContextValue,
|
|
15
|
+
type ModalOverlayVariant,
|
|
16
|
+
type ModalSize,
|
|
17
|
+
} from './context';
|
|
18
|
+
import {
|
|
19
|
+
isFocusLost,
|
|
20
|
+
restoreFocusTo,
|
|
21
|
+
useOverlayStack as useModalStack,
|
|
22
|
+
type OverlayStackMode as ModalStackMode,
|
|
23
|
+
} from '../_internal/overlay';
|
|
24
|
+
import { useScrollLock } from '../_internal/overlay/useScrollLock';
|
|
25
|
+
import { Overlay } from './Overlay';
|
|
26
|
+
import { Content } from './Content';
|
|
27
|
+
import { sanitizeId } from '../_internal/refs';
|
|
28
|
+
|
|
29
|
+
export interface ModalProps {
|
|
30
|
+
/** Controlled open state. Required. */
|
|
31
|
+
open: boolean;
|
|
32
|
+
/** Fired when Modal wants to change open state — Esc, overlay click, Close button, programmatic. */
|
|
33
|
+
onOpenChange: (open: boolean) => void;
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Size preset. Defaults to `'md'`.
|
|
37
|
+
* - `'sm'` (400px) — confirms and short prompts.
|
|
38
|
+
* - `'md'` (560px) — the default; typical forms.
|
|
39
|
+
* - `'lg'` (800px) — wide forms, tables, previews.
|
|
40
|
+
* - `'full'` (95vw × 90dvh, fixed height) — long documents, e.g. an HTML email.
|
|
41
|
+
* See {@link ModalSize}.
|
|
42
|
+
* @default 'md'
|
|
43
|
+
*/
|
|
44
|
+
size?: ModalSize;
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Overlay variant. 'solid' (default) paints a dark dimming layer.
|
|
48
|
+
* 'blur' uses a light tinted background plus `backdrop-filter: blur(4px)`
|
|
49
|
+
* for a frosted-glass effect. 'blur' costs an extra compositor layer —
|
|
50
|
+
* fine for normal use; avoid stacking three blurred modals at once.
|
|
51
|
+
*/
|
|
52
|
+
overlay?: ModalOverlayVariant;
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* How this modal relates to existing modals in the stack when it opens.
|
|
56
|
+
*
|
|
57
|
+
* - `'overlay'` (default): if there's a modal below this one, it stays
|
|
58
|
+
* visible underneath. This modal's own overlay paints transparent so
|
|
59
|
+
* the parent's dim shows through. Only the bottom modal (depth 0)
|
|
60
|
+
* paints the actual dim/blur. The user sees the parent's context behind
|
|
61
|
+
* the active modal.
|
|
62
|
+
* - `'replace'`: any modals below this one are hidden via `display: none`
|
|
63
|
+
* (React state preserved). This modal paints its own overlay normally.
|
|
64
|
+
* Best for forced-step modals where the parent context is irrelevant.
|
|
65
|
+
*
|
|
66
|
+
* Has no effect when this is the only open modal.
|
|
67
|
+
*/
|
|
68
|
+
stackMode?: ModalStackMode;
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Disable Escape-to-close. Default false. Combined with `dismissOnOverlayClick: false`
|
|
72
|
+
* and omitting `<Modal.Close>` produces a fully forced step.
|
|
73
|
+
*/
|
|
74
|
+
disableEscapeClose?: boolean;
|
|
75
|
+
/**
|
|
76
|
+
* When false, clicking the overlay backdrop does NOT close the modal. Default true.
|
|
77
|
+
*/
|
|
78
|
+
dismissOnOverlayClick?: boolean;
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Initial focus target on open. Default: the dialog container itself.
|
|
82
|
+
* Pass a ref to override (e.g. focus the first input in a form).
|
|
83
|
+
*/
|
|
84
|
+
initialFocusRef?: RefObject<HTMLElement | null>;
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Where focus goes when the modal closes. Default: back to whatever was
|
|
88
|
+
* focused when it opened.
|
|
89
|
+
*
|
|
90
|
+
* That default breaks whenever the opener is gone by close time — a row's
|
|
91
|
+
* "⋯" trigger whose row was just deleted, or a button that unmounts in the
|
|
92
|
+
* same commit that opens the modal (the capture then snapshots `<body>`).
|
|
93
|
+
* Focus lands on `<body>` and a keyboard user loses their place.
|
|
94
|
+
*
|
|
95
|
+
* The ref is read **at close time**, not at open time, so it may be pointed
|
|
96
|
+
* at whatever still exists once the work is done — the next row's trigger,
|
|
97
|
+
* the empty state's first button. If it is empty or its element has also
|
|
98
|
+
* left the document, Modal falls back to the captured opener, and then to
|
|
99
|
+
* doing nothing, exactly as before this prop existed.
|
|
100
|
+
*
|
|
101
|
+
* The target is scrolled into view (`block: 'nearest'`) after focus; the
|
|
102
|
+
* captured opener is not.
|
|
103
|
+
*
|
|
104
|
+
* @example
|
|
105
|
+
* // The deleted row's trigger is gone on close; aim at the next one.
|
|
106
|
+
* const returnFocusRef = useRef<HTMLElement | null>(null);
|
|
107
|
+
* <Modal open={open} onOpenChange={setOpen} returnFocusRef={returnFocusRef}>
|
|
108
|
+
* <Modal.Header>Delete mailbox?</Modal.Header>
|
|
109
|
+
* <Modal.Footer>
|
|
110
|
+
* <Button
|
|
111
|
+
* variant="danger"
|
|
112
|
+
* onClick={async () => {
|
|
113
|
+
* await deleteMailbox(id);
|
|
114
|
+
* returnFocusRef.current = nextRowTriggerRef.current ?? connectButtonRef.current;
|
|
115
|
+
* setOpen(false);
|
|
116
|
+
* }}
|
|
117
|
+
* >
|
|
118
|
+
* Delete
|
|
119
|
+
* </Button>
|
|
120
|
+
* </Modal.Footer>
|
|
121
|
+
* </Modal>
|
|
122
|
+
*/
|
|
123
|
+
returnFocusRef?: RefObject<HTMLElement | null>;
|
|
124
|
+
|
|
125
|
+
/** Compound children: Header / Body / Footer / Close + any consumer JSX. */
|
|
126
|
+
children: ReactNode;
|
|
127
|
+
|
|
128
|
+
/** className passes through to the dialog container. */
|
|
129
|
+
className?: string;
|
|
130
|
+
/** style passes through to the dialog container. */
|
|
131
|
+
style?: CSSProperties;
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Required for a11y when no Modal.Header is rendered. When Header IS rendered,
|
|
135
|
+
* aria-labelledby auto-binds to the heading id; this prop is then ignored.
|
|
136
|
+
*/
|
|
137
|
+
'aria-label'?: string;
|
|
138
|
+
/** Optional id of an external descriptor element; sets aria-describedby on the dialog. */
|
|
139
|
+
'aria-describedby'?: string;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Modal dialog: focus-locked, scroll-locked, ARIA-correct overlay panel with stack-aware overlays; controlled `open`.
|
|
144
|
+
* @see docs/components/Modal.md
|
|
145
|
+
*/
|
|
146
|
+
export function ModalRoot({
|
|
147
|
+
open,
|
|
148
|
+
onOpenChange,
|
|
149
|
+
size = 'md',
|
|
150
|
+
overlay = 'solid',
|
|
151
|
+
stackMode = 'overlay',
|
|
152
|
+
disableEscapeClose = false,
|
|
153
|
+
dismissOnOverlayClick = true,
|
|
154
|
+
initialFocusRef,
|
|
155
|
+
returnFocusRef,
|
|
156
|
+
children,
|
|
157
|
+
className,
|
|
158
|
+
style,
|
|
159
|
+
'aria-label': ariaLabel,
|
|
160
|
+
'aria-describedby': ariaDescribedBy,
|
|
161
|
+
}: ModalProps) {
|
|
162
|
+
const rawId = useId();
|
|
163
|
+
const modalId = `modal-${sanitizeId(rawId)}`;
|
|
164
|
+
|
|
165
|
+
const contentRef = useRef<HTMLDivElement | null>(null);
|
|
166
|
+
const [headingId, setHeadingId] = useState<string | null>(null);
|
|
167
|
+
|
|
168
|
+
// previouslyFocused: capture the trigger element when transitioning false → true,
|
|
169
|
+
// then restore focus to it on close.
|
|
170
|
+
//
|
|
171
|
+
// useLayoutEffect is required here (not useEffect) for two reasons:
|
|
172
|
+
//
|
|
173
|
+
// 1. Capture timing: Content.tsx uses queueMicrotask inside its useLayoutEffect
|
|
174
|
+
// to move focus to the dialog. This layout effect runs in the same commit
|
|
175
|
+
// before that queued work, so it captures the trigger while it still has focus.
|
|
176
|
+
//
|
|
177
|
+
// 2. Close timing: on an open → closed update, React completes layout-effect
|
|
178
|
+
// cleanup (including useScrollLock's unlock) before running the closed-state
|
|
179
|
+
// layout effects that restore focus. preventScroll then avoids disturbing the
|
|
180
|
+
// restored position.
|
|
181
|
+
const previouslyFocusedRef = useRef<HTMLElement | null>(null);
|
|
182
|
+
const prevOpenRef = useRef(false);
|
|
183
|
+
const focusEffectGenerationRef = useRef(0);
|
|
184
|
+
// A consumer-named target wins over the captured opener, and is read HERE —
|
|
185
|
+
// at close time — so the consumer can aim it at whatever survived the work
|
|
186
|
+
// the modal did (#529). Both are checked against the document: the opener is
|
|
187
|
+
// commonly gone (deleted row, unmounted button), and the named target can be
|
|
188
|
+
// too, in which case the captured opener is still the better answer than
|
|
189
|
+
// nothing.
|
|
190
|
+
const restoreFocus = useCallback(() => {
|
|
191
|
+
const captured = previouslyFocusedRef.current;
|
|
192
|
+
previouslyFocusedRef.current = null;
|
|
193
|
+
const requested = returnFocusRef?.current ?? null;
|
|
194
|
+
if (requested && document.contains(requested)) {
|
|
195
|
+
restoreFocusTo(requested);
|
|
196
|
+
// #553: a named target is usually NOT where the user was (the opener
|
|
197
|
+
// unmounted), so bring it into view. 'nearest' is a no-op when visible.
|
|
198
|
+
// The captured opener is not scrolled — the user was already there.
|
|
199
|
+
requested.scrollIntoView?.({ block: 'nearest' });
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
if (captured && document.contains(captured)) {
|
|
203
|
+
restoreFocusTo(captured);
|
|
204
|
+
}
|
|
205
|
+
}, [returnFocusRef]);
|
|
206
|
+
useLayoutEffect(() => {
|
|
207
|
+
const generation = ++focusEffectGenerationRef.current;
|
|
208
|
+
if (open && !prevOpenRef.current) {
|
|
209
|
+
// Modal is opening: snapshot the currently focused element before the
|
|
210
|
+
// dialog's queueMicrotask fires and steals focus.
|
|
211
|
+
previouslyFocusedRef.current = (document.activeElement as HTMLElement | null) ?? null;
|
|
212
|
+
}
|
|
213
|
+
if (!open && prevOpenRef.current) {
|
|
214
|
+
// Modal is closing: restore focus to the element that triggered it.
|
|
215
|
+
// preventScroll keeps the browser from scrollIntoView-ing the trigger,
|
|
216
|
+
// which would fight the scroll restoration in useScrollLock's cleanup.
|
|
217
|
+
restoreFocus();
|
|
218
|
+
}
|
|
219
|
+
prevOpenRef.current = open;
|
|
220
|
+
// Also restore if the Modal root itself is removed while still open. Defer
|
|
221
|
+
// until React finishes tearing down the dialog and its focus trap.
|
|
222
|
+
//
|
|
223
|
+
// This cleanup and the closing branch can run for the same transition;
|
|
224
|
+
// a later effect generation cancels this queued fallback, while restoreFocus
|
|
225
|
+
// clears its ref first so the target is focused only once.
|
|
226
|
+
// Only when focus was actually lost — a consumer that focused something
|
|
227
|
+
// after the unmount (e.g. the next row) keeps it.
|
|
228
|
+
if (open) {
|
|
229
|
+
return () => {
|
|
230
|
+
queueMicrotask(() => {
|
|
231
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps -- the generation counter must be read at cleanup time
|
|
232
|
+
if (focusEffectGenerationRef.current === generation && isFocusLost()) restoreFocus();
|
|
233
|
+
});
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
}, [open, restoreFocus]);
|
|
237
|
+
|
|
238
|
+
// Stack registration + scroll lock are driven by `open`.
|
|
239
|
+
const { depth, isTop, topMode } = useModalStack(modalId, open, stackMode);
|
|
240
|
+
useScrollLock(open);
|
|
241
|
+
|
|
242
|
+
const setOpen = useCallback(
|
|
243
|
+
(next: boolean) => {
|
|
244
|
+
onOpenChange(next);
|
|
245
|
+
},
|
|
246
|
+
[onOpenChange],
|
|
247
|
+
);
|
|
248
|
+
|
|
249
|
+
// Dev warning: must have either a Header (sets headingId in context) OR aria-label.
|
|
250
|
+
// Deferred via microtask so <Modal.Header>'s registration effect has a chance to run.
|
|
251
|
+
useEffect(() => {
|
|
252
|
+
if (!open) return;
|
|
253
|
+
if (process.env.NODE_ENV === 'production') return;
|
|
254
|
+
let cancelled = false;
|
|
255
|
+
queueMicrotask(() => {
|
|
256
|
+
if (cancelled) return;
|
|
257
|
+
if (!headingId && !ariaLabel) {
|
|
258
|
+
console.warn(
|
|
259
|
+
'<Modal> must be labelled. Either render <Modal.Header> or pass an `aria-label` prop. Screen-reader users get no announcement otherwise.',
|
|
260
|
+
);
|
|
261
|
+
}
|
|
262
|
+
});
|
|
263
|
+
return () => {
|
|
264
|
+
cancelled = true;
|
|
265
|
+
};
|
|
266
|
+
}, [open, headingId, ariaLabel]);
|
|
267
|
+
|
|
268
|
+
const value: ModalContextValue = {
|
|
269
|
+
open,
|
|
270
|
+
setOpen,
|
|
271
|
+
modalId,
|
|
272
|
+
contentRef,
|
|
273
|
+
headingId,
|
|
274
|
+
setHeadingId,
|
|
275
|
+
size,
|
|
276
|
+
overlay,
|
|
277
|
+
disableEscapeClose,
|
|
278
|
+
dismissOnOverlayClick,
|
|
279
|
+
initialFocusRef,
|
|
280
|
+
ariaLabel,
|
|
281
|
+
ariaDescribedBy,
|
|
282
|
+
depth: depth ?? 0,
|
|
283
|
+
isTop,
|
|
284
|
+
stackMode,
|
|
285
|
+
topMode,
|
|
286
|
+
};
|
|
287
|
+
|
|
288
|
+
return (
|
|
289
|
+
<ModalContext.Provider value={value}>
|
|
290
|
+
{open && (
|
|
291
|
+
<Overlay>
|
|
292
|
+
<Content className={className} style={style}>
|
|
293
|
+
{children}
|
|
294
|
+
</Content>
|
|
295
|
+
</Overlay>
|
|
296
|
+
)}
|
|
297
|
+
</ModalContext.Provider>
|
|
298
|
+
);
|
|
299
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import {
|
|
2
|
+
useEffect,
|
|
3
|
+
type CSSProperties,
|
|
4
|
+
type MouseEvent as ReactMouseEvent,
|
|
5
|
+
type ReactNode,
|
|
6
|
+
} from 'react';
|
|
7
|
+
import { createPortal } from 'react-dom';
|
|
8
|
+
import { useModalContext } from './context';
|
|
9
|
+
import styles from './Modal.module.scss';
|
|
10
|
+
|
|
11
|
+
const PORTAL_EXEMPT_SELECTOR =
|
|
12
|
+
'[data-modal-portal-root], [data-drawer-portal-root], [data-tour-portal-root]';
|
|
13
|
+
|
|
14
|
+
export interface OverlayProps {
|
|
15
|
+
children: ReactNode;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Portaled dimming/blurred backdrop rendered behind the dialog. Owns the
|
|
20
|
+
* inert-background attribute on body children + the overlay-click
|
|
21
|
+
* dismissal (only fires when the click target is the overlay itself,
|
|
22
|
+
* not bubbled from content).
|
|
23
|
+
*
|
|
24
|
+
* Carries three data-attributes consumed by SCSS:
|
|
25
|
+
* - `data-variant` : 'solid' | 'blur' — visual variant
|
|
26
|
+
* - `data-stack-position` : 'top' | 'underneath' | 'hidden'
|
|
27
|
+
* - 'top' — this is the topmost open modal
|
|
28
|
+
* - 'underneath' — lower modal in overlay-stack mode (stays visible)
|
|
29
|
+
* - 'hidden' — lower modal in replace-stack mode (display: none)
|
|
30
|
+
* - `data-overlay-paint` : 'yes' | 'no'
|
|
31
|
+
* - 'yes' — this overlay paints its dim/blur background
|
|
32
|
+
* - 'no' — transparent (upper modal in overlay-stack mode)
|
|
33
|
+
*/
|
|
34
|
+
export function Overlay({ children }: OverlayProps) {
|
|
35
|
+
const ctx = useModalContext('Overlay');
|
|
36
|
+
|
|
37
|
+
// Inert background — applied to all body children EXCEPT any modal portal
|
|
38
|
+
// root. Skipping ALL modal portals (not just the first) is critical for
|
|
39
|
+
// stacked modals: the inner modal's portal is also a body child, and it
|
|
40
|
+
// must remain interactive even though it was added after the outer's.
|
|
41
|
+
useEffect(() => {
|
|
42
|
+
if (!ctx.isTop) return;
|
|
43
|
+
const bodyChildren = Array.from(document.body.children) as HTMLElement[];
|
|
44
|
+
const toRestore: Array<{ el: HTMLElement; had: boolean }> = [];
|
|
45
|
+
for (const el of bodyChildren) {
|
|
46
|
+
if (el.matches(PORTAL_EXEMPT_SELECTOR)) continue;
|
|
47
|
+
const had = el.hasAttribute('inert');
|
|
48
|
+
if (!had) el.setAttribute('inert', '');
|
|
49
|
+
toRestore.push({ el, had });
|
|
50
|
+
}
|
|
51
|
+
return () => {
|
|
52
|
+
for (const { el, had } of toRestore) {
|
|
53
|
+
if (!had) el.removeAttribute('inert');
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
}, [ctx.isTop]);
|
|
57
|
+
|
|
58
|
+
const onClick = (e: ReactMouseEvent<HTMLDivElement>) => {
|
|
59
|
+
// Only dismiss when the click is on the backdrop itself.
|
|
60
|
+
if (e.target !== e.currentTarget) return;
|
|
61
|
+
if (!ctx.dismissOnOverlayClick) return;
|
|
62
|
+
if (!ctx.isTop) return; // safety: lower overlays are display:none, but guard anyway
|
|
63
|
+
ctx.setOpen(false);
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
// Visibility classification
|
|
67
|
+
let stackPosition: 'top' | 'hidden' | 'underneath';
|
|
68
|
+
if (ctx.isTop) {
|
|
69
|
+
stackPosition = 'top';
|
|
70
|
+
} else if (ctx.topMode === 'replace') {
|
|
71
|
+
stackPosition = 'hidden';
|
|
72
|
+
} else {
|
|
73
|
+
// topMode === 'overlay' && !isTop
|
|
74
|
+
stackPosition = 'underneath';
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// Paint classification: only paint dim/blur if this is the visible "ground
|
|
78
|
+
// level". In replace mode the top modal paints; in overlay mode only the
|
|
79
|
+
// bottom of the stack (depth 0) paints so upper overlays are transparent.
|
|
80
|
+
const paint =
|
|
81
|
+
(ctx.topMode === 'replace' && ctx.isTop) || (ctx.topMode === 'overlay' && ctx.depth === 0);
|
|
82
|
+
|
|
83
|
+
// Custom prop carries depth to SCSS for any per-depth styling.
|
|
84
|
+
const style = { ['--modal-depth' as string]: String(ctx.depth) } as CSSProperties;
|
|
85
|
+
|
|
86
|
+
return createPortal(
|
|
87
|
+
<div
|
|
88
|
+
data-modal-portal-root=""
|
|
89
|
+
data-state={ctx.open ? 'open' : 'closed'}
|
|
90
|
+
data-variant={ctx.overlay}
|
|
91
|
+
data-stack-position={stackPosition}
|
|
92
|
+
data-overlay-paint={paint ? 'yes' : 'no'}
|
|
93
|
+
className={styles.overlay}
|
|
94
|
+
style={style}
|
|
95
|
+
onClick={onClick}
|
|
96
|
+
>
|
|
97
|
+
{children}
|
|
98
|
+
</div>,
|
|
99
|
+
document.body,
|
|
100
|
+
);
|
|
101
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { createContext, useContext, type RefObject } from 'react';
|
|
2
|
+
import type { OverlayStackMode } from '../_internal/overlay';
|
|
3
|
+
|
|
4
|
+
/** @deprecated alias of {@link OverlayStackMode}. Kept for backward compatibility. */
|
|
5
|
+
export type ModalStackMode = OverlayStackMode;
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Size preset. `'sm'` / `'md'` / `'lg'` are fixed widths (400 / 560 / 800px)
|
|
9
|
+
* whose height grows with content. `'full'` is near-full-screen — 95vw × 90dvh
|
|
10
|
+
* unless `--modal-content-width-full` / `--modal-content-height-full` are
|
|
11
|
+
* overridden — a FIXED height whatever the content, with Body scrolling between a pinned
|
|
12
|
+
* Header and Footer — for reading long documents (an HTML email, a report).
|
|
13
|
+
* Every size goes full-screen below a 640px viewport.
|
|
14
|
+
*/
|
|
15
|
+
export type ModalSize = 'sm' | 'md' | 'lg' | 'full';
|
|
16
|
+
export type ModalOverlayVariant = 'solid' | 'blur';
|
|
17
|
+
|
|
18
|
+
export interface ModalContextValue {
|
|
19
|
+
open: boolean;
|
|
20
|
+
setOpen: (next: boolean) => void;
|
|
21
|
+
/** Stable modal id, used by the stack registry + aria-controls bindings. */
|
|
22
|
+
modalId: string;
|
|
23
|
+
/** Ref to the dialog container, populated by <Content>. Used for focus trap + outside-click. */
|
|
24
|
+
contentRef: RefObject<HTMLDivElement | null>;
|
|
25
|
+
/** Stable id for the heading registered by <Header>, used for aria-labelledby. */
|
|
26
|
+
headingId: string | null;
|
|
27
|
+
/** Called by <Header> to register its heading id. */
|
|
28
|
+
setHeadingId: (id: string | null) => void;
|
|
29
|
+
/** Size preset; drives the content's --modal-size CSS class. */
|
|
30
|
+
size: ModalSize;
|
|
31
|
+
/** Overlay variant; drives data-variant on the portal root. */
|
|
32
|
+
overlay: ModalOverlayVariant;
|
|
33
|
+
/** Forwarded from props for the Esc handler in Content. */
|
|
34
|
+
disableEscapeClose: boolean;
|
|
35
|
+
/** Forwarded for the overlay click handler. */
|
|
36
|
+
dismissOnOverlayClick: boolean;
|
|
37
|
+
/** Forwarded so Content can override initial focus. */
|
|
38
|
+
initialFocusRef: RefObject<HTMLElement | null> | undefined;
|
|
39
|
+
/** From Modal props; used by Content for aria-label when no heading is registered. */
|
|
40
|
+
ariaLabel: string | undefined;
|
|
41
|
+
ariaDescribedBy: string | undefined;
|
|
42
|
+
/** Current stack depth (for the --modal-depth custom prop on the overlay). */
|
|
43
|
+
depth: number;
|
|
44
|
+
/** Whether this modal is currently the topmost open modal. Drives Escape/focus-trap activity. */
|
|
45
|
+
isTop: boolean;
|
|
46
|
+
/** This modal's own stackMode prop. */
|
|
47
|
+
stackMode: ModalStackMode;
|
|
48
|
+
/** Mode of the current top modal (null if stack is empty). */
|
|
49
|
+
topMode: ModalStackMode | null;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export const ModalContext = createContext<ModalContextValue | null>(null);
|
|
53
|
+
|
|
54
|
+
export function useModalContext(componentName: string): ModalContextValue {
|
|
55
|
+
const ctx = useContext(ModalContext);
|
|
56
|
+
if (!ctx) {
|
|
57
|
+
throw new Error(`<Modal.${componentName}> must be used inside <Modal>.`);
|
|
58
|
+
}
|
|
59
|
+
return ctx;
|
|
60
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
@use '../Input/Input.tokens';
|
|
2
|
+
|
|
3
|
+
.root {
|
|
4
|
+
display: grid;
|
|
5
|
+
grid-template-columns: max-content minmax(0, 1fr);
|
|
6
|
+
gap: var(--space-1);
|
|
7
|
+
align-items: center;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
.currency {
|
|
11
|
+
// keep the picker compact so the amount gets the room
|
|
12
|
+
max-width: var(--size-control-currency);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
.amount {
|
|
16
|
+
width: 100%;
|
|
17
|
+
text-align: end;
|
|
18
|
+
font-variant-numeric: tabular-nums;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// Static currency prefix (single-currency mode): mirrors Input's chrome per size.
|
|
22
|
+
.prefix {
|
|
23
|
+
display: inline-flex;
|
|
24
|
+
align-items: center;
|
|
25
|
+
border: var(--border-width) solid var(--input-border-color);
|
|
26
|
+
border-radius: var(--input-radius);
|
|
27
|
+
background: var(--input-bg-disabled);
|
|
28
|
+
color: var(--input-fg);
|
|
29
|
+
line-height: var(--input-line-height);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
.prefix-sm {
|
|
33
|
+
height: var(--input-height-sm);
|
|
34
|
+
padding: 0 var(--input-padding-x-sm);
|
|
35
|
+
font-size: var(--input-font-size-sm);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
.prefix-md {
|
|
39
|
+
height: var(--input-height-md);
|
|
40
|
+
padding: 0 var(--input-padding-x-md);
|
|
41
|
+
font-size: var(--input-font-size-md);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
.prefix-lg {
|
|
45
|
+
height: var(--input-height-lg);
|
|
46
|
+
padding: 0 var(--input-padding-x-lg);
|
|
47
|
+
font-size: var(--input-font-size-lg);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
.prefix-invalid {
|
|
51
|
+
border-color: var(--input-border-color-invalid);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
.prefix-disabled {
|
|
55
|
+
border-color: var(--input-border-color-disabled);
|
|
56
|
+
color: var(--input-fg-disabled);
|
|
57
|
+
}
|