@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,161 @@
|
|
|
1
|
+
@use './Thread.tokens';
|
|
2
|
+
|
|
3
|
+
.root {
|
|
4
|
+
list-style: none;
|
|
5
|
+
// stylelint-disable-next-line property-disallowed-list -- UA reset for <ul> default margin
|
|
6
|
+
margin: 0;
|
|
7
|
+
// stylelint-disable-next-line property-disallowed-list -- UA reset for <ul> default padding
|
|
8
|
+
padding: 0;
|
|
9
|
+
display: flex;
|
|
10
|
+
flex-direction: column;
|
|
11
|
+
gap: var(--thread-row-gap);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
.item {
|
|
15
|
+
display: grid;
|
|
16
|
+
grid-template-columns: var(--thread-node-size) 1fr;
|
|
17
|
+
column-gap: var(--thread-content-gap);
|
|
18
|
+
|
|
19
|
+
// Row gap separates the body row from the flat-replies row (past the depth cap),
|
|
20
|
+
// so the first flat reply isn't flush against the parent body. No-op for the
|
|
21
|
+
// indented branch (single grid row — its replies nest inside `.content`).
|
|
22
|
+
row-gap: var(--thread-row-gap);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// Node box: its height is the alignment target. Default (`nodeAlign="header"`) it's the
|
|
26
|
+
// header line-box, so a node taller than one line centers ON the first body line
|
|
27
|
+
// (overflowing the box symmetrically). `.alignTop` makes it the full node height → the
|
|
28
|
+
// node top-aligns with the body. Either way the node is centered within the box.
|
|
29
|
+
.nodeBox {
|
|
30
|
+
height: var(--thread-nodebox-height);
|
|
31
|
+
display: flex;
|
|
32
|
+
align-items: center;
|
|
33
|
+
justify-content: center;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// nodeAlign="top": full-height node box, top-aligned with the body (the pre-header-
|
|
37
|
+
// centering behavior). Overrides the header-centering defaults from the tokens.
|
|
38
|
+
.alignTop {
|
|
39
|
+
--thread-node-center: calc(var(--thread-node-size) / 2);
|
|
40
|
+
--thread-nodebox-height: var(--thread-node-size);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
.content {
|
|
44
|
+
min-width: 0;
|
|
45
|
+
display: flex;
|
|
46
|
+
flex-direction: column;
|
|
47
|
+
gap: var(--thread-row-gap);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// `position: relative` so the parent rail (rendered as a child) anchors to the body box:
|
|
51
|
+
// its bottom edge is the rail's natural terminus, independent of the surface colour or
|
|
52
|
+
// the replies' height.
|
|
53
|
+
.body {
|
|
54
|
+
position: relative;
|
|
55
|
+
min-width: 0;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// The parent rail's trunk above the replies — from just below the node down to the
|
|
59
|
+
// bottom of the body, extended one row-gap further so it meets the first reply's trunk
|
|
60
|
+
// segment across the body→replies gap. Anchored to `.body` (not a full-height gutter),
|
|
61
|
+
// so there is no overshoot to mask: the per-reply `::after` segments carry the trunk the
|
|
62
|
+
// rest of the way and terminate it exactly at the last elbow. Decorative.
|
|
63
|
+
.rail {
|
|
64
|
+
position: absolute;
|
|
65
|
+
inset-inline-start: calc(-1 * (var(--thread-node-size) / 2 + var(--thread-content-gap)));
|
|
66
|
+
transform: translateX(-50%);
|
|
67
|
+
|
|
68
|
+
// Start a hairline below the node (node centre + half the node), so the rail doesn't
|
|
69
|
+
// touch the avatar.
|
|
70
|
+
inset-block-start: calc(
|
|
71
|
+
var(--thread-node-center) + var(--thread-node-size) / 2 + var(--thread-node-gap)
|
|
72
|
+
);
|
|
73
|
+
inset-block-end: calc(-1 * var(--thread-row-gap));
|
|
74
|
+
width: var(--thread-rail-width);
|
|
75
|
+
background: var(--thread-rail-color);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// Indented replies — nested inside content (so the gutter column stretches and the
|
|
79
|
+
// parent rail spans alongside them). Its own flex-column gap stacks the replies.
|
|
80
|
+
.replies {
|
|
81
|
+
list-style: none;
|
|
82
|
+
// stylelint-disable-next-line property-disallowed-list -- UA reset for <ul> default margin
|
|
83
|
+
margin: 0;
|
|
84
|
+
// stylelint-disable-next-line property-disallowed-list -- UA reset for <ul> default padding
|
|
85
|
+
padding: 0;
|
|
86
|
+
display: flex;
|
|
87
|
+
flex-direction: column;
|
|
88
|
+
gap: var(--thread-row-gap);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Each indented reply branches off the parent rail with a horizontal elbow that meets
|
|
92
|
+
// the reply's node — so the thread reads as a ├─ / └─ tree, not just a bare vertical
|
|
93
|
+
// line. The parent rail sits at the parent gutter's centre, one indent level (gutter
|
|
94
|
+
// half + content-gap) to the LEFT of this reply, so the elbow starts there and runs
|
|
95
|
+
// toward the reply's node (stopping a hairline short of the avatar). Logical props →
|
|
96
|
+
// RTL-safe. Only indented replies (not the root items or flat past-cap replies) carry
|
|
97
|
+
// an elbow, since only they sit under a rail.
|
|
98
|
+
.replies > .item {
|
|
99
|
+
position: relative;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
.replies > .item::before {
|
|
103
|
+
content: '';
|
|
104
|
+
position: absolute;
|
|
105
|
+
inset-block-start: var(--thread-node-center);
|
|
106
|
+
inset-inline-start: calc(-1 * (var(--thread-node-size) / 2 + var(--thread-content-gap)));
|
|
107
|
+
|
|
108
|
+
// Run from the parent rail to a hairline short of the node, so it doesn't touch the
|
|
109
|
+
// avatar (full reach would be node/2 + content-gap; stop `node-gap` before it).
|
|
110
|
+
width: calc(var(--thread-node-size) / 2 + var(--thread-content-gap) - var(--thread-node-gap));
|
|
111
|
+
height: var(--thread-rail-width);
|
|
112
|
+
background: var(--thread-rail-color);
|
|
113
|
+
transform: translateY(-50%);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// The trunk through the reply group, drawn per reply as a vertical segment so it ends
|
|
117
|
+
// exactly at the last elbow — no full-height rail + surface-coloured mask, so it's
|
|
118
|
+
// independent of the surface the thread sits on. Each segment starts one row-gap above
|
|
119
|
+
// its item (bridging the gap to the previous segment / the body rail), giving a
|
|
120
|
+
// continuous line at the parent gutter's centre.
|
|
121
|
+
.replies > .item::after {
|
|
122
|
+
content: '';
|
|
123
|
+
position: absolute;
|
|
124
|
+
inset-block-start: calc(-1 * var(--thread-row-gap));
|
|
125
|
+
inset-inline-start: calc(-1 * (var(--thread-node-size) / 2 + var(--thread-content-gap)));
|
|
126
|
+
transform: translateX(-50%);
|
|
127
|
+
width: var(--thread-rail-width);
|
|
128
|
+
background: var(--thread-rail-color);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// Non-last replies: run the segment to the item's bottom so it joins the next one.
|
|
132
|
+
.replies > .item:not(:last-child)::after {
|
|
133
|
+
inset-block-end: 0;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// Last reply: stop the trunk at this elbow (└─) — node centre + the bridged gap — so it
|
|
137
|
+
// terminates at the final branch with nothing dangling below it.
|
|
138
|
+
.replies > .item:last-child::after {
|
|
139
|
+
height: calc(var(--thread-row-gap) + var(--thread-node-center));
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// Flat replies past the cap — a direct grid child spanning both columns so they are
|
|
143
|
+
// NOT indented further (the gutter stops compounding). No parent rail / elbow here.
|
|
144
|
+
.repliesFlat {
|
|
145
|
+
// stylelint-disable-next-line property-disallowed-list -- internal grid placement: flat replies span both columns to stop indent compounding
|
|
146
|
+
grid-column: 1 / -1;
|
|
147
|
+
list-style: none;
|
|
148
|
+
// stylelint-disable-next-line property-disallowed-list -- UA reset for <ul> default margin
|
|
149
|
+
margin: 0;
|
|
150
|
+
// stylelint-disable-next-line property-disallowed-list -- UA reset for <ul> default padding
|
|
151
|
+
padding: 0;
|
|
152
|
+
display: flex;
|
|
153
|
+
flex-direction: column;
|
|
154
|
+
gap: var(--thread-row-gap);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
.compact {
|
|
158
|
+
--thread-node-size: var(--thread-node-size-compact);
|
|
159
|
+
--thread-content-gap: var(--thread-content-gap-compact);
|
|
160
|
+
--thread-row-gap: var(--thread-row-gap-compact);
|
|
161
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
:root {
|
|
2
|
+
// Node column / box — match it to the avatar size you pass as `node`. Default `sm`
|
|
3
|
+
// (24px): comment-thread avatars are small, and it keeps the per-level reply indent
|
|
4
|
+
// (node + content-gap) tight. Override `--thread-node-size` for larger nodes.
|
|
5
|
+
--thread-node-size: var(--size-sm); // 24px node column / box
|
|
6
|
+
--thread-content-gap: var(
|
|
7
|
+
--space-2
|
|
8
|
+
); // 8px node → content (also the per-level reply indent: node + gap)
|
|
9
|
+
--thread-row-gap: var(--space-4); // 16px between items
|
|
10
|
+
--thread-rail-width: var(--border-width); // hairline rail
|
|
11
|
+
--thread-rail-color: var(--color-border);
|
|
12
|
+
--thread-node-gap: 1px; // hairline gap between the connector lines and the node/avatar
|
|
13
|
+
|
|
14
|
+
// Height of the first body line (the "header" — author + timestamp). With the
|
|
15
|
+
// default `nodeAlign="header"`, the node is vertically centered against THIS line, so
|
|
16
|
+
// it should match your header text's line-box. Defaults to the line-box of
|
|
17
|
+
// `<Text size="sm">` (the canonical header) via the global primitives — if you rebrand
|
|
18
|
+
// Text's own tokens (`--text-font-size-sm`/`--text-line-height`) so they diverge, or
|
|
19
|
+
// your header line differs, override this token to match.
|
|
20
|
+
--thread-header-line-height: calc(var(--font-size-sm) * var(--line-height-normal));
|
|
21
|
+
|
|
22
|
+
// Node vertical centre (from the item top) and node-box height. Defaults center the
|
|
23
|
+
// node on the header line; the `.alignTop` class (`nodeAlign="top"`) overrides both to
|
|
24
|
+
// top-align the node with the body instead. The rail/elbow connectors derive their
|
|
25
|
+
// Y from `--thread-node-center`, so they track whichever alignment is active.
|
|
26
|
+
--thread-node-center: calc(var(--thread-header-line-height) / 2);
|
|
27
|
+
--thread-nodebox-height: var(--thread-header-line-height);
|
|
28
|
+
|
|
29
|
+
--thread-node-size-compact: var(--size-sm); // 24px
|
|
30
|
+
--thread-content-gap-compact: var(--space-1); // 4px
|
|
31
|
+
--thread-row-gap-compact: var(--space-2); // 8px
|
|
32
|
+
}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import {
|
|
2
|
+
forwardRef,
|
|
3
|
+
createContext,
|
|
4
|
+
useContext,
|
|
5
|
+
Children,
|
|
6
|
+
isValidElement,
|
|
7
|
+
type HTMLAttributes,
|
|
8
|
+
type ReactNode,
|
|
9
|
+
} from 'react';
|
|
10
|
+
import clsx from 'clsx';
|
|
11
|
+
import styles from './Thread.module.scss';
|
|
12
|
+
|
|
13
|
+
const DEFAULT_MAX_DEPTH = 4;
|
|
14
|
+
|
|
15
|
+
interface ThreadContextValue {
|
|
16
|
+
/** Current nesting depth — 0 at the root, +1 per indented reply level. */
|
|
17
|
+
depth: number;
|
|
18
|
+
/** Max depth before replies stop indenting and render flat. */
|
|
19
|
+
maxDepth: number;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const ThreadContext = createContext<ThreadContextValue | null>(null);
|
|
23
|
+
|
|
24
|
+
/** Where the leading `node` sits relative to the comment body. See `ThreadProps#nodeAlign`. */
|
|
25
|
+
export type ThreadNodeAlign = 'header' | 'top';
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Reads the surrounding thread depth/cap. Falls back to a depth-0 default so a
|
|
29
|
+
* `<Thread.Item>` can render standalone (e.g. in a test) without a provider.
|
|
30
|
+
*/
|
|
31
|
+
const useThread = (): ThreadContextValue =>
|
|
32
|
+
useContext(ThreadContext) ?? { depth: 0, maxDepth: DEFAULT_MAX_DEPTH };
|
|
33
|
+
|
|
34
|
+
export interface ThreadProps extends HTMLAttributes<HTMLUListElement> {
|
|
35
|
+
/**
|
|
36
|
+
* Max visual nesting depth before replies render flat (no further indent). Once the
|
|
37
|
+
* cap is reached, deeper replies keep the same indent level so the thread stops
|
|
38
|
+
* marching right. Default `4`.
|
|
39
|
+
*/
|
|
40
|
+
maxDepth?: number;
|
|
41
|
+
/**
|
|
42
|
+
* Tighter gaps for dense surfaces (sidebars, panels). The remapped tokens cascade to
|
|
43
|
+
* every nested item via CSS custom properties. Default `false`.
|
|
44
|
+
*/
|
|
45
|
+
compact?: boolean;
|
|
46
|
+
/**
|
|
47
|
+
* Where the leading `node` sits relative to the comment body.
|
|
48
|
+
* - `header` (default) — vertically centered on the **first body line** (the author /
|
|
49
|
+
* timestamp header), Jira/GitHub style, so a node taller than one line (e.g. a 24px
|
|
50
|
+
* `<Avatar>`) reads as centered against the name rather than top-aligned. Assumes the
|
|
51
|
+
* header line-box matches `--thread-header-line-height` (defaults to `<Text size="sm">`);
|
|
52
|
+
* override that token if your header line differs. Remove any old header
|
|
53
|
+
* `lineHeight` override (e.g. `var(--size-sm)`) — it now double-compensates.
|
|
54
|
+
* - `top` — top-aligned with the body (the node's top meets the body's top). Use when the
|
|
55
|
+
* node is about one line tall, or when you deliberately want top alignment.
|
|
56
|
+
*/
|
|
57
|
+
nodeAlign?: ThreadNodeAlign;
|
|
58
|
+
/** The `<Thread.Item>`s. */
|
|
59
|
+
children: ReactNode;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export interface ThreadItemProps extends HTMLAttributes<HTMLLIElement> {
|
|
63
|
+
/**
|
|
64
|
+
* The leading marker the rail connects to — an `<Avatar>`, icon, or `<Dot>`. Centered
|
|
65
|
+
* in its node box so the rail/elbow connectors meet it cleanly regardless of node
|
|
66
|
+
* content; by default the box centers on the first body line so a taller node aligns to
|
|
67
|
+
* the header (see `Thread`'s `nodeAlign`). It's a slot: there is no built-in avatar.
|
|
68
|
+
* Size the node to `--thread-node-size` (default `sm` / 24px) — e.g. `<Avatar size="sm">`;
|
|
69
|
+
* for a larger node, override `--thread-node-size` to match.
|
|
70
|
+
*/
|
|
71
|
+
node: ReactNode;
|
|
72
|
+
/**
|
|
73
|
+
* The comment body/actions, plus optional nested `<Thread.Item>` replies. Plain children
|
|
74
|
+
* render as the comment body; any direct `<Thread.Item>` child renders as a reply under
|
|
75
|
+
* the rail.
|
|
76
|
+
*/
|
|
77
|
+
children: ReactNode;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// Named `ThreadItemImpl` (not `ThreadItem`) so the inner named-function-expression
|
|
81
|
+
// scope does NOT shadow the outer `const ThreadItem` — the recursive child sort below
|
|
82
|
+
// compares `child.type === ThreadItem` (the forwardRef object), and a same-named inner
|
|
83
|
+
// function would shadow it with the bare render function, breaking reply detection.
|
|
84
|
+
const ThreadItem = forwardRef<HTMLLIElement, ThreadItemProps>(function ThreadItemImpl(
|
|
85
|
+
{ node, className, children, ...rest },
|
|
86
|
+
ref,
|
|
87
|
+
) {
|
|
88
|
+
const { depth, maxDepth } = useThread();
|
|
89
|
+
|
|
90
|
+
// Sort children: nested <Thread.Item>s are replies; everything else is the
|
|
91
|
+
// comment body. Consumers write them in natural source order — the split is
|
|
92
|
+
// internal (mirrors PersonDisplay's child sorting).
|
|
93
|
+
const replies: ReactNode[] = [];
|
|
94
|
+
const body: ReactNode[] = [];
|
|
95
|
+
Children.forEach(children, (child) => {
|
|
96
|
+
if (isValidElement(child) && child.type === ThreadItem) {
|
|
97
|
+
replies.push(child);
|
|
98
|
+
} else {
|
|
99
|
+
body.push(child);
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
const hasReplies = replies.length > 0;
|
|
104
|
+
// Indent while under the cap; at/over it, replies render flat so the gutter
|
|
105
|
+
// stops compounding right.
|
|
106
|
+
const indented = depth < maxDepth;
|
|
107
|
+
|
|
108
|
+
return (
|
|
109
|
+
<li className={clsx(styles.item, className)} {...rest} ref={ref}>
|
|
110
|
+
<div className={styles.nodeBox}>{node}</div>
|
|
111
|
+
{hasReplies && indented ? (
|
|
112
|
+
// Indented: replies live inside content; the parent rail (anchored to the body
|
|
113
|
+
// box) bridges down to the first reply, and the per-reply trunk segments carry
|
|
114
|
+
// it the rest of the way, ending at the last elbow. Depth +1.
|
|
115
|
+
<div className={styles.content}>
|
|
116
|
+
<div className={styles.body}>
|
|
117
|
+
{body}
|
|
118
|
+
{/* Parent rail trunk above the replies — anchored to the body box. */}
|
|
119
|
+
<div className={styles.rail} aria-hidden="true" />
|
|
120
|
+
</div>
|
|
121
|
+
<ThreadContext.Provider value={{ depth: depth + 1, maxDepth }}>
|
|
122
|
+
<ul className={styles.replies}>{replies}</ul>
|
|
123
|
+
</ThreadContext.Provider>
|
|
124
|
+
</div>
|
|
125
|
+
) : (
|
|
126
|
+
// Flat: either no replies, or at/over the cap. Replies (if any) become a
|
|
127
|
+
// direct grid child spanning both columns and keep the SAME depth so they
|
|
128
|
+
// also render flat — the indent stops compounding.
|
|
129
|
+
<>
|
|
130
|
+
<div className={styles.content}>
|
|
131
|
+
<div className={styles.body}>{body}</div>
|
|
132
|
+
</div>
|
|
133
|
+
{hasReplies && (
|
|
134
|
+
<ThreadContext.Provider value={{ depth, maxDepth }}>
|
|
135
|
+
<ul className={styles.repliesFlat}>{replies}</ul>
|
|
136
|
+
</ThreadContext.Provider>
|
|
137
|
+
)}
|
|
138
|
+
</>
|
|
139
|
+
)}
|
|
140
|
+
</li>
|
|
141
|
+
);
|
|
142
|
+
});
|
|
143
|
+
ThreadItem.displayName = 'Thread.Item';
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Nested-reply threading primitive: a left rail per nesting level connecting a parent comment to its replies.
|
|
147
|
+
* @see docs/components/Thread.md
|
|
148
|
+
*/
|
|
149
|
+
const ThreadRoot = forwardRef<HTMLUListElement, ThreadProps>(function Thread(
|
|
150
|
+
{
|
|
151
|
+
maxDepth = DEFAULT_MAX_DEPTH,
|
|
152
|
+
compact = false,
|
|
153
|
+
nodeAlign = 'header',
|
|
154
|
+
className,
|
|
155
|
+
children,
|
|
156
|
+
...rest
|
|
157
|
+
},
|
|
158
|
+
ref,
|
|
159
|
+
) {
|
|
160
|
+
return (
|
|
161
|
+
<ul
|
|
162
|
+
ref={ref}
|
|
163
|
+
className={clsx(
|
|
164
|
+
styles.root,
|
|
165
|
+
compact && styles.compact,
|
|
166
|
+
nodeAlign === 'top' && styles.alignTop,
|
|
167
|
+
className,
|
|
168
|
+
)}
|
|
169
|
+
{...rest}
|
|
170
|
+
>
|
|
171
|
+
<ThreadContext.Provider value={{ depth: 0, maxDepth }}>{children}</ThreadContext.Provider>
|
|
172
|
+
</ul>
|
|
173
|
+
);
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
export const Thread = Object.assign(ThreadRoot, { Item: ThreadItem });
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
@use '../../styles/mixins' as *;
|
|
2
|
+
@use '../DatePicker/DatePicker.tokens';
|
|
3
|
+
|
|
4
|
+
// TimeField wrapper — text input + chevron toggle laid out in a row, with
|
|
5
|
+
// the same chrome (border, radius) as the library's <Input>. The wrapper
|
|
6
|
+
// IS the public element, so `inline-flex` + intrinsic width here is the
|
|
7
|
+
// component's own surface (not a Rule-4 violation: setting the box-model
|
|
8
|
+
// for an input-shaped field is the component's job, just like <Input>).
|
|
9
|
+
.timeField {
|
|
10
|
+
display: inline-flex;
|
|
11
|
+
align-items: center;
|
|
12
|
+
gap: var(--date-picker-time-field-gap);
|
|
13
|
+
width: var(--date-picker-time-field-width);
|
|
14
|
+
height: var(--date-picker-input-height-sm);
|
|
15
|
+
padding: 0 var(--date-picker-time-field-padding-x);
|
|
16
|
+
background: var(--date-picker-time-field-bg);
|
|
17
|
+
border: var(--border-width) solid var(--date-picker-time-field-border-color);
|
|
18
|
+
border-radius: var(--date-picker-time-field-radius);
|
|
19
|
+
transition: border-color var(--transition-fast);
|
|
20
|
+
|
|
21
|
+
&:focus-within {
|
|
22
|
+
@include focus-ring;
|
|
23
|
+
|
|
24
|
+
border-color: var(--date-picker-time-field-border-color-focus);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
.disabled {
|
|
29
|
+
opacity: var(--opacity-disabled);
|
|
30
|
+
cursor: not-allowed;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// Bare input — relies on the wrapper for chrome. `flex: 1` is the same
|
|
34
|
+
// Rule-4 escape hatch used by `<Input>` and `<DatePicker>`: the wrapper
|
|
35
|
+
// IS the public component, and the input must fill the remaining inline
|
|
36
|
+
// space alongside the chevron.
|
|
37
|
+
.timeInputCore {
|
|
38
|
+
flex: 1 1 auto;
|
|
39
|
+
min-width: 0;
|
|
40
|
+
padding: 0;
|
|
41
|
+
background: transparent;
|
|
42
|
+
border: none;
|
|
43
|
+
outline: none;
|
|
44
|
+
font: inherit;
|
|
45
|
+
font-size: var(--date-picker-input-font-size-sm);
|
|
46
|
+
color: var(--color-fg);
|
|
47
|
+
|
|
48
|
+
&::placeholder {
|
|
49
|
+
color: var(--date-picker-input-placeholder-fg);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
&:disabled {
|
|
53
|
+
cursor: not-allowed;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Chevron toggle — small ghost button matching the picker's clear/open buttons.
|
|
58
|
+
.timeToggle {
|
|
59
|
+
flex-shrink: 0;
|
|
60
|
+
display: inline-flex;
|
|
61
|
+
align-items: center;
|
|
62
|
+
justify-content: center;
|
|
63
|
+
width: var(--date-picker-time-toggle-size);
|
|
64
|
+
height: var(--date-picker-time-toggle-size);
|
|
65
|
+
padding: 0;
|
|
66
|
+
background: transparent;
|
|
67
|
+
border: none;
|
|
68
|
+
border-radius: var(--date-picker-time-toggle-radius);
|
|
69
|
+
color: var(--date-picker-time-toggle-fg);
|
|
70
|
+
cursor: pointer;
|
|
71
|
+
|
|
72
|
+
&:hover:not(:disabled) {
|
|
73
|
+
background: var(--date-picker-time-toggle-bg-hover);
|
|
74
|
+
color: var(--date-picker-time-toggle-fg-hover);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
&:focus-visible {
|
|
78
|
+
@include focus-ring;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
&:disabled {
|
|
82
|
+
cursor: not-allowed;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// Portaled popover — same z + shadow as the calendar popover, slightly
|
|
87
|
+
// tighter padding because the rows are small.
|
|
88
|
+
.timePopover {
|
|
89
|
+
z-index: var(--date-picker-time-popover-z);
|
|
90
|
+
background: var(--date-picker-time-popover-bg);
|
|
91
|
+
border: var(--border-width) solid var(--date-picker-time-popover-border-color);
|
|
92
|
+
border-radius: var(--date-picker-time-popover-radius);
|
|
93
|
+
box-shadow: var(--date-picker-time-popover-shadow);
|
|
94
|
+
padding: var(--date-picker-time-popover-padding);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
.timePopover[data-in-overlay] {
|
|
98
|
+
// #272: inside a Modal/Drawer (or another elevated surface) the base
|
|
99
|
+
// z-index sits below --z-modal — elevate above the host, below toasts.
|
|
100
|
+
z-index: var(--z-overlay-floating);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// #685: the tour's current target is INSIDE this surface — drop just under the
|
|
104
|
+
// scrim (--z-tour) so only the target is lit, not the whole panel.
|
|
105
|
+
.timePopover[data-in-overlay]:has([data-tour-current-target]) {
|
|
106
|
+
z-index: calc(var(--z-tour) - 1);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// Two-column layout for the hour + minute lists, with a thin divider.
|
|
110
|
+
.timeColumns {
|
|
111
|
+
display: flex;
|
|
112
|
+
align-items: stretch;
|
|
113
|
+
gap: var(--date-picker-time-popover-gap);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// Reset list defaults. The global reset (`* { margin: 0 }`) zeroes the UA
|
|
117
|
+
// `<ul>` margin so we don't need an explicit `margin` rule here — which is
|
|
118
|
+
// also forbidden by Hard Rule 4.
|
|
119
|
+
.timeColumn {
|
|
120
|
+
list-style: none;
|
|
121
|
+
padding: 0;
|
|
122
|
+
width: var(--date-picker-time-popover-column-width);
|
|
123
|
+
max-height: var(--date-picker-time-popover-max-height);
|
|
124
|
+
overflow-y: auto;
|
|
125
|
+
|
|
126
|
+
// Y scrolls, X clips. Declaring only `overflow-y` leaves X at `visible`,
|
|
127
|
+
// which the spec computes to `auto` — making a 4rem listbox column
|
|
128
|
+
// horizontally scrollable. Same fix `Rail.body` and `DropdownMenu.content`
|
|
129
|
+
// carry. Nothing overflows today; this keeps it that way if the column token
|
|
130
|
+
// shrinks or rows grow (#375).
|
|
131
|
+
overflow-x: hidden;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
.timeColumnDivider {
|
|
135
|
+
width: var(--border-width);
|
|
136
|
+
background: var(--date-picker-time-popover-divider-color);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// Each list item IS the option (WAI-ARIA APG listbox pattern: no nested
|
|
140
|
+
// button). The `<li>` carries the hover / current-state styling, the
|
|
141
|
+
// click handler, and the keyboard handler — same chrome that used to
|
|
142
|
+
// live on the inner `<button>`.
|
|
143
|
+
.timeRow {
|
|
144
|
+
display: flex;
|
|
145
|
+
align-items: center;
|
|
146
|
+
justify-content: space-between;
|
|
147
|
+
gap: var(--space-1);
|
|
148
|
+
width: 100%;
|
|
149
|
+
height: var(--date-picker-time-popover-row-height);
|
|
150
|
+
padding: 0 var(--date-picker-time-popover-row-padding-x);
|
|
151
|
+
border-radius: var(--date-picker-time-popover-row-radius);
|
|
152
|
+
color: var(--date-picker-time-popover-row-fg);
|
|
153
|
+
font-size: var(--date-picker-time-popover-row-font-size);
|
|
154
|
+
cursor: pointer;
|
|
155
|
+
user-select: none;
|
|
156
|
+
text-align: left;
|
|
157
|
+
|
|
158
|
+
&:hover {
|
|
159
|
+
background: var(--date-picker-time-popover-row-hover-bg);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// INSET. `.timeColumn` above is `overflow-x: hidden`, and this row is
|
|
163
|
+
// `width: 100%`, so an outset ring puts both vertical bands outside the
|
|
164
|
+
// scrollport on every option — always, not at some size. Same signature as
|
|
165
|
+
// Tabs (#505); found by a browser sweep, not by any gate.
|
|
166
|
+
&:focus-visible {
|
|
167
|
+
@include focus-ring($offset: calc(-1 * var(--ring-offset)));
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
.timeRowCurrent {
|
|
172
|
+
background: var(--date-picker-time-popover-row-current-bg);
|
|
173
|
+
color: var(--date-picker-time-popover-row-current-fg);
|
|
174
|
+
|
|
175
|
+
&:hover {
|
|
176
|
+
background: var(--date-picker-time-popover-row-current-bg);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
.timeRowLabel {
|
|
181
|
+
font-variant-numeric: tabular-nums;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
.timeRowCheck {
|
|
185
|
+
flex-shrink: 0;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// Narrow column for the AM/PM listbox (12-hour cycle only) — two rows,
|
|
189
|
+
// no scrolling, slimmer than the hours/minutes columns to keep the
|
|
190
|
+
// popover compact.
|
|
191
|
+
.timeColumnPeriod {
|
|
192
|
+
width: var(--date-picker-time-period-column-width);
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
// Footer row below the listbox columns — hosts the "Now" quick-pick
|
|
196
|
+
// button. Border-top to visually separate from the rows above.
|
|
197
|
+
.timeFooter {
|
|
198
|
+
display: flex;
|
|
199
|
+
justify-content: flex-end;
|
|
200
|
+
padding: var(--date-picker-time-popover-footer-padding);
|
|
201
|
+
border-top: var(--border-width) solid var(--date-picker-time-popover-footer-border-color);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
// Text button with accent color — sits in the popover footer. Outside
|
|
205
|
+
// the roving-tabindex listbox set; reachable via natural Tab order.
|
|
206
|
+
.timeNowButton {
|
|
207
|
+
// stylelint-disable-next-line declaration-property-value-disallowed-list -- button reset
|
|
208
|
+
background: transparent;
|
|
209
|
+
// stylelint-disable-next-line declaration-property-value-disallowed-list -- button reset
|
|
210
|
+
border: 0;
|
|
211
|
+
color: var(--date-picker-time-now-button-fg);
|
|
212
|
+
cursor: pointer;
|
|
213
|
+
padding: var(--space-1) var(--space-2);
|
|
214
|
+
border-radius: var(--radius-sm);
|
|
215
|
+
font: inherit;
|
|
216
|
+
font-weight: var(--font-weight-medium);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
.timeNowButton:hover,
|
|
220
|
+
.timeNowButton:focus-visible {
|
|
221
|
+
background: var(--date-picker-time-now-button-bg-hover);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
.timeNowButton:focus-visible {
|
|
225
|
+
@include focus-ring($offset: 1px);
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
// Mirrors Input's invalid treatment so a TimeField inside a Field with an
|
|
229
|
+
// error reads the same as every other control (#494).
|
|
230
|
+
.timeField:has(input[aria-invalid='true']) {
|
|
231
|
+
border-color: var(--date-picker-time-field-border-color-invalid);
|
|
232
|
+
}
|