@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,300 @@
|
|
|
1
|
+
// commands.ts — pure active-state derivation + command runners for the toolbar.
|
|
2
|
+
// Every runner composes the existing engine transforms; no new model logic.
|
|
3
|
+
import type {
|
|
4
|
+
RichDoc,
|
|
5
|
+
Block,
|
|
6
|
+
Mark,
|
|
7
|
+
MarkType,
|
|
8
|
+
BlockType,
|
|
9
|
+
Point,
|
|
10
|
+
Range,
|
|
11
|
+
} from '../RichText/engine/model';
|
|
12
|
+
import { toggleMark, setBlockType, applyMark, removeMark } from '../RichText/engine/transforms';
|
|
13
|
+
import {
|
|
14
|
+
orderedRange,
|
|
15
|
+
findBlockIndex,
|
|
16
|
+
blockLength,
|
|
17
|
+
isCollapsed,
|
|
18
|
+
marksBeforeCaret,
|
|
19
|
+
} from '../RichText/engine/position';
|
|
20
|
+
import { hasMark } from '../RichText/engine/marks';
|
|
21
|
+
|
|
22
|
+
/** The `{ doc, selection }` pair returned by every command runner. */
|
|
23
|
+
export type CommandResult = { doc: RichDoc; selection: Range };
|
|
24
|
+
|
|
25
|
+
const MARK_TYPES: MarkType[] = ['bold', 'italic', 'underline', 'strike', 'code', 'link'];
|
|
26
|
+
|
|
27
|
+
// Value-carrying color marks. Kept SEPARATE from MARK_TYPES (which drives the
|
|
28
|
+
// toolbar pressed-state path, where color must not appear) but flushed alongside
|
|
29
|
+
// them in applyExactMarks so a pending color survives the next keystroke.
|
|
30
|
+
const COLOR_FLUSH: MarkType[] = ['textColor', 'bgColor'];
|
|
31
|
+
|
|
32
|
+
function blocksInRange(doc: RichDoc, range: Range): { si: number; ei: number } {
|
|
33
|
+
const { start, end } = orderedRange(doc, range);
|
|
34
|
+
return { si: findBlockIndex(doc, start.blockId), ei: findBlockIndex(doc, end.blockId) };
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** Mark types of the character immediately before the caret (none at a block start). */
|
|
38
|
+
function marksAtCaret(doc: RichDoc, caret: Point): MarkType[] {
|
|
39
|
+
return marksBeforeCaret(doc, caret).map((m) => m.type);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Derives the set of mark types active across the selection (for toolbar pressed
|
|
44
|
+
* state). Returns the intersection — only marks present on every character in
|
|
45
|
+
* the range are considered "active."
|
|
46
|
+
*
|
|
47
|
+
* When the range is collapsed the function returns the marks of the character
|
|
48
|
+
* immediately before the caret (what the next typed character would inherit).
|
|
49
|
+
* When `pending` marks are supplied they override the caret-based look-up —
|
|
50
|
+
* the user has toggled a mark at a collapsed caret before typing.
|
|
51
|
+
*
|
|
52
|
+
* @example
|
|
53
|
+
* const marks = activeMarks(doc, range, null); // ['bold'] when all chars are bold
|
|
54
|
+
* const marks = activeMarks(doc, range, [{ type: 'bold' }]); // pending override
|
|
55
|
+
*/
|
|
56
|
+
export function activeMarks(doc: RichDoc, range: Range, pending: Mark[] | null): MarkType[] {
|
|
57
|
+
if (isCollapsed(range)) {
|
|
58
|
+
return pending ? pending.map((m) => m.type) : marksAtCaret(doc, range.anchor);
|
|
59
|
+
}
|
|
60
|
+
const { start, end } = orderedRange(doc, range);
|
|
61
|
+
const { si, ei } = blocksInRange(doc, range);
|
|
62
|
+
if (si === -1 || ei === -1) return [];
|
|
63
|
+
const out: MarkType[] = [];
|
|
64
|
+
for (const type of MARK_TYPES) {
|
|
65
|
+
let any = false;
|
|
66
|
+
let all = true;
|
|
67
|
+
for (let i = si; i <= ei && all; i += 1) {
|
|
68
|
+
const block = doc.blocks[i];
|
|
69
|
+
const from = i === si ? start.offset : 0;
|
|
70
|
+
const to = i === ei ? end.offset : blockLength(block);
|
|
71
|
+
// Skip a zero-length slice — incl. a void `attachment` (no `inlines`), which
|
|
72
|
+
// would otherwise crash iterating undefined. Mirrors the transforms guard.
|
|
73
|
+
if (to <= from) continue;
|
|
74
|
+
let pos = 0;
|
|
75
|
+
// `?? []` so the iteration is safe even if a caller hands a void block a
|
|
76
|
+
// non-zero end offset (the `to <= from` skip already covers the editor path).
|
|
77
|
+
for (const run of block.inlines ?? []) {
|
|
78
|
+
const rs = pos;
|
|
79
|
+
const re = pos + run.text.length;
|
|
80
|
+
pos = re;
|
|
81
|
+
const f = Math.max(from, rs);
|
|
82
|
+
const t = Math.min(to, re);
|
|
83
|
+
if (t > f) {
|
|
84
|
+
any = true;
|
|
85
|
+
if (!hasMark(run.marks, type)) {
|
|
86
|
+
all = false;
|
|
87
|
+
break;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
if (any && all) out.push(type);
|
|
93
|
+
}
|
|
94
|
+
return out;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/** The single color KEY active per color type across a selection. */
|
|
98
|
+
export interface ActiveColors {
|
|
99
|
+
/** Palette key (e.g. `'red'`) shared by every char's `textColor`, else absent. */
|
|
100
|
+
textColor?: string;
|
|
101
|
+
/** Palette key shared by every char's `bgColor`, else absent. */
|
|
102
|
+
bgColor?: string;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
const COLOR_TYPES = ['textColor', 'bgColor'] as const;
|
|
106
|
+
|
|
107
|
+
/** The color KEY of `type` carried by `marks`, if any. */
|
|
108
|
+
function colorOf(marks: Mark[], type: 'textColor' | 'bgColor'): string | undefined {
|
|
109
|
+
const m = marks.find((x) => x.type === type);
|
|
110
|
+
return m && 'color' in m ? m.color : undefined;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Derives the single color key active per color type across the selection (drives
|
|
115
|
+
* the active badge ring in the color menu). For each of `textColor` / `bgColor`,
|
|
116
|
+
* returns the key only when EVERY character in the range carries that type with
|
|
117
|
+
* the SAME key — a mixed or partial color is omitted (so the menu shows "none
|
|
118
|
+
* active").
|
|
119
|
+
*
|
|
120
|
+
* When the range is collapsed the function reads the marks of the character
|
|
121
|
+
* immediately before the caret. When `pending` marks are supplied they override
|
|
122
|
+
* the caret look-up — the user has staged a color at a collapsed caret before
|
|
123
|
+
* typing. Mirrors {@link activeMarks}, but tracks the color value rather than
|
|
124
|
+
* just mark presence.
|
|
125
|
+
*
|
|
126
|
+
* @example
|
|
127
|
+
* activeColors(doc, range, null); // { textColor: 'red' } when all chars are red
|
|
128
|
+
* activeColors(doc, range, [{ type: 'bgColor', color: 'blue' }]); // pending override
|
|
129
|
+
*/
|
|
130
|
+
export function activeColors(doc: RichDoc, range: Range, pending: Mark[] | null): ActiveColors {
|
|
131
|
+
if (isCollapsed(range)) {
|
|
132
|
+
const marks = pending ?? marksBeforeCaret(doc, range.anchor);
|
|
133
|
+
const out: ActiveColors = {};
|
|
134
|
+
for (const type of COLOR_TYPES) {
|
|
135
|
+
const c = colorOf(marks, type);
|
|
136
|
+
if (c !== undefined) out[type] = c;
|
|
137
|
+
}
|
|
138
|
+
return out;
|
|
139
|
+
}
|
|
140
|
+
const { start, end } = orderedRange(doc, range);
|
|
141
|
+
const { si, ei } = blocksInRange(doc, range);
|
|
142
|
+
if (si === -1 || ei === -1) return {};
|
|
143
|
+
const out: ActiveColors = {};
|
|
144
|
+
for (const type of COLOR_TYPES) {
|
|
145
|
+
let any = false;
|
|
146
|
+
let all = true;
|
|
147
|
+
let color: string | undefined;
|
|
148
|
+
for (let i = si; i <= ei && all; i += 1) {
|
|
149
|
+
const block = doc.blocks[i];
|
|
150
|
+
const from = i === si ? start.offset : 0;
|
|
151
|
+
const to = i === ei ? end.offset : blockLength(block);
|
|
152
|
+
// Skip a zero-length slice — incl. a void `attachment` (no `inlines`), which
|
|
153
|
+
// would otherwise crash iterating undefined. Mirrors the transforms guard.
|
|
154
|
+
if (to <= from) continue;
|
|
155
|
+
let pos = 0;
|
|
156
|
+
// `?? []` so the iteration is safe even if a caller hands a void block a
|
|
157
|
+
// non-zero end offset (the `to <= from` skip already covers the editor path).
|
|
158
|
+
for (const run of block.inlines ?? []) {
|
|
159
|
+
const rs = pos;
|
|
160
|
+
const re = pos + run.text.length;
|
|
161
|
+
pos = re;
|
|
162
|
+
const f = Math.max(from, rs);
|
|
163
|
+
const t = Math.min(to, re);
|
|
164
|
+
if (t > f) {
|
|
165
|
+
any = true;
|
|
166
|
+
const c = colorOf(run.marks, type);
|
|
167
|
+
if (c === undefined || (color !== undefined && c !== color)) {
|
|
168
|
+
all = false;
|
|
169
|
+
break;
|
|
170
|
+
}
|
|
171
|
+
color = c;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
if (any && all && color !== undefined) out[type] = color;
|
|
176
|
+
}
|
|
177
|
+
return out;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* Returns the block type (and heading level) shared by all blocks in the
|
|
182
|
+
* selection, or `null` when the selection spans blocks of different types.
|
|
183
|
+
*
|
|
184
|
+
* @example
|
|
185
|
+
* currentBlock(doc, range); // { type: 'heading', level: 2 }
|
|
186
|
+
* currentBlock(doc, mixedRange); // null
|
|
187
|
+
*/
|
|
188
|
+
export function currentBlock(
|
|
189
|
+
doc: RichDoc,
|
|
190
|
+
range: Range,
|
|
191
|
+
): { type: BlockType; level?: 1 | 2 | 3 } | null {
|
|
192
|
+
const { si, ei } = blocksInRange(doc, range);
|
|
193
|
+
if (si === -1 || ei === -1) return null;
|
|
194
|
+
const first = doc.blocks[si];
|
|
195
|
+
for (let i = si; i <= ei; i += 1) {
|
|
196
|
+
if (doc.blocks[i].type !== first.type || doc.blocks[i].level !== first.level) return null;
|
|
197
|
+
}
|
|
198
|
+
return first.level !== undefined
|
|
199
|
+
? { type: first.type, level: first.level }
|
|
200
|
+
: { type: first.type };
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* Toggle `mark` on/off over `range` using the engine's `toggleMark` transform.
|
|
205
|
+
*
|
|
206
|
+
* @example
|
|
207
|
+
* const { doc, selection } = runToggleMark(doc, range, { type: 'bold' });
|
|
208
|
+
*/
|
|
209
|
+
export function runToggleMark(doc: RichDoc, range: Range, mark: Mark): CommandResult {
|
|
210
|
+
return toggleMark(doc, range, mark);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* Apply `patch` (type / level / depth) to every block spanned by `range`,
|
|
215
|
+
* preserving the original selection. Used by the block-type dropdown and
|
|
216
|
+
* `runToggleList` / `runIndent`.
|
|
217
|
+
*
|
|
218
|
+
* @example
|
|
219
|
+
* const { doc } = runSetBlock(doc, range, { type: 'heading', level: 2 });
|
|
220
|
+
*/
|
|
221
|
+
export function runSetBlock(
|
|
222
|
+
doc: RichDoc,
|
|
223
|
+
range: Range,
|
|
224
|
+
patch: Partial<Pick<Block, 'type' | 'level' | 'depth'>>,
|
|
225
|
+
): CommandResult {
|
|
226
|
+
const { si, ei } = blocksInRange(doc, range);
|
|
227
|
+
if (si === -1 || ei === -1) return { doc, selection: range };
|
|
228
|
+
let d = doc;
|
|
229
|
+
for (let i = si; i <= ei; i += 1) {
|
|
230
|
+
d = setBlockType(d, d.blocks[i].id, patch).doc;
|
|
231
|
+
}
|
|
232
|
+
return { doc: d, selection: range };
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
/**
|
|
236
|
+
* Toggle a list type on/off for the selection. If every block in the range is
|
|
237
|
+
* already `listType`, converts them all to `paragraph`; otherwise converts them
|
|
238
|
+
* all to `listType` at depth 0.
|
|
239
|
+
*
|
|
240
|
+
* @example
|
|
241
|
+
* const { doc } = runToggleList(doc, range, 'bullet_item');
|
|
242
|
+
*/
|
|
243
|
+
export function runToggleList(
|
|
244
|
+
doc: RichDoc,
|
|
245
|
+
range: Range,
|
|
246
|
+
listType: 'bullet_item' | 'ordered_item',
|
|
247
|
+
): CommandResult {
|
|
248
|
+
const { si, ei } = blocksInRange(doc, range);
|
|
249
|
+
if (si === -1 || ei === -1) return { doc, selection: range };
|
|
250
|
+
let allList = true;
|
|
251
|
+
for (let i = si; i <= ei; i += 1) {
|
|
252
|
+
if (doc.blocks[i].type !== listType) {
|
|
253
|
+
allList = false;
|
|
254
|
+
break;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
return runSetBlock(doc, range, allList ? { type: 'paragraph' } : { type: listType, depth: 0 });
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
/**
|
|
261
|
+
* Indent (`dir: 'in'`) or outdent (`dir: 'out'`) every list item in the
|
|
262
|
+
* selection by one level. Depth is clamped to a minimum of 0. Non-list blocks
|
|
263
|
+
* are skipped silently.
|
|
264
|
+
*
|
|
265
|
+
* @example
|
|
266
|
+
* const { doc } = runIndent(doc, range, 'in'); // increases nesting
|
|
267
|
+
* const { doc } = runIndent(doc, range, 'out'); // decreases nesting (floor 0)
|
|
268
|
+
*/
|
|
269
|
+
export function runIndent(doc: RichDoc, range: Range, dir: 'in' | 'out'): CommandResult {
|
|
270
|
+
const { si, ei } = blocksInRange(doc, range);
|
|
271
|
+
if (si === -1 || ei === -1) return { doc, selection: range };
|
|
272
|
+
let d = doc;
|
|
273
|
+
for (let i = si; i <= ei; i += 1) {
|
|
274
|
+
const b = d.blocks[i];
|
|
275
|
+
if (b.type !== 'bullet_item' && b.type !== 'ordered_item') continue;
|
|
276
|
+
const depth = Math.max(0, (b.depth ?? 0) + (dir === 'in' ? 1 : -1));
|
|
277
|
+
d = setBlockType(d, b.id, { depth }).doc;
|
|
278
|
+
}
|
|
279
|
+
return { doc: d, selection: range };
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/**
|
|
283
|
+
* Force the marks of every character in `range` to exactly `marks`, used when
|
|
284
|
+
* flushing pending marks on the next typed character. Each known mark type —
|
|
285
|
+
* including the value-carrying `textColor`/`bgColor` — is applied if present in
|
|
286
|
+
* `marks`, or removed if absent.
|
|
287
|
+
*
|
|
288
|
+
* @example
|
|
289
|
+
* const newDoc = applyExactMarks(doc, span, [{ type: 'bold' }]);
|
|
290
|
+
* // Pending color survives the next keystroke:
|
|
291
|
+
* const colored = applyExactMarks(doc, span, [{ type: 'textColor', color: 'red' }]);
|
|
292
|
+
*/
|
|
293
|
+
export function applyExactMarks(doc: RichDoc, range: Range, marks: Mark[]): RichDoc {
|
|
294
|
+
let d = doc;
|
|
295
|
+
for (const type of [...MARK_TYPES, ...COLOR_FLUSH]) {
|
|
296
|
+
const mark = marks.find((m) => m.type === type);
|
|
297
|
+
d = mark ? applyMark(d, range, mark).doc : removeMark(d, range, type).doc;
|
|
298
|
+
}
|
|
299
|
+
return d;
|
|
300
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
// history.ts — pure undo/redo history for <RichTextEditor>. Snapshots of
|
|
2
|
+
// { doc, selection }; consecutive same-kind edits (typing, deleting) coalesce
|
|
3
|
+
// into one step within a short window. `now` is injected so this module stays
|
|
4
|
+
// pure and deterministically testable.
|
|
5
|
+
import type { RichDoc, Range } from '../RichText/engine/model';
|
|
6
|
+
|
|
7
|
+
export interface Snapshot {
|
|
8
|
+
doc: RichDoc;
|
|
9
|
+
selection: Range | null;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* The kind of edit that produced a snapshot — drives coalescing. Same-kind
|
|
14
|
+
* non-`other` edits within {@link COALESCE_MS} merge into one undo step: `type`
|
|
15
|
+
* and `delete` for keystroke bursts, `resize` for a continuous image-width drag
|
|
16
|
+
* (slider or handle) so the whole drag reverts in a single undo.
|
|
17
|
+
*/
|
|
18
|
+
export type EditKind = 'type' | 'delete' | 'resize' | 'other';
|
|
19
|
+
|
|
20
|
+
export interface History {
|
|
21
|
+
past: Snapshot[];
|
|
22
|
+
present: Snapshot;
|
|
23
|
+
future: Snapshot[];
|
|
24
|
+
/** Kind of the last recorded step (for coalescing); null after reset/undo/redo. */
|
|
25
|
+
lastKind: EditKind | null;
|
|
26
|
+
/** Timestamp of the last record (for the pause-based coalescing break). */
|
|
27
|
+
lastAt: number;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** Consecutive same-kind edits within this many ms merge into one undo step. */
|
|
31
|
+
const COALESCE_MS = 600;
|
|
32
|
+
/** Max retained past entries (immutable snapshots structurally share blocks). */
|
|
33
|
+
const CAP = 200;
|
|
34
|
+
|
|
35
|
+
/** A fresh history whose only state is `present` (mount + external value replace). */
|
|
36
|
+
export function reset(present: Snapshot): History {
|
|
37
|
+
return { past: [], present, future: [], lastKind: null, lastAt: 0 };
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Record a newly committed state. Coalesces with the previous step when it's the
|
|
42
|
+
* same non-`other` kind within `COALESCE_MS`; otherwise pushes the prior present
|
|
43
|
+
* onto `past` (capped) and clears `future`. A no-op (same doc) returns `h`.
|
|
44
|
+
*/
|
|
45
|
+
export function record(h: History, next: Snapshot, kind: EditKind, now: number): History {
|
|
46
|
+
if (next.doc === h.present.doc) return h;
|
|
47
|
+
const coalesce = kind !== 'other' && kind === h.lastKind && now - h.lastAt < COALESCE_MS;
|
|
48
|
+
if (coalesce) {
|
|
49
|
+
// Extend the current step: keep `past`/`future` (the burst's single boundary
|
|
50
|
+
// already sits on top of `past`). The new value shares those arrays with `h`
|
|
51
|
+
// — safe because arrays are never mutated and no caller compares them by ref.
|
|
52
|
+
return { ...h, present: next, lastAt: now };
|
|
53
|
+
}
|
|
54
|
+
return {
|
|
55
|
+
past: [...h.past, h.present].slice(-CAP),
|
|
56
|
+
present: next,
|
|
57
|
+
future: [],
|
|
58
|
+
lastKind: kind,
|
|
59
|
+
lastAt: now,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** Move one step back. No-op when there's nothing to undo. */
|
|
64
|
+
export function undo(h: History): History {
|
|
65
|
+
if (h.past.length === 0) return h;
|
|
66
|
+
return {
|
|
67
|
+
past: h.past.slice(0, -1),
|
|
68
|
+
present: h.past[h.past.length - 1],
|
|
69
|
+
future: [h.present, ...h.future],
|
|
70
|
+
lastKind: null,
|
|
71
|
+
lastAt: 0,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/** Move one step forward. No-op when there's nothing to redo. */
|
|
76
|
+
export function redo(h: History): History {
|
|
77
|
+
if (h.future.length === 0) return h;
|
|
78
|
+
return {
|
|
79
|
+
past: [...h.past, h.present],
|
|
80
|
+
present: h.future[0],
|
|
81
|
+
future: h.future.slice(1),
|
|
82
|
+
lastKind: null,
|
|
83
|
+
lastAt: 0,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export function canUndo(h: History): boolean {
|
|
88
|
+
return h.past.length > 0;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export function canRedo(h: History): boolean {
|
|
92
|
+
return h.future.length > 0;
|
|
93
|
+
}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
// icons.tsx — minimal inline SVG icons for the toolbar (the library ships no
|
|
2
|
+
// icon dependency). Sized 1em / currentColor so they inherit the Button.
|
|
3
|
+
import type { SVGProps } from 'react';
|
|
4
|
+
|
|
5
|
+
const base: SVGProps<SVGSVGElement> = {
|
|
6
|
+
width: '1em',
|
|
7
|
+
height: '1em',
|
|
8
|
+
viewBox: '0 0 24 24',
|
|
9
|
+
fill: 'none',
|
|
10
|
+
stroke: 'currentColor',
|
|
11
|
+
strokeWidth: 2,
|
|
12
|
+
strokeLinecap: 'round',
|
|
13
|
+
strokeLinejoin: 'round',
|
|
14
|
+
'aria-hidden': true,
|
|
15
|
+
focusable: false,
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
export function BoldIcon() {
|
|
19
|
+
return (
|
|
20
|
+
<svg {...base}>
|
|
21
|
+
<path d="M6 4h8a4 4 0 0 1 0 8H6zM6 12h9a4 4 0 0 1 0 8H6z" />
|
|
22
|
+
</svg>
|
|
23
|
+
);
|
|
24
|
+
}
|
|
25
|
+
export function ItalicIcon() {
|
|
26
|
+
return (
|
|
27
|
+
<svg {...base}>
|
|
28
|
+
<line x1="19" y1="4" x2="10" y2="4" />
|
|
29
|
+
<line x1="14" y1="20" x2="5" y2="20" />
|
|
30
|
+
<line x1="15" y1="4" x2="9" y2="20" />
|
|
31
|
+
</svg>
|
|
32
|
+
);
|
|
33
|
+
}
|
|
34
|
+
export function UnderlineIcon() {
|
|
35
|
+
return (
|
|
36
|
+
<svg {...base}>
|
|
37
|
+
<path d="M6 3v7a6 6 0 0 0 12 0V3" />
|
|
38
|
+
<line x1="4" y1="21" x2="20" y2="21" />
|
|
39
|
+
</svg>
|
|
40
|
+
);
|
|
41
|
+
}
|
|
42
|
+
export function StrikeIcon() {
|
|
43
|
+
return (
|
|
44
|
+
<svg {...base}>
|
|
45
|
+
<line x1="4" y1="12" x2="20" y2="12" />
|
|
46
|
+
<path d="M7.5 7a4 4 0 0 1 6.5-1.5M16.5 17a4 4 0 0 1-6.5 1.5" />
|
|
47
|
+
</svg>
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
export function BulletListIcon() {
|
|
51
|
+
return (
|
|
52
|
+
<svg {...base}>
|
|
53
|
+
<line x1="9" y1="6" x2="20" y2="6" />
|
|
54
|
+
<line x1="9" y1="12" x2="20" y2="12" />
|
|
55
|
+
<line x1="9" y1="18" x2="20" y2="18" />
|
|
56
|
+
<circle cx="4.5" cy="6" r="1" fill="currentColor" stroke="none" />
|
|
57
|
+
<circle cx="4.5" cy="12" r="1" fill="currentColor" stroke="none" />
|
|
58
|
+
<circle cx="4.5" cy="18" r="1" fill="currentColor" stroke="none" />
|
|
59
|
+
</svg>
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
export function OrderedListIcon() {
|
|
63
|
+
return (
|
|
64
|
+
<svg {...base}>
|
|
65
|
+
<line x1="10" y1="6" x2="20" y2="6" />
|
|
66
|
+
<line x1="10" y1="12" x2="20" y2="12" />
|
|
67
|
+
<line x1="10" y1="18" x2="20" y2="18" />
|
|
68
|
+
<path d="M4 6h1v3M4 9h2" strokeWidth="1.5" />
|
|
69
|
+
<path d="M4 15h2v1l-2 2h2" strokeWidth="1.5" />
|
|
70
|
+
</svg>
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
export function LinkIcon() {
|
|
74
|
+
return (
|
|
75
|
+
<svg {...base}>
|
|
76
|
+
<path d="M10 13a5 5 0 0 0 7.07 0l2.83-2.83a5 5 0 0 0-7.07-7.07l-1.41 1.41" />
|
|
77
|
+
<path d="M14 11a5 5 0 0 0-7.07 0L4.1 13.83a5 5 0 0 0 7.07 7.07l1.41-1.41" />
|
|
78
|
+
</svg>
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
export function UndoIcon() {
|
|
82
|
+
return (
|
|
83
|
+
<svg {...base}>
|
|
84
|
+
<path d="M9 14 4 9l5-5" />
|
|
85
|
+
<path d="M4 9h11a5 5 0 0 1 0 10h-2" />
|
|
86
|
+
</svg>
|
|
87
|
+
);
|
|
88
|
+
}
|
|
89
|
+
export function RedoIcon() {
|
|
90
|
+
return (
|
|
91
|
+
<svg {...base}>
|
|
92
|
+
<path d="m15 14 5-5-5-5" />
|
|
93
|
+
<path d="M20 9H9a5 5 0 0 0 0 10h2" />
|
|
94
|
+
</svg>
|
|
95
|
+
);
|
|
96
|
+
}
|
|
97
|
+
export function PlusIcon() {
|
|
98
|
+
return (
|
|
99
|
+
<svg {...base}>
|
|
100
|
+
<line x1="12" y1="5" x2="12" y2="19" />
|
|
101
|
+
<line x1="5" y1="12" x2="19" y2="12" />
|
|
102
|
+
</svg>
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
export function GripIcon() {
|
|
106
|
+
return (
|
|
107
|
+
<svg {...base}>
|
|
108
|
+
<circle cx="9" cy="6" r="1" fill="currentColor" stroke="none" />
|
|
109
|
+
<circle cx="9" cy="12" r="1" fill="currentColor" stroke="none" />
|
|
110
|
+
<circle cx="9" cy="18" r="1" fill="currentColor" stroke="none" />
|
|
111
|
+
<circle cx="15" cy="6" r="1" fill="currentColor" stroke="none" />
|
|
112
|
+
<circle cx="15" cy="12" r="1" fill="currentColor" stroke="none" />
|
|
113
|
+
<circle cx="15" cy="18" r="1" fill="currentColor" stroke="none" />
|
|
114
|
+
</svg>
|
|
115
|
+
);
|
|
116
|
+
}
|
|
117
|
+
export function SmileIcon() {
|
|
118
|
+
return (
|
|
119
|
+
<svg {...base}>
|
|
120
|
+
<circle cx="12" cy="12" r="10" />
|
|
121
|
+
<path d="M8 14s1.5 2 4 2 4-2 4-2" />
|
|
122
|
+
<line x1="9" y1="9" x2="9.01" y2="9" />
|
|
123
|
+
<line x1="15" y1="9" x2="15.01" y2="9" />
|
|
124
|
+
</svg>
|
|
125
|
+
);
|
|
126
|
+
}
|
|
127
|
+
// An "A" glyph above a solid color bar — the conventional text-color affordance.
|
|
128
|
+
export function TextColorIcon() {
|
|
129
|
+
return (
|
|
130
|
+
<svg {...base}>
|
|
131
|
+
<path d="M5 17 12 5l7 12" />
|
|
132
|
+
<line x1="8" y1="13" x2="16" y2="13" />
|
|
133
|
+
<rect x="4" y="20" width="16" height="2.5" rx="1" fill="currentColor" stroke="none" />
|
|
134
|
+
</svg>
|
|
135
|
+
);
|
|
136
|
+
}
|
|
137
|
+
// A marker/highlighter nib stroking a baseline — the conventional highlight
|
|
138
|
+
// affordance (pairs with the solid color bar at the bottom).
|
|
139
|
+
export function HighlightIcon() {
|
|
140
|
+
return (
|
|
141
|
+
<svg {...base}>
|
|
142
|
+
<path d="M14 4 9 9l-3 6 3 3 6-3 5-5z" />
|
|
143
|
+
<path d="m9 9 6 6" />
|
|
144
|
+
<rect x="4" y="20" width="16" height="2.5" rx="1" fill="currentColor" stroke="none" />
|
|
145
|
+
</svg>
|
|
146
|
+
);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// Lives in RichText because RichTextAttachment — which renders in the read-only
|
|
150
|
+
// viewer too — needs it, and RichText must not import from RichTextEditor
|
|
151
|
+
// (#509). Re-exported here so the toolbar's import site is unchanged.
|
|
152
|
+
export { AttachFileIcon } from '../RichText/attachmentIcon';
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
// imageSize.ts — pure display-size math + a thin browser image-measurement adapter
|
|
2
|
+
// for RichTextEditor uploads. A newly-uploaded image is laid out at its PERCEIVED
|
|
3
|
+
// size (natural device pixels ÷ devicePixelRatio), capped to the editor's content
|
|
4
|
+
// width, instead of its raw natural-pixel size (which renders a retina screenshot
|
|
5
|
+
// at 2× the size you saw). See the upload flow in useUpload.ts.
|
|
6
|
+
|
|
7
|
+
/** Natural (intrinsic) pixel dimensions of an image. */
|
|
8
|
+
export interface NaturalSize {
|
|
9
|
+
width: number;
|
|
10
|
+
height: number;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* The on-screen display size for an image given its NATURAL pixel dimensions, the
|
|
15
|
+
* current device pixel ratio, and the editor's content width. Returns `undefined`
|
|
16
|
+
* when natural dimensions are unknown/invalid (caller leaves the block unsized —
|
|
17
|
+
* the renderer falls back to intrinsic size capped by CSS `max-width: 100%`).
|
|
18
|
+
*
|
|
19
|
+
* `width = round(min(naturalWidth / dpr, capWidth))`, height scaled to preserve
|
|
20
|
+
* the natural aspect ratio. A non-positive `dpr` is treated as `1`; a
|
|
21
|
+
* non-positive `capWidth` means "no cap".
|
|
22
|
+
*/
|
|
23
|
+
export function computeDisplaySize(
|
|
24
|
+
naturalWidth: number | undefined,
|
|
25
|
+
naturalHeight: number | undefined,
|
|
26
|
+
dpr: number,
|
|
27
|
+
capWidth: number,
|
|
28
|
+
): NaturalSize | undefined {
|
|
29
|
+
if (!naturalWidth || !naturalHeight || naturalWidth <= 0 || naturalHeight <= 0) return undefined;
|
|
30
|
+
const ratio = dpr > 0 ? dpr : 1;
|
|
31
|
+
const perceived = naturalWidth / ratio;
|
|
32
|
+
const target = capWidth > 0 ? Math.min(perceived, capWidth) : perceived;
|
|
33
|
+
const width = Math.max(1, Math.round(target));
|
|
34
|
+
const height = Math.max(1, Math.round((width / naturalWidth) * naturalHeight));
|
|
35
|
+
return { width, height };
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Limit a resize `maxWidth` so the image's rendered HEIGHT stays within its
|
|
40
|
+
* display cap (#644): `min(maxWidth, capHeight × naturalWidth / naturalHeight)`.
|
|
41
|
+
* Returns `maxWidth` unchanged when the natural size is unknown (not yet loaded)
|
|
42
|
+
* or `capHeight` is not a positive number (e.g. jsdom applies no stylesheet).
|
|
43
|
+
*/
|
|
44
|
+
export function capWidthToHeight(
|
|
45
|
+
maxWidth: number,
|
|
46
|
+
naturalWidth: number | undefined,
|
|
47
|
+
naturalHeight: number | undefined,
|
|
48
|
+
capHeight: number,
|
|
49
|
+
): number {
|
|
50
|
+
if (!naturalWidth || !naturalHeight || !(capHeight > 0)) return maxWidth;
|
|
51
|
+
return Math.min(maxWidth, (capHeight * naturalWidth) / naturalHeight);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Measure an image File's natural pixel dimensions in the browser via
|
|
56
|
+
* `createImageBitmap`. Resolves `null` for non-images, when the API is
|
|
57
|
+
* unavailable (e.g. jsdom — so unit tests never block on image decoding), or on
|
|
58
|
+
* any decode error. Injected into `useUpload` so it can be stubbed in tests.
|
|
59
|
+
*/
|
|
60
|
+
export async function measureImageFromFile(file: File): Promise<NaturalSize | null> {
|
|
61
|
+
if (!file.type?.startsWith('image/') || typeof createImageBitmap !== 'function') return null;
|
|
62
|
+
try {
|
|
63
|
+
const bitmap = await createImageBitmap(file);
|
|
64
|
+
const size = { width: bitmap.width, height: bitmap.height };
|
|
65
|
+
bitmap.close?.();
|
|
66
|
+
return size.width > 0 && size.height > 0 ? size : null;
|
|
67
|
+
} catch {
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { RichTextEditor } from './RichTextEditor';
|
|
2
|
+
export type { RichTextEditorProps } from './RichTextEditor';
|
|
3
|
+
export type { MentionItem, MentionsConfig } from './mentions';
|
|
4
|
+
export { UploadError } from './useUpload';
|
|
5
|
+
export type { UploadConfig, UploadResult } from './useUpload';
|