@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,55 @@
|
|
|
1
|
+
// Text.tokens.scss — Component-scoped tokens for <Text>. Base block, the
|
|
2
|
+
// per-size font-size scale (xs/sm/md/lg/xl), per-weight (regular / medium /
|
|
3
|
+
// semibold / bold), and per-tone foregrounds (default / muted / subtle /
|
|
4
|
+
// accent / danger / success / warning). --font-family-sans is not tokenized
|
|
5
|
+
// per migration rules.
|
|
6
|
+
:root {
|
|
7
|
+
// Base
|
|
8
|
+
--text-font-weight: var(--font-weight-regular);
|
|
9
|
+
--text-line-height: var(--line-height-normal);
|
|
10
|
+
--text-fg: var(--color-fg);
|
|
11
|
+
|
|
12
|
+
// Size scale
|
|
13
|
+
--text-font-size-xs: var(--font-size-xs);
|
|
14
|
+
--text-font-size-sm: var(--font-size-sm);
|
|
15
|
+
--text-font-size-md: var(--font-size-md);
|
|
16
|
+
--text-font-size-lg: var(--font-size-lg);
|
|
17
|
+
--text-font-size-xl: var(--font-size-xl);
|
|
18
|
+
|
|
19
|
+
// Weight scale
|
|
20
|
+
--text-font-weight-regular: var(--font-weight-regular);
|
|
21
|
+
--text-font-weight-medium: var(--font-weight-medium);
|
|
22
|
+
--text-font-weight-semibold: var(--font-weight-semibold);
|
|
23
|
+
--text-font-weight-bold: var(--font-weight-bold);
|
|
24
|
+
|
|
25
|
+
// Tone foregrounds
|
|
26
|
+
--text-fg-default: var(--color-fg);
|
|
27
|
+
--text-fg-muted: var(--color-fg-muted);
|
|
28
|
+
|
|
29
|
+
// DEPRECATED (#521). tone="subtle" resolves to the muted treatment: OKLab dE
|
|
30
|
+
// between --color-fg-subtle and --color-fg-muted measured 0.0261 in light
|
|
31
|
+
// (0.0365 once #522 retuned --color-fg-muted, still barely over half the
|
|
32
|
+
// 0.065 floor this repo's perceptual gates use), so the library had been
|
|
33
|
+
// shipping one visible tier under two names. Dark (0.0707) still read as a
|
|
34
|
+
// step -- above this repo's own 0.065 floor -- so collapsing the tone IS a
|
|
35
|
+
// visible change in dark: subtle text there gets lighter. That is the
|
|
36
|
+
// accepted trade, not a no-op, and the JSDoc says so; a tier that exists in
|
|
37
|
+
// one theme only is not a tier.
|
|
38
|
+
// The token is kept, and kept as its OWN declaration aliasing the muted one,
|
|
39
|
+
// rather than deleting it or pointing .toneSubtle at --text-fg-muted: it is a
|
|
40
|
+
// published theming surface (OptionsPicker used to re-point it, and consumers
|
|
41
|
+
// may), so collapsing it here keeps every existing override working while the
|
|
42
|
+
// default stops claiming a distinction nobody can see. --color-fg-subtle
|
|
43
|
+
// itself is untouched -- Input's placeholder, LiquidEditor and the scrollbar
|
|
44
|
+
// still use it directly, and retiring a primitive is a separate decision.
|
|
45
|
+
--text-fg-subtle: var(--text-fg-muted);
|
|
46
|
+
--text-fg-accent: var(--color-accent);
|
|
47
|
+
--text-fg-danger: var(--color-danger);
|
|
48
|
+
--text-fg-success: var(--color-success);
|
|
49
|
+
|
|
50
|
+
// @contrast --color-warning on --color-bg = 2.14:1 light
|
|
51
|
+
// @contrast --color-warning-strong on --color-bg = 5.95:1 light
|
|
52
|
+
// warning uses --color-warning-strong; the bare --color-warning measures 2.14:1 here, below
|
|
53
|
+
// WCAG AA for text and below 1.4.11's 3:1 for a graphical object. See #481.
|
|
54
|
+
--text-fg-warning: var(--color-warning-strong);
|
|
55
|
+
}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
import { forwardRef, type CSSProperties, type HTMLAttributes, type ReactNode } from 'react';
|
|
2
|
+
import clsx from 'clsx';
|
|
3
|
+
import styles from './Text.module.scss';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Rendered element. Constrained to a small string union (not polymorphic).
|
|
7
|
+
* If you need to render Text as a router-aware link or a custom element, use
|
|
8
|
+
* `<Link>` (polymorphic via `as`) or `<Text as="span">` + your own wrapper —
|
|
9
|
+
* not a generic Text.
|
|
10
|
+
*/
|
|
11
|
+
export type TextAs = 'p' | 'span' | 'div' | 'label';
|
|
12
|
+
|
|
13
|
+
/** Visual size. `'inherit'` takes font-size and line-height from the parent (inline runs inside headings). */
|
|
14
|
+
export type TextSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'inherit';
|
|
15
|
+
|
|
16
|
+
/** Color tone. `'subtle'` is deprecated and resolves to `'muted'` — see {@link TextProps.tone}. */
|
|
17
|
+
export type TextTone =
|
|
18
|
+
| 'default'
|
|
19
|
+
| 'muted'
|
|
20
|
+
/** @deprecated Resolves to `muted` (#521) — changes dark-theme appearance. Use `muted`. */
|
|
21
|
+
| 'subtle'
|
|
22
|
+
| 'accent'
|
|
23
|
+
| 'danger'
|
|
24
|
+
| 'success'
|
|
25
|
+
| 'warning';
|
|
26
|
+
|
|
27
|
+
/** Font weight. */
|
|
28
|
+
export type TextWeight = 'regular' | 'medium' | 'semibold' | 'bold';
|
|
29
|
+
|
|
30
|
+
/** Text alignment. */
|
|
31
|
+
export type TextAlign = 'left' | 'center' | 'right';
|
|
32
|
+
|
|
33
|
+
export interface TextProps extends HTMLAttributes<HTMLElement> {
|
|
34
|
+
/**
|
|
35
|
+
* Associates a `<label>` with its form control. Only meaningful when
|
|
36
|
+
* `as="label"` — passes through as the native `for` attribute.
|
|
37
|
+
*/
|
|
38
|
+
htmlFor?: string;
|
|
39
|
+
/**
|
|
40
|
+
* Rendered element. Defaults to `'p'` (block, default body text). Use
|
|
41
|
+
* `'span'` for inline runs, `'div'` for block containers that can't be a
|
|
42
|
+
* `<p>` (e.g. when the body needs nested block-level elements that React
|
|
43
|
+
* would warn about inside `<p>`), `'label'` for form labels (pair with
|
|
44
|
+
* `htmlFor`).
|
|
45
|
+
*/
|
|
46
|
+
as?: TextAs;
|
|
47
|
+
/**
|
|
48
|
+
* Visual size. Defaults to `'md'` (body text).
|
|
49
|
+
* - `xs` — 11px, dense metadata / captions
|
|
50
|
+
* - `sm` — 12px, small body / labels
|
|
51
|
+
* - `md` — 14px, body text (default)
|
|
52
|
+
* - `lg` — 16px, large body / lead text
|
|
53
|
+
* - `xl` — 20px, very large body (rare)
|
|
54
|
+
* - `inherit` — no fixed size; font-size AND line-height inherit from the
|
|
55
|
+
* parent. For inline runs inside a heading (`as="span"` inside a
|
|
56
|
+
* `<Title>` / `<PageHeader.Title>`) that must keep the heading's size —
|
|
57
|
+
* e.g. a muted task-key prefix. Tone / weight still apply — font-weight
|
|
58
|
+
* stays Text's own (default `regular`), it does NOT inherit; pass
|
|
59
|
+
* `weight` to match the heading if needed.
|
|
60
|
+
*/
|
|
61
|
+
size?: TextSize;
|
|
62
|
+
/**
|
|
63
|
+
* Color tone. Defaults to `'default'`.
|
|
64
|
+
* - `default` — `--color-fg`
|
|
65
|
+
* - `muted` — `--color-fg-muted` (for secondary copy)
|
|
66
|
+
* - `subtle` — **@deprecated (#521): resolves to `muted`. Use `muted`.**
|
|
67
|
+
* In LIGHT theme the two neutrals were indistinguishable: OKLab ΔE 0.0261
|
|
68
|
+
* when the deprecation was filed, 0.0365 after `--color-fg-muted` was retuned,
|
|
69
|
+
* against the 0.065 floor this library's perceptual gates use. In DARK
|
|
70
|
+
* they were 0.0707 apart — a real step — so **this deprecation changes
|
|
71
|
+
* dark-theme appearance**: `subtle` text in dark gets lighter, moving from
|
|
72
|
+
* `--color-fg-subtle` to `--color-fg-muted`. That is the accepted trade
|
|
73
|
+
* (a tier that exists in one theme only is not a tier), but it is a
|
|
74
|
+
* visual change, not the removal of a duplicate. `--text-fg-subtle` now
|
|
75
|
+
* aliases `--text-fg-muted`, so nothing breaks at the type or build level;
|
|
76
|
+
* if you need the old dark value back, override `--text-fg-subtle`.
|
|
77
|
+
* - `accent` — `--color-accent`
|
|
78
|
+
* - `danger` / `success` / `warning` — state-coded text
|
|
79
|
+
*/
|
|
80
|
+
tone?: TextTone;
|
|
81
|
+
/** Font weight. Defaults to `'regular'`. */
|
|
82
|
+
weight?: TextWeight;
|
|
83
|
+
/** Text alignment. Defaults to `'left'`. */
|
|
84
|
+
align?: TextAlign;
|
|
85
|
+
/**
|
|
86
|
+
* Truncate to a single line with ellipsis. Defaults to `false`. Use inside
|
|
87
|
+
* narrow containers (table cells, card list rows). Mutually exclusive with
|
|
88
|
+
* `lineClamp` — if both are set, `lineClamp` wins.
|
|
89
|
+
*/
|
|
90
|
+
truncate?: boolean;
|
|
91
|
+
/**
|
|
92
|
+
* Clamp to N lines with ellipsis (uses `-webkit-line-clamp`). Defaults to
|
|
93
|
+
* `undefined`. Overrides `truncate` when set. Example: `lineClamp={2}` for
|
|
94
|
+
* a 2-line description that ellipses on the third.
|
|
95
|
+
*
|
|
96
|
+
* If you also pass `style.WebkitLineClamp`, the `lineClamp` prop takes
|
|
97
|
+
* precedence — the component merges the dynamic line-clamp value into
|
|
98
|
+
* `style` AFTER spreading your `style`, so the prop wins.
|
|
99
|
+
*/
|
|
100
|
+
lineClamp?: number;
|
|
101
|
+
/** Text content. */
|
|
102
|
+
children: ReactNode;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
const SIZE_CLASS: Record<TextSize, string> = {
|
|
106
|
+
xs: styles.sizeXs,
|
|
107
|
+
sm: styles.sizeSm,
|
|
108
|
+
md: styles.sizeMd,
|
|
109
|
+
lg: styles.sizeLg,
|
|
110
|
+
xl: styles.sizeXl,
|
|
111
|
+
inherit: styles.sizeInherit,
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
const TONE_CLASS: Record<TextTone, string> = {
|
|
115
|
+
default: styles.toneDefault,
|
|
116
|
+
muted: styles.toneMuted,
|
|
117
|
+
subtle: styles.toneSubtle,
|
|
118
|
+
accent: styles.toneAccent,
|
|
119
|
+
danger: styles.toneDanger,
|
|
120
|
+
success: styles.toneSuccess,
|
|
121
|
+
warning: styles.toneWarning,
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
const WEIGHT_CLASS: Record<TextWeight, string> = {
|
|
125
|
+
regular: styles.weightRegular,
|
|
126
|
+
medium: styles.weightMedium,
|
|
127
|
+
semibold: styles.weightSemibold,
|
|
128
|
+
bold: styles.weightBold,
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
const ALIGN_CLASS: Record<TextAlign, string> = {
|
|
132
|
+
left: styles.alignLeft,
|
|
133
|
+
center: styles.alignCenter,
|
|
134
|
+
right: styles.alignRight,
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Body / inline text primitive for all non-heading text (`p`, `span`, `div` or `label`).
|
|
139
|
+
* @see docs/components/Text.md
|
|
140
|
+
*/
|
|
141
|
+
export const Text = forwardRef<HTMLElement, TextProps>(function Text(
|
|
142
|
+
{
|
|
143
|
+
as = 'p',
|
|
144
|
+
size = 'md',
|
|
145
|
+
tone = 'default',
|
|
146
|
+
weight = 'regular',
|
|
147
|
+
align = 'left',
|
|
148
|
+
truncate = false,
|
|
149
|
+
lineClamp,
|
|
150
|
+
className,
|
|
151
|
+
style,
|
|
152
|
+
children,
|
|
153
|
+
...rest
|
|
154
|
+
},
|
|
155
|
+
ref,
|
|
156
|
+
) {
|
|
157
|
+
const Component = as;
|
|
158
|
+
// lineClamp overrides truncate when both are set — lineClamp is strictly
|
|
159
|
+
// more expressive.
|
|
160
|
+
const useLineClamp = typeof lineClamp === 'number' && lineClamp > 0;
|
|
161
|
+
const useTruncate = !useLineClamp && truncate;
|
|
162
|
+
|
|
163
|
+
// lineClamp's `-webkit-line-clamp` is a dynamic value — set inline rather
|
|
164
|
+
// than generate one class per N. Merge with any consumer-provided style.
|
|
165
|
+
const mergedStyle: CSSProperties | undefined = useLineClamp
|
|
166
|
+
? { ...style, WebkitLineClamp: lineClamp }
|
|
167
|
+
: style;
|
|
168
|
+
|
|
169
|
+
// The rendered element type varies across the union, so the JSX ref slot
|
|
170
|
+
// expects an intersection of all four element ref types. We cast through
|
|
171
|
+
// unknown to satisfy it — the runtime type is always correct because
|
|
172
|
+
// Component is exactly `as`.
|
|
173
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
174
|
+
const domRef = ref as unknown as React.Ref<any>;
|
|
175
|
+
|
|
176
|
+
// className merged above via clsx so consumer extensions stack with our classes;
|
|
177
|
+
// {...rest} last so any other consumer-passed attr can override ours (Pattern A).
|
|
178
|
+
return (
|
|
179
|
+
<Component
|
|
180
|
+
ref={domRef}
|
|
181
|
+
className={clsx(
|
|
182
|
+
styles.text,
|
|
183
|
+
SIZE_CLASS[size],
|
|
184
|
+
TONE_CLASS[tone],
|
|
185
|
+
WEIGHT_CLASS[weight],
|
|
186
|
+
ALIGN_CLASS[align],
|
|
187
|
+
useTruncate && styles.truncate,
|
|
188
|
+
useLineClamp && styles.lineClamp,
|
|
189
|
+
className,
|
|
190
|
+
)}
|
|
191
|
+
style={mergedStyle}
|
|
192
|
+
{...rest}
|
|
193
|
+
>
|
|
194
|
+
{children}
|
|
195
|
+
</Component>
|
|
196
|
+
);
|
|
197
|
+
});
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
@use '../../styles/mixins' as *;
|
|
2
|
+
@use './Textarea.tokens';
|
|
3
|
+
|
|
4
|
+
.wrapper {
|
|
5
|
+
width: 100%;
|
|
6
|
+
display: block;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
.textarea {
|
|
10
|
+
display: block;
|
|
11
|
+
width: 100%;
|
|
12
|
+
border: var(--border-width) solid var(--textarea-border-color);
|
|
13
|
+
border-radius: var(--textarea-radius);
|
|
14
|
+
background: var(--textarea-bg);
|
|
15
|
+
color: var(--textarea-fg);
|
|
16
|
+
font-family: inherit;
|
|
17
|
+
line-height: var(--textarea-line-height);
|
|
18
|
+
transition:
|
|
19
|
+
border-color var(--transition-fast),
|
|
20
|
+
box-shadow var(--transition-fast);
|
|
21
|
+
|
|
22
|
+
&::placeholder {
|
|
23
|
+
color: var(--textarea-placeholder-fg);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
&:focus-visible {
|
|
27
|
+
border-color: var(--textarea-border-color-focus);
|
|
28
|
+
|
|
29
|
+
@include focus-ring(var(--textarea-ring-focus));
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
&:disabled {
|
|
33
|
+
background: var(--textarea-bg-disabled);
|
|
34
|
+
border-color: var(--textarea-border-color-disabled);
|
|
35
|
+
color: var(--textarea-fg-disabled);
|
|
36
|
+
cursor: not-allowed;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
&[readonly] {
|
|
40
|
+
background: var(--textarea-bg-read-only);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// Size — typography + padding. NO height (textarea height comes from rows + autoGrow).
|
|
45
|
+
.sizeSm {
|
|
46
|
+
padding: var(--textarea-padding-y-sm) var(--textarea-padding-x-sm);
|
|
47
|
+
font-size: var(--textarea-font-size-sm);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
.sizeMd {
|
|
51
|
+
padding: var(--textarea-padding-y-md) var(--textarea-padding-x-md);
|
|
52
|
+
font-size: var(--textarea-font-size-md);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
.sizeLg {
|
|
56
|
+
padding: var(--textarea-padding-y-lg) var(--textarea-padding-x-lg);
|
|
57
|
+
font-size: var(--textarea-font-size-lg);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Resize direction
|
|
61
|
+
.resizeNone {
|
|
62
|
+
resize: none;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
.resizeVertical {
|
|
66
|
+
resize: vertical;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
.resizeBoth {
|
|
70
|
+
resize: both;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
.invalid {
|
|
74
|
+
border-color: var(--textarea-border-color-invalid);
|
|
75
|
+
|
|
76
|
+
&:focus-visible {
|
|
77
|
+
border-color: var(--textarea-border-color-invalid);
|
|
78
|
+
|
|
79
|
+
@include focus-ring(var(--textarea-ring-invalid));
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// Counter — internal spacing between textarea and child counter. The counter
|
|
84
|
+
// is a child element inside the wrapper, not a layout property at the
|
|
85
|
+
// component boundary, so this is allowed.
|
|
86
|
+
.counter {
|
|
87
|
+
display: block;
|
|
88
|
+
text-align: right;
|
|
89
|
+
// stylelint-disable-next-line property-disallowed-list -- internal spacing between textarea and its counter child
|
|
90
|
+
margin-top: var(--textarea-counter-margin-top);
|
|
91
|
+
font-size: var(--textarea-counter-font-size);
|
|
92
|
+
color: var(--textarea-counter-fg);
|
|
93
|
+
line-height: 1;
|
|
94
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
// Textarea.tokens.scss — component-scoped tokens for <Textarea>. Mirrors Input field tokens but no height per size (textarea height comes from rows + autoGrow). Counter sits as a child below the field.
|
|
2
|
+
:root {
|
|
3
|
+
// Surface
|
|
4
|
+
--textarea-bg: var(--color-bg);
|
|
5
|
+
--textarea-fg: var(--color-fg);
|
|
6
|
+
--textarea-border-color: var(--color-border-strong);
|
|
7
|
+
--textarea-radius: var(--radius-md);
|
|
8
|
+
--textarea-line-height: var(--line-height-normal);
|
|
9
|
+
|
|
10
|
+
// Placeholder
|
|
11
|
+
--textarea-placeholder-fg: var(--color-fg-subtle);
|
|
12
|
+
|
|
13
|
+
// Focus
|
|
14
|
+
--textarea-border-color-focus: var(--color-accent);
|
|
15
|
+
--textarea-ring-focus: var(--ring-accent);
|
|
16
|
+
|
|
17
|
+
// Disabled
|
|
18
|
+
--textarea-bg-disabled: var(--color-bg-subtle);
|
|
19
|
+
--textarea-border-color-disabled: var(--color-border);
|
|
20
|
+
--textarea-fg-disabled: var(--color-fg-subtle);
|
|
21
|
+
|
|
22
|
+
// ReadOnly
|
|
23
|
+
--textarea-bg-read-only: var(--color-bg-subtle);
|
|
24
|
+
|
|
25
|
+
// Invalid
|
|
26
|
+
--textarea-border-color-invalid: var(--color-danger);
|
|
27
|
+
--textarea-ring-invalid: var(--ring-danger);
|
|
28
|
+
|
|
29
|
+
// Size — vertical padding per size
|
|
30
|
+
--textarea-padding-y-sm: var(--space-1);
|
|
31
|
+
--textarea-padding-y-md: var(--space-2);
|
|
32
|
+
--textarea-padding-y-lg: var(--space-2);
|
|
33
|
+
|
|
34
|
+
// Size — horizontal padding per size
|
|
35
|
+
--textarea-padding-x-sm: var(--space-2);
|
|
36
|
+
--textarea-padding-x-md: var(--space-3);
|
|
37
|
+
--textarea-padding-x-lg: var(--space-3);
|
|
38
|
+
|
|
39
|
+
// Size — font-size per size
|
|
40
|
+
--textarea-font-size-sm: var(--font-size-sm);
|
|
41
|
+
--textarea-font-size-md: var(--font-size-md);
|
|
42
|
+
--textarea-font-size-lg: var(--font-size-lg);
|
|
43
|
+
|
|
44
|
+
// Counter
|
|
45
|
+
--textarea-counter-margin-top: var(--space-1);
|
|
46
|
+
--textarea-counter-font-size: var(--font-size-sm);
|
|
47
|
+
--textarea-counter-fg: var(--color-fg-muted);
|
|
48
|
+
}
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
import {
|
|
2
|
+
forwardRef,
|
|
3
|
+
useCallback,
|
|
4
|
+
useLayoutEffect,
|
|
5
|
+
useRef,
|
|
6
|
+
useState,
|
|
7
|
+
type ChangeEvent,
|
|
8
|
+
type TextareaHTMLAttributes,
|
|
9
|
+
} from 'react';
|
|
10
|
+
import clsx from 'clsx';
|
|
11
|
+
import styles from './Textarea.module.scss';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Field typography + padding scale. Pairs with Input's `size`.
|
|
15
|
+
*
|
|
16
|
+
* Unlike Input, size does NOT affect the textarea's height — height is
|
|
17
|
+
* driven by `minRows` (and capped by `maxRows` if auto-grow is on).
|
|
18
|
+
*/
|
|
19
|
+
export type TextareaSize = 'sm' | 'md' | 'lg';
|
|
20
|
+
|
|
21
|
+
/** User-drag resize handle direction. Maps to CSS `resize`. */
|
|
22
|
+
export type TextareaResize = 'none' | 'vertical' | 'both';
|
|
23
|
+
|
|
24
|
+
export interface TextareaProps extends Omit<
|
|
25
|
+
TextareaHTMLAttributes<HTMLTextAreaElement>,
|
|
26
|
+
'size' | 'rows'
|
|
27
|
+
> {
|
|
28
|
+
/**
|
|
29
|
+
* Toggles the error visual (red border + danger focus ring) and sets
|
|
30
|
+
* `aria-invalid="true"`. Pair with a visible error message and an
|
|
31
|
+
* `aria-describedby` pointer at the message id.
|
|
32
|
+
*/
|
|
33
|
+
invalid?: boolean;
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Visual size. Defaults to `'md'`. Affects typography + padding only, not
|
|
37
|
+
* height — that comes from `minRows`.
|
|
38
|
+
* - `'sm'` — tighter padding + `--font-size-sm`. Used in dense forms.
|
|
39
|
+
* - `'md'` — default padding + `--font-size-md`. Most form contexts.
|
|
40
|
+
* - `'lg'` — same padding as md but `--font-size-lg`. Hero / focus textareas.
|
|
41
|
+
*
|
|
42
|
+
* Note: this collapses the native HTML `<textarea size>` attribute. Use
|
|
43
|
+
* `style={{ width }}` or a parent container for explicit width.
|
|
44
|
+
*/
|
|
45
|
+
size?: TextareaSize;
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Block browser autofill AND password managers from offering to fill
|
|
49
|
+
* this textarea. Same heuristic as Input — see Input's JSDoc for the
|
|
50
|
+
* full set of opt-out attributes applied.
|
|
51
|
+
*
|
|
52
|
+
* Smart default: when omitted, block iff `autoComplete` is also omitted
|
|
53
|
+
* (or `'off'`). Explicit autocomplete hints opt back IN to autofill.
|
|
54
|
+
* Pass `true` to force-block, `false` to force-allow.
|
|
55
|
+
*/
|
|
56
|
+
disableAutofill?: boolean;
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Minimum visible rows. The textarea never renders shorter than this,
|
|
60
|
+
* regardless of content. Default: `3`. Also seeds the native `rows`
|
|
61
|
+
* attribute for SSR / no-JS rendering.
|
|
62
|
+
*/
|
|
63
|
+
minRows?: number;
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Maximum visible rows. Beyond this, content scrolls inside the field
|
|
67
|
+
* instead of expanding further. Only meaningful when `autoGrow` is true.
|
|
68
|
+
* Default: `undefined` (unbounded growth).
|
|
69
|
+
*/
|
|
70
|
+
maxRows?: number;
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* When true, height adapts to content between `minRows` and `maxRows`.
|
|
74
|
+
* Default: `true`. When false, height locks at `minRows` and a scrollbar
|
|
75
|
+
* appears past it.
|
|
76
|
+
*/
|
|
77
|
+
autoGrow?: boolean;
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* User-drag resize handle direction. Default: `'vertical'`.
|
|
81
|
+
*
|
|
82
|
+
* **Forced to `'none'`** when `autoGrow` is `true` — user-drag fights
|
|
83
|
+
* the auto-grow measurement and produces erratic behavior. To enable
|
|
84
|
+
* a resize handle, opt out of auto-grow with `autoGrow={false}`.
|
|
85
|
+
*/
|
|
86
|
+
resize?: TextareaResize;
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Show the character counter (`${value.length}` or
|
|
90
|
+
* `${value.length} / ${maxLength}` when both are set).
|
|
91
|
+
*
|
|
92
|
+
* Default: `true` when `maxLength` is set, `false` otherwise.
|
|
93
|
+
*
|
|
94
|
+
* The counter renders as a `<span aria-live="polite" aria-atomic="true">`
|
|
95
|
+
* inside the wrapper, below the textarea. It updates on every input —
|
|
96
|
+
* works for both controlled and uncontrolled textareas.
|
|
97
|
+
*/
|
|
98
|
+
showCount?: boolean;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
const AUTOFILL_DISABLED_PROPS = {
|
|
102
|
+
autoComplete: 'off' as const,
|
|
103
|
+
'data-1p-ignore': '' as const,
|
|
104
|
+
'data-lpignore': 'true' as const,
|
|
105
|
+
'data-form-type': 'other' as const,
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
const SIZE_CLASS: Record<TextareaSize, string> = {
|
|
109
|
+
sm: styles.sizeSm,
|
|
110
|
+
md: styles.sizeMd,
|
|
111
|
+
lg: styles.sizeLg,
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
const RESIZE_CLASS: Record<TextareaResize, string> = {
|
|
115
|
+
none: styles.resizeNone,
|
|
116
|
+
vertical: styles.resizeVertical,
|
|
117
|
+
both: styles.resizeBoth,
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Multi-line text input with auto-grow, resize direction and an optional character counter.
|
|
122
|
+
* @see docs/components/Textarea.md
|
|
123
|
+
*/
|
|
124
|
+
export const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(function Textarea(
|
|
125
|
+
{
|
|
126
|
+
invalid,
|
|
127
|
+
size = 'md',
|
|
128
|
+
disableAutofill,
|
|
129
|
+
minRows = 3,
|
|
130
|
+
maxRows,
|
|
131
|
+
autoGrow = true,
|
|
132
|
+
resize = 'vertical',
|
|
133
|
+
showCount,
|
|
134
|
+
className,
|
|
135
|
+
value,
|
|
136
|
+
defaultValue,
|
|
137
|
+
onChange,
|
|
138
|
+
maxLength,
|
|
139
|
+
...props
|
|
140
|
+
},
|
|
141
|
+
ref,
|
|
142
|
+
) {
|
|
143
|
+
// Merge external ref with internal ref so we don't lose either.
|
|
144
|
+
const textareaRef = useRef<HTMLTextAreaElement | null>(null);
|
|
145
|
+
const setRefs = useCallback(
|
|
146
|
+
(node: HTMLTextAreaElement | null) => {
|
|
147
|
+
textareaRef.current = node;
|
|
148
|
+
if (typeof ref === 'function') ref(node);
|
|
149
|
+
else if (ref) ref.current = node;
|
|
150
|
+
},
|
|
151
|
+
[ref],
|
|
152
|
+
);
|
|
153
|
+
|
|
154
|
+
// Internal value mirror — keeps the counter in sync for uncontrolled
|
|
155
|
+
// inputs. For controlled inputs, currentValue tracks `value` directly.
|
|
156
|
+
const [internalValue, setInternalValue] = useState<string>(() => {
|
|
157
|
+
if (defaultValue == null) return '';
|
|
158
|
+
return String(defaultValue);
|
|
159
|
+
});
|
|
160
|
+
const isControlled = value !== undefined;
|
|
161
|
+
const currentValue = isControlled ? String(value) : internalValue;
|
|
162
|
+
|
|
163
|
+
const handleChange = (e: ChangeEvent<HTMLTextAreaElement>) => {
|
|
164
|
+
if (!isControlled) setInternalValue(e.target.value);
|
|
165
|
+
onChange?.(e);
|
|
166
|
+
};
|
|
167
|
+
|
|
168
|
+
// Auto-grow: synchronously after render, reset height to auto, then
|
|
169
|
+
// set to scrollHeight clamped between minRows and maxRows.
|
|
170
|
+
useLayoutEffect(() => {
|
|
171
|
+
const el = textareaRef.current;
|
|
172
|
+
if (!el) return;
|
|
173
|
+
|
|
174
|
+
if (!autoGrow) {
|
|
175
|
+
// Clear any prior auto-grow inline styles so toggling autoGrow OFF
|
|
176
|
+
// returns control to the native textarea (rows attribute + user drag).
|
|
177
|
+
el.style.height = '';
|
|
178
|
+
el.style.overflowY = '';
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// Reset to 'auto' first so scrollHeight reflects content, not the prior height.
|
|
183
|
+
el.style.height = 'auto';
|
|
184
|
+
|
|
185
|
+
const computed = window.getComputedStyle(el);
|
|
186
|
+
// jsdom may return 'normal' for lineHeight — fall back to 0 so the
|
|
187
|
+
// math degrades gracefully (minHeight becomes 0, target = scrollHeight).
|
|
188
|
+
const lineHeight = parseFloat(computed.lineHeight) || 0;
|
|
189
|
+
const paddingY =
|
|
190
|
+
(parseFloat(computed.paddingTop) || 0) + (parseFloat(computed.paddingBottom) || 0);
|
|
191
|
+
const borderY =
|
|
192
|
+
(parseFloat(computed.borderTopWidth) || 0) + (parseFloat(computed.borderBottomWidth) || 0);
|
|
193
|
+
|
|
194
|
+
const minHeight = lineHeight * minRows + paddingY + borderY;
|
|
195
|
+
const maxHeight = maxRows !== undefined ? lineHeight * maxRows + paddingY + borderY : Infinity;
|
|
196
|
+
|
|
197
|
+
const desired = el.scrollHeight + borderY;
|
|
198
|
+
const target = Math.min(Math.max(desired, minHeight), maxHeight);
|
|
199
|
+
el.style.height = `${target}px`;
|
|
200
|
+
el.style.overflowY = desired > maxHeight ? 'auto' : 'hidden';
|
|
201
|
+
// NOTE: `size` is in the deps array because it changes padding, which
|
|
202
|
+
// changes paddingY in the math above. Don't remove it.
|
|
203
|
+
}, [currentValue, autoGrow, minRows, maxRows, size]);
|
|
204
|
+
|
|
205
|
+
// Smart autofill default — same heuristic as Input.
|
|
206
|
+
const hasAutocompleteHint =
|
|
207
|
+
typeof props.autoComplete === 'string' && props.autoComplete !== 'off';
|
|
208
|
+
const blockAutofill = disableAutofill ?? !hasAutocompleteHint;
|
|
209
|
+
|
|
210
|
+
// Effective resize: auto-grow forces 'none' because user-drag and
|
|
211
|
+
// measured-height fight each other.
|
|
212
|
+
const effectiveResize: TextareaResize = autoGrow ? 'none' : resize;
|
|
213
|
+
|
|
214
|
+
const shouldShowCount = showCount ?? maxLength !== undefined;
|
|
215
|
+
|
|
216
|
+
return (
|
|
217
|
+
<div className={styles.wrapper}>
|
|
218
|
+
<textarea
|
|
219
|
+
ref={setRefs}
|
|
220
|
+
rows={minRows}
|
|
221
|
+
aria-invalid={invalid || undefined}
|
|
222
|
+
// Autofill blocking goes before {...props} — matches Input's spread
|
|
223
|
+
// order. Consumer's autoComplete wins; data-* opt-outs still apply.
|
|
224
|
+
{...(blockAutofill ? AUTOFILL_DISABLED_PROPS : {})}
|
|
225
|
+
value={value}
|
|
226
|
+
defaultValue={defaultValue}
|
|
227
|
+
maxLength={maxLength}
|
|
228
|
+
{...props}
|
|
229
|
+
onChange={handleChange}
|
|
230
|
+
className={clsx(
|
|
231
|
+
styles.textarea,
|
|
232
|
+
SIZE_CLASS[size],
|
|
233
|
+
RESIZE_CLASS[effectiveResize],
|
|
234
|
+
invalid && styles.invalid,
|
|
235
|
+
className,
|
|
236
|
+
)}
|
|
237
|
+
/>
|
|
238
|
+
{shouldShowCount && (
|
|
239
|
+
<span className={styles.counter} aria-live="polite" aria-atomic="true">
|
|
240
|
+
{currentValue.length}
|
|
241
|
+
{maxLength !== undefined && ` / ${maxLength}`}
|
|
242
|
+
</span>
|
|
243
|
+
)}
|
|
244
|
+
</div>
|
|
245
|
+
);
|
|
246
|
+
});
|