@eocrm/design-system 0.0.0-stage → 0.6.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AI-PRIMER.md +341 -0
- package/LICENSE +202 -0
- package/README.md +266 -2
- package/docs/components/Accordion.md +114 -0
- package/docs/components/AgentAvatar.md +58 -0
- package/docs/components/Alert.md +81 -0
- package/docs/components/AppLayout.md +70 -0
- package/docs/components/Avatar.md +49 -0
- package/docs/components/AvatarGroup.md +47 -0
- package/docs/components/Badge.md +60 -0
- package/docs/components/Banner.md +89 -0
- package/docs/components/BrandIcon.md +32 -0
- package/docs/components/Breadcrumb.md +72 -0
- package/docs/components/Button.md +107 -0
- package/docs/components/ButtonGroup.md +78 -0
- package/docs/components/Calendar.md +158 -0
- package/docs/components/Card.md +165 -0
- package/docs/components/CatalogPicker.md +83 -0
- package/docs/components/Chart.md +114 -0
- package/docs/components/ChatBubble.md +55 -0
- package/docs/components/ChatLauncher.md +97 -0
- package/docs/components/Checkbox.md +55 -0
- package/docs/components/CircularProgress.md +53 -0
- package/docs/components/Cluster.md +96 -0
- package/docs/components/Code.md +35 -0
- package/docs/components/CodeBlock.md +67 -0
- package/docs/components/ColorPicker.md +115 -0
- package/docs/components/ConfirmationPopover.md +70 -0
- package/docs/components/Constrain.md +39 -0
- package/docs/components/CurrencySelect.md +57 -0
- package/docs/components/CursorPagination.md +43 -0
- package/docs/components/DashboardCanvas.md +79 -0
- package/docs/components/DashboardWidget.md +131 -0
- package/docs/components/DataTable.md +88 -0
- package/docs/components/DatePicker.md +68 -0
- package/docs/components/DateRangePicker.md +71 -0
- package/docs/components/DateStrip.md +56 -0
- package/docs/components/DefinitionList.md +82 -0
- package/docs/components/Divider.md +57 -0
- package/docs/components/Dot.md +26 -0
- package/docs/components/Drawer.md +94 -0
- package/docs/components/DropdownMenu.md +299 -0
- package/docs/components/EmojiPicker.md +84 -0
- package/docs/components/EmptyState.md +55 -0
- package/docs/components/EntityChip.md +102 -0
- package/docs/components/ErrorState.md +72 -0
- package/docs/components/Field.md +91 -0
- package/docs/components/FileUpload.md +109 -0
- package/docs/components/FilterChip.md +88 -0
- package/docs/components/FlowCanvas.md +108 -0
- package/docs/components/FormRow.md +31 -0
- package/docs/components/FormSection.md +37 -0
- package/docs/components/Grid.md +103 -0
- package/docs/components/Highlight.md +75 -0
- package/docs/components/HighlightedText.md +50 -0
- package/docs/components/IconPicker.md +134 -0
- package/docs/components/IconTile.md +30 -0
- package/docs/components/Image.md +84 -0
- package/docs/components/ImageCrop.md +163 -0
- package/docs/components/Indent.md +31 -0
- package/docs/components/InlineDatePicker.md +58 -0
- package/docs/components/InlineDateRangePicker.md +57 -0
- package/docs/components/Input.md +54 -0
- package/docs/components/Kanban.md +122 -0
- package/docs/components/Kbd.md +41 -0
- package/docs/components/Lightbox.md +105 -0
- package/docs/components/Link.md +65 -0
- package/docs/components/LinkCard.md +41 -0
- package/docs/components/LiquidEditor.md +84 -0
- package/docs/components/List.md +68 -0
- package/docs/components/LiveRegion.md +29 -0
- package/docs/components/LocaleProvider.md +25 -0
- package/docs/components/Logo.md +41 -0
- package/docs/components/Masonry.md +48 -0
- package/docs/components/MediaTile.md +95 -0
- package/docs/components/Modal.md +107 -0
- package/docs/components/MoneyInput.md +62 -0
- package/docs/components/OptionsPicker.md +123 -0
- package/docs/components/OtpInput.md +65 -0
- package/docs/components/Page.md +35 -0
- package/docs/components/PageHeader.md +133 -0
- package/docs/components/Pagination.md +44 -0
- package/docs/components/Palette.md +32 -0
- package/docs/components/PasswordInput.md +45 -0
- package/docs/components/PasswordStrengthMeter.md +27 -0
- package/docs/components/PersonDisplay.md +153 -0
- package/docs/components/PhoneInput.md +54 -0
- package/docs/components/PillMenu.md +91 -0
- package/docs/components/Popover.md +127 -0
- package/docs/components/Progress.md +56 -0
- package/docs/components/QrCode.md +34 -0
- package/docs/components/Radio.md +37 -0
- package/docs/components/RadioGroup.md +56 -0
- package/docs/components/Rail.md +191 -0
- package/docs/components/RelativeDateInput.md +114 -0
- package/docs/components/RichText.md +44 -0
- package/docs/components/RichTextEditor.md +112 -0
- package/docs/components/Screen.md +37 -0
- package/docs/components/ScrollArea.md +39 -0
- package/docs/components/Select.md +131 -0
- package/docs/components/SettingRow.md +98 -0
- package/docs/components/Skeleton.md +68 -0
- package/docs/components/Slider.md +92 -0
- package/docs/components/SlotGrid.md +55 -0
- package/docs/components/SocialButton.md +31 -0
- package/docs/components/Sortable.md +127 -0
- package/docs/components/SortableGroup.md +52 -0
- package/docs/components/Sparkline.md +51 -0
- package/docs/components/Split.md +76 -0
- package/docs/components/Stack.md +59 -0
- package/docs/components/StagePath.md +66 -0
- package/docs/components/StatGroup.md +61 -0
- package/docs/components/StatTile.md +58 -0
- package/docs/components/Sticky.md +69 -0
- package/docs/components/Switch.md +89 -0
- package/docs/components/Table.md +184 -0
- package/docs/components/TableOfContents.md +76 -0
- package/docs/components/Tabs.md +94 -0
- package/docs/components/Text.md +63 -0
- package/docs/components/Textarea.md +59 -0
- package/docs/components/Thread.md +52 -0
- package/docs/components/TimeField.md +70 -0
- package/docs/components/Timeline.md +57 -0
- package/docs/components/Title.md +54 -0
- package/docs/components/ToastViewport.md +61 -0
- package/docs/components/Tooltip.md +63 -0
- package/docs/components/TopBar.md +214 -0
- package/docs/components/Tour.md +85 -0
- package/docs/components/TreeView.md +113 -0
- package/docs/components/VisuallyHidden.md +43 -0
- package/docs/components/WidgetPreview.md +54 -0
- package/docs/components/useBelowBreakpoint.md +11 -0
- package/docs/components/useMonth.md +18 -0
- package/docs/setup.md +51 -0
- package/docs/theming.md +95 -0
- package/docs/tokens.md +123 -0
- package/docs/transient-state.md +56 -0
- package/package.json +86 -4
- package/src/_meta/manifest.ts +293 -0
- package/src/app/AppProvider.tsx +78 -0
- package/src/app/index.ts +3 -0
- package/src/app/themeTokens.ts +95 -0
- package/src/calendar/dateMath.ts +114 -0
- package/src/calendar/formatters.ts +75 -0
- package/src/calendar/index.ts +39 -0
- package/src/calendar/types.ts +36 -0
- package/src/calendar/useAgenda.ts +70 -0
- package/src/calendar/useDay.ts +51 -0
- package/src/calendar/useMonth.ts +82 -0
- package/src/calendar/useWeek.ts +62 -0
- package/src/calendar/weekInfo.ts +83 -0
- package/src/components/Accordion/Accordion.module.scss +304 -0
- package/src/components/Accordion/Accordion.tokens.scss +64 -0
- package/src/components/Accordion/Accordion.tsx +272 -0
- package/src/components/Accordion/AccordionContent.tsx +36 -0
- package/src/components/Accordion/AccordionItem.tsx +66 -0
- package/src/components/Accordion/AccordionTrigger.tsx +121 -0
- package/src/components/Accordion/context.ts +47 -0
- package/src/components/Accordion/index.ts +14 -0
- package/src/components/Alert/Alert.module.scss +92 -0
- package/src/components/Alert/Alert.tokens.scss +60 -0
- package/src/components/Alert/Alert.tsx +136 -0
- package/src/components/Alert/index.ts +2 -0
- package/src/components/AppLayout/AppLayout.module.scss +130 -0
- package/src/components/AppLayout/AppLayout.tokens.scss +27 -0
- package/src/components/AppLayout/AppLayout.tsx +211 -0
- package/src/components/AppLayout/index.ts +2 -0
- package/src/components/Avatar/AgentAvatar.module.scss +117 -0
- package/src/components/Avatar/AgentAvatar.tsx +122 -0
- package/src/components/Avatar/Avatar.module.scss +181 -0
- package/src/components/Avatar/Avatar.tokens.scss +107 -0
- package/src/components/Avatar/Avatar.tsx +210 -0
- package/src/components/Avatar/AvatarGroup.module.scss +128 -0
- package/src/components/Avatar/AvatarGroup.tsx +119 -0
- package/src/components/Avatar/AvatarGroupContext.tsx +20 -0
- package/src/components/Avatar/index.ts +6 -0
- package/src/components/Badge/Badge.module.scss +124 -0
- package/src/components/Badge/Badge.tokens.scss +74 -0
- package/src/components/Badge/Badge.tsx +164 -0
- package/src/components/Badge/index.ts +2 -0
- package/src/components/Banner/Banner.module.scss +73 -0
- package/src/components/Banner/Banner.tokens.scss +51 -0
- package/src/components/Banner/Banner.tsx +138 -0
- package/src/components/Banner/index.ts +2 -0
- package/src/components/BrandIcon/BrandIcon.module.scss +5 -0
- package/src/components/BrandIcon/BrandIcon.tsx +99 -0
- package/src/components/BrandIcon/index.ts +2 -0
- package/src/components/Breadcrumb/Breadcrumb.module.scss +32 -0
- package/src/components/Breadcrumb/Breadcrumb.tokens.scss +9 -0
- package/src/components/Breadcrumb/Breadcrumb.tsx +146 -0
- package/src/components/Breadcrumb/index.ts +2 -0
- package/src/components/Button/Button.module.scss +167 -0
- package/src/components/Button/Button.tokens.scss +90 -0
- package/src/components/Button/Button.tsx +205 -0
- package/src/components/Button/index.ts +2 -0
- package/src/components/ButtonGroup/ButtonGroup.module.scss +134 -0
- package/src/components/ButtonGroup/ButtonGroup.tokens.scss +42 -0
- package/src/components/ButtonGroup/ButtonGroup.tsx +278 -0
- package/src/components/ButtonGroup/ButtonGroupItem.tsx +74 -0
- package/src/components/ButtonGroup/context.ts +45 -0
- package/src/components/ButtonGroup/index.ts +2 -0
- package/src/components/Calendar/AgendaView.module.scss +231 -0
- package/src/components/Calendar/AgendaView.tsx +214 -0
- package/src/components/Calendar/AllDayBand.module.scss +18 -0
- package/src/components/Calendar/AllDayBand.tsx +75 -0
- package/src/components/Calendar/Calendar.module.scss +23 -0
- package/src/components/Calendar/Calendar.tokens.scss +262 -0
- package/src/components/Calendar/Calendar.tsx +370 -0
- package/src/components/Calendar/DayCell.module.scss +30 -0
- package/src/components/Calendar/DayCell.tsx +50 -0
- package/src/components/Calendar/DayView.module.scss +10 -0
- package/src/components/Calendar/DayView.tsx +163 -0
- package/src/components/Calendar/EventChip.module.scss +171 -0
- package/src/components/Calendar/EventChip.tsx +115 -0
- package/src/components/Calendar/HourGrid.module.scss +123 -0
- package/src/components/Calendar/HourGrid.tsx +381 -0
- package/src/components/Calendar/MonthView.module.scss +99 -0
- package/src/components/Calendar/MonthView.tsx +296 -0
- package/src/components/Calendar/TimedEvent.module.scss +205 -0
- package/src/components/Calendar/TimedEvent.tsx +247 -0
- package/src/components/Calendar/ViewSwitcher.module.scss +3 -0
- package/src/components/Calendar/ViewSwitcher.tsx +47 -0
- package/src/components/Calendar/WeekView.module.scss +10 -0
- package/src/components/Calendar/WeekView.tsx +137 -0
- package/src/components/Calendar/eventColor.ts +60 -0
- package/src/components/Calendar/index.ts +18 -0
- package/src/components/Calendar/types.ts +451 -0
- package/src/components/Calendar/useEventDrag.ts +783 -0
- package/src/components/Calendar/utils.ts +622 -0
- package/src/components/Card/Card.module.scss +264 -0
- package/src/components/Card/Card.tokens.scss +55 -0
- package/src/components/Card/Card.tsx +170 -0
- package/src/components/Card/CardBody.tsx +45 -0
- package/src/components/Card/CardHeader.tsx +113 -0
- package/src/components/Card/CardList.tsx +24 -0
- package/src/components/Card/CardListRow.tsx +24 -0
- package/src/components/Card/index.ts +7 -0
- package/src/components/CatalogPicker/CatalogPicker.module.scss +193 -0
- package/src/components/CatalogPicker/CatalogPicker.tokens.scss +26 -0
- package/src/components/CatalogPicker/CatalogPicker.tsx +339 -0
- package/src/components/CatalogPicker/index.ts +2 -0
- package/src/components/Chart/Chart.module.scss +287 -0
- package/src/components/Chart/Chart.tokens.scss +63 -0
- package/src/components/Chart/Chart.tsx +607 -0
- package/src/components/Chart/ChartLegend.tsx +99 -0
- package/src/components/Chart/ChartTable.tsx +62 -0
- package/src/components/Chart/ChartTooltip.tsx +91 -0
- package/src/components/Chart/chartModel.ts +689 -0
- package/src/components/Chart/index.ts +2 -0
- package/src/components/ChatBubble/ChatBubble.module.scss +93 -0
- package/src/components/ChatBubble/ChatBubble.tokens.scss +17 -0
- package/src/components/ChatBubble/ChatBubble.tsx +61 -0
- package/src/components/ChatBubble/ChatBubbleList.tsx +27 -0
- package/src/components/ChatBubble/index.ts +3 -0
- package/src/components/ChatLauncher/ChatLauncher.module.scss +68 -0
- package/src/components/ChatLauncher/ChatLauncher.tokens.scss +27 -0
- package/src/components/ChatLauncher/ChatLauncher.tsx +202 -0
- package/src/components/ChatLauncher/index.ts +2 -0
- package/src/components/ChatLauncher/isAtBottom.ts +12 -0
- package/src/components/Checkbox/Checkbox.module.scss +147 -0
- package/src/components/Checkbox/Checkbox.tokens.scss +44 -0
- package/src/components/Checkbox/Checkbox.tsx +188 -0
- package/src/components/Checkbox/index.ts +2 -0
- package/src/components/CircularProgress/CircularProgress.module.scss +133 -0
- package/src/components/CircularProgress/CircularProgress.tokens.scss +40 -0
- package/src/components/CircularProgress/CircularProgress.tsx +139 -0
- package/src/components/CircularProgress/index.ts +7 -0
- package/src/components/Cluster/Cluster.module.scss +145 -0
- package/src/components/Cluster/Cluster.tokens.scss +11 -0
- package/src/components/Cluster/Cluster.tsx +215 -0
- package/src/components/Cluster/index.ts +2 -0
- package/src/components/Code/Code.module.scss +28 -0
- package/src/components/Code/Code.tokens.scss +15 -0
- package/src/components/Code/Code.tsx +44 -0
- package/src/components/Code/index.ts +2 -0
- package/src/components/CodeBlock/CodeBlock.module.scss +146 -0
- package/src/components/CodeBlock/CodeBlock.tokens.scss +27 -0
- package/src/components/CodeBlock/CodeBlock.tsx +274 -0
- package/src/components/CodeBlock/highlight.ts +179 -0
- package/src/components/CodeBlock/index.ts +8 -0
- package/src/components/CodeBlock/sampleSync.ts +42 -0
- package/src/components/ColorPicker/ColorPicker.module.scss +286 -0
- package/src/components/ColorPicker/ColorPicker.tokens.scss +60 -0
- package/src/components/ColorPicker/ColorPicker.tsx +367 -0
- package/src/components/ColorPicker/ColorPickerPanel.tsx +265 -0
- package/src/components/ColorPicker/SVSquare.tsx +189 -0
- package/src/components/ColorPicker/colorMath.ts +141 -0
- package/src/components/ColorPicker/index.ts +6 -0
- package/src/components/ConfirmationPopover/ConfirmationPopover.module.scss +39 -0
- package/src/components/ConfirmationPopover/ConfirmationPopover.tokens.scss +13 -0
- package/src/components/ConfirmationPopover/ConfirmationPopover.tsx +395 -0
- package/src/components/ConfirmationPopover/index.ts +2 -0
- package/src/components/Constrain/Constrain.module.scss +99 -0
- package/src/components/Constrain/Constrain.tsx +79 -0
- package/src/components/Constrain/index.ts +2 -0
- package/src/components/CurrencySelect/CurrencySelect.module.scss +7 -0
- package/src/components/CurrencySelect/CurrencySelect.tsx +167 -0
- package/src/components/CurrencySelect/index.ts +3 -0
- package/src/components/CursorPagination/CursorPagination.module.scss +69 -0
- package/src/components/CursorPagination/CursorPagination.tokens.scss +32 -0
- package/src/components/CursorPagination/CursorPagination.tsx +121 -0
- package/src/components/CursorPagination/index.ts +2 -0
- package/src/components/DashboardCanvas/DashboardCanvas.module.scss +360 -0
- package/src/components/DashboardCanvas/DashboardCanvas.tokens.scss +48 -0
- package/src/components/DashboardCanvas/DashboardCanvas.tsx +1270 -0
- package/src/components/DashboardCanvas/DashboardCanvasItem.tsx +140 -0
- package/src/components/DashboardCanvas/DashboardCanvasSection.tsx +174 -0
- package/src/components/DashboardCanvas/engine.ts +363 -0
- package/src/components/DashboardCanvas/index.ts +9 -0
- package/src/components/DashboardWidget/DashboardWidget.module.scss +100 -0
- package/src/components/DashboardWidget/DashboardWidget.tokens.scss +16 -0
- package/src/components/DashboardWidget/DashboardWidget.tsx +188 -0
- package/src/components/DashboardWidget/index.ts +7 -0
- package/src/components/DataTable/BodyRow.tsx +197 -0
- package/src/components/DataTable/ColumnVisibilityTrigger.module.scss +7 -0
- package/src/components/DataTable/ColumnVisibilityTrigger.tsx +105 -0
- package/src/components/DataTable/DataTable.module.scss +511 -0
- package/src/components/DataTable/DataTable.tokens.scss +80 -0
- package/src/components/DataTable/DataTable.tsx +734 -0
- package/src/components/DataTable/HeaderCell.module.scss +215 -0
- package/src/components/DataTable/HeaderCell.tsx +440 -0
- package/src/components/DataTable/columnShift.ts +117 -0
- package/src/components/DataTable/index.ts +23 -0
- package/src/components/DataTable/pinStyle.ts +47 -0
- package/src/components/DataTable/reorderColumns.ts +66 -0
- package/src/components/DataTable/types.ts +289 -0
- package/src/components/DataTable/useColumnDragShift.ts +216 -0
- package/src/components/DataTable/useDataTable.ts +372 -0
- package/src/components/DataTable/useResizeHandle.ts +97 -0
- package/src/components/DatePicker/DatePicker.module.scss +180 -0
- package/src/components/DatePicker/DatePicker.tokens.scss +152 -0
- package/src/components/DatePicker/DatePicker.tsx +664 -0
- package/src/components/DatePicker/DatePickerGrid.module.scss +172 -0
- package/src/components/DatePicker/DatePickerGrid.tsx +341 -0
- package/src/components/DatePicker/InlineDatePicker.module.scss +32 -0
- package/src/components/DatePicker/InlineDatePicker.tsx +201 -0
- package/src/components/DatePicker/index.ts +4 -0
- package/src/components/DatePicker/utils.ts +364 -0
- package/src/components/DateRangePicker/DateRangePicker.module.scss +237 -0
- package/src/components/DateRangePicker/DateRangePicker.tokens.scss +78 -0
- package/src/components/DateRangePicker/DateRangePicker.tsx +720 -0
- package/src/components/DateRangePicker/InlineDateRangePicker.module.scss +94 -0
- package/src/components/DateRangePicker/InlineDateRangePicker.tsx +376 -0
- package/src/components/DateRangePicker/index.ts +5 -0
- package/src/components/DateRangePicker/utils.ts +151 -0
- package/src/components/DateStrip/DateStrip.module.scss +78 -0
- package/src/components/DateStrip/DateStrip.tokens.scss +23 -0
- package/src/components/DateStrip/DateStrip.tsx +205 -0
- package/src/components/DateStrip/index.ts +2 -0
- package/src/components/DefinitionList/DefinitionList.module.scss +102 -0
- package/src/components/DefinitionList/DefinitionList.tokens.scss +29 -0
- package/src/components/DefinitionList/DefinitionList.tsx +198 -0
- package/src/components/DefinitionList/index.ts +9 -0
- package/src/components/Divider/Divider.module.scss +144 -0
- package/src/components/Divider/Divider.tokens.scss +21 -0
- package/src/components/Divider/Divider.tsx +103 -0
- package/src/components/Divider/index.ts +2 -0
- package/src/components/Dot/Dot.module.scss +40 -0
- package/src/components/Dot/Dot.tokens.scss +4 -0
- package/src/components/Dot/Dot.tsx +45 -0
- package/src/components/Dot/index.ts +2 -0
- package/src/components/Drawer/Body.tsx +23 -0
- package/src/components/Drawer/Close.tsx +35 -0
- package/src/components/Drawer/Content.tsx +93 -0
- package/src/components/Drawer/Drawer.module.scss +232 -0
- package/src/components/Drawer/Drawer.tokens.scss +38 -0
- package/src/components/Drawer/Drawer.tsx +23 -0
- package/src/components/Drawer/DrawerRoot.tsx +190 -0
- package/src/components/Drawer/Footer.tsx +24 -0
- package/src/components/Drawer/Header.tsx +64 -0
- package/src/components/Drawer/Overlay.tsx +82 -0
- package/src/components/Drawer/context.ts +44 -0
- package/src/components/Drawer/index.ts +12 -0
- package/src/components/Drawer/useDragToClose.ts +149 -0
- package/src/components/DropdownMenu/CheckboxItem.tsx +144 -0
- package/src/components/DropdownMenu/Content.tsx +419 -0
- package/src/components/DropdownMenu/DropdownMenu.module.scss +280 -0
- package/src/components/DropdownMenu/DropdownMenu.tokens.scss +88 -0
- package/src/components/DropdownMenu/DropdownMenu.tsx +43 -0
- package/src/components/DropdownMenu/Group.tsx +76 -0
- package/src/components/DropdownMenu/Item.tsx +148 -0
- package/src/components/DropdownMenu/ItemIndicator.tsx +30 -0
- package/src/components/DropdownMenu/Radio.tsx +178 -0
- package/src/components/DropdownMenu/Root.tsx +100 -0
- package/src/components/DropdownMenu/Sub.tsx +332 -0
- package/src/components/DropdownMenu/Trigger.tsx +76 -0
- package/src/components/DropdownMenu/context.ts +65 -0
- package/src/components/DropdownMenu/index.ts +20 -0
- package/src/components/EmojiPicker/EmojiPicker.module.scss +84 -0
- package/src/components/EmojiPicker/EmojiPicker.tokens.scss +24 -0
- package/src/components/EmojiPicker/EmojiPicker.tsx +341 -0
- package/src/components/EmojiPicker/emojiData.ts +245 -0
- package/src/components/EmojiPicker/index.ts +3 -0
- package/src/components/EmptyState/EmptyState.module.scss +102 -0
- package/src/components/EmptyState/EmptyState.tokens.scss +28 -0
- package/src/components/EmptyState/EmptyState.tsx +112 -0
- package/src/components/EmptyState/index.ts +7 -0
- package/src/components/EntityChip/EntityChip.module.scss +275 -0
- package/src/components/EntityChip/EntityChip.tokens.scss +66 -0
- package/src/components/EntityChip/EntityChip.tsx +649 -0
- package/src/components/EntityChip/index.ts +10 -0
- package/src/components/ErrorState/ErrorState.module.scss +105 -0
- package/src/components/ErrorState/ErrorState.tokens.scss +32 -0
- package/src/components/ErrorState/ErrorState.tsx +125 -0
- package/src/components/ErrorState/index.ts +8 -0
- package/src/components/Field/Field.module.scss +46 -0
- package/src/components/Field/Field.tsx +185 -0
- package/src/components/Field/index.ts +2 -0
- package/src/components/FileUpload/FileUpload.module.scss +187 -0
- package/src/components/FileUpload/FileUpload.tokens.scss +81 -0
- package/src/components/FileUpload/FileUpload.tsx +569 -0
- package/src/components/FileUpload/formatBytes.ts +34 -0
- package/src/components/FileUpload/iconForFile.ts +40 -0
- package/src/components/FileUpload/index.ts +2 -0
- package/src/components/FilterChip/FilterChip.module.scss +61 -0
- package/src/components/FilterChip/FilterChip.tokens.scss +25 -0
- package/src/components/FilterChip/FilterChip.tsx +208 -0
- package/src/components/FilterChip/index.ts +5 -0
- package/src/components/FlowCanvas/FlowCanvas.module.scss +329 -0
- package/src/components/FlowCanvas/FlowCanvas.tokens.scss +45 -0
- package/src/components/FlowCanvas/FlowCanvas.tsx +1867 -0
- package/src/components/FlowCanvas/FlowControls.tsx +46 -0
- package/src/components/FlowCanvas/FlowEdge.tsx +58 -0
- package/src/components/FlowCanvas/FlowNode.tsx +76 -0
- package/src/components/FlowCanvas/edgePath.ts +85 -0
- package/src/components/FlowCanvas/index.ts +4 -0
- package/src/components/FlowCanvas/layout.ts +148 -0
- package/src/components/FlowCanvas/spatialNav.ts +76 -0
- package/src/components/FlowCanvas/types.ts +59 -0
- package/src/components/FlowCanvas/useViewport.ts +122 -0
- package/src/components/FormRow/FormRow.module.scss +2 -0
- package/src/components/FormRow/FormRow.tsx +37 -0
- package/src/components/FormRow/index.ts +2 -0
- package/src/components/FormSection/FormSection.module.scss +24 -0
- package/src/components/FormSection/FormSection.tsx +46 -0
- package/src/components/FormSection/index.ts +2 -0
- package/src/components/Grid/Grid.module.scss +162 -0
- package/src/components/Grid/Grid.tokens.scss +13 -0
- package/src/components/Grid/Grid.tsx +226 -0
- package/src/components/Grid/GridItem.tsx +77 -0
- package/src/components/Grid/index.ts +11 -0
- package/src/components/Highlight/Highlight.module.scss +43 -0
- package/src/components/Highlight/Highlight.tokens.scss +35 -0
- package/src/components/Highlight/Highlight.tsx +164 -0
- package/src/components/Highlight/HighlightOverlay.tsx +100 -0
- package/src/components/Highlight/index.ts +2 -0
- package/src/components/HighlightedText/HighlightedText.module.scss +11 -0
- package/src/components/HighlightedText/HighlightedText.tokens.scss +9 -0
- package/src/components/HighlightedText/HighlightedText.tsx +50 -0
- package/src/components/HighlightedText/highlightRanges.ts +44 -0
- package/src/components/HighlightedText/index.ts +2 -0
- package/src/components/IconPicker/IconPicker.module.scss +175 -0
- package/src/components/IconPicker/IconPicker.tokens.scss +40 -0
- package/src/components/IconPicker/IconPicker.tsx +629 -0
- package/src/components/IconPicker/index.ts +9 -0
- package/src/components/IconTile/IconTile.module.scss +57 -0
- package/src/components/IconTile/IconTile.tokens.scss +16 -0
- package/src/components/IconTile/IconTile.tsx +91 -0
- package/src/components/IconTile/index.ts +2 -0
- package/src/components/Image/Image.module.scss +266 -0
- package/src/components/Image/Image.tokens.scss +55 -0
- package/src/components/Image/Image.tsx +342 -0
- package/src/components/Image/index.ts +2 -0
- package/src/components/ImageCrop/ImageCrop.module.scss +274 -0
- package/src/components/ImageCrop/ImageCrop.tokens.scss +33 -0
- package/src/components/ImageCrop/ImageCrop.tsx +542 -0
- package/src/components/ImageCrop/cropGeometry.ts +120 -0
- package/src/components/ImageCrop/extractCropBlob.ts +140 -0
- package/src/components/ImageCrop/index.ts +11 -0
- package/src/components/ImageCrop/useCropPreview.ts +161 -0
- package/src/components/Indent/Indent.module.scss +33 -0
- package/src/components/Indent/Indent.tokens.scss +10 -0
- package/src/components/Indent/Indent.tsx +46 -0
- package/src/components/Indent/index.ts +2 -0
- package/src/components/Input/Input.module.scss +99 -0
- package/src/components/Input/Input.tokens.scss +54 -0
- package/src/components/Input/Input.tsx +105 -0
- package/src/components/Input/Suggestions.tsx +260 -0
- package/src/components/Input/index.ts +2 -0
- package/src/components/Kanban/Kanban.module.scss +39 -0
- package/src/components/Kanban/Kanban.tokens.scss +15 -0
- package/src/components/Kanban/Kanban.tsx +951 -0
- package/src/components/Kanban/index.ts +7 -0
- package/src/components/Kbd/Kbd.module.scss +47 -0
- package/src/components/Kbd/Kbd.tokens.scss +26 -0
- package/src/components/Kbd/Kbd.tsx +73 -0
- package/src/components/Kbd/index.ts +2 -0
- package/src/components/Lightbox/Lightbox.module.scss +283 -0
- package/src/components/Lightbox/Lightbox.tokens.scss +36 -0
- package/src/components/Lightbox/Lightbox.tsx +506 -0
- package/src/components/Lightbox/index.ts +2 -0
- package/src/components/Link/Link.module.scss +78 -0
- package/src/components/Link/Link.tokens.scss +28 -0
- package/src/components/Link/Link.tsx +114 -0
- package/src/components/Link/index.ts +2 -0
- package/src/components/LinkCard/LinkCard.module.scss +92 -0
- package/src/components/LinkCard/LinkCard.tokens.scss +9 -0
- package/src/components/LinkCard/LinkCard.tsx +72 -0
- package/src/components/LinkCard/index.ts +2 -0
- package/src/components/LiquidEditor/AutocompleteMenu.tsx +133 -0
- package/src/components/LiquidEditor/HighlightLayer.tsx +53 -0
- package/src/components/LiquidEditor/InsertVariableMenu.tsx +81 -0
- package/src/components/LiquidEditor/LiquidEditor.module.scss +339 -0
- package/src/components/LiquidEditor/LiquidEditor.tokens.scss +81 -0
- package/src/components/LiquidEditor/LiquidEditor.tsx +412 -0
- package/src/components/LiquidEditor/PreviewPane.tsx +29 -0
- package/src/components/LiquidEditor/caretCoordinates.ts +97 -0
- package/src/components/LiquidEditor/index.ts +7 -0
- package/src/components/LiquidEditor/liquidFilters.ts +23 -0
- package/src/components/LiquidEditor/liquidTokenizer.ts +235 -0
- package/src/components/LiquidEditor/types.ts +101 -0
- package/src/components/LiquidEditor/useLiquidAutocomplete.ts +178 -0
- package/src/components/List/List.module.scss +105 -0
- package/src/components/List/List.tokens.scss +42 -0
- package/src/components/List/List.tsx +124 -0
- package/src/components/List/index.ts +9 -0
- package/src/components/LiveRegion/LiveRegion.module.scss +3 -0
- package/src/components/LiveRegion/LiveRegion.tsx +116 -0
- package/src/components/LiveRegion/index.ts +2 -0
- package/src/components/Logo/Logo.module.scss +139 -0
- package/src/components/Logo/Logo.tokens.scss +14 -0
- package/src/components/Logo/Logo.tsx +126 -0
- package/src/components/Logo/index.ts +2 -0
- package/src/components/Masonry/Masonry.module.scss +42 -0
- package/src/components/Masonry/Masonry.tokens.scss +8 -0
- package/src/components/Masonry/Masonry.tsx +136 -0
- package/src/components/Masonry/index.ts +2 -0
- package/src/components/Masonry/masonryUtils.ts +42 -0
- package/src/components/MediaTile/MediaTile.module.scss +183 -0
- package/src/components/MediaTile/MediaTile.tokens.scss +60 -0
- package/src/components/MediaTile/MediaTile.tsx +208 -0
- package/src/components/MediaTile/index.ts +8 -0
- package/src/components/Modal/Body.tsx +27 -0
- package/src/components/Modal/Close.tsx +45 -0
- package/src/components/Modal/Content.tsx +98 -0
- package/src/components/Modal/Footer.tsx +28 -0
- package/src/components/Modal/Header.tsx +51 -0
- package/src/components/Modal/Modal.module.scss +262 -0
- package/src/components/Modal/Modal.tokens.scss +50 -0
- package/src/components/Modal/Modal.tsx +23 -0
- package/src/components/Modal/ModalRoot.tsx +299 -0
- package/src/components/Modal/Overlay.tsx +101 -0
- package/src/components/Modal/context.ts +60 -0
- package/src/components/Modal/index.ts +11 -0
- package/src/components/MoneyInput/MoneyInput.module.scss +57 -0
- package/src/components/MoneyInput/MoneyInput.tsx +433 -0
- package/src/components/MoneyInput/index.ts +2 -0
- package/src/components/OptionsPicker/OptionsPicker.module.scss +216 -0
- package/src/components/OptionsPicker/OptionsPicker.tokens.scss +68 -0
- package/src/components/OptionsPicker/OptionsPicker.tsx +936 -0
- package/src/components/OptionsPicker/index.ts +9 -0
- package/src/components/OtpInput/OtpInput.module.scss +69 -0
- package/src/components/OtpInput/OtpInput.tokens.scss +45 -0
- package/src/components/OtpInput/OtpInput.tsx +368 -0
- package/src/components/OtpInput/index.ts +2 -0
- package/src/components/Page/Page.module.scss +30 -0
- package/src/components/Page/Page.tokens.scss +11 -0
- package/src/components/Page/Page.tsx +53 -0
- package/src/components/Page/index.ts +2 -0
- package/src/components/PageHeader/PageHeader.module.scss +197 -0
- package/src/components/PageHeader/PageHeader.tokens.scss +41 -0
- package/src/components/PageHeader/PageHeader.tsx +310 -0
- package/src/components/PageHeader/index.ts +20 -0
- package/src/components/Pagination/Pagination.module.scss +117 -0
- package/src/components/Pagination/Pagination.tokens.scss +54 -0
- package/src/components/Pagination/Pagination.tsx +165 -0
- package/src/components/Pagination/index.ts +4 -0
- package/src/components/Pagination/paginationRange.ts +72 -0
- package/src/components/PasswordInput/PasswordInput.module.scss +120 -0
- package/src/components/PasswordInput/PasswordInput.tokens.scss +44 -0
- package/src/components/PasswordInput/PasswordInput.tsx +210 -0
- package/src/components/PasswordInput/index.ts +2 -0
- package/src/components/PasswordStrengthMeter/PasswordStrengthMeter.module.scss +80 -0
- package/src/components/PasswordStrengthMeter/PasswordStrengthMeter.tokens.scss +40 -0
- package/src/components/PasswordStrengthMeter/PasswordStrengthMeter.tsx +96 -0
- package/src/components/PasswordStrengthMeter/index.ts +2 -0
- package/src/components/PersonDisplay/PersonDisplay.module.scss +180 -0
- package/src/components/PersonDisplay/PersonDisplay.tokens.scss +35 -0
- package/src/components/PersonDisplay/PersonDisplay.tsx +420 -0
- package/src/components/PersonDisplay/index.ts +10 -0
- package/src/components/PhoneInput/PhoneInput.module.scss +23 -0
- package/src/components/PhoneInput/PhoneInput.tsx +271 -0
- package/src/components/PhoneInput/index.ts +4 -0
- package/src/components/PhoneInput/phone.ts +128 -0
- package/src/components/PillMenu/PillMenu.module.scss +117 -0
- package/src/components/PillMenu/PillMenu.tokens.scss +22 -0
- package/src/components/PillMenu/PillMenu.tsx +324 -0
- package/src/components/PillMenu/index.ts +2 -0
- package/src/components/Popover/Anchor.tsx +37 -0
- package/src/components/Popover/Close.tsx +45 -0
- package/src/components/Popover/Content.tsx +213 -0
- package/src/components/Popover/Heading.tsx +33 -0
- package/src/components/Popover/Popover.module.scss +177 -0
- package/src/components/Popover/Popover.tokens.scss +22 -0
- package/src/components/Popover/Popover.tsx +23 -0
- package/src/components/Popover/PopoverRoot.tsx +75 -0
- package/src/components/Popover/Trigger.tsx +86 -0
- package/src/components/Popover/context.ts +22 -0
- package/src/components/Popover/index.ts +7 -0
- package/src/components/Progress/Progress.module.scss +110 -0
- package/src/components/Progress/Progress.tokens.scss +44 -0
- package/src/components/Progress/Progress.tsx +129 -0
- package/src/components/Progress/index.ts +2 -0
- package/src/components/QrCode/QrCode.module.scss +97 -0
- package/src/components/QrCode/QrCode.tokens.scss +17 -0
- package/src/components/QrCode/QrCode.tsx +233 -0
- package/src/components/QrCode/index.ts +2 -0
- package/src/components/QrCode/qr.ts +161 -0
- package/src/components/Radio/Radio.module.scss +175 -0
- package/src/components/Radio/Radio.tokens.scss +59 -0
- package/src/components/Radio/Radio.tsx +127 -0
- package/src/components/Radio/RadioGroup.module.scss +42 -0
- package/src/components/Radio/RadioGroup.tsx +120 -0
- package/src/components/Radio/RadioGroupContext.tsx +30 -0
- package/src/components/Radio/index.ts +4 -0
- package/src/components/Rail/Rail.module.scss +510 -0
- package/src/components/Rail/Rail.tokens.scss +92 -0
- package/src/components/Rail/Rail.tsx +287 -0
- package/src/components/Rail/RailCollapseToggle.tsx +57 -0
- package/src/components/Rail/RailFooter.tsx +17 -0
- package/src/components/Rail/RailGroup.tsx +728 -0
- package/src/components/Rail/RailGroupContext.ts +9 -0
- package/src/components/Rail/RailHeader.tsx +23 -0
- package/src/components/Rail/RailItem.tsx +119 -0
- package/src/components/Rail/RailSection.tsx +39 -0
- package/src/components/Rail/RailSpacer.tsx +19 -0
- package/src/components/Rail/index.ts +9 -0
- package/src/components/RelativeDateInput/RelativeDateInput.module.scss +15 -0
- package/src/components/RelativeDateInput/RelativeDateInput.tokens.scss +6 -0
- package/src/components/RelativeDateInput/RelativeDateInput.tsx +474 -0
- package/src/components/RelativeDateInput/index.ts +10 -0
- package/src/components/RelativeDateInput/relativeDate.ts +127 -0
- package/src/components/RichText/RichText.module.scss +5 -0
- package/src/components/RichText/RichText.tsx +70 -0
- package/src/components/RichText/RichTextAttachment.module.scss +82 -0
- package/src/components/RichText/RichTextAttachment.tsx +122 -0
- package/src/components/RichText/_prose.scss +79 -0
- package/src/components/RichText/attachmentIcon.tsx +24 -0
- package/src/components/RichText/engine/attachment.ts +154 -0
- package/src/components/RichText/engine/autolink.ts +64 -0
- package/src/components/RichText/engine/blockUnit.ts +174 -0
- package/src/components/RichText/engine/colorMarks.ts +85 -0
- package/src/components/RichText/engine/escape.ts +11 -0
- package/src/components/RichText/engine/fromHtml.ts +353 -0
- package/src/components/RichText/engine/fromMarkdown.ts +20 -0
- package/src/components/RichText/engine/inlines.ts +82 -0
- package/src/components/RichText/engine/listDepths.ts +32 -0
- package/src/components/RichText/engine/marks.ts +80 -0
- package/src/components/RichText/engine/mdToHtml.ts +178 -0
- package/src/components/RichText/engine/model.ts +157 -0
- package/src/components/RichText/engine/position.ts +118 -0
- package/src/components/RichText/engine/renderDoc.tsx +395 -0
- package/src/components/RichText/engine/renderLink.ts +15 -0
- package/src/components/RichText/engine/renderMention.ts +16 -0
- package/src/components/RichText/engine/safeHref.ts +22 -0
- package/src/components/RichText/engine/toHtml.ts +154 -0
- package/src/components/RichText/engine/toMarkdown.ts +97 -0
- package/src/components/RichText/engine/transforms.ts +434 -0
- package/src/components/RichText/imageMaxHeightStyle.ts +10 -0
- package/src/components/RichText/index.ts +31 -0
- package/src/components/RichTextEditor/RichTextAttachmentConfig.tsx +264 -0
- package/src/components/RichTextEditor/RichTextBlockControls.tsx +365 -0
- package/src/components/RichTextEditor/RichTextBlockMenu.tsx +162 -0
- package/src/components/RichTextEditor/RichTextColorMenu.tsx +115 -0
- package/src/components/RichTextEditor/RichTextEditor.module.scss +298 -0
- package/src/components/RichTextEditor/RichTextEditor.tsx +1910 -0
- package/src/components/RichTextEditor/RichTextImageResizer.tsx +131 -0
- package/src/components/RichTextEditor/RichTextLinkEditor.tsx +151 -0
- package/src/components/RichTextEditor/RichTextMentionMenu.tsx +99 -0
- package/src/components/RichTextEditor/RichTextToolbar.tsx +379 -0
- package/src/components/RichTextEditor/autolinkInput.ts +65 -0
- package/src/components/RichTextEditor/blockDrop.ts +9 -0
- package/src/components/RichTextEditor/blockReflow.ts +62 -0
- package/src/components/RichTextEditor/commands.ts +300 -0
- package/src/components/RichTextEditor/history.ts +93 -0
- package/src/components/RichTextEditor/icons.tsx +152 -0
- package/src/components/RichTextEditor/imageSize.ts +70 -0
- package/src/components/RichTextEditor/index.ts +5 -0
- package/src/components/RichTextEditor/input.ts +209 -0
- package/src/components/RichTextEditor/inputRules.ts +71 -0
- package/src/components/RichTextEditor/links.ts +103 -0
- package/src/components/RichTextEditor/mentionContext.ts +37 -0
- package/src/components/RichTextEditor/mentions.ts +28 -0
- package/src/components/RichTextEditor/preventSelectionLoss.ts +15 -0
- package/src/components/RichTextEditor/selection.ts +415 -0
- package/src/components/RichTextEditor/shortcuts.ts +44 -0
- package/src/components/RichTextEditor/useAnchoredFloating.ts +50 -0
- package/src/components/RichTextEditor/useAttachmentConfig.ts +134 -0
- package/src/components/RichTextEditor/useDismissOnOutsidePointerDown.ts +26 -0
- package/src/components/RichTextEditor/useLinkEditor.ts +107 -0
- package/src/components/RichTextEditor/useMention.ts +226 -0
- package/src/components/RichTextEditor/useOverlayRect.ts +73 -0
- package/src/components/RichTextEditor/useUpload.ts +246 -0
- package/src/components/Screen/Screen.module.scss +46 -0
- package/src/components/Screen/Screen.tokens.scss +20 -0
- package/src/components/Screen/Screen.tsx +97 -0
- package/src/components/Screen/index.ts +2 -0
- package/src/components/ScrollArea/ScrollArea.module.scss +39 -0
- package/src/components/ScrollArea/ScrollArea.tokens.scss +15 -0
- package/src/components/ScrollArea/ScrollArea.tsx +154 -0
- package/src/components/ScrollArea/index.ts +2 -0
- package/src/components/Select/Chip.tsx +45 -0
- package/src/components/Select/Empty.tsx +39 -0
- package/src/components/Select/Error.tsx +51 -0
- package/src/components/Select/HiddenInputs.tsx +44 -0
- package/src/components/Select/Listbox.tsx +557 -0
- package/src/components/Select/Loading.tsx +30 -0
- package/src/components/Select/Select.module.scss +512 -0
- package/src/components/Select/Select.tokens.scss +140 -0
- package/src/components/Select/Select.tsx +685 -0
- package/src/components/Select/Trigger.tsx +952 -0
- package/src/components/Select/context.ts +101 -0
- package/src/components/Select/emptyStateText.ts +19 -0
- package/src/components/Select/index.ts +9 -0
- package/src/components/Select/useSelectState.ts +157 -0
- package/src/components/Select/utils-types.ts +7 -0
- package/src/components/Select/utils.ts +122 -0
- package/src/components/SettingRow/SettingRow.module.scss +166 -0
- package/src/components/SettingRow/SettingRow.tokens.scss +37 -0
- package/src/components/SettingRow/SettingRow.tsx +242 -0
- package/src/components/SettingRow/index.ts +7 -0
- package/src/components/Skeleton/Skeleton.module.scss +55 -0
- package/src/components/Skeleton/Skeleton.tokens.scss +17 -0
- package/src/components/Skeleton/Skeleton.tsx +131 -0
- package/src/components/Skeleton/index.ts +4 -0
- package/src/components/Skeleton/useSkeletonVisibility.ts +95 -0
- package/src/components/Slider/Slider.module.scss +293 -0
- package/src/components/Slider/Slider.tokens.scss +98 -0
- package/src/components/Slider/Slider.tsx +624 -0
- package/src/components/Slider/index.ts +9 -0
- package/src/components/SlotGrid/SlotGrid.module.scss +61 -0
- package/src/components/SlotGrid/SlotGrid.tokens.scss +21 -0
- package/src/components/SlotGrid/SlotGrid.tsx +111 -0
- package/src/components/SlotGrid/index.ts +2 -0
- package/src/components/SocialButton/SocialButton.module.scss +4 -0
- package/src/components/SocialButton/SocialButton.tsx +40 -0
- package/src/components/SocialButton/index.ts +2 -0
- package/src/components/Sortable/Sortable.module.scss +177 -0
- package/src/components/Sortable/Sortable.tokens.scss +27 -0
- package/src/components/Sortable/Sortable.tsx +572 -0
- package/src/components/Sortable/containerAwareCollision.ts +125 -0
- package/src/components/Sortable/index.ts +13 -0
- package/src/components/SortableGroup/SortableGroup.module.scss +23 -0
- package/src/components/SortableGroup/SortableGroup.tsx +315 -0
- package/src/components/SortableGroup/index.ts +4 -0
- package/src/components/SortableGroup/moveSortableItem.ts +39 -0
- package/src/components/Sparkline/Sparkline.module.scss +28 -0
- package/src/components/Sparkline/Sparkline.tokens.scss +7 -0
- package/src/components/Sparkline/Sparkline.tsx +133 -0
- package/src/components/Sparkline/index.ts +2 -0
- package/src/components/Sparkline/sparklineModel.ts +119 -0
- package/src/components/Split/Split.module.scss +158 -0
- package/src/components/Split/Split.tokens.scss +10 -0
- package/src/components/Split/Split.tsx +231 -0
- package/src/components/Split/index.ts +2 -0
- package/src/components/Stack/Stack.module.scss +67 -0
- package/src/components/Stack/Stack.tokens.scss +11 -0
- package/src/components/Stack/Stack.tsx +100 -0
- package/src/components/Stack/index.ts +2 -0
- package/src/components/StagePath/StagePath.module.scss +255 -0
- package/src/components/StagePath/StagePath.tokens.scss +43 -0
- package/src/components/StagePath/StagePath.tsx +176 -0
- package/src/components/StagePath/index.ts +2 -0
- package/src/components/StatGroup/StatGroup.module.scss +6 -0
- package/src/components/StatGroup/StatGroup.tsx +70 -0
- package/src/components/StatGroup/StatGroupContext.ts +10 -0
- package/src/components/StatGroup/StatTile.module.scss +99 -0
- package/src/components/StatGroup/StatTile.tokens.scss +35 -0
- package/src/components/StatGroup/StatTile.tsx +143 -0
- package/src/components/StatGroup/index.ts +4 -0
- package/src/components/Sticky/Sticky.module.scss +98 -0
- package/src/components/Sticky/Sticky.tokens.scss +17 -0
- package/src/components/Sticky/Sticky.tsx +103 -0
- package/src/components/Sticky/index.ts +2 -0
- package/src/components/Switch/Switch.module.scss +182 -0
- package/src/components/Switch/Switch.tokens.scss +59 -0
- package/src/components/Switch/Switch.tsx +214 -0
- package/src/components/Switch/index.ts +2 -0
- package/src/components/Table/Table.module.scss +308 -0
- package/src/components/Table/Table.tokens.scss +79 -0
- package/src/components/Table/Table.tsx +381 -0
- package/src/components/Table/index.ts +15 -0
- package/src/components/TableOfContents/TableOfContents.module.scss +83 -0
- package/src/components/TableOfContents/TableOfContents.tokens.scss +26 -0
- package/src/components/TableOfContents/TableOfContents.tsx +192 -0
- package/src/components/TableOfContents/activeSection.ts +18 -0
- package/src/components/TableOfContents/index.ts +2 -0
- package/src/components/Tabs/Tabs.module.scss +359 -0
- package/src/components/Tabs/Tabs.tokens.scss +50 -0
- package/src/components/Tabs/Tabs.tsx +538 -0
- package/src/components/Tabs/index.ts +2 -0
- package/src/components/Text/Text.module.scss +115 -0
- package/src/components/Text/Text.tokens.scss +55 -0
- package/src/components/Text/Text.tsx +197 -0
- package/src/components/Text/index.ts +2 -0
- package/src/components/Textarea/Textarea.module.scss +94 -0
- package/src/components/Textarea/Textarea.tokens.scss +48 -0
- package/src/components/Textarea/Textarea.tsx +246 -0
- package/src/components/Textarea/index.ts +2 -0
- package/src/components/Thread/Thread.module.scss +161 -0
- package/src/components/Thread/Thread.tokens.scss +32 -0
- package/src/components/Thread/Thread.tsx +176 -0
- package/src/components/Thread/index.ts +2 -0
- package/src/components/TimeField/TimeField.module.scss +232 -0
- package/src/components/TimeField/TimeField.tsx +793 -0
- package/src/components/TimeField/index.ts +2 -0
- package/src/components/Timeline/Timeline.module.scss +58 -0
- package/src/components/Timeline/Timeline.tokens.scss +13 -0
- package/src/components/Timeline/Timeline.tsx +53 -0
- package/src/components/Timeline/index.ts +2 -0
- package/src/components/Title/Title.module.scss +84 -0
- package/src/components/Title/Title.tokens.scss +37 -0
- package/src/components/Title/Title.tsx +150 -0
- package/src/components/Title/index.ts +2 -0
- package/src/components/Toast/Toast.module.scss +299 -0
- package/src/components/Toast/Toast.tokens.scss +65 -0
- package/src/components/Toast/Toast.tsx +122 -0
- package/src/components/Toast/ToastViewport.tsx +166 -0
- package/src/components/Toast/api.ts +175 -0
- package/src/components/Toast/index.ts +5 -0
- package/src/components/Toast/store.ts +133 -0
- package/src/components/Toast/useToastTimer.ts +94 -0
- package/src/components/Tooltip/Tooltip.module.scss +99 -0
- package/src/components/Tooltip/Tooltip.tokens.scss +23 -0
- package/src/components/Tooltip/Tooltip.tsx +341 -0
- package/src/components/Tooltip/index.ts +2 -0
- package/src/components/TopBar/TopBar.module.scss +235 -0
- package/src/components/TopBar/TopBar.tokens.scss +79 -0
- package/src/components/TopBar/TopBar.tsx +87 -0
- package/src/components/TopBar/TopBarEnd.tsx +20 -0
- package/src/components/TopBar/TopBarIconButton.tsx +86 -0
- package/src/components/TopBar/TopBarSearch.tsx +319 -0
- package/src/components/TopBar/TopBarSearchPanel.tsx +268 -0
- package/src/components/TopBar/TopBarStart.tsx +20 -0
- package/src/components/TopBar/index.ts +11 -0
- package/src/components/Tour/Spotlight.tsx +121 -0
- package/src/components/Tour/Tour.module.scss +210 -0
- package/src/components/Tour/Tour.tokens.scss +58 -0
- package/src/components/Tour/Tour.tsx +617 -0
- package/src/components/Tour/index.ts +2 -0
- package/src/components/Tour/useTourTarget.ts +115 -0
- package/src/components/TreeView/TreeView.module.scss +268 -0
- package/src/components/TreeView/TreeView.tokens.scss +36 -0
- package/src/components/TreeView/TreeView.tsx +536 -0
- package/src/components/TreeView/index.ts +3 -0
- package/src/components/TreeView/treeModel.ts +224 -0
- package/src/components/VisuallyHidden/VisuallyHidden.module.scss +7 -0
- package/src/components/VisuallyHidden/VisuallyHidden.tsx +29 -0
- package/src/components/VisuallyHidden/index.ts +2 -0
- package/src/components/WidgetPreview/WidgetPreview.module.scss +11 -0
- package/src/components/WidgetPreview/WidgetPreview.tokens.scss +26 -0
- package/src/components/WidgetPreview/WidgetPreview.tsx +36 -0
- package/src/components/WidgetPreview/WidgetShape.module.scss +140 -0
- package/src/components/WidgetPreview/WidgetShape.tsx +159 -0
- package/src/components/WidgetPreview/index.ts +2 -0
- package/src/components/_internal/Trend.tsx +27 -0
- package/src/components/_internal/choiceTile.scss +74 -0
- package/src/components/_internal/collapse.scss +10 -0
- package/src/components/_internal/collapse.ts +58 -0
- package/src/components/_internal/currency.ts +257 -0
- package/src/components/_internal/dragAnnouncements.ts +200 -0
- package/src/components/_internal/fieldWiring.ts +225 -0
- package/src/components/_internal/gridSpan.ts +54 -0
- package/src/components/_internal/isoDay.ts +35 -0
- package/src/components/_internal/letterKey.ts +26 -0
- package/src/components/_internal/overlay/focusRestore.ts +21 -0
- package/src/components/_internal/overlay/index.ts +12 -0
- package/src/components/_internal/overlay/tourHold.ts +23 -0
- package/src/components/_internal/overlay/useFocusTrap.ts +120 -0
- package/src/components/_internal/overlay/useInOverlay.ts +81 -0
- package/src/components/_internal/overlay/useOverlayStack.ts +232 -0
- package/src/components/_internal/overlay/useScrollLock.ts +112 -0
- package/src/components/_internal/refs.ts +48 -0
- package/src/components/_internal/statusColor.ts +26 -0
- package/src/components/_internal/timeUtils.ts +23 -0
- package/src/components/_internal/useAsyncOptions.ts +145 -0
- package/src/components/_internal/useClippedTooltip.ts +50 -0
- package/src/components/_internal/useControllableState.ts +50 -0
- package/src/components.manifest.json +1141 -0
- package/src/hooks/useBelowBreakpoint.ts +58 -0
- package/src/i18n/I18nProvider.tsx +52 -0
- package/src/i18n/LocaleProvider.tsx +17 -0
- package/src/i18n/en.ts +648 -0
- package/src/i18n/format.ts +71 -0
- package/src/i18n/index.ts +13 -0
- package/src/i18n/messages.ts +1275 -0
- package/src/i18n/ru.ts +677 -0
- package/src/i18n/useLocale.ts +19 -0
- package/src/i18n/useTranslation.ts +58 -0
- package/src/index.ts +913 -0
- package/src/palette/index.ts +2 -0
- package/src/palette/palette.ts +108 -0
- package/src/styles/dark.scss +4 -0
- package/src/styles/global.scss +7 -0
- package/src/styles/mixins.scss +143 -0
- package/src/styles/reset.scss +78 -0
- package/src/styles/tokens.scss +18 -0
- package/src/styles/typography.scss +44 -0
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
import clsx from 'clsx';
|
|
3
|
+
import { useButtonGroupContext, type ButtonGroupSize } from './context';
|
|
4
|
+
import styles from './ButtonGroup.module.scss';
|
|
5
|
+
|
|
6
|
+
export interface ButtonGroupItemProps {
|
|
7
|
+
/** Value emitted to `onValueChange` when this item is selected. */
|
|
8
|
+
value: string;
|
|
9
|
+
/** Per-item disabled. Group-level disabled is OR-merged. */
|
|
10
|
+
disabled?: boolean;
|
|
11
|
+
/** className merges onto the rendered <button>. */
|
|
12
|
+
className?: string;
|
|
13
|
+
/**
|
|
14
|
+
* Accessible name for the radio, when the visible text is an abbreviation
|
|
15
|
+
* (`S` / `M` / `L` → "Small tiles"). Start it with the visible text where you
|
|
16
|
+
* can ("S, small tiles") so voice-control users can say what they see
|
|
17
|
+
* (WCAG 2.5.3). Omit it when `children` already reads as a full name.
|
|
18
|
+
*/
|
|
19
|
+
'aria-label'?: string;
|
|
20
|
+
/** id(s) of element(s) describing the option — forwarded to the radio. */
|
|
21
|
+
'aria-describedby'?: string;
|
|
22
|
+
children: ReactNode;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const sizeClass: Record<ButtonGroupSize, string> = {
|
|
26
|
+
xs: styles.sizeXs,
|
|
27
|
+
sm: styles.sizeSm,
|
|
28
|
+
md: styles.sizeMd,
|
|
29
|
+
lg: styles.sizeLg,
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Segmented-mode item. Renders `<button role="radio">` with roving tabindex.
|
|
34
|
+
* @see docs/components/ButtonGroup.md
|
|
35
|
+
*/
|
|
36
|
+
export function ButtonGroupItem({
|
|
37
|
+
value,
|
|
38
|
+
disabled = false,
|
|
39
|
+
className,
|
|
40
|
+
children,
|
|
41
|
+
'aria-label': ariaLabel,
|
|
42
|
+
'aria-describedby': ariaDescribedBy,
|
|
43
|
+
}: ButtonGroupItemProps) {
|
|
44
|
+
const ctx = useButtonGroupContext('Item');
|
|
45
|
+
|
|
46
|
+
const isSelected = ctx.value === value;
|
|
47
|
+
const effectiveDisabled = disabled || ctx.disabled;
|
|
48
|
+
|
|
49
|
+
return (
|
|
50
|
+
<button
|
|
51
|
+
type="button"
|
|
52
|
+
role="radio"
|
|
53
|
+
aria-checked={isSelected}
|
|
54
|
+
aria-label={ariaLabel}
|
|
55
|
+
aria-describedby={ariaDescribedBy}
|
|
56
|
+
aria-disabled={effectiveDisabled || undefined}
|
|
57
|
+
// Selected item holds the tab stop; when NOTHING is selected the group
|
|
58
|
+
// would otherwise have no tab stop at all and be unreachable by keyboard
|
|
59
|
+
// (#499). APG: the first radio takes focus when none is checked.
|
|
60
|
+
tabIndex={isSelected || ctx.rovingFallbackValue === value ? 0 : -1}
|
|
61
|
+
data-selected={isSelected ? '' : undefined}
|
|
62
|
+
data-value={value}
|
|
63
|
+
onClick={() => {
|
|
64
|
+
if (effectiveDisabled) return;
|
|
65
|
+
if (isSelected) return;
|
|
66
|
+
ctx.onValueChange(value);
|
|
67
|
+
}}
|
|
68
|
+
onKeyDown={(e) => ctx.handleItemKeyDown(e, value)}
|
|
69
|
+
className={clsx(styles.item, sizeClass[ctx.size], className)}
|
|
70
|
+
>
|
|
71
|
+
{children}
|
|
72
|
+
</button>
|
|
73
|
+
);
|
|
74
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { createContext, useContext, type KeyboardEvent } from 'react';
|
|
2
|
+
import type { ButtonSize } from '../Button';
|
|
3
|
+
|
|
4
|
+
/** Matches Button's size scale. */
|
|
5
|
+
export type ButtonGroupSize = ButtonSize;
|
|
6
|
+
|
|
7
|
+
export interface ButtonGroupContextValue {
|
|
8
|
+
/** Currently-selected value. Set when in segmented mode. */
|
|
9
|
+
value: string;
|
|
10
|
+
/** Fires on selection change. */
|
|
11
|
+
onValueChange: (next: string) => void;
|
|
12
|
+
/** Group-level size, propagated to Items via context. */
|
|
13
|
+
size: ButtonGroupSize;
|
|
14
|
+
/** Group-level disabled. Individual Items can also be disabled. */
|
|
15
|
+
disabled: boolean;
|
|
16
|
+
/** Item delegates its keydown to the parent for Arrow/Home/End handling. */
|
|
17
|
+
handleItemKeyDown: (e: KeyboardEvent<HTMLButtonElement>, value: string) => void;
|
|
18
|
+
/**
|
|
19
|
+
* Value of the item that should hold the group's single tab stop when
|
|
20
|
+
* NOTHING is selected, or `null` when something is.
|
|
21
|
+
*
|
|
22
|
+
* The roving tabindex was `isSelected ? 0 : -1`, so a group whose `value`
|
|
23
|
+
* matched no item — the ordinary initial state of a single-select group with
|
|
24
|
+
* nothing chosen — gave every item `tabIndex={-1}` and the radiogroup itself
|
|
25
|
+
* none. Tab skipped the whole control, and since the arrow keys live on the
|
|
26
|
+
* items, roving navigation could never be entered either: a WCAG 2.1.1
|
|
27
|
+
* failure for the unselected state. WAI-ARIA APG: "If no radio button is
|
|
28
|
+
* checked, the first radio button in the group receives focus."
|
|
29
|
+
*
|
|
30
|
+
* Resolved from the DOM rather than from registration order, for the same
|
|
31
|
+
* reason `handleItemKeyDown` queries the DOM — consumer-reordered children
|
|
32
|
+
* must be walked in their actual visual order.
|
|
33
|
+
*/
|
|
34
|
+
rovingFallbackValue: string | null;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export const ButtonGroupContext = createContext<ButtonGroupContextValue | null>(null);
|
|
38
|
+
|
|
39
|
+
export function useButtonGroupContext(componentName: string): ButtonGroupContextValue {
|
|
40
|
+
const ctx = useContext(ButtonGroupContext);
|
|
41
|
+
if (!ctx) {
|
|
42
|
+
throw new Error(`<ButtonGroup.${componentName}> must be used inside <ButtonGroup>.`);
|
|
43
|
+
}
|
|
44
|
+
return ctx;
|
|
45
|
+
}
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
@use '../../styles/mixins' as *;
|
|
2
|
+
@use './Calendar.tokens';
|
|
3
|
+
|
|
4
|
+
.agenda {
|
|
5
|
+
display: flex;
|
|
6
|
+
flex-direction: column;
|
|
7
|
+
padding: var(--calendar-agenda-padding-y) 0;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
.empty {
|
|
11
|
+
padding: var(--calendar-agenda-empty-padding);
|
|
12
|
+
text-align: center;
|
|
13
|
+
font-size: var(--calendar-agenda-empty-font-size);
|
|
14
|
+
color: var(--calendar-agenda-empty-fg);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
// Each dayGroup carries its own bottom padding (in place of `gap` on
|
|
18
|
+
// `.agenda`) so the today-group's accent borders extend down through the
|
|
19
|
+
// spacing area, all the way to the next day-header's top border.
|
|
20
|
+
// `gap` provides the breathing room between the dayHeader and the rows.
|
|
21
|
+
// `padding-bottom` matches that gap so the space below the last row
|
|
22
|
+
// equals the space above the first row.
|
|
23
|
+
.dayGroup {
|
|
24
|
+
display: flex;
|
|
25
|
+
flex-direction: column;
|
|
26
|
+
gap: var(--calendar-agenda-day-group-gap);
|
|
27
|
+
padding-bottom: var(--calendar-agenda-day-group-padding-bottom);
|
|
28
|
+
border-left: var(--border-width) solid var(--calendar-border-color);
|
|
29
|
+
border-right: var(--border-width) solid var(--calendar-border-color);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// The last day-group has no "next" header to provide its closing
|
|
33
|
+
// horizontal line — add an explicit bottom border so the list reads as
|
|
34
|
+
// closed at the bottom edge.
|
|
35
|
+
.dayGroup:last-child {
|
|
36
|
+
border-bottom: var(--border-width) solid var(--calendar-border-color);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// Today's group swaps its grey side borders for the accent color so the
|
|
40
|
+
// current day is framed in blue on all four edges (together with the
|
|
41
|
+
// accent top/bottom on `.dayHeader`).
|
|
42
|
+
.todayGroup {
|
|
43
|
+
position: relative;
|
|
44
|
+
border-left-color: var(--calendar-accent);
|
|
45
|
+
border-right-color: var(--calendar-accent);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Today's side borders end exactly at the next day-header's accent top
|
|
49
|
+
// border. This pseudo-element draws a 1px accent strip spanning the full
|
|
50
|
+
// width of the today-group just below it, so the bottom-left and
|
|
51
|
+
// bottom-right corners both meet the next header's horizontal line
|
|
52
|
+
// cleanly instead of stopping a pixel short.
|
|
53
|
+
.todayGroup::after {
|
|
54
|
+
content: '';
|
|
55
|
+
position: absolute;
|
|
56
|
+
left: 0;
|
|
57
|
+
right: 0;
|
|
58
|
+
bottom: calc(var(--border-width) * -1);
|
|
59
|
+
height: var(--border-width);
|
|
60
|
+
background: var(--calendar-accent);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// Today's day-header band gets an accent tint + accent border so the
|
|
64
|
+
// current day is instantly findable when the agenda list is long. The
|
|
65
|
+
// rows area stays untinted so event tone dots keep their contrast.
|
|
66
|
+
.todayGroup .dayHeader {
|
|
67
|
+
background: var(--calendar-agenda-day-header-bg-today);
|
|
68
|
+
border-top-color: var(--calendar-agenda-day-header-border-today);
|
|
69
|
+
border-bottom-color: var(--calendar-agenda-day-header-border-today);
|
|
70
|
+
color: var(--calendar-agenda-day-header-fg-today);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// The next day-group's top border continues the today accent so the
|
|
74
|
+
// vertical left-border line lands cleanly on a matching horizontal one,
|
|
75
|
+
// instead of meeting a plain grey rule.
|
|
76
|
+
.todayGroup + .dayGroup .dayHeader {
|
|
77
|
+
border-top-color: var(--calendar-agenda-day-header-border-today);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// Day-header reads as a full-width banded row. Top + bottom borders frame
|
|
81
|
+
// the band so it doesn't float against an empty row gap; subtle fill
|
|
82
|
+
// reinforces the day-group boundary visually.
|
|
83
|
+
.dayHeader {
|
|
84
|
+
padding: var(--calendar-agenda-day-header-padding);
|
|
85
|
+
background: var(--calendar-agenda-day-header-bg);
|
|
86
|
+
border-top: var(--border-width) solid var(--calendar-border-color);
|
|
87
|
+
border-bottom: var(--border-width) solid var(--calendar-border-color);
|
|
88
|
+
font-size: var(--calendar-agenda-day-header-font-size);
|
|
89
|
+
font-weight: var(--calendar-agenda-day-header-font-weight);
|
|
90
|
+
color: var(--calendar-agenda-day-header-fg);
|
|
91
|
+
font-variant-numeric: tabular-nums;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
.rows {
|
|
95
|
+
display: flex;
|
|
96
|
+
flex-direction: column;
|
|
97
|
+
gap: var(--calendar-agenda-rows-gap);
|
|
98
|
+
padding-left: var(--calendar-agenda-rows-padding-left);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
.rowButton {
|
|
102
|
+
display: grid;
|
|
103
|
+
grid-template-columns: var(--calendar-agenda-row-gutter-width) auto 1fr;
|
|
104
|
+
align-items: center;
|
|
105
|
+
gap: var(--calendar-agenda-row-gap);
|
|
106
|
+
width: 100%;
|
|
107
|
+
padding: var(--calendar-agenda-row-padding);
|
|
108
|
+
border: none;
|
|
109
|
+
border-radius: var(--calendar-agenda-row-radius);
|
|
110
|
+
|
|
111
|
+
// background-COLOR, not the shorthand: this is (0,1,0), the same as
|
|
112
|
+
// `.striped`, so the shorthand would reset the band's background-image and
|
|
113
|
+
// lose only by source order. The UA button style needs background-color reset
|
|
114
|
+
// anyway; background-image is already none.
|
|
115
|
+
background-color: transparent;
|
|
116
|
+
font-family: inherit;
|
|
117
|
+
font-size: var(--calendar-agenda-row-font-size);
|
|
118
|
+
color: var(--calendar-agenda-row-fg);
|
|
119
|
+
text-align: left;
|
|
120
|
+
cursor: pointer;
|
|
121
|
+
transition: background var(--calendar-agenda-row-transition-bg);
|
|
122
|
+
|
|
123
|
+
&:hover:not(:disabled) {
|
|
124
|
+
// background-COLOR, not the shorthand: this rule is `.rowButton:hover:not(…)`
|
|
125
|
+
// at specificity (0,3,0), so the shorthand reset `background-image` to none
|
|
126
|
+
// and erased `.striped`'s band (0,1,0) on hover. Unlike the chip and the
|
|
127
|
+
// block, `.rowButton` has `border: none`, so there was no border left to
|
|
128
|
+
// carry even a sliver — the state signal vanished entirely.
|
|
129
|
+
background-color: var(--calendar-agenda-row-bg-hover);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
&:focus-visible {
|
|
133
|
+
@include focus-ring;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
.timeGutter {
|
|
138
|
+
font-size: var(--calendar-agenda-time-font-size);
|
|
139
|
+
color: var(--calendar-agenda-time-fg);
|
|
140
|
+
font-variant-numeric: tabular-nums;
|
|
141
|
+
white-space: nowrap;
|
|
142
|
+
overflow: hidden;
|
|
143
|
+
text-overflow: ellipsis;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
.allDay {
|
|
147
|
+
font-style: normal;
|
|
148
|
+
font-weight: var(--calendar-agenda-all-day-font-weight);
|
|
149
|
+
color: var(--calendar-agenda-all-day-fg);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// The tone dot sits between gutter and body to color-code the event
|
|
153
|
+
// without tinting the whole row (which would clash with the today-group
|
|
154
|
+
// accent and the hover background).
|
|
155
|
+
.toneDot {
|
|
156
|
+
width: var(--calendar-agenda-tone-dot-size);
|
|
157
|
+
height: var(--calendar-agenda-tone-dot-size);
|
|
158
|
+
border-radius: var(--calendar-agenda-tone-dot-radius);
|
|
159
|
+
background: currentColor;
|
|
160
|
+
flex-shrink: 0;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
.body {
|
|
164
|
+
min-width: 0;
|
|
165
|
+
display: flex;
|
|
166
|
+
align-items: center;
|
|
167
|
+
gap: var(--calendar-agenda-body-gap);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
.title {
|
|
171
|
+
min-width: 0;
|
|
172
|
+
overflow: hidden;
|
|
173
|
+
text-overflow: ellipsis;
|
|
174
|
+
white-space: nowrap;
|
|
175
|
+
font-weight: var(--calendar-agenda-title-font-weight);
|
|
176
|
+
color: var(--calendar-agenda-title-fg);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
// ── Per-event palette color (CalendarEvent.color) ──────────────────────────
|
|
180
|
+
// The agenda row is never filled — tinting it would clash with the today-group
|
|
181
|
+
// accent and the hover background (see .toneDot above) — so `color` drives the
|
|
182
|
+
// leading dot instead, and a non-neutral `tone` still gets its edge stripe.
|
|
183
|
+
.colored {
|
|
184
|
+
// The agenda row is never filled, so `color` drives the leading dot (which
|
|
185
|
+
// inherits currentColor) rather than a background.
|
|
186
|
+
color: var(--calendar-event-color-fg, currentColor);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
.striped {
|
|
190
|
+
// Gradient, not an inset box-shadow: `:focus-visible` on this button USED TO
|
|
191
|
+
// own box-shadow for the focus ring, and would have erased the stripe
|
|
192
|
+
// outright — and unlike the chip and the block, `.rowButton` has
|
|
193
|
+
// `border: none`, so there is no border left to carry a fallback sliver.
|
|
194
|
+
// Keyboard-focusing a row would have wiped the state signal completely.
|
|
195
|
+
// Since #505 the ring is an outline, so the box-shadow slot is FREE and the
|
|
196
|
+
// reason above is no longer forcing. This row's ring is also outset (nothing
|
|
197
|
+
// here clips), so the stripe survives focus intact — unlike TimedEvent, where
|
|
198
|
+
// the inset ring covers the outer 2px of its 4px tone band. The gradient
|
|
199
|
+
// stays because nothing requires changing it, not because anything still
|
|
200
|
+
// demands it; say that rather than inventing a live reason.
|
|
201
|
+
// (Two earlier versions of this note did exactly that, borrowing TimedEvent's
|
|
202
|
+
// reasons — surviving a hover `filter: brightness()`, then composing with a
|
|
203
|
+
// drag shadow. This file has neither.)
|
|
204
|
+
background-image: linear-gradient(
|
|
205
|
+
to right,
|
|
206
|
+
var(--calendar-event-stripe-color, currentColor) 0,
|
|
207
|
+
var(--calendar-event-stripe-color, currentColor) var(--calendar-event-color-stripe-width),
|
|
208
|
+
transparent var(--calendar-event-color-stripe-width)
|
|
209
|
+
);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
// Tone -> color of the dot (via currentColor inheritance).
|
|
213
|
+
.neutral {
|
|
214
|
+
color: var(--calendar-agenda-tone-neutral);
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
.accent {
|
|
218
|
+
color: var(--calendar-agenda-tone-accent);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
.success {
|
|
222
|
+
color: var(--calendar-agenda-tone-success);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
.warning {
|
|
226
|
+
color: var(--calendar-agenda-tone-warning);
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
.danger {
|
|
230
|
+
color: var(--calendar-agenda-tone-danger);
|
|
231
|
+
}
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import { useMemo, type MouseEvent } from 'react';
|
|
2
|
+
import clsx from 'clsx';
|
|
3
|
+
import { useLocale } from '../../i18n/useLocale';
|
|
4
|
+
import { useTranslation } from '../../i18n/useTranslation';
|
|
5
|
+
import { formatDayLong, formatTime } from '../../calendar';
|
|
6
|
+
import { startOfDay } from '../../calendar/dateMath';
|
|
7
|
+
import type { Day } from '../../calendar/types';
|
|
8
|
+
import { formatEventDuration } from './utils';
|
|
9
|
+
import type { CalendarEvent, RenderEvent } from './types';
|
|
10
|
+
import { resolveEventColor } from './eventColor';
|
|
11
|
+
import styles from './AgendaView.module.scss';
|
|
12
|
+
|
|
13
|
+
export interface AgendaViewProps {
|
|
14
|
+
/** One `Day` per calendar day in the agenda window (inclusive at both ends). */
|
|
15
|
+
days: readonly Day[];
|
|
16
|
+
/** Localized range label for the agenda window (e.g., "May 18 – 24, 2026"). */
|
|
17
|
+
rangeLabel: string;
|
|
18
|
+
/** Events to project into the window. Multi-day events appear under every day they span. */
|
|
19
|
+
events: readonly CalendarEvent[];
|
|
20
|
+
/** Override locale (otherwise reads `useLocale()`). */
|
|
21
|
+
locale?: string;
|
|
22
|
+
/** Fires when the user clicks an event row. */
|
|
23
|
+
onEventClick?: (event: CalendarEvent) => void;
|
|
24
|
+
/** Optional custom event renderer (see `RenderEvent`). */
|
|
25
|
+
renderEvent?: RenderEvent;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
interface AgendaRow {
|
|
29
|
+
event: CalendarEvent;
|
|
30
|
+
/** True when this row represents an `allDay` or multi-day event. */
|
|
31
|
+
isAllDay: boolean;
|
|
32
|
+
/** Pre-formatted duration ("30m", "1h", "3d") — locale-independent. */
|
|
33
|
+
duration: string;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
interface DayGroup {
|
|
37
|
+
day: Day;
|
|
38
|
+
rows: AgendaRow[];
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Internal: agenda (list) view for `<Calendar view='agenda'>`. Projects the
|
|
43
|
+
* cursor's current-week event window into a chronological list grouped by
|
|
44
|
+
* day. Days without events are hidden so the list stays scannable.
|
|
45
|
+
*
|
|
46
|
+
* - Multi-day events appear under every day they span, each row marked
|
|
47
|
+
* `asAllDay` so the time gutter shows "All day" instead of a clock time.
|
|
48
|
+
* - Single-day timed events show the start time in the gutter.
|
|
49
|
+
* - Within a day: all-day events first, then timed events by start time.
|
|
50
|
+
*
|
|
51
|
+
* @remarks
|
|
52
|
+
* **When NOT to use:** Do not render `AgendaView` directly — use the
|
|
53
|
+
* `Calendar` shell with `view='agenda'` (or `defaultView='agenda'`). The
|
|
54
|
+
* shell owns cursor / locale / labels and dispatches into this component.
|
|
55
|
+
*/
|
|
56
|
+
export function AgendaView({
|
|
57
|
+
days,
|
|
58
|
+
rangeLabel,
|
|
59
|
+
events,
|
|
60
|
+
locale: localeOverride,
|
|
61
|
+
onEventClick,
|
|
62
|
+
renderEvent,
|
|
63
|
+
}: AgendaViewProps) {
|
|
64
|
+
const contextLocale = useLocale();
|
|
65
|
+
const locale = localeOverride ?? contextLocale;
|
|
66
|
+
const t = useTranslation();
|
|
67
|
+
|
|
68
|
+
const groups = useMemo(() => buildDayGroups(days, events), [days, events]);
|
|
69
|
+
|
|
70
|
+
if (groups.length === 0) {
|
|
71
|
+
return (
|
|
72
|
+
<div className={styles.agenda} role="list" aria-label={rangeLabel}>
|
|
73
|
+
<p className={styles.empty}>{t('calendar.agendaEmpty')}</p>
|
|
74
|
+
</div>
|
|
75
|
+
);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
return (
|
|
79
|
+
<div className={styles.agenda} role="list" aria-label={rangeLabel}>
|
|
80
|
+
{groups.map(({ day, rows }) => (
|
|
81
|
+
<div
|
|
82
|
+
key={day.key}
|
|
83
|
+
role="listitem"
|
|
84
|
+
className={clsx(styles.dayGroup, day.isToday && styles.todayGroup)}
|
|
85
|
+
>
|
|
86
|
+
<h3 className={styles.dayHeader}>{formatDayLong(day.date, locale)}</h3>
|
|
87
|
+
<div className={styles.rows}>
|
|
88
|
+
{rows.map((row) => (
|
|
89
|
+
<AgendaRowItem
|
|
90
|
+
key={`${day.key}-${row.event.id}`}
|
|
91
|
+
row={row}
|
|
92
|
+
locale={locale}
|
|
93
|
+
allDayLabel={t('calendar.allDay')}
|
|
94
|
+
onClick={onEventClick}
|
|
95
|
+
renderEvent={renderEvent}
|
|
96
|
+
/>
|
|
97
|
+
))}
|
|
98
|
+
</div>
|
|
99
|
+
</div>
|
|
100
|
+
))}
|
|
101
|
+
</div>
|
|
102
|
+
);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
interface AgendaRowItemProps {
|
|
106
|
+
row: AgendaRow;
|
|
107
|
+
locale: string;
|
|
108
|
+
allDayLabel: string;
|
|
109
|
+
onClick?: (event: CalendarEvent) => void;
|
|
110
|
+
renderEvent?: RenderEvent;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
function AgendaRowItem({ row, locale, allDayLabel, onClick, renderEvent }: AgendaRowItemProps) {
|
|
114
|
+
const { event, isAllDay, duration } = row;
|
|
115
|
+
const { toneClass, hasStripe, style: colorStyle } = resolveEventColor(event);
|
|
116
|
+
const startLabel = isAllDay ? undefined : formatTime(event.startsAt, locale);
|
|
117
|
+
const endLabel = !isAllDay && event.endsAt ? formatTime(event.endsAt, locale) : undefined;
|
|
118
|
+
const timeLabel =
|
|
119
|
+
!isAllDay && endLabel && endLabel !== startLabel ? `${startLabel} – ${endLabel}` : startLabel;
|
|
120
|
+
|
|
121
|
+
const handleClick = (e: MouseEvent<HTMLButtonElement>) => {
|
|
122
|
+
e.stopPropagation();
|
|
123
|
+
onClick?.(event);
|
|
124
|
+
};
|
|
125
|
+
|
|
126
|
+
const customContent = renderEvent
|
|
127
|
+
? renderEvent(event, {
|
|
128
|
+
view: 'agenda',
|
|
129
|
+
asAllDay: isAllDay,
|
|
130
|
+
timeLabel: isAllDay ? undefined : timeLabel,
|
|
131
|
+
duration,
|
|
132
|
+
})
|
|
133
|
+
: null;
|
|
134
|
+
|
|
135
|
+
return (
|
|
136
|
+
<button
|
|
137
|
+
type="button"
|
|
138
|
+
className={clsx(
|
|
139
|
+
styles.rowButton,
|
|
140
|
+
toneClass && styles[toneClass],
|
|
141
|
+
colorStyle && styles.colored,
|
|
142
|
+
hasStripe && styles.striped,
|
|
143
|
+
)}
|
|
144
|
+
style={colorStyle}
|
|
145
|
+
onClick={handleClick}
|
|
146
|
+
>
|
|
147
|
+
<span className={styles.timeGutter}>
|
|
148
|
+
{isAllDay ? <em className={styles.allDay}>{allDayLabel}</em> : timeLabel}
|
|
149
|
+
</span>
|
|
150
|
+
<span className={styles.toneDot} aria-hidden="true" />
|
|
151
|
+
<span className={styles.body}>
|
|
152
|
+
{customContent !== null ? (
|
|
153
|
+
customContent
|
|
154
|
+
) : (
|
|
155
|
+
<span className={styles.title}>{event.title}</span>
|
|
156
|
+
)}
|
|
157
|
+
</span>
|
|
158
|
+
</button>
|
|
159
|
+
);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Group events by day across the agenda window. Multi-day events appear
|
|
164
|
+
* under every day they span. Empty days are dropped. Within a day rows
|
|
165
|
+
* are sorted: all-day first (by startsAt), then timed events by startsAt.
|
|
166
|
+
*/
|
|
167
|
+
function buildDayGroups(days: readonly Day[], events: readonly CalendarEvent[]): DayGroup[] {
|
|
168
|
+
if (days.length === 0 || events.length === 0) return [];
|
|
169
|
+
|
|
170
|
+
// Pre-normalize each event into row data once.
|
|
171
|
+
interface Normalized {
|
|
172
|
+
event: CalendarEvent;
|
|
173
|
+
startDayMs: number;
|
|
174
|
+
endDayMs: number;
|
|
175
|
+
isAllDay: boolean;
|
|
176
|
+
isMultiDay: boolean;
|
|
177
|
+
}
|
|
178
|
+
const normalized: Normalized[] = events.map((ev) => {
|
|
179
|
+
const startDayMs = startOfDay(ev.startsAt).getTime();
|
|
180
|
+
const endDayMs = ev.endsAt ? startOfDay(ev.endsAt).getTime() : startDayMs;
|
|
181
|
+
const isAllDayProp = ev.allDay === true;
|
|
182
|
+
const isMultiDay = endDayMs > startDayMs;
|
|
183
|
+
// Multi-day events render with an "All day" gutter regardless of allDay
|
|
184
|
+
// flag — there's no single time that's meaningful across the span.
|
|
185
|
+
return {
|
|
186
|
+
event: ev,
|
|
187
|
+
startDayMs,
|
|
188
|
+
endDayMs,
|
|
189
|
+
isAllDay: isAllDayProp || isMultiDay,
|
|
190
|
+
isMultiDay,
|
|
191
|
+
};
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
const groups: DayGroup[] = [];
|
|
195
|
+
for (const day of days) {
|
|
196
|
+
const dayMs = startOfDay(day.date).getTime();
|
|
197
|
+
const dayEvents = normalized.filter((n) => n.startDayMs <= dayMs && dayMs <= n.endDayMs);
|
|
198
|
+
if (dayEvents.length === 0) continue;
|
|
199
|
+
|
|
200
|
+
// Sort: allDay/multi-day first by startsAt, then timed by startsAt.
|
|
201
|
+
dayEvents.sort((a, b) => {
|
|
202
|
+
if (a.isAllDay !== b.isAllDay) return a.isAllDay ? -1 : 1;
|
|
203
|
+
return a.event.startsAt.getTime() - b.event.startsAt.getTime();
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
const rows: AgendaRow[] = dayEvents.map((n) => ({
|
|
207
|
+
event: n.event,
|
|
208
|
+
isAllDay: n.isAllDay,
|
|
209
|
+
duration: formatEventDuration(n.event.startsAt, n.event.endsAt, n.isAllDay),
|
|
210
|
+
}));
|
|
211
|
+
groups.push({ day, rows });
|
|
212
|
+
}
|
|
213
|
+
return groups;
|
|
214
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
@use './Calendar.tokens';
|
|
2
|
+
|
|
3
|
+
.band {
|
|
4
|
+
display: grid;
|
|
5
|
+
gap: var(--calendar-all-day-band-gap);
|
|
6
|
+
padding: var(--calendar-all-day-band-padding-y) 0;
|
|
7
|
+
border-bottom: var(--border-width) solid var(--calendar-border-color);
|
|
8
|
+
background: var(--calendar-all-day-band-bg);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
.gutter {
|
|
12
|
+
border-right: var(--border-width) solid var(--calendar-border-color);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
.barSlot {
|
|
16
|
+
min-width: 0;
|
|
17
|
+
padding: 0 var(--calendar-all-day-band-bar-slot-padding-x);
|
|
18
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { EventChip } from './EventChip';
|
|
2
|
+
import type { AllDayBar, CalendarEvent, CalendarView, RenderEvent } from './types';
|
|
3
|
+
import styles from './AllDayBand.module.scss';
|
|
4
|
+
|
|
5
|
+
export interface AllDayBandProps {
|
|
6
|
+
/** Bars produced by `layoutEventsForHourGrid`. */
|
|
7
|
+
bars: readonly AllDayBar[];
|
|
8
|
+
/** Number of day columns the band spans (1 or 7). */
|
|
9
|
+
columnCount: number;
|
|
10
|
+
/** Pixel width of the hour-gutter on the left (band aligns with the hour-grid columns). */
|
|
11
|
+
gutterWidth: number;
|
|
12
|
+
/** Which view contains this band — passed to `renderEvent` (`'week'` or `'day'`). */
|
|
13
|
+
view?: CalendarView;
|
|
14
|
+
/** Optional custom event renderer (replaces the chip's default inner content). */
|
|
15
|
+
renderEvent?: RenderEvent;
|
|
16
|
+
/** Fires when an all-day chip is clicked; receives the `CalendarEvent`. */
|
|
17
|
+
onEventClick?: (event: CalendarEvent) => void;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Internal: the all-day event band rendered above the hour grid. Multi-day
|
|
22
|
+
* events span columns as continuous bars; the left gutter is empty so the
|
|
23
|
+
* band aligns visually with the hour-grid columns below.
|
|
24
|
+
*
|
|
25
|
+
* @remarks
|
|
26
|
+
* **When NOT to use:** Do not render `AllDayBand` directly in application code —
|
|
27
|
+
* it is an internal building block consumed by `WeekView`/`DayView`. Use `Calendar`
|
|
28
|
+
* from the design system and pass events via the `events` prop.
|
|
29
|
+
*/
|
|
30
|
+
export function AllDayBand({
|
|
31
|
+
bars,
|
|
32
|
+
columnCount,
|
|
33
|
+
gutterWidth,
|
|
34
|
+
view = 'week',
|
|
35
|
+
renderEvent,
|
|
36
|
+
onEventClick,
|
|
37
|
+
}: AllDayBandProps) {
|
|
38
|
+
if (bars.length === 0) return null;
|
|
39
|
+
const maxLane = bars.reduce((m, b) => Math.max(m, b.lane), 0);
|
|
40
|
+
|
|
41
|
+
return (
|
|
42
|
+
<div
|
|
43
|
+
className={styles.band}
|
|
44
|
+
style={{
|
|
45
|
+
gridTemplateColumns: `${gutterWidth}px repeat(${columnCount}, 1fr)`,
|
|
46
|
+
gridTemplateRows: `repeat(${maxLane + 1}, auto)`,
|
|
47
|
+
}}
|
|
48
|
+
>
|
|
49
|
+
<div
|
|
50
|
+
className={styles.gutter}
|
|
51
|
+
style={{ gridColumn: 1, gridRow: `1 / span ${maxLane + 1}` }}
|
|
52
|
+
/>
|
|
53
|
+
{bars.map((bar) => (
|
|
54
|
+
<div
|
|
55
|
+
key={bar.event.id}
|
|
56
|
+
className={styles.barSlot}
|
|
57
|
+
style={{
|
|
58
|
+
// +2 because column 1 is the gutter; day index 0 → outer column 2
|
|
59
|
+
gridColumn: `${bar.startCol + 2} / ${bar.endCol + 3}`,
|
|
60
|
+
gridRow: bar.lane + 1,
|
|
61
|
+
}}
|
|
62
|
+
>
|
|
63
|
+
<EventChip
|
|
64
|
+
event={bar.event}
|
|
65
|
+
continuesLeft={bar.continuesLeft}
|
|
66
|
+
continuesRight={bar.continuesRight}
|
|
67
|
+
view={view}
|
|
68
|
+
renderEvent={renderEvent}
|
|
69
|
+
onClick={(ev) => onEventClick?.(ev)}
|
|
70
|
+
/>
|
|
71
|
+
</div>
|
|
72
|
+
))}
|
|
73
|
+
</div>
|
|
74
|
+
);
|
|
75
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
@use './Calendar.tokens';
|
|
2
|
+
|
|
3
|
+
.calendar {
|
|
4
|
+
display: flex;
|
|
5
|
+
flex-direction: column;
|
|
6
|
+
gap: var(--calendar-gap);
|
|
7
|
+
font-family: inherit;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
.header {
|
|
11
|
+
display: flex;
|
|
12
|
+
align-items: center;
|
|
13
|
+
justify-content: space-between;
|
|
14
|
+
gap: var(--calendar-header-gap);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
.title {
|
|
18
|
+
/* stylelint-disable-next-line property-disallowed-list -- neutralizing UA <h2> default, not component layout */
|
|
19
|
+
margin: 0;
|
|
20
|
+
font-size: var(--calendar-title-font-size);
|
|
21
|
+
font-weight: var(--calendar-title-font-weight);
|
|
22
|
+
color: var(--calendar-title-fg);
|
|
23
|
+
}
|