@eocrm/design-system 0.0.0-stage → 0.6.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AI-PRIMER.md +341 -0
- package/README.md +262 -2
- package/docs/components/Accordion.md +114 -0
- package/docs/components/AgentAvatar.md +58 -0
- package/docs/components/Alert.md +81 -0
- package/docs/components/AppLayout.md +70 -0
- package/docs/components/Avatar.md +49 -0
- package/docs/components/AvatarGroup.md +47 -0
- package/docs/components/Badge.md +60 -0
- package/docs/components/Banner.md +89 -0
- package/docs/components/BrandIcon.md +32 -0
- package/docs/components/Breadcrumb.md +72 -0
- package/docs/components/Button.md +107 -0
- package/docs/components/ButtonGroup.md +78 -0
- package/docs/components/Calendar.md +158 -0
- package/docs/components/Card.md +165 -0
- package/docs/components/CatalogPicker.md +83 -0
- package/docs/components/Chart.md +114 -0
- package/docs/components/ChatBubble.md +55 -0
- package/docs/components/ChatLauncher.md +97 -0
- package/docs/components/Checkbox.md +55 -0
- package/docs/components/CircularProgress.md +53 -0
- package/docs/components/Cluster.md +96 -0
- package/docs/components/Code.md +35 -0
- package/docs/components/CodeBlock.md +67 -0
- package/docs/components/ColorPicker.md +115 -0
- package/docs/components/ConfirmationPopover.md +70 -0
- package/docs/components/Constrain.md +39 -0
- package/docs/components/CurrencySelect.md +57 -0
- package/docs/components/CursorPagination.md +43 -0
- package/docs/components/DashboardCanvas.md +79 -0
- package/docs/components/DashboardWidget.md +131 -0
- package/docs/components/DataTable.md +88 -0
- package/docs/components/DatePicker.md +68 -0
- package/docs/components/DateRangePicker.md +71 -0
- package/docs/components/DateStrip.md +56 -0
- package/docs/components/DefinitionList.md +82 -0
- package/docs/components/Divider.md +57 -0
- package/docs/components/Dot.md +26 -0
- package/docs/components/Drawer.md +94 -0
- package/docs/components/DropdownMenu.md +299 -0
- package/docs/components/EmojiPicker.md +84 -0
- package/docs/components/EmptyState.md +55 -0
- package/docs/components/EntityChip.md +102 -0
- package/docs/components/ErrorState.md +72 -0
- package/docs/components/Field.md +91 -0
- package/docs/components/FileUpload.md +109 -0
- package/docs/components/FilterChip.md +88 -0
- package/docs/components/FlowCanvas.md +108 -0
- package/docs/components/FormRow.md +31 -0
- package/docs/components/FormSection.md +37 -0
- package/docs/components/Grid.md +103 -0
- package/docs/components/Highlight.md +75 -0
- package/docs/components/HighlightedText.md +50 -0
- package/docs/components/IconPicker.md +134 -0
- package/docs/components/IconTile.md +30 -0
- package/docs/components/Image.md +84 -0
- package/docs/components/ImageCrop.md +163 -0
- package/docs/components/Indent.md +31 -0
- package/docs/components/InlineDatePicker.md +58 -0
- package/docs/components/InlineDateRangePicker.md +57 -0
- package/docs/components/Input.md +54 -0
- package/docs/components/Kanban.md +122 -0
- package/docs/components/Kbd.md +41 -0
- package/docs/components/Lightbox.md +105 -0
- package/docs/components/Link.md +65 -0
- package/docs/components/LinkCard.md +41 -0
- package/docs/components/LiquidEditor.md +84 -0
- package/docs/components/List.md +68 -0
- package/docs/components/LiveRegion.md +29 -0
- package/docs/components/LocaleProvider.md +25 -0
- package/docs/components/Logo.md +41 -0
- package/docs/components/Masonry.md +48 -0
- package/docs/components/MediaTile.md +95 -0
- package/docs/components/Modal.md +107 -0
- package/docs/components/MoneyInput.md +62 -0
- package/docs/components/OptionsPicker.md +123 -0
- package/docs/components/OtpInput.md +65 -0
- package/docs/components/Page.md +35 -0
- package/docs/components/PageHeader.md +133 -0
- package/docs/components/Pagination.md +44 -0
- package/docs/components/Palette.md +32 -0
- package/docs/components/PasswordInput.md +45 -0
- package/docs/components/PasswordStrengthMeter.md +27 -0
- package/docs/components/PersonDisplay.md +153 -0
- package/docs/components/PhoneInput.md +54 -0
- package/docs/components/PillMenu.md +91 -0
- package/docs/components/Popover.md +127 -0
- package/docs/components/Progress.md +56 -0
- package/docs/components/QrCode.md +34 -0
- package/docs/components/Radio.md +37 -0
- package/docs/components/RadioGroup.md +56 -0
- package/docs/components/Rail.md +191 -0
- package/docs/components/RelativeDateInput.md +114 -0
- package/docs/components/RichText.md +44 -0
- package/docs/components/RichTextEditor.md +112 -0
- package/docs/components/Screen.md +37 -0
- package/docs/components/ScrollArea.md +39 -0
- package/docs/components/Select.md +131 -0
- package/docs/components/SettingRow.md +98 -0
- package/docs/components/Skeleton.md +68 -0
- package/docs/components/Slider.md +92 -0
- package/docs/components/SlotGrid.md +55 -0
- package/docs/components/SocialButton.md +31 -0
- package/docs/components/Sortable.md +127 -0
- package/docs/components/SortableGroup.md +52 -0
- package/docs/components/Sparkline.md +51 -0
- package/docs/components/Split.md +76 -0
- package/docs/components/Stack.md +59 -0
- package/docs/components/StagePath.md +66 -0
- package/docs/components/StatGroup.md +61 -0
- package/docs/components/StatTile.md +58 -0
- package/docs/components/Sticky.md +69 -0
- package/docs/components/Switch.md +89 -0
- package/docs/components/Table.md +184 -0
- package/docs/components/TableOfContents.md +76 -0
- package/docs/components/Tabs.md +94 -0
- package/docs/components/Text.md +63 -0
- package/docs/components/Textarea.md +59 -0
- package/docs/components/Thread.md +52 -0
- package/docs/components/TimeField.md +70 -0
- package/docs/components/Timeline.md +57 -0
- package/docs/components/Title.md +54 -0
- package/docs/components/ToastViewport.md +61 -0
- package/docs/components/Tooltip.md +63 -0
- package/docs/components/TopBar.md +214 -0
- package/docs/components/Tour.md +85 -0
- package/docs/components/TreeView.md +113 -0
- package/docs/components/VisuallyHidden.md +43 -0
- package/docs/components/WidgetPreview.md +54 -0
- package/docs/components/useBelowBreakpoint.md +11 -0
- package/docs/components/useMonth.md +18 -0
- package/docs/setup.md +51 -0
- package/docs/theming.md +95 -0
- package/docs/tokens.md +123 -0
- package/docs/transient-state.md +56 -0
- package/package.json +82 -4
- package/src/_meta/manifest.ts +293 -0
- package/src/app/AppProvider.tsx +78 -0
- package/src/app/index.ts +3 -0
- package/src/app/themeTokens.ts +95 -0
- package/src/calendar/dateMath.ts +114 -0
- package/src/calendar/formatters.ts +75 -0
- package/src/calendar/index.ts +39 -0
- package/src/calendar/types.ts +36 -0
- package/src/calendar/useAgenda.ts +70 -0
- package/src/calendar/useDay.ts +51 -0
- package/src/calendar/useMonth.ts +82 -0
- package/src/calendar/useWeek.ts +62 -0
- package/src/calendar/weekInfo.ts +83 -0
- package/src/components/Accordion/Accordion.module.scss +304 -0
- package/src/components/Accordion/Accordion.tokens.scss +64 -0
- package/src/components/Accordion/Accordion.tsx +272 -0
- package/src/components/Accordion/AccordionContent.tsx +36 -0
- package/src/components/Accordion/AccordionItem.tsx +66 -0
- package/src/components/Accordion/AccordionTrigger.tsx +121 -0
- package/src/components/Accordion/context.ts +47 -0
- package/src/components/Accordion/index.ts +14 -0
- package/src/components/Alert/Alert.module.scss +92 -0
- package/src/components/Alert/Alert.tokens.scss +60 -0
- package/src/components/Alert/Alert.tsx +136 -0
- package/src/components/Alert/index.ts +2 -0
- package/src/components/AppLayout/AppLayout.module.scss +130 -0
- package/src/components/AppLayout/AppLayout.tokens.scss +27 -0
- package/src/components/AppLayout/AppLayout.tsx +211 -0
- package/src/components/AppLayout/index.ts +2 -0
- package/src/components/Avatar/AgentAvatar.module.scss +117 -0
- package/src/components/Avatar/AgentAvatar.tsx +122 -0
- package/src/components/Avatar/Avatar.module.scss +181 -0
- package/src/components/Avatar/Avatar.tokens.scss +107 -0
- package/src/components/Avatar/Avatar.tsx +210 -0
- package/src/components/Avatar/AvatarGroup.module.scss +128 -0
- package/src/components/Avatar/AvatarGroup.tsx +119 -0
- package/src/components/Avatar/AvatarGroupContext.tsx +20 -0
- package/src/components/Avatar/index.ts +6 -0
- package/src/components/Badge/Badge.module.scss +124 -0
- package/src/components/Badge/Badge.tokens.scss +74 -0
- package/src/components/Badge/Badge.tsx +164 -0
- package/src/components/Badge/index.ts +2 -0
- package/src/components/Banner/Banner.module.scss +73 -0
- package/src/components/Banner/Banner.tokens.scss +51 -0
- package/src/components/Banner/Banner.tsx +138 -0
- package/src/components/Banner/index.ts +2 -0
- package/src/components/BrandIcon/BrandIcon.module.scss +5 -0
- package/src/components/BrandIcon/BrandIcon.tsx +99 -0
- package/src/components/BrandIcon/index.ts +2 -0
- package/src/components/Breadcrumb/Breadcrumb.module.scss +32 -0
- package/src/components/Breadcrumb/Breadcrumb.tokens.scss +9 -0
- package/src/components/Breadcrumb/Breadcrumb.tsx +146 -0
- package/src/components/Breadcrumb/index.ts +2 -0
- package/src/components/Button/Button.module.scss +167 -0
- package/src/components/Button/Button.tokens.scss +90 -0
- package/src/components/Button/Button.tsx +205 -0
- package/src/components/Button/index.ts +2 -0
- package/src/components/ButtonGroup/ButtonGroup.module.scss +134 -0
- package/src/components/ButtonGroup/ButtonGroup.tokens.scss +42 -0
- package/src/components/ButtonGroup/ButtonGroup.tsx +278 -0
- package/src/components/ButtonGroup/ButtonGroupItem.tsx +74 -0
- package/src/components/ButtonGroup/context.ts +45 -0
- package/src/components/ButtonGroup/index.ts +2 -0
- package/src/components/Calendar/AgendaView.module.scss +231 -0
- package/src/components/Calendar/AgendaView.tsx +214 -0
- package/src/components/Calendar/AllDayBand.module.scss +18 -0
- package/src/components/Calendar/AllDayBand.tsx +75 -0
- package/src/components/Calendar/Calendar.module.scss +23 -0
- package/src/components/Calendar/Calendar.tokens.scss +262 -0
- package/src/components/Calendar/Calendar.tsx +370 -0
- package/src/components/Calendar/DayCell.module.scss +30 -0
- package/src/components/Calendar/DayCell.tsx +50 -0
- package/src/components/Calendar/DayView.module.scss +10 -0
- package/src/components/Calendar/DayView.tsx +163 -0
- package/src/components/Calendar/EventChip.module.scss +171 -0
- package/src/components/Calendar/EventChip.tsx +115 -0
- package/src/components/Calendar/HourGrid.module.scss +123 -0
- package/src/components/Calendar/HourGrid.tsx +381 -0
- package/src/components/Calendar/MonthView.module.scss +99 -0
- package/src/components/Calendar/MonthView.tsx +296 -0
- package/src/components/Calendar/TimedEvent.module.scss +205 -0
- package/src/components/Calendar/TimedEvent.tsx +247 -0
- package/src/components/Calendar/ViewSwitcher.module.scss +3 -0
- package/src/components/Calendar/ViewSwitcher.tsx +47 -0
- package/src/components/Calendar/WeekView.module.scss +10 -0
- package/src/components/Calendar/WeekView.tsx +137 -0
- package/src/components/Calendar/eventColor.ts +60 -0
- package/src/components/Calendar/index.ts +18 -0
- package/src/components/Calendar/types.ts +451 -0
- package/src/components/Calendar/useEventDrag.ts +783 -0
- package/src/components/Calendar/utils.ts +622 -0
- package/src/components/Card/Card.module.scss +264 -0
- package/src/components/Card/Card.tokens.scss +55 -0
- package/src/components/Card/Card.tsx +170 -0
- package/src/components/Card/CardBody.tsx +45 -0
- package/src/components/Card/CardHeader.tsx +113 -0
- package/src/components/Card/CardList.tsx +24 -0
- package/src/components/Card/CardListRow.tsx +24 -0
- package/src/components/Card/index.ts +7 -0
- package/src/components/CatalogPicker/CatalogPicker.module.scss +193 -0
- package/src/components/CatalogPicker/CatalogPicker.tokens.scss +26 -0
- package/src/components/CatalogPicker/CatalogPicker.tsx +339 -0
- package/src/components/CatalogPicker/index.ts +2 -0
- package/src/components/Chart/Chart.module.scss +287 -0
- package/src/components/Chart/Chart.tokens.scss +63 -0
- package/src/components/Chart/Chart.tsx +607 -0
- package/src/components/Chart/ChartLegend.tsx +99 -0
- package/src/components/Chart/ChartTable.tsx +62 -0
- package/src/components/Chart/ChartTooltip.tsx +91 -0
- package/src/components/Chart/chartModel.ts +689 -0
- package/src/components/Chart/index.ts +2 -0
- package/src/components/ChatBubble/ChatBubble.module.scss +93 -0
- package/src/components/ChatBubble/ChatBubble.tokens.scss +17 -0
- package/src/components/ChatBubble/ChatBubble.tsx +61 -0
- package/src/components/ChatBubble/ChatBubbleList.tsx +27 -0
- package/src/components/ChatBubble/index.ts +3 -0
- package/src/components/ChatLauncher/ChatLauncher.module.scss +68 -0
- package/src/components/ChatLauncher/ChatLauncher.tokens.scss +27 -0
- package/src/components/ChatLauncher/ChatLauncher.tsx +202 -0
- package/src/components/ChatLauncher/index.ts +2 -0
- package/src/components/ChatLauncher/isAtBottom.ts +12 -0
- package/src/components/Checkbox/Checkbox.module.scss +147 -0
- package/src/components/Checkbox/Checkbox.tokens.scss +44 -0
- package/src/components/Checkbox/Checkbox.tsx +188 -0
- package/src/components/Checkbox/index.ts +2 -0
- package/src/components/CircularProgress/CircularProgress.module.scss +133 -0
- package/src/components/CircularProgress/CircularProgress.tokens.scss +40 -0
- package/src/components/CircularProgress/CircularProgress.tsx +139 -0
- package/src/components/CircularProgress/index.ts +7 -0
- package/src/components/Cluster/Cluster.module.scss +145 -0
- package/src/components/Cluster/Cluster.tokens.scss +11 -0
- package/src/components/Cluster/Cluster.tsx +215 -0
- package/src/components/Cluster/index.ts +2 -0
- package/src/components/Code/Code.module.scss +28 -0
- package/src/components/Code/Code.tokens.scss +15 -0
- package/src/components/Code/Code.tsx +44 -0
- package/src/components/Code/index.ts +2 -0
- package/src/components/CodeBlock/CodeBlock.module.scss +146 -0
- package/src/components/CodeBlock/CodeBlock.tokens.scss +27 -0
- package/src/components/CodeBlock/CodeBlock.tsx +274 -0
- package/src/components/CodeBlock/highlight.ts +179 -0
- package/src/components/CodeBlock/index.ts +8 -0
- package/src/components/CodeBlock/sampleSync.ts +42 -0
- package/src/components/ColorPicker/ColorPicker.module.scss +286 -0
- package/src/components/ColorPicker/ColorPicker.tokens.scss +60 -0
- package/src/components/ColorPicker/ColorPicker.tsx +367 -0
- package/src/components/ColorPicker/ColorPickerPanel.tsx +265 -0
- package/src/components/ColorPicker/SVSquare.tsx +189 -0
- package/src/components/ColorPicker/colorMath.ts +141 -0
- package/src/components/ColorPicker/index.ts +6 -0
- package/src/components/ConfirmationPopover/ConfirmationPopover.module.scss +39 -0
- package/src/components/ConfirmationPopover/ConfirmationPopover.tokens.scss +13 -0
- package/src/components/ConfirmationPopover/ConfirmationPopover.tsx +395 -0
- package/src/components/ConfirmationPopover/index.ts +2 -0
- package/src/components/Constrain/Constrain.module.scss +99 -0
- package/src/components/Constrain/Constrain.tsx +79 -0
- package/src/components/Constrain/index.ts +2 -0
- package/src/components/CurrencySelect/CurrencySelect.module.scss +7 -0
- package/src/components/CurrencySelect/CurrencySelect.tsx +167 -0
- package/src/components/CurrencySelect/index.ts +3 -0
- package/src/components/CursorPagination/CursorPagination.module.scss +69 -0
- package/src/components/CursorPagination/CursorPagination.tokens.scss +32 -0
- package/src/components/CursorPagination/CursorPagination.tsx +121 -0
- package/src/components/CursorPagination/index.ts +2 -0
- package/src/components/DashboardCanvas/DashboardCanvas.module.scss +360 -0
- package/src/components/DashboardCanvas/DashboardCanvas.tokens.scss +48 -0
- package/src/components/DashboardCanvas/DashboardCanvas.tsx +1270 -0
- package/src/components/DashboardCanvas/DashboardCanvasItem.tsx +140 -0
- package/src/components/DashboardCanvas/DashboardCanvasSection.tsx +174 -0
- package/src/components/DashboardCanvas/engine.ts +363 -0
- package/src/components/DashboardCanvas/index.ts +9 -0
- package/src/components/DashboardWidget/DashboardWidget.module.scss +100 -0
- package/src/components/DashboardWidget/DashboardWidget.tokens.scss +16 -0
- package/src/components/DashboardWidget/DashboardWidget.tsx +188 -0
- package/src/components/DashboardWidget/index.ts +7 -0
- package/src/components/DataTable/BodyRow.tsx +197 -0
- package/src/components/DataTable/ColumnVisibilityTrigger.module.scss +7 -0
- package/src/components/DataTable/ColumnVisibilityTrigger.tsx +105 -0
- package/src/components/DataTable/DataTable.module.scss +511 -0
- package/src/components/DataTable/DataTable.tokens.scss +80 -0
- package/src/components/DataTable/DataTable.tsx +734 -0
- package/src/components/DataTable/HeaderCell.module.scss +215 -0
- package/src/components/DataTable/HeaderCell.tsx +440 -0
- package/src/components/DataTable/columnShift.ts +117 -0
- package/src/components/DataTable/index.ts +23 -0
- package/src/components/DataTable/pinStyle.ts +47 -0
- package/src/components/DataTable/reorderColumns.ts +66 -0
- package/src/components/DataTable/types.ts +289 -0
- package/src/components/DataTable/useColumnDragShift.ts +216 -0
- package/src/components/DataTable/useDataTable.ts +372 -0
- package/src/components/DataTable/useResizeHandle.ts +97 -0
- package/src/components/DatePicker/DatePicker.module.scss +180 -0
- package/src/components/DatePicker/DatePicker.tokens.scss +152 -0
- package/src/components/DatePicker/DatePicker.tsx +664 -0
- package/src/components/DatePicker/DatePickerGrid.module.scss +172 -0
- package/src/components/DatePicker/DatePickerGrid.tsx +341 -0
- package/src/components/DatePicker/InlineDatePicker.module.scss +32 -0
- package/src/components/DatePicker/InlineDatePicker.tsx +201 -0
- package/src/components/DatePicker/index.ts +4 -0
- package/src/components/DatePicker/utils.ts +364 -0
- package/src/components/DateRangePicker/DateRangePicker.module.scss +237 -0
- package/src/components/DateRangePicker/DateRangePicker.tokens.scss +78 -0
- package/src/components/DateRangePicker/DateRangePicker.tsx +720 -0
- package/src/components/DateRangePicker/InlineDateRangePicker.module.scss +94 -0
- package/src/components/DateRangePicker/InlineDateRangePicker.tsx +376 -0
- package/src/components/DateRangePicker/index.ts +5 -0
- package/src/components/DateRangePicker/utils.ts +151 -0
- package/src/components/DateStrip/DateStrip.module.scss +78 -0
- package/src/components/DateStrip/DateStrip.tokens.scss +23 -0
- package/src/components/DateStrip/DateStrip.tsx +205 -0
- package/src/components/DateStrip/index.ts +2 -0
- package/src/components/DefinitionList/DefinitionList.module.scss +102 -0
- package/src/components/DefinitionList/DefinitionList.tokens.scss +29 -0
- package/src/components/DefinitionList/DefinitionList.tsx +198 -0
- package/src/components/DefinitionList/index.ts +9 -0
- package/src/components/Divider/Divider.module.scss +144 -0
- package/src/components/Divider/Divider.tokens.scss +21 -0
- package/src/components/Divider/Divider.tsx +103 -0
- package/src/components/Divider/index.ts +2 -0
- package/src/components/Dot/Dot.module.scss +40 -0
- package/src/components/Dot/Dot.tokens.scss +4 -0
- package/src/components/Dot/Dot.tsx +45 -0
- package/src/components/Dot/index.ts +2 -0
- package/src/components/Drawer/Body.tsx +23 -0
- package/src/components/Drawer/Close.tsx +35 -0
- package/src/components/Drawer/Content.tsx +93 -0
- package/src/components/Drawer/Drawer.module.scss +232 -0
- package/src/components/Drawer/Drawer.tokens.scss +38 -0
- package/src/components/Drawer/Drawer.tsx +23 -0
- package/src/components/Drawer/DrawerRoot.tsx +190 -0
- package/src/components/Drawer/Footer.tsx +24 -0
- package/src/components/Drawer/Header.tsx +64 -0
- package/src/components/Drawer/Overlay.tsx +82 -0
- package/src/components/Drawer/context.ts +44 -0
- package/src/components/Drawer/index.ts +12 -0
- package/src/components/Drawer/useDragToClose.ts +149 -0
- package/src/components/DropdownMenu/CheckboxItem.tsx +144 -0
- package/src/components/DropdownMenu/Content.tsx +419 -0
- package/src/components/DropdownMenu/DropdownMenu.module.scss +280 -0
- package/src/components/DropdownMenu/DropdownMenu.tokens.scss +88 -0
- package/src/components/DropdownMenu/DropdownMenu.tsx +43 -0
- package/src/components/DropdownMenu/Group.tsx +76 -0
- package/src/components/DropdownMenu/Item.tsx +148 -0
- package/src/components/DropdownMenu/ItemIndicator.tsx +30 -0
- package/src/components/DropdownMenu/Radio.tsx +178 -0
- package/src/components/DropdownMenu/Root.tsx +100 -0
- package/src/components/DropdownMenu/Sub.tsx +332 -0
- package/src/components/DropdownMenu/Trigger.tsx +76 -0
- package/src/components/DropdownMenu/context.ts +65 -0
- package/src/components/DropdownMenu/index.ts +20 -0
- package/src/components/EmojiPicker/EmojiPicker.module.scss +84 -0
- package/src/components/EmojiPicker/EmojiPicker.tokens.scss +24 -0
- package/src/components/EmojiPicker/EmojiPicker.tsx +341 -0
- package/src/components/EmojiPicker/emojiData.ts +245 -0
- package/src/components/EmojiPicker/index.ts +3 -0
- package/src/components/EmptyState/EmptyState.module.scss +102 -0
- package/src/components/EmptyState/EmptyState.tokens.scss +28 -0
- package/src/components/EmptyState/EmptyState.tsx +112 -0
- package/src/components/EmptyState/index.ts +7 -0
- package/src/components/EntityChip/EntityChip.module.scss +275 -0
- package/src/components/EntityChip/EntityChip.tokens.scss +66 -0
- package/src/components/EntityChip/EntityChip.tsx +649 -0
- package/src/components/EntityChip/index.ts +10 -0
- package/src/components/ErrorState/ErrorState.module.scss +105 -0
- package/src/components/ErrorState/ErrorState.tokens.scss +32 -0
- package/src/components/ErrorState/ErrorState.tsx +125 -0
- package/src/components/ErrorState/index.ts +8 -0
- package/src/components/Field/Field.module.scss +46 -0
- package/src/components/Field/Field.tsx +185 -0
- package/src/components/Field/index.ts +2 -0
- package/src/components/FileUpload/FileUpload.module.scss +187 -0
- package/src/components/FileUpload/FileUpload.tokens.scss +81 -0
- package/src/components/FileUpload/FileUpload.tsx +569 -0
- package/src/components/FileUpload/formatBytes.ts +34 -0
- package/src/components/FileUpload/iconForFile.ts +40 -0
- package/src/components/FileUpload/index.ts +2 -0
- package/src/components/FilterChip/FilterChip.module.scss +61 -0
- package/src/components/FilterChip/FilterChip.tokens.scss +25 -0
- package/src/components/FilterChip/FilterChip.tsx +208 -0
- package/src/components/FilterChip/index.ts +5 -0
- package/src/components/FlowCanvas/FlowCanvas.module.scss +329 -0
- package/src/components/FlowCanvas/FlowCanvas.tokens.scss +45 -0
- package/src/components/FlowCanvas/FlowCanvas.tsx +1867 -0
- package/src/components/FlowCanvas/FlowControls.tsx +46 -0
- package/src/components/FlowCanvas/FlowEdge.tsx +58 -0
- package/src/components/FlowCanvas/FlowNode.tsx +76 -0
- package/src/components/FlowCanvas/edgePath.ts +85 -0
- package/src/components/FlowCanvas/index.ts +4 -0
- package/src/components/FlowCanvas/layout.ts +148 -0
- package/src/components/FlowCanvas/spatialNav.ts +76 -0
- package/src/components/FlowCanvas/types.ts +59 -0
- package/src/components/FlowCanvas/useViewport.ts +122 -0
- package/src/components/FormRow/FormRow.module.scss +2 -0
- package/src/components/FormRow/FormRow.tsx +37 -0
- package/src/components/FormRow/index.ts +2 -0
- package/src/components/FormSection/FormSection.module.scss +24 -0
- package/src/components/FormSection/FormSection.tsx +46 -0
- package/src/components/FormSection/index.ts +2 -0
- package/src/components/Grid/Grid.module.scss +162 -0
- package/src/components/Grid/Grid.tokens.scss +13 -0
- package/src/components/Grid/Grid.tsx +226 -0
- package/src/components/Grid/GridItem.tsx +77 -0
- package/src/components/Grid/index.ts +11 -0
- package/src/components/Highlight/Highlight.module.scss +43 -0
- package/src/components/Highlight/Highlight.tokens.scss +35 -0
- package/src/components/Highlight/Highlight.tsx +164 -0
- package/src/components/Highlight/HighlightOverlay.tsx +100 -0
- package/src/components/Highlight/index.ts +2 -0
- package/src/components/HighlightedText/HighlightedText.module.scss +11 -0
- package/src/components/HighlightedText/HighlightedText.tokens.scss +9 -0
- package/src/components/HighlightedText/HighlightedText.tsx +50 -0
- package/src/components/HighlightedText/highlightRanges.ts +44 -0
- package/src/components/HighlightedText/index.ts +2 -0
- package/src/components/IconPicker/IconPicker.module.scss +175 -0
- package/src/components/IconPicker/IconPicker.tokens.scss +40 -0
- package/src/components/IconPicker/IconPicker.tsx +629 -0
- package/src/components/IconPicker/index.ts +9 -0
- package/src/components/IconTile/IconTile.module.scss +57 -0
- package/src/components/IconTile/IconTile.tokens.scss +16 -0
- package/src/components/IconTile/IconTile.tsx +91 -0
- package/src/components/IconTile/index.ts +2 -0
- package/src/components/Image/Image.module.scss +266 -0
- package/src/components/Image/Image.tokens.scss +55 -0
- package/src/components/Image/Image.tsx +342 -0
- package/src/components/Image/index.ts +2 -0
- package/src/components/ImageCrop/ImageCrop.module.scss +274 -0
- package/src/components/ImageCrop/ImageCrop.tokens.scss +33 -0
- package/src/components/ImageCrop/ImageCrop.tsx +542 -0
- package/src/components/ImageCrop/cropGeometry.ts +120 -0
- package/src/components/ImageCrop/extractCropBlob.ts +140 -0
- package/src/components/ImageCrop/index.ts +11 -0
- package/src/components/ImageCrop/useCropPreview.ts +161 -0
- package/src/components/Indent/Indent.module.scss +33 -0
- package/src/components/Indent/Indent.tokens.scss +10 -0
- package/src/components/Indent/Indent.tsx +46 -0
- package/src/components/Indent/index.ts +2 -0
- package/src/components/Input/Input.module.scss +99 -0
- package/src/components/Input/Input.tokens.scss +54 -0
- package/src/components/Input/Input.tsx +105 -0
- package/src/components/Input/Suggestions.tsx +260 -0
- package/src/components/Input/index.ts +2 -0
- package/src/components/Kanban/Kanban.module.scss +39 -0
- package/src/components/Kanban/Kanban.tokens.scss +15 -0
- package/src/components/Kanban/Kanban.tsx +951 -0
- package/src/components/Kanban/index.ts +7 -0
- package/src/components/Kbd/Kbd.module.scss +47 -0
- package/src/components/Kbd/Kbd.tokens.scss +26 -0
- package/src/components/Kbd/Kbd.tsx +73 -0
- package/src/components/Kbd/index.ts +2 -0
- package/src/components/Lightbox/Lightbox.module.scss +283 -0
- package/src/components/Lightbox/Lightbox.tokens.scss +36 -0
- package/src/components/Lightbox/Lightbox.tsx +506 -0
- package/src/components/Lightbox/index.ts +2 -0
- package/src/components/Link/Link.module.scss +78 -0
- package/src/components/Link/Link.tokens.scss +28 -0
- package/src/components/Link/Link.tsx +114 -0
- package/src/components/Link/index.ts +2 -0
- package/src/components/LinkCard/LinkCard.module.scss +92 -0
- package/src/components/LinkCard/LinkCard.tokens.scss +9 -0
- package/src/components/LinkCard/LinkCard.tsx +72 -0
- package/src/components/LinkCard/index.ts +2 -0
- package/src/components/LiquidEditor/AutocompleteMenu.tsx +133 -0
- package/src/components/LiquidEditor/HighlightLayer.tsx +53 -0
- package/src/components/LiquidEditor/InsertVariableMenu.tsx +81 -0
- package/src/components/LiquidEditor/LiquidEditor.module.scss +339 -0
- package/src/components/LiquidEditor/LiquidEditor.tokens.scss +81 -0
- package/src/components/LiquidEditor/LiquidEditor.tsx +412 -0
- package/src/components/LiquidEditor/PreviewPane.tsx +29 -0
- package/src/components/LiquidEditor/caretCoordinates.ts +97 -0
- package/src/components/LiquidEditor/index.ts +7 -0
- package/src/components/LiquidEditor/liquidFilters.ts +23 -0
- package/src/components/LiquidEditor/liquidTokenizer.ts +235 -0
- package/src/components/LiquidEditor/types.ts +101 -0
- package/src/components/LiquidEditor/useLiquidAutocomplete.ts +178 -0
- package/src/components/List/List.module.scss +105 -0
- package/src/components/List/List.tokens.scss +42 -0
- package/src/components/List/List.tsx +124 -0
- package/src/components/List/index.ts +9 -0
- package/src/components/LiveRegion/LiveRegion.module.scss +3 -0
- package/src/components/LiveRegion/LiveRegion.tsx +116 -0
- package/src/components/LiveRegion/index.ts +2 -0
- package/src/components/Logo/Logo.module.scss +139 -0
- package/src/components/Logo/Logo.tokens.scss +14 -0
- package/src/components/Logo/Logo.tsx +126 -0
- package/src/components/Logo/index.ts +2 -0
- package/src/components/Masonry/Masonry.module.scss +42 -0
- package/src/components/Masonry/Masonry.tokens.scss +8 -0
- package/src/components/Masonry/Masonry.tsx +136 -0
- package/src/components/Masonry/index.ts +2 -0
- package/src/components/Masonry/masonryUtils.ts +42 -0
- package/src/components/MediaTile/MediaTile.module.scss +183 -0
- package/src/components/MediaTile/MediaTile.tokens.scss +60 -0
- package/src/components/MediaTile/MediaTile.tsx +208 -0
- package/src/components/MediaTile/index.ts +8 -0
- package/src/components/Modal/Body.tsx +27 -0
- package/src/components/Modal/Close.tsx +45 -0
- package/src/components/Modal/Content.tsx +98 -0
- package/src/components/Modal/Footer.tsx +28 -0
- package/src/components/Modal/Header.tsx +51 -0
- package/src/components/Modal/Modal.module.scss +262 -0
- package/src/components/Modal/Modal.tokens.scss +50 -0
- package/src/components/Modal/Modal.tsx +23 -0
- package/src/components/Modal/ModalRoot.tsx +299 -0
- package/src/components/Modal/Overlay.tsx +101 -0
- package/src/components/Modal/context.ts +60 -0
- package/src/components/Modal/index.ts +11 -0
- package/src/components/MoneyInput/MoneyInput.module.scss +57 -0
- package/src/components/MoneyInput/MoneyInput.tsx +433 -0
- package/src/components/MoneyInput/index.ts +2 -0
- package/src/components/OptionsPicker/OptionsPicker.module.scss +216 -0
- package/src/components/OptionsPicker/OptionsPicker.tokens.scss +68 -0
- package/src/components/OptionsPicker/OptionsPicker.tsx +936 -0
- package/src/components/OptionsPicker/index.ts +9 -0
- package/src/components/OtpInput/OtpInput.module.scss +69 -0
- package/src/components/OtpInput/OtpInput.tokens.scss +45 -0
- package/src/components/OtpInput/OtpInput.tsx +368 -0
- package/src/components/OtpInput/index.ts +2 -0
- package/src/components/Page/Page.module.scss +30 -0
- package/src/components/Page/Page.tokens.scss +11 -0
- package/src/components/Page/Page.tsx +53 -0
- package/src/components/Page/index.ts +2 -0
- package/src/components/PageHeader/PageHeader.module.scss +197 -0
- package/src/components/PageHeader/PageHeader.tokens.scss +41 -0
- package/src/components/PageHeader/PageHeader.tsx +310 -0
- package/src/components/PageHeader/index.ts +20 -0
- package/src/components/Pagination/Pagination.module.scss +117 -0
- package/src/components/Pagination/Pagination.tokens.scss +54 -0
- package/src/components/Pagination/Pagination.tsx +165 -0
- package/src/components/Pagination/index.ts +4 -0
- package/src/components/Pagination/paginationRange.ts +72 -0
- package/src/components/PasswordInput/PasswordInput.module.scss +120 -0
- package/src/components/PasswordInput/PasswordInput.tokens.scss +44 -0
- package/src/components/PasswordInput/PasswordInput.tsx +210 -0
- package/src/components/PasswordInput/index.ts +2 -0
- package/src/components/PasswordStrengthMeter/PasswordStrengthMeter.module.scss +80 -0
- package/src/components/PasswordStrengthMeter/PasswordStrengthMeter.tokens.scss +40 -0
- package/src/components/PasswordStrengthMeter/PasswordStrengthMeter.tsx +96 -0
- package/src/components/PasswordStrengthMeter/index.ts +2 -0
- package/src/components/PersonDisplay/PersonDisplay.module.scss +180 -0
- package/src/components/PersonDisplay/PersonDisplay.tokens.scss +35 -0
- package/src/components/PersonDisplay/PersonDisplay.tsx +420 -0
- package/src/components/PersonDisplay/index.ts +10 -0
- package/src/components/PhoneInput/PhoneInput.module.scss +23 -0
- package/src/components/PhoneInput/PhoneInput.tsx +271 -0
- package/src/components/PhoneInput/index.ts +4 -0
- package/src/components/PhoneInput/phone.ts +128 -0
- package/src/components/PillMenu/PillMenu.module.scss +117 -0
- package/src/components/PillMenu/PillMenu.tokens.scss +22 -0
- package/src/components/PillMenu/PillMenu.tsx +324 -0
- package/src/components/PillMenu/index.ts +2 -0
- package/src/components/Popover/Anchor.tsx +37 -0
- package/src/components/Popover/Close.tsx +45 -0
- package/src/components/Popover/Content.tsx +213 -0
- package/src/components/Popover/Heading.tsx +33 -0
- package/src/components/Popover/Popover.module.scss +177 -0
- package/src/components/Popover/Popover.tokens.scss +22 -0
- package/src/components/Popover/Popover.tsx +23 -0
- package/src/components/Popover/PopoverRoot.tsx +75 -0
- package/src/components/Popover/Trigger.tsx +86 -0
- package/src/components/Popover/context.ts +22 -0
- package/src/components/Popover/index.ts +7 -0
- package/src/components/Progress/Progress.module.scss +110 -0
- package/src/components/Progress/Progress.tokens.scss +44 -0
- package/src/components/Progress/Progress.tsx +129 -0
- package/src/components/Progress/index.ts +2 -0
- package/src/components/QrCode/QrCode.module.scss +97 -0
- package/src/components/QrCode/QrCode.tokens.scss +17 -0
- package/src/components/QrCode/QrCode.tsx +233 -0
- package/src/components/QrCode/index.ts +2 -0
- package/src/components/QrCode/qr.ts +161 -0
- package/src/components/Radio/Radio.module.scss +175 -0
- package/src/components/Radio/Radio.tokens.scss +59 -0
- package/src/components/Radio/Radio.tsx +127 -0
- package/src/components/Radio/RadioGroup.module.scss +42 -0
- package/src/components/Radio/RadioGroup.tsx +120 -0
- package/src/components/Radio/RadioGroupContext.tsx +30 -0
- package/src/components/Radio/index.ts +4 -0
- package/src/components/Rail/Rail.module.scss +510 -0
- package/src/components/Rail/Rail.tokens.scss +92 -0
- package/src/components/Rail/Rail.tsx +287 -0
- package/src/components/Rail/RailCollapseToggle.tsx +57 -0
- package/src/components/Rail/RailFooter.tsx +17 -0
- package/src/components/Rail/RailGroup.tsx +728 -0
- package/src/components/Rail/RailGroupContext.ts +9 -0
- package/src/components/Rail/RailHeader.tsx +23 -0
- package/src/components/Rail/RailItem.tsx +119 -0
- package/src/components/Rail/RailSection.tsx +39 -0
- package/src/components/Rail/RailSpacer.tsx +19 -0
- package/src/components/Rail/index.ts +9 -0
- package/src/components/RelativeDateInput/RelativeDateInput.module.scss +15 -0
- package/src/components/RelativeDateInput/RelativeDateInput.tokens.scss +6 -0
- package/src/components/RelativeDateInput/RelativeDateInput.tsx +474 -0
- package/src/components/RelativeDateInput/index.ts +10 -0
- package/src/components/RelativeDateInput/relativeDate.ts +127 -0
- package/src/components/RichText/RichText.module.scss +5 -0
- package/src/components/RichText/RichText.tsx +70 -0
- package/src/components/RichText/RichTextAttachment.module.scss +82 -0
- package/src/components/RichText/RichTextAttachment.tsx +122 -0
- package/src/components/RichText/_prose.scss +79 -0
- package/src/components/RichText/attachmentIcon.tsx +24 -0
- package/src/components/RichText/engine/attachment.ts +154 -0
- package/src/components/RichText/engine/autolink.ts +64 -0
- package/src/components/RichText/engine/blockUnit.ts +174 -0
- package/src/components/RichText/engine/colorMarks.ts +85 -0
- package/src/components/RichText/engine/escape.ts +11 -0
- package/src/components/RichText/engine/fromHtml.ts +353 -0
- package/src/components/RichText/engine/fromMarkdown.ts +20 -0
- package/src/components/RichText/engine/inlines.ts +82 -0
- package/src/components/RichText/engine/listDepths.ts +32 -0
- package/src/components/RichText/engine/marks.ts +80 -0
- package/src/components/RichText/engine/mdToHtml.ts +178 -0
- package/src/components/RichText/engine/model.ts +157 -0
- package/src/components/RichText/engine/position.ts +118 -0
- package/src/components/RichText/engine/renderDoc.tsx +395 -0
- package/src/components/RichText/engine/renderLink.ts +15 -0
- package/src/components/RichText/engine/renderMention.ts +16 -0
- package/src/components/RichText/engine/safeHref.ts +22 -0
- package/src/components/RichText/engine/toHtml.ts +154 -0
- package/src/components/RichText/engine/toMarkdown.ts +97 -0
- package/src/components/RichText/engine/transforms.ts +434 -0
- package/src/components/RichText/imageMaxHeightStyle.ts +10 -0
- package/src/components/RichText/index.ts +31 -0
- package/src/components/RichTextEditor/RichTextAttachmentConfig.tsx +264 -0
- package/src/components/RichTextEditor/RichTextBlockControls.tsx +365 -0
- package/src/components/RichTextEditor/RichTextBlockMenu.tsx +162 -0
- package/src/components/RichTextEditor/RichTextColorMenu.tsx +115 -0
- package/src/components/RichTextEditor/RichTextEditor.module.scss +298 -0
- package/src/components/RichTextEditor/RichTextEditor.tsx +1910 -0
- package/src/components/RichTextEditor/RichTextImageResizer.tsx +131 -0
- package/src/components/RichTextEditor/RichTextLinkEditor.tsx +151 -0
- package/src/components/RichTextEditor/RichTextMentionMenu.tsx +99 -0
- package/src/components/RichTextEditor/RichTextToolbar.tsx +379 -0
- package/src/components/RichTextEditor/autolinkInput.ts +65 -0
- package/src/components/RichTextEditor/blockDrop.ts +9 -0
- package/src/components/RichTextEditor/blockReflow.ts +62 -0
- package/src/components/RichTextEditor/commands.ts +300 -0
- package/src/components/RichTextEditor/history.ts +93 -0
- package/src/components/RichTextEditor/icons.tsx +152 -0
- package/src/components/RichTextEditor/imageSize.ts +70 -0
- package/src/components/RichTextEditor/index.ts +5 -0
- package/src/components/RichTextEditor/input.ts +209 -0
- package/src/components/RichTextEditor/inputRules.ts +71 -0
- package/src/components/RichTextEditor/links.ts +103 -0
- package/src/components/RichTextEditor/mentionContext.ts +37 -0
- package/src/components/RichTextEditor/mentions.ts +28 -0
- package/src/components/RichTextEditor/preventSelectionLoss.ts +15 -0
- package/src/components/RichTextEditor/selection.ts +415 -0
- package/src/components/RichTextEditor/shortcuts.ts +44 -0
- package/src/components/RichTextEditor/useAnchoredFloating.ts +50 -0
- package/src/components/RichTextEditor/useAttachmentConfig.ts +134 -0
- package/src/components/RichTextEditor/useDismissOnOutsidePointerDown.ts +26 -0
- package/src/components/RichTextEditor/useLinkEditor.ts +107 -0
- package/src/components/RichTextEditor/useMention.ts +226 -0
- package/src/components/RichTextEditor/useOverlayRect.ts +73 -0
- package/src/components/RichTextEditor/useUpload.ts +246 -0
- package/src/components/Screen/Screen.module.scss +46 -0
- package/src/components/Screen/Screen.tokens.scss +20 -0
- package/src/components/Screen/Screen.tsx +97 -0
- package/src/components/Screen/index.ts +2 -0
- package/src/components/ScrollArea/ScrollArea.module.scss +39 -0
- package/src/components/ScrollArea/ScrollArea.tokens.scss +15 -0
- package/src/components/ScrollArea/ScrollArea.tsx +154 -0
- package/src/components/ScrollArea/index.ts +2 -0
- package/src/components/Select/Chip.tsx +45 -0
- package/src/components/Select/Empty.tsx +39 -0
- package/src/components/Select/Error.tsx +51 -0
- package/src/components/Select/HiddenInputs.tsx +44 -0
- package/src/components/Select/Listbox.tsx +557 -0
- package/src/components/Select/Loading.tsx +30 -0
- package/src/components/Select/Select.module.scss +512 -0
- package/src/components/Select/Select.tokens.scss +140 -0
- package/src/components/Select/Select.tsx +685 -0
- package/src/components/Select/Trigger.tsx +952 -0
- package/src/components/Select/context.ts +101 -0
- package/src/components/Select/emptyStateText.ts +19 -0
- package/src/components/Select/index.ts +9 -0
- package/src/components/Select/useSelectState.ts +157 -0
- package/src/components/Select/utils-types.ts +7 -0
- package/src/components/Select/utils.ts +122 -0
- package/src/components/SettingRow/SettingRow.module.scss +166 -0
- package/src/components/SettingRow/SettingRow.tokens.scss +37 -0
- package/src/components/SettingRow/SettingRow.tsx +242 -0
- package/src/components/SettingRow/index.ts +7 -0
- package/src/components/Skeleton/Skeleton.module.scss +55 -0
- package/src/components/Skeleton/Skeleton.tokens.scss +17 -0
- package/src/components/Skeleton/Skeleton.tsx +131 -0
- package/src/components/Skeleton/index.ts +4 -0
- package/src/components/Skeleton/useSkeletonVisibility.ts +95 -0
- package/src/components/Slider/Slider.module.scss +293 -0
- package/src/components/Slider/Slider.tokens.scss +98 -0
- package/src/components/Slider/Slider.tsx +624 -0
- package/src/components/Slider/index.ts +9 -0
- package/src/components/SlotGrid/SlotGrid.module.scss +61 -0
- package/src/components/SlotGrid/SlotGrid.tokens.scss +21 -0
- package/src/components/SlotGrid/SlotGrid.tsx +111 -0
- package/src/components/SlotGrid/index.ts +2 -0
- package/src/components/SocialButton/SocialButton.module.scss +4 -0
- package/src/components/SocialButton/SocialButton.tsx +40 -0
- package/src/components/SocialButton/index.ts +2 -0
- package/src/components/Sortable/Sortable.module.scss +177 -0
- package/src/components/Sortable/Sortable.tokens.scss +27 -0
- package/src/components/Sortable/Sortable.tsx +572 -0
- package/src/components/Sortable/containerAwareCollision.ts +125 -0
- package/src/components/Sortable/index.ts +13 -0
- package/src/components/SortableGroup/SortableGroup.module.scss +23 -0
- package/src/components/SortableGroup/SortableGroup.tsx +315 -0
- package/src/components/SortableGroup/index.ts +4 -0
- package/src/components/SortableGroup/moveSortableItem.ts +39 -0
- package/src/components/Sparkline/Sparkline.module.scss +28 -0
- package/src/components/Sparkline/Sparkline.tokens.scss +7 -0
- package/src/components/Sparkline/Sparkline.tsx +133 -0
- package/src/components/Sparkline/index.ts +2 -0
- package/src/components/Sparkline/sparklineModel.ts +119 -0
- package/src/components/Split/Split.module.scss +158 -0
- package/src/components/Split/Split.tokens.scss +10 -0
- package/src/components/Split/Split.tsx +231 -0
- package/src/components/Split/index.ts +2 -0
- package/src/components/Stack/Stack.module.scss +67 -0
- package/src/components/Stack/Stack.tokens.scss +11 -0
- package/src/components/Stack/Stack.tsx +100 -0
- package/src/components/Stack/index.ts +2 -0
- package/src/components/StagePath/StagePath.module.scss +255 -0
- package/src/components/StagePath/StagePath.tokens.scss +43 -0
- package/src/components/StagePath/StagePath.tsx +176 -0
- package/src/components/StagePath/index.ts +2 -0
- package/src/components/StatGroup/StatGroup.module.scss +6 -0
- package/src/components/StatGroup/StatGroup.tsx +70 -0
- package/src/components/StatGroup/StatGroupContext.ts +10 -0
- package/src/components/StatGroup/StatTile.module.scss +99 -0
- package/src/components/StatGroup/StatTile.tokens.scss +35 -0
- package/src/components/StatGroup/StatTile.tsx +143 -0
- package/src/components/StatGroup/index.ts +4 -0
- package/src/components/Sticky/Sticky.module.scss +98 -0
- package/src/components/Sticky/Sticky.tokens.scss +17 -0
- package/src/components/Sticky/Sticky.tsx +103 -0
- package/src/components/Sticky/index.ts +2 -0
- package/src/components/Switch/Switch.module.scss +182 -0
- package/src/components/Switch/Switch.tokens.scss +59 -0
- package/src/components/Switch/Switch.tsx +214 -0
- package/src/components/Switch/index.ts +2 -0
- package/src/components/Table/Table.module.scss +308 -0
- package/src/components/Table/Table.tokens.scss +79 -0
- package/src/components/Table/Table.tsx +381 -0
- package/src/components/Table/index.ts +15 -0
- package/src/components/TableOfContents/TableOfContents.module.scss +83 -0
- package/src/components/TableOfContents/TableOfContents.tokens.scss +26 -0
- package/src/components/TableOfContents/TableOfContents.tsx +192 -0
- package/src/components/TableOfContents/activeSection.ts +18 -0
- package/src/components/TableOfContents/index.ts +2 -0
- package/src/components/Tabs/Tabs.module.scss +359 -0
- package/src/components/Tabs/Tabs.tokens.scss +50 -0
- package/src/components/Tabs/Tabs.tsx +538 -0
- package/src/components/Tabs/index.ts +2 -0
- package/src/components/Text/Text.module.scss +115 -0
- package/src/components/Text/Text.tokens.scss +55 -0
- package/src/components/Text/Text.tsx +197 -0
- package/src/components/Text/index.ts +2 -0
- package/src/components/Textarea/Textarea.module.scss +94 -0
- package/src/components/Textarea/Textarea.tokens.scss +48 -0
- package/src/components/Textarea/Textarea.tsx +246 -0
- package/src/components/Textarea/index.ts +2 -0
- package/src/components/Thread/Thread.module.scss +161 -0
- package/src/components/Thread/Thread.tokens.scss +32 -0
- package/src/components/Thread/Thread.tsx +176 -0
- package/src/components/Thread/index.ts +2 -0
- package/src/components/TimeField/TimeField.module.scss +232 -0
- package/src/components/TimeField/TimeField.tsx +793 -0
- package/src/components/TimeField/index.ts +2 -0
- package/src/components/Timeline/Timeline.module.scss +58 -0
- package/src/components/Timeline/Timeline.tokens.scss +13 -0
- package/src/components/Timeline/Timeline.tsx +53 -0
- package/src/components/Timeline/index.ts +2 -0
- package/src/components/Title/Title.module.scss +84 -0
- package/src/components/Title/Title.tokens.scss +37 -0
- package/src/components/Title/Title.tsx +150 -0
- package/src/components/Title/index.ts +2 -0
- package/src/components/Toast/Toast.module.scss +299 -0
- package/src/components/Toast/Toast.tokens.scss +65 -0
- package/src/components/Toast/Toast.tsx +122 -0
- package/src/components/Toast/ToastViewport.tsx +166 -0
- package/src/components/Toast/api.ts +175 -0
- package/src/components/Toast/index.ts +5 -0
- package/src/components/Toast/store.ts +133 -0
- package/src/components/Toast/useToastTimer.ts +94 -0
- package/src/components/Tooltip/Tooltip.module.scss +99 -0
- package/src/components/Tooltip/Tooltip.tokens.scss +23 -0
- package/src/components/Tooltip/Tooltip.tsx +341 -0
- package/src/components/Tooltip/index.ts +2 -0
- package/src/components/TopBar/TopBar.module.scss +235 -0
- package/src/components/TopBar/TopBar.tokens.scss +79 -0
- package/src/components/TopBar/TopBar.tsx +87 -0
- package/src/components/TopBar/TopBarEnd.tsx +20 -0
- package/src/components/TopBar/TopBarIconButton.tsx +86 -0
- package/src/components/TopBar/TopBarSearch.tsx +319 -0
- package/src/components/TopBar/TopBarSearchPanel.tsx +268 -0
- package/src/components/TopBar/TopBarStart.tsx +20 -0
- package/src/components/TopBar/index.ts +11 -0
- package/src/components/Tour/Spotlight.tsx +121 -0
- package/src/components/Tour/Tour.module.scss +210 -0
- package/src/components/Tour/Tour.tokens.scss +58 -0
- package/src/components/Tour/Tour.tsx +617 -0
- package/src/components/Tour/index.ts +2 -0
- package/src/components/Tour/useTourTarget.ts +115 -0
- package/src/components/TreeView/TreeView.module.scss +268 -0
- package/src/components/TreeView/TreeView.tokens.scss +36 -0
- package/src/components/TreeView/TreeView.tsx +536 -0
- package/src/components/TreeView/index.ts +3 -0
- package/src/components/TreeView/treeModel.ts +224 -0
- package/src/components/VisuallyHidden/VisuallyHidden.module.scss +7 -0
- package/src/components/VisuallyHidden/VisuallyHidden.tsx +29 -0
- package/src/components/VisuallyHidden/index.ts +2 -0
- package/src/components/WidgetPreview/WidgetPreview.module.scss +11 -0
- package/src/components/WidgetPreview/WidgetPreview.tokens.scss +26 -0
- package/src/components/WidgetPreview/WidgetPreview.tsx +36 -0
- package/src/components/WidgetPreview/WidgetShape.module.scss +140 -0
- package/src/components/WidgetPreview/WidgetShape.tsx +159 -0
- package/src/components/WidgetPreview/index.ts +2 -0
- package/src/components/_internal/Trend.tsx +27 -0
- package/src/components/_internal/choiceTile.scss +74 -0
- package/src/components/_internal/collapse.scss +10 -0
- package/src/components/_internal/collapse.ts +58 -0
- package/src/components/_internal/currency.ts +257 -0
- package/src/components/_internal/dragAnnouncements.ts +200 -0
- package/src/components/_internal/fieldWiring.ts +225 -0
- package/src/components/_internal/gridSpan.ts +54 -0
- package/src/components/_internal/isoDay.ts +35 -0
- package/src/components/_internal/letterKey.ts +26 -0
- package/src/components/_internal/overlay/focusRestore.ts +21 -0
- package/src/components/_internal/overlay/index.ts +12 -0
- package/src/components/_internal/overlay/tourHold.ts +23 -0
- package/src/components/_internal/overlay/useFocusTrap.ts +120 -0
- package/src/components/_internal/overlay/useInOverlay.ts +81 -0
- package/src/components/_internal/overlay/useOverlayStack.ts +232 -0
- package/src/components/_internal/overlay/useScrollLock.ts +112 -0
- package/src/components/_internal/refs.ts +48 -0
- package/src/components/_internal/statusColor.ts +26 -0
- package/src/components/_internal/timeUtils.ts +23 -0
- package/src/components/_internal/useAsyncOptions.ts +145 -0
- package/src/components/_internal/useClippedTooltip.ts +50 -0
- package/src/components/_internal/useControllableState.ts +50 -0
- package/src/components.manifest.json +1141 -0
- package/src/hooks/useBelowBreakpoint.ts +58 -0
- package/src/i18n/I18nProvider.tsx +52 -0
- package/src/i18n/LocaleProvider.tsx +17 -0
- package/src/i18n/en.ts +648 -0
- package/src/i18n/format.ts +71 -0
- package/src/i18n/index.ts +13 -0
- package/src/i18n/messages.ts +1275 -0
- package/src/i18n/ru.ts +677 -0
- package/src/i18n/useLocale.ts +19 -0
- package/src/i18n/useTranslation.ts +58 -0
- package/src/index.ts +913 -0
- package/src/palette/index.ts +2 -0
- package/src/palette/palette.ts +108 -0
- package/src/styles/dark.scss +4 -0
- package/src/styles/global.scss +7 -0
- package/src/styles/mixins.scss +143 -0
- package/src/styles/reset.scss +78 -0
- package/src/styles/tokens.scss +18 -0
- package/src/styles/typography.scss +44 -0
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure geometry for the whole-column drag preview. No DOM access — everything
|
|
3
|
+
* here is a plain function so the maths can be unit-tested without rendering
|
|
4
|
+
* a table or simulating a pointer.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
/** Inputs describing one frame of an in-progress column drag. */
|
|
8
|
+
export interface ColumnShiftArgs {
|
|
9
|
+
/**
|
|
10
|
+
* ALL unpinned column ids in their current visual order — including columns
|
|
11
|
+
* with `enableReorder: false`. A non-reorderable column still occupies space
|
|
12
|
+
* and is still displaced when a reorderable column is dragged past it, so
|
|
13
|
+
* omitting it makes the preview overlap two columns.
|
|
14
|
+
*/
|
|
15
|
+
orderedIds: string[];
|
|
16
|
+
/** Id of the column being dragged. */
|
|
17
|
+
activeId: string;
|
|
18
|
+
/** Id of the column currently hovered, or `null` when over nothing. */
|
|
19
|
+
overId: string | null;
|
|
20
|
+
/** Rendered width per column id, in px. */
|
|
21
|
+
widths: Record<string, number>;
|
|
22
|
+
/** Pointer delta on the x axis since drag start, in px. */
|
|
23
|
+
deltaX: number;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Translation in px for each column that moves this frame, keyed by column id.
|
|
28
|
+
* Columns absent from the result do not move — callers treat a missing key as
|
|
29
|
+
* `0` rather than writing an explicit zero for every untouched column.
|
|
30
|
+
*
|
|
31
|
+
* The active column follows the pointer; every column between its origin and
|
|
32
|
+
* the hovered column slides one active-column-width in the opposite direction,
|
|
33
|
+
* opening the gap the active column will drop into.
|
|
34
|
+
*/
|
|
35
|
+
export function computeColumnShifts({
|
|
36
|
+
orderedIds,
|
|
37
|
+
activeId,
|
|
38
|
+
overId,
|
|
39
|
+
widths,
|
|
40
|
+
deltaX,
|
|
41
|
+
}: ColumnShiftArgs): Record<string, number> {
|
|
42
|
+
const shifts: Record<string, number> = {};
|
|
43
|
+
|
|
44
|
+
const from = orderedIds.indexOf(activeId);
|
|
45
|
+
if (from === -1) return shifts;
|
|
46
|
+
|
|
47
|
+
shifts[activeId] = deltaX;
|
|
48
|
+
|
|
49
|
+
if (overId == null || overId === activeId) return shifts;
|
|
50
|
+
const to = orderedIds.indexOf(overId);
|
|
51
|
+
if (to === -1) return shifts;
|
|
52
|
+
|
|
53
|
+
// A missing width means the column has no tracked size yet; shifting by 0 is
|
|
54
|
+
// wrong-but-harmless, whereas NaN would poison the CSS value.
|
|
55
|
+
const activeWidth = widths[activeId] ?? 0;
|
|
56
|
+
|
|
57
|
+
if (to > from) {
|
|
58
|
+
// Active column travels right: everything it passed slides left to fill in.
|
|
59
|
+
for (let i = from + 1; i <= to; i++) shifts[orderedIds[i]] = -activeWidth;
|
|
60
|
+
} else {
|
|
61
|
+
// Active column travels left: everything it passed slides right.
|
|
62
|
+
for (let i = to; i < from; i++) shifts[orderedIds[i]] = activeWidth;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
return shifts;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* How far the active column may travel left and right, in px, relative to
|
|
70
|
+
* where it started. Produced by `measureDragRangeX` in `useColumnDragShift`
|
|
71
|
+
* from real header rects — NOT from declared column widths, which understate
|
|
72
|
+
* the rendered ones whenever the table stretches to fill its scroll wrap.
|
|
73
|
+
*/
|
|
74
|
+
export interface DragRangeX {
|
|
75
|
+
/**
|
|
76
|
+
* Lower bound for the x translation, in px. Non-positive under normal
|
|
77
|
+
* left-to-right layout, where the first slot sits at or left of the active
|
|
78
|
+
* column's own position.
|
|
79
|
+
*/
|
|
80
|
+
min: number;
|
|
81
|
+
/**
|
|
82
|
+
* Upper bound for the x translation, in px. Non-negative under normal
|
|
83
|
+
* left-to-right layout, where the last slot sits at or right of the active
|
|
84
|
+
* column's own position.
|
|
85
|
+
*/
|
|
86
|
+
max: number;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/** Clamp an x translation into `range`. */
|
|
90
|
+
export function clampX(x: number, range: DragRangeX): number {
|
|
91
|
+
return Math.min(range.max, Math.max(range.min, x));
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Turn an arbitrary column id into a fragment that is legal inside a CSS
|
|
96
|
+
* custom-property name. Column ids are consumer-supplied and routinely contain
|
|
97
|
+
* dots, spaces, or non-ASCII text, none of which are safe to interpolate.
|
|
98
|
+
*
|
|
99
|
+
* Sanitizing alone would collide (`a.b` and `a b` both become `a_b`), so a
|
|
100
|
+
* stable hash of the original id is appended.
|
|
101
|
+
*/
|
|
102
|
+
export function cssIdent(columnId: string): string {
|
|
103
|
+
const safe = columnId.replace(/[^a-zA-Z0-9_-]/g, '_');
|
|
104
|
+
// Java String.hashCode-style rolling hash (×31) — deterministic, no crypto
|
|
105
|
+
// needed, collisions are
|
|
106
|
+
// vanishingly unlikely across one table's column set.
|
|
107
|
+
let hash = 0;
|
|
108
|
+
for (let i = 0; i < columnId.length; i++) {
|
|
109
|
+
hash = (hash * 31 + columnId.charCodeAt(i)) | 0;
|
|
110
|
+
}
|
|
111
|
+
return `${safe}-${(hash >>> 0).toString(36)}`;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/** Full custom-property name carrying a column's current drag offset. */
|
|
115
|
+
export function shiftVarName(columnId: string): string {
|
|
116
|
+
return `--dt-shift-${cssIdent(columnId)}`;
|
|
117
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export { DataTable } from './DataTable';
|
|
2
|
+
export type { DataTableProps } from './DataTable';
|
|
3
|
+
|
|
4
|
+
export { useDataTable } from './useDataTable';
|
|
5
|
+
export { ColumnVisibilityTrigger } from './ColumnVisibilityTrigger';
|
|
6
|
+
export type { ColumnVisibilityTriggerProps } from './ColumnVisibilityTrigger';
|
|
7
|
+
|
|
8
|
+
export type {
|
|
9
|
+
ColumnDef,
|
|
10
|
+
ColumnAlign,
|
|
11
|
+
ColumnOrderState,
|
|
12
|
+
ColumnSizingState,
|
|
13
|
+
ColumnVisibilityState,
|
|
14
|
+
ColumnPinningState,
|
|
15
|
+
RowSelectionState,
|
|
16
|
+
ExpandedRowsState,
|
|
17
|
+
SortState,
|
|
18
|
+
Updater,
|
|
19
|
+
HeaderContext,
|
|
20
|
+
CellContext,
|
|
21
|
+
UseDataTableOptions,
|
|
22
|
+
DataTableInstance,
|
|
23
|
+
} from './types';
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { DataTableInstance } from './types';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Width of the auto-prepended selection cell. Kept here as the single source
|
|
5
|
+
* of truth so DataTable.tsx and pinStyle.ts agree on the offset shift.
|
|
6
|
+
*/
|
|
7
|
+
export const AUTO_CELL_WIDTH = 44;
|
|
8
|
+
|
|
9
|
+
export interface PinStyle {
|
|
10
|
+
position?: 'sticky';
|
|
11
|
+
left?: number;
|
|
12
|
+
right?: number;
|
|
13
|
+
pinSide?: 'left' | 'right';
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Compute the sticky-positioning inline style for a column cell.
|
|
18
|
+
*
|
|
19
|
+
* - Unpinned columns return an empty object (no sticky styles).
|
|
20
|
+
* - Left-pinned columns return `{ position: 'sticky', left: <px>, pinSide: 'left' }`.
|
|
21
|
+
* The `left` value is the column's cumulative offset from the hook
|
|
22
|
+
* (`instance.leftPinOffsets[columnId]`), shifted by one `AUTO_CELL_WIDTH`
|
|
23
|
+
* per active auto-cell on the left: `enableRowSelection` and
|
|
24
|
+
* `hasExpansion` each contribute when true.
|
|
25
|
+
* - Right-pinned columns return `{ position: 'sticky', right: <px>, pinSide: 'right' }`.
|
|
26
|
+
* No auto-cell shift on the right (selection + expand cells both live on the left).
|
|
27
|
+
*/
|
|
28
|
+
export function getPinStyle<T>(columnId: string, instance: DataTableInstance<T>): PinStyle {
|
|
29
|
+
const leftPinned = instance.columnPinning.left.includes(columnId);
|
|
30
|
+
const rightPinned = instance.columnPinning.right.includes(columnId);
|
|
31
|
+
|
|
32
|
+
if (leftPinned) {
|
|
33
|
+
const offset = instance.leftPinOffsets[columnId] ?? 0;
|
|
34
|
+
// Each auto-cell on the left contributes AUTO_CELL_WIDTH to the
|
|
35
|
+
// sticky-left offset of the first data column. In sliding order:
|
|
36
|
+
// [ select? ][ expand? ][ left-pinned data... ]
|
|
37
|
+
const shift =
|
|
38
|
+
(instance.enableRowSelection ? AUTO_CELL_WIDTH : 0) +
|
|
39
|
+
(instance.hasExpansion ? AUTO_CELL_WIDTH : 0);
|
|
40
|
+
return { position: 'sticky', left: offset + shift, pinSide: 'left' };
|
|
41
|
+
}
|
|
42
|
+
if (rightPinned) {
|
|
43
|
+
const offset = instance.rightPinOffsets[columnId] ?? 0;
|
|
44
|
+
return { position: 'sticky', right: offset, pinSide: 'right' };
|
|
45
|
+
}
|
|
46
|
+
return {};
|
|
47
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import type { ColumnOrderState, ColumnPinningState } from './types';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* True when both columns are on the same pin "side": both unpinned, both
|
|
5
|
+
* left-pinned, or both right-pinned. Used to reject cross-pin-boundary drag
|
|
6
|
+
* drops. A column can be pinned to at most one side; if data is malformed
|
|
7
|
+
* (in both lists), the function treats it as left-pinned (left checked first).
|
|
8
|
+
*/
|
|
9
|
+
export function sameSide(a: string, b: string, pinning: ColumnPinningState): boolean {
|
|
10
|
+
const aSide = pinning.left.includes(a)
|
|
11
|
+
? 'left'
|
|
12
|
+
: pinning.right.includes(a)
|
|
13
|
+
? 'right'
|
|
14
|
+
: 'unpinned';
|
|
15
|
+
const bSide = pinning.left.includes(b)
|
|
16
|
+
? 'left'
|
|
17
|
+
: pinning.right.includes(b)
|
|
18
|
+
? 'right'
|
|
19
|
+
: 'unpinned';
|
|
20
|
+
return aSide === bSide;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export interface ReorderArgs {
|
|
24
|
+
prev: ColumnOrderState;
|
|
25
|
+
activeId: string;
|
|
26
|
+
overId: string;
|
|
27
|
+
visibleIds: string[];
|
|
28
|
+
pinning: ColumnPinningState;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Reorder columns within their pin side. Returns the new `ColumnOrderState`,
|
|
33
|
+
* or `null` if the move should be rejected:
|
|
34
|
+
*
|
|
35
|
+
* - active and over are not on the same pin side (cross-boundary drag)
|
|
36
|
+
* - active === over (no-op)
|
|
37
|
+
* - active or over not found in `prev`
|
|
38
|
+
*
|
|
39
|
+
* The reorder operates on the visible-column slice and then re-slots the
|
|
40
|
+
* reordered ids back into `prev` at the same absolute positions, so hidden
|
|
41
|
+
* columns retain their positions in `columnOrder`. (Same algorithm as Phase 1's
|
|
42
|
+
* inline reorder; just adds the same-side check.)
|
|
43
|
+
*/
|
|
44
|
+
export function reorderRespectingPins(args: ReorderArgs): ColumnOrderState | null {
|
|
45
|
+
const { prev, activeId, overId, visibleIds, pinning } = args;
|
|
46
|
+
if (activeId === overId) return null;
|
|
47
|
+
if (!prev.includes(activeId) || !prev.includes(overId)) return null;
|
|
48
|
+
if (!sameSide(activeId, overId, pinning)) return null;
|
|
49
|
+
|
|
50
|
+
const visible = prev.filter((id) => visibleIds.includes(id));
|
|
51
|
+
const fromIdx = visible.indexOf(activeId);
|
|
52
|
+
const toIdx = visible.indexOf(overId);
|
|
53
|
+
if (fromIdx === -1 || toIdx === -1) return null;
|
|
54
|
+
|
|
55
|
+
const reorderedVisible = [...visible];
|
|
56
|
+
const [moved] = reorderedVisible.splice(fromIdx, 1);
|
|
57
|
+
reorderedVisible.splice(toIdx, 0, moved!);
|
|
58
|
+
|
|
59
|
+
let cursor = 0;
|
|
60
|
+
return prev.map((id) => {
|
|
61
|
+
if (visibleIds.includes(id)) {
|
|
62
|
+
return reorderedVisible[cursor++]!;
|
|
63
|
+
}
|
|
64
|
+
return id;
|
|
65
|
+
});
|
|
66
|
+
}
|
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
import type { ReactNode, MouseEvent as ReactMouseEvent } from 'react';
|
|
2
|
+
|
|
3
|
+
/** Cell / header text alignment. */
|
|
4
|
+
export type ColumnAlign = 'start' | 'center' | 'end';
|
|
5
|
+
|
|
6
|
+
/** Single-column sort state. v1 is single-column only; multi-column is a future extension. */
|
|
7
|
+
export interface SortState {
|
|
8
|
+
columnId: string;
|
|
9
|
+
direction: 'asc' | 'desc';
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/** Ordered list of column ids (includes hidden columns at their absolute positions). */
|
|
13
|
+
export type ColumnOrderState = string[];
|
|
14
|
+
|
|
15
|
+
/** Map column id → resolved width in px. Missing entries fall back to `ColumnDef.size` or the default (120). */
|
|
16
|
+
export type ColumnSizingState = Record<string, number>;
|
|
17
|
+
|
|
18
|
+
/** Map column id → visible flag. Missing entries are treated as `true` (visible). */
|
|
19
|
+
export type ColumnVisibilityState = Record<string, boolean>;
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Ordered pin lists per side. Phase 1 plumbs this state but does not render
|
|
23
|
+
* the sticky CSS — rendering effects ship in Phase 2.
|
|
24
|
+
*/
|
|
25
|
+
export interface ColumnPinningState {
|
|
26
|
+
left: string[];
|
|
27
|
+
right: string[];
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** Map row id → selected flag. Missing entries treated as `false`. */
|
|
31
|
+
export type RowSelectionState = Record<string, boolean>;
|
|
32
|
+
|
|
33
|
+
/** Map row id → expanded flag. Phase 1 plumbs state; rendering ships in Phase 3. */
|
|
34
|
+
export type ExpandedRowsState = Record<string, boolean>;
|
|
35
|
+
|
|
36
|
+
/** setState-style updater: either the next value, or a function (prev) => next. */
|
|
37
|
+
export type Updater<S> = S | ((prev: S) => S);
|
|
38
|
+
|
|
39
|
+
/** Header render-prop context. */
|
|
40
|
+
export interface HeaderContext<T = unknown> {
|
|
41
|
+
column: ColumnDef<T>;
|
|
42
|
+
instance: DataTableInstance<T>;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/** Cell render-prop context. */
|
|
46
|
+
export interface CellContext<T> {
|
|
47
|
+
row: T;
|
|
48
|
+
rowId: string;
|
|
49
|
+
column: ColumnDef<T>;
|
|
50
|
+
instance: DataTableInstance<T>;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/** Descriptor for one column. Keyed by `id` — used as the key for all per-column state. */
|
|
54
|
+
export interface ColumnDef<T> {
|
|
55
|
+
/** Stable id. Used as key for column order, sizing, visibility, pinning state. */
|
|
56
|
+
id: string;
|
|
57
|
+
/** Header content. String, node, or a render-prop receiving HeaderContext. */
|
|
58
|
+
header: ReactNode | ((ctx: HeaderContext<T>) => ReactNode);
|
|
59
|
+
/** Cell content for a row. */
|
|
60
|
+
cell: (row: T, ctx: CellContext<T>) => ReactNode;
|
|
61
|
+
/** Cell text alignment. Defaults to 'start'. */
|
|
62
|
+
align?: ColumnAlign;
|
|
63
|
+
/** Default width in px when no entry in ColumnSizingState. Defaults to 120. */
|
|
64
|
+
size?: number;
|
|
65
|
+
/** Min width during resize (px). Defaults to 40. */
|
|
66
|
+
minSize?: number;
|
|
67
|
+
/** Max width during resize (px). Defaults to undefined (no max). */
|
|
68
|
+
maxSize?: number;
|
|
69
|
+
/** Whether the column can be reordered via drag. Defaults true. */
|
|
70
|
+
enableReorder?: boolean;
|
|
71
|
+
/** Whether the column can be resized via the handle. Defaults true. */
|
|
72
|
+
enableResize?: boolean;
|
|
73
|
+
/** Whether the column can be hidden via the visibility menu. Defaults true. */
|
|
74
|
+
enableHide?: boolean;
|
|
75
|
+
/** Whether the column can be pinned. Defaults true. (Phase 2 will use this.) */
|
|
76
|
+
enablePin?: boolean;
|
|
77
|
+
/**
|
|
78
|
+
* Server-side sortable. When true, the header label is clickable and
|
|
79
|
+
* keyboard-actionable; toggling fires onSortChange. DataTable does
|
|
80
|
+
* not perform client-side sorting.
|
|
81
|
+
*/
|
|
82
|
+
sortable?: boolean;
|
|
83
|
+
/**
|
|
84
|
+
* Plain-text column label. Used by the visibility menu and, when
|
|
85
|
+
* `DataTable.collapseBelow` is set, by the visual card-field label and resize
|
|
86
|
+
* separator name. Falls back to a string `header`; card fields with neither
|
|
87
|
+
* stay visually unlabelled, and the visibility menu falls back to `id` —
|
|
88
|
+
* that menu is the one place a column's raw id can still reach a user.
|
|
89
|
+
* Resize separators do NOT: they take a generic "Resize this column".
|
|
90
|
+
*
|
|
91
|
+
* It also NAMES the column header, but only when `header` is not a
|
|
92
|
+
* text-rendering string — i.e. a ReactNode, a render function, or `''`. So
|
|
93
|
+
* `<span>Rev</span>` with `visibilityLabel: "Revenue (USD)"` announces
|
|
94
|
+
* "Revenue (USD)", NOT "Rev". A string header always names itself and this
|
|
95
|
+
* never overrides it.
|
|
96
|
+
*
|
|
97
|
+
* That override is deliberate. Deciding at runtime whether a ReactNode names
|
|
98
|
+
* itself needs the accessible name, and seven attempts to approximate that
|
|
99
|
+
* from the DOM each shipped either a raw `column.id` in the announcement or
|
|
100
|
+
* an unnamed column header. The rule is static instead, and the cost is that
|
|
101
|
+
* a node which DOES name itself is overridden when you also set this.
|
|
102
|
+
*
|
|
103
|
+
* Set it on every non-text header. Without it the component will not invent
|
|
104
|
+
* a name: `column.id` is the only candidate left and a developer identifier
|
|
105
|
+
* is not something to read aloud, so it is used for nothing — not the
|
|
106
|
+
* header, not the drag grip, not the resize handle.
|
|
107
|
+
*
|
|
108
|
+
* What such a header announces, measured off Chromium's AX tree: it falls
|
|
109
|
+
* through to NAME-FROM-CONTENT, because an `aria-labelledby` resolving to no
|
|
110
|
+
* text is marked invalid rather than treated as a name. So the cell's own
|
|
111
|
+
* controls name it — "Drag to reorder this column", or under `collapseBelow`
|
|
112
|
+
* the resize handle's live pixel width. `header: ''` is special-cased to a
|
|
113
|
+
* generic label so the width cannot win; a ReactNode that renders nothing is
|
|
114
|
+
* indistinguishable from one that names itself, so it is not.
|
|
115
|
+
*
|
|
116
|
+
* None of those is a name you chose. Set this prop on every text-less
|
|
117
|
+
* header; your axe run flags what is left via `empty-table-header`.
|
|
118
|
+
*
|
|
119
|
+
* An EMPTY string counts as unset, not as an explicit name, in ALL THREE
|
|
120
|
+
* places that read this prop — the column header (`HeaderCell`), the
|
|
121
|
+
* responsive card's field label (`BodyRow`) and the visibility menu row
|
|
122
|
+
* (`ColumnVisibilityTrigger`). Each falls back to a string `header` rather
|
|
123
|
+
* than discarding it, and the menu falls on past that to `id`. #534
|
|
124
|
+
* converted only the first, which left one prop meaning "unset" in the
|
|
125
|
+
* header and "render nothing" two files over; #536 made them agree.
|
|
126
|
+
*
|
|
127
|
+
* There is deliberately no way to blank a column's label with `''`. The menu
|
|
128
|
+
* row is the case that decides it: a blank checkbox row is unidentifiable,
|
|
129
|
+
* which is strictly worse than the raw `id` the fallback chain already
|
|
130
|
+
* treats as a last resort.
|
|
131
|
+
*
|
|
132
|
+
* A WHITESPACE-ONLY `header` is treated the same way, in all three, for the
|
|
133
|
+
* same reason: `' '` renders no text, so it is not a label. Only the menu
|
|
134
|
+
* trimmed at first, which left the sentence above true of `''` but not of
|
|
135
|
+
* `' '`.
|
|
136
|
+
*/
|
|
137
|
+
visibilityLabel?: string;
|
|
138
|
+
/**
|
|
139
|
+
* Initial pin side for this column. Used as the derived default for
|
|
140
|
+
* `columnPinning` when the consumer doesn't pass `columnPinning` or
|
|
141
|
+
* `defaultColumnPinning`. Lower-precedence than either — explicit
|
|
142
|
+
* `defaultColumnPinning` on the hook always wins.
|
|
143
|
+
*
|
|
144
|
+
* Runtime pinning (e.g. `instance.pinColumn(id, 'right')`) updates the
|
|
145
|
+
* `columnPinning` state and takes over from this initial value.
|
|
146
|
+
*/
|
|
147
|
+
pin?: 'left' | 'right';
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/** Public options to `useDataTable<T>(...)`. */
|
|
151
|
+
export interface UseDataTableOptions<T> {
|
|
152
|
+
// pure data
|
|
153
|
+
data: T[];
|
|
154
|
+
pinnedRows?: T[];
|
|
155
|
+
columns: ColumnDef<T>[];
|
|
156
|
+
/** Required. Stable id per row — used by selection, expansion, and `getRowId`. */
|
|
157
|
+
getRowId: (row: T) => string;
|
|
158
|
+
/** Total server-side row count. Surfaced as `aria-rowcount` for screen readers. */
|
|
159
|
+
rowCount?: number;
|
|
160
|
+
/** Opt-in to the selection auto-column. Defaults false. */
|
|
161
|
+
enableRowSelection?: boolean;
|
|
162
|
+
|
|
163
|
+
// each state piece: controlled / default / onChange (Radix pattern)
|
|
164
|
+
|
|
165
|
+
/** Controlled column order. Pass with `onColumnOrderChange` to manage state externally. */
|
|
166
|
+
columnOrder?: ColumnOrderState;
|
|
167
|
+
/** Initial column order when uncontrolled. Defaults to `columns.map(c => c.id)`. */
|
|
168
|
+
defaultColumnOrder?: ColumnOrderState;
|
|
169
|
+
/** Fires when the order changes (drag-reorder or programmatic set). */
|
|
170
|
+
onColumnOrderChange?: (next: ColumnOrderState) => void;
|
|
171
|
+
|
|
172
|
+
/** Controlled column sizing map (column id → width in px). Pass with `onColumnSizingChange`. */
|
|
173
|
+
columnSizing?: ColumnSizingState;
|
|
174
|
+
/** Initial column sizing when uncontrolled. Missing entries fall back to `ColumnDef.size` or 120px. */
|
|
175
|
+
defaultColumnSizing?: ColumnSizingState;
|
|
176
|
+
/** Fires when any column is resized. */
|
|
177
|
+
onColumnSizingChange?: (next: ColumnSizingState) => void;
|
|
178
|
+
|
|
179
|
+
/** Controlled column visibility map (column id → visible flag). Pass with `onColumnVisibilityChange`. */
|
|
180
|
+
columnVisibility?: ColumnVisibilityState;
|
|
181
|
+
/** Initial column visibility when uncontrolled. Missing entries are treated as visible. */
|
|
182
|
+
defaultColumnVisibility?: ColumnVisibilityState;
|
|
183
|
+
/** Fires when column visibility toggles (e.g. via `<ColumnVisibilityTrigger>`). */
|
|
184
|
+
onColumnVisibilityChange?: (next: ColumnVisibilityState) => void;
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Controlled column pinning state. Pass with `onColumnPinningChange`.
|
|
188
|
+
* Note: Phase 1 plumbs this state — sticky rendering ships in Phase 2.
|
|
189
|
+
*/
|
|
190
|
+
columnPinning?: ColumnPinningState;
|
|
191
|
+
/**
|
|
192
|
+
* Initial column pinning when uncontrolled. Defaults to `{ left: [], right: [] }`.
|
|
193
|
+
* Note: Phase 1 plumbs this state — sticky rendering ships in Phase 2.
|
|
194
|
+
*/
|
|
195
|
+
defaultColumnPinning?: ColumnPinningState;
|
|
196
|
+
/** Fires when a column is pinned or unpinned. */
|
|
197
|
+
onColumnPinningChange?: (next: ColumnPinningState) => void;
|
|
198
|
+
|
|
199
|
+
/** Controlled row selection map (row id → selected flag). Pass with `onRowSelectionChange`. */
|
|
200
|
+
rowSelection?: RowSelectionState;
|
|
201
|
+
/** Initial row selection when uncontrolled. Defaults to `{}` (nothing selected). */
|
|
202
|
+
defaultRowSelection?: RowSelectionState;
|
|
203
|
+
/** Fires when any row selection changes (per-row toggle or select-all). */
|
|
204
|
+
onRowSelectionChange?: (next: RowSelectionState) => void;
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* Controlled expanded-rows map (row id → expanded flag). Pass with `onExpandedRowsChange`.
|
|
208
|
+
* Note: Phase 1 plumbs this state — expansion rendering ships in Phase 3.
|
|
209
|
+
*/
|
|
210
|
+
expandedRows?: ExpandedRowsState;
|
|
211
|
+
/**
|
|
212
|
+
* Initial expanded rows when uncontrolled. Defaults to `{}` (all collapsed).
|
|
213
|
+
* Note: Phase 1 plumbs this state — expansion rendering ships in Phase 3.
|
|
214
|
+
*/
|
|
215
|
+
defaultExpandedRows?: ExpandedRowsState;
|
|
216
|
+
/** Fires when a row is expanded or collapsed. */
|
|
217
|
+
onExpandedRowsChange?: (next: ExpandedRowsState) => void;
|
|
218
|
+
|
|
219
|
+
/** Controlled single-column sort state. Pass with `onSortChange` for server-driven sorting. */
|
|
220
|
+
sort?: SortState | null;
|
|
221
|
+
/** Initial sort when uncontrolled. Defaults to `null` (unsorted). */
|
|
222
|
+
defaultSort?: SortState | null;
|
|
223
|
+
/** Fires when the sort state changes (column header click cycles null → asc → desc → null). */
|
|
224
|
+
onSortChange?: (next: SortState | null) => void;
|
|
225
|
+
|
|
226
|
+
// interactivity
|
|
227
|
+
onRowClick?: (row: T, event: ReactMouseEvent<HTMLTableRowElement>) => void;
|
|
228
|
+
/** Phase 1 plumbs this prop but does not render expansion. Rendering ships in Phase 3. */
|
|
229
|
+
renderExpandedRow?: (row: T) => ReactNode;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/** Returned by `useDataTable<T>(...)`. Passed into `<DataTable instance={...} />`. */
|
|
233
|
+
export interface DataTableInstance<T> {
|
|
234
|
+
// echoed inputs
|
|
235
|
+
data: T[];
|
|
236
|
+
pinnedRows: T[];
|
|
237
|
+
columns: ColumnDef<T>[];
|
|
238
|
+
getRowId: (row: T) => string;
|
|
239
|
+
rowCount?: number;
|
|
240
|
+
enableRowSelection: boolean;
|
|
241
|
+
hasExpansion: boolean;
|
|
242
|
+
onRowClick?: UseDataTableOptions<T>['onRowClick'];
|
|
243
|
+
renderExpandedRow?: UseDataTableOptions<T>['renderExpandedRow'];
|
|
244
|
+
|
|
245
|
+
// resolved current state
|
|
246
|
+
columnOrder: ColumnOrderState;
|
|
247
|
+
columnSizing: ColumnSizingState;
|
|
248
|
+
columnVisibility: ColumnVisibilityState;
|
|
249
|
+
columnPinning: ColumnPinningState;
|
|
250
|
+
rowSelection: RowSelectionState;
|
|
251
|
+
expandedRows: ExpandedRowsState;
|
|
252
|
+
sort: SortState | null;
|
|
253
|
+
|
|
254
|
+
// derived view-models (memoized)
|
|
255
|
+
visibleColumns: ColumnDef<T>[];
|
|
256
|
+
leftPinnedColumns: ColumnDef<T>[];
|
|
257
|
+
rightPinnedColumns: ColumnDef<T>[];
|
|
258
|
+
unpinnedColumns: ColumnDef<T>[];
|
|
259
|
+
columnSizesPx: Record<string, number>;
|
|
260
|
+
leftPinOffsets: Record<string, number>;
|
|
261
|
+
rightPinOffsets: Record<string, number>;
|
|
262
|
+
|
|
263
|
+
// setState-style mutators
|
|
264
|
+
setColumnOrder: (updater: Updater<ColumnOrderState>) => void;
|
|
265
|
+
setColumnSizing: (updater: Updater<ColumnSizingState>) => void;
|
|
266
|
+
setColumnVisibility: (updater: Updater<ColumnVisibilityState>) => void;
|
|
267
|
+
setColumnPinning: (updater: Updater<ColumnPinningState>) => void;
|
|
268
|
+
setRowSelection: (updater: Updater<RowSelectionState>) => void;
|
|
269
|
+
setExpandedRows: (updater: Updater<ExpandedRowsState>) => void;
|
|
270
|
+
setSort: (updater: Updater<SortState | null>) => void;
|
|
271
|
+
|
|
272
|
+
// higher-level helpers
|
|
273
|
+
/** Toggle selection of a single row by id. */
|
|
274
|
+
toggleRowSelection: (rowId: string) => void;
|
|
275
|
+
/** Toggle selection of all rows in `data` (does not affect `pinnedRows`). */
|
|
276
|
+
toggleAllOnPage: () => void;
|
|
277
|
+
/** All rows in `data` are selected (excludes `pinnedRows`). */
|
|
278
|
+
isAllOnPageSelected: () => boolean;
|
|
279
|
+
/** Some but not all rows in `data` are selected — drives the header checkbox indeterminate state. */
|
|
280
|
+
isSomeOnPageSelected: () => boolean;
|
|
281
|
+
/** Toggle expansion of a single row by id. */
|
|
282
|
+
toggleRowExpanded: (rowId: string) => void;
|
|
283
|
+
/** Toggle visibility of a column by id. Guarded against hiding the last visible hidable column when called via `<ColumnVisibilityTrigger>`. */
|
|
284
|
+
toggleColumnVisibility: (columnId: string) => void;
|
|
285
|
+
/** Pin a column to `left`, `right`, or `false` to unpin. Pinning order within a side is append-on-pin. */
|
|
286
|
+
pinColumn: (columnId: string, side: 'left' | 'right' | false) => void;
|
|
287
|
+
/** Cycle sort state for a column: null → asc → desc → null. */
|
|
288
|
+
toggleSort: (columnId: string) => void;
|
|
289
|
+
}
|