@eocrm/design-system 0.0.0-stage → 0.6.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AI-PRIMER.md +341 -0
- package/LICENSE +202 -0
- package/README.md +266 -2
- package/docs/components/Accordion.md +114 -0
- package/docs/components/AgentAvatar.md +58 -0
- package/docs/components/Alert.md +81 -0
- package/docs/components/AppLayout.md +70 -0
- package/docs/components/Avatar.md +49 -0
- package/docs/components/AvatarGroup.md +47 -0
- package/docs/components/Badge.md +60 -0
- package/docs/components/Banner.md +89 -0
- package/docs/components/BrandIcon.md +32 -0
- package/docs/components/Breadcrumb.md +72 -0
- package/docs/components/Button.md +107 -0
- package/docs/components/ButtonGroup.md +78 -0
- package/docs/components/Calendar.md +158 -0
- package/docs/components/Card.md +165 -0
- package/docs/components/CatalogPicker.md +83 -0
- package/docs/components/Chart.md +114 -0
- package/docs/components/ChatBubble.md +55 -0
- package/docs/components/ChatLauncher.md +97 -0
- package/docs/components/Checkbox.md +55 -0
- package/docs/components/CircularProgress.md +53 -0
- package/docs/components/Cluster.md +96 -0
- package/docs/components/Code.md +35 -0
- package/docs/components/CodeBlock.md +67 -0
- package/docs/components/ColorPicker.md +115 -0
- package/docs/components/ConfirmationPopover.md +70 -0
- package/docs/components/Constrain.md +39 -0
- package/docs/components/CurrencySelect.md +57 -0
- package/docs/components/CursorPagination.md +43 -0
- package/docs/components/DashboardCanvas.md +79 -0
- package/docs/components/DashboardWidget.md +131 -0
- package/docs/components/DataTable.md +88 -0
- package/docs/components/DatePicker.md +68 -0
- package/docs/components/DateRangePicker.md +71 -0
- package/docs/components/DateStrip.md +56 -0
- package/docs/components/DefinitionList.md +82 -0
- package/docs/components/Divider.md +57 -0
- package/docs/components/Dot.md +26 -0
- package/docs/components/Drawer.md +94 -0
- package/docs/components/DropdownMenu.md +299 -0
- package/docs/components/EmojiPicker.md +84 -0
- package/docs/components/EmptyState.md +55 -0
- package/docs/components/EntityChip.md +102 -0
- package/docs/components/ErrorState.md +72 -0
- package/docs/components/Field.md +91 -0
- package/docs/components/FileUpload.md +109 -0
- package/docs/components/FilterChip.md +88 -0
- package/docs/components/FlowCanvas.md +108 -0
- package/docs/components/FormRow.md +31 -0
- package/docs/components/FormSection.md +37 -0
- package/docs/components/Grid.md +103 -0
- package/docs/components/Highlight.md +75 -0
- package/docs/components/HighlightedText.md +50 -0
- package/docs/components/IconPicker.md +134 -0
- package/docs/components/IconTile.md +30 -0
- package/docs/components/Image.md +84 -0
- package/docs/components/ImageCrop.md +163 -0
- package/docs/components/Indent.md +31 -0
- package/docs/components/InlineDatePicker.md +58 -0
- package/docs/components/InlineDateRangePicker.md +57 -0
- package/docs/components/Input.md +54 -0
- package/docs/components/Kanban.md +122 -0
- package/docs/components/Kbd.md +41 -0
- package/docs/components/Lightbox.md +105 -0
- package/docs/components/Link.md +65 -0
- package/docs/components/LinkCard.md +41 -0
- package/docs/components/LiquidEditor.md +84 -0
- package/docs/components/List.md +68 -0
- package/docs/components/LiveRegion.md +29 -0
- package/docs/components/LocaleProvider.md +25 -0
- package/docs/components/Logo.md +41 -0
- package/docs/components/Masonry.md +48 -0
- package/docs/components/MediaTile.md +95 -0
- package/docs/components/Modal.md +107 -0
- package/docs/components/MoneyInput.md +62 -0
- package/docs/components/OptionsPicker.md +123 -0
- package/docs/components/OtpInput.md +65 -0
- package/docs/components/Page.md +35 -0
- package/docs/components/PageHeader.md +133 -0
- package/docs/components/Pagination.md +44 -0
- package/docs/components/Palette.md +32 -0
- package/docs/components/PasswordInput.md +45 -0
- package/docs/components/PasswordStrengthMeter.md +27 -0
- package/docs/components/PersonDisplay.md +153 -0
- package/docs/components/PhoneInput.md +54 -0
- package/docs/components/PillMenu.md +91 -0
- package/docs/components/Popover.md +127 -0
- package/docs/components/Progress.md +56 -0
- package/docs/components/QrCode.md +34 -0
- package/docs/components/Radio.md +37 -0
- package/docs/components/RadioGroup.md +56 -0
- package/docs/components/Rail.md +191 -0
- package/docs/components/RelativeDateInput.md +114 -0
- package/docs/components/RichText.md +44 -0
- package/docs/components/RichTextEditor.md +112 -0
- package/docs/components/Screen.md +37 -0
- package/docs/components/ScrollArea.md +39 -0
- package/docs/components/Select.md +131 -0
- package/docs/components/SettingRow.md +98 -0
- package/docs/components/Skeleton.md +68 -0
- package/docs/components/Slider.md +92 -0
- package/docs/components/SlotGrid.md +55 -0
- package/docs/components/SocialButton.md +31 -0
- package/docs/components/Sortable.md +127 -0
- package/docs/components/SortableGroup.md +52 -0
- package/docs/components/Sparkline.md +51 -0
- package/docs/components/Split.md +76 -0
- package/docs/components/Stack.md +59 -0
- package/docs/components/StagePath.md +66 -0
- package/docs/components/StatGroup.md +61 -0
- package/docs/components/StatTile.md +58 -0
- package/docs/components/Sticky.md +69 -0
- package/docs/components/Switch.md +89 -0
- package/docs/components/Table.md +184 -0
- package/docs/components/TableOfContents.md +76 -0
- package/docs/components/Tabs.md +94 -0
- package/docs/components/Text.md +63 -0
- package/docs/components/Textarea.md +59 -0
- package/docs/components/Thread.md +52 -0
- package/docs/components/TimeField.md +70 -0
- package/docs/components/Timeline.md +57 -0
- package/docs/components/Title.md +54 -0
- package/docs/components/ToastViewport.md +61 -0
- package/docs/components/Tooltip.md +63 -0
- package/docs/components/TopBar.md +214 -0
- package/docs/components/Tour.md +85 -0
- package/docs/components/TreeView.md +113 -0
- package/docs/components/VisuallyHidden.md +43 -0
- package/docs/components/WidgetPreview.md +54 -0
- package/docs/components/useBelowBreakpoint.md +11 -0
- package/docs/components/useMonth.md +18 -0
- package/docs/setup.md +51 -0
- package/docs/theming.md +95 -0
- package/docs/tokens.md +123 -0
- package/docs/transient-state.md +56 -0
- package/package.json +86 -4
- package/src/_meta/manifest.ts +293 -0
- package/src/app/AppProvider.tsx +78 -0
- package/src/app/index.ts +3 -0
- package/src/app/themeTokens.ts +95 -0
- package/src/calendar/dateMath.ts +114 -0
- package/src/calendar/formatters.ts +75 -0
- package/src/calendar/index.ts +39 -0
- package/src/calendar/types.ts +36 -0
- package/src/calendar/useAgenda.ts +70 -0
- package/src/calendar/useDay.ts +51 -0
- package/src/calendar/useMonth.ts +82 -0
- package/src/calendar/useWeek.ts +62 -0
- package/src/calendar/weekInfo.ts +83 -0
- package/src/components/Accordion/Accordion.module.scss +304 -0
- package/src/components/Accordion/Accordion.tokens.scss +64 -0
- package/src/components/Accordion/Accordion.tsx +272 -0
- package/src/components/Accordion/AccordionContent.tsx +36 -0
- package/src/components/Accordion/AccordionItem.tsx +66 -0
- package/src/components/Accordion/AccordionTrigger.tsx +121 -0
- package/src/components/Accordion/context.ts +47 -0
- package/src/components/Accordion/index.ts +14 -0
- package/src/components/Alert/Alert.module.scss +92 -0
- package/src/components/Alert/Alert.tokens.scss +60 -0
- package/src/components/Alert/Alert.tsx +136 -0
- package/src/components/Alert/index.ts +2 -0
- package/src/components/AppLayout/AppLayout.module.scss +130 -0
- package/src/components/AppLayout/AppLayout.tokens.scss +27 -0
- package/src/components/AppLayout/AppLayout.tsx +211 -0
- package/src/components/AppLayout/index.ts +2 -0
- package/src/components/Avatar/AgentAvatar.module.scss +117 -0
- package/src/components/Avatar/AgentAvatar.tsx +122 -0
- package/src/components/Avatar/Avatar.module.scss +181 -0
- package/src/components/Avatar/Avatar.tokens.scss +107 -0
- package/src/components/Avatar/Avatar.tsx +210 -0
- package/src/components/Avatar/AvatarGroup.module.scss +128 -0
- package/src/components/Avatar/AvatarGroup.tsx +119 -0
- package/src/components/Avatar/AvatarGroupContext.tsx +20 -0
- package/src/components/Avatar/index.ts +6 -0
- package/src/components/Badge/Badge.module.scss +124 -0
- package/src/components/Badge/Badge.tokens.scss +74 -0
- package/src/components/Badge/Badge.tsx +164 -0
- package/src/components/Badge/index.ts +2 -0
- package/src/components/Banner/Banner.module.scss +73 -0
- package/src/components/Banner/Banner.tokens.scss +51 -0
- package/src/components/Banner/Banner.tsx +138 -0
- package/src/components/Banner/index.ts +2 -0
- package/src/components/BrandIcon/BrandIcon.module.scss +5 -0
- package/src/components/BrandIcon/BrandIcon.tsx +99 -0
- package/src/components/BrandIcon/index.ts +2 -0
- package/src/components/Breadcrumb/Breadcrumb.module.scss +32 -0
- package/src/components/Breadcrumb/Breadcrumb.tokens.scss +9 -0
- package/src/components/Breadcrumb/Breadcrumb.tsx +146 -0
- package/src/components/Breadcrumb/index.ts +2 -0
- package/src/components/Button/Button.module.scss +167 -0
- package/src/components/Button/Button.tokens.scss +90 -0
- package/src/components/Button/Button.tsx +205 -0
- package/src/components/Button/index.ts +2 -0
- package/src/components/ButtonGroup/ButtonGroup.module.scss +134 -0
- package/src/components/ButtonGroup/ButtonGroup.tokens.scss +42 -0
- package/src/components/ButtonGroup/ButtonGroup.tsx +278 -0
- package/src/components/ButtonGroup/ButtonGroupItem.tsx +74 -0
- package/src/components/ButtonGroup/context.ts +45 -0
- package/src/components/ButtonGroup/index.ts +2 -0
- package/src/components/Calendar/AgendaView.module.scss +231 -0
- package/src/components/Calendar/AgendaView.tsx +214 -0
- package/src/components/Calendar/AllDayBand.module.scss +18 -0
- package/src/components/Calendar/AllDayBand.tsx +75 -0
- package/src/components/Calendar/Calendar.module.scss +23 -0
- package/src/components/Calendar/Calendar.tokens.scss +262 -0
- package/src/components/Calendar/Calendar.tsx +370 -0
- package/src/components/Calendar/DayCell.module.scss +30 -0
- package/src/components/Calendar/DayCell.tsx +50 -0
- package/src/components/Calendar/DayView.module.scss +10 -0
- package/src/components/Calendar/DayView.tsx +163 -0
- package/src/components/Calendar/EventChip.module.scss +171 -0
- package/src/components/Calendar/EventChip.tsx +115 -0
- package/src/components/Calendar/HourGrid.module.scss +123 -0
- package/src/components/Calendar/HourGrid.tsx +381 -0
- package/src/components/Calendar/MonthView.module.scss +99 -0
- package/src/components/Calendar/MonthView.tsx +296 -0
- package/src/components/Calendar/TimedEvent.module.scss +205 -0
- package/src/components/Calendar/TimedEvent.tsx +247 -0
- package/src/components/Calendar/ViewSwitcher.module.scss +3 -0
- package/src/components/Calendar/ViewSwitcher.tsx +47 -0
- package/src/components/Calendar/WeekView.module.scss +10 -0
- package/src/components/Calendar/WeekView.tsx +137 -0
- package/src/components/Calendar/eventColor.ts +60 -0
- package/src/components/Calendar/index.ts +18 -0
- package/src/components/Calendar/types.ts +451 -0
- package/src/components/Calendar/useEventDrag.ts +783 -0
- package/src/components/Calendar/utils.ts +622 -0
- package/src/components/Card/Card.module.scss +264 -0
- package/src/components/Card/Card.tokens.scss +55 -0
- package/src/components/Card/Card.tsx +170 -0
- package/src/components/Card/CardBody.tsx +45 -0
- package/src/components/Card/CardHeader.tsx +113 -0
- package/src/components/Card/CardList.tsx +24 -0
- package/src/components/Card/CardListRow.tsx +24 -0
- package/src/components/Card/index.ts +7 -0
- package/src/components/CatalogPicker/CatalogPicker.module.scss +193 -0
- package/src/components/CatalogPicker/CatalogPicker.tokens.scss +26 -0
- package/src/components/CatalogPicker/CatalogPicker.tsx +339 -0
- package/src/components/CatalogPicker/index.ts +2 -0
- package/src/components/Chart/Chart.module.scss +287 -0
- package/src/components/Chart/Chart.tokens.scss +63 -0
- package/src/components/Chart/Chart.tsx +607 -0
- package/src/components/Chart/ChartLegend.tsx +99 -0
- package/src/components/Chart/ChartTable.tsx +62 -0
- package/src/components/Chart/ChartTooltip.tsx +91 -0
- package/src/components/Chart/chartModel.ts +689 -0
- package/src/components/Chart/index.ts +2 -0
- package/src/components/ChatBubble/ChatBubble.module.scss +93 -0
- package/src/components/ChatBubble/ChatBubble.tokens.scss +17 -0
- package/src/components/ChatBubble/ChatBubble.tsx +61 -0
- package/src/components/ChatBubble/ChatBubbleList.tsx +27 -0
- package/src/components/ChatBubble/index.ts +3 -0
- package/src/components/ChatLauncher/ChatLauncher.module.scss +68 -0
- package/src/components/ChatLauncher/ChatLauncher.tokens.scss +27 -0
- package/src/components/ChatLauncher/ChatLauncher.tsx +202 -0
- package/src/components/ChatLauncher/index.ts +2 -0
- package/src/components/ChatLauncher/isAtBottom.ts +12 -0
- package/src/components/Checkbox/Checkbox.module.scss +147 -0
- package/src/components/Checkbox/Checkbox.tokens.scss +44 -0
- package/src/components/Checkbox/Checkbox.tsx +188 -0
- package/src/components/Checkbox/index.ts +2 -0
- package/src/components/CircularProgress/CircularProgress.module.scss +133 -0
- package/src/components/CircularProgress/CircularProgress.tokens.scss +40 -0
- package/src/components/CircularProgress/CircularProgress.tsx +139 -0
- package/src/components/CircularProgress/index.ts +7 -0
- package/src/components/Cluster/Cluster.module.scss +145 -0
- package/src/components/Cluster/Cluster.tokens.scss +11 -0
- package/src/components/Cluster/Cluster.tsx +215 -0
- package/src/components/Cluster/index.ts +2 -0
- package/src/components/Code/Code.module.scss +28 -0
- package/src/components/Code/Code.tokens.scss +15 -0
- package/src/components/Code/Code.tsx +44 -0
- package/src/components/Code/index.ts +2 -0
- package/src/components/CodeBlock/CodeBlock.module.scss +146 -0
- package/src/components/CodeBlock/CodeBlock.tokens.scss +27 -0
- package/src/components/CodeBlock/CodeBlock.tsx +274 -0
- package/src/components/CodeBlock/highlight.ts +179 -0
- package/src/components/CodeBlock/index.ts +8 -0
- package/src/components/CodeBlock/sampleSync.ts +42 -0
- package/src/components/ColorPicker/ColorPicker.module.scss +286 -0
- package/src/components/ColorPicker/ColorPicker.tokens.scss +60 -0
- package/src/components/ColorPicker/ColorPicker.tsx +367 -0
- package/src/components/ColorPicker/ColorPickerPanel.tsx +265 -0
- package/src/components/ColorPicker/SVSquare.tsx +189 -0
- package/src/components/ColorPicker/colorMath.ts +141 -0
- package/src/components/ColorPicker/index.ts +6 -0
- package/src/components/ConfirmationPopover/ConfirmationPopover.module.scss +39 -0
- package/src/components/ConfirmationPopover/ConfirmationPopover.tokens.scss +13 -0
- package/src/components/ConfirmationPopover/ConfirmationPopover.tsx +395 -0
- package/src/components/ConfirmationPopover/index.ts +2 -0
- package/src/components/Constrain/Constrain.module.scss +99 -0
- package/src/components/Constrain/Constrain.tsx +79 -0
- package/src/components/Constrain/index.ts +2 -0
- package/src/components/CurrencySelect/CurrencySelect.module.scss +7 -0
- package/src/components/CurrencySelect/CurrencySelect.tsx +167 -0
- package/src/components/CurrencySelect/index.ts +3 -0
- package/src/components/CursorPagination/CursorPagination.module.scss +69 -0
- package/src/components/CursorPagination/CursorPagination.tokens.scss +32 -0
- package/src/components/CursorPagination/CursorPagination.tsx +121 -0
- package/src/components/CursorPagination/index.ts +2 -0
- package/src/components/DashboardCanvas/DashboardCanvas.module.scss +360 -0
- package/src/components/DashboardCanvas/DashboardCanvas.tokens.scss +48 -0
- package/src/components/DashboardCanvas/DashboardCanvas.tsx +1270 -0
- package/src/components/DashboardCanvas/DashboardCanvasItem.tsx +140 -0
- package/src/components/DashboardCanvas/DashboardCanvasSection.tsx +174 -0
- package/src/components/DashboardCanvas/engine.ts +363 -0
- package/src/components/DashboardCanvas/index.ts +9 -0
- package/src/components/DashboardWidget/DashboardWidget.module.scss +100 -0
- package/src/components/DashboardWidget/DashboardWidget.tokens.scss +16 -0
- package/src/components/DashboardWidget/DashboardWidget.tsx +188 -0
- package/src/components/DashboardWidget/index.ts +7 -0
- package/src/components/DataTable/BodyRow.tsx +197 -0
- package/src/components/DataTable/ColumnVisibilityTrigger.module.scss +7 -0
- package/src/components/DataTable/ColumnVisibilityTrigger.tsx +105 -0
- package/src/components/DataTable/DataTable.module.scss +511 -0
- package/src/components/DataTable/DataTable.tokens.scss +80 -0
- package/src/components/DataTable/DataTable.tsx +734 -0
- package/src/components/DataTable/HeaderCell.module.scss +215 -0
- package/src/components/DataTable/HeaderCell.tsx +440 -0
- package/src/components/DataTable/columnShift.ts +117 -0
- package/src/components/DataTable/index.ts +23 -0
- package/src/components/DataTable/pinStyle.ts +47 -0
- package/src/components/DataTable/reorderColumns.ts +66 -0
- package/src/components/DataTable/types.ts +289 -0
- package/src/components/DataTable/useColumnDragShift.ts +216 -0
- package/src/components/DataTable/useDataTable.ts +372 -0
- package/src/components/DataTable/useResizeHandle.ts +97 -0
- package/src/components/DatePicker/DatePicker.module.scss +180 -0
- package/src/components/DatePicker/DatePicker.tokens.scss +152 -0
- package/src/components/DatePicker/DatePicker.tsx +664 -0
- package/src/components/DatePicker/DatePickerGrid.module.scss +172 -0
- package/src/components/DatePicker/DatePickerGrid.tsx +341 -0
- package/src/components/DatePicker/InlineDatePicker.module.scss +32 -0
- package/src/components/DatePicker/InlineDatePicker.tsx +201 -0
- package/src/components/DatePicker/index.ts +4 -0
- package/src/components/DatePicker/utils.ts +364 -0
- package/src/components/DateRangePicker/DateRangePicker.module.scss +237 -0
- package/src/components/DateRangePicker/DateRangePicker.tokens.scss +78 -0
- package/src/components/DateRangePicker/DateRangePicker.tsx +720 -0
- package/src/components/DateRangePicker/InlineDateRangePicker.module.scss +94 -0
- package/src/components/DateRangePicker/InlineDateRangePicker.tsx +376 -0
- package/src/components/DateRangePicker/index.ts +5 -0
- package/src/components/DateRangePicker/utils.ts +151 -0
- package/src/components/DateStrip/DateStrip.module.scss +78 -0
- package/src/components/DateStrip/DateStrip.tokens.scss +23 -0
- package/src/components/DateStrip/DateStrip.tsx +205 -0
- package/src/components/DateStrip/index.ts +2 -0
- package/src/components/DefinitionList/DefinitionList.module.scss +102 -0
- package/src/components/DefinitionList/DefinitionList.tokens.scss +29 -0
- package/src/components/DefinitionList/DefinitionList.tsx +198 -0
- package/src/components/DefinitionList/index.ts +9 -0
- package/src/components/Divider/Divider.module.scss +144 -0
- package/src/components/Divider/Divider.tokens.scss +21 -0
- package/src/components/Divider/Divider.tsx +103 -0
- package/src/components/Divider/index.ts +2 -0
- package/src/components/Dot/Dot.module.scss +40 -0
- package/src/components/Dot/Dot.tokens.scss +4 -0
- package/src/components/Dot/Dot.tsx +45 -0
- package/src/components/Dot/index.ts +2 -0
- package/src/components/Drawer/Body.tsx +23 -0
- package/src/components/Drawer/Close.tsx +35 -0
- package/src/components/Drawer/Content.tsx +93 -0
- package/src/components/Drawer/Drawer.module.scss +232 -0
- package/src/components/Drawer/Drawer.tokens.scss +38 -0
- package/src/components/Drawer/Drawer.tsx +23 -0
- package/src/components/Drawer/DrawerRoot.tsx +190 -0
- package/src/components/Drawer/Footer.tsx +24 -0
- package/src/components/Drawer/Header.tsx +64 -0
- package/src/components/Drawer/Overlay.tsx +82 -0
- package/src/components/Drawer/context.ts +44 -0
- package/src/components/Drawer/index.ts +12 -0
- package/src/components/Drawer/useDragToClose.ts +149 -0
- package/src/components/DropdownMenu/CheckboxItem.tsx +144 -0
- package/src/components/DropdownMenu/Content.tsx +419 -0
- package/src/components/DropdownMenu/DropdownMenu.module.scss +280 -0
- package/src/components/DropdownMenu/DropdownMenu.tokens.scss +88 -0
- package/src/components/DropdownMenu/DropdownMenu.tsx +43 -0
- package/src/components/DropdownMenu/Group.tsx +76 -0
- package/src/components/DropdownMenu/Item.tsx +148 -0
- package/src/components/DropdownMenu/ItemIndicator.tsx +30 -0
- package/src/components/DropdownMenu/Radio.tsx +178 -0
- package/src/components/DropdownMenu/Root.tsx +100 -0
- package/src/components/DropdownMenu/Sub.tsx +332 -0
- package/src/components/DropdownMenu/Trigger.tsx +76 -0
- package/src/components/DropdownMenu/context.ts +65 -0
- package/src/components/DropdownMenu/index.ts +20 -0
- package/src/components/EmojiPicker/EmojiPicker.module.scss +84 -0
- package/src/components/EmojiPicker/EmojiPicker.tokens.scss +24 -0
- package/src/components/EmojiPicker/EmojiPicker.tsx +341 -0
- package/src/components/EmojiPicker/emojiData.ts +245 -0
- package/src/components/EmojiPicker/index.ts +3 -0
- package/src/components/EmptyState/EmptyState.module.scss +102 -0
- package/src/components/EmptyState/EmptyState.tokens.scss +28 -0
- package/src/components/EmptyState/EmptyState.tsx +112 -0
- package/src/components/EmptyState/index.ts +7 -0
- package/src/components/EntityChip/EntityChip.module.scss +275 -0
- package/src/components/EntityChip/EntityChip.tokens.scss +66 -0
- package/src/components/EntityChip/EntityChip.tsx +649 -0
- package/src/components/EntityChip/index.ts +10 -0
- package/src/components/ErrorState/ErrorState.module.scss +105 -0
- package/src/components/ErrorState/ErrorState.tokens.scss +32 -0
- package/src/components/ErrorState/ErrorState.tsx +125 -0
- package/src/components/ErrorState/index.ts +8 -0
- package/src/components/Field/Field.module.scss +46 -0
- package/src/components/Field/Field.tsx +185 -0
- package/src/components/Field/index.ts +2 -0
- package/src/components/FileUpload/FileUpload.module.scss +187 -0
- package/src/components/FileUpload/FileUpload.tokens.scss +81 -0
- package/src/components/FileUpload/FileUpload.tsx +569 -0
- package/src/components/FileUpload/formatBytes.ts +34 -0
- package/src/components/FileUpload/iconForFile.ts +40 -0
- package/src/components/FileUpload/index.ts +2 -0
- package/src/components/FilterChip/FilterChip.module.scss +61 -0
- package/src/components/FilterChip/FilterChip.tokens.scss +25 -0
- package/src/components/FilterChip/FilterChip.tsx +208 -0
- package/src/components/FilterChip/index.ts +5 -0
- package/src/components/FlowCanvas/FlowCanvas.module.scss +329 -0
- package/src/components/FlowCanvas/FlowCanvas.tokens.scss +45 -0
- package/src/components/FlowCanvas/FlowCanvas.tsx +1867 -0
- package/src/components/FlowCanvas/FlowControls.tsx +46 -0
- package/src/components/FlowCanvas/FlowEdge.tsx +58 -0
- package/src/components/FlowCanvas/FlowNode.tsx +76 -0
- package/src/components/FlowCanvas/edgePath.ts +85 -0
- package/src/components/FlowCanvas/index.ts +4 -0
- package/src/components/FlowCanvas/layout.ts +148 -0
- package/src/components/FlowCanvas/spatialNav.ts +76 -0
- package/src/components/FlowCanvas/types.ts +59 -0
- package/src/components/FlowCanvas/useViewport.ts +122 -0
- package/src/components/FormRow/FormRow.module.scss +2 -0
- package/src/components/FormRow/FormRow.tsx +37 -0
- package/src/components/FormRow/index.ts +2 -0
- package/src/components/FormSection/FormSection.module.scss +24 -0
- package/src/components/FormSection/FormSection.tsx +46 -0
- package/src/components/FormSection/index.ts +2 -0
- package/src/components/Grid/Grid.module.scss +162 -0
- package/src/components/Grid/Grid.tokens.scss +13 -0
- package/src/components/Grid/Grid.tsx +226 -0
- package/src/components/Grid/GridItem.tsx +77 -0
- package/src/components/Grid/index.ts +11 -0
- package/src/components/Highlight/Highlight.module.scss +43 -0
- package/src/components/Highlight/Highlight.tokens.scss +35 -0
- package/src/components/Highlight/Highlight.tsx +164 -0
- package/src/components/Highlight/HighlightOverlay.tsx +100 -0
- package/src/components/Highlight/index.ts +2 -0
- package/src/components/HighlightedText/HighlightedText.module.scss +11 -0
- package/src/components/HighlightedText/HighlightedText.tokens.scss +9 -0
- package/src/components/HighlightedText/HighlightedText.tsx +50 -0
- package/src/components/HighlightedText/highlightRanges.ts +44 -0
- package/src/components/HighlightedText/index.ts +2 -0
- package/src/components/IconPicker/IconPicker.module.scss +175 -0
- package/src/components/IconPicker/IconPicker.tokens.scss +40 -0
- package/src/components/IconPicker/IconPicker.tsx +629 -0
- package/src/components/IconPicker/index.ts +9 -0
- package/src/components/IconTile/IconTile.module.scss +57 -0
- package/src/components/IconTile/IconTile.tokens.scss +16 -0
- package/src/components/IconTile/IconTile.tsx +91 -0
- package/src/components/IconTile/index.ts +2 -0
- package/src/components/Image/Image.module.scss +266 -0
- package/src/components/Image/Image.tokens.scss +55 -0
- package/src/components/Image/Image.tsx +342 -0
- package/src/components/Image/index.ts +2 -0
- package/src/components/ImageCrop/ImageCrop.module.scss +274 -0
- package/src/components/ImageCrop/ImageCrop.tokens.scss +33 -0
- package/src/components/ImageCrop/ImageCrop.tsx +542 -0
- package/src/components/ImageCrop/cropGeometry.ts +120 -0
- package/src/components/ImageCrop/extractCropBlob.ts +140 -0
- package/src/components/ImageCrop/index.ts +11 -0
- package/src/components/ImageCrop/useCropPreview.ts +161 -0
- package/src/components/Indent/Indent.module.scss +33 -0
- package/src/components/Indent/Indent.tokens.scss +10 -0
- package/src/components/Indent/Indent.tsx +46 -0
- package/src/components/Indent/index.ts +2 -0
- package/src/components/Input/Input.module.scss +99 -0
- package/src/components/Input/Input.tokens.scss +54 -0
- package/src/components/Input/Input.tsx +105 -0
- package/src/components/Input/Suggestions.tsx +260 -0
- package/src/components/Input/index.ts +2 -0
- package/src/components/Kanban/Kanban.module.scss +39 -0
- package/src/components/Kanban/Kanban.tokens.scss +15 -0
- package/src/components/Kanban/Kanban.tsx +951 -0
- package/src/components/Kanban/index.ts +7 -0
- package/src/components/Kbd/Kbd.module.scss +47 -0
- package/src/components/Kbd/Kbd.tokens.scss +26 -0
- package/src/components/Kbd/Kbd.tsx +73 -0
- package/src/components/Kbd/index.ts +2 -0
- package/src/components/Lightbox/Lightbox.module.scss +283 -0
- package/src/components/Lightbox/Lightbox.tokens.scss +36 -0
- package/src/components/Lightbox/Lightbox.tsx +506 -0
- package/src/components/Lightbox/index.ts +2 -0
- package/src/components/Link/Link.module.scss +78 -0
- package/src/components/Link/Link.tokens.scss +28 -0
- package/src/components/Link/Link.tsx +114 -0
- package/src/components/Link/index.ts +2 -0
- package/src/components/LinkCard/LinkCard.module.scss +92 -0
- package/src/components/LinkCard/LinkCard.tokens.scss +9 -0
- package/src/components/LinkCard/LinkCard.tsx +72 -0
- package/src/components/LinkCard/index.ts +2 -0
- package/src/components/LiquidEditor/AutocompleteMenu.tsx +133 -0
- package/src/components/LiquidEditor/HighlightLayer.tsx +53 -0
- package/src/components/LiquidEditor/InsertVariableMenu.tsx +81 -0
- package/src/components/LiquidEditor/LiquidEditor.module.scss +339 -0
- package/src/components/LiquidEditor/LiquidEditor.tokens.scss +81 -0
- package/src/components/LiquidEditor/LiquidEditor.tsx +412 -0
- package/src/components/LiquidEditor/PreviewPane.tsx +29 -0
- package/src/components/LiquidEditor/caretCoordinates.ts +97 -0
- package/src/components/LiquidEditor/index.ts +7 -0
- package/src/components/LiquidEditor/liquidFilters.ts +23 -0
- package/src/components/LiquidEditor/liquidTokenizer.ts +235 -0
- package/src/components/LiquidEditor/types.ts +101 -0
- package/src/components/LiquidEditor/useLiquidAutocomplete.ts +178 -0
- package/src/components/List/List.module.scss +105 -0
- package/src/components/List/List.tokens.scss +42 -0
- package/src/components/List/List.tsx +124 -0
- package/src/components/List/index.ts +9 -0
- package/src/components/LiveRegion/LiveRegion.module.scss +3 -0
- package/src/components/LiveRegion/LiveRegion.tsx +116 -0
- package/src/components/LiveRegion/index.ts +2 -0
- package/src/components/Logo/Logo.module.scss +139 -0
- package/src/components/Logo/Logo.tokens.scss +14 -0
- package/src/components/Logo/Logo.tsx +126 -0
- package/src/components/Logo/index.ts +2 -0
- package/src/components/Masonry/Masonry.module.scss +42 -0
- package/src/components/Masonry/Masonry.tokens.scss +8 -0
- package/src/components/Masonry/Masonry.tsx +136 -0
- package/src/components/Masonry/index.ts +2 -0
- package/src/components/Masonry/masonryUtils.ts +42 -0
- package/src/components/MediaTile/MediaTile.module.scss +183 -0
- package/src/components/MediaTile/MediaTile.tokens.scss +60 -0
- package/src/components/MediaTile/MediaTile.tsx +208 -0
- package/src/components/MediaTile/index.ts +8 -0
- package/src/components/Modal/Body.tsx +27 -0
- package/src/components/Modal/Close.tsx +45 -0
- package/src/components/Modal/Content.tsx +98 -0
- package/src/components/Modal/Footer.tsx +28 -0
- package/src/components/Modal/Header.tsx +51 -0
- package/src/components/Modal/Modal.module.scss +262 -0
- package/src/components/Modal/Modal.tokens.scss +50 -0
- package/src/components/Modal/Modal.tsx +23 -0
- package/src/components/Modal/ModalRoot.tsx +299 -0
- package/src/components/Modal/Overlay.tsx +101 -0
- package/src/components/Modal/context.ts +60 -0
- package/src/components/Modal/index.ts +11 -0
- package/src/components/MoneyInput/MoneyInput.module.scss +57 -0
- package/src/components/MoneyInput/MoneyInput.tsx +433 -0
- package/src/components/MoneyInput/index.ts +2 -0
- package/src/components/OptionsPicker/OptionsPicker.module.scss +216 -0
- package/src/components/OptionsPicker/OptionsPicker.tokens.scss +68 -0
- package/src/components/OptionsPicker/OptionsPicker.tsx +936 -0
- package/src/components/OptionsPicker/index.ts +9 -0
- package/src/components/OtpInput/OtpInput.module.scss +69 -0
- package/src/components/OtpInput/OtpInput.tokens.scss +45 -0
- package/src/components/OtpInput/OtpInput.tsx +368 -0
- package/src/components/OtpInput/index.ts +2 -0
- package/src/components/Page/Page.module.scss +30 -0
- package/src/components/Page/Page.tokens.scss +11 -0
- package/src/components/Page/Page.tsx +53 -0
- package/src/components/Page/index.ts +2 -0
- package/src/components/PageHeader/PageHeader.module.scss +197 -0
- package/src/components/PageHeader/PageHeader.tokens.scss +41 -0
- package/src/components/PageHeader/PageHeader.tsx +310 -0
- package/src/components/PageHeader/index.ts +20 -0
- package/src/components/Pagination/Pagination.module.scss +117 -0
- package/src/components/Pagination/Pagination.tokens.scss +54 -0
- package/src/components/Pagination/Pagination.tsx +165 -0
- package/src/components/Pagination/index.ts +4 -0
- package/src/components/Pagination/paginationRange.ts +72 -0
- package/src/components/PasswordInput/PasswordInput.module.scss +120 -0
- package/src/components/PasswordInput/PasswordInput.tokens.scss +44 -0
- package/src/components/PasswordInput/PasswordInput.tsx +210 -0
- package/src/components/PasswordInput/index.ts +2 -0
- package/src/components/PasswordStrengthMeter/PasswordStrengthMeter.module.scss +80 -0
- package/src/components/PasswordStrengthMeter/PasswordStrengthMeter.tokens.scss +40 -0
- package/src/components/PasswordStrengthMeter/PasswordStrengthMeter.tsx +96 -0
- package/src/components/PasswordStrengthMeter/index.ts +2 -0
- package/src/components/PersonDisplay/PersonDisplay.module.scss +180 -0
- package/src/components/PersonDisplay/PersonDisplay.tokens.scss +35 -0
- package/src/components/PersonDisplay/PersonDisplay.tsx +420 -0
- package/src/components/PersonDisplay/index.ts +10 -0
- package/src/components/PhoneInput/PhoneInput.module.scss +23 -0
- package/src/components/PhoneInput/PhoneInput.tsx +271 -0
- package/src/components/PhoneInput/index.ts +4 -0
- package/src/components/PhoneInput/phone.ts +128 -0
- package/src/components/PillMenu/PillMenu.module.scss +117 -0
- package/src/components/PillMenu/PillMenu.tokens.scss +22 -0
- package/src/components/PillMenu/PillMenu.tsx +324 -0
- package/src/components/PillMenu/index.ts +2 -0
- package/src/components/Popover/Anchor.tsx +37 -0
- package/src/components/Popover/Close.tsx +45 -0
- package/src/components/Popover/Content.tsx +213 -0
- package/src/components/Popover/Heading.tsx +33 -0
- package/src/components/Popover/Popover.module.scss +177 -0
- package/src/components/Popover/Popover.tokens.scss +22 -0
- package/src/components/Popover/Popover.tsx +23 -0
- package/src/components/Popover/PopoverRoot.tsx +75 -0
- package/src/components/Popover/Trigger.tsx +86 -0
- package/src/components/Popover/context.ts +22 -0
- package/src/components/Popover/index.ts +7 -0
- package/src/components/Progress/Progress.module.scss +110 -0
- package/src/components/Progress/Progress.tokens.scss +44 -0
- package/src/components/Progress/Progress.tsx +129 -0
- package/src/components/Progress/index.ts +2 -0
- package/src/components/QrCode/QrCode.module.scss +97 -0
- package/src/components/QrCode/QrCode.tokens.scss +17 -0
- package/src/components/QrCode/QrCode.tsx +233 -0
- package/src/components/QrCode/index.ts +2 -0
- package/src/components/QrCode/qr.ts +161 -0
- package/src/components/Radio/Radio.module.scss +175 -0
- package/src/components/Radio/Radio.tokens.scss +59 -0
- package/src/components/Radio/Radio.tsx +127 -0
- package/src/components/Radio/RadioGroup.module.scss +42 -0
- package/src/components/Radio/RadioGroup.tsx +120 -0
- package/src/components/Radio/RadioGroupContext.tsx +30 -0
- package/src/components/Radio/index.ts +4 -0
- package/src/components/Rail/Rail.module.scss +510 -0
- package/src/components/Rail/Rail.tokens.scss +92 -0
- package/src/components/Rail/Rail.tsx +287 -0
- package/src/components/Rail/RailCollapseToggle.tsx +57 -0
- package/src/components/Rail/RailFooter.tsx +17 -0
- package/src/components/Rail/RailGroup.tsx +728 -0
- package/src/components/Rail/RailGroupContext.ts +9 -0
- package/src/components/Rail/RailHeader.tsx +23 -0
- package/src/components/Rail/RailItem.tsx +119 -0
- package/src/components/Rail/RailSection.tsx +39 -0
- package/src/components/Rail/RailSpacer.tsx +19 -0
- package/src/components/Rail/index.ts +9 -0
- package/src/components/RelativeDateInput/RelativeDateInput.module.scss +15 -0
- package/src/components/RelativeDateInput/RelativeDateInput.tokens.scss +6 -0
- package/src/components/RelativeDateInput/RelativeDateInput.tsx +474 -0
- package/src/components/RelativeDateInput/index.ts +10 -0
- package/src/components/RelativeDateInput/relativeDate.ts +127 -0
- package/src/components/RichText/RichText.module.scss +5 -0
- package/src/components/RichText/RichText.tsx +70 -0
- package/src/components/RichText/RichTextAttachment.module.scss +82 -0
- package/src/components/RichText/RichTextAttachment.tsx +122 -0
- package/src/components/RichText/_prose.scss +79 -0
- package/src/components/RichText/attachmentIcon.tsx +24 -0
- package/src/components/RichText/engine/attachment.ts +154 -0
- package/src/components/RichText/engine/autolink.ts +64 -0
- package/src/components/RichText/engine/blockUnit.ts +174 -0
- package/src/components/RichText/engine/colorMarks.ts +85 -0
- package/src/components/RichText/engine/escape.ts +11 -0
- package/src/components/RichText/engine/fromHtml.ts +353 -0
- package/src/components/RichText/engine/fromMarkdown.ts +20 -0
- package/src/components/RichText/engine/inlines.ts +82 -0
- package/src/components/RichText/engine/listDepths.ts +32 -0
- package/src/components/RichText/engine/marks.ts +80 -0
- package/src/components/RichText/engine/mdToHtml.ts +178 -0
- package/src/components/RichText/engine/model.ts +157 -0
- package/src/components/RichText/engine/position.ts +118 -0
- package/src/components/RichText/engine/renderDoc.tsx +395 -0
- package/src/components/RichText/engine/renderLink.ts +15 -0
- package/src/components/RichText/engine/renderMention.ts +16 -0
- package/src/components/RichText/engine/safeHref.ts +22 -0
- package/src/components/RichText/engine/toHtml.ts +154 -0
- package/src/components/RichText/engine/toMarkdown.ts +97 -0
- package/src/components/RichText/engine/transforms.ts +434 -0
- package/src/components/RichText/imageMaxHeightStyle.ts +10 -0
- package/src/components/RichText/index.ts +31 -0
- package/src/components/RichTextEditor/RichTextAttachmentConfig.tsx +264 -0
- package/src/components/RichTextEditor/RichTextBlockControls.tsx +365 -0
- package/src/components/RichTextEditor/RichTextBlockMenu.tsx +162 -0
- package/src/components/RichTextEditor/RichTextColorMenu.tsx +115 -0
- package/src/components/RichTextEditor/RichTextEditor.module.scss +298 -0
- package/src/components/RichTextEditor/RichTextEditor.tsx +1910 -0
- package/src/components/RichTextEditor/RichTextImageResizer.tsx +131 -0
- package/src/components/RichTextEditor/RichTextLinkEditor.tsx +151 -0
- package/src/components/RichTextEditor/RichTextMentionMenu.tsx +99 -0
- package/src/components/RichTextEditor/RichTextToolbar.tsx +379 -0
- package/src/components/RichTextEditor/autolinkInput.ts +65 -0
- package/src/components/RichTextEditor/blockDrop.ts +9 -0
- package/src/components/RichTextEditor/blockReflow.ts +62 -0
- package/src/components/RichTextEditor/commands.ts +300 -0
- package/src/components/RichTextEditor/history.ts +93 -0
- package/src/components/RichTextEditor/icons.tsx +152 -0
- package/src/components/RichTextEditor/imageSize.ts +70 -0
- package/src/components/RichTextEditor/index.ts +5 -0
- package/src/components/RichTextEditor/input.ts +209 -0
- package/src/components/RichTextEditor/inputRules.ts +71 -0
- package/src/components/RichTextEditor/links.ts +103 -0
- package/src/components/RichTextEditor/mentionContext.ts +37 -0
- package/src/components/RichTextEditor/mentions.ts +28 -0
- package/src/components/RichTextEditor/preventSelectionLoss.ts +15 -0
- package/src/components/RichTextEditor/selection.ts +415 -0
- package/src/components/RichTextEditor/shortcuts.ts +44 -0
- package/src/components/RichTextEditor/useAnchoredFloating.ts +50 -0
- package/src/components/RichTextEditor/useAttachmentConfig.ts +134 -0
- package/src/components/RichTextEditor/useDismissOnOutsidePointerDown.ts +26 -0
- package/src/components/RichTextEditor/useLinkEditor.ts +107 -0
- package/src/components/RichTextEditor/useMention.ts +226 -0
- package/src/components/RichTextEditor/useOverlayRect.ts +73 -0
- package/src/components/RichTextEditor/useUpload.ts +246 -0
- package/src/components/Screen/Screen.module.scss +46 -0
- package/src/components/Screen/Screen.tokens.scss +20 -0
- package/src/components/Screen/Screen.tsx +97 -0
- package/src/components/Screen/index.ts +2 -0
- package/src/components/ScrollArea/ScrollArea.module.scss +39 -0
- package/src/components/ScrollArea/ScrollArea.tokens.scss +15 -0
- package/src/components/ScrollArea/ScrollArea.tsx +154 -0
- package/src/components/ScrollArea/index.ts +2 -0
- package/src/components/Select/Chip.tsx +45 -0
- package/src/components/Select/Empty.tsx +39 -0
- package/src/components/Select/Error.tsx +51 -0
- package/src/components/Select/HiddenInputs.tsx +44 -0
- package/src/components/Select/Listbox.tsx +557 -0
- package/src/components/Select/Loading.tsx +30 -0
- package/src/components/Select/Select.module.scss +512 -0
- package/src/components/Select/Select.tokens.scss +140 -0
- package/src/components/Select/Select.tsx +685 -0
- package/src/components/Select/Trigger.tsx +952 -0
- package/src/components/Select/context.ts +101 -0
- package/src/components/Select/emptyStateText.ts +19 -0
- package/src/components/Select/index.ts +9 -0
- package/src/components/Select/useSelectState.ts +157 -0
- package/src/components/Select/utils-types.ts +7 -0
- package/src/components/Select/utils.ts +122 -0
- package/src/components/SettingRow/SettingRow.module.scss +166 -0
- package/src/components/SettingRow/SettingRow.tokens.scss +37 -0
- package/src/components/SettingRow/SettingRow.tsx +242 -0
- package/src/components/SettingRow/index.ts +7 -0
- package/src/components/Skeleton/Skeleton.module.scss +55 -0
- package/src/components/Skeleton/Skeleton.tokens.scss +17 -0
- package/src/components/Skeleton/Skeleton.tsx +131 -0
- package/src/components/Skeleton/index.ts +4 -0
- package/src/components/Skeleton/useSkeletonVisibility.ts +95 -0
- package/src/components/Slider/Slider.module.scss +293 -0
- package/src/components/Slider/Slider.tokens.scss +98 -0
- package/src/components/Slider/Slider.tsx +624 -0
- package/src/components/Slider/index.ts +9 -0
- package/src/components/SlotGrid/SlotGrid.module.scss +61 -0
- package/src/components/SlotGrid/SlotGrid.tokens.scss +21 -0
- package/src/components/SlotGrid/SlotGrid.tsx +111 -0
- package/src/components/SlotGrid/index.ts +2 -0
- package/src/components/SocialButton/SocialButton.module.scss +4 -0
- package/src/components/SocialButton/SocialButton.tsx +40 -0
- package/src/components/SocialButton/index.ts +2 -0
- package/src/components/Sortable/Sortable.module.scss +177 -0
- package/src/components/Sortable/Sortable.tokens.scss +27 -0
- package/src/components/Sortable/Sortable.tsx +572 -0
- package/src/components/Sortable/containerAwareCollision.ts +125 -0
- package/src/components/Sortable/index.ts +13 -0
- package/src/components/SortableGroup/SortableGroup.module.scss +23 -0
- package/src/components/SortableGroup/SortableGroup.tsx +315 -0
- package/src/components/SortableGroup/index.ts +4 -0
- package/src/components/SortableGroup/moveSortableItem.ts +39 -0
- package/src/components/Sparkline/Sparkline.module.scss +28 -0
- package/src/components/Sparkline/Sparkline.tokens.scss +7 -0
- package/src/components/Sparkline/Sparkline.tsx +133 -0
- package/src/components/Sparkline/index.ts +2 -0
- package/src/components/Sparkline/sparklineModel.ts +119 -0
- package/src/components/Split/Split.module.scss +158 -0
- package/src/components/Split/Split.tokens.scss +10 -0
- package/src/components/Split/Split.tsx +231 -0
- package/src/components/Split/index.ts +2 -0
- package/src/components/Stack/Stack.module.scss +67 -0
- package/src/components/Stack/Stack.tokens.scss +11 -0
- package/src/components/Stack/Stack.tsx +100 -0
- package/src/components/Stack/index.ts +2 -0
- package/src/components/StagePath/StagePath.module.scss +255 -0
- package/src/components/StagePath/StagePath.tokens.scss +43 -0
- package/src/components/StagePath/StagePath.tsx +176 -0
- package/src/components/StagePath/index.ts +2 -0
- package/src/components/StatGroup/StatGroup.module.scss +6 -0
- package/src/components/StatGroup/StatGroup.tsx +70 -0
- package/src/components/StatGroup/StatGroupContext.ts +10 -0
- package/src/components/StatGroup/StatTile.module.scss +99 -0
- package/src/components/StatGroup/StatTile.tokens.scss +35 -0
- package/src/components/StatGroup/StatTile.tsx +143 -0
- package/src/components/StatGroup/index.ts +4 -0
- package/src/components/Sticky/Sticky.module.scss +98 -0
- package/src/components/Sticky/Sticky.tokens.scss +17 -0
- package/src/components/Sticky/Sticky.tsx +103 -0
- package/src/components/Sticky/index.ts +2 -0
- package/src/components/Switch/Switch.module.scss +182 -0
- package/src/components/Switch/Switch.tokens.scss +59 -0
- package/src/components/Switch/Switch.tsx +214 -0
- package/src/components/Switch/index.ts +2 -0
- package/src/components/Table/Table.module.scss +308 -0
- package/src/components/Table/Table.tokens.scss +79 -0
- package/src/components/Table/Table.tsx +381 -0
- package/src/components/Table/index.ts +15 -0
- package/src/components/TableOfContents/TableOfContents.module.scss +83 -0
- package/src/components/TableOfContents/TableOfContents.tokens.scss +26 -0
- package/src/components/TableOfContents/TableOfContents.tsx +192 -0
- package/src/components/TableOfContents/activeSection.ts +18 -0
- package/src/components/TableOfContents/index.ts +2 -0
- package/src/components/Tabs/Tabs.module.scss +359 -0
- package/src/components/Tabs/Tabs.tokens.scss +50 -0
- package/src/components/Tabs/Tabs.tsx +538 -0
- package/src/components/Tabs/index.ts +2 -0
- package/src/components/Text/Text.module.scss +115 -0
- package/src/components/Text/Text.tokens.scss +55 -0
- package/src/components/Text/Text.tsx +197 -0
- package/src/components/Text/index.ts +2 -0
- package/src/components/Textarea/Textarea.module.scss +94 -0
- package/src/components/Textarea/Textarea.tokens.scss +48 -0
- package/src/components/Textarea/Textarea.tsx +246 -0
- package/src/components/Textarea/index.ts +2 -0
- package/src/components/Thread/Thread.module.scss +161 -0
- package/src/components/Thread/Thread.tokens.scss +32 -0
- package/src/components/Thread/Thread.tsx +176 -0
- package/src/components/Thread/index.ts +2 -0
- package/src/components/TimeField/TimeField.module.scss +232 -0
- package/src/components/TimeField/TimeField.tsx +793 -0
- package/src/components/TimeField/index.ts +2 -0
- package/src/components/Timeline/Timeline.module.scss +58 -0
- package/src/components/Timeline/Timeline.tokens.scss +13 -0
- package/src/components/Timeline/Timeline.tsx +53 -0
- package/src/components/Timeline/index.ts +2 -0
- package/src/components/Title/Title.module.scss +84 -0
- package/src/components/Title/Title.tokens.scss +37 -0
- package/src/components/Title/Title.tsx +150 -0
- package/src/components/Title/index.ts +2 -0
- package/src/components/Toast/Toast.module.scss +299 -0
- package/src/components/Toast/Toast.tokens.scss +65 -0
- package/src/components/Toast/Toast.tsx +122 -0
- package/src/components/Toast/ToastViewport.tsx +166 -0
- package/src/components/Toast/api.ts +175 -0
- package/src/components/Toast/index.ts +5 -0
- package/src/components/Toast/store.ts +133 -0
- package/src/components/Toast/useToastTimer.ts +94 -0
- package/src/components/Tooltip/Tooltip.module.scss +99 -0
- package/src/components/Tooltip/Tooltip.tokens.scss +23 -0
- package/src/components/Tooltip/Tooltip.tsx +341 -0
- package/src/components/Tooltip/index.ts +2 -0
- package/src/components/TopBar/TopBar.module.scss +235 -0
- package/src/components/TopBar/TopBar.tokens.scss +79 -0
- package/src/components/TopBar/TopBar.tsx +87 -0
- package/src/components/TopBar/TopBarEnd.tsx +20 -0
- package/src/components/TopBar/TopBarIconButton.tsx +86 -0
- package/src/components/TopBar/TopBarSearch.tsx +319 -0
- package/src/components/TopBar/TopBarSearchPanel.tsx +268 -0
- package/src/components/TopBar/TopBarStart.tsx +20 -0
- package/src/components/TopBar/index.ts +11 -0
- package/src/components/Tour/Spotlight.tsx +121 -0
- package/src/components/Tour/Tour.module.scss +210 -0
- package/src/components/Tour/Tour.tokens.scss +58 -0
- package/src/components/Tour/Tour.tsx +617 -0
- package/src/components/Tour/index.ts +2 -0
- package/src/components/Tour/useTourTarget.ts +115 -0
- package/src/components/TreeView/TreeView.module.scss +268 -0
- package/src/components/TreeView/TreeView.tokens.scss +36 -0
- package/src/components/TreeView/TreeView.tsx +536 -0
- package/src/components/TreeView/index.ts +3 -0
- package/src/components/TreeView/treeModel.ts +224 -0
- package/src/components/VisuallyHidden/VisuallyHidden.module.scss +7 -0
- package/src/components/VisuallyHidden/VisuallyHidden.tsx +29 -0
- package/src/components/VisuallyHidden/index.ts +2 -0
- package/src/components/WidgetPreview/WidgetPreview.module.scss +11 -0
- package/src/components/WidgetPreview/WidgetPreview.tokens.scss +26 -0
- package/src/components/WidgetPreview/WidgetPreview.tsx +36 -0
- package/src/components/WidgetPreview/WidgetShape.module.scss +140 -0
- package/src/components/WidgetPreview/WidgetShape.tsx +159 -0
- package/src/components/WidgetPreview/index.ts +2 -0
- package/src/components/_internal/Trend.tsx +27 -0
- package/src/components/_internal/choiceTile.scss +74 -0
- package/src/components/_internal/collapse.scss +10 -0
- package/src/components/_internal/collapse.ts +58 -0
- package/src/components/_internal/currency.ts +257 -0
- package/src/components/_internal/dragAnnouncements.ts +200 -0
- package/src/components/_internal/fieldWiring.ts +225 -0
- package/src/components/_internal/gridSpan.ts +54 -0
- package/src/components/_internal/isoDay.ts +35 -0
- package/src/components/_internal/letterKey.ts +26 -0
- package/src/components/_internal/overlay/focusRestore.ts +21 -0
- package/src/components/_internal/overlay/index.ts +12 -0
- package/src/components/_internal/overlay/tourHold.ts +23 -0
- package/src/components/_internal/overlay/useFocusTrap.ts +120 -0
- package/src/components/_internal/overlay/useInOverlay.ts +81 -0
- package/src/components/_internal/overlay/useOverlayStack.ts +232 -0
- package/src/components/_internal/overlay/useScrollLock.ts +112 -0
- package/src/components/_internal/refs.ts +48 -0
- package/src/components/_internal/statusColor.ts +26 -0
- package/src/components/_internal/timeUtils.ts +23 -0
- package/src/components/_internal/useAsyncOptions.ts +145 -0
- package/src/components/_internal/useClippedTooltip.ts +50 -0
- package/src/components/_internal/useControllableState.ts +50 -0
- package/src/components.manifest.json +1141 -0
- package/src/hooks/useBelowBreakpoint.ts +58 -0
- package/src/i18n/I18nProvider.tsx +52 -0
- package/src/i18n/LocaleProvider.tsx +17 -0
- package/src/i18n/en.ts +648 -0
- package/src/i18n/format.ts +71 -0
- package/src/i18n/index.ts +13 -0
- package/src/i18n/messages.ts +1275 -0
- package/src/i18n/ru.ts +677 -0
- package/src/i18n/useLocale.ts +19 -0
- package/src/i18n/useTranslation.ts +58 -0
- package/src/index.ts +913 -0
- package/src/palette/index.ts +2 -0
- package/src/palette/palette.ts +108 -0
- package/src/styles/dark.scss +4 -0
- package/src/styles/global.scss +7 -0
- package/src/styles/mixins.scss +143 -0
- package/src/styles/reset.scss +78 -0
- package/src/styles/tokens.scss +18 -0
- package/src/styles/typography.scss +44 -0
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { createContext, useContext, type ReactNode, type RefObject } from 'react';
|
|
2
|
+
import type { SelectOption, FlatRow } from './utils-types';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Internal context published by `<Select>` to its subcomponents (Trigger,
|
|
6
|
+
* Listbox, future ChipsInputTrigger, etc.). Not part of the public API —
|
|
7
|
+
* all consumer-facing customization happens through `SelectProps`.
|
|
8
|
+
*
|
|
9
|
+
* The shape includes fields that some phases don't yet populate (e.g.
|
|
10
|
+
* `loading`, `error`, render escape hatches, `onCreate`). Those are wired
|
|
11
|
+
* in later phases; right now they're declared so subcomponents written
|
|
12
|
+
* against the full interface don't need to grow new optional reads later.
|
|
13
|
+
*/
|
|
14
|
+
export interface SelectContextValue<T = unknown> {
|
|
15
|
+
// ─── mode flags ───────────────────────────────────────────────────────────
|
|
16
|
+
multiple: boolean;
|
|
17
|
+
searchable: boolean;
|
|
18
|
+
creatable: boolean;
|
|
19
|
+
triggerDisplay: 'chips' | 'summary';
|
|
20
|
+
|
|
21
|
+
// ─── data ─────────────────────────────────────────────────────────────────
|
|
22
|
+
/**
|
|
23
|
+
* Currently-rendered rows. When `searchable`, this is the filtered set;
|
|
24
|
+
* otherwise identical to `allRows`. Phase 2 has no filter yet, so the
|
|
25
|
+
* two are the same.
|
|
26
|
+
*/
|
|
27
|
+
rows: FlatRow<T>[];
|
|
28
|
+
/**
|
|
29
|
+
* The full flattened option list, independent of any active query. Used
|
|
30
|
+
* by chip-mode renderers to resolve labels for selected values that have
|
|
31
|
+
* been filtered out of the visible list.
|
|
32
|
+
*/
|
|
33
|
+
allRows: FlatRow<T>[];
|
|
34
|
+
loading: boolean;
|
|
35
|
+
error: Error | null;
|
|
36
|
+
/**
|
|
37
|
+
* For an async Select, the query its current rows belong to; `null` before
|
|
38
|
+
* the first settle. `undefined` when there is no `loadOptions` at all.
|
|
39
|
+
*
|
|
40
|
+
* The empty-state announcement needs this: `loading` is FALSE for the whole
|
|
41
|
+
* debounce window, during which the rows are still the previous query's — so
|
|
42
|
+
* announcing on `!loading && rows.length === 0` said "No options." before the
|
|
43
|
+
* first fetch started, and "No results for X" about a search never run.
|
|
44
|
+
*/
|
|
45
|
+
loadedQuery?: string | null;
|
|
46
|
+
|
|
47
|
+
// ─── value ────────────────────────────────────────────────────────────────
|
|
48
|
+
value: string | string[];
|
|
49
|
+
setValue: (next: string | string[]) => void;
|
|
50
|
+
toggleValue: (v: string) => void;
|
|
51
|
+
|
|
52
|
+
// ─── open ─────────────────────────────────────────────────────────────────
|
|
53
|
+
open: boolean;
|
|
54
|
+
setOpen: (next: boolean) => void;
|
|
55
|
+
|
|
56
|
+
// ─── active (keyboard cursor) ─────────────────────────────────────────────
|
|
57
|
+
activeIndex: number;
|
|
58
|
+
setActiveIndex: (i: number) => void;
|
|
59
|
+
|
|
60
|
+
// ─── search (only meaningful when `searchable`) ───────────────────────────
|
|
61
|
+
query: string;
|
|
62
|
+
setQuery: (q: string) => void;
|
|
63
|
+
|
|
64
|
+
// ─── ids ──────────────────────────────────────────────────────────────────
|
|
65
|
+
listboxId: string;
|
|
66
|
+
triggerId: string;
|
|
67
|
+
getOptionId: (value: string) => string;
|
|
68
|
+
getGroupHeaderId: (label: string) => string;
|
|
69
|
+
|
|
70
|
+
// ─── refs ─────────────────────────────────────────────────────────────────
|
|
71
|
+
triggerRef: RefObject<HTMLElement | null>;
|
|
72
|
+
triggerRootRef: RefObject<HTMLElement | null>;
|
|
73
|
+
listboxRef: RefObject<HTMLDivElement | null>;
|
|
74
|
+
|
|
75
|
+
// ─── imperative ───────────────────────────────────────────────────────────
|
|
76
|
+
closeAndFocusTrigger: () => void;
|
|
77
|
+
retry: () => void;
|
|
78
|
+
|
|
79
|
+
// ─── render overrides + onCreate (populated in later phases) ──────────────
|
|
80
|
+
onCreate?: (label: string) => void;
|
|
81
|
+
renderOption?: (opt: SelectOption<T>, state: { active: boolean; selected: boolean }) => ReactNode;
|
|
82
|
+
renderValue?: (opt: SelectOption<T>) => ReactNode;
|
|
83
|
+
renderTag?: (opt: SelectOption<T>, remove: () => void) => ReactNode;
|
|
84
|
+
renderEmpty?: (query: string) => ReactNode;
|
|
85
|
+
renderLoading?: () => ReactNode;
|
|
86
|
+
renderError?: (err: Error, retry: () => void) => ReactNode;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export const SelectContext = createContext<SelectContextValue | null>(null);
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Read the SelectContext. Throws when called outside a `<Select>` so a
|
|
93
|
+
* misuse (e.g. rendering `<Trigger>` directly) fails loudly during dev.
|
|
94
|
+
*/
|
|
95
|
+
export function useSelectContext<T = unknown>(componentName: string): SelectContextValue<T> {
|
|
96
|
+
const ctx = useContext(SelectContext);
|
|
97
|
+
if (!ctx) {
|
|
98
|
+
throw new Error(`<Select> internals (${componentName}) must be rendered inside <Select>.`);
|
|
99
|
+
}
|
|
100
|
+
return ctx as SelectContextValue<T>;
|
|
101
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { useTranslation } from '../../i18n/useTranslation';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* The empty-state sentence, built in ONE place.
|
|
5
|
+
*
|
|
6
|
+
* The visible row renders it and the Listbox's status region announces it, and
|
|
7
|
+
* the row's copy is `aria-hidden` so a reader meets it once. That means
|
|
8
|
+
* nothing compares the two: the reachable-count assertion is satisfied by the
|
|
9
|
+
* region alone, so if the two constructions drifted, what is shown and what is
|
|
10
|
+
* spoken would differ with every test still green.
|
|
11
|
+
*/
|
|
12
|
+
export function emptyStateText(
|
|
13
|
+
t: ReturnType<typeof useTranslation>,
|
|
14
|
+
query: string | undefined,
|
|
15
|
+
): string {
|
|
16
|
+
return query && query.trim() !== ''
|
|
17
|
+
? t('select.noResultsFor', { query })
|
|
18
|
+
: `${t('select.noOptions')}.`;
|
|
19
|
+
}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { useCallback, useLayoutEffect, useRef, useState } from 'react';
|
|
2
|
+
|
|
3
|
+
export interface UseSelectStateArgs {
|
|
4
|
+
/** When `true`, value is a `string[]`; when `false`, a `string`. */
|
|
5
|
+
multiple: boolean;
|
|
6
|
+
/** Controlled value. When defined, internal state is bypassed. */
|
|
7
|
+
value?: string | string[];
|
|
8
|
+
/** Initial value when uncontrolled. Falls back to `''` (single) / `[]` (multi). */
|
|
9
|
+
defaultValue?: string | string[];
|
|
10
|
+
/** Fires on every commit, including in controlled mode (where state stays put). */
|
|
11
|
+
onChange?: (value: string | string[]) => void;
|
|
12
|
+
/** Controlled open. When defined, internal open state is bypassed. */
|
|
13
|
+
open?: boolean;
|
|
14
|
+
/** Initial open when uncontrolled. Defaults to `false`. */
|
|
15
|
+
defaultOpen?: boolean;
|
|
16
|
+
/** Fires on every commit to open state, including in controlled mode. */
|
|
17
|
+
onOpenChange?: (open: boolean) => void;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Return shape of `useSelectState`, parameterized by the value type so
|
|
22
|
+
* overloads can narrow `value` / `setValue` based on `multiple`.
|
|
23
|
+
*/
|
|
24
|
+
export interface UseSelectStateReturn<V extends string | string[] = string | string[]> {
|
|
25
|
+
/** Current value — `string` in single mode, `string[]` in multi. */
|
|
26
|
+
value: V;
|
|
27
|
+
/** Replace the entire selection. */
|
|
28
|
+
setValue: (next: V) => void;
|
|
29
|
+
/**
|
|
30
|
+
* Multi: toggle membership of `v` (add when missing, remove when present).
|
|
31
|
+
* Single: equivalent to `setValue(v)`.
|
|
32
|
+
*/
|
|
33
|
+
toggleValue: (v: string) => void;
|
|
34
|
+
/** Current open state. */
|
|
35
|
+
open: boolean;
|
|
36
|
+
/** Set open state. */
|
|
37
|
+
setOpen: (next: boolean) => void;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
interface StateRefShape {
|
|
41
|
+
multiple: boolean;
|
|
42
|
+
isControlledValue: boolean;
|
|
43
|
+
isControlledOpen: boolean;
|
|
44
|
+
currentValue: string | string[];
|
|
45
|
+
onChange?: (value: string | string[]) => void;
|
|
46
|
+
onOpenChange?: (open: boolean) => void;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const emptyValue = (multiple: boolean): string | string[] => (multiple ? [] : '');
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Combined reducer-like state for Select: controlled/uncontrolled value
|
|
53
|
+
* and open state, plus a multi-aware `toggleValue` helper.
|
|
54
|
+
*
|
|
55
|
+
* Controlled vs. uncontrolled is decided per-axis (value, open):
|
|
56
|
+
* - `value !== undefined` → controlled. `setValue` / `toggleValue` fire
|
|
57
|
+
* `onChange` but do NOT update internal state.
|
|
58
|
+
* - `open !== undefined` → controlled. `setOpen` fires `onOpenChange`
|
|
59
|
+
* but does NOT update internal state.
|
|
60
|
+
*
|
|
61
|
+
* @example
|
|
62
|
+
* const { value, setValue } = useSelectState({ multiple: false });
|
|
63
|
+
* // value is typed as `string`
|
|
64
|
+
*
|
|
65
|
+
* @example
|
|
66
|
+
* const { value, setValue } = useSelectState({ multiple: true });
|
|
67
|
+
* // value is typed as `string[]`
|
|
68
|
+
*/
|
|
69
|
+
export function useSelectState(
|
|
70
|
+
args: UseSelectStateArgs & { multiple: false },
|
|
71
|
+
): UseSelectStateReturn<string>;
|
|
72
|
+
export function useSelectState(
|
|
73
|
+
args: UseSelectStateArgs & { multiple: true },
|
|
74
|
+
): UseSelectStateReturn<string[]>;
|
|
75
|
+
export function useSelectState(args: UseSelectStateArgs): UseSelectStateReturn;
|
|
76
|
+
// Implementation signature: intentionally permissive — public callers see one
|
|
77
|
+
// of the three overloads above. `UseSelectStateReturn<string | string[]>`
|
|
78
|
+
// would not be a valid supertype of `UseSelectStateReturn<string>` because
|
|
79
|
+
// `setValue` is contravariant in V.
|
|
80
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
81
|
+
export function useSelectState(args: UseSelectStateArgs): UseSelectStateReturn<any> {
|
|
82
|
+
const { multiple, value, defaultValue, onChange, open, defaultOpen, onOpenChange } = args;
|
|
83
|
+
|
|
84
|
+
const [internalValue, setInternalValue] = useState<string | string[]>(
|
|
85
|
+
() => defaultValue ?? emptyValue(multiple),
|
|
86
|
+
);
|
|
87
|
+
const [internalOpen, setInternalOpen] = useState<boolean>(defaultOpen ?? false);
|
|
88
|
+
|
|
89
|
+
const isControlledValue = value !== undefined;
|
|
90
|
+
const isControlledOpen = open !== undefined;
|
|
91
|
+
|
|
92
|
+
// Stable refs so the returned callbacks have stable identity even though
|
|
93
|
+
// they read fresh values on every invocation. The ref is seeded with the
|
|
94
|
+
// initial values and refreshed in a layout effect — assigning during render
|
|
95
|
+
// would violate React's render-purity rule under StrictMode / concurrent
|
|
96
|
+
// rendering (a discarded render could mutate state observed by a
|
|
97
|
+
// not-yet-committed update).
|
|
98
|
+
const stateRef = useRef<StateRefShape>({
|
|
99
|
+
multiple,
|
|
100
|
+
isControlledValue,
|
|
101
|
+
isControlledOpen,
|
|
102
|
+
currentValue: isControlledValue ? (value as string | string[]) : internalValue,
|
|
103
|
+
onChange,
|
|
104
|
+
onOpenChange,
|
|
105
|
+
});
|
|
106
|
+
useLayoutEffect(() => {
|
|
107
|
+
stateRef.current = {
|
|
108
|
+
multiple,
|
|
109
|
+
isControlledValue,
|
|
110
|
+
isControlledOpen,
|
|
111
|
+
currentValue: isControlledValue ? (value as string | string[]) : internalValue,
|
|
112
|
+
onChange,
|
|
113
|
+
onOpenChange,
|
|
114
|
+
};
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
const setValue = useCallback((next: string | string[]) => {
|
|
118
|
+
const s = stateRef.current;
|
|
119
|
+
if (!s.isControlledValue) {
|
|
120
|
+
setInternalValue(next);
|
|
121
|
+
}
|
|
122
|
+
s.onChange?.(next);
|
|
123
|
+
}, []);
|
|
124
|
+
|
|
125
|
+
const toggleValue = useCallback((v: string) => {
|
|
126
|
+
const s = stateRef.current;
|
|
127
|
+
if (!s.multiple) {
|
|
128
|
+
if (!s.isControlledValue) {
|
|
129
|
+
setInternalValue(v);
|
|
130
|
+
}
|
|
131
|
+
s.onChange?.(v);
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
const current = (s.currentValue as string[]) ?? [];
|
|
135
|
+
const next = current.includes(v) ? current.filter((x) => x !== v) : [...current, v];
|
|
136
|
+
if (!s.isControlledValue) {
|
|
137
|
+
setInternalValue(next);
|
|
138
|
+
}
|
|
139
|
+
s.onChange?.(next);
|
|
140
|
+
}, []);
|
|
141
|
+
|
|
142
|
+
const setOpen = useCallback((next: boolean) => {
|
|
143
|
+
const s = stateRef.current;
|
|
144
|
+
if (!s.isControlledOpen) {
|
|
145
|
+
setInternalOpen(next);
|
|
146
|
+
}
|
|
147
|
+
s.onOpenChange?.(next);
|
|
148
|
+
}, []);
|
|
149
|
+
|
|
150
|
+
return {
|
|
151
|
+
value: isControlledValue ? (value as string | string[]) : internalValue,
|
|
152
|
+
setValue,
|
|
153
|
+
toggleValue,
|
|
154
|
+
open: isControlledOpen ? (open as boolean) : internalOpen,
|
|
155
|
+
setOpen,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// Tiny re-export module that breaks the circular import that would
|
|
2
|
+
// otherwise exist between `Select.tsx` (which imports the SelectContext
|
|
3
|
+
// from `./context`) and `context.ts` (which needs `SelectOption` etc.
|
|
4
|
+
// declared in `Select.tsx`). Subcomponents and `context.ts` import these
|
|
5
|
+
// types from here rather than from `./Select` directly.
|
|
6
|
+
export type { SelectOption, SelectGroup, SelectOptions } from './Select';
|
|
7
|
+
export type { FlatRow } from './utils';
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import type { SelectGroup, SelectOption, SelectOptions } from './Select';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Discriminator for `SelectOptions`: returns `true` when the input is a
|
|
5
|
+
* `SelectGroup[]` (i.e. the first element exposes an `options` array),
|
|
6
|
+
* `false` for a flat `SelectOption[]` and for an empty list.
|
|
7
|
+
*
|
|
8
|
+
* Mixing groups and flat options at the same level is not supported;
|
|
9
|
+
* only the first element is inspected.
|
|
10
|
+
*/
|
|
11
|
+
export function isGrouped<T>(opts: SelectOptions<T>): opts is SelectGroup<T>[] {
|
|
12
|
+
if (opts.length === 0) return false;
|
|
13
|
+
const first = opts[0] as SelectOption<T> | SelectGroup<T>;
|
|
14
|
+
return Array.isArray((first as SelectGroup<T>).options);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* One row in the flattened render list — either a non-selectable group
|
|
19
|
+
* header or a selectable option. `groupLabel` is set on option rows when
|
|
20
|
+
* they belong to a group, so the renderer can group them visually or in
|
|
21
|
+
* `aria-` attributes without re-walking the original tree.
|
|
22
|
+
*/
|
|
23
|
+
export type FlatRow<T = unknown> =
|
|
24
|
+
| { kind: 'header'; label: string }
|
|
25
|
+
| { kind: 'option'; option: SelectOption<T>; groupLabel?: string };
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Walk `SelectOptions` into a flat array of render rows.
|
|
29
|
+
*
|
|
30
|
+
* - Flat input → one `'option'` row per option (no `groupLabel`).
|
|
31
|
+
* - Grouped input → for each group: one `'header'` row then one
|
|
32
|
+
* `'option'` row per member (each tagged with its `groupLabel`).
|
|
33
|
+
*/
|
|
34
|
+
export function flattenOptions<T>(opts: SelectOptions<T>): FlatRow<T>[] {
|
|
35
|
+
if (!isGrouped(opts)) {
|
|
36
|
+
return (opts as SelectOption<T>[]).map((option) => ({ kind: 'option', option }));
|
|
37
|
+
}
|
|
38
|
+
const rows: FlatRow<T>[] = [];
|
|
39
|
+
for (const group of opts) {
|
|
40
|
+
rows.push({ kind: 'header', label: group.label });
|
|
41
|
+
for (const option of group.options) {
|
|
42
|
+
rows.push({ kind: 'option', option, groupLabel: group.label });
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return rows;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Find a single option by `value`. Walks groups when the input is
|
|
50
|
+
* grouped. Returns `null` when no match exists.
|
|
51
|
+
*/
|
|
52
|
+
export function findOption<T>(opts: SelectOptions<T>, value: string): SelectOption<T> | null {
|
|
53
|
+
if (isGrouped(opts)) {
|
|
54
|
+
for (const group of opts) {
|
|
55
|
+
const hit = group.options.find((o) => o.value === value);
|
|
56
|
+
if (hit) return hit;
|
|
57
|
+
}
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
return (opts as SelectOption<T>[]).find((o) => o.value === value) ?? null;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Find every option whose `value` appears in `values`. The returned
|
|
65
|
+
* array preserves the order of options in `opts` (NOT the order of the
|
|
66
|
+
* `values` argument), and values with no match are skipped silently —
|
|
67
|
+
* the result contains no nulls and no duplicates beyond what's in `opts`.
|
|
68
|
+
*/
|
|
69
|
+
export function findOptions<T>(opts: SelectOptions<T>, values: string[]): SelectOption<T>[] {
|
|
70
|
+
if (values.length === 0) return [];
|
|
71
|
+
const wanted = new Set(values);
|
|
72
|
+
const out: SelectOption<T>[] = [];
|
|
73
|
+
if (isGrouped(opts)) {
|
|
74
|
+
for (const group of opts) {
|
|
75
|
+
for (const option of group.options) {
|
|
76
|
+
if (wanted.has(option.value)) out.push(option);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return out;
|
|
80
|
+
}
|
|
81
|
+
for (const option of opts as SelectOption<T>[]) {
|
|
82
|
+
if (wanted.has(option.value)) out.push(option);
|
|
83
|
+
}
|
|
84
|
+
return out;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Returns true if any option in `opts` has a label case-insensitively
|
|
89
|
+
* matching `query` (after trim). Used by the creatable Select to decide
|
|
90
|
+
* whether to render a "+ Create" row — when the typed query already
|
|
91
|
+
* matches an existing label, the create row would be a no-op duplicate.
|
|
92
|
+
*
|
|
93
|
+
* The empty / whitespace-only query case returns `false` so the create
|
|
94
|
+
* row never appears for blank input.
|
|
95
|
+
*/
|
|
96
|
+
export function hasExactLabelMatch<T>(opts: SelectOptions<T>, query: string): boolean {
|
|
97
|
+
const q = query.trim().toLowerCase();
|
|
98
|
+
if (q === '') return false;
|
|
99
|
+
if (!isGrouped(opts)) {
|
|
100
|
+
return opts.some((o) => o.label.toLowerCase() === q);
|
|
101
|
+
}
|
|
102
|
+
for (const g of opts) {
|
|
103
|
+
if (g.options.some((o) => o.label.toLowerCase() === q)) return true;
|
|
104
|
+
}
|
|
105
|
+
return false;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Returns true if an option carries the internal `__create` sentinel on
|
|
110
|
+
* its `data` payload. The sentinel is injected by `<Select>` when it
|
|
111
|
+
* synthesises the "+ Create" row, and the listbox + Trigger keyboard
|
|
112
|
+
* handlers branch on it to fire `onCreate` instead of the normal
|
|
113
|
+
* select/toggle flow.
|
|
114
|
+
*/
|
|
115
|
+
export function isCreateRow<T>(opt: { data?: T }): boolean {
|
|
116
|
+
return (
|
|
117
|
+
typeof opt.data === 'object' &&
|
|
118
|
+
opt.data !== null &&
|
|
119
|
+
Object.prototype.hasOwnProperty.call(opt.data, '__create') &&
|
|
120
|
+
(opt.data as { __create?: boolean }).__create === true
|
|
121
|
+
);
|
|
122
|
+
}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
@use './SettingRow.tokens';
|
|
2
|
+
@use '../_internal/collapse' as bp;
|
|
3
|
+
|
|
4
|
+
// Two columns: label | control. The label column is a length resolved from
|
|
5
|
+
// --setting-row-label-width, so sibling rows align without a subgrid.
|
|
6
|
+
// minmax(0, …) on both tracks so a long description or a wide control
|
|
7
|
+
// shrinks instead of overflowing the List.
|
|
8
|
+
.row {
|
|
9
|
+
display: grid;
|
|
10
|
+
grid-template-columns:
|
|
11
|
+
minmax(0, var(--setting-row-label-width))
|
|
12
|
+
minmax(0, 1fr);
|
|
13
|
+
column-gap: var(--setting-row-column-gap);
|
|
14
|
+
align-items: start;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
.term,
|
|
18
|
+
.control {
|
|
19
|
+
display: flex;
|
|
20
|
+
flex-direction: column;
|
|
21
|
+
gap: var(--setting-row-stack-gap);
|
|
22
|
+
min-width: 0;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// Label line — the <label> plus any adornment, which sits OUTSIDE the <label>
|
|
26
|
+
// so it never joins the control's accessible name.
|
|
27
|
+
.labelLine {
|
|
28
|
+
display: flex;
|
|
29
|
+
flex-wrap: wrap;
|
|
30
|
+
align-items: center;
|
|
31
|
+
gap: var(--setting-row-trailing-gap);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
.label {
|
|
35
|
+
font-size: var(--setting-row-label-font-size);
|
|
36
|
+
font-weight: var(--setting-row-label-font-weight);
|
|
37
|
+
line-height: var(--line-height-tight);
|
|
38
|
+
color: var(--setting-row-label-fg);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
.required {
|
|
42
|
+
color: var(--color-danger);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Control + its trailing adornments on one line. wrap so a narrow row drops
|
|
46
|
+
// the adornments below instead of overflowing.
|
|
47
|
+
.controlLine {
|
|
48
|
+
display: flex;
|
|
49
|
+
flex-wrap: wrap;
|
|
50
|
+
align-items: center;
|
|
51
|
+
gap: var(--setting-row-trailing-gap);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// The control's own wrapper — sized by controlWidth, `trailing` sits
|
|
55
|
+
// outside it on .controlLine so controlWidth never sizes the adornments.
|
|
56
|
+
// They share the line only while both fit: in a narrow column a wide step
|
|
57
|
+
// (md) plus `trailing` wraps `trailing` onto a second line. This wrapper
|
|
58
|
+
// is created AFTER wire() has already cloned the child and injected id /
|
|
59
|
+
// aria-labelledby / aria-describedby / invalid / required, so it is never
|
|
60
|
+
// the cloneElement target — that's also why a consumer-side <Constrain>
|
|
61
|
+
// was ruled out in favor of controlWidth.
|
|
62
|
+
// controlWidth is a WIDTH, not only a cap (#549): the slot is a
|
|
63
|
+
// shrink-to-fit flex item, so a max-width alone let each `width: 100%`
|
|
64
|
+
// control resolve to its own intrinsic size — a number input's depends on
|
|
65
|
+
// its `max` attribute in Chromium — and rows in one List came out ragged.
|
|
66
|
+
// max-width: 100% still lets a narrow column shrink it.
|
|
67
|
+
.controlSlot {
|
|
68
|
+
min-width: 0;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
.controlSlot[data-control-width='xs'] {
|
|
72
|
+
width: var(--setting-row-control-width-xs);
|
|
73
|
+
max-width: 100%;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
.controlSlot[data-control-width='sm'] {
|
|
77
|
+
width: var(--setting-row-control-width-sm);
|
|
78
|
+
max-width: 100%;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
.controlSlot[data-control-width='md'] {
|
|
82
|
+
width: var(--setting-row-control-width-md);
|
|
83
|
+
max-width: 100%;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// trailing's own flex item, sized to its content rather than the shared
|
|
87
|
+
// line. Most DS controls (Select included) are `width: 100%`, which would
|
|
88
|
+
// otherwise resolve against .controlLine's full content box — the entire
|
|
89
|
+
// control column — and force a wrap no matter how much room there is.
|
|
90
|
+
// `width: max-content` makes a 100%-wide child measure against ITS OWN box
|
|
91
|
+
// instead; `max-width: 100%` still lets it shrink rather than overflow.
|
|
92
|
+
.trailing {
|
|
93
|
+
display: flex;
|
|
94
|
+
flex-wrap: wrap;
|
|
95
|
+
align-items: center;
|
|
96
|
+
gap: var(--setting-row-trailing-gap);
|
|
97
|
+
width: max-content;
|
|
98
|
+
max-width: 100%;
|
|
99
|
+
min-width: 0;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// --- SettingRow.List ---------------------------------------------------
|
|
103
|
+
// The List owns vertical rhythm and dividers — hard rule 4 keeps them off
|
|
104
|
+
// the row, which is the child.
|
|
105
|
+
.list {
|
|
106
|
+
display: flex;
|
|
107
|
+
flex-direction: column;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
.list[data-spacing='sm'] > [data-setting-row] {
|
|
111
|
+
padding-block: var(--setting-row-padding-y-sm);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
.list[data-spacing='md'] > [data-setting-row] {
|
|
115
|
+
padding-block: var(--setting-row-padding-y-md);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
.list[data-spacing='lg'] > [data-setting-row] {
|
|
119
|
+
padding-block: var(--setting-row-padding-y-lg);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
.list[data-dividers='true'] > [data-setting-row] + [data-setting-row] {
|
|
123
|
+
border-top: var(--border-width) solid var(--setting-row-divider-color);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// --- collapseBelow -----------------------------------------------------
|
|
127
|
+
// Unlike Grid/Split, where collapse is opt-in, `collapseBelow` defaults to
|
|
128
|
+
// 'sm' — so every List is a size container BY DEFAULT. The label track IS
|
|
129
|
+
// `minmax(0, …)` like the control track (see the .row comment above) — it
|
|
130
|
+
// shrinks rather than overflows — but below the collapseBelow threshold
|
|
131
|
+
// (480/640/768px, see collapse.ts) that shrinking crushes the control
|
|
132
|
+
// column instead of giving it room, which is a worse failure than the
|
|
133
|
+
// column simply overflowing would be. Collapsing to one stacked column below
|
|
134
|
+
// the threshold is the fix, and it is the right default rather than a
|
|
135
|
+
// nice-to-have. `collapseBelow={false}` opts a List out of containment
|
|
136
|
+
// entirely (below, .collapsible is then never applied) — the escape hatch
|
|
137
|
+
// for a shrink-to-fit parent, matching Grid/Split's opt-in-by-omission
|
|
138
|
+
// shape from the other direction. The cost when containment IS on (mirrors
|
|
139
|
+
// Split.module.scss:86-87): container-type: inline-size zeroes the
|
|
140
|
+
// element's intrinsic-width contribution. The queries target the ROWS,
|
|
141
|
+
// which are descendants — an element is never matched by a query against
|
|
142
|
+
// its own container (same constraint Grid and Split document).
|
|
143
|
+
.collapsible {
|
|
144
|
+
container-type: inline-size;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
@container (max-width: #{bp.$collapse-sm}) {
|
|
148
|
+
.collapsible.collapseSm > [data-setting-row] {
|
|
149
|
+
grid-template-columns: minmax(0, 1fr);
|
|
150
|
+
row-gap: var(--setting-row-stack-gap);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
@container (max-width: #{bp.$collapse-md}) {
|
|
155
|
+
.collapsible.collapseMd > [data-setting-row] {
|
|
156
|
+
grid-template-columns: minmax(0, 1fr);
|
|
157
|
+
row-gap: var(--setting-row-stack-gap);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
@container (max-width: #{bp.$collapse-lg}) {
|
|
162
|
+
.collapsible.collapseLg > [data-setting-row] {
|
|
163
|
+
grid-template-columns: minmax(0, 1fr);
|
|
164
|
+
row-gap: var(--setting-row-stack-gap);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// SettingRow.tokens.scss — Component-scoped tokens for <SettingRow> and
|
|
2
|
+
// <SettingRow.List>. Covers the label column width, the two-column gap,
|
|
3
|
+
// label typography, per-spacing row padding, and the divider color.
|
|
4
|
+
// No hex literals here — a component token that duplicates a semantic value
|
|
5
|
+
// is a structure.test.ts failure.
|
|
6
|
+
:root {
|
|
7
|
+
// Label column — a LENGTH, not max-content, so every row in a List resolves
|
|
8
|
+
// the same column without a subgrid.
|
|
9
|
+
--setting-row-label-width: 16rem;
|
|
10
|
+
|
|
11
|
+
// Gap between the label column and the control column
|
|
12
|
+
--setting-row-column-gap: var(--space-4);
|
|
13
|
+
|
|
14
|
+
// Gap between stacked pieces inside each column
|
|
15
|
+
--setting-row-stack-gap: var(--space-1);
|
|
16
|
+
|
|
17
|
+
// Gap between the control and its trailing adornments
|
|
18
|
+
--setting-row-trailing-gap: var(--space-2);
|
|
19
|
+
|
|
20
|
+
// Label typography
|
|
21
|
+
--setting-row-label-font-size: var(--font-size-sm);
|
|
22
|
+
--setting-row-label-font-weight: var(--font-weight-medium);
|
|
23
|
+
--setting-row-label-fg: var(--color-fg);
|
|
24
|
+
|
|
25
|
+
// Spacing variants — padding-block per row, set by the List
|
|
26
|
+
--setting-row-padding-y-sm: var(--space-2);
|
|
27
|
+
--setting-row-padding-y-md: var(--space-3);
|
|
28
|
+
--setting-row-padding-y-lg: var(--space-4);
|
|
29
|
+
|
|
30
|
+
// Divider between rows when the List sets dividers
|
|
31
|
+
--setting-row-divider-color: var(--color-border);
|
|
32
|
+
|
|
33
|
+
// Control cell caps — mirror Constrain's measure scale
|
|
34
|
+
--setting-row-control-width-xs: var(--measure-xs);
|
|
35
|
+
--setting-row-control-width-sm: var(--measure-sm);
|
|
36
|
+
--setting-row-control-width-md: var(--measure-md);
|
|
37
|
+
}
|