@flikk/ui 1.0.0-beta.26 → 1.0.0-beta.29
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/dist/bg/1.webp +0 -0
- package/dist/bg/10.webp +0 -0
- package/dist/bg/11.webp +0 -0
- package/dist/bg/12.webp +0 -0
- package/dist/bg/13.webp +0 -0
- package/dist/bg/14.webp +0 -0
- package/dist/bg/15.webp +0 -0
- package/dist/bg/16.webp +0 -0
- package/dist/bg/17.webp +0 -0
- package/dist/bg/18.webp +0 -0
- package/dist/bg/19.webp +0 -0
- package/dist/bg/2.webp +0 -0
- package/dist/bg/20.webp +0 -0
- package/dist/bg/21.webp +0 -0
- package/dist/bg/22.webp +0 -0
- package/dist/bg/3.webp +0 -0
- package/dist/bg/4.webp +0 -0
- package/dist/bg/5.webp +0 -0
- package/dist/bg/6.webp +0 -0
- package/dist/bg/7.webp +0 -0
- package/dist/bg/8.webp +0 -0
- package/dist/bg/9.webp +0 -0
- package/dist/components/ai/CodeBlock/CodeBlock.theme.js +1 -1
- package/dist/components/ai/PromptInput/PromptInput.js +7 -140
- package/dist/components/ai/PromptInput/VoiceRecorder.js +0 -85
- package/dist/components/ai/TokenCounter/TokenCounter.theme.js +1 -1
- package/dist/components/canvas/Background.d.ts +19 -0
- package/dist/components/canvas/Background.js +23 -0
- package/dist/components/canvas/BaseNode.d.ts +15 -0
- package/dist/components/canvas/BaseNode.js +20 -0
- package/dist/components/canvas/CanvasToolbar.d.ts +34 -0
- package/dist/components/canvas/CanvasToolbar.js +34 -0
- package/dist/components/canvas/Edge.d.ts +35 -0
- package/dist/components/canvas/Edge.js +97 -0
- package/dist/components/canvas/EdgeLayer.d.ts +18 -0
- package/dist/components/canvas/EdgeLayer.js +111 -0
- package/dist/components/canvas/Handle.d.ts +11 -0
- package/dist/components/canvas/Handle.js +63 -0
- package/dist/components/canvas/MiniMap.d.ts +22 -0
- package/dist/components/canvas/MiniMap.js +105 -0
- package/dist/components/canvas/NodeCanvas.d.ts +10 -0
- package/dist/components/canvas/NodeCanvas.js +477 -0
- package/dist/components/canvas/NodeCanvas.theme.d.ts +7 -0
- package/dist/components/canvas/NodeCanvas.theme.js +9 -0
- package/dist/components/canvas/NodeCanvas.types.d.ts +187 -0
- package/dist/components/canvas/NodeControls.d.ts +25 -0
- package/dist/components/canvas/NodeControls.js +40 -0
- package/dist/components/canvas/NodeRenderer.d.ts +19 -0
- package/dist/components/canvas/NodeRenderer.js +117 -0
- package/dist/components/canvas/changes.d.ts +11 -0
- package/dist/components/canvas/changes.js +76 -0
- package/dist/components/canvas/context/CanvasContext.d.ts +32 -0
- package/dist/components/canvas/context/CanvasContext.js +14 -0
- package/dist/components/canvas/context/ConnectionContext.d.ts +33 -0
- package/dist/components/canvas/context/ConnectionContext.js +13 -0
- package/dist/components/canvas/context/HandleRegistry.d.ts +24 -0
- package/dist/components/canvas/context/HandleRegistry.js +15 -0
- package/dist/components/canvas/context/InteractionContext.d.ts +18 -0
- package/dist/components/canvas/context/InteractionContext.js +14 -0
- package/dist/components/canvas/context/NodeIdContext.d.ts +3 -0
- package/dist/components/canvas/context/NodeIdContext.js +15 -0
- package/dist/components/canvas/hooks/useConnection.d.ts +17 -0
- package/dist/components/canvas/hooks/useConnection.js +29 -0
- package/dist/components/canvas/hooks/useMarquee.d.ts +25 -0
- package/dist/components/canvas/hooks/useMarquee.js +91 -0
- package/dist/components/canvas/hooks/useNodeDrag.d.ts +23 -0
- package/dist/components/canvas/hooks/useNodeDrag.js +110 -0
- package/dist/components/canvas/hooks/usePanZoom.d.ts +30 -0
- package/dist/components/canvas/hooks/usePanZoom.js +189 -0
- package/dist/components/canvas/hooks/useViewport.d.ts +21 -0
- package/dist/components/canvas/hooks/useViewport.js +35 -0
- package/dist/components/canvas/index.d.ts +14 -0
- package/dist/components/canvas/index.js +12 -0
- package/dist/components/canvas/layout.d.ts +22 -0
- package/dist/components/canvas/layout.js +67 -0
- package/dist/components/canvas/utils.d.ts +4 -0
- package/dist/components/canvas/utils.js +16 -0
- package/dist/components/charts/AreaChart/AreaChart.js +136 -101
- package/dist/components/charts/AreaChart/AreaChart.types.d.ts +5 -5
- package/dist/components/charts/AreaChart/AreaChart.types.js +1 -0
- package/dist/components/charts/BarChart/BarChart.js +207 -143
- package/dist/components/charts/BarChart/BarChart.types.d.ts +4 -4
- package/dist/components/charts/BarChart/BarChart.types.js +1 -0
- package/dist/components/charts/ComboChart/ComboChart.types.d.ts +2 -2
- package/dist/components/charts/LineChart/LineChart.js +88 -72
- package/dist/components/charts/LineChart/LineChart.types.d.ts +3 -3
- package/dist/components/charts/RadarChart/RadarChart.js +1 -1
- package/dist/components/charts/RadarChart/RadarChart.theme.js +5 -2
- package/dist/components/charts/ScatterPlot/ScatterPlot.js +62 -72
- package/dist/components/charts/ScatterPlot/ScatterPlot.theme.js +10 -1
- package/dist/components/charts/ScatterPlot/ScatterPlot.types.d.ts +3 -9
- package/dist/components/charts/StackedBarChart/StackedBarChart.js +33 -33
- package/dist/components/charts/StackedBarChart/StackedBarChart.types.d.ts +2 -2
- package/dist/components/charts/hooks/index.d.ts +2 -0
- package/dist/components/charts/hooks/useChartDimensions.d.ts +29 -0
- package/dist/components/charts/hooks/useChartDimensions.js +42 -0
- package/dist/components/charts/shared/ChartTooltip/ChartTooltip.theme.js +1 -1
- package/dist/components/charts/types/chart.types.d.ts +11 -2
- package/dist/components/charts/types/chart.types.js +10 -3
- package/dist/components/core/Avatar/Avatar.js +5 -1
- package/dist/components/core/AvatarGroup/AvatarGroup.js +5 -1
- package/dist/components/core/AvatarGroup/AvatarGroup.theme.js +4 -2
- package/dist/components/core/Badge/Badge.js +1 -1
- package/dist/components/core/Badge/Badge.theme.js +16 -15
- package/dist/components/core/Button/Button.js +1 -1
- package/dist/components/core/Button/Button.theme.js +3 -3
- package/dist/components/core/Calendar/Calendar.theme.js +1 -1
- package/dist/components/core/Card/Card.js +7 -3
- package/dist/components/core/Card/Card.theme.js +3 -3
- package/dist/components/core/Card/Card.types.d.ts +27 -2
- package/dist/components/core/CommandPalette/CommandItem.js +4 -5
- package/dist/components/core/CommandPalette/CommandPalette.js +1 -1
- package/dist/components/core/CommandPalette/CommandPalette.theme.js +11 -13
- package/dist/components/core/CommandPalette/CommandPalette.types.d.ts +0 -2
- package/dist/components/core/ContextMenu/ContextMenu.theme.js +14 -15
- package/dist/components/core/ContextMenu/ContextMenuItem.js +1 -1
- package/dist/components/core/ContextMenu/ContextMenuSubTrigger.js +1 -1
- package/dist/components/core/DotSeparator/DotSeparator.d.ts +3 -0
- package/dist/components/core/DotSeparator/DotSeparator.js +19 -0
- package/dist/components/core/DotSeparator/DotSeparator.theme.d.ts +2 -0
- package/dist/components/core/DotSeparator/DotSeparator.theme.js +10 -0
- package/dist/components/core/DotSeparator/DotSeparator.types.d.ts +25 -0
- package/dist/components/core/DotSeparator/index.d.ts +3 -0
- package/dist/components/core/Dropdown/Dropdown.theme.js +5 -6
- package/dist/components/core/Dropdown/DropdownItem.js +1 -1
- package/dist/components/core/Dropdown/DropdownMenu.js +58 -30
- package/dist/components/core/HeroCard/HeroCard.d.ts +5 -0
- package/dist/components/core/HeroCard/HeroCard.js +99 -0
- package/dist/components/core/HeroCard/HeroCard.theme.d.ts +3 -0
- package/dist/components/core/HeroCard/HeroCard.theme.js +8 -0
- package/dist/components/core/HeroCard/HeroCard.types.d.ts +70 -0
- package/dist/components/core/HeroCard/index.d.ts +4 -0
- package/dist/components/core/Kbd/Kbd.theme.js +1 -1
- package/dist/components/core/MenuItem/MenuItem.js +5 -2
- package/dist/components/core/MenuItem/MenuItem.theme.d.ts +6 -0
- package/dist/components/core/MenuItem/MenuItem.theme.js +19 -16
- package/dist/components/core/MenuItem/MenuItem.types.d.ts +2 -0
- package/dist/components/core/Modal/Modal.d.ts +1 -1
- package/dist/components/core/Modal/Modal.js +2 -7
- package/dist/components/core/Modal/Modal.theme.js +4 -8
- package/dist/components/core/Modal/Modal.types.d.ts +0 -10
- package/dist/components/core/Modal/index.d.ts +1 -1
- package/dist/components/core/ModalStack/ModalStack.d.ts +1 -1
- package/dist/components/core/ModalStack/ModalStack.types.d.ts +1 -2
- package/dist/components/core/ModalStack/ModalStackModal.d.ts +1 -1
- package/dist/components/core/ModalStack/ModalStackModal.js +2 -7
- package/dist/components/core/NavItem/NavItem.js +20 -4
- package/dist/components/core/NavItem/NavItem.theme.js +13 -2
- package/dist/components/core/PageHeading/PageHeading.theme.js +2 -2
- package/dist/components/core/Popover/Popover.theme.js +1 -1
- package/dist/components/core/Popover/Popover.types.d.ts +6 -2
- package/dist/components/core/Popover/PopoverBody.js +10 -3
- package/dist/components/core/ScrollArea/ScrollArea.js +242 -4
- package/dist/components/core/ScrollArea/ScrollArea.types.d.ts +12 -1
- package/dist/components/core/ScrollArea/smooth/SmoothScrollEngine.d.ts +4 -0
- package/dist/components/core/ScrollArea/smooth/SmoothScrollEngine.js +23 -0
- package/dist/components/core/ScrollArea/smooth/useSmoothScroll.js +4 -0
- package/dist/components/core/ScrollArea/smooth/useSmoothScroll.types.d.ts +5 -0
- package/dist/components/core/Segmented/Segmented.theme.js +2 -2
- package/dist/components/core/Sidebar/Sidebar.d.ts +2 -0
- package/dist/components/core/Sidebar/Sidebar.js +15 -7
- package/dist/components/core/Sidebar/Sidebar.types.d.ts +92 -4
- package/dist/components/core/Sidebar/SidebarCard.d.ts +25 -0
- package/dist/components/core/Sidebar/SidebarCard.js +68 -0
- package/dist/components/core/Sidebar/SidebarCard.theme.d.ts +8 -0
- package/dist/components/core/Sidebar/SidebarCard.theme.js +18 -0
- package/dist/components/core/Sidebar/SidebarContent.js +5 -1
- package/dist/components/core/Sidebar/SidebarContext.js +1 -1
- package/dist/components/core/Sidebar/SidebarHeader.js +10 -2
- package/dist/components/core/Sidebar/SidebarLogo.js +38 -3
- package/dist/components/core/Sidebar/SidebarSearch.d.ts +22 -0
- package/dist/components/core/Sidebar/SidebarSearch.js +135 -0
- package/dist/components/core/Sidebar/SidebarToggle.js +1 -1
- package/dist/components/core/Sidebar/SidebarUserProfile.js +2 -2
- package/dist/components/core/Sidebar/index.d.ts +3 -1
- package/dist/components/core/Tag/Tag.js +29 -5
- package/dist/components/core/Tag/Tag.theme.js +13 -8
- package/dist/components/core/Tag/Tag.types.d.ts +7 -0
- package/dist/components/core/Tooltip/Tooltip.js +1 -1
- package/dist/components/core/Tooltip/Tooltip.theme.js +1 -2
- package/dist/components/core/index.d.ts +2 -0
- package/dist/components/core/index.js +6 -0
- package/dist/components/data-display/DescriptionList/DescriptionList.js +23 -7
- package/dist/components/data-display/DescriptionList/DescriptionList.theme.js +10 -3
- package/dist/components/data-display/DescriptionList/DescriptionList.types.d.ts +49 -10
- package/dist/components/data-display/DescriptionList/index.d.ts +1 -1
- package/dist/components/data-display/Feed/Feed.js +28 -5
- package/dist/components/data-display/Feed/Feed.theme.js +1 -1
- package/dist/components/data-display/Feed/Feed.types.d.ts +32 -1
- package/dist/components/data-display/Feed/index.d.ts +1 -1
- package/dist/components/data-display/GanttChart/GanttChart.d.ts +1 -1
- package/dist/components/data-display/GanttChart/GanttChart.js +31 -4
- package/dist/components/data-display/GanttChart/GanttChart.theme.js +19 -17
- package/dist/components/data-display/GanttChart/GanttChart.types.d.ts +19 -0
- package/dist/components/data-display/GanttChart/GanttChart.utils.js +1 -1
- package/dist/components/data-display/GanttChart/GanttChartPanel.d.ts +1 -1
- package/dist/components/data-display/GanttChart/GanttChartPanel.js +3 -3
- package/dist/components/data-display/GanttChart/GanttDependencyArrows.js +7 -4
- package/dist/components/data-display/GanttChart/GanttMilestone.js +5 -5
- package/dist/components/data-display/GanttChart/GanttTablePanel.js +1 -1
- package/dist/components/data-display/GanttChart/GanttTableTaskRow.js +2 -2
- package/dist/components/data-display/GanttChart/GanttTaskBar.js +37 -16
- package/dist/components/data-display/GanttChart/GanttTimelineGrid.js +2 -1
- package/dist/components/data-display/GanttChart/GanttTimelineHeader.js +35 -11
- package/dist/components/data-display/GanttChart/GanttToolbar.js +2 -2
- package/dist/components/data-display/GanttChart/hooks/useGanttDrag.js +3 -2
- package/dist/components/data-display/GanttChart/index.d.ts +1 -1
- package/dist/components/data-display/Metric/Metric.js +8 -8
- package/dist/components/data-display/Metric/Metric.theme.d.ts +3 -2
- package/dist/components/data-display/Metric/Metric.theme.js +50 -68
- package/dist/components/data-display/Metric/Metric.types.d.ts +19 -21
- package/dist/components/data-display/Table/Table.js +2 -2
- package/dist/components/data-display/Table/Table.theme.js +27 -9
- package/dist/components/data-display/Table/Table.types.d.ts +8 -0
- package/dist/components/data-display/Table/TableBody.js +2 -2
- package/dist/components/data-display/Table/TableCell.js +1 -1
- package/dist/components/data-display/Table/TableRow.d.ts +1 -1
- package/dist/components/data-display/Table/TableRow.js +9 -2
- package/dist/components/data-display/Timeline/Timeline.js +27 -5
- package/dist/components/data-display/Timeline/Timeline.theme.d.ts +10 -2
- package/dist/components/data-display/Timeline/Timeline.theme.js +14 -8
- package/dist/components/data-display/Timeline/Timeline.types.d.ts +48 -16
- package/dist/components/data-display/Timeline/Timeline.utils.d.ts +6 -0
- package/dist/components/data-display/Timeline/Timeline.utils.js +11 -0
- package/dist/components/data-display/Timeline/TimelineItem.js +13 -20
- package/dist/components/data-display/Timeline/TimelineMarker.js +10 -8
- package/dist/components/data-display/Timeline/index.d.ts +2 -2
- package/dist/components/effects/3d/index.d.ts +0 -2
- package/dist/components/effects/3d/index.js +0 -1
- package/dist/components/effects/Aurora/Aurora.d.ts +6 -17
- package/dist/components/effects/Aurora/Aurora.js +297 -131
- package/dist/components/effects/Aurora/Aurora.types.d.ts +6 -0
- package/dist/components/effects/DotPattern/DotPattern.js +1 -1
- package/dist/components/effects/Overlay/Overlay.theme.js +1 -2
- package/dist/components/effects/Preloader/Preloader.animations.d.ts +23 -0
- package/dist/components/effects/Preloader/Preloader.animations.js +150 -0
- package/dist/components/effects/Preloader/Preloader.d.ts +3 -0
- package/dist/components/effects/Preloader/Preloader.js +119 -0
- package/dist/components/effects/Preloader/Preloader.types.d.ts +63 -0
- package/dist/components/effects/Preloader/index.d.ts +2 -0
- package/dist/components/effects/ProgressiveBlur/ProgressiveBlur.js +25 -14
- package/dist/components/effects/ProgressiveBlur/ProgressiveBlur.types.d.ts +2 -0
- package/dist/components/effects/TiltCard/TiltCard.d.ts +12 -0
- package/dist/components/effects/TiltCard/TiltCard.glow.d.ts +28 -0
- package/dist/components/effects/TiltCard/TiltCard.glow.js +114 -0
- package/dist/components/effects/TiltCard/TiltCard.js +177 -0
- package/dist/components/effects/{SpotlightBorder/SpotlightBorder.shaders.d.ts → TiltCard/TiltCard.shaders.d.ts} +1 -1
- package/dist/components/effects/{SpotlightBorder/SpotlightBorder.shaders.js → TiltCard/TiltCard.shaders.js} +1 -1
- package/dist/components/effects/TiltCard/TiltCard.types.d.ts +88 -0
- package/dist/components/effects/TiltCard/index.d.ts +2 -0
- package/dist/components/effects/index.d.ts +4 -12
- package/dist/components/effects/index.js +2 -6
- package/dist/components/forms/Checkbox/Checkbox.js +7 -1
- package/dist/components/forms/Combobox/Combobox.js +1 -1
- package/dist/components/forms/Combobox/Combobox.theme.js +2 -4
- package/dist/components/forms/DatePicker/DatePicker.theme.js +11 -18
- package/dist/components/forms/DatePicker/DatePickerTrigger.js +1 -1
- package/dist/components/forms/DateRangePicker/DateRangePicker.theme.js +6 -13
- package/dist/components/forms/DateRangePicker/DateRangePickerTrigger.js +1 -1
- package/dist/components/forms/FileUpload/FileUpload.animations.d.ts +29 -0
- package/dist/components/forms/FileUpload/FileUpload.animations.js +19 -0
- package/dist/components/forms/FileUpload/FileUpload.js +85 -134
- package/dist/components/forms/FileUpload/FileUpload.theme.d.ts +2 -10
- package/dist/components/forms/FileUpload/FileUpload.theme.js +16 -30
- package/dist/components/forms/FileUpload/FileUpload.types.d.ts +26 -10
- package/dist/components/forms/FormLabel/FormLabel.theme.js +1 -1
- package/dist/components/forms/Input/Input.theme.js +13 -10
- package/dist/components/forms/InputCounter/InputCounter.theme.js +1 -1
- package/dist/components/forms/Mention/Mention.js +152 -57
- package/dist/components/forms/Mention/Mention.theme.js +16 -23
- package/dist/components/forms/Mention/Mention.types.d.ts +12 -12
- package/dist/components/forms/Mention/Mention.utils.js +32 -4
- package/dist/components/forms/RichTextEditor/RichTextEditor.js +3 -3
- package/dist/components/forms/RichTextEditor/RichTextEditor.theme.js +5 -5
- package/dist/components/forms/Select/Select.js +2 -2
- package/dist/components/forms/Select/Select.theme.js +3 -3
- package/dist/components/forms/Slider/Slider.theme.js +1 -1
- package/dist/components/forms/Switch/Switch.js +27 -15
- package/dist/components/forms/Switch/Switch.theme.d.ts +36 -6
- package/dist/components/forms/Switch/Switch.theme.js +33 -4
- package/dist/components/forms/Switch/Switch.types.d.ts +12 -2
- package/dist/components/forms/TimePicker/TimePicker.theme.js +1 -2
- package/dist/components/forms/TimePicker/TimePickerContent.js +1 -87
- package/dist/components/forms/TimePicker/TimePickerTrigger.js +1 -1
- package/dist/components/forms/forms.theme.js +21 -16
- package/dist/components/forms/index.d.ts +0 -4
- package/dist/components/forms/index.js +0 -89
- package/dist/components/generative/GenerativeView.d.ts +21 -0
- package/dist/components/generative/GenerativeView.js +116 -0
- package/dist/components/generative/actions.d.ts +26 -0
- package/dist/components/generative/actions.js +51 -0
- package/dist/components/generative/index.d.ts +11 -0
- package/dist/components/generative/index.js +9 -0
- package/dist/components/generative/registry.d.ts +43 -0
- package/dist/components/generative/registry.js +114 -0
- package/dist/components/generative/resolvers.d.ts +35 -0
- package/dist/components/generative/resolvers.js +93 -0
- package/dist/components/generative/schema.generated.d.ts +2 -0
- package/dist/components/generative/schema.generated.js +1639 -0
- package/dist/components/generative/schemaTypes.d.ts +30 -0
- package/dist/components/generative/streaming.d.ts +39 -0
- package/dist/components/generative/streaming.js +283 -0
- package/dist/components/generative/tools.d.ts +21 -0
- package/dist/components/generative/tools.js +54 -0
- package/dist/components/generative/types.d.ts +41 -0
- package/dist/components/generative/useGenerativeStream.d.ts +37 -0
- package/dist/components/generative/useGenerativeStream.js +36 -0
- package/dist/components/generative/validate.d.ts +24 -0
- package/dist/components/generative/validate.js +259 -0
- package/dist/components/layout/AppShell/AppShell.d.ts +10 -0
- package/dist/components/layout/AppShell/AppShell.js +84 -0
- package/dist/components/layout/AppShell/AppShell.theme.d.ts +3 -0
- package/dist/components/layout/AppShell/AppShell.theme.js +42 -0
- package/dist/components/layout/AppShell/AppShell.types.d.ts +127 -0
- package/dist/components/layout/AppShell/AppShellContext.d.ts +14 -0
- package/dist/components/layout/AppShell/AppShellContext.js +19 -0
- package/dist/components/layout/AppShell/AppShellFooter.d.ts +3 -0
- package/dist/components/layout/AppShell/AppShellFooter.js +12 -0
- package/dist/components/layout/AppShell/AppShellHeader.d.ts +3 -0
- package/dist/components/layout/AppShell/AppShellHeader.js +12 -0
- package/dist/components/layout/AppShell/AppShellMain.d.ts +3 -0
- package/dist/components/layout/AppShell/AppShellMain.js +19 -0
- package/dist/components/layout/AppShell/AppShellRightPanel.d.ts +3 -0
- package/dist/components/layout/AppShell/AppShellRightPanel.js +16 -0
- package/dist/components/layout/AppShell/AppShellSidebar.d.ts +3 -0
- package/dist/components/layout/AppShell/AppShellSidebar.js +16 -0
- package/dist/components/layout/AppShell/AppShellTopbar.d.ts +3 -0
- package/dist/components/layout/AppShell/AppShellTopbar.js +12 -0
- package/dist/components/layout/AppShell/index.d.ts +3 -0
- package/dist/components/layout/FormLayout/FormLayout.js +1 -87
- package/dist/components/layout/Grid/Grid.d.ts +3 -0
- package/dist/components/layout/Grid/Grid.js +50 -0
- package/dist/components/layout/Grid/Grid.theme.d.ts +2 -0
- package/dist/components/layout/Grid/Grid.theme.js +35 -0
- package/dist/components/layout/Grid/Grid.types.d.ts +57 -0
- package/dist/components/layout/Grid/index.d.ts +3 -0
- package/dist/components/layout/Section/Section.d.ts +3 -0
- package/dist/components/layout/Section/Section.js +18 -0
- package/dist/components/layout/Section/Section.theme.d.ts +2 -0
- package/dist/components/layout/Section/Section.theme.js +10 -0
- package/dist/components/layout/Section/Section.types.d.ts +34 -0
- package/dist/components/layout/Section/index.d.ts +3 -0
- package/dist/components/layout/Stack/Stack.d.ts +3 -0
- package/dist/components/layout/Stack/Stack.js +19 -0
- package/dist/components/layout/Stack/Stack.theme.d.ts +2 -0
- package/dist/components/layout/Stack/Stack.theme.js +10 -0
- package/dist/components/layout/Stack/Stack.types.d.ts +39 -0
- package/dist/components/layout/Stack/index.d.ts +3 -0
- package/dist/components/layout/index.d.ts +4 -0
- package/dist/components/layout/index.js +8 -0
- package/dist/generative.schema.json +1637 -0
- package/dist/hooks/useSelectPortal.d.ts +10 -2
- package/dist/hooks/useSelectPortal.js +45 -24
- package/dist/index.js +180 -174
- package/dist/registry.json +10205 -0
- package/dist/styles.css +1 -1
- package/dist/tools.json +1731 -0
- package/dist/utils/dateUtils.js +11 -1
- package/package.json +19 -4
- package/src/global.scss +82 -109
- package/src/styles/theme.css +707 -474
- package/dist/bg/1.jpg +0 -0
- package/dist/bg/10.jpg +0 -0
- package/dist/bg/11.jpg +0 -0
- package/dist/bg/14.jpg +0 -0
- package/dist/bg/15.jpg +0 -0
- package/dist/bg/16.jpg +0 -0
- package/dist/bg/17.jpg +0 -0
- package/dist/bg/18.jpg +0 -0
- package/dist/bg/19.jpg +0 -0
- package/dist/bg/2.jpg +0 -0
- package/dist/bg/20.jpg +0 -0
- package/dist/bg/21.jpg +0 -0
- package/dist/bg/22.jpg +0 -0
- package/dist/bg/23.jpg +0 -0
- package/dist/bg/24.jpg +0 -0
- package/dist/bg/3.jpg +0 -0
- package/dist/bg/4.jpg +0 -0
- package/dist/bg/5.jpg +0 -0
- package/dist/bg/6.jpg +0 -0
- package/dist/bg/7.jpg +0 -0
- package/dist/bg/8.jpg +0 -0
- package/dist/bg/9.jpg +0 -0
- package/dist/components/effects/MorphingText/MorphingText.d.ts +0 -17
- package/dist/components/effects/MorphingText/MorphingText.js +0 -125
- package/dist/components/effects/MorphingText/MorphingText.types.d.ts +0 -18
- package/dist/components/effects/MorphingText/index.d.ts +0 -2
- package/dist/components/effects/PageTransition/PageTransition.animations.d.ts +0 -8
- package/dist/components/effects/PageTransition/PageTransition.animations.js +0 -53
- package/dist/components/effects/PageTransition/PageTransition.d.ts +0 -3
- package/dist/components/effects/PageTransition/PageTransition.js +0 -82
- package/dist/components/effects/PageTransition/PageTransition.types.d.ts +0 -15
- package/dist/components/effects/PageTransition/index.d.ts +0 -2
- package/dist/components/effects/ParallaxSection/ParallaxSection.d.ts +0 -26
- package/dist/components/effects/ParallaxSection/ParallaxSection.js +0 -71
- package/dist/components/effects/ParallaxSection/ParallaxSection.types.d.ts +0 -11
- package/dist/components/effects/ParallaxSection/index.d.ts +0 -2
- package/dist/components/effects/Spotlight/Spotlight.d.ts +0 -36
- package/dist/components/effects/Spotlight/Spotlight.js +0 -112
- package/dist/components/effects/Spotlight/Spotlight.types.d.ts +0 -29
- package/dist/components/effects/Spotlight/index.d.ts +0 -2
- package/dist/components/effects/SpotlightBorder/SpotlightBorder.d.ts +0 -18
- package/dist/components/effects/SpotlightBorder/SpotlightBorder.js +0 -213
- package/dist/components/effects/SpotlightBorder/SpotlightBorder.types.d.ts +0 -61
- package/dist/components/effects/SpotlightBorder/index.d.ts +0 -2
- package/dist/components/effects/StickyScroll/StickyScroll.d.ts +0 -30
- package/dist/components/effects/StickyScroll/StickyScroll.js +0 -128
- package/dist/components/effects/StickyScroll/StickyScroll.types.d.ts +0 -19
- package/dist/components/effects/StickyScroll/index.d.ts +0 -2
- package/dist/components/forms/CronInput/CronInput.d.ts +0 -3
- package/dist/components/forms/CronInput/CronInput.js +0 -113
- package/dist/components/forms/CronInput/CronInput.theme.d.ts +0 -6
- package/dist/components/forms/CronInput/CronInput.theme.js +0 -84
- package/dist/components/forms/CronInput/CronInput.types.d.ts +0 -109
- package/dist/components/forms/CronInput/CronInput.utils.d.ts +0 -67
- package/dist/components/forms/CronInput/CronInput.utils.js +0 -505
- package/dist/components/forms/CronInput/index.d.ts +0 -4
- /package/dist/components/effects/{SpotlightBorder/SpotlightBorder.types.js → TiltCard/TiltCard.types.js} +0 -0
|
@@ -1,11 +1,12 @@
|
|
|
1
|
+
import React__default, { useMemo, useId, useState, useRef, useEffect, useCallback, useLayoutEffect, createElement } from 'react';
|
|
1
2
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
|
-
import React__default, { useMemo, useId, useState, useRef, useEffect, useCallback, useLayoutEffect } from 'react';
|
|
3
3
|
import { createPortal } from 'react-dom';
|
|
4
4
|
import { AnimatePresence, motion } from 'motion/react';
|
|
5
5
|
import { mentionTheme } from './Mention.theme.js';
|
|
6
6
|
import { cn } from '../../../utils/cn.js';
|
|
7
7
|
import { Avatar } from '../../core/Avatar/Avatar.js';
|
|
8
8
|
import { Tag } from '../../core/Tag/Tag.js';
|
|
9
|
+
import { MenuItem } from '../../core/MenuItem/MenuItem.js';
|
|
9
10
|
import { FormLabel } from '../FormLabel/FormLabel.js';
|
|
10
11
|
import { useIsClient } from '../../../hooks/useIsClient.js';
|
|
11
12
|
import { normalizeSegments, setCaretAtOffset, getPlainTextOffset, parseDOMToSegments, serializeSegments, serializeSegmentsMasked, insertMentionIntoSegments, MENTION_ATTR } from './Mention.utils.js';
|
|
@@ -74,7 +75,7 @@ const dropdownVariants = {
|
|
|
74
75
|
// ---------------------------------------------------------------------------
|
|
75
76
|
// Mention component
|
|
76
77
|
// ---------------------------------------------------------------------------
|
|
77
|
-
const Mention = React__default.forwardRef(({ triggers: triggersProp, suggestions: suggestionsProp, onSearch: onSearchProp, value: controlledValue, defaultValue = "", onChange, onMentionSelect, onMentionsChange, placeholder, size = "md", maxSuggestions = 8, className, wrapperClassName, dropdownClassName, theme: themeOverrides, state = "default", disabled = false, helperText, required, label, renderSuggestion, emptyMessage = "No results found", loading = false, mentionTagSize = "sm", mentionTagClassName, rows = 3, ...props }, ref) => {
|
|
78
|
+
const Mention = React__default.forwardRef(({ triggers: triggersProp, suggestions: suggestionsProp, onSearch: onSearchProp, value: controlledValue, defaultValue = "", onChange, onMentionSelect, onMentionsChange, placeholder, size = "md", maxSuggestions = 8, className, wrapperClassName, dropdownClassName, theme: themeOverrides, state = "default", disabled = false, helperText, required, label, renderSuggestion, emptyMessage = "No results found", loading = false, mentionTagSize = "sm", mentionTagClassName, mentionTagRemovable = true, rows = 3, style: styleProp, ...props }, ref) => {
|
|
78
79
|
const theme = useMemo(() => ({ ...mentionTheme, ...(themeOverrides || {}) }), [themeOverrides]);
|
|
79
80
|
const generatedId = useId();
|
|
80
81
|
const isDisabled = state === "disabled" || disabled;
|
|
@@ -125,6 +126,25 @@ const Mention = React__default.forwardRef(({ triggers: triggersProp, suggestions
|
|
|
125
126
|
const dropdownRef = useRef(null);
|
|
126
127
|
const composingRef = useRef(false);
|
|
127
128
|
const caretRestoreRef = useRef(null);
|
|
129
|
+
// Bumped on programmatic structural mutations (mention insert/remove) to
|
|
130
|
+
// remount the contentEditable so React rebuilds it from `segments` instead
|
|
131
|
+
// of diffing against a DOM the browser has already restructured. Editing a
|
|
132
|
+
// contentEditable lets the browser delete/merge/move React-owned nodes
|
|
133
|
+
// (e.g. backspacing the space before a chip removes its text span); the
|
|
134
|
+
// next structural reconcile then calls removeChild on a node that is no
|
|
135
|
+
// longer where React's fiber expects it and throws "removeChild ... not a
|
|
136
|
+
// child of this node". A full remount sidesteps the partial diff entirely.
|
|
137
|
+
// NEVER bump on typing — that path reconciles content-only changes safely
|
|
138
|
+
// and must keep the caret/IME composition stable.
|
|
139
|
+
const [editorKey, setEditorKey] = useState(0);
|
|
140
|
+
const lastEditorKeyRef = useRef(0);
|
|
141
|
+
const remountEditor = useCallback(() => setEditorKey((k) => k + 1), []);
|
|
142
|
+
// Mirrors the mention count React currently has committed to the DOM. Used
|
|
143
|
+
// by updateFromDOM to detect when a *browser-handled* edit (range-selection
|
|
144
|
+
// delete, cut, drag) structurally removed a chip — that desyncs React's
|
|
145
|
+
// fiber from the DOM, so the next reconcile must be a full remount, not a
|
|
146
|
+
// partial diff. Synced from `segments` after each commit (below).
|
|
147
|
+
const renderedMentionCountRef = useRef(0);
|
|
128
148
|
// Track which segment index is "selected" when clicking a mention tag
|
|
129
149
|
const [selectedMentionIndex, setSelectedMentionIndex] = useState(null);
|
|
130
150
|
const isClient = useIsClient();
|
|
@@ -244,10 +264,22 @@ const Mention = React__default.forwardRef(({ triggers: triggersProp, suggestions
|
|
|
244
264
|
}
|
|
245
265
|
}
|
|
246
266
|
if (caretRestoreRef.current !== null) {
|
|
267
|
+
// A structural mutation remounts the editable div (see `editorKey`),
|
|
268
|
+
// which drops DOM focus. Re-focus before restoring the caret so the
|
|
269
|
+
// user can keep typing seamlessly after inserting/removing a mention.
|
|
270
|
+
if (editorKey !== lastEditorKeyRef.current && document.activeElement !== el) {
|
|
271
|
+
el.focus({ preventScroll: true });
|
|
272
|
+
}
|
|
247
273
|
setCaretAtOffset(el, caretRestoreRef.current);
|
|
248
274
|
caretRestoreRef.current = null;
|
|
249
275
|
}
|
|
276
|
+
lastEditorKeyRef.current = editorKey;
|
|
250
277
|
});
|
|
278
|
+
// Keep the committed-mention-count ref in sync so updateFromDOM can detect
|
|
279
|
+
// a browser-removed chip on the next edit (see renderedMentionCountRef).
|
|
280
|
+
useEffect(() => {
|
|
281
|
+
renderedMentionCountRef.current = segments.filter((s) => s.type === "mention").length;
|
|
282
|
+
}, [segments]);
|
|
251
283
|
// --- Handlers ---
|
|
252
284
|
const updateFromDOM = useCallback(() => {
|
|
253
285
|
if (!editableRef.current || composingRef.current)
|
|
@@ -260,14 +292,18 @@ const Mention = React__default.forwardRef(({ triggers: triggersProp, suggestions
|
|
|
260
292
|
if (offset !== null) {
|
|
261
293
|
caretRestoreRef.current = offset;
|
|
262
294
|
}
|
|
295
|
+
// If a browser-handled edit (range-selection delete, cut, drag) removed a
|
|
296
|
+
// chip, the DOM no longer matches React's fiber. A content-only reconcile
|
|
297
|
+
// would then call removeChild on an already-gone node and throw, so force
|
|
298
|
+
// a full remount instead. Pure text edits keep the count stable and
|
|
299
|
+
// reconcile normally — preserving caret/IME.
|
|
300
|
+
const newMentionCount = newSegs.filter((s) => s.type === "mention").length;
|
|
301
|
+
if (newMentionCount !== renderedMentionCountRef.current) {
|
|
302
|
+
remountEditor();
|
|
303
|
+
}
|
|
263
304
|
setSegments(newSegs);
|
|
264
305
|
lastSerializedRef.current = serialized;
|
|
265
|
-
|
|
266
|
-
onChange === null || onChange === void 0 ? void 0 : onChange(serialized);
|
|
267
|
-
}
|
|
268
|
-
else {
|
|
269
|
-
onChange === null || onChange === void 0 ? void 0 : onChange(serialized);
|
|
270
|
-
}
|
|
306
|
+
onChange === null || onChange === void 0 ? void 0 : onChange(serialized);
|
|
271
307
|
notifyMentionsChange(newSegs);
|
|
272
308
|
// Detect active mention using masked text (hides @ from existing mentions)
|
|
273
309
|
if (offset !== null) {
|
|
@@ -275,7 +311,7 @@ const Mention = React__default.forwardRef(({ triggers: triggersProp, suggestions
|
|
|
275
311
|
const mention = detectActiveMention(maskedText, offset, triggerChars);
|
|
276
312
|
setActiveMention(mention);
|
|
277
313
|
}
|
|
278
|
-
}, [
|
|
314
|
+
}, [onChange, triggerChars, notifyMentionsChange, remountEditor]);
|
|
279
315
|
const handleInput = useCallback(() => {
|
|
280
316
|
setSelectedMentionIndex(null);
|
|
281
317
|
updateFromDOM();
|
|
@@ -312,6 +348,7 @@ const Mention = React__default.forwardRef(({ triggers: triggersProp, suggestions
|
|
|
312
348
|
setSegments(newSegs);
|
|
313
349
|
setActiveMention(null);
|
|
314
350
|
setHighlightedIndex(-1);
|
|
351
|
+
remountEditor();
|
|
315
352
|
onChange === null || onChange === void 0 ? void 0 : onChange(serialized);
|
|
316
353
|
notifyMentionsChange(newSegs);
|
|
317
354
|
onMentionSelect === null || onMentionSelect === void 0 ? void 0 : onMentionSelect(suggestion, trigger);
|
|
@@ -321,9 +358,51 @@ const Mention = React__default.forwardRef(({ triggers: triggersProp, suggestions
|
|
|
321
358
|
onChange,
|
|
322
359
|
onMentionSelect,
|
|
323
360
|
notifyMentionsChange,
|
|
361
|
+
remountEditor,
|
|
324
362
|
]);
|
|
363
|
+
// Map a mention DOM element back to its segment index. The chips are
|
|
364
|
+
// React-rendered, so we locate the element among all mention nodes and
|
|
365
|
+
// translate that position into the nth "mention" segment.
|
|
366
|
+
const segmentIndexForMentionEl = useCallback((mentionEl) => {
|
|
367
|
+
if (!editableRef.current)
|
|
368
|
+
return -1;
|
|
369
|
+
const allMentions = editableRef.current.querySelectorAll(`[${MENTION_ATTR}]`);
|
|
370
|
+
const domIdx = Array.from(allMentions).indexOf(mentionEl);
|
|
371
|
+
if (domIdx === -1)
|
|
372
|
+
return -1;
|
|
373
|
+
let count = 0;
|
|
374
|
+
for (let i = 0; i < segments.length; i++) {
|
|
375
|
+
if (segments[i].type === "mention") {
|
|
376
|
+
if (count === domIdx)
|
|
377
|
+
return i;
|
|
378
|
+
count++;
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
return -1;
|
|
382
|
+
}, [segments]);
|
|
383
|
+
// Remove a mention via the segment model — NEVER by mutating the DOM.
|
|
384
|
+
// The chips are React-owned nodes; calling removeChild() on them directly
|
|
385
|
+
// desyncs React's fiber tree from the DOM and makes the next reconcile
|
|
386
|
+
// throw "removeChild ... not a child of this node". Splicing the segment
|
|
387
|
+
// and letting React drop the node keeps React the sole DOM owner. The
|
|
388
|
+
// caret lands at the gap the mention left (its segment start offset).
|
|
389
|
+
const removeMentionSegment = useCallback((segIndex) => {
|
|
390
|
+
const newSegs = normalizeSegments([
|
|
391
|
+
...segments.slice(0, segIndex),
|
|
392
|
+
...segments.slice(segIndex + 1),
|
|
393
|
+
]);
|
|
394
|
+
caretRestoreRef.current = getOffsetAtSegment(segments, segIndex);
|
|
395
|
+
const serialized = serializeSegments(newSegs);
|
|
396
|
+
lastSerializedRef.current = serialized;
|
|
397
|
+
setSegments(newSegs);
|
|
398
|
+
setSelectedMentionIndex(null);
|
|
399
|
+
setActiveMention(null);
|
|
400
|
+
remountEditor();
|
|
401
|
+
onChange === null || onChange === void 0 ? void 0 : onChange(serialized);
|
|
402
|
+
notifyMentionsChange(newSegs);
|
|
403
|
+
}, [segments, onChange, notifyMentionsChange, remountEditor]);
|
|
325
404
|
const handleKeyDown = useCallback((e) => {
|
|
326
|
-
var _a
|
|
405
|
+
var _a;
|
|
327
406
|
// --- Selected mention: delete / replace / deselect ---
|
|
328
407
|
if (selectedMentionIndex !== null &&
|
|
329
408
|
((_a = segments[selectedMentionIndex]) === null || _a === void 0 ? void 0 : _a.type) === "mention") {
|
|
@@ -338,6 +417,7 @@ const Mention = React__default.forwardRef(({ triggers: triggersProp, suggestions
|
|
|
338
417
|
lastSerializedRef.current = serialized;
|
|
339
418
|
setSegments(newSegs);
|
|
340
419
|
setSelectedMentionIndex(null);
|
|
420
|
+
remountEditor();
|
|
341
421
|
onChange === null || onChange === void 0 ? void 0 : onChange(serialized);
|
|
342
422
|
notifyMentionsChange(newSegs);
|
|
343
423
|
return;
|
|
@@ -356,6 +436,7 @@ const Mention = React__default.forwardRef(({ triggers: triggersProp, suggestions
|
|
|
356
436
|
lastSerializedRef.current = serialized;
|
|
357
437
|
setSegments(newSegs);
|
|
358
438
|
setSelectedMentionIndex(null);
|
|
439
|
+
remountEditor();
|
|
359
440
|
onChange === null || onChange === void 0 ? void 0 : onChange(serialized);
|
|
360
441
|
notifyMentionsChange(newSegs);
|
|
361
442
|
return;
|
|
@@ -408,10 +489,12 @@ const Mention = React__default.forwardRef(({ triggers: triggersProp, suggestions
|
|
|
408
489
|
if (prevSibling &&
|
|
409
490
|
prevSibling.nodeType === Node.ELEMENT_NODE &&
|
|
410
491
|
prevSibling.hasAttribute(MENTION_ATTR)) {
|
|
411
|
-
|
|
412
|
-
(
|
|
413
|
-
|
|
414
|
-
|
|
492
|
+
const segIdx = segmentIndexForMentionEl(prevSibling);
|
|
493
|
+
if (segIdx !== -1) {
|
|
494
|
+
e.preventDefault();
|
|
495
|
+
removeMentionSegment(segIdx);
|
|
496
|
+
return;
|
|
497
|
+
}
|
|
415
498
|
}
|
|
416
499
|
}
|
|
417
500
|
// Case 2: Caret in parent element, child before offset is a mention
|
|
@@ -422,10 +505,12 @@ const Mention = React__default.forwardRef(({ triggers: triggersProp, suggestions
|
|
|
422
505
|
if (prevChild &&
|
|
423
506
|
prevChild.nodeType === Node.ELEMENT_NODE &&
|
|
424
507
|
prevChild.hasAttribute(MENTION_ATTR)) {
|
|
425
|
-
|
|
426
|
-
(
|
|
427
|
-
|
|
428
|
-
|
|
508
|
+
const segIdx = segmentIndexForMentionEl(prevChild);
|
|
509
|
+
if (segIdx !== -1) {
|
|
510
|
+
e.preventDefault();
|
|
511
|
+
removeMentionSegment(segIdx);
|
|
512
|
+
return;
|
|
513
|
+
}
|
|
429
514
|
}
|
|
430
515
|
}
|
|
431
516
|
}
|
|
@@ -445,10 +530,12 @@ const Mention = React__default.forwardRef(({ triggers: triggersProp, suggestions
|
|
|
445
530
|
if (nextSibling &&
|
|
446
531
|
nextSibling.nodeType === Node.ELEMENT_NODE &&
|
|
447
532
|
nextSibling.hasAttribute(MENTION_ATTR)) {
|
|
448
|
-
|
|
449
|
-
(
|
|
450
|
-
|
|
451
|
-
|
|
533
|
+
const segIdx = segmentIndexForMentionEl(nextSibling);
|
|
534
|
+
if (segIdx !== -1) {
|
|
535
|
+
e.preventDefault();
|
|
536
|
+
removeMentionSegment(segIdx);
|
|
537
|
+
return;
|
|
538
|
+
}
|
|
452
539
|
}
|
|
453
540
|
}
|
|
454
541
|
}
|
|
@@ -458,10 +545,12 @@ const Mention = React__default.forwardRef(({ triggers: triggersProp, suggestions
|
|
|
458
545
|
if (nextChild &&
|
|
459
546
|
nextChild.nodeType === Node.ELEMENT_NODE &&
|
|
460
547
|
nextChild.hasAttribute(MENTION_ATTR)) {
|
|
461
|
-
|
|
462
|
-
(
|
|
463
|
-
|
|
464
|
-
|
|
548
|
+
const segIdx = segmentIndexForMentionEl(nextChild);
|
|
549
|
+
if (segIdx !== -1) {
|
|
550
|
+
e.preventDefault();
|
|
551
|
+
removeMentionSegment(segIdx);
|
|
552
|
+
return;
|
|
553
|
+
}
|
|
465
554
|
}
|
|
466
555
|
}
|
|
467
556
|
}
|
|
@@ -475,7 +564,9 @@ const Mention = React__default.forwardRef(({ triggers: triggersProp, suggestions
|
|
|
475
564
|
highlightedIndex,
|
|
476
565
|
filteredSuggestions,
|
|
477
566
|
insertMention,
|
|
478
|
-
|
|
567
|
+
segmentIndexForMentionEl,
|
|
568
|
+
removeMentionSegment,
|
|
569
|
+
remountEditor,
|
|
479
570
|
selectedMentionIndex,
|
|
480
571
|
segments,
|
|
481
572
|
onChange,
|
|
@@ -513,26 +604,9 @@ const Mention = React__default.forwardRef(({ triggers: triggersProp, suggestions
|
|
|
513
604
|
setSelectedMentionIndex(null);
|
|
514
605
|
return;
|
|
515
606
|
}
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
if (domIdx === -1) {
|
|
520
|
-
setSelectedMentionIndex(null);
|
|
521
|
-
return;
|
|
522
|
-
}
|
|
523
|
-
// Map nth DOM mention → segment index
|
|
524
|
-
let count = 0;
|
|
525
|
-
for (let i = 0; i < segments.length; i++) {
|
|
526
|
-
if (segments[i].type === "mention") {
|
|
527
|
-
if (count === domIdx) {
|
|
528
|
-
setSelectedMentionIndex(i);
|
|
529
|
-
return;
|
|
530
|
-
}
|
|
531
|
-
count++;
|
|
532
|
-
}
|
|
533
|
-
}
|
|
534
|
-
setSelectedMentionIndex(null);
|
|
535
|
-
}, [segments]);
|
|
607
|
+
const segIdx = segmentIndexForMentionEl(mentionEl);
|
|
608
|
+
setSelectedMentionIndex(segIdx === -1 ? null : segIdx);
|
|
609
|
+
}, [segmentIndexForMentionEl]);
|
|
536
610
|
// Scroll highlighted suggestion into view
|
|
537
611
|
useEffect(() => {
|
|
538
612
|
if (highlightedIndex >= 0 && dropdownRef.current) {
|
|
@@ -552,11 +626,22 @@ const Mention = React__default.forwardRef(({ triggers: triggersProp, suggestions
|
|
|
552
626
|
const renderedSegments = useMemo(() => {
|
|
553
627
|
return segments.map((seg, i) => {
|
|
554
628
|
if (seg.type === "text") {
|
|
555
|
-
return (jsx("span", { "data-segment": "text", children: seg.text
|
|
629
|
+
return (jsx("span", { "data-segment": "text", children: seg.text }, `text-${i}`));
|
|
556
630
|
}
|
|
557
|
-
return (jsx(Tag, { size: mentionTagSize, removable:
|
|
558
|
-
|
|
559
|
-
|
|
631
|
+
return (jsx(Tag, { size: mentionTagSize, removable: mentionTagRemovable,
|
|
632
|
+
// Route removal through the segment model (same path as keyboard
|
|
633
|
+
// delete) so React stays the DOM owner and the editor remounts
|
|
634
|
+
// cleanly. stopPropagation in Tag keeps this click from also
|
|
635
|
+
// selecting the chip via the editable's onClick.
|
|
636
|
+
onRemove: () => removeMentionSegment(i), animated: false,
|
|
637
|
+
// Always pass the avatar object (src may be undefined) so the chip
|
|
638
|
+
// shows the initials fallback when no photo is available — matching
|
|
639
|
+
// the suggestion dropdown. Avatar renders the first initial at xs.
|
|
640
|
+
avatar: { src: seg.data.avatar, name: seg.data.label }, contentEditable: false, className: cn(
|
|
641
|
+
// align-middle: avatar vs text-only chips have differing intrinsic
|
|
642
|
+
// heights and an inline-flex baseline is ill-defined, so center on
|
|
643
|
+
// the line's middle to keep every chip level when used inline.
|
|
644
|
+
"align-middle", i === selectedMentionIndex &&
|
|
560
645
|
"ring-2 ring-[var(--color-primary)] ring-offset-1", mentionTagClassName), [MENTION_ATTR]: seg.data.id,
|
|
561
646
|
"data-mention-label": seg.data.label,
|
|
562
647
|
"data-mention-trigger": seg.data.trigger, children: seg.data.label }, `mention-${seg.data.id}-${i}`));
|
|
@@ -565,7 +650,8 @@ const Mention = React__default.forwardRef(({ triggers: triggersProp, suggestions
|
|
|
565
650
|
segments,
|
|
566
651
|
mentionTagSize,
|
|
567
652
|
mentionTagClassName,
|
|
568
|
-
|
|
653
|
+
mentionTagRemovable,
|
|
654
|
+
removeMentionSegment,
|
|
569
655
|
selectedMentionIndex,
|
|
570
656
|
]);
|
|
571
657
|
// -----------------------------------------------------------------------
|
|
@@ -580,10 +666,17 @@ const Mention = React__default.forwardRef(({ triggers: triggersProp, suggestions
|
|
|
580
666
|
insertMention(suggestion);
|
|
581
667
|
}, children: renderSuggestion(suggestion, isHighlighted, triggerChar) }, suggestion.id));
|
|
582
668
|
}
|
|
583
|
-
return (
|
|
669
|
+
return (jsx(MenuItem, { role: "option", "aria-selected": isHighlighted, "data-suggestion-index": index,
|
|
670
|
+
// Drives MenuItem's selected styling; highlight follows keyboard nav
|
|
671
|
+
// (and hover, via onMouseEnter setting highlightedIndex).
|
|
672
|
+
selected: isHighlighted, startContent: jsx(Avatar, { src: suggestion.avatar, name: suggestion.label, size: "xs", className: "ring-0 border-0" }), subtitle: suggestion.description, onMouseEnter: () => setHighlightedIndex(index),
|
|
673
|
+
// mousedown + preventDefault keeps focus in the contentEditable so
|
|
674
|
+
// selecting a suggestion never blurs the editor (MenuItem's onClick/
|
|
675
|
+
// onActivate path would fire too late, after focus moves).
|
|
676
|
+
onMouseDown: (e) => {
|
|
584
677
|
e.preventDefault();
|
|
585
678
|
insertMention(suggestion);
|
|
586
|
-
}, children:
|
|
679
|
+
}, children: suggestion.label }, suggestion.id));
|
|
587
680
|
};
|
|
588
681
|
// -----------------------------------------------------------------------
|
|
589
682
|
// Dropdown portal content
|
|
@@ -601,11 +694,13 @@ const Mention = React__default.forwardRef(({ triggers: triggersProp, suggestions
|
|
|
601
694
|
// Render
|
|
602
695
|
// -----------------------------------------------------------------------
|
|
603
696
|
const helperId = `${generatedId}-helper`;
|
|
604
|
-
return (jsxs("div", { className: cn(theme.wrapperStyle, wrapperClassName), children: [label && (jsx(FormLabel, { htmlFor: generatedId, state: isDisabled ? "disabled" : isInvalid ? "invalid" : "default", required: required, className: "mb-1.5", children: label })), jsx("div", { ref: wrapperRef, className: cn(theme.inputGroupStyle,
|
|
605
|
-
|
|
697
|
+
return (jsxs("div", { className: cn(theme.wrapperStyle, wrapperClassName), children: [label && (jsx(FormLabel, { htmlFor: generatedId, state: isDisabled ? "disabled" : isInvalid ? "invalid" : "default", required: required, className: "mb-1.5", children: label })), jsx("div", { ref: wrapperRef, className: cn(theme.inputGroupStyle, isInvalid && theme.invalidStyle, isFocused &&
|
|
698
|
+
(isInvalid ? theme.invalidFocusStyle : theme.inputGroupFocusStyle)), children: createElement("div", { ...props, key: editorKey, ref: setEditableRef, id: generatedId, contentEditable: !isDisabled, suppressContentEditableWarning: true, onInput: handleInput, onKeyDown: handleKeyDown, onClick: handleClick, onFocus: handleFocus, onBlur: handleBlur, onPaste: handlePaste, onSelect: handleSelect, onCompositionStart: handleCompositionStart, onCompositionEnd: handleCompositionEnd, role: "textbox", "aria-multiline": "true", "aria-autocomplete": "list", "aria-expanded": isDropdownOpen, "aria-haspopup": "listbox", "aria-placeholder": placeholder, "aria-required": required || undefined, "data-placeholder": placeholder, "aria-disabled": isDisabled || undefined, "aria-invalid": isInvalid || undefined, "aria-describedby": helperText ? helperId : undefined, className: cn(theme.editableStyle, theme.sizes[size], isContentEmpty &&
|
|
699
|
+
"before:content-[attr(data-placeholder)] before:text-[var(--color-text-placeholder)] before:pointer-events-none before:absolute", isDisabled && "cursor-not-allowed opacity-60", className), style: {
|
|
606
700
|
minHeight: rows ? `${rows * 1.5}em` : undefined,
|
|
701
|
+
...styleProp,
|
|
607
702
|
position: "relative",
|
|
608
|
-
}
|
|
703
|
+
} }, renderedSegments) }), helperText && (jsx("div", { id: helperId, className: cn("text-sm mt-1", isInvalid
|
|
609
704
|
? "text-[var(--color-danger)]"
|
|
610
705
|
: "text-[var(--color-text-muted)]"), children: helperText })), isClient && createPortal(dropdownContent, document.body)] }));
|
|
611
706
|
});
|
|
@@ -10,9 +10,11 @@ const mentionTheme = {
|
|
|
10
10
|
// Input group container with outline and focus ring
|
|
11
11
|
inputGroupStyle: formsBaseTheme.inputGroupBaseStyle,
|
|
12
12
|
// JS-driven focus ring (applied when editable div is focused)
|
|
13
|
-
inputGroupFocusStyle:
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
inputGroupFocusStyle: formsBaseTheme.focusStates.default,
|
|
14
|
+
// Invalid state — inset box-shadow + danger fill (NOT border/ring; see CLAUDE.md §9)
|
|
15
|
+
invalidStyle: formsBaseTheme.states.invalid,
|
|
16
|
+
// Invalid + focused — danger inset shadow + danger ring glow
|
|
17
|
+
invalidFocusStyle: formsBaseTheme.focusStates.invalid,
|
|
16
18
|
// Base editable div styles
|
|
17
19
|
editableStyle: `${formsBaseTheme.controlBaseStyle} whitespace-pre-wrap break-words overflow-y-auto cursor-text`,
|
|
18
20
|
// Size variants
|
|
@@ -21,35 +23,26 @@ const mentionTheme = {
|
|
|
21
23
|
md: `${formsBaseTheme.sizes.md.text} ${formsBaseTheme.sizes.md.padding} ${formsBaseTheme.sizes.md.textareaHeight}`,
|
|
22
24
|
lg: `${formsBaseTheme.sizes.lg.text} ${formsBaseTheme.sizes.lg.padding} ${formsBaseTheme.sizes.lg.textareaHeight}`,
|
|
23
25
|
},
|
|
24
|
-
// Inline mention Tag chip styles
|
|
25
|
-
mentionTagStyle: "mx-0.5 align-baseline cursor-default select-none",
|
|
26
|
+
// Inline mention Tag chip styles.
|
|
26
27
|
// Dropdown container - reuses the shared dropdown styles
|
|
27
|
-
|
|
28
|
-
//
|
|
28
|
+
// p-1 (not py-1) so MenuItem rows' rounded highlight insets evenly on all
|
|
29
|
+
// sides instead of running flush to the container's left/right edges.
|
|
30
|
+
dropdownStyle: formsBaseTheme.dropdownStyles.container + " p-1",
|
|
31
|
+
// Suggestion rows render via the shared MenuItem primitive (avatar →
|
|
32
|
+
// startContent, label → children, description → subtitle). These two styles
|
|
33
|
+
// are only used by the custom `renderSuggestion` escape hatch, which wraps
|
|
34
|
+
// the consumer's node in a plain row that still tracks hover/highlight.
|
|
29
35
|
suggestionStyle: "relative flex items-center gap-2.5 cursor-pointer select-none py-2 px-3 " +
|
|
30
36
|
"text-[var(--color-text-primary)] " +
|
|
31
37
|
"hover:text-[var(--color-primary)] hover:bg-[var(--color-primary-50)]/50 " +
|
|
32
38
|
"dark:hover:text-[var(--color-primary-400)] dark:hover:bg-[var(--color-primary-400)]/10",
|
|
33
|
-
// Highlighted suggestion (keyboard navigation)
|
|
39
|
+
// Highlighted suggestion (keyboard navigation) — custom renderSuggestion path
|
|
34
40
|
suggestionHighlightedStyle: "text-[var(--color-primary)] bg-[var(--color-primary-50)]/50 " +
|
|
35
41
|
"dark:text-[var(--color-primary-400)] dark:bg-[var(--color-primary-400)]/10",
|
|
36
|
-
// Avatar image
|
|
37
|
-
suggestionAvatarStyle: "size-7 rounded-full object-cover shrink-0 " +
|
|
38
|
-
"bg-[var(--color-surface-sunken)] dark:bg-[var(--color-neutral-700)]",
|
|
39
|
-
// Avatar fallback (initials circle)
|
|
40
|
-
suggestionAvatarFallbackStyle: "size-7 rounded-full shrink-0 flex items-center justify-center text-xs font-medium " +
|
|
41
|
-
"bg-[var(--color-primary-100)] text-[var(--color-primary-700)] " +
|
|
42
|
-
"dark:bg-[var(--color-primary-900)] dark:text-[var(--color-primary-300)]",
|
|
43
|
-
// Suggestion label text
|
|
44
|
-
suggestionLabelStyle: "text-sm font-medium truncate",
|
|
45
|
-
// Suggestion description text
|
|
46
|
-
suggestionDescriptionStyle: "text-xs text-[var(--color-text-muted)] truncate " +
|
|
47
|
-
"dark:text-[var(--color-neutral-500)]",
|
|
48
42
|
// Empty state
|
|
49
43
|
emptyMessageStyle: formsBaseTheme.dropdownStyles.emptyMessage,
|
|
50
|
-
// Loading state
|
|
51
|
-
loadingStyle: "py-3 px-3 text-center text-[var(--color-text-muted)]
|
|
52
|
-
"dark:text-[var(--color-neutral-500)]",
|
|
44
|
+
// Loading state (--color-text-muted auto-flips for dark mode)
|
|
45
|
+
loadingStyle: "py-3 px-3 text-center text-[var(--color-text-muted)]",
|
|
53
46
|
};
|
|
54
47
|
|
|
55
48
|
export { mentionTheme };
|
|
@@ -71,26 +71,21 @@ export interface MentionTheme {
|
|
|
71
71
|
inputGroupStyle: string;
|
|
72
72
|
/** JS-driven focus ring style */
|
|
73
73
|
inputGroupFocusStyle: string;
|
|
74
|
+
/** Invalid state style (inset box-shadow + danger fill) */
|
|
75
|
+
invalidStyle: string;
|
|
76
|
+
/** Invalid + focused style (danger inset shadow + ring glow) */
|
|
77
|
+
invalidFocusStyle: string;
|
|
74
78
|
/** Base editable div style */
|
|
75
79
|
editableStyle: string;
|
|
76
80
|
/** Size variants for the editable div */
|
|
77
81
|
sizes: Record<MentionSize, string>;
|
|
78
|
-
/** Inline mention Tag chip style */
|
|
79
|
-
mentionTagStyle: string;
|
|
80
82
|
/** Dropdown container style */
|
|
81
83
|
dropdownStyle: string;
|
|
82
|
-
/**
|
|
84
|
+
/** Suggestion row style — used only by the custom `renderSuggestion` path
|
|
85
|
+
* (default rows render via the shared MenuItem primitive). */
|
|
83
86
|
suggestionStyle: string;
|
|
84
|
-
/** Highlighted (keyboard-focused) suggestion style */
|
|
87
|
+
/** Highlighted (keyboard-focused) suggestion style — custom renderSuggestion path */
|
|
85
88
|
suggestionHighlightedStyle: string;
|
|
86
|
-
/** Avatar style inside a suggestion */
|
|
87
|
-
suggestionAvatarStyle: string;
|
|
88
|
-
/** Avatar fallback (initials) style */
|
|
89
|
-
suggestionAvatarFallbackStyle: string;
|
|
90
|
-
/** Suggestion label text style */
|
|
91
|
-
suggestionLabelStyle: string;
|
|
92
|
-
/** Suggestion description text style */
|
|
93
|
-
suggestionDescriptionStyle: string;
|
|
94
89
|
/** Empty state message style */
|
|
95
90
|
emptyMessageStyle: string;
|
|
96
91
|
/** Loading state style */
|
|
@@ -153,6 +148,11 @@ export interface MentionProps extends Omit<React.HTMLAttributes<HTMLDivElement>,
|
|
|
153
148
|
mentionTagSize?: TagSize;
|
|
154
149
|
/** Additional className for inline mention Tag chips */
|
|
155
150
|
mentionTagClassName?: string;
|
|
151
|
+
/**
|
|
152
|
+
* Show a remove (×) button on each inline mention chip so it can be deleted
|
|
153
|
+
* by click as well as by keyboard. Defaults to `true`.
|
|
154
|
+
*/
|
|
155
|
+
mentionTagRemovable?: boolean;
|
|
156
156
|
/** Number of visible text rows (controls min-height) */
|
|
157
157
|
rows?: number;
|
|
158
158
|
/** Label rendered above the mention input */
|
|
@@ -1,5 +1,23 @@
|
|
|
1
1
|
// Data attribute used to identify mention nodes in the DOM
|
|
2
2
|
const MENTION_ATTR = "data-mention-id";
|
|
3
|
+
/**
|
|
4
|
+
* True when `node` lives inside a mention chip (its avatar/label text nodes),
|
|
5
|
+
* as opposed to being the mention element itself. A TreeWalker descends into a
|
|
6
|
+
* FILTER_ACCEPTed mention element, so without rejecting these inner nodes the
|
|
7
|
+
* offset walkers would count a chip's inner text and land the caret inside it
|
|
8
|
+
* (chips are contentEditable=false). Stops at `container` (the walker root).
|
|
9
|
+
*/
|
|
10
|
+
const isInsideMention = (node, container) => {
|
|
11
|
+
let parent = node.parentNode;
|
|
12
|
+
while (parent && parent !== container) {
|
|
13
|
+
if (parent.nodeType === Node.ELEMENT_NODE &&
|
|
14
|
+
parent.hasAttribute(MENTION_ATTR)) {
|
|
15
|
+
return true;
|
|
16
|
+
}
|
|
17
|
+
parent = parent.parentNode;
|
|
18
|
+
}
|
|
19
|
+
return false;
|
|
20
|
+
};
|
|
3
21
|
/**
|
|
4
22
|
* Serialize segments to a plain text string.
|
|
5
23
|
* Mentions become `trigger + label` (e.g. "@Sarah Wilson").
|
|
@@ -111,12 +129,17 @@ const getPlainTextOffset = (container) => {
|
|
|
111
129
|
let offset = 0;
|
|
112
130
|
const walker = document.createTreeWalker(container, NodeFilter.SHOW_TEXT | NodeFilter.SHOW_ELEMENT, {
|
|
113
131
|
acceptNode: (node) => {
|
|
114
|
-
|
|
115
|
-
return NodeFilter.FILTER_ACCEPT;
|
|
132
|
+
// Mention element: count it atomically (its inner nodes are rejected below)
|
|
116
133
|
if (node.nodeType === Node.ELEMENT_NODE &&
|
|
117
134
|
node.hasAttribute(MENTION_ATTR)) {
|
|
118
135
|
return NodeFilter.FILTER_ACCEPT;
|
|
119
136
|
}
|
|
137
|
+
// Reject the chip's inner avatar/label nodes so the walker never
|
|
138
|
+
// descends into a mention or counts its inner text twice.
|
|
139
|
+
if (isInsideMention(node, container))
|
|
140
|
+
return NodeFilter.FILTER_REJECT;
|
|
141
|
+
if (node.nodeType === Node.TEXT_NODE)
|
|
142
|
+
return NodeFilter.FILTER_ACCEPT;
|
|
120
143
|
// Skip non-mention element nodes but traverse their children
|
|
121
144
|
return NodeFilter.FILTER_SKIP;
|
|
122
145
|
},
|
|
@@ -234,12 +257,17 @@ const setCaretAtOffset = (container, targetOffset) => {
|
|
|
234
257
|
let remaining = targetOffset;
|
|
235
258
|
const walker = document.createTreeWalker(container, NodeFilter.SHOW_TEXT | NodeFilter.SHOW_ELEMENT, {
|
|
236
259
|
acceptNode: (node) => {
|
|
237
|
-
|
|
238
|
-
return NodeFilter.FILTER_ACCEPT;
|
|
260
|
+
// Mention element: count it atomically (its inner nodes are rejected below)
|
|
239
261
|
if (node.nodeType === Node.ELEMENT_NODE &&
|
|
240
262
|
node.hasAttribute(MENTION_ATTR)) {
|
|
241
263
|
return NodeFilter.FILTER_ACCEPT;
|
|
242
264
|
}
|
|
265
|
+
// Reject the chip's inner avatar/label nodes so the caret is never
|
|
266
|
+
// placed inside a mention (chips are contentEditable=false).
|
|
267
|
+
if (isInsideMention(node, container))
|
|
268
|
+
return NodeFilter.FILTER_REJECT;
|
|
269
|
+
if (node.nodeType === Node.TEXT_NODE)
|
|
270
|
+
return NodeFilter.FILTER_ACCEPT;
|
|
243
271
|
return NodeFilter.FILTER_SKIP;
|
|
244
272
|
},
|
|
245
273
|
});
|
|
@@ -1437,11 +1437,11 @@ const RichTextEditor = React__default.forwardRef(({ size = "md", state = "defaul
|
|
|
1437
1437
|
: false;
|
|
1438
1438
|
switch (tool) {
|
|
1439
1439
|
case "bold":
|
|
1440
|
-
return (jsx(Button, { size: "sm", color: "neutral", variant: "soft", iconOnly: true, className: cn(themeStyles.toolbarButtonStyle), "data-state": isActive ? "active" : "inactive", onMouseDown: handleMouseDown, onClick: handleBold, disabled: isDisabled, "aria-label": "Bold", "aria-pressed": isActive ? "true" : "false", children: jsx(BoldIcon, { className: "
|
|
1440
|
+
return (jsx(Button, { size: "sm", color: "neutral", variant: "soft", iconOnly: true, className: cn(themeStyles.toolbarButtonStyle), "data-state": isActive ? "active" : "inactive", onMouseDown: handleMouseDown, onClick: handleBold, disabled: isDisabled, "aria-label": "Bold", "aria-pressed": isActive ? "true" : "false", children: jsx(BoldIcon, { className: "size-4" }) }, toolKey));
|
|
1441
1441
|
case "italic":
|
|
1442
|
-
return (jsx(Button, { size: "sm", color: "neutral", variant: "soft", iconOnly: true, className: cn(themeStyles.toolbarButtonStyle), "data-state": isActive ? "active" : "inactive", onMouseDown: handleMouseDown, onClick: handleItalic, disabled: isDisabled, "aria-label": "Italic", "aria-pressed": isActive ? "true" : "false", children: jsx(ItalicIcon, { className: "
|
|
1442
|
+
return (jsx(Button, { size: "sm", color: "neutral", variant: "soft", iconOnly: true, className: cn(themeStyles.toolbarButtonStyle), "data-state": isActive ? "active" : "inactive", onMouseDown: handleMouseDown, onClick: handleItalic, disabled: isDisabled, "aria-label": "Italic", "aria-pressed": isActive ? "true" : "false", children: jsx(ItalicIcon, { className: "size-4" }) }, toolKey));
|
|
1443
1443
|
case "underline":
|
|
1444
|
-
return (jsx(Button, { size: "sm", color: "neutral", variant: "soft", iconOnly: true, className: cn(themeStyles.toolbarButtonStyle), "data-state": isActive ? "active" : "inactive", onMouseDown: handleMouseDown, onClick: handleUnderline, disabled: isDisabled, "aria-label": "Underline", "aria-pressed": isActive ? "true" : "false", children: jsx(UnderlineIcon, { className: "
|
|
1444
|
+
return (jsx(Button, { size: "sm", color: "neutral", variant: "soft", iconOnly: true, className: cn(themeStyles.toolbarButtonStyle), "data-state": isActive ? "active" : "inactive", onMouseDown: handleMouseDown, onClick: handleUnderline, disabled: isDisabled, "aria-label": "Underline", "aria-pressed": isActive ? "true" : "false", children: jsx(UnderlineIcon, { className: "size-4" }) }, toolKey));
|
|
1445
1445
|
case "fontFamily": {
|
|
1446
1446
|
// The `fontFamily` tool is opt-in via toolbar config, but
|
|
1447
1447
|
// `fontFamilies` is also a public prop — if a consumer passes an
|
|
@@ -97,16 +97,16 @@ const richTextEditorTheme = {
|
|
|
97
97
|
// `rounded-t-[var(--form-radius)]` matches the container's radius so the
|
|
98
98
|
// toolbar's own bg/backdrop-blur respects the top corners — prevents the
|
|
99
99
|
// 1px bleed past the parent's `overflow-hidden` clip in Safari/Chromium.
|
|
100
|
-
toolbarStyle: "flex items-center gap-
|
|
100
|
+
toolbarStyle: "flex items-center m-0.5 gap-0.5 p-0.5 rounded-[var(--form-radius)] dark:bg-[var(--color-surface)]/0",
|
|
101
101
|
// Toolbar styling (floating variant — selection-anchored)
|
|
102
|
-
floatingToolbarStyle: "flex items-center gap-1 p-1 rounded-xl border border-[var(--color-border)] bg-
|
|
102
|
+
floatingToolbarStyle: "flex items-center gap-1 p-1 rounded-xl border border-[var(--color-border)] bg-[var(--color-surface-overlay)]/80 backdrop-blur-md shadow-real-xl overflow-hidden",
|
|
103
103
|
// Toolbar button — single source of truth via data-[state=active]
|
|
104
104
|
// (aria-pressed remains as proper ARIA on toggle buttons, but styling is decoupled)
|
|
105
|
-
toolbarButtonStyle: "inline-flex items-center justify-center
|
|
105
|
+
toolbarButtonStyle: "inline-flex items-center justify-center rounded-[calc(var(--radius-base)*0.85)] border border-transparent bg-transparent text-[var(--color-text-secondary)] hover:text-[var(--color-text-primary)] hover:bg-[var(--color-background-secondary)] transition-colors duration-300 disabled:opacity-50 disabled:cursor-not-allowed data-[state=active]:bg-[var(--color-background-secondary)] data-[state=active]:text-[var(--color-text-primary)] data-[state=active]:border-[var(--color-border)] data-[state=active]:shadow-inner",
|
|
106
106
|
// Dropdown surface (visual only — positioning handled at use site via portal)
|
|
107
|
-
dropdownStyle: "min-w-[120px] max-h-[18rem] overflow-y-auto py-1 bg-
|
|
107
|
+
dropdownStyle: "min-w-[120px] max-h-[18rem] overflow-y-auto py-1 bg-[var(--color-surface-overlay)]/80 backdrop-blur-md rounded-[var(--form-radius)] shadow-xl ring-1 ring-[var(--color-border)] focus:outline-none",
|
|
108
108
|
// Dropdown item — uses data-[active=true] for selected state
|
|
109
|
-
dropdownItemStyle: "block w-full px-3 py-2 text-left text-sm text-[var(--color-text-primary)] hover:bg-[var(--color-surface-hover)] transition-colors duration-150 disabled:opacity-50 disabled:cursor-not-allowed data-[active=true]:bg-[var(--color-primary-50)] data-[active=true]:text-[var(--color-primary-900)]",
|
|
109
|
+
dropdownItemStyle: "block w-full px-3 py-2 text-left text-sm text-[var(--color-text-primary)] hover:bg-[var(--color-surface-hover)] transition-colors duration-150 disabled:opacity-50 disabled:cursor-not-allowed data-[active=true]:bg-[var(--color-primary-50)] data-[active=true]:text-[var(--color-primary-900)] data-[active=true]:dark:bg-[var(--color-primary-400)]/10 data-[active=true]:dark:text-[var(--color-primary-400)]",
|
|
110
110
|
// Separator between toolbar sections
|
|
111
111
|
separatorStyle: "w-px h-6 bg-[var(--color-border)] mx-1",
|
|
112
112
|
// Color picker layout — column of family rows, plus optional Recent + Mono rows
|
|
@@ -96,7 +96,7 @@ const SelectButton = ({ id, disabled, isOpen, state = "default", size = "md", ic
|
|
|
96
96
|
// Use either the themed focus state or directly apply the focus classes if the theme is not working
|
|
97
97
|
const activeFocusState = isOpen
|
|
98
98
|
? focusStateStyle ||
|
|
99
|
-
"shadow-[
|
|
99
|
+
"shadow-[inset_0_0_0_1px_var(--color-primary)] ring-4 ring-[var(--color-primary)]/10"
|
|
100
100
|
: "";
|
|
101
101
|
return (jsxs("div", { className: cn(buttonWrapperStyle, "flex items-stretch"), children: [contentStart && (jsx("div", { "data-slot": "content-start", className: cn(contentSlotStyle, "pr-0 border-r border-[var(--color-border)]"), children: contentStart })), jsxs("button", { ref: buttonRef, id: id, type: "button", className: cn(baseStyle, sizeStyle, stateStyle, hoverStateStyle, activeFocusState, iconStartPadding, iconEndPadding, buttonStyle, "flex-1 min-w-0", className), onClick: onClick, onFocus: onFocus, onBlur: onBlur, disabled: disabled, "aria-expanded": isOpen, "aria-haspopup": "listbox", "aria-controls": isOpen && id ? `${id}-listbox` : undefined, "aria-labelledby": ariaLabelledby, "aria-invalid": ariaInvalid, "aria-describedby": ariaDescribedby, children: [iconStart && jsx("span", { className: iconStartStyle, children: iconStart }), children, iconEnd && jsx("span", { className: iconEndStyle, children: iconEnd })] }), contentEnd && (jsx("div", { "data-slot": "content-end", className: cn(contentSlotStyle, "pl-0 border-l border-[var(--color-border)]"), children: contentEnd }))] }));
|
|
102
102
|
};
|
|
@@ -287,7 +287,7 @@ const SelectOptions = ({ isOpen, maxHeight = "15rem", className = "", onClose, c
|
|
|
287
287
|
} }) })), children] })) }));
|
|
288
288
|
// Use portal if enabled and client-side - wrap with dark class for dark mode support
|
|
289
289
|
if (portal && isClient) {
|
|
290
|
-
return createPortal(jsx("div", { className: isDarkMode ? "dark" : undefined, children: optionsContent }), document.body);
|
|
290
|
+
return createPortal(jsx("div", { "data-flikkui-portal": "", className: isDarkMode ? "dark" : undefined, children: optionsContent }), document.body);
|
|
291
291
|
}
|
|
292
292
|
return optionsContent;
|
|
293
293
|
};
|
|
@@ -11,12 +11,12 @@ const selectTheme = {
|
|
|
11
11
|
baseStyle: formsBaseTheme.inputGroupBaseStyle + " items-center justify-between",
|
|
12
12
|
// Button wrapper style
|
|
13
13
|
buttonWrapperStyle: "relative w-full",
|
|
14
|
-
// Button style -
|
|
15
|
-
buttonStyle: "w-full cursor-pointer bg-
|
|
14
|
+
// Button style - surface flips automatically between light/dark
|
|
15
|
+
buttonStyle: "w-full cursor-pointer bg-[var(--color-surface)]",
|
|
16
16
|
// Placeholder text style - matches Input placeholder styling
|
|
17
17
|
placeholderTextStyle: formsBaseTheme.placeholderStyle,
|
|
18
18
|
// Selected value text style
|
|
19
|
-
valueTextStyle: "text-[var(--color-text-primary)]
|
|
19
|
+
valueTextStyle: "text-[var(--color-text-primary)]",
|
|
20
20
|
// Size variants - composed from atomic tokens
|
|
21
21
|
sizes: {
|
|
22
22
|
sm: `${formsBaseTheme.sizes.sm.text} ${formsBaseTheme.sizes.sm.padding} ${formsBaseTheme.sizes.sm.height}`,
|