@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,66 @@
|
|
|
1
|
+
import { forwardRef, useId, useMemo, type HTMLAttributes, type ReactNode } from 'react';
|
|
2
|
+
import clsx from 'clsx';
|
|
3
|
+
import {
|
|
4
|
+
AccordionItemContext,
|
|
5
|
+
useAccordionContext,
|
|
6
|
+
type AccordionItemContextValue,
|
|
7
|
+
} from './context';
|
|
8
|
+
import type { AccordionHeaderLevel } from './Accordion';
|
|
9
|
+
import styles from './Accordion.module.scss';
|
|
10
|
+
|
|
11
|
+
export interface AccordionItemProps extends Omit<HTMLAttributes<HTMLDivElement>, 'value'> {
|
|
12
|
+
/** Unique value used to identify the item in the root's `value`/`onValueChange`. */
|
|
13
|
+
value: string;
|
|
14
|
+
/** When true, the trigger is non-interactive and keyboard nav skips this item. */
|
|
15
|
+
disabled?: boolean;
|
|
16
|
+
/**
|
|
17
|
+
* Heading level wrapping the trigger. WAI-ARIA APG requires triggers to live
|
|
18
|
+
* inside a heading element. Defaults to `'h3'`.
|
|
19
|
+
*/
|
|
20
|
+
headerLevel?: AccordionHeaderLevel;
|
|
21
|
+
children: ReactNode;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Item wrapper providing the item context to its Trigger and Content.
|
|
26
|
+
* @see docs/components/Accordion.md
|
|
27
|
+
*/
|
|
28
|
+
export const AccordionItem = forwardRef<HTMLDivElement, AccordionItemProps>(function AccordionItem(
|
|
29
|
+
{ value, disabled = false, headerLevel = 'h3', children, className, ...props },
|
|
30
|
+
ref,
|
|
31
|
+
) {
|
|
32
|
+
const { isOpen } = useAccordionContext('Item');
|
|
33
|
+
const open = isOpen(value);
|
|
34
|
+
const reactId = useId();
|
|
35
|
+
const triggerId = `accordion-trigger-${reactId}`;
|
|
36
|
+
const contentId = `accordion-content-${reactId}`;
|
|
37
|
+
|
|
38
|
+
const ctx = useMemo<AccordionItemContextValue & { headerLevel: AccordionHeaderLevel }>(
|
|
39
|
+
() => ({
|
|
40
|
+
value,
|
|
41
|
+
disabled,
|
|
42
|
+
isOpen: open,
|
|
43
|
+
triggerId,
|
|
44
|
+
contentId,
|
|
45
|
+
headerLevel,
|
|
46
|
+
}),
|
|
47
|
+
[value, disabled, open, triggerId, contentId, headerLevel],
|
|
48
|
+
);
|
|
49
|
+
|
|
50
|
+
return (
|
|
51
|
+
<AccordionItemContext.Provider value={ctx}>
|
|
52
|
+
{/* Pattern A — {...props} after ref so consumer attrs reach the div,
|
|
53
|
+
but data-state/data-disabled/className are set AFTER the spread
|
|
54
|
+
so the component wins on those three. */}
|
|
55
|
+
<div
|
|
56
|
+
ref={ref}
|
|
57
|
+
{...props}
|
|
58
|
+
data-state={open ? 'open' : 'closed'}
|
|
59
|
+
data-disabled={disabled ? 'true' : undefined}
|
|
60
|
+
className={clsx(styles.item, className)}
|
|
61
|
+
>
|
|
62
|
+
{children}
|
|
63
|
+
</div>
|
|
64
|
+
</AccordionItemContext.Provider>
|
|
65
|
+
);
|
|
66
|
+
});
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { forwardRef, type ButtonHTMLAttributes, type KeyboardEvent, type ReactNode } from 'react';
|
|
2
|
+
import { ChevronDown } from 'lucide-react';
|
|
3
|
+
import clsx from 'clsx';
|
|
4
|
+
import {
|
|
5
|
+
useAccordionContext,
|
|
6
|
+
useAccordionItemContext,
|
|
7
|
+
type AccordionItemContextValue,
|
|
8
|
+
} from './context';
|
|
9
|
+
import type { AccordionHeaderLevel } from './Accordion';
|
|
10
|
+
import styles from './Accordion.module.scss';
|
|
11
|
+
|
|
12
|
+
export interface AccordionTriggerProps extends Omit<
|
|
13
|
+
ButtonHTMLAttributes<HTMLButtonElement>,
|
|
14
|
+
'children'
|
|
15
|
+
> {
|
|
16
|
+
/**
|
|
17
|
+
* Override the default trigger indicator icon (rotates 180° when open).
|
|
18
|
+
* Pass `null` to suppress the icon entirely. Default: `<ChevronDown />`.
|
|
19
|
+
*/
|
|
20
|
+
icon?: ReactNode | null;
|
|
21
|
+
/**
|
|
22
|
+
* Controls rendered at the **right of the header**, OUTSIDE the toggle button —
|
|
23
|
+
* so their buttons/menus are clickable without toggling the section, and the
|
|
24
|
+
* heading's accessible name stays just the title. Keep it to a few small
|
|
25
|
+
* controls (`<Button iconOnly>`, a `<DropdownMenu>` trigger, a `<Switch>`).
|
|
26
|
+
*/
|
|
27
|
+
actions?: ReactNode;
|
|
28
|
+
children: ReactNode;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
interface ItemContextWithHeaderLevel extends AccordionItemContextValue {
|
|
32
|
+
headerLevel: AccordionHeaderLevel;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Heading-wrapped button that toggles the parent Item.
|
|
37
|
+
* @see docs/components/Accordion.md
|
|
38
|
+
*/
|
|
39
|
+
export const AccordionTrigger = forwardRef<HTMLButtonElement, AccordionTriggerProps>(
|
|
40
|
+
function AccordionTrigger({ icon, actions, children, className, onKeyDown, ...props }, ref) {
|
|
41
|
+
const { toggle } = useAccordionContext('Trigger');
|
|
42
|
+
const itemCtx = useAccordionItemContext('Trigger') as ItemContextWithHeaderLevel;
|
|
43
|
+
const { value, disabled, isOpen, triggerId, contentId, headerLevel } = itemCtx;
|
|
44
|
+
|
|
45
|
+
const handleKeyDown = (e: KeyboardEvent<HTMLButtonElement>) => {
|
|
46
|
+
onKeyDown?.(e);
|
|
47
|
+
if (e.defaultPrevented) return;
|
|
48
|
+
const isNav = ['ArrowDown', 'ArrowUp', 'Home', 'End'].includes(e.key);
|
|
49
|
+
if (!isNav) return;
|
|
50
|
+
e.preventDefault();
|
|
51
|
+
|
|
52
|
+
const root = e.currentTarget.closest<HTMLElement>('[data-accordion]');
|
|
53
|
+
if (!root) return;
|
|
54
|
+
|
|
55
|
+
// Match ONLY accordion toggle buttons (the `data-accordion-trigger` marker),
|
|
56
|
+
// never an `aria-expanded` control a consumer put in the `actions` slot (a
|
|
57
|
+
// DropdownMenu/Select trigger). Then scope to THIS root by filtering to
|
|
58
|
+
// triggers whose nearest accordion ancestor is this root — so ArrowDown from
|
|
59
|
+
// an outer trigger doesn't jump into a nested Accordion inside open Content.
|
|
60
|
+
const triggers = Array.from(
|
|
61
|
+
root.querySelectorAll<HTMLButtonElement>('button[data-accordion-trigger]:not(:disabled)'),
|
|
62
|
+
).filter((btn) => btn.closest('[data-accordion]') === root);
|
|
63
|
+
if (triggers.length === 0) return;
|
|
64
|
+
|
|
65
|
+
const current = triggers.indexOf(e.currentTarget);
|
|
66
|
+
let next = current;
|
|
67
|
+
|
|
68
|
+
if (e.key === 'ArrowDown') next = (current + 1) % triggers.length;
|
|
69
|
+
else if (e.key === 'ArrowUp') next = (current - 1 + triggers.length) % triggers.length;
|
|
70
|
+
else if (e.key === 'Home') next = 0;
|
|
71
|
+
else if (e.key === 'End') next = triggers.length - 1;
|
|
72
|
+
|
|
73
|
+
triggers[next]?.focus();
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
const renderedIcon =
|
|
77
|
+
icon === null
|
|
78
|
+
? null
|
|
79
|
+
: (icon ?? <ChevronDown size={16} aria-hidden="true" className={styles.indicator} />);
|
|
80
|
+
|
|
81
|
+
// headerLevel is a string union of valid HTML heading tag names; cast to
|
|
82
|
+
// ElementType for JSX use.
|
|
83
|
+
const Heading = headerLevel as 'h2' | 'h3' | 'h4' | 'h5' | 'h6';
|
|
84
|
+
|
|
85
|
+
return (
|
|
86
|
+
// Header ROW: the heading (toggle button) + an optional actions slot. Actions
|
|
87
|
+
// live OUTSIDE the heading/button so they're independently clickable (no
|
|
88
|
+
// toggle), valid HTML (no nested buttons), and don't pollute the heading's
|
|
89
|
+
// accessible name.
|
|
90
|
+
<div className={styles.header}>
|
|
91
|
+
<Heading className={styles.heading}>
|
|
92
|
+
{/* Pattern B — {...props} first so component-owned id/aria-expanded/
|
|
93
|
+
aria-controls/disabled/onClick/onKeyDown/className win and the ARIA
|
|
94
|
+
contract can't be overridden by a consumer. */}
|
|
95
|
+
<button
|
|
96
|
+
{...props}
|
|
97
|
+
ref={ref}
|
|
98
|
+
type="button"
|
|
99
|
+
id={triggerId}
|
|
100
|
+
// Stable marker so keyboard arrow-nav targets ONLY accordion toggles,
|
|
101
|
+
// never an aria-expanded control in the `actions` slot.
|
|
102
|
+
data-accordion-trigger=""
|
|
103
|
+
aria-expanded={isOpen}
|
|
104
|
+
aria-controls={contentId}
|
|
105
|
+
disabled={disabled}
|
|
106
|
+
onClick={() => toggle(value)}
|
|
107
|
+
onKeyDown={handleKeyDown}
|
|
108
|
+
className={clsx(styles.trigger, className)}
|
|
109
|
+
>
|
|
110
|
+
<span className={styles.label}>{children}</span>
|
|
111
|
+
{/* Icon wrapped in a slot so its side is controlled purely by CSS
|
|
112
|
+
(root data-indicator-side flips its `order`) — works for a custom
|
|
113
|
+
`icon` too, not just the default chevron. */}
|
|
114
|
+
{renderedIcon !== null && <span className={styles.indicatorSlot}>{renderedIcon}</span>}
|
|
115
|
+
</button>
|
|
116
|
+
</Heading>
|
|
117
|
+
{actions != null && <div className={styles.actions}>{actions}</div>}
|
|
118
|
+
</div>
|
|
119
|
+
);
|
|
120
|
+
},
|
|
121
|
+
);
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { createContext, useContext } from 'react';
|
|
2
|
+
|
|
3
|
+
export interface AccordionContextValue {
|
|
4
|
+
/** Selection mode. */
|
|
5
|
+
mode: 'single' | 'multiple';
|
|
6
|
+
/** Whether the given item value is currently open. */
|
|
7
|
+
isOpen: (value: string) => boolean;
|
|
8
|
+
/** Toggle the given item value. Closes others in single mode; flips membership in multiple mode. */
|
|
9
|
+
toggle: (value: string) => void;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export const AccordionContext = createContext<AccordionContextValue | null>(null);
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Hook for child components to read the root context. Throws if used outside
|
|
16
|
+
* an `<Accordion>` — surfaces the bug early instead of silently no-op'ing.
|
|
17
|
+
*/
|
|
18
|
+
export function useAccordionContext(componentName: string): AccordionContextValue {
|
|
19
|
+
const ctx = useContext(AccordionContext);
|
|
20
|
+
if (ctx === null) {
|
|
21
|
+
throw new Error(`<Accordion.${componentName}> must be used inside <Accordion>`);
|
|
22
|
+
}
|
|
23
|
+
return ctx;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export interface AccordionItemContextValue {
|
|
27
|
+
/** This item's unique value. */
|
|
28
|
+
value: string;
|
|
29
|
+
/** Whether the item is disabled (Trigger non-interactive, keyboard nav skips). */
|
|
30
|
+
disabled: boolean;
|
|
31
|
+
/** Whether the item is currently open (mirrored from root context for convenience). */
|
|
32
|
+
isOpen: boolean;
|
|
33
|
+
/** Stable id for the Trigger (so Content's aria-labelledby points at it). */
|
|
34
|
+
triggerId: string;
|
|
35
|
+
/** Stable id for the Content (so Trigger's aria-controls points at it). */
|
|
36
|
+
contentId: string;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export const AccordionItemContext = createContext<AccordionItemContextValue | null>(null);
|
|
40
|
+
|
|
41
|
+
export function useAccordionItemContext(componentName: string): AccordionItemContextValue {
|
|
42
|
+
const ctx = useContext(AccordionItemContext);
|
|
43
|
+
if (ctx === null) {
|
|
44
|
+
throw new Error(`<Accordion.${componentName}> must be used inside <Accordion.Item>`);
|
|
45
|
+
}
|
|
46
|
+
return ctx;
|
|
47
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export { Accordion } from './Accordion';
|
|
2
|
+
export type {
|
|
3
|
+
AccordionProps,
|
|
4
|
+
AccordionMode,
|
|
5
|
+
AccordionHeaderLevel,
|
|
6
|
+
AccordionVariant,
|
|
7
|
+
AccordionSize,
|
|
8
|
+
AccordionGap,
|
|
9
|
+
AccordionIndicatorSide,
|
|
10
|
+
AccordionActionsWhenClosed,
|
|
11
|
+
} from './Accordion';
|
|
12
|
+
export type { AccordionItemProps } from './AccordionItem';
|
|
13
|
+
export type { AccordionTriggerProps } from './AccordionTrigger';
|
|
14
|
+
export type { AccordionContentProps } from './AccordionContent';
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
@use '../../styles/mixins' as *;
|
|
2
|
+
@use './Alert.tokens';
|
|
3
|
+
|
|
4
|
+
.alert {
|
|
5
|
+
display: grid;
|
|
6
|
+
grid-template-columns: auto 1fr auto;
|
|
7
|
+
gap: var(--alert-gap);
|
|
8
|
+
align-items: start;
|
|
9
|
+
padding: var(--alert-padding-y) var(--alert-padding-x);
|
|
10
|
+
background: var(--alert-bg);
|
|
11
|
+
border-radius: var(--alert-radius);
|
|
12
|
+
border-left: var(--alert-border-width) solid var(--alert-border-color);
|
|
13
|
+
color: var(--alert-fg);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
.alert[data-tone='info'] {
|
|
17
|
+
background: var(--alert-bg-info);
|
|
18
|
+
border-left-color: var(--alert-border-color-info);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
.alert[data-tone='success'] {
|
|
22
|
+
background: var(--alert-bg-success);
|
|
23
|
+
border-left-color: var(--alert-border-color-success);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
.alert[data-tone='warning'] {
|
|
27
|
+
background: var(--alert-bg-warning);
|
|
28
|
+
border-left-color: var(--alert-border-color-warning);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
.alert[data-tone='error'] {
|
|
32
|
+
background: var(--alert-bg-danger);
|
|
33
|
+
border-left-color: var(--alert-border-color-danger);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
.icon {
|
|
37
|
+
display: grid;
|
|
38
|
+
place-items: center;
|
|
39
|
+
|
|
40
|
+
// Match the first text line's box so the icon sits centered with the title
|
|
41
|
+
// line (the alert grid is align-items:start, which would otherwise top-align
|
|
42
|
+
// the 16px icon ~2px above the line's optical center).
|
|
43
|
+
min-height: var(--alert-icon-row-height);
|
|
44
|
+
color: var(--alert-icon);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
.alert[data-tone='info'] .icon {
|
|
48
|
+
color: var(--alert-icon-info);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
.alert[data-tone='success'] .icon {
|
|
52
|
+
color: var(--alert-icon-success);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
.alert[data-tone='warning'] .icon {
|
|
56
|
+
color: var(--alert-icon-warning);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
.alert[data-tone='error'] .icon {
|
|
60
|
+
color: var(--alert-icon-danger);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
.body {
|
|
64
|
+
min-width: 0;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
.title {
|
|
68
|
+
display: block;
|
|
69
|
+
font-size: var(--alert-title-font-size);
|
|
70
|
+
font-weight: var(--alert-title-font-weight);
|
|
71
|
+
|
|
72
|
+
// Keep this 1.4 in sync with --alert-icon-row-height (the icon centers to this
|
|
73
|
+
// line box).
|
|
74
|
+
line-height: 1.4;
|
|
75
|
+
color: var(--alert-title-fg);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
.description {
|
|
79
|
+
font-size: var(--alert-description-font-size);
|
|
80
|
+
color: var(--alert-description-fg);
|
|
81
|
+
line-height: 1.5;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
.title + .description {
|
|
85
|
+
// stylelint-disable-next-line property-disallowed-list -- internal spacing between alert title and its description child
|
|
86
|
+
margin-top: var(--alert-title-description-gap);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
.actions {
|
|
90
|
+
// stylelint-disable-next-line property-disallowed-list -- internal spacing between alert body content and its action row
|
|
91
|
+
margin-top: var(--alert-actions-gap);
|
|
92
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
// Alert.tokens.scss — Component-scoped tokens for <Alert>. Per-tone bg/fg/icon/border-color pairs for info/success/warning/danger, plus shared shape and typography defaults. Each token defaults to the primitive the SCSS used before this migration.
|
|
2
|
+
:root {
|
|
3
|
+
// Shared shape + typography
|
|
4
|
+
--alert-bg: var(--color-bg);
|
|
5
|
+
--alert-fg: var(--color-fg);
|
|
6
|
+
--alert-border-color: var(--color-fg-muted);
|
|
7
|
+
--alert-border-width: var(--border-width-strong);
|
|
8
|
+
--alert-radius: var(--radius-md);
|
|
9
|
+
--alert-padding-y: var(--space-3);
|
|
10
|
+
--alert-padding-x: var(--space-4);
|
|
11
|
+
--alert-gap: var(--space-3);
|
|
12
|
+
--alert-icon: var(--color-fg-muted);
|
|
13
|
+
|
|
14
|
+
// Title
|
|
15
|
+
--alert-title-fg: var(--color-fg);
|
|
16
|
+
--alert-title-font-size: var(--font-size-md);
|
|
17
|
+
--alert-title-font-weight: var(--font-weight-medium);
|
|
18
|
+
|
|
19
|
+
// Icon box height = the title's line box (font-size × 1.4 line-height), so the
|
|
20
|
+
// icon centers with the first text line instead of top-aligning above it.
|
|
21
|
+
--alert-icon-row-height: calc(var(--alert-title-font-size) * 1.4);
|
|
22
|
+
|
|
23
|
+
// Description
|
|
24
|
+
--alert-description-fg: var(--color-fg-muted);
|
|
25
|
+
--alert-description-font-size: var(--font-size-sm);
|
|
26
|
+
|
|
27
|
+
// Internal spacing (title-to-description, body-to-actions)
|
|
28
|
+
--alert-title-description-gap: var(--space-1);
|
|
29
|
+
--alert-actions-gap: var(--space-2);
|
|
30
|
+
|
|
31
|
+
// Per-tone surfaces (background + border + icon)
|
|
32
|
+
--alert-bg-info: var(--color-info-bg-subtle);
|
|
33
|
+
--alert-fg-info: var(--color-fg);
|
|
34
|
+
--alert-icon-info: var(--color-info);
|
|
35
|
+
--alert-border-color-info: var(--color-info);
|
|
36
|
+
|
|
37
|
+
--alert-bg-success: var(--color-success-bg-subtle);
|
|
38
|
+
--alert-fg-success: var(--color-fg);
|
|
39
|
+
--alert-icon-success: var(--color-success);
|
|
40
|
+
--alert-border-color-success: var(--color-success);
|
|
41
|
+
|
|
42
|
+
--alert-bg-warning: var(--color-warning-bg-subtle);
|
|
43
|
+
--alert-fg-warning: var(--color-fg);
|
|
44
|
+
|
|
45
|
+
// warning uses --color-warning-strong, not --color-warning, which measures
|
|
46
|
+
// @contrast --color-warning on --color-bg = 2.14:1 light
|
|
47
|
+
// @contrast --color-warning-strong on --color-bg = 5.95:1 light
|
|
48
|
+
// @contrast --color-warning on --color-warning-bg-subtle = 2.01:1 light
|
|
49
|
+
// @contrast --color-warning-strong on --color-warning-bg-subtle = 5.61:1 light
|
|
50
|
+
// 2.01:1 on the light tint (and 2.14:1 as an icon or border on --color-bg), below WCAG AA
|
|
51
|
+
// for text and below 1.4.11's 3:1 for a graphical object. The strong variant
|
|
52
|
+
// clears both. Dark is unaffected — the two resolve to the same value there.
|
|
53
|
+
--alert-icon-warning: var(--color-warning-strong);
|
|
54
|
+
--alert-border-color-warning: var(--color-warning-strong);
|
|
55
|
+
|
|
56
|
+
--alert-bg-danger: var(--color-danger-bg-subtle);
|
|
57
|
+
--alert-fg-danger: var(--color-fg);
|
|
58
|
+
--alert-icon-danger: var(--color-danger);
|
|
59
|
+
--alert-border-color-danger: var(--color-danger);
|
|
60
|
+
}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { forwardRef, type HTMLAttributes, type ReactNode } from 'react';
|
|
2
|
+
import { AlertTriangle, CheckCircle2, Info, X, XCircle } from 'lucide-react';
|
|
3
|
+
import clsx from 'clsx';
|
|
4
|
+
import { Button } from '../Button';
|
|
5
|
+
import { useTranslation } from '../../i18n/useTranslation';
|
|
6
|
+
import styles from './Alert.module.scss';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Tone — drives icon, accent stripe color, tinted background, and ARIA role.
|
|
10
|
+
*
|
|
11
|
+
* - `'info'` — blue accent. Neutral updates ("Synced 5 minutes ago").
|
|
12
|
+
* - `'success'` — green accent. Confirmations ("Changes saved").
|
|
13
|
+
* - `'warning'` — dark amber accent. Non-blocking heads-up ("Storage at 85%").
|
|
14
|
+
* - `'error'` — red accent. Failures. ALSO sets `role="alert"` (assertive); the
|
|
15
|
+
* other tones use `role="status"` (polite). With `live={false}` every tone
|
|
16
|
+
* is a static `role="note"` instead.
|
|
17
|
+
*/
|
|
18
|
+
export type AlertTone = 'info' | 'success' | 'warning' | 'error';
|
|
19
|
+
|
|
20
|
+
export interface AlertProps extends Omit<HTMLAttributes<HTMLElement>, 'role' | 'title'> {
|
|
21
|
+
/** Tone. Defaults to `'info'`. See `AlertTone` for full descriptions. */
|
|
22
|
+
tone?: AlertTone;
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Optional bold heading. Renders above the description. ReactNode so you
|
|
26
|
+
* can embed inline emphasis (`<>Update <strong>1.2.3</strong> available</>`).
|
|
27
|
+
*
|
|
28
|
+
* The native HTML `title` attribute (tooltip-on-hover) is collapsed by this
|
|
29
|
+
* prop. Use `aria-label` if you need that.
|
|
30
|
+
*/
|
|
31
|
+
title?: ReactNode;
|
|
32
|
+
|
|
33
|
+
/** Description body. Rendered below the title in muted color. */
|
|
34
|
+
children?: ReactNode;
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Override the tone's default icon. Pass any ReactNode (typically a
|
|
38
|
+
* lucide-react icon). Pass `null` to hide the icon entirely.
|
|
39
|
+
*
|
|
40
|
+
* Defaults: `info` → `Info`, `success` → `CheckCircle2`,
|
|
41
|
+
* `warning` → `AlertTriangle`, `error` → `XCircle`.
|
|
42
|
+
*/
|
|
43
|
+
icon?: ReactNode | null;
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Optional action row rendered below the description. Typically a single
|
|
47
|
+
* Button or a Cluster of two ("Retry", "Dismiss"). The component doesn't
|
|
48
|
+
* manage the action row's layout — pass a pre-laid-out node.
|
|
49
|
+
*/
|
|
50
|
+
actions?: ReactNode;
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Whether the Alert is a live region. Defaults to `true`: `role="status"`
|
|
54
|
+
* (polite), or `role="alert"` (assertive) for `tone="error"` — right for a
|
|
55
|
+
* message that APPEARS in response to something (a save failed, an update
|
|
56
|
+
* arrived).
|
|
57
|
+
*
|
|
58
|
+
* Pass `false` for a callout that is simply part of the page when it opens —
|
|
59
|
+
* a "Needs action" note in each card of a list, a standing warning in a
|
|
60
|
+
* form. It renders `role="note"` with the same visuals and no live
|
|
61
|
+
* semantics, so screen readers read it in place instead of announcing it.
|
|
62
|
+
* N live Alerts mounting together can queue N announcements (#547).
|
|
63
|
+
*
|
|
64
|
+
* The tone is shown by the icon's shape and the colour only; it is not
|
|
65
|
+
* exposed to assistive tech in either mode (the icon is decorative). With
|
|
66
|
+
* `live={false}`, `tone="error"` also loses the "alert" role that browse-mode
|
|
67
|
+
* readers speak. So put the urgency in `title` ("Needs action").
|
|
68
|
+
*
|
|
69
|
+
* Decide it at mount: flipping `false` → `true` on a mounted Alert turns
|
|
70
|
+
* content that is already there into a live region, which announces nothing.
|
|
71
|
+
* @default true
|
|
72
|
+
*/
|
|
73
|
+
live?: boolean;
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Called when the user clicks the close (×) button. When set, the close
|
|
77
|
+
* button renders; when omitted, no close button. Alert is **controlled** —
|
|
78
|
+
* the component does NOT manage internal hidden state. Hide via
|
|
79
|
+
* conditional render in the consumer:
|
|
80
|
+
*
|
|
81
|
+
* ```tsx
|
|
82
|
+
* const [show, setShow] = useState(true);
|
|
83
|
+
* {show && <Alert tone="success" onDismiss={() => setShow(false)}>Saved</Alert>}
|
|
84
|
+
* ```
|
|
85
|
+
*/
|
|
86
|
+
onDismiss?: () => void;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const DEFAULT_ICONS: Record<AlertTone, ReactNode> = {
|
|
90
|
+
info: <Info size={16} aria-hidden="true" />,
|
|
91
|
+
success: <CheckCircle2 size={16} aria-hidden="true" />,
|
|
92
|
+
warning: <AlertTriangle size={16} aria-hidden="true" />,
|
|
93
|
+
error: <XCircle size={16} aria-hidden="true" />,
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Persistent in-flow notification.
|
|
98
|
+
* @see docs/components/Alert.md
|
|
99
|
+
*/
|
|
100
|
+
export const Alert = forwardRef<HTMLDivElement, AlertProps>(function Alert(
|
|
101
|
+
{ tone = 'info', title, children, icon, actions, live = true, onDismiss, className, ...props },
|
|
102
|
+
ref,
|
|
103
|
+
) {
|
|
104
|
+
const t = useTranslation();
|
|
105
|
+
const role = !live ? 'note' : tone === 'error' ? 'alert' : 'status';
|
|
106
|
+
const renderedIcon = icon === null ? null : (icon ?? DEFAULT_ICONS[tone]);
|
|
107
|
+
|
|
108
|
+
return (
|
|
109
|
+
<div
|
|
110
|
+
ref={ref}
|
|
111
|
+
{...props}
|
|
112
|
+
// {...props} first so role / data-tone (the ARIA contract) win.
|
|
113
|
+
role={role}
|
|
114
|
+
data-tone={tone}
|
|
115
|
+
className={clsx(styles.alert, className)}
|
|
116
|
+
>
|
|
117
|
+
{renderedIcon && <div className={styles.icon}>{renderedIcon}</div>}
|
|
118
|
+
<div className={styles.body}>
|
|
119
|
+
{title && <strong className={styles.title}>{title}</strong>}
|
|
120
|
+
{children && <div className={styles.description}>{children}</div>}
|
|
121
|
+
{actions && <div className={styles.actions}>{actions}</div>}
|
|
122
|
+
</div>
|
|
123
|
+
{onDismiss && (
|
|
124
|
+
<Button
|
|
125
|
+
variant="ghost"
|
|
126
|
+
size="xs"
|
|
127
|
+
iconOnly
|
|
128
|
+
aria-label={t('alert.dismiss')}
|
|
129
|
+
onClick={onDismiss}
|
|
130
|
+
>
|
|
131
|
+
<X size={14} aria-hidden="true" />
|
|
132
|
+
</Button>
|
|
133
|
+
)}
|
|
134
|
+
</div>
|
|
135
|
+
);
|
|
136
|
+
});
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
// AppLayout is a layout-owning primitive — the documented exception to the
|
|
2
|
+
// "no layout properties on components" rule (like Page / Screen / Rail). Owning
|
|
3
|
+
// the viewport-filling shell is its whole job. The topBar / sidebar slots bring
|
|
4
|
+
// their own surfaces; the main region's only own-styling is its content gutter
|
|
5
|
+
// (--app-layout-content-padding) + subtle canvas (--app-layout-content-background)
|
|
6
|
+
// — the canonical shell look, so a DS-only consumer needs no raw CSS. Matches the
|
|
7
|
+
// CRM shell topology
|
|
8
|
+
// (see the playground AppShell): a full-height sidebar down the left, the top bar
|
|
9
|
+
// over the content column, and the main content below it. (stylelint's
|
|
10
|
+
// property-disallowed-list blocks flex-grow / flex-basis but not the `flex`
|
|
11
|
+
// shorthand, min-height, or min-width, so no disable is needed here.)
|
|
12
|
+
@use './AppLayout.tokens';
|
|
13
|
+
|
|
14
|
+
// Column: optional full-window banner above the [sidebar | column] row.
|
|
15
|
+
.root {
|
|
16
|
+
display: flex;
|
|
17
|
+
flex-direction: column;
|
|
18
|
+
min-height: 100vh;
|
|
19
|
+
|
|
20
|
+
// Own stacking context so a nested AppLayout's --z-app-chrome topBar can't
|
|
21
|
+
// tie with (and win tree-order over) an ancestor AppLayout's topBar —
|
|
22
|
+
// nesting is sanctioned (demos mount several inside the app's own shell;
|
|
23
|
+
// see the component JSDoc). `isolation` creates a stacking context WITHOUT
|
|
24
|
+
// creating a containing block, so it doesn't affect portaled overlays
|
|
25
|
+
// (Modal/Drawer/Popover — those escape to document.body regardless) or any
|
|
26
|
+
// in-content `position: fixed` element.
|
|
27
|
+
isolation: isolate;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
.banner,
|
|
31
|
+
.contextBanner {
|
|
32
|
+
flex: none;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// The original shell row. flex: 1 fills the root's min-height (and a
|
|
36
|
+
// consumer's fixed `height: 100vh` override); min-height: 0 lets that
|
|
37
|
+
// fixed-height mode shrink the row so Rail / main manage their own overflow.
|
|
38
|
+
.row {
|
|
39
|
+
display: flex;
|
|
40
|
+
flex: 1;
|
|
41
|
+
flex-direction: row;
|
|
42
|
+
|
|
43
|
+
// Explicit (it's the default) — the full-height sidebar depends on the row
|
|
44
|
+
// stretching its items to the row's height; don't change this to center/start.
|
|
45
|
+
align-items: stretch;
|
|
46
|
+
min-height: 0;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// Full-height sidebar down the left (stretches to the row height). Sets its own
|
|
50
|
+
// width.
|
|
51
|
+
.sidebar {
|
|
52
|
+
flex: none;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Viewport-pinned sidebar (sidebarPinned): the sidebar spans exactly the
|
|
56
|
+
// screen, not the row/page. sticky (not fixed) so it keeps its flex-row slot
|
|
57
|
+
// and width; a DEFINITE 100dvh height gives a Rail's `height: 100%` something
|
|
58
|
+
// to resolve against, which is what lets its footer pin to the viewport
|
|
59
|
+
// bottom (the Rail's own scroll body does the pinning, not a spacer).
|
|
60
|
+
// dvh tracks mobile dynamic toolbars;
|
|
61
|
+
// the vh line is the older-engine fallback. overflow-y: auto scrolls an
|
|
62
|
+
// over-tall rail inside the pinned box instead of growing the page.
|
|
63
|
+
.sidebarPinned {
|
|
64
|
+
position: sticky;
|
|
65
|
+
top: 0;
|
|
66
|
+
height: 100vh;
|
|
67
|
+
height: 100dvh;
|
|
68
|
+
overflow-y: auto;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// The top bar + content column to the right of the sidebar. min-width:0 lets the
|
|
72
|
+
// column (and wide content like tables) shrink instead of pushing the sidebar.
|
|
73
|
+
.body {
|
|
74
|
+
display: flex;
|
|
75
|
+
flex: 1;
|
|
76
|
+
flex-direction: column;
|
|
77
|
+
min-width: 0;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// Top bar over the content column; natural height. Also sticky (redundant
|
|
81
|
+
// with the <TopBar> primitive's own `position: sticky; top: 0`, which alone
|
|
82
|
+
// isn't enough): a sticky element's range is capped by its containing
|
|
83
|
+
// block's box, and this wrapper's containing block is itself — sized to the
|
|
84
|
+
// bar's own content height by `flex: none`. Without its own sticky here, the
|
|
85
|
+
// wrapper (and the bar riding inside it) unsticks and scrolls away the
|
|
86
|
+
// instant the page scrolls past the bar's own height. Stickying the wrapper
|
|
87
|
+
// against `.body` (which spans the full scrollable column) gives it room to
|
|
88
|
+
// stay pinned for the page's whole height. z-index keeps it painting over
|
|
89
|
+
// scrolled-under content — `--z-app-chrome` sits above unpositioned page
|
|
90
|
+
// content but below every overlay tier (dropdown/popover/modal/toast/
|
|
91
|
+
// tooltip), so it never fights a real overlay for stacking order.
|
|
92
|
+
.topBar {
|
|
93
|
+
flex: none;
|
|
94
|
+
position: sticky;
|
|
95
|
+
top: 0;
|
|
96
|
+
z-index: var(--z-app-chrome);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// Main content fills the rest of the column. Carries the canonical shell content
|
|
100
|
+
// gutter by default (--app-layout-content-padding = --space-6) so a DS-only
|
|
101
|
+
// consumer gets padded routed content with no prop and no raw CSS; override the
|
|
102
|
+
// token to `0` for a full-bleed main region.
|
|
103
|
+
.main {
|
|
104
|
+
flex: 1;
|
|
105
|
+
min-width: 0;
|
|
106
|
+
padding: var(--app-layout-content-padding);
|
|
107
|
+
|
|
108
|
+
// Subtle content canvas so page Cards lift off it (default
|
|
109
|
+
// --color-bg-subtle; override the token to `transparent` for a flat area).
|
|
110
|
+
background: var(--app-layout-content-background);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// Overlay sidebar (sidebarOverlayBelow): the Drawer panel is 320px
|
|
114
|
+
// (--size-drawer-sm, the sanctioned nav-drawer width) but a <Rail> inside sets
|
|
115
|
+
// its own 240px width and would leave a dead strip. Rebinding the rail's own
|
|
116
|
+
// width token — its documented override surface — makes the rail fill the
|
|
117
|
+
// panel instead. Scoped to this class so it can't leak to an in-flow rail.
|
|
118
|
+
.overlaySidebar {
|
|
119
|
+
--rail-width-expanded: 100%;
|
|
120
|
+
--rail-width-collapsed: 100%;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// The Drawer header consumes part of the fixed-height panel. Give the sidebar
|
|
124
|
+
// the remaining block space and allow it to shrink below its automatic
|
|
125
|
+
// min-content size, so a 100%-height Rail keeps its footer inside the panel on
|
|
126
|
+
// short touch viewports.
|
|
127
|
+
.overlaySidebarContent {
|
|
128
|
+
flex: 1 1 auto;
|
|
129
|
+
min-height: 0;
|
|
130
|
+
}
|