@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,264 @@
|
|
|
1
|
+
@use './Card.tokens';
|
|
2
|
+
|
|
3
|
+
.card {
|
|
4
|
+
background: var(--card-bg);
|
|
5
|
+
border: var(--border-width) solid var(--card-border-color);
|
|
6
|
+
border-radius: var(--card-radius);
|
|
7
|
+
box-shadow: var(--card-shadow);
|
|
8
|
+
|
|
9
|
+
// Default: clip children to the rounded border so square-cornered content
|
|
10
|
+
// (Tables with internal scrollWrap, images, full-bleed media) doesn't show
|
|
11
|
+
// a seam at the Card's rounded corners. Overlay primitives (DropdownMenu,
|
|
12
|
+
// Tooltip, Popover) portal out via Floating UI and aren't affected; focus
|
|
13
|
+
// rings are clipped, so flush focusables draw them inset.
|
|
14
|
+
// Opt out with `<Card overflow="visible">` when a child genuinely needs to
|
|
15
|
+
// overhang the card (decorative badges, hover lifts, etc).
|
|
16
|
+
overflow: hidden;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
.overflowVisible {
|
|
20
|
+
// stylelint-disable-next-line scale-unlimited/declaration-strict-value -- CSS keyword
|
|
21
|
+
overflow: visible;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
.fill {
|
|
25
|
+
height: 100%;
|
|
26
|
+
min-width: 0;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// Card owns this layout because it relates only its own Header and Body
|
|
30
|
+
// compound pieces. It activates only for `<Card fill>` with a direct Body, so
|
|
31
|
+
// ordinary fill Cards keep their existing block layout.
|
|
32
|
+
.fillWithBody {
|
|
33
|
+
display: flex;
|
|
34
|
+
flex-direction: column;
|
|
35
|
+
min-height: 0;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
.fillWithBody > .header {
|
|
39
|
+
flex-shrink: 0;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Tone-coded left-stripe via inset box-shadow. Drawn inside the card on top
|
|
43
|
+
// of the existing border, so untoned cards stay pixel-identical to before
|
|
44
|
+
// (no layout shift, no width change). The existing --shadow-sm stays on
|
|
45
|
+
// every card; the inset stripe layers on top when `data-tone` is set.
|
|
46
|
+
.card[data-tone='accent'] {
|
|
47
|
+
box-shadow:
|
|
48
|
+
inset var(--card-stripe-width) 0 0 var(--card-stripe-color-accent),
|
|
49
|
+
var(--card-shadow);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
.card[data-tone='info'] {
|
|
53
|
+
box-shadow:
|
|
54
|
+
inset var(--card-stripe-width) 0 0 var(--card-stripe-color-info),
|
|
55
|
+
var(--card-shadow);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
.card[data-tone='success'] {
|
|
59
|
+
box-shadow:
|
|
60
|
+
inset var(--card-stripe-width) 0 0 var(--card-stripe-color-success),
|
|
61
|
+
var(--card-shadow);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
.card[data-tone='warning'] {
|
|
65
|
+
box-shadow:
|
|
66
|
+
inset var(--card-stripe-width) 0 0 var(--card-stripe-color-warning),
|
|
67
|
+
var(--card-shadow);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.card[data-tone='danger'] {
|
|
71
|
+
box-shadow:
|
|
72
|
+
inset var(--card-stripe-width) 0 0 var(--card-stripe-color-danger),
|
|
73
|
+
var(--card-shadow);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
.paddingNone {
|
|
77
|
+
padding: 0;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
.paddingSm {
|
|
81
|
+
padding: var(--card-padding-sm);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
.paddingMd {
|
|
85
|
+
padding: var(--card-padding-md);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
.paddingLg {
|
|
89
|
+
padding: var(--card-padding-lg);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
.header {
|
|
93
|
+
display: flex;
|
|
94
|
+
align-items: center;
|
|
95
|
+
justify-content: space-between;
|
|
96
|
+
gap: var(--card-section-gap);
|
|
97
|
+
padding: var(--card-section-padding-y) var(--card-section-padding-x);
|
|
98
|
+
border-bottom: var(--border-width) solid var(--card-section-border-color);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
.title {
|
|
102
|
+
// stylelint-disable-next-line property-disallowed-list -- native heading margin reset
|
|
103
|
+
margin: 0;
|
|
104
|
+
font-size: var(--card-title-font-size);
|
|
105
|
+
font-weight: var(--card-title-font-weight);
|
|
106
|
+
color: var(--card-title-fg);
|
|
107
|
+
min-width: 0;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
.action {
|
|
111
|
+
flex-shrink: 0;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// With meta: grid, not flex. Flex shrink is weighted by size, so the title
|
|
115
|
+
// would always give up a fraction of a pixel and wrap; here the auto title
|
|
116
|
+
// track reaches its one-line width before the 1fr meta track gets anything,
|
|
117
|
+
// so meta (min 0, ellipsis) absorbs every narrowing until it is gone. The
|
|
118
|
+
// gaps live in padding, not column-gap, so a collapsed meta track costs the
|
|
119
|
+
// title nothing beyond the one gap it has without meta.
|
|
120
|
+
.withMeta {
|
|
121
|
+
display: grid;
|
|
122
|
+
grid-template-columns: auto minmax(0, 1fr);
|
|
123
|
+
grid-auto-flow: column;
|
|
124
|
+
column-gap: 0;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// flex-shrink means nothing on a grid item; an auto track's floor is
|
|
128
|
+
// min-content, so pin it to max-content to keep a text action from wrapping.
|
|
129
|
+
.withMeta .action {
|
|
130
|
+
min-width: max-content;
|
|
131
|
+
padding-inline-start: var(--card-section-gap);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// With controls: the header is an inline-size container and an inner grid
|
|
135
|
+
// holds the items, so a container query can re-lay them out. Wide: title ·
|
|
136
|
+
// controls · meta (or an empty spacer) · action (or an empty placeholder), so
|
|
137
|
+
// action always lands in column 4, right-aligned. The title track keeps a
|
|
138
|
+
// short minimum (ellipsis below its natural width); meta truncates before the
|
|
139
|
+
// title gives up anything. Gaps live in padding, as with meta.
|
|
140
|
+
.withControls {
|
|
141
|
+
display: block;
|
|
142
|
+
container: card-header / inline-size;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
.controlsGrid {
|
|
146
|
+
display: grid;
|
|
147
|
+
grid-auto-flow: column;
|
|
148
|
+
grid-template-columns:
|
|
149
|
+
minmax(var(--card-title-min-width), auto) max-content minmax(0, 1fr)
|
|
150
|
+
max-content;
|
|
151
|
+
align-items: center;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
.withControls .title {
|
|
155
|
+
overflow: hidden;
|
|
156
|
+
white-space: nowrap;
|
|
157
|
+
text-overflow: ellipsis;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
.withControls .action {
|
|
161
|
+
min-width: max-content;
|
|
162
|
+
padding-inline-start: var(--card-section-gap);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
.controls {
|
|
166
|
+
min-width: max-content;
|
|
167
|
+
padding-inline-start: var(--card-section-gap);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// SCSS constant because container-query conditions can't read custom
|
|
171
|
+
// properties (same as Image.module.scss). Sized for the 96px title floor, a
|
|
172
|
+
// two-option ButtonGroup (~175px) and an icon action, plus gaps (~323px).
|
|
173
|
+
// ponytail: fixed threshold; wider controls overflow between it and their real need.
|
|
174
|
+
$controls-wrap-below: 360px;
|
|
175
|
+
|
|
176
|
+
// Narrow: controls move to a second row under the title (order, not
|
|
177
|
+
// grid-column, so auto-placement does it). Row 1 is title · meta · action.
|
|
178
|
+
@container card-header (max-width: #{$controls-wrap-below}) {
|
|
179
|
+
.controlsGrid {
|
|
180
|
+
grid-auto-flow: row;
|
|
181
|
+
grid-template-columns: minmax(0, auto) minmax(0, 1fr) max-content;
|
|
182
|
+
row-gap: var(--card-section-gap);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
.controls {
|
|
186
|
+
order: 1;
|
|
187
|
+
padding-inline-start: 0;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
.subtle {
|
|
192
|
+
background: var(--card-header-bg-subtle);
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
.meta {
|
|
196
|
+
min-width: 0;
|
|
197
|
+
padding-inline-start: var(--card-section-gap);
|
|
198
|
+
font-size: var(--card-meta-font-size);
|
|
199
|
+
color: var(--card-meta-fg);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
.metaText {
|
|
203
|
+
display: block;
|
|
204
|
+
overflow: hidden;
|
|
205
|
+
white-space: nowrap;
|
|
206
|
+
text-overflow: ellipsis;
|
|
207
|
+
text-align: end;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
// In a fill Card (a sized cell, e.g. DashboardWidget) the meta box is sized
|
|
211
|
+
// by its 1fr track, never by content, so size containment is safe there and
|
|
212
|
+
// lets .metaText hide once only a clipped letter or a lone "…" would show.
|
|
213
|
+
// Not on other Cards: in a shrink-to-fit parent containment would zero
|
|
214
|
+
// meta's width and hide it for good; those keep the plain ellipsis. A fill
|
|
215
|
+
// Card in a shrink-to-fit parent would hit the same trap; the meta JSDoc
|
|
216
|
+
// warns about it.
|
|
217
|
+
.fill .meta {
|
|
218
|
+
container: card-meta / inline-size;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
// SCSS constant because container-query conditions can't read custom
|
|
222
|
+
// properties (same as Image.module.scss).
|
|
223
|
+
// ponytail: fixed threshold — fine for the muted sm text it sizes.
|
|
224
|
+
$meta-hide-below: 48px;
|
|
225
|
+
|
|
226
|
+
@container card-meta (max-width: #{$meta-hide-below}) {
|
|
227
|
+
// Clip, not visibility/display: the text stays in the accessibility tree.
|
|
228
|
+
.metaText {
|
|
229
|
+
clip-path: inset(50%);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
.body {
|
|
234
|
+
min-height: 0;
|
|
235
|
+
padding: var(--card-body-padding-y) var(--card-body-padding-x);
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
.scroll {
|
|
239
|
+
// Intentional compound-internal layout exception: Body is the Card-owned
|
|
240
|
+
// flexible sibling beneath Header, not a consumer-positioned component.
|
|
241
|
+
flex: 1 1 auto;
|
|
242
|
+
overflow-y: auto;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
.list {
|
|
246
|
+
list-style: none;
|
|
247
|
+
// stylelint-disable-next-line property-disallowed-list -- native <ul> margin reset
|
|
248
|
+
margin: 0;
|
|
249
|
+
// stylelint-disable-next-line property-disallowed-list -- native <ul> padding reset
|
|
250
|
+
padding: 0;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
.listRow {
|
|
254
|
+
display: flex;
|
|
255
|
+
align-items: center;
|
|
256
|
+
justify-content: space-between;
|
|
257
|
+
gap: var(--card-section-gap);
|
|
258
|
+
padding: var(--card-section-padding-y) var(--card-section-padding-x);
|
|
259
|
+
border-bottom: var(--border-width) solid var(--card-section-border-color);
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
.listRow:last-child {
|
|
263
|
+
border-bottom: 0;
|
|
264
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
// Card.tokens.scss — Component-scoped tokens for <Card>. Each token
|
|
2
|
+
// defaults to the primitive the SCSS used before this migration.
|
|
3
|
+
:root {
|
|
4
|
+
// Surface + border
|
|
5
|
+
--card-bg: var(--color-bg);
|
|
6
|
+
--card-border-color: var(--color-border);
|
|
7
|
+
--card-radius: var(--radius-lg);
|
|
8
|
+
--card-shadow: var(--shadow-sm);
|
|
9
|
+
|
|
10
|
+
// Tone stripe — width + per-tone color (inset box-shadow on the card)
|
|
11
|
+
--card-stripe-width: var(--border-width-strong);
|
|
12
|
+
--card-stripe-color-accent: var(--color-accent);
|
|
13
|
+
--card-stripe-color-info: var(--color-info);
|
|
14
|
+
--card-stripe-color-success: var(--color-success);
|
|
15
|
+
|
|
16
|
+
// @contrast --color-warning on --color-bg = 2.14:1 light
|
|
17
|
+
// @contrast --color-warning-strong on --color-bg = 5.95:1 light
|
|
18
|
+
// warning uses --color-warning-strong; the bare --color-warning measures 2.14:1 here, below
|
|
19
|
+
// WCAG AA for text and below 1.4.11's 3:1 for a graphical object. See #481.
|
|
20
|
+
--card-stripe-color-warning: var(--color-warning-strong);
|
|
21
|
+
--card-stripe-color-danger: var(--color-danger);
|
|
22
|
+
|
|
23
|
+
// Padding per size
|
|
24
|
+
--card-padding-sm: var(--space-3);
|
|
25
|
+
--card-padding-md: var(--space-4);
|
|
26
|
+
--card-padding-lg: var(--space-6);
|
|
27
|
+
|
|
28
|
+
// Header / list-row internal layout
|
|
29
|
+
--card-section-gap: var(--space-3);
|
|
30
|
+
--card-section-padding-y: var(--space-3);
|
|
31
|
+
--card-section-padding-x: var(--space-4);
|
|
32
|
+
--card-section-border-color: var(--color-border);
|
|
33
|
+
|
|
34
|
+
// Sunken, not muted: muted is the segmented ButtonGroup track and the ghost
|
|
35
|
+
// Button hover, so a muted header swallowed both. bg-subtle was the other
|
|
36
|
+
// candidate, but in light it sits ~1 step off --card-bg and the tint vanishes.
|
|
37
|
+
--card-header-bg-subtle: var(--color-bg-sunken);
|
|
38
|
+
|
|
39
|
+
// Body section spacing
|
|
40
|
+
--card-body-padding-y: var(--space-3);
|
|
41
|
+
--card-body-padding-x: var(--space-4);
|
|
42
|
+
|
|
43
|
+
// Title typography
|
|
44
|
+
--card-title-font-size: var(--font-size-md);
|
|
45
|
+
--card-title-font-weight: var(--font-weight-semibold);
|
|
46
|
+
--card-title-fg: var(--color-fg);
|
|
47
|
+
|
|
48
|
+
// Title floor beside `controls` before they wrap under it: 96px keeps a
|
|
49
|
+
// word like "Conditions" whole. No 96px step exists, hence the calc.
|
|
50
|
+
--card-title-min-width: calc(var(--space-12) * 2);
|
|
51
|
+
|
|
52
|
+
// Header meta (secondary text beside the title)
|
|
53
|
+
--card-meta-font-size: var(--font-size-sm);
|
|
54
|
+
--card-meta-fg: var(--color-fg-muted);
|
|
55
|
+
}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Children,
|
|
3
|
+
Fragment,
|
|
4
|
+
forwardRef,
|
|
5
|
+
isValidElement,
|
|
6
|
+
type HTMLAttributes,
|
|
7
|
+
type ReactNode,
|
|
8
|
+
} from 'react';
|
|
9
|
+
import clsx from 'clsx';
|
|
10
|
+
import styles from './Card.module.scss';
|
|
11
|
+
import { CardBody } from './CardBody';
|
|
12
|
+
import { CardHeader } from './CardHeader';
|
|
13
|
+
import { CardList } from './CardList';
|
|
14
|
+
import { CardListRow } from './CardListRow';
|
|
15
|
+
|
|
16
|
+
/** Inner padding. See CardProps#padding for guidance on each. */
|
|
17
|
+
export type CardPadding = 'none' | 'sm' | 'md' | 'lg';
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Optional left-edge tone stripe color. When set on a Card, draws a 3px
|
|
21
|
+
* accent-colored bar on the left edge. Uses the same token vocabulary as Alert.
|
|
22
|
+
*/
|
|
23
|
+
export type CardTone = 'accent' | 'info' | 'success' | 'warning' | 'danger';
|
|
24
|
+
|
|
25
|
+
/** How the Card clips its children. See CardProps#overflow. */
|
|
26
|
+
export type CardOverflow = 'hidden' | 'visible';
|
|
27
|
+
|
|
28
|
+
export interface CardProps extends HTMLAttributes<HTMLDivElement> {
|
|
29
|
+
/**
|
|
30
|
+
* Inner padding.
|
|
31
|
+
* - `none` — use when the card contains a table or list that should bleed
|
|
32
|
+
* edge-to-edge; inner sections manage their own padding.
|
|
33
|
+
* - `sm` (12px) — dense info cards.
|
|
34
|
+
* - `md` (16px) — default for plain-content cards.
|
|
35
|
+
* - `lg` (24px) — emphasis cards, marketing-style panels.
|
|
36
|
+
*
|
|
37
|
+
* When omitted, defaults to `'md'` for plain content, or `'none'` when the
|
|
38
|
+
* card contains compound subcomponents (`Card.Header` / `Card.Body` /
|
|
39
|
+
* `Card.List` / `Card.ListRow`) so its sections bleed to the card edge
|
|
40
|
+
* automatically.
|
|
41
|
+
* Pass an explicit value to override the auto-detect.
|
|
42
|
+
*
|
|
43
|
+
* **Detection is shallow:** only direct children are inspected. Fragments
|
|
44
|
+
* (`<>...</>`) are transparent — the detection recurses into them, so
|
|
45
|
+
* conditional renders that wrap compound children in a Fragment still
|
|
46
|
+
* trigger the auto-detect. But wrapping a `Card.Header` in any other
|
|
47
|
+
* element (`<div>`, `<Stack>`, etc.) defeats the heuristic — pass
|
|
48
|
+
* `padding="none"` explicitly in that case.
|
|
49
|
+
*/
|
|
50
|
+
padding?: CardPadding;
|
|
51
|
+
/**
|
|
52
|
+
* Optional left-edge tone stripe (3px). Useful for "stat card" / "status card"
|
|
53
|
+
* patterns where one card in a row needs visual emphasis. Default: no stripe
|
|
54
|
+
* (the card keeps its standard bordered look).
|
|
55
|
+
*
|
|
56
|
+
* Uses the same tone vocabulary as `Alert`: `accent` / `info` / `success` /
|
|
57
|
+
* `warning` / `danger`.
|
|
58
|
+
*/
|
|
59
|
+
tone?: CardTone;
|
|
60
|
+
/**
|
|
61
|
+
* How the card clips its children at the rounded border.
|
|
62
|
+
* - `hidden` (default) — children are clipped to the rounded border. This
|
|
63
|
+
* prevents the visible seam that appears at the corners when a child has
|
|
64
|
+
* square corners (Table's internal scroll wrapper, images, full-bleed
|
|
65
|
+
* media). Overlays in this library (DropdownMenu, Tooltip, Popover, Drawer,
|
|
66
|
+
* Modal) portal to `document.body` and are NOT clipped by this. Focus
|
|
67
|
+
* rings are NOT exempt: an `outline` is clipped by an ancestor's overflow,
|
|
68
|
+
* so a focusable flush against the card edge loses that band — draw its
|
|
69
|
+
* ring inset by passing `$offset: calc(-1 * var(--ring-offset))` to the
|
|
70
|
+
* `focus-ring` mixin, not a separate `outline-offset` after the `@include`
|
|
71
|
+
* (a `structure.test.ts` gate fails the build on that shape).
|
|
72
|
+
* - `visible` — opt out of clipping. Use when a direct child needs to
|
|
73
|
+
* overhang the card edge — decorative badges that protrude from a corner,
|
|
74
|
+
* hover-lift transforms whose shadow extends past the card border, etc.
|
|
75
|
+
*
|
|
76
|
+
* @default 'hidden'
|
|
77
|
+
*/
|
|
78
|
+
overflow?: CardOverflow;
|
|
79
|
+
/**
|
|
80
|
+
* Fill the containing block's height and allow the Card to shrink within a
|
|
81
|
+
* narrow grid cell. Use in stretched Grid, Sortable, or DashboardCanvas
|
|
82
|
+
* cells whose wrapper already has a definite height. When a direct
|
|
83
|
+
* `Card.Body` child is present, `fill` also establishes Card's internal
|
|
84
|
+
* column and minimum-height chain; add `scroll` to the Body to keep a sibling
|
|
85
|
+
* Header fixed above a scrolling content region. Defaults to `false`.
|
|
86
|
+
* @default false
|
|
87
|
+
*/
|
|
88
|
+
fill?: boolean;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
const paddingClass: Record<CardPadding, string> = {
|
|
92
|
+
none: styles.paddingNone,
|
|
93
|
+
sm: styles.paddingSm,
|
|
94
|
+
md: styles.paddingMd,
|
|
95
|
+
lg: styles.paddingLg,
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
interface CompoundChildrenInfo {
|
|
99
|
+
hasCompound: boolean;
|
|
100
|
+
hasBody: boolean;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function inspectCompoundChildren(children: ReactNode): CompoundChildrenInfo {
|
|
104
|
+
return Children.toArray(children).reduce<CompoundChildrenInfo>(
|
|
105
|
+
(info, child) => {
|
|
106
|
+
if (!isValidElement(child)) return info;
|
|
107
|
+
const type = child.type;
|
|
108
|
+
if (type === CardBody) {
|
|
109
|
+
return { hasCompound: true, hasBody: true };
|
|
110
|
+
}
|
|
111
|
+
if (type === CardHeader || type === CardList || type === CardListRow) {
|
|
112
|
+
return { ...info, hasCompound: true };
|
|
113
|
+
}
|
|
114
|
+
// Fragments are transparent — Children.toArray preserves them as nodes,
|
|
115
|
+
// but a consumer who wraps compound children in a `<>` (e.g. for a
|
|
116
|
+
// conditional render) clearly still wants the auto-detect to fire.
|
|
117
|
+
if (type === Fragment) {
|
|
118
|
+
const nested = inspectCompoundChildren((child.props as { children?: ReactNode }).children);
|
|
119
|
+
return {
|
|
120
|
+
hasCompound: info.hasCompound || nested.hasCompound,
|
|
121
|
+
hasBody: info.hasBody || nested.hasBody,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
return info;
|
|
125
|
+
},
|
|
126
|
+
{ hasCompound: false, hasBody: false },
|
|
127
|
+
);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Bordered container for grouped content, with an optional compound API (`Card.Header` / `Body` / `List` / `ListRow`).
|
|
132
|
+
* @see docs/components/Card.md
|
|
133
|
+
*/
|
|
134
|
+
const CardRoot = forwardRef<HTMLDivElement, CardProps>(function Card(
|
|
135
|
+
{ padding, tone, overflow = 'hidden', fill = false, className, children, ...props },
|
|
136
|
+
ref,
|
|
137
|
+
) {
|
|
138
|
+
const compoundChildren = inspectCompoundChildren(children);
|
|
139
|
+
// Compound subcomponents (Card.Header / Card.Body / Card.List /
|
|
140
|
+
// Card.ListRow) manage their own internal padding and want to bleed to the
|
|
141
|
+
// card edge. When any are present and `padding` wasn't passed explicitly,
|
|
142
|
+
// default to 'none' so the consumer doesn't have to repeat themselves.
|
|
143
|
+
// Explicit `padding` wins.
|
|
144
|
+
const effectivePadding: CardPadding = padding ?? (compoundChildren.hasCompound ? 'none' : 'md');
|
|
145
|
+
// {...props} last so consumer overrides win (Pattern A).
|
|
146
|
+
return (
|
|
147
|
+
<div
|
|
148
|
+
ref={ref}
|
|
149
|
+
className={clsx(
|
|
150
|
+
styles.card,
|
|
151
|
+
paddingClass[effectivePadding],
|
|
152
|
+
overflow === 'visible' && styles.overflowVisible,
|
|
153
|
+
fill && styles.fill,
|
|
154
|
+
fill && compoundChildren.hasBody && styles.fillWithBody,
|
|
155
|
+
className,
|
|
156
|
+
)}
|
|
157
|
+
data-tone={tone}
|
|
158
|
+
{...props}
|
|
159
|
+
>
|
|
160
|
+
{children}
|
|
161
|
+
</div>
|
|
162
|
+
);
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
export const Card = Object.assign(CardRoot, {
|
|
166
|
+
Body: CardBody,
|
|
167
|
+
Header: CardHeader,
|
|
168
|
+
List: CardList,
|
|
169
|
+
ListRow: CardListRow,
|
|
170
|
+
});
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { forwardRef, type HTMLAttributes } from 'react';
|
|
2
|
+
import clsx from 'clsx';
|
|
3
|
+
import styles from './Card.module.scss';
|
|
4
|
+
|
|
5
|
+
/** Props for the content region inside a compound Card. */
|
|
6
|
+
export interface CardBodyProps extends HTMLAttributes<HTMLDivElement> {
|
|
7
|
+
/**
|
|
8
|
+
* Makes the body the flexible vertical scroll region of a `fill` Card while
|
|
9
|
+
* sibling `Card.Header` content stays fixed. The Card's parent must provide
|
|
10
|
+
* a definite height. Defaults to `false`.
|
|
11
|
+
* @default false
|
|
12
|
+
*/
|
|
13
|
+
scroll?: boolean;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Padded content region for the Card compound API.
|
|
18
|
+
* @see docs/components/Card.md
|
|
19
|
+
*/
|
|
20
|
+
export const CardBody = forwardRef<HTMLDivElement, CardBodyProps>(function CardBody(
|
|
21
|
+
{ scroll = false, className, ...props },
|
|
22
|
+
ref,
|
|
23
|
+
) {
|
|
24
|
+
// {...props} last so consumer overrides win (Pattern A) — including
|
|
25
|
+
// tabIndex, so a consumer that gives the region a focusable descendant, or
|
|
26
|
+
// wants to manage focus itself, can opt out with tabIndex={-1}.
|
|
27
|
+
return (
|
|
28
|
+
<div
|
|
29
|
+
ref={ref}
|
|
30
|
+
// `scroll` is what makes this an overflow container, so `scroll` is what
|
|
31
|
+
// has to make it keyboard-reachable. Without it, content that overflows
|
|
32
|
+
// is unreachable for a keyboard-only user whenever it has no focusable
|
|
33
|
+
// descendant — axe `scrollable-region-focusable`, WCAG 2.1.1. The
|
|
34
|
+
// sharpest case is a loading body full of `Skeleton`s, every one of
|
|
35
|
+
// which is aria-hidden: a scrollable region with nothing in it to reach.
|
|
36
|
+
//
|
|
37
|
+
// The NAME still has to come from the consumer — the DS cannot know what
|
|
38
|
+
// the region holds — so pair this with `role="group"` and an
|
|
39
|
+
// `aria-label` when the content warrants announcing.
|
|
40
|
+
tabIndex={scroll ? 0 : undefined}
|
|
41
|
+
className={clsx(styles.body, scroll && styles.scroll, className)}
|
|
42
|
+
{...props}
|
|
43
|
+
/>
|
|
44
|
+
);
|
|
45
|
+
});
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { forwardRef, type HTMLAttributes, type ReactNode } from 'react';
|
|
2
|
+
import clsx from 'clsx';
|
|
3
|
+
import styles from './Card.module.scss';
|
|
4
|
+
|
|
5
|
+
/** Heading level wrapping the title. Defaults to 'h3'. Same vocab as Accordion. */
|
|
6
|
+
export type CardHeaderLevel = 'h2' | 'h3' | 'h4' | 'h5' | 'h6';
|
|
7
|
+
|
|
8
|
+
export interface CardHeaderProps extends HTMLAttributes<HTMLDivElement> {
|
|
9
|
+
/**
|
|
10
|
+
* Heading level for the title text. Defaults to `'h3'` (assumes the page
|
|
11
|
+
* has an h1/h2 above). Override when this section sits beneath an h1
|
|
12
|
+
* directly (`headerLevel="h2"`) or further nested (`headerLevel="h4"`).
|
|
13
|
+
*/
|
|
14
|
+
headerLevel?: CardHeaderLevel;
|
|
15
|
+
/**
|
|
16
|
+
* `'subtle'` paints the header on a tinted (sunken) surface, for a nested editable
|
|
17
|
+
* sub-section inside a `Card.Body` (e.g. a condition group). Defaults to
|
|
18
|
+
* `'default'`.
|
|
19
|
+
*/
|
|
20
|
+
surface?: 'default' | 'subtle';
|
|
21
|
+
/**
|
|
22
|
+
* Optional interactive slot right after the title (e.g. a `ButtonGroup`
|
|
23
|
+
* mode switch). Rendered outside the heading, so it is not part of the
|
|
24
|
+
* heading's name. Order: title, controls, meta, action. Controls never
|
|
25
|
+
* shrink: on a wide header the title ellipsizes down to a short minimum
|
|
26
|
+
* width; on a narrow header (under ~360px of content) the controls wrap onto
|
|
27
|
+
* a second row under the title, which keeps the first row with meta and
|
|
28
|
+
* action. Keep titles short, or pass a `title` attribute for long ones.
|
|
29
|
+
*/
|
|
30
|
+
controls?: ReactNode;
|
|
31
|
+
/**
|
|
32
|
+
* Optional right-aligned slot — typically a `<Link>` or `<Button>` that
|
|
33
|
+
* lets the user navigate to a full list or take a section-level action.
|
|
34
|
+
* Rendered inside a `<span>` that never shrinks or wraps (flex-shrink: 0;
|
|
35
|
+
* with `meta` or `controls`, min-width: max-content). Beside `controls` it is
|
|
36
|
+
* the removal/section action of a nested sub-group (e.g. a ghost delete
|
|
37
|
+
* button), right-aligned after any meta.
|
|
38
|
+
*/
|
|
39
|
+
action?: ReactNode;
|
|
40
|
+
/**
|
|
41
|
+
* Optional secondary, non-interactive text beside the title — freshness
|
|
42
|
+
* ("Updated 3 minutes ago") or status. Muted and single-line; sits just
|
|
43
|
+
* before `action` and is the first thing to give way at narrow widths: it
|
|
44
|
+
* truncates with an ellipsis before the title gives up any width, while
|
|
45
|
+
* `action` keeps its width. In a `fill` Card (which needs a parent of
|
|
46
|
+
* definite width) it is also visually hidden, still read by screen
|
|
47
|
+
* readers, once only a sliver would show. Not part
|
|
48
|
+
* of the heading's name. Put controls in `controls` or `action`, never
|
|
49
|
+
* here. `false` and `''` count as no meta.
|
|
50
|
+
*/
|
|
51
|
+
meta?: ReactNode;
|
|
52
|
+
/**
|
|
53
|
+
* Title content. Becomes the inner text of the heading element. Typically
|
|
54
|
+
* a plain string, but can contain inline elements if needed.
|
|
55
|
+
*/
|
|
56
|
+
children: ReactNode;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Title row subcomponent for `<Card>` with optional right-aligned meta text and action slot.
|
|
61
|
+
* @see docs/components/Card.md
|
|
62
|
+
*/
|
|
63
|
+
export const CardHeader = forwardRef<HTMLDivElement, CardHeaderProps>(function CardHeader(
|
|
64
|
+
{ headerLevel = 'h3', surface = 'default', controls, action, meta, children, className, ...rest },
|
|
65
|
+
ref,
|
|
66
|
+
) {
|
|
67
|
+
// headerLevel is a string union of valid HTML heading tag names; cast to
|
|
68
|
+
// the union (not a single literal) so the JSX dispatch type is honest.
|
|
69
|
+
const Heading = headerLevel as 'h2' | 'h3' | 'h4' | 'h5' | 'h6';
|
|
70
|
+
const hasMeta = meta != null && meta !== false && meta !== '';
|
|
71
|
+
const hasControls = controls != null && controls !== false && controls !== '';
|
|
72
|
+
const title = <Heading className={styles.title}>{children}</Heading>;
|
|
73
|
+
const metaNode = hasMeta && (
|
|
74
|
+
<span className={styles.meta}>
|
|
75
|
+
<span className={styles.metaText}>{meta}</span>
|
|
76
|
+
</span>
|
|
77
|
+
);
|
|
78
|
+
const actionNode = action != null ? <span className={styles.action}>{action}</span> : null;
|
|
79
|
+
// {...rest} last so consumer overrides win (Pattern A).
|
|
80
|
+
return (
|
|
81
|
+
<div
|
|
82
|
+
ref={ref}
|
|
83
|
+
className={clsx(
|
|
84
|
+
styles.header,
|
|
85
|
+
hasMeta && styles.withMeta,
|
|
86
|
+
hasControls && styles.withControls,
|
|
87
|
+
surface === 'subtle' && styles.subtle,
|
|
88
|
+
className,
|
|
89
|
+
)}
|
|
90
|
+
data-surface={surface === 'subtle' ? 'subtle' : undefined}
|
|
91
|
+
{...rest}
|
|
92
|
+
>
|
|
93
|
+
{hasControls ? (
|
|
94
|
+
// The header is the size container; this inner grid is what its
|
|
95
|
+
// container query re-lays out (a container can't restyle itself).
|
|
96
|
+
<div className={styles.controlsGrid}>
|
|
97
|
+
{title}
|
|
98
|
+
<span className={styles.controls}>{controls}</span>
|
|
99
|
+
{!hasMeta && <span aria-hidden="true" />}
|
|
100
|
+
{metaNode}
|
|
101
|
+
{/* Placeholder keeps the column count fixed when there is no action. */}
|
|
102
|
+
{actionNode ?? <span aria-hidden="true" />}
|
|
103
|
+
</div>
|
|
104
|
+
) : (
|
|
105
|
+
<>
|
|
106
|
+
{title}
|
|
107
|
+
{metaNode}
|
|
108
|
+
{actionNode}
|
|
109
|
+
</>
|
|
110
|
+
)}
|
|
111
|
+
</div>
|
|
112
|
+
);
|
|
113
|
+
});
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { forwardRef, type HTMLAttributes, type ReactNode } from 'react';
|
|
2
|
+
import clsx from 'clsx';
|
|
3
|
+
import styles from './Card.module.scss';
|
|
4
|
+
|
|
5
|
+
export interface CardListProps extends HTMLAttributes<HTMLUListElement> {
|
|
6
|
+
/** Row items — typically `<Card.ListRow>` elements. */
|
|
7
|
+
children: ReactNode;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Semantic `<ul>` wrapper for a list of `<Card.ListRow>` items inside a `<Card>`.
|
|
12
|
+
* @see docs/components/Card.md
|
|
13
|
+
*/
|
|
14
|
+
export const CardList = forwardRef<HTMLUListElement, CardListProps>(function CardList(
|
|
15
|
+
{ children, className, ...rest },
|
|
16
|
+
ref,
|
|
17
|
+
) {
|
|
18
|
+
// {...rest} last so consumer overrides win (Pattern A).
|
|
19
|
+
return (
|
|
20
|
+
<ul ref={ref} className={clsx(styles.list, className)} {...rest}>
|
|
21
|
+
{children}
|
|
22
|
+
</ul>
|
|
23
|
+
);
|
|
24
|
+
});
|