@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,20 @@
|
|
|
1
|
+
// Screen.tokens.scss — Component-scoped tokens for <Screen>. Padding, the
|
|
2
|
+
// block-fill min-height, and the three backdrops. Backdrop gradients reference
|
|
3
|
+
// color primitives for their stops (geometry percentages are not tokenized
|
|
4
|
+
// values); custom-property declarations are exempt from declaration-strict-value.
|
|
5
|
+
:root {
|
|
6
|
+
--screen-padding: var(--space-6);
|
|
7
|
+
--screen-block-min-height: 60vh;
|
|
8
|
+
|
|
9
|
+
--screen-backdrop-plain: var(--color-bg-subtle);
|
|
10
|
+
--screen-backdrop-accent: radial-gradient(
|
|
11
|
+
120% 90% at 50% -8%,
|
|
12
|
+
var(--color-accent-subtle-bg) 0%,
|
|
13
|
+
var(--color-bg-subtle) 52%
|
|
14
|
+
);
|
|
15
|
+
--screen-backdrop-danger: radial-gradient(
|
|
16
|
+
120% 90% at 50% -8%,
|
|
17
|
+
var(--color-danger-bg-subtle) 0%,
|
|
18
|
+
var(--color-bg-subtle) 55%
|
|
19
|
+
);
|
|
20
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { forwardRef, type HTMLAttributes, type ReactNode } from 'react';
|
|
2
|
+
import clsx from 'clsx';
|
|
3
|
+
import styles from './Screen.module.scss';
|
|
4
|
+
|
|
5
|
+
/** How tall the screen is. */
|
|
6
|
+
export type ScreenFill = 'viewport' | 'block';
|
|
7
|
+
|
|
8
|
+
/** Backdrop treatment behind the centered content. */
|
|
9
|
+
export type ScreenBackdrop = 'none' | 'plain' | 'accent' | 'danger';
|
|
10
|
+
|
|
11
|
+
/** Vertical placement of the main content. */
|
|
12
|
+
export type ScreenAlign = 'center' | 'start';
|
|
13
|
+
|
|
14
|
+
export interface ScreenProps extends HTMLAttributes<HTMLDivElement> {
|
|
15
|
+
/** The centered main content. */
|
|
16
|
+
children: ReactNode;
|
|
17
|
+
|
|
18
|
+
/** Pinned-top slot — a back link, wordmark, etc. Omit for none. */
|
|
19
|
+
header?: ReactNode;
|
|
20
|
+
|
|
21
|
+
/** Pinned-bottom slot — legal / footer links. Omit for none. */
|
|
22
|
+
footer?: ReactNode;
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Screen height. Defaults to `'viewport'`.
|
|
26
|
+
* - `'viewport'` — `min-height: 100vh`; a true standalone page (login,
|
|
27
|
+
* standalone 404 / error).
|
|
28
|
+
* - `'block'` — fills its container instead of the viewport; use when the
|
|
29
|
+
* Screen is embedded inside the app shell's content area (the in-app
|
|
30
|
+
* 404 / error variants).
|
|
31
|
+
*/
|
|
32
|
+
fill?: ScreenFill;
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Backdrop behind the content. Defaults to `'none'` (transparent — inherits
|
|
36
|
+
* the surface; use with `fill="block"` inside the shell).
|
|
37
|
+
* - `'plain'` — solid subtle surface.
|
|
38
|
+
* - `'accent'` — accent-tinted radial (the login backdrop).
|
|
39
|
+
* - `'danger'` — danger-tinted radial (standalone error screen).
|
|
40
|
+
*/
|
|
41
|
+
backdrop?: ScreenBackdrop;
|
|
42
|
+
|
|
43
|
+
/** Vertical placement of the main content. Defaults to `'center'`. */
|
|
44
|
+
align?: ScreenAlign;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const fillClass: Record<ScreenFill, string> = {
|
|
48
|
+
viewport: styles.fillViewport,
|
|
49
|
+
block: styles.fillBlock,
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
const backdropClass: Record<ScreenBackdrop, string | undefined> = {
|
|
53
|
+
none: undefined,
|
|
54
|
+
plain: styles.backdropPlain,
|
|
55
|
+
accent: styles.backdropAccent,
|
|
56
|
+
danger: styles.backdropDanger,
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
const alignClass: Record<ScreenAlign, string> = {
|
|
60
|
+
center: styles.alignCenter,
|
|
61
|
+
start: styles.alignStart,
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Full-bleed / centered page-root layout for chromeless screens outside the app shell (sign-in, 404, error, onboarding).
|
|
66
|
+
* @see docs/components/Screen.md
|
|
67
|
+
*/
|
|
68
|
+
export const Screen = forwardRef<HTMLDivElement, ScreenProps>(function Screen(
|
|
69
|
+
{
|
|
70
|
+
children,
|
|
71
|
+
header,
|
|
72
|
+
footer,
|
|
73
|
+
fill = 'viewport',
|
|
74
|
+
backdrop = 'none',
|
|
75
|
+
align = 'center',
|
|
76
|
+
className,
|
|
77
|
+
...rest
|
|
78
|
+
},
|
|
79
|
+
ref,
|
|
80
|
+
) {
|
|
81
|
+
// {...rest} last so consumer overrides win (Pattern A).
|
|
82
|
+
return (
|
|
83
|
+
<div
|
|
84
|
+
ref={ref}
|
|
85
|
+
className={clsx(styles.root, fillClass[fill], backdropClass[backdrop], className)}
|
|
86
|
+
{...rest}
|
|
87
|
+
>
|
|
88
|
+
{/* `styles.header` / `styles.footer` are intentionally NOT declared in the
|
|
89
|
+
SCSS — the flex column pins them top/bottom. Accessing an absent CSS-module
|
|
90
|
+
key returns undefined at runtime → no class attribute (and avoids an empty
|
|
91
|
+
ruleset that would trip stylelint's block-no-empty). */}
|
|
92
|
+
{header != null && <div className={styles.header}>{header}</div>}
|
|
93
|
+
<div className={clsx(styles.main, alignClass[align])}>{children}</div>
|
|
94
|
+
{footer != null && <div className={styles.footer}>{footer}</div>}
|
|
95
|
+
</div>
|
|
96
|
+
);
|
|
97
|
+
});
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
@use './ScrollArea.tokens';
|
|
2
|
+
@use '../../styles/mixins' as *;
|
|
3
|
+
|
|
4
|
+
// Scrolling, not layout: overflow + a shrinkable min-height so the area can
|
|
5
|
+
// be the one flexible child of a bounded flex parent (e.g. a Popover capped at
|
|
6
|
+
// the viewport). `overscroll-behavior: contain` keeps a feed scrolled to its
|
|
7
|
+
// end from scrolling the page behind the popover.
|
|
8
|
+
.root {
|
|
9
|
+
overflow-y: auto;
|
|
10
|
+
|
|
11
|
+
// Vertical only: `overflow-y: auto` alone computes `overflow-x: auto`, a
|
|
12
|
+
// horizontal scroller with no keyboard tab stop. Wide content is clipped.
|
|
13
|
+
overflow-x: hidden;
|
|
14
|
+
min-height: 0;
|
|
15
|
+
overscroll-behavior: contain;
|
|
16
|
+
|
|
17
|
+
// The overflow clips at the padding edge, so a link flush against it lost
|
|
18
|
+
// its outset focus ring (focus-ring geometry sweep). Pad by the ring's
|
|
19
|
+
// extent, and scroll-pad the same so a keyboard-focused child scrolls into
|
|
20
|
+
// view with its ring.
|
|
21
|
+
padding: var(--scroll-area-padding);
|
|
22
|
+
scroll-padding: var(--scroll-area-padding);
|
|
23
|
+
|
|
24
|
+
&:focus-visible {
|
|
25
|
+
@include focus-ring(var(--scroll-area-ring));
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
.max-height-sm {
|
|
30
|
+
max-height: var(--scroll-area-max-height-sm);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
.max-height-md {
|
|
34
|
+
max-height: var(--scroll-area-max-height-md);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
.max-height-lg {
|
|
38
|
+
max-height: var(--scroll-area-max-height-lg);
|
|
39
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// ScrollArea.tokens.scss — component-scoped tokens for <ScrollArea>.
|
|
2
|
+
:root {
|
|
3
|
+
// Height cap scale (`maxHeight="sm" | "md" | "lg"`).
|
|
4
|
+
--scroll-area-max-height-sm: var(--size-scroll-area-sm);
|
|
5
|
+
--scroll-area-max-height-md: var(--size-scroll-area-md);
|
|
6
|
+
--scroll-area-max-height-lg: var(--size-scroll-area-lg);
|
|
7
|
+
|
|
8
|
+
// Content inset = the focus-ring extent (offset + width, 4px): room for a
|
|
9
|
+
// focused child's outset ring at the area's clip edge (same approach as
|
|
10
|
+
// DropdownMenu's --dropdown-menu-padding).
|
|
11
|
+
--scroll-area-padding: calc(var(--ring-offset) + var(--ring-width));
|
|
12
|
+
|
|
13
|
+
// Focus ring — shown only while the area is itself a tab stop.
|
|
14
|
+
--scroll-area-ring: var(--ring-accent);
|
|
15
|
+
}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import {
|
|
2
|
+
forwardRef,
|
|
3
|
+
useCallback,
|
|
4
|
+
useEffect,
|
|
5
|
+
useLayoutEffect,
|
|
6
|
+
useRef,
|
|
7
|
+
useState,
|
|
8
|
+
type HTMLAttributes,
|
|
9
|
+
} from 'react';
|
|
10
|
+
import clsx from 'clsx';
|
|
11
|
+
import { chain, mergeRefs } from '../_internal/refs';
|
|
12
|
+
import { FOCUSABLE_SELECTOR } from '../_internal/overlay/useFocusTrap';
|
|
13
|
+
import styles from './ScrollArea.module.scss';
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Height cap for `<ScrollArea>`. A scale value (`'sm' | 'md' | 'lg'`) or an
|
|
17
|
+
* escape-hatch length. Details on `ScrollAreaProps#maxHeight`.
|
|
18
|
+
*/
|
|
19
|
+
// `string & {}` keeps editor autocomplete for the scale values.
|
|
20
|
+
export type ScrollAreaMaxHeight = 'sm' | 'md' | 'lg' | number | (string & {});
|
|
21
|
+
|
|
22
|
+
const SCALE: ReadonlySet<string> = new Set(['sm', 'md', 'lg']);
|
|
23
|
+
|
|
24
|
+
export interface ScrollAreaProps extends HTMLAttributes<HTMLDivElement> {
|
|
25
|
+
/**
|
|
26
|
+
* Caps the area's height; past it, the content scrolls vertically.
|
|
27
|
+
* - `'sm'` — 240px. A short list inside a form or a card.
|
|
28
|
+
* - `'md'` — 400px. A popover feed (notifications, activity).
|
|
29
|
+
* - `'lg'` — 560px. A tall panel body.
|
|
30
|
+
* - `number` — px, for a one-off (`maxHeight={320}`). Prefer the scale.
|
|
31
|
+
* - `string` — any CSS length (`'50vh'`).
|
|
32
|
+
*
|
|
33
|
+
* Omitted: no cap of its own. The area fills the height its parent gives
|
|
34
|
+
* it, which is right as the flexible child of a bounded flex column.
|
|
35
|
+
*/
|
|
36
|
+
maxHeight?: ScrollAreaMaxHeight;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* A region that scrolls only its own content vertically, padded by the focus-ring extent so focused rings are not clipped.
|
|
41
|
+
* @see docs/components/ScrollArea.md
|
|
42
|
+
*/
|
|
43
|
+
export const ScrollArea = forwardRef<HTMLDivElement, ScrollAreaProps>(function ScrollArea(
|
|
44
|
+
{ maxHeight, className, style, children, onBlur, ...rest },
|
|
45
|
+
ref,
|
|
46
|
+
) {
|
|
47
|
+
const innerRef = useRef<HTMLDivElement>(null);
|
|
48
|
+
const [focusable, setFocusable] = useState(false);
|
|
49
|
+
const warnedRef = useRef(false);
|
|
50
|
+
|
|
51
|
+
// A scroller the keyboard can't reach is WCAG 2.1.1's failure (axe
|
|
52
|
+
// `scrollable-region-focusable`). Focusable content already reaches it,
|
|
53
|
+
// since tabbing to a child scrolls it into view, so the area only becomes a
|
|
54
|
+
// tab stop when it overflows AND holds nothing focusable. This is what
|
|
55
|
+
// Chrome 130+ and Firefox do natively; Safari doesn't.
|
|
56
|
+
const measure = useCallback(() => {
|
|
57
|
+
const el = innerRef.current;
|
|
58
|
+
if (!el) return;
|
|
59
|
+
const next = el.scrollHeight > el.clientHeight && el.querySelector(FOCUSABLE_SELECTOR) === null;
|
|
60
|
+
// Removing tabIndex from the focused element drops focus to <body>. Keep
|
|
61
|
+
// the tab stop while the area holds focus; the onBlur re-measure drops it.
|
|
62
|
+
setFocusable((prev) => next || (prev && document.activeElement === el));
|
|
63
|
+
}, []);
|
|
64
|
+
|
|
65
|
+
useLayoutEffect(measure, [measure]);
|
|
66
|
+
|
|
67
|
+
useEffect(() => {
|
|
68
|
+
const el = innerRef.current;
|
|
69
|
+
if (!el) return;
|
|
70
|
+
const ro = typeof ResizeObserver === 'undefined' ? null : new ResizeObserver(measure);
|
|
71
|
+
// The area's own box changes when its cap or its parent does; its
|
|
72
|
+
// content's height changes when a direct child resizes (images loading,
|
|
73
|
+
// rows expanding). Observe direct children as they're added; drop the
|
|
74
|
+
// ones removed so detached rows aren't held until unmount.
|
|
75
|
+
if (ro) {
|
|
76
|
+
ro.observe(el);
|
|
77
|
+
for (const child of Array.from(el.children)) ro.observe(child);
|
|
78
|
+
}
|
|
79
|
+
const mo =
|
|
80
|
+
typeof MutationObserver === 'undefined'
|
|
81
|
+
? null
|
|
82
|
+
: new MutationObserver((records) => {
|
|
83
|
+
if (ro) {
|
|
84
|
+
for (const record of records) {
|
|
85
|
+
for (const node of Array.from(record.addedNodes)) {
|
|
86
|
+
if (node instanceof Element && node.parentNode === el) ro.observe(node);
|
|
87
|
+
}
|
|
88
|
+
if (record.target === el) {
|
|
89
|
+
for (const node of Array.from(record.removedNodes)) {
|
|
90
|
+
if (node instanceof Element) ro.unobserve(node);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
measure();
|
|
96
|
+
});
|
|
97
|
+
mo?.observe(el, {
|
|
98
|
+
childList: true,
|
|
99
|
+
subtree: true,
|
|
100
|
+
// A bare text-node child (e.g. a plain-text log) updates via
|
|
101
|
+
// `nodeValue` in place — no childList mutation, so without this the
|
|
102
|
+
// area never re-measures as that text grows.
|
|
103
|
+
characterData: true,
|
|
104
|
+
attributes: true,
|
|
105
|
+
// FOCUSABLE_SELECTOR ignores visibility, so a link inside a `hidden`
|
|
106
|
+
// wrapper still counts as focusable and suppresses the tab stop — a
|
|
107
|
+
// known limit shared with useFocusTrap. `hidden` stays in the filter
|
|
108
|
+
// anyway: the re-measure it triggers is harmless.
|
|
109
|
+
attributeFilter: ['tabindex', 'disabled', 'href', 'hidden'],
|
|
110
|
+
});
|
|
111
|
+
return () => {
|
|
112
|
+
ro?.disconnect();
|
|
113
|
+
mo?.disconnect();
|
|
114
|
+
};
|
|
115
|
+
}, [measure]);
|
|
116
|
+
|
|
117
|
+
const named = Boolean(rest['aria-label'] || rest['aria-labelledby']);
|
|
118
|
+
useEffect(() => {
|
|
119
|
+
if (process.env.NODE_ENV === 'production') return;
|
|
120
|
+
if (focusable && !named && !warnedRef.current) {
|
|
121
|
+
warnedRef.current = true;
|
|
122
|
+
console.warn(
|
|
123
|
+
'[ScrollArea] It overflows with no focusable content, so it is a keyboard tab stop — ' +
|
|
124
|
+
'give it an accessible name with aria-label or aria-labelledby.',
|
|
125
|
+
);
|
|
126
|
+
}
|
|
127
|
+
}, [focusable, named]);
|
|
128
|
+
|
|
129
|
+
const scale = typeof maxHeight === 'string' && SCALE.has(maxHeight);
|
|
130
|
+
const inlineMaxHeight =
|
|
131
|
+
maxHeight === undefined || scale
|
|
132
|
+
? undefined
|
|
133
|
+
: typeof maxHeight === 'number'
|
|
134
|
+
? `${maxHeight}px`
|
|
135
|
+
: maxHeight;
|
|
136
|
+
|
|
137
|
+
return (
|
|
138
|
+
// {...rest} last so a consumer tabIndex / role overrides the computed ones.
|
|
139
|
+
<div
|
|
140
|
+
ref={mergeRefs<HTMLDivElement>(innerRef, ref)}
|
|
141
|
+
data-scroll-area=""
|
|
142
|
+
tabIndex={focusable ? 0 : undefined}
|
|
143
|
+
// Named ⇒ always a region: a named generic div is prohibited (ARIA 1.2).
|
|
144
|
+
role={named || focusable ? 'region' : undefined}
|
|
145
|
+
className={clsx(styles.root, scale && styles[`max-height-${maxHeight}`], className)}
|
|
146
|
+
style={inlineMaxHeight !== undefined ? { maxHeight: inlineMaxHeight, ...style } : style}
|
|
147
|
+
onBlur={chain(onBlur, measure)}
|
|
148
|
+
{...rest}
|
|
149
|
+
>
|
|
150
|
+
{children}
|
|
151
|
+
</div>
|
|
152
|
+
);
|
|
153
|
+
});
|
|
154
|
+
ScrollArea.displayName = 'ScrollArea';
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import clsx from 'clsx';
|
|
2
|
+
import styles from './Select.module.scss';
|
|
3
|
+
import { useTranslation } from '../../i18n/useTranslation';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Internal subcomponent rendered inside chips-mode Select triggers
|
|
7
|
+
* (`multiple + triggerDisplay='chips'`). Each Chip represents one selected
|
|
8
|
+
* option: a label plus a ✕ button that removes it.
|
|
9
|
+
*
|
|
10
|
+
* The ✕ is a real `<button>` so keyboard / AT users can focus and activate
|
|
11
|
+
* it. `onPointerDown` is stopped so the click doesn't bubble to the chips
|
|
12
|
+
* trigger wrapper (which would toggle the popover open/closed); `onClick`
|
|
13
|
+
* is also stopped so the wrapper's click handler doesn't fire.
|
|
14
|
+
*
|
|
15
|
+
* Not exported from the package. The chips trigger is the only call site.
|
|
16
|
+
*/
|
|
17
|
+
export interface ChipProps {
|
|
18
|
+
label: string;
|
|
19
|
+
onRemove: () => void;
|
|
20
|
+
disabled?: boolean;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export function Chip({ label, onRemove, disabled }: ChipProps) {
|
|
24
|
+
const t = useTranslation();
|
|
25
|
+
return (
|
|
26
|
+
<span className={clsx(styles.chip, disabled && styles.chipDisabled)}>
|
|
27
|
+
<span className={styles.chipLabel}>{label}</span>
|
|
28
|
+
<button
|
|
29
|
+
type="button"
|
|
30
|
+
className={styles.chipRemove}
|
|
31
|
+
aria-label={t('select.removeChip', { label })}
|
|
32
|
+
disabled={disabled}
|
|
33
|
+
onClick={(e) => {
|
|
34
|
+
e.stopPropagation();
|
|
35
|
+
onRemove();
|
|
36
|
+
}}
|
|
37
|
+
onPointerDown={(e) => e.stopPropagation()}
|
|
38
|
+
>
|
|
39
|
+
<svg width="10" height="10" viewBox="0 0 10 10" aria-hidden="true">
|
|
40
|
+
<path d="M1 1 L9 9 M9 1 L1 9" stroke="currentColor" strokeWidth="1.5" />
|
|
41
|
+
</svg>
|
|
42
|
+
</button>
|
|
43
|
+
</span>
|
|
44
|
+
);
|
|
45
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { useTranslation } from '../../i18n/useTranslation';
|
|
2
|
+
import { emptyStateText } from './emptyStateText';
|
|
3
|
+
import styles from './Select.module.scss';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Props for the default empty-state row. `query` shapes the message
|
|
7
|
+
* ("No results for X." vs "No options.") so the user understands whether
|
|
8
|
+
* the listbox is empty because their filter matched nothing or because
|
|
9
|
+
* the source has no options at all.
|
|
10
|
+
*/
|
|
11
|
+
export interface EmptyProps {
|
|
12
|
+
/**
|
|
13
|
+
* Current search query, if any. Empty string / undefined renders the
|
|
14
|
+
* "no options at all" copy; a non-empty value renders the "no results
|
|
15
|
+
* for this query" copy.
|
|
16
|
+
*/
|
|
17
|
+
query?: string;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Default empty-state row rendered inside the listbox when there are no
|
|
22
|
+
* options to show. Consumers can override via `renderEmpty` on `<Select>`.
|
|
23
|
+
*
|
|
24
|
+
* Rendered as a non-interactive `<li role="presentation">` so it occupies
|
|
25
|
+
* a row visually but isn't reachable by keyboard or counted in the option
|
|
26
|
+
* walk. No `aria-live` of its own — the Listbox's single status region
|
|
27
|
+
* announces this state, and the visible copy is hidden from AT so a reader
|
|
28
|
+
* does not meet the sentence twice.
|
|
29
|
+
*/
|
|
30
|
+
export function Empty({ query }: EmptyProps) {
|
|
31
|
+
const t = useTranslation();
|
|
32
|
+
return (
|
|
33
|
+
<li className={styles.stateRow} role="presentation">
|
|
34
|
+
{/* aria-hidden for the same reason as the error row: the Listbox status
|
|
35
|
+
region renders this same text, and both are in the tree at once. */}
|
|
36
|
+
<span aria-hidden="true">{emptyStateText(t, query)}</span>
|
|
37
|
+
</li>
|
|
38
|
+
);
|
|
39
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { useTranslation } from '../../i18n/useTranslation';
|
|
2
|
+
import styles from './Select.module.scss';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Props for the default error-state row.
|
|
6
|
+
*
|
|
7
|
+
* `error` mirrors the consumer-facing `renderError(err, retry)` signature
|
|
8
|
+
* so a custom override can drop in without prop-name churn. It's not used
|
|
9
|
+
* in the default body, which prints a generic "Failed to load options."
|
|
10
|
+
* message — exposing the raw error message in the listbox would surface
|
|
11
|
+
* stack traces or HTTP detail strings to end users.
|
|
12
|
+
*/
|
|
13
|
+
export interface ErrorRowProps {
|
|
14
|
+
/** Original error, kept on the prop surface to match `renderError`. */
|
|
15
|
+
error: Error;
|
|
16
|
+
/** Re-fires `loadOptions` with the current query. */
|
|
17
|
+
onRetry: () => void;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Default error-state row, rendered inside the listbox when an async
|
|
22
|
+
* `loadOptions` request rejects. `role="presentation"` like its siblings —
|
|
23
|
+
* it used to carry `role="alert"`, a third mechanism for one concern (#495).
|
|
24
|
+
* The `aria-required-children` framing that used to be here is dropped: see
|
|
25
|
+
* `messages.ts` — Chromium ignores these rows inside a `role="listbox"`
|
|
26
|
+
* regardless, so the argument rests on the region-and-text mounting together,
|
|
27
|
+
* which is enough on its own. The Retry button calls back
|
|
28
|
+
* into the async hook's `retry()`, which bumps the retry token and
|
|
29
|
+
* re-enters the debounced effect, so the refetch waits `debounceMs` like any
|
|
30
|
+
* other query — the branch's own test has to advance timers after clicking it.
|
|
31
|
+
*/
|
|
32
|
+
export function ErrorRow({ error: _error, onRetry }: ErrorRowProps) {
|
|
33
|
+
// `error` stays on the prop surface so the props match `renderError(err,
|
|
34
|
+
// retry)`. The default body intentionally doesn't show the raw error.
|
|
35
|
+
void _error;
|
|
36
|
+
const t = useTranslation();
|
|
37
|
+
return (
|
|
38
|
+
<li className={styles.stateRow} role="presentation">
|
|
39
|
+
{/* aria-hidden because the Listbox status region renders this same key,
|
|
40
|
+
and both sit in the tree at once, so a reader met the sentence twice.
|
|
41
|
+
Naming the Retry button with it instead only MOVED that duplicate —
|
|
42
|
+
the region still said it and the button then said it again. The
|
|
43
|
+
region's text sits immediately before this list, so browse mode reads
|
|
44
|
+
"Failed to load options." and then "Retry, button": once each. */}
|
|
45
|
+
<span aria-hidden="true">{t('select.loadFailed')}</span>
|
|
46
|
+
<button type="button" className={styles.retryButton} onClick={onRetry}>
|
|
47
|
+
{t('select.retry')}
|
|
48
|
+
</button>
|
|
49
|
+
</li>
|
|
50
|
+
);
|
|
51
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
export interface HiddenInputsProps {
|
|
2
|
+
name?: string;
|
|
3
|
+
value: string | string[];
|
|
4
|
+
multiple: boolean;
|
|
5
|
+
required: boolean;
|
|
6
|
+
form?: string;
|
|
7
|
+
disabled: boolean;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Renders the hidden `<input>`(s) so native `FormData` picks up the Select's
|
|
12
|
+
* value. Single mode renders one input. Multi mode renders one per selected
|
|
13
|
+
* value. Hidden inputs are barred from native constraint validation, so
|
|
14
|
+
* `required` is mirrored as form metadata only; consumers validate separately.
|
|
15
|
+
*/
|
|
16
|
+
export function HiddenInputs(props: HiddenInputsProps) {
|
|
17
|
+
if (!props.name) return null;
|
|
18
|
+
const { name, value, multiple, required, form, disabled } = props;
|
|
19
|
+
|
|
20
|
+
if (!multiple) {
|
|
21
|
+
const v = typeof value === 'string' ? value : '';
|
|
22
|
+
return (
|
|
23
|
+
<input
|
|
24
|
+
type="hidden"
|
|
25
|
+
name={name}
|
|
26
|
+
value={v}
|
|
27
|
+
required={required}
|
|
28
|
+
form={form}
|
|
29
|
+
disabled={disabled}
|
|
30
|
+
/>
|
|
31
|
+
);
|
|
32
|
+
}
|
|
33
|
+
const arr = Array.isArray(value) ? value : [];
|
|
34
|
+
if (arr.length === 0 && required) {
|
|
35
|
+
return <input type="hidden" name={name} value="" required form={form} disabled={disabled} />;
|
|
36
|
+
}
|
|
37
|
+
return (
|
|
38
|
+
<>
|
|
39
|
+
{arr.map((v) => (
|
|
40
|
+
<input key={v} type="hidden" name={name} value={v} form={form} disabled={disabled} />
|
|
41
|
+
))}
|
|
42
|
+
</>
|
|
43
|
+
);
|
|
44
|
+
}
|