@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,124 @@
|
|
|
1
|
+
import { createContext, forwardRef, useContext, type HTMLAttributes, type ReactNode } from 'react';
|
|
2
|
+
import clsx from 'clsx';
|
|
3
|
+
import styles from './List.module.scss';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Marker style.
|
|
7
|
+
* - `'bullet'` (default) — a dot per item, rendered in a `<ul>`.
|
|
8
|
+
* - `'number'` — 1, 2, 3 per item, rendered in an `<ol>`.
|
|
9
|
+
*/
|
|
10
|
+
export type ListVariant = 'bullet' | 'number';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Space between items.
|
|
14
|
+
* - `'xs'` — `var(--space-1)`; dense reference lists.
|
|
15
|
+
* - `'sm'` — `var(--space-2)` (default); prose rhythm.
|
|
16
|
+
* - `'md'` — `var(--space-3)`; items that wrap to several lines.
|
|
17
|
+
*/
|
|
18
|
+
export type ListGap = 'xs' | 'sm' | 'md';
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* How `variant="number"` draws its numbers.
|
|
22
|
+
* - `'plain'` (default) — a muted figure.
|
|
23
|
+
* - `'badge'` — an accent badge for numbered steps: circular at body size, a rounded square at `size="heading"`. Ignored for bullets.
|
|
24
|
+
*/
|
|
25
|
+
export type ListNumberStyle = 'plain' | 'badge';
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Marker scale.
|
|
29
|
+
* - `'body'` (default) — marker sized to body text.
|
|
30
|
+
* - `'heading'` — marker sized and centred on the first line of a `Title size="xl"`; a badge becomes a rounded square.
|
|
31
|
+
*/
|
|
32
|
+
export type ListSize = 'body' | 'heading';
|
|
33
|
+
|
|
34
|
+
export interface ListProps extends HTMLAttributes<HTMLElement> {
|
|
35
|
+
/** Marker style. See `ListVariant`. Default `'bullet'`. */
|
|
36
|
+
variant?: ListVariant;
|
|
37
|
+
/** Space between items. See `ListGap`. Default `'sm'`. */
|
|
38
|
+
gap?: ListGap;
|
|
39
|
+
/** Marker scale; use `'heading'` when each item starts with a `Title size="xl"`. See `ListSize`. Default `'body'`. */
|
|
40
|
+
size?: ListSize;
|
|
41
|
+
/** Number look; only applies to `variant="number"`. See `ListNumberStyle`. Default `'plain'`. */
|
|
42
|
+
numberStyle?: ListNumberStyle;
|
|
43
|
+
/** `List.Item` elements. A nested `List` goes inside a `List.Item`. */
|
|
44
|
+
children?: ReactNode;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export interface ListItemProps extends HTMLAttributes<HTMLLIElement> {
|
|
48
|
+
/** Item content. Text, inline elements, or a nested `List`. */
|
|
49
|
+
children?: ReactNode;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
interface ListContext {
|
|
53
|
+
variant: ListVariant;
|
|
54
|
+
numberStyle: ListNumberStyle;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const Ctx = createContext<ListContext>({ variant: 'bullet', numberStyle: 'plain' });
|
|
58
|
+
const DepthCtx = createContext(0);
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Semantic bulleted or numbered list of prose items (`<ul>` / `<ol>` with `List.Item`).
|
|
62
|
+
* @see docs/components/List.md
|
|
63
|
+
*/
|
|
64
|
+
const ListRoot = forwardRef<HTMLElement, ListProps>(function ListRoot(
|
|
65
|
+
{
|
|
66
|
+
variant = 'bullet',
|
|
67
|
+
gap = 'sm',
|
|
68
|
+
size = 'body',
|
|
69
|
+
numberStyle = 'plain',
|
|
70
|
+
className,
|
|
71
|
+
children,
|
|
72
|
+
...rest
|
|
73
|
+
},
|
|
74
|
+
ref,
|
|
75
|
+
) {
|
|
76
|
+
const depth = useContext(DepthCtx);
|
|
77
|
+
const Tag = variant === 'number' ? 'ol' : 'ul';
|
|
78
|
+
return (
|
|
79
|
+
<DepthCtx.Provider value={depth + 1}>
|
|
80
|
+
<Ctx.Provider value={{ variant, numberStyle }}>
|
|
81
|
+
<Tag
|
|
82
|
+
ref={ref as never}
|
|
83
|
+
// Explicit role: Safari/VoiceOver drops list semantics under `list-style: none`.
|
|
84
|
+
role="list"
|
|
85
|
+
data-gap={gap}
|
|
86
|
+
data-variant={variant}
|
|
87
|
+
data-size={size}
|
|
88
|
+
data-nested={depth > 0 ? 'true' : undefined}
|
|
89
|
+
className={clsx(styles.list, className)}
|
|
90
|
+
// {...rest} last so consumer overrides win (Pattern A).
|
|
91
|
+
{...rest}
|
|
92
|
+
>
|
|
93
|
+
{children}
|
|
94
|
+
</Tag>
|
|
95
|
+
</Ctx.Provider>
|
|
96
|
+
</DepthCtx.Provider>
|
|
97
|
+
);
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
/** One list entry; the marker is drawn here and hidden from assistive tech. */
|
|
101
|
+
export const ListItem = forwardRef<HTMLLIElement, ListItemProps>(function ListItem(
|
|
102
|
+
{ className, children, ...rest },
|
|
103
|
+
ref,
|
|
104
|
+
) {
|
|
105
|
+
const { variant, numberStyle } = useContext(Ctx);
|
|
106
|
+
const inner =
|
|
107
|
+
variant === 'bullet' ? (
|
|
108
|
+
<span className={styles.bullet} />
|
|
109
|
+
) : (
|
|
110
|
+
// Number comes from a CSS counter on ::before, so it survives wrappers that render 0 or 2 items.
|
|
111
|
+
<span className={numberStyle === 'badge' ? styles.badge : styles.number} />
|
|
112
|
+
);
|
|
113
|
+
return (
|
|
114
|
+
<li ref={ref} className={clsx(styles.item, className)} {...rest}>
|
|
115
|
+
<span aria-hidden="true" className={styles.marker}>
|
|
116
|
+
{inner}
|
|
117
|
+
</span>
|
|
118
|
+
<div className={styles.content}>{children}</div>
|
|
119
|
+
</li>
|
|
120
|
+
);
|
|
121
|
+
});
|
|
122
|
+
ListItem.displayName = 'ListItem';
|
|
123
|
+
|
|
124
|
+
export const List = Object.assign(ListRoot, { Item: ListItem });
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { forwardRef, useEffect, useState, type HTMLAttributes, type ReactNode } from 'react';
|
|
2
|
+
import { VisuallyHidden } from '../VisuallyHidden';
|
|
3
|
+
|
|
4
|
+
/** How urgently the region interrupts the screen reader. See {@link LiveRegionProps.politeness}. */
|
|
5
|
+
export type LiveRegionPoliteness = 'polite' | 'assertive';
|
|
6
|
+
|
|
7
|
+
export interface LiveRegionProps extends Omit<
|
|
8
|
+
HTMLAttributes<HTMLSpanElement>,
|
|
9
|
+
'children' | 'role' | 'aria-live' | 'aria-atomic' | 'hidden' | 'aria-hidden'
|
|
10
|
+
> {
|
|
11
|
+
/**
|
|
12
|
+
* The message. Pass a string, a number, or an array of only strings/
|
|
13
|
+
* numbers (e.g. `[count, ' files uploaded']`) — these compare by value, so
|
|
14
|
+
* an unchanged value does not re-announce and a changed one does. Anything
|
|
15
|
+
* else (JSX elements) compares by identity and re-announces on every
|
|
16
|
+
* parent render, even when the rendered text is unchanged. Empty, `null`,
|
|
17
|
+
* or `false` clears the region and announces nothing.
|
|
18
|
+
*/
|
|
19
|
+
children?: ReactNode;
|
|
20
|
+
/**
|
|
21
|
+
* How urgently the region interrupts.
|
|
22
|
+
* - `'polite'` (default) — `role="status"` + `aria-live="polite"`. Waits
|
|
23
|
+
* for the screen reader to finish its current utterance. Use for routine
|
|
24
|
+
* outcomes: saves, copy confirmations, background updates.
|
|
25
|
+
* - `'assertive'` — `role="alert"` + `aria-live="assertive"`. Interrupts
|
|
26
|
+
* immediately. Reserve for errors that need immediate attention.
|
|
27
|
+
*
|
|
28
|
+
* Change politeness in the SAME render as the message
|
|
29
|
+
* (`politeness={error ? 'assertive' : 'polite'}` next to `{error ?? status}`):
|
|
30
|
+
* the role only flips while the region is empty, so the old text is never
|
|
31
|
+
* announced at the new urgency. A politeness-only change re-announces the
|
|
32
|
+
* current text at the new urgency.
|
|
33
|
+
* @default 'polite'
|
|
34
|
+
*/
|
|
35
|
+
politeness?: LiveRegionPoliteness;
|
|
36
|
+
/**
|
|
37
|
+
* Change this (e.g. a counter) to announce the same message again. Without
|
|
38
|
+
* it, re-rendering with identical text is a no-op — screen readers only
|
|
39
|
+
* announce a live region on a text change.
|
|
40
|
+
*/
|
|
41
|
+
announceKey?: string | number;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const ANNOUNCE_DELAY_MS = 50;
|
|
45
|
+
|
|
46
|
+
/** `true` if every element of `arr` is a string or number, so it can be joined into one comparison value. */
|
|
47
|
+
function isPrimitiveArray(arr: unknown[]): arr is Array<string | number> {
|
|
48
|
+
return arr.every((item) => typeof item === 'string' || typeof item === 'number');
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* The value used both as the effect dependency (change detection) and as
|
|
53
|
+
* the content written to the region. Strings/numbers compare by value.
|
|
54
|
+
* Arrays of only strings/numbers (e.g. `[count, ' files uploaded']`) are
|
|
55
|
+
* joined into one string so identical content doesn't re-announce merely
|
|
56
|
+
* because a new array literal was passed. Anything else (elements, mixed
|
|
57
|
+
* arrays) is returned as-is and compared by identity.
|
|
58
|
+
*/
|
|
59
|
+
function toMessage(children: ReactNode): ReactNode {
|
|
60
|
+
if (typeof children === 'string' || typeof children === 'number') {
|
|
61
|
+
return String(children);
|
|
62
|
+
}
|
|
63
|
+
if (Array.isArray(children) && isPrimitiveArray(children)) {
|
|
64
|
+
return children.join('');
|
|
65
|
+
}
|
|
66
|
+
return children;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* A visually-hidden, always-mounted `role="status"`/`role="alert"` announcement region for consumer-level outcomes with no visible text.
|
|
71
|
+
* @see docs/components/LiveRegion.md
|
|
72
|
+
*/
|
|
73
|
+
export const LiveRegion = forwardRef<HTMLSpanElement, LiveRegionProps>(function LiveRegion(
|
|
74
|
+
{ children, politeness = 'polite', announceKey, ...props },
|
|
75
|
+
ref,
|
|
76
|
+
) {
|
|
77
|
+
const [shown, setShown] = useState<ReactNode>(null);
|
|
78
|
+
// The politeness actually on the DOM. It only changes in the same state
|
|
79
|
+
// update that empties the region, so role / aria-live never flip on a region
|
|
80
|
+
// still holding the OLD text (`politeness={error ? 'assertive' : 'polite'}`
|
|
81
|
+
// would otherwise re-announce the stale message as an alert).
|
|
82
|
+
const [applied, setApplied] = useState<LiveRegionPoliteness>(politeness);
|
|
83
|
+
const message = toMessage(children);
|
|
84
|
+
|
|
85
|
+
useEffect(() => {
|
|
86
|
+
// Clear, then write in a later tick: the region goes empty → text, which
|
|
87
|
+
// screen readers treat as a fresh change — that is what makes a mount-
|
|
88
|
+
// with-message and an identical re-announce (announceKey) both fire.
|
|
89
|
+
// `message` is captured from this effect's own render closure, not a
|
|
90
|
+
// ref written during render, so a discarded/re-run render (StrictMode,
|
|
91
|
+
// concurrent features) can never write stale content.
|
|
92
|
+
setShown(null);
|
|
93
|
+
setApplied(politeness);
|
|
94
|
+
const id = setTimeout(() => setShown(message), ANNOUNCE_DELAY_MS);
|
|
95
|
+
return () => clearTimeout(id);
|
|
96
|
+
}, [message, announceKey, politeness]);
|
|
97
|
+
|
|
98
|
+
// {...props} first so role / aria-live / aria-atomic always win (Pattern
|
|
99
|
+
// B) — including against `hidden` / `aria-hidden` arriving through an
|
|
100
|
+
// untyped spread (the props type omits them, but a caller can still
|
|
101
|
+
// forward them via `{...someUntypedRest}`; either would silence the
|
|
102
|
+
// region, so both are force-cleared here too).
|
|
103
|
+
return (
|
|
104
|
+
<VisuallyHidden
|
|
105
|
+
{...props}
|
|
106
|
+
ref={ref}
|
|
107
|
+
role={applied === 'assertive' ? 'alert' : 'status'}
|
|
108
|
+
aria-live={applied}
|
|
109
|
+
aria-atomic="true"
|
|
110
|
+
hidden={undefined}
|
|
111
|
+
aria-hidden={undefined}
|
|
112
|
+
>
|
|
113
|
+
{shown}
|
|
114
|
+
</VisuallyHidden>
|
|
115
|
+
);
|
|
116
|
+
});
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
@use './Logo.tokens';
|
|
2
|
+
|
|
3
|
+
.logo {
|
|
4
|
+
display: inline-flex;
|
|
5
|
+
align-items: center;
|
|
6
|
+
gap: var(--logo-gap);
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
.bottom {
|
|
10
|
+
flex-direction: column;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
.mark {
|
|
14
|
+
flex-shrink: 0;
|
|
15
|
+
object-fit: contain;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
.text {
|
|
19
|
+
color: var(--color-fg);
|
|
20
|
+
|
|
21
|
+
// Wordmark font/weight — overridable via --logo-text-font / --logo-text-font-weight.
|
|
22
|
+
// Read with fallbacks (NOT declared as a :root default) so a consumer's :root
|
|
23
|
+
// override always wins, regardless of when this component CSS is injected.
|
|
24
|
+
font-family: var(--logo-text-font, inherit);
|
|
25
|
+
font-weight: var(--logo-text-font-weight, var(--font-weight-bold));
|
|
26
|
+
line-height: 1.1;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
.textBlock {
|
|
30
|
+
display: flex;
|
|
31
|
+
flex-direction: column;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
.subtext {
|
|
35
|
+
color: var(--color-fg-muted);
|
|
36
|
+
font-size: var(--font-size-xs);
|
|
37
|
+
line-height: 1.2;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// Optical alignment. Half-leading makes a wordmark's *box* taller than its
|
|
41
|
+
// glyphs, so a lockup centered on the box reads as sitting low next to the mark.
|
|
42
|
+
// text-box-trim removes that leading and aligns to the real cap/x-height edges,
|
|
43
|
+
// which lets the block collapse to line-height: 1 and the mark↔wordmark gap
|
|
44
|
+
// become an exact token value.
|
|
45
|
+
// Gated because Firefox ships neither property (as of 2026-08). Ungated, the
|
|
46
|
+
// declarations would drop but `line-height: 1` would stick, collapsing the line
|
|
47
|
+
// box to exactly the font size — ascenders and descenders would then overflow
|
|
48
|
+
// and get clipped by Rail.Header's `overflow: hidden`. Keeping the whole block
|
|
49
|
+
// behind @supports means non-supporting browsers render byte-identically to the
|
|
50
|
+
// pre-trim lockup: looser, never clipped.
|
|
51
|
+
@supports (text-box-trim: trim-both) {
|
|
52
|
+
.text {
|
|
53
|
+
line-height: 1;
|
|
54
|
+
text-box-trim: trim-both;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Trim to the cap edge by default, to the x-height edge for a wordmark whose
|
|
58
|
+
// glyphs all top out at x-height — see getTextMetric() in Logo.tsx for which
|
|
59
|
+
// is which, and why neither edge is an ink-tight guarantee.
|
|
60
|
+
.textCap {
|
|
61
|
+
text-box-edge: cap alphabetic;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
.textEx {
|
|
65
|
+
text-box-edge: ex alphabetic;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// Trimmed edges leave the wordmark and subtext touching, so the gap that was
|
|
69
|
+
// previously supplied by leading now has to be declared.
|
|
70
|
+
.textBlock {
|
|
71
|
+
gap: var(--logo-text-gap);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// A wordmark with a subtext under it needs its descenders inside its own box.
|
|
75
|
+
// The `alphabetic` under-edge stops at the baseline, so descender ink hangs
|
|
76
|
+
// outside the box and eats into the gap below it — `paygo` in Outfit measures
|
|
77
|
+
// 3.5 / 4.4 / 5.25px of overhang at sm/md/lg against a flat 4px gap, so the
|
|
78
|
+
// tails already cross into the subtext at md, not just at lg. `text` puts the
|
|
79
|
+
// under-edge at the font's descent instead, so --logo-text-gap is real
|
|
80
|
+
// whitespace at every size.
|
|
81
|
+
// Scoped to the subtext case: on its own the wordmark should still sit on its
|
|
82
|
+
// baseline so it optically centers against the mark.
|
|
83
|
+
.textCap:has(+ .subtext) {
|
|
84
|
+
text-box-edge: cap text;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
.textEx:has(+ .subtext) {
|
|
88
|
+
text-box-edge: ex text;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Always cap, never ex: a subtext is sentence-case far more often than not
|
|
92
|
+
// ("Free trial", "Pro (yearly)"), and trimming those to the x-height edge
|
|
93
|
+
// would put the capital's ink outside the box and pull the line up into the
|
|
94
|
+
// wordmark's descenders.
|
|
95
|
+
// The under-edge stays `alphabetic` (not `text` like the wordmark's): the
|
|
96
|
+
// subtext is the last line, so nothing below needs clearing, and a descent-
|
|
97
|
+
// deep box would just pad the lockup. The trade is that a subtext WITH
|
|
98
|
+
// descenders puts ~2px of ink below the lockup's own bottom edge at sm (its
|
|
99
|
+
// worst case — at md/lg the taller mark absorbs it). That sits inside
|
|
100
|
+
// Rail.Header's bottom padding, but a consumer clipping a box sized exactly to
|
|
101
|
+
// the lockup would shave those tails.
|
|
102
|
+
.subtext {
|
|
103
|
+
line-height: 1;
|
|
104
|
+
text-box-trim: trim-both;
|
|
105
|
+
text-box-edge: cap alphabetic;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
.bottom .textBlock {
|
|
110
|
+
align-items: center;
|
|
111
|
+
text-align: center;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
.sizeSm .mark {
|
|
115
|
+
width: var(--size-sm);
|
|
116
|
+
height: var(--size-sm);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
.sizeSm .text {
|
|
120
|
+
font-size: var(--font-size-lg);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
.sizeMd .mark {
|
|
124
|
+
width: var(--size-md);
|
|
125
|
+
height: var(--size-md);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
.sizeMd .text {
|
|
129
|
+
font-size: var(--font-size-xl);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
.sizeLg .mark {
|
|
133
|
+
width: var(--size-lg);
|
|
134
|
+
height: var(--size-lg);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
.sizeLg .text {
|
|
138
|
+
font-size: var(--font-size-2xl);
|
|
139
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
:root {
|
|
2
|
+
// Gap between the mark and the wordmark.
|
|
3
|
+
--logo-gap: var(--space-2);
|
|
4
|
+
|
|
5
|
+
// Gap between the wordmark and the subtext. Only applies where text-box-trim
|
|
6
|
+
// is supported — without it the leading already supplies the separation.
|
|
7
|
+
--logo-text-gap: var(--space-1);
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
// Wordmark typography is overridable via --logo-text-font / --logo-text-font-weight
|
|
11
|
+
// to set a brand font/weight for the wordmark `text` (the mark is an image; the
|
|
12
|
+
// `subtext` is NOT affected). These are intentionally read with fallbacks in
|
|
13
|
+
// Logo.module.scss rather than declared at :root here — so a consumer's :root
|
|
14
|
+
// override wins regardless of CSS injection order. Defaults: inherited font, bold.
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { forwardRef, type HTMLAttributes, type ReactNode } from 'react';
|
|
2
|
+
import clsx from 'clsx';
|
|
3
|
+
import styles from './Logo.module.scss';
|
|
4
|
+
|
|
5
|
+
/** Mark size — `sm` (24) / `md` (32, default) / `lg` (40); the shared `--size-*` scale. */
|
|
6
|
+
export type LogoSize = 'sm' | 'md' | 'lg';
|
|
7
|
+
|
|
8
|
+
/** Where the wordmark sits relative to the mark. */
|
|
9
|
+
export type LogoTextPlacement = 'end' | 'bottom';
|
|
10
|
+
|
|
11
|
+
export interface LogoProps extends HTMLAttributes<HTMLDivElement> {
|
|
12
|
+
/**
|
|
13
|
+
* The brand mark image URL — typically an imported SVG/PNG asset. The mark is
|
|
14
|
+
* a **consumer-owned asset**; the design system ships no logo of its own.
|
|
15
|
+
* Rendered as an `<img>` (`object-fit: contain`) with no CSS recolor — the
|
|
16
|
+
* asset carries its own color. For third-party SSO marks use `<BrandIcon>`.
|
|
17
|
+
*/
|
|
18
|
+
src: string;
|
|
19
|
+
/**
|
|
20
|
+
* Wordmark rendered beside (or below) the mark — consumers pass `"eocrm"`.
|
|
21
|
+
* Omit for a mark-only logo.
|
|
22
|
+
*/
|
|
23
|
+
text?: ReactNode;
|
|
24
|
+
/**
|
|
25
|
+
* Where the wordmark sits relative to the mark. Defaults to `'end'` (beside);
|
|
26
|
+
* `'bottom'` stacks it under the mark, centered.
|
|
27
|
+
*/
|
|
28
|
+
textPlacement?: LogoTextPlacement;
|
|
29
|
+
/** Mark size — `'sm'` (24) / `'md'` (32, default) / `'lg'` (40). */
|
|
30
|
+
size?: LogoSize;
|
|
31
|
+
/**
|
|
32
|
+
* Accessible name for the mark when there's no `text` (used as the image
|
|
33
|
+
* `alt`). Omit for a decorative mark (`alt=""`), or when `text` is present
|
|
34
|
+
* (the wordmark is the name). Never pass both `text` and `label`.
|
|
35
|
+
*/
|
|
36
|
+
label?: string;
|
|
37
|
+
/**
|
|
38
|
+
* Small, muted secondary line rendered under `text` — e.g. a plan or tagline
|
|
39
|
+
* (`subtext="Free trial"`). Only shown when `text` is present.
|
|
40
|
+
*/
|
|
41
|
+
subtext?: ReactNode;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const sizeClass: Record<LogoSize, string> = {
|
|
45
|
+
sm: styles.sizeSm,
|
|
46
|
+
md: styles.sizeMd,
|
|
47
|
+
lg: styles.sizeLg,
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Latin lowercase letters that top out at x-height, plus separators that never
|
|
52
|
+
* rise above it (`.` sits on the baseline, `,` hangs below it, `-` is
|
|
53
|
+
* mid-x-height, space has no ink). Deliberately an allowlist rather than "no
|
|
54
|
+
* uppercase": the ascenders
|
|
55
|
+
* (`b d f h k l t`), the dotted `i`/`j`, digits, and every non-Latin script
|
|
56
|
+
* reach well above x-height. Descenders (`g p q y`) are in the set — the
|
|
57
|
+
* under-edge is the same in both branches, so they're unaffected by the choice.
|
|
58
|
+
*
|
|
59
|
+
* "Tops out at x-height" is the type designer's line, not a pixel guarantee: the
|
|
60
|
+
* round letters (`a c e o s`) overshoot it by ~1% of em in most faces, `eocrm`
|
|
61
|
+
* included. That overshoot is inherent to `ex` and far too small to read as
|
|
62
|
+
* misalignment; it's the ascender-sized differences this list exists to catch.
|
|
63
|
+
*
|
|
64
|
+
* The lookahead requires at least one letter, so a whitespace- or
|
|
65
|
+
* punctuation-only wordmark doesn't qualify on a technicality.
|
|
66
|
+
*/
|
|
67
|
+
const X_HEIGHT_ONLY = /^(?=.*[acemnopqrsuvwxyzg])[acemnopqrsuvwxyzg\s\-.,]+$/;
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Which edge the wordmark's text box should be trimmed to. `ex` pulls the box
|
|
71
|
+
* down to the x-height so an all-lowercase wordmark optically centers against
|
|
72
|
+
* the mark; `cap` is the conservative choice everywhere else.
|
|
73
|
+
*
|
|
74
|
+
* Note `cap` is not an ink-tight guarantee either — in most text faces the
|
|
75
|
+
* ascender sits slightly above cap height, and diacritics (`É`, `Å`, `Й`) sit
|
|
76
|
+
* above both. Neither clips: `text-box-trim` resizes the box, it does not crop
|
|
77
|
+
* what overflows it. The choice is about where the lockup's optical centre
|
|
78
|
+
* lands, and `cap` errs toward leaving headroom rather than removing too much.
|
|
79
|
+
*/
|
|
80
|
+
function getTextMetric(text: ReactNode): 'cap' | 'ex' {
|
|
81
|
+
// A non-string wordmark (an element, a fragment) has no inspectable glyphs,
|
|
82
|
+
// so fall back to the conservative edge.
|
|
83
|
+
if (typeof text !== 'string') {
|
|
84
|
+
return 'cap';
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
return X_HEIGHT_ONLY.test(text) ? 'ex' : 'cap';
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Brand logo lockup: a consumer-supplied mark image, optionally with a wordmark beside or below and a muted subline.
|
|
92
|
+
* @see docs/components/Logo.md
|
|
93
|
+
*/
|
|
94
|
+
export const Logo = forwardRef<HTMLDivElement, LogoProps>(function Logo(
|
|
95
|
+
{ src, text, subtext, textPlacement = 'end', size = 'md', label, className, ...props },
|
|
96
|
+
ref,
|
|
97
|
+
) {
|
|
98
|
+
// With `text`, the wordmark conveys the name → the mark is decorative (alt="").
|
|
99
|
+
// Mark-only → `label` is the accessible name; absent → decorative.
|
|
100
|
+
const alt = text == null && label ? label : '';
|
|
101
|
+
const textMetric = getTextMetric(text);
|
|
102
|
+
|
|
103
|
+
return (
|
|
104
|
+
// Pattern A — props last: Logo is consumer-overridable brand chrome.
|
|
105
|
+
<div
|
|
106
|
+
ref={ref}
|
|
107
|
+
className={clsx(
|
|
108
|
+
styles.logo,
|
|
109
|
+
sizeClass[size],
|
|
110
|
+
textPlacement === 'bottom' && styles.bottom,
|
|
111
|
+
className,
|
|
112
|
+
)}
|
|
113
|
+
{...props}
|
|
114
|
+
>
|
|
115
|
+
<img className={styles.mark} src={src} alt={alt} />
|
|
116
|
+
{text != null && (
|
|
117
|
+
<span className={styles.textBlock}>
|
|
118
|
+
<span className={clsx(styles.text, textMetric === 'ex' ? styles.textEx : styles.textCap)}>
|
|
119
|
+
{text}
|
|
120
|
+
</span>
|
|
121
|
+
{subtext != null && <span className={styles.subtext}>{subtext}</span>}
|
|
122
|
+
</span>
|
|
123
|
+
)}
|
|
124
|
+
</div>
|
|
125
|
+
);
|
|
126
|
+
});
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
@use './Masonry.tokens';
|
|
2
|
+
|
|
3
|
+
.masonry {
|
|
4
|
+
display: flex;
|
|
5
|
+
align-items: flex-start;
|
|
6
|
+
width: 100%;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
.column {
|
|
10
|
+
display: flex;
|
|
11
|
+
flex-direction: column;
|
|
12
|
+
flex: 1 1 0;
|
|
13
|
+
min-width: 0;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
.cell {
|
|
17
|
+
width: 100%;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
.gapXs {
|
|
21
|
+
gap: var(--masonry-gap-xs);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
.gapSm {
|
|
25
|
+
gap: var(--masonry-gap-sm);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
.gapMd {
|
|
29
|
+
gap: var(--masonry-gap-md);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
.gapLg {
|
|
33
|
+
gap: var(--masonry-gap-lg);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
.gapXl {
|
|
37
|
+
gap: var(--masonry-gap-xl);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
.gap2xl {
|
|
41
|
+
gap: var(--masonry-gap-2xl);
|
|
42
|
+
}
|