@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
|
@@ -211,7 +211,7 @@ const CommandPalette = React__default.forwardRef(({ isOpen, onClose, commands =
|
|
|
211
211
|
// Otherwise render flat list
|
|
212
212
|
return displayCommands.map((command, index) => (jsx(CommandItem, { command: command, index: index, isHighlighted: index === highlightedIndex, onSelect: handleSelectCommand, onMouseEnter: setHighlightedIndex, theme: theme }, command.id)));
|
|
213
213
|
};
|
|
214
|
-
return (jsxs(Overlay, { ref: ref, isOpen: isOpen, onClose: onClose, closeOnOverlayClick: closeOnOverlayClick, closeOnEsc: closeOnEsc, position: "top", overlayClassName: overlayClassName, contentClassName: cn(theme.container, className), animations: {
|
|
214
|
+
return (jsxs(Overlay, { ref: ref, isOpen: isOpen, onClose: onClose, closeOnOverlayClick: closeOnOverlayClick, closeOnEsc: closeOnEsc, position: "top", overlayClassName: cn(theme.overlay, overlayClassName), contentClassName: cn(theme.container, className), animations: {
|
|
215
215
|
overlay: overlayAnimations,
|
|
216
216
|
content: containerAnimations,
|
|
217
217
|
}, children: [jsx("div", { className: theme.searchWrapper, children: jsxs("div", { className: "flex items-center gap-3", children: [jsx(MagnifyingGlassIcon, { className: "w-5 h-5 text-[var(--color-text-muted)]", strokeWidth: 2 }), jsx("input", { ref: searchInputRef, type: "text", className: theme.searchInput, placeholder: placeholder, value: searchValue, onChange: handleSearchChange, autoComplete: "off", autoCorrect: "off", spellCheck: false, "aria-label": "Search commands" })] }) }), jsx(ScrollArea, { ref: listContainerRef, type: "hover", className: "overscroll-contain px-1", style: {
|
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
const commandPaletteTheme = {
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
// Applied to the Overlay backdrop (positioning/z-index come from Overlay).
|
|
3
|
+
// Overrides the shared 65%-black scrim (--overlay-bg) with a lighter dim so
|
|
4
|
+
// real page content sits behind the container — that's what the container's
|
|
5
|
+
// backdrop-blur frosts into the glass effect. A heavy scrim would leave only
|
|
6
|
+
// a flat dark layer to blur, making backdrop-blur look like it does nothing.
|
|
7
|
+
overlay: "",
|
|
4
8
|
container: "relative w-full max-h-[calc(100vh-2rem)] max-w-lg " +
|
|
5
|
-
"bg-[var(--color-
|
|
9
|
+
"bg-[var(--color-surface-overlay)]/80 rounded-[var(--modal-radius)] shadow-2xl shadow-black/30 " +
|
|
6
10
|
"border border-[var(--color-border)] ring-4 ring-[var(--color-background)]/20 " +
|
|
7
11
|
"flex flex-col my-4 min-h-0 overflow-hidden " +
|
|
8
12
|
// Dark mode
|
|
@@ -11,18 +15,12 @@ const commandPaletteTheme = {
|
|
|
11
15
|
searchInput: "w-full px-0 py-0 text-sm bg-transparent border-none outline-none " +
|
|
12
16
|
"text-[var(--color-text-primary)] placeholder:text-[var(--color-text-placeholder)] " +
|
|
13
17
|
"focus:outline-none focus:ring-0 " +
|
|
14
|
-
// Dark mode
|
|
15
|
-
"dark:text-[var(--color-
|
|
18
|
+
// Dark mode — matches Input's controlBaseStyle text/placeholder tokens
|
|
19
|
+
"dark:text-[var(--color-text-primary)] dark:placeholder:text-[var(--color-neutral-500)]",
|
|
16
20
|
groupLabel: "px-4 py-1 text-xs font-semibold text-[var(--color-text-muted)]/50 uppercase " +
|
|
17
21
|
"dark:text-[var(--color-neutral-500)]",
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
"data-[highlighted=true]:bg-[var(--color-primary)] data-[highlighted=true]:hover:bg-[var(--color-primary)] " +
|
|
21
|
-
"data-[highlighted=true]:text-[var(--color-primary-contrast)] " +
|
|
22
|
-
"data-[disabled=true]:opacity-50 data-[disabled=true]:cursor-not-allowed data-[disabled=true]:hover:bg-transparent " +
|
|
23
|
-
// Dark mode - adjust hover state
|
|
24
|
-
"dark:text-[var(--color-neutral-200)] dark:hover:bg-[var(--color-primary-600)] " +
|
|
25
|
-
"dark:data-[highlighted=true]:bg-[var(--color-primary-600)]",
|
|
22
|
+
// Command rows render via the shared MenuItem primitive and use its default
|
|
23
|
+
// styling (subtle highlight + standard padding) — no per-row theme here.
|
|
26
24
|
emptyState: "px-4 py-12 text-center text-sm text-[var(--color-text-muted)] " +
|
|
27
25
|
"dark:text-[var(--color-neutral-500)]",
|
|
28
26
|
footer: "border-t border-[var(--color-border)] px-4 py-2 text-xs text-[var(--color-text-muted)]font-medium",
|
|
@@ -86,8 +86,6 @@ export interface CommandPaletteThemeOverrides {
|
|
|
86
86
|
searchInput?: string;
|
|
87
87
|
/** Style for group labels */
|
|
88
88
|
groupLabel?: string;
|
|
89
|
-
/** Style for command items (uses data-[highlighted] and data-[disabled] selectors) */
|
|
90
|
-
commandItem?: string;
|
|
91
89
|
/** Style for empty state */
|
|
92
90
|
emptyState?: string;
|
|
93
91
|
/** Style for the footer area */
|
|
@@ -5,21 +5,20 @@ const contextMenuTheme = {
|
|
|
5
5
|
...dropdownTheme,
|
|
6
6
|
// Content uses the same styling as Dropdown menu
|
|
7
7
|
contentStyle: dropdownTheme.menuStyle.replace("flex", "flex-col p-1"),
|
|
8
|
-
// Items use exact same styling as Dropdown items
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
"
|
|
20
|
-
// Separator - horizontal divider
|
|
21
|
-
separatorStyle: "h-px bg-[var(--color-border)] my-1 -mx-1
|
|
22
|
-
"dark:bg-[var(--color-neutral-700)]",
|
|
8
|
+
// Items use exact same styling as Dropdown items. The left padding for the
|
|
9
|
+
// check icon is applied per-item in ContextMenuItem (className) when checked.
|
|
10
|
+
itemStyle: dropdownTheme.itemBaseStyle,
|
|
11
|
+
// Checked state - tick icon positioning (absolute left).
|
|
12
|
+
// --color-text-primary flips for dark mode on its own.
|
|
13
|
+
itemCheckedStyle: "absolute left-2.5 top-1/2 -translate-y-1/2 w-4 h-4 text-[var(--color-text-primary)]",
|
|
14
|
+
// Submenu trigger - based on Dropdown item style with chevron space.
|
|
15
|
+
// --color-surface-hover is a translucent tint that lightens in dark on its own.
|
|
16
|
+
subTriggerStyle: `${dropdownTheme.itemBaseStyle} pr-8 data-[state=open]:bg-[var(--color-surface-hover)]`,
|
|
17
|
+
// Submenu content - floating anchored overlay, matches main dropdown menu
|
|
18
|
+
subContentStyle: "min-w-[180px] max-h-[400px] overflow-y-auto rounded-[var(--dropdown-radius)] border border-[var(--color-border)] ml-1 " +
|
|
19
|
+
"bg-[var(--color-surface-overlay)]/80 backdrop-blur-md shadow-real-xl flex flex-col p-1 focus:outline-none",
|
|
20
|
+
// Separator - horizontal divider (--color-border flips for dark on its own)
|
|
21
|
+
separatorStyle: "h-px bg-[var(--color-border)] my-1 -mx-1",
|
|
23
22
|
// Label - section header (matches Dropdown section title)
|
|
24
23
|
labelStyle: dropdownTheme.sectionTitleStyle,
|
|
25
24
|
};
|
|
@@ -23,7 +23,7 @@ const ContextMenuItem = React__default.forwardRef(({ children, className, checke
|
|
|
23
23
|
// Build end content: user's endContent OR shortcut display
|
|
24
24
|
const resolvedEndContent = endContent ||
|
|
25
25
|
(shortcut ? (jsx("span", { className: "text-sm text-[var(--color-text-muted)] font-mono", children: shortcut })) : undefined);
|
|
26
|
-
return (jsx(MenuItem, { ref: ref, role: "menuitem", disabled: disabled, isDanger: isDanger, startContent: resolvedStartContent, endContent: resolvedEndContent, subtitle: subtitle, onActivate: handleActivate, "data-checked": checked, "aria-checked": checked ? "true" : undefined, className: cn(checked && "pl-
|
|
26
|
+
return (jsx(MenuItem, { ref: ref, role: "menuitem", disabled: disabled, isDanger: isDanger, startContent: resolvedStartContent, endContent: resolvedEndContent, subtitle: subtitle, onActivate: handleActivate, "data-checked": checked, "aria-checked": checked ? "true" : undefined, className: cn(checked && "pl-6", className), theme: {
|
|
27
27
|
baseStyle: theme.itemStyle,
|
|
28
28
|
dangerStyle: theme.itemDangerStyle,
|
|
29
29
|
focusStyle: theme.itemFocusStyle,
|
|
@@ -53,7 +53,7 @@ const ContextMenuSubTrigger = React__default.forwardRef(({ children, className,
|
|
|
53
53
|
ref.current = el;
|
|
54
54
|
}
|
|
55
55
|
}, [ref, triggerRef]);
|
|
56
|
-
return (jsxs("div", { ref: handleRef, role: "menuitem", "aria-haspopup": "true", "aria-expanded": isOpen, "aria-disabled": disabled, "data-state": isOpen ? "open" : "closed", "data-disabled": disabled, tabIndex: disabled ? undefined : -1, className: cn(theme.subTriggerStyle, theme.itemFocusStyle, className), onMouseEnter: handleMouseEnter, onKeyDown: handleKeyDown, ...props, children: [jsx("span", { className: "flex-1 truncate", children: children }), jsx(ChevronRightIcon, { className: "absolute right-2 top-1/2 -translate-y-1/2
|
|
56
|
+
return (jsxs("div", { ref: handleRef, role: "menuitem", "aria-haspopup": "true", "aria-expanded": isOpen, "aria-disabled": disabled, "data-state": isOpen ? "open" : "closed", "data-disabled": disabled, tabIndex: disabled ? undefined : -1, className: cn(theme.subTriggerStyle, theme.itemFocusStyle, className), onMouseEnter: handleMouseEnter, onKeyDown: handleKeyDown, ...props, children: [jsx("span", { className: "flex-1 truncate", children: children }), jsx(ChevronRightIcon, { className: "absolute right-2 top-1/2 -translate-y-1/2 size-3 text-[var(--color-text-secondary)]", "aria-hidden": "true", strokeWidth: 2 })] }));
|
|
57
57
|
});
|
|
58
58
|
ContextMenuSubTrigger.displayName = "ContextMenuSubTrigger";
|
|
59
59
|
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import React__default, { useMemo } from 'react';
|
|
3
|
+
import { cn } from '../../../utils/cn.js';
|
|
4
|
+
import { dotSeparatorTheme } from './DotSeparator.theme.js';
|
|
5
|
+
|
|
6
|
+
const DotSeparator = React__default.forwardRef(({ size = 'md', className, theme: customTheme = {}, ...props }, ref) => {
|
|
7
|
+
const theme = useMemo(() => ({
|
|
8
|
+
...dotSeparatorTheme,
|
|
9
|
+
...customTheme,
|
|
10
|
+
sizes: {
|
|
11
|
+
...dotSeparatorTheme.sizes,
|
|
12
|
+
...customTheme.sizes,
|
|
13
|
+
},
|
|
14
|
+
}), [customTheme]);
|
|
15
|
+
return (jsx("span", { ref: ref, "aria-hidden": "true", className: cn(theme.baseStyle, theme.sizes[size], className), ...props }));
|
|
16
|
+
});
|
|
17
|
+
DotSeparator.displayName = 'DotSeparator';
|
|
18
|
+
|
|
19
|
+
export { DotSeparator };
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
const dotSeparatorTheme = {
|
|
2
|
+
baseStyle: 'inline-block shrink-0 rounded-full align-middle bg-[var(--color-text-muted)]',
|
|
3
|
+
sizes: {
|
|
4
|
+
sm: 'size-0.5 mx-1', // 2px dot
|
|
5
|
+
md: 'size-1 mx-1.5', // 4px dot
|
|
6
|
+
lg: 'size-1.5 mx-2', // 6px dot
|
|
7
|
+
},
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
export { dotSeparatorTheme };
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { HTMLAttributes } from 'react';
|
|
2
|
+
export type DotSeparatorSize = 'sm' | 'md' | 'lg';
|
|
3
|
+
export interface DotSeparatorTheme {
|
|
4
|
+
baseStyle: string;
|
|
5
|
+
sizes: Record<DotSeparatorSize, string>;
|
|
6
|
+
}
|
|
7
|
+
export interface DotSeparatorThemeOverrides {
|
|
8
|
+
baseStyle?: string;
|
|
9
|
+
sizes?: Partial<Record<DotSeparatorSize, string>>;
|
|
10
|
+
}
|
|
11
|
+
export interface DotSeparatorProps extends HTMLAttributes<HTMLSpanElement> {
|
|
12
|
+
/**
|
|
13
|
+
* The size of the dot (also scales its horizontal spacing)
|
|
14
|
+
* @default 'md'
|
|
15
|
+
*/
|
|
16
|
+
size?: DotSeparatorSize;
|
|
17
|
+
/**
|
|
18
|
+
* Custom class name for the dot
|
|
19
|
+
*/
|
|
20
|
+
className?: string;
|
|
21
|
+
/**
|
|
22
|
+
* Component-level theme overrides
|
|
23
|
+
*/
|
|
24
|
+
theme?: DotSeparatorThemeOverrides;
|
|
25
|
+
}
|
|
@@ -2,19 +2,18 @@ import { menuItemTheme } from '../MenuItem/MenuItem.theme.js';
|
|
|
2
2
|
|
|
3
3
|
const dropdownTheme = {
|
|
4
4
|
// Menu container - similar to Popover but with menu-specific styling
|
|
5
|
-
menuStyle: "min-w-[200px] max-h-[400px] overflow-y-auto rounded-[var(--dropdown-radius)] border border-[var(--color-border)] bg-[var(--color-surface-overlay)] shadow-real-xl focus:outline-none flex disabled:cursor-not-allowed " +
|
|
6
|
-
"dark:bg-[var(--color-surface-overlay)]",
|
|
5
|
+
menuStyle: "min-w-[200px] max-h-[400px] overflow-y-auto rounded-[var(--dropdown-radius)] border border-[var(--color-border)] bg-[var(--color-surface-overlay)]/80 backdrop-blur-md shadow-real-xl focus:outline-none flex disabled:cursor-not-allowed " +
|
|
6
|
+
"dark:bg-[var(--color-surface-overlay)]/80",
|
|
7
7
|
// Delegate item styles to shared MenuItem theme
|
|
8
8
|
itemBaseStyle: menuItemTheme.baseStyle,
|
|
9
9
|
itemDangerStyle: menuItemTheme.dangerStyle,
|
|
10
10
|
itemFocusStyle: menuItemTheme.focusStyle,
|
|
11
11
|
// Section title styling
|
|
12
|
-
sectionTitleStyle: "px-2 py-1.5 text-
|
|
12
|
+
sectionTitleStyle: "px-2 py-1.5 text-[11px] font-medium text-[var(--color-text-secondary)] uppercase tracking-tight",
|
|
13
13
|
// Section container styling
|
|
14
14
|
sectionStyle: "py-1",
|
|
15
|
-
// Separator between sections
|
|
16
|
-
separatorStyle: "my-1 h-px bg-[var(--color-border)]
|
|
17
|
-
"dark:bg-[var(--color-neutral-700)]",
|
|
15
|
+
// Separator between sections (--color-border flips for dark mode on its own)
|
|
16
|
+
separatorStyle: "my-1 h-px bg-[var(--color-border)]",
|
|
18
17
|
};
|
|
19
18
|
|
|
20
19
|
export { dropdownTheme };
|
|
@@ -63,7 +63,7 @@ const DropdownItem = React__default.forwardRef(({ itemKey, children, className,
|
|
|
63
63
|
// Build end content: user's endContent OR selection checkmark
|
|
64
64
|
const resolvedEndContent = endContent ||
|
|
65
65
|
(selectionMode !== "none" ? (jsx("div", { className: cn("flex items-center justify-center flex-shrink-0 w-5 h-5"), children: isSelected && (jsx(CheckIcon, { className: "size-4 text-[var(--color-text-secondary)]" })) })) : undefined);
|
|
66
|
-
return (jsx(MenuItem, { ref: ref, role: itemRole, disabled: disabled, isDanger: isDanger, startContent: startContent, endContent: resolvedEndContent, subtitle: subtitle, shortcut: shortcut, onActivate: handleActivate,
|
|
66
|
+
return (jsx(MenuItem, { ref: ref, role: itemRole, disabled: disabled, isDanger: isDanger, startContent: startContent, endContent: resolvedEndContent, subtitle: subtitle, shortcut: shortcut, onActivate: handleActivate, selected: isSelected, ...(selectionMode !== "none" ? { "aria-checked": isSelected } : {}), className: className, theme: {
|
|
67
67
|
baseStyle: theme.itemBaseStyle,
|
|
68
68
|
dangerStyle: theme.itemDangerStyle,
|
|
69
69
|
focusStyle: theme.itemFocusStyle,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { jsx } from 'react/jsx-runtime';
|
|
2
|
-
import React__default, { useRef, useState,
|
|
2
|
+
import React__default, { useRef, useState, useEffect, useCallback } from 'react';
|
|
3
3
|
import { useReducedMotion, AnimatePresence, motion } from 'motion/react';
|
|
4
4
|
import { createPortal } from 'react-dom';
|
|
5
5
|
import { cn } from '../../../utils/cn.js';
|
|
@@ -23,7 +23,7 @@ const DropdownMenu = React__default.forwardRef(({ children, className, animation
|
|
|
23
23
|
const [typeaheadString, setTypeaheadString] = useState("");
|
|
24
24
|
const typeaheadTimeoutRef = useRef(null);
|
|
25
25
|
// Use the positioning hook from Popover/Select
|
|
26
|
-
const { position, cssVariables, contentRef: portalContentRef, } = useSelectPortal({
|
|
26
|
+
const { position, cssVariables, contentRef: portalContentRef, actualPlacement, } = useSelectPortal({
|
|
27
27
|
triggerRef,
|
|
28
28
|
isOpen: isOpen || false,
|
|
29
29
|
placement,
|
|
@@ -31,6 +31,22 @@ const DropdownMenu = React__default.forwardRef(({ children, className, animation
|
|
|
31
31
|
autoWidth: false,
|
|
32
32
|
stickyTracking: true,
|
|
33
33
|
});
|
|
34
|
+
// Escape must close the menu even when focus never entered it — after a
|
|
35
|
+
// mouse-open, focus stays on the trigger, so the menu's own onKeyDown
|
|
36
|
+
// (which also handles Escape) never fires.
|
|
37
|
+
useEffect(() => {
|
|
38
|
+
if (!isOpen)
|
|
39
|
+
return;
|
|
40
|
+
const onDocKeyDown = (e) => {
|
|
41
|
+
var _a;
|
|
42
|
+
if (e.key !== "Escape")
|
|
43
|
+
return;
|
|
44
|
+
onOpenChange(false);
|
|
45
|
+
(_a = triggerRef.current) === null || _a === void 0 ? void 0 : _a.focus();
|
|
46
|
+
};
|
|
47
|
+
document.addEventListener("keydown", onDocKeyDown);
|
|
48
|
+
return () => document.removeEventListener("keydown", onDocKeyDown);
|
|
49
|
+
}, [isOpen, onOpenChange, triggerRef]);
|
|
34
50
|
// Get all menu items (not separators or sections)
|
|
35
51
|
const getMenuItems = useCallback(() => {
|
|
36
52
|
if (!localRef.current)
|
|
@@ -121,21 +137,32 @@ const DropdownMenu = React__default.forwardRef(({ children, className, animation
|
|
|
121
137
|
}
|
|
122
138
|
onOpenChange(false);
|
|
123
139
|
});
|
|
124
|
-
// Focus first item when menu opens
|
|
140
|
+
// Focus first item when menu opens. Retry until focus actually LANDS:
|
|
141
|
+
// useSelectPortal keeps the menu `visibility: hidden` until positioning
|
|
142
|
+
// completes, and focus() on a hidden element is a silent no-op — a
|
|
143
|
+
// single-shot focus fires inside that window, leaving focus on the
|
|
144
|
+
// trigger, which kills the whole keyboard layer (arrows, Enter, and
|
|
145
|
+
// typeahead all hang off focus being inside the menu).
|
|
125
146
|
useEffect(() => {
|
|
126
|
-
if (isOpen) {
|
|
127
|
-
// Focus first item after a small delay to allow render
|
|
128
|
-
requestAnimationFrame(() => {
|
|
129
|
-
const items = getMenuItems();
|
|
130
|
-
if (items.length > 0) {
|
|
131
|
-
focusItem(0);
|
|
132
|
-
}
|
|
133
|
-
});
|
|
134
|
-
}
|
|
135
|
-
else {
|
|
147
|
+
if (!isOpen) {
|
|
136
148
|
setFocusedIndex(-1);
|
|
137
149
|
setTypeaheadString("");
|
|
150
|
+
return;
|
|
138
151
|
}
|
|
152
|
+
let raf = 0;
|
|
153
|
+
let tries = 0;
|
|
154
|
+
const tryFocus = () => {
|
|
155
|
+
const items = getMenuItems();
|
|
156
|
+
if (items.length > 0) {
|
|
157
|
+
focusItem(0);
|
|
158
|
+
if (document.activeElement === items[0])
|
|
159
|
+
return; // focus landed
|
|
160
|
+
}
|
|
161
|
+
if (++tries < 10)
|
|
162
|
+
raf = requestAnimationFrame(tryFocus);
|
|
163
|
+
};
|
|
164
|
+
raf = requestAnimationFrame(tryFocus);
|
|
165
|
+
return () => cancelAnimationFrame(raf);
|
|
139
166
|
}, [isOpen, getMenuItems, focusItem]);
|
|
140
167
|
// Combine refs
|
|
141
168
|
const handleRef = useCallback((el) => {
|
|
@@ -156,23 +183,23 @@ const DropdownMenu = React__default.forwardRef(({ children, className, animation
|
|
|
156
183
|
el;
|
|
157
184
|
}
|
|
158
185
|
}, [ref, menuRef, portalContentRef]);
|
|
159
|
-
// Animation variants
|
|
186
|
+
// Animation variants — enter/exit from the trigger's side. A menu opening
|
|
187
|
+
// above the trigger slides up into place and scales from its bottom edge;
|
|
188
|
+
// a hardcoded top-down drop reads backwards there. `actualPlacement` (not
|
|
189
|
+
// the prop) so a viewport-flipped menu animates from its real side.
|
|
190
|
+
const side = (actualPlacement || placement || "bottom").split("-")[0];
|
|
191
|
+
const closedShift = side === "top"
|
|
192
|
+
? { y: 10 }
|
|
193
|
+
: side === "left"
|
|
194
|
+
? { x: 10 }
|
|
195
|
+
: side === "right"
|
|
196
|
+
? { x: -10 }
|
|
197
|
+
: { y: -10 };
|
|
198
|
+
const transformOrigin = side === "top" ? "bottom" : side === "left" ? "right" : side === "right" ? "left" : "top";
|
|
160
199
|
const menuVariants = {
|
|
161
|
-
hidden: {
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
y: -10,
|
|
165
|
-
},
|
|
166
|
-
visible: {
|
|
167
|
-
opacity: 1,
|
|
168
|
-
scale: 1,
|
|
169
|
-
y: 0,
|
|
170
|
-
},
|
|
171
|
-
exit: {
|
|
172
|
-
opacity: 0,
|
|
173
|
-
scale: 0.95,
|
|
174
|
-
y: -10,
|
|
175
|
-
},
|
|
200
|
+
hidden: { opacity: 0, scale: 0.95, x: 0, y: 0, ...closedShift },
|
|
201
|
+
visible: { opacity: 1, scale: 1, x: 0, y: 0 },
|
|
202
|
+
exit: { opacity: 0, scale: 0.95, x: 0, y: 0, ...closedShift },
|
|
176
203
|
};
|
|
177
204
|
// Extract DOM props to avoid type conflicts with Framer Motion
|
|
178
205
|
const { onAnimationStart, onAnimationEnd, onDrag, onDragStart, onDragEnd, ...domProps } = props;
|
|
@@ -180,6 +207,7 @@ const DropdownMenu = React__default.forwardRef(({ children, className, animation
|
|
|
180
207
|
...cssVariables,
|
|
181
208
|
top: `${position.top}px`,
|
|
182
209
|
left: `${position.left}px`,
|
|
210
|
+
transformOrigin,
|
|
183
211
|
}, id: menuId, role: "menu", "aria-label": ariaLabel || undefined, "aria-orientation": horizontal ? "horizontal" : "vertical", tabIndex: -1, onKeyDown: handleKeyDown, variants: shouldReduceMotion || !animation ? {} : menuVariants, initial: shouldReduceMotion || !animation ? undefined : "hidden", animate: shouldReduceMotion || !animation ? undefined : "visible", exit: shouldReduceMotion || !animation ? undefined : "exit", transition: shouldReduceMotion || !animation
|
|
184
212
|
? { duration: 0 }
|
|
185
213
|
: {
|
|
@@ -189,7 +217,7 @@ const DropdownMenu = React__default.forwardRef(({ children, className, animation
|
|
|
189
217
|
}, "data-state": isOpen ? "open" : "closed", "data-placement": placement, ...domProps, children: children })) }));
|
|
190
218
|
// Use portal if specified - wrap with dark class for dark mode support
|
|
191
219
|
if (portal && isClient) {
|
|
192
|
-
return createPortal(jsx("div", { className: isDarkMode ? "dark" : undefined, children: menuContent }), document.body);
|
|
220
|
+
return createPortal(jsx("div", { "data-flikkui-portal": "", className: isDarkMode ? "dark" : undefined, children: menuContent }), document.body);
|
|
193
221
|
}
|
|
194
222
|
return menuContent;
|
|
195
223
|
});
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import type { HeroCardProps } from "./HeroCard.types";
|
|
3
|
+
/** Default backdrop — one of the bundled `@flikk/ui/bg/*` blobs. */
|
|
4
|
+
export declare const HERO_CARD_DEFAULT_IMAGE = "/bg/1.webp";
|
|
5
|
+
export declare const HeroCard: React.ForwardRefExoticComponent<HeroCardProps & React.RefAttributes<HTMLDivElement>>;
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import React__default, { useRef, useCallback, useEffect } from 'react';
|
|
3
|
+
import { useReducedMotion } from 'motion/react';
|
|
4
|
+
import { cn } from '../../../utils/cn.js';
|
|
5
|
+
import { heroCardTheme } from './HeroCard.theme.js';
|
|
6
|
+
|
|
7
|
+
/** Default backdrop — one of the bundled `@flikk/ui/bg/*` blobs. */
|
|
8
|
+
const HERO_CARD_DEFAULT_IMAGE = "/bg/1.webp";
|
|
9
|
+
const HeroCard = React__default.forwardRef(({ image = HERO_CARD_DEFAULT_IMAGE, imageBlur = 40, imageScale = 1.5, imageOpacity = 0.25, imageBlend = "multiply", imagePosition = "center", parallax = false, parallaxIntensity = 32, contentClassName, theme, className, children, ...rest }, ref) => {
|
|
10
|
+
const outerRef = useRef(null);
|
|
11
|
+
const bgRef = useRef(null);
|
|
12
|
+
// Merge the forwarded ref with our internal one (we need the node for the listener)
|
|
13
|
+
const setOuterRef = useCallback((node) => {
|
|
14
|
+
outerRef.current = node;
|
|
15
|
+
if (typeof ref === "function")
|
|
16
|
+
ref(node);
|
|
17
|
+
else if (ref)
|
|
18
|
+
ref.current = node;
|
|
19
|
+
}, [ref]);
|
|
20
|
+
const prefersReducedMotion = useReducedMotion();
|
|
21
|
+
const parallaxOn = parallax && !!image && !prefersReducedMotion;
|
|
22
|
+
// Resting transform — also the SSR/no-JS value; the parallax loop overrides it imperatively.
|
|
23
|
+
const baseTransform = imageScale !== 1 ? `scale(${imageScale})` : undefined;
|
|
24
|
+
useEffect(() => {
|
|
25
|
+
const outer = outerRef.current;
|
|
26
|
+
const bg = bgRef.current;
|
|
27
|
+
if (!parallaxOn || !outer || !bg)
|
|
28
|
+
return;
|
|
29
|
+
let disposed = false;
|
|
30
|
+
// Travel can't exceed the overscan or the card edge would show through.
|
|
31
|
+
const maxTravel = (size) => Math.min(parallaxIntensity, ((imageScale - 1) / 2) * size);
|
|
32
|
+
let pointer = null;
|
|
33
|
+
const st = { tx: 0, ty: 0, x: 0, y: 0, raf: 0, running: false, last: 0 };
|
|
34
|
+
const apply = () => {
|
|
35
|
+
bg.style.transform = `translate3d(${st.x.toFixed(2)}px, ${st.y.toFixed(2)}px, 0) scale(${imageScale})`;
|
|
36
|
+
};
|
|
37
|
+
const loop = (now) => {
|
|
38
|
+
if (disposed)
|
|
39
|
+
return;
|
|
40
|
+
const dt = Math.min(Math.max((now - st.last) / 1000, 0.001), 0.05);
|
|
41
|
+
st.last = now;
|
|
42
|
+
const a = 1 - Math.exp(-9 * dt); // dt-normalized easing — same feel at 60/120Hz
|
|
43
|
+
st.x += (st.tx - st.x) * a;
|
|
44
|
+
st.y += (st.ty - st.y) * a;
|
|
45
|
+
apply();
|
|
46
|
+
if (Math.abs(st.tx - st.x) < 0.1 && Math.abs(st.ty - st.y) < 0.1 && !pointer) {
|
|
47
|
+
st.running = false;
|
|
48
|
+
return; // settled at rest, pointer gone → idle (no per-frame cost)
|
|
49
|
+
}
|
|
50
|
+
st.raf = requestAnimationFrame(loop);
|
|
51
|
+
};
|
|
52
|
+
const start = () => {
|
|
53
|
+
if (st.running || disposed)
|
|
54
|
+
return;
|
|
55
|
+
st.running = true;
|
|
56
|
+
st.last = performance.now();
|
|
57
|
+
st.raf = requestAnimationFrame(loop);
|
|
58
|
+
};
|
|
59
|
+
const onMove = (e) => {
|
|
60
|
+
if (e.pointerType !== "mouse")
|
|
61
|
+
return;
|
|
62
|
+
const r = outer.getBoundingClientRect();
|
|
63
|
+
pointer = { x: e.clientX, y: e.clientY };
|
|
64
|
+
const nx = (e.clientX - r.left) / r.width - 0.5; // -0.5 … 0.5
|
|
65
|
+
const ny = (e.clientY - r.top) / r.height - 0.5;
|
|
66
|
+
// Opposite the cursor → parallax depth; full intensity at the edges.
|
|
67
|
+
st.tx = -nx * 2 * maxTravel(r.width);
|
|
68
|
+
st.ty = -ny * 2 * maxTravel(r.height);
|
|
69
|
+
start();
|
|
70
|
+
};
|
|
71
|
+
const onLeave = () => {
|
|
72
|
+
pointer = null;
|
|
73
|
+
st.tx = 0;
|
|
74
|
+
st.ty = 0;
|
|
75
|
+
start(); // ease back to rest, then the loop self-stops
|
|
76
|
+
};
|
|
77
|
+
outer.addEventListener("pointermove", onMove, { passive: true });
|
|
78
|
+
outer.addEventListener("pointerleave", onLeave);
|
|
79
|
+
return () => {
|
|
80
|
+
disposed = true;
|
|
81
|
+
outer.removeEventListener("pointermove", onMove);
|
|
82
|
+
outer.removeEventListener("pointerleave", onLeave);
|
|
83
|
+
cancelAnimationFrame(st.raf);
|
|
84
|
+
bg.style.transform = baseTransform !== null && baseTransform !== void 0 ? baseTransform : "";
|
|
85
|
+
};
|
|
86
|
+
}, [parallaxOn, imageScale, parallaxIntensity, baseTransform]);
|
|
87
|
+
return (jsxs("div", { ref: setOuterRef, className: cn(heroCardTheme.baseStyle, theme === null || theme === void 0 ? void 0 : theme.baseStyle, className), ...rest, children: [image && (jsx("div", { ref: bgRef, "aria-hidden": "true", className: cn(heroCardTheme.imageStyle, theme === null || theme === void 0 ? void 0 : theme.imageStyle), style: {
|
|
88
|
+
backgroundImage: `url(${image})`,
|
|
89
|
+
backgroundPosition: imagePosition,
|
|
90
|
+
// Numeric knobs go inline — no dynamic Tailwind classes to purge-miss.
|
|
91
|
+
filter: imageBlur > 0 ? `blur(${imageBlur}px)` : undefined,
|
|
92
|
+
transform: baseTransform,
|
|
93
|
+
opacity: imageOpacity,
|
|
94
|
+
mixBlendMode: imageBlend,
|
|
95
|
+
} })), jsx("div", { className: cn(heroCardTheme.contentStyle, theme === null || theme === void 0 ? void 0 : theme.contentStyle, contentClassName), children: children })] }));
|
|
96
|
+
});
|
|
97
|
+
HeroCard.displayName = "HeroCard";
|
|
98
|
+
|
|
99
|
+
export { HERO_CARD_DEFAULT_IMAGE, HeroCard };
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
const heroCardTheme = {
|
|
2
|
+
// Shares Card's radius token; gradient runs on the primary scale so it follows the app theme.
|
|
3
|
+
baseStyle: "relative overflow-hidden rounded-[calc(var(--card-radius)*2)] p-10 text-white bg-gradient-to-br from-[var(--color-primary-600)] via-[var(--color-primary-700)] to-[var(--color-primary-500)] ring-4 ring-[var(--color-primary)]/20 ",
|
|
4
|
+
imageStyle: "absolute inset-0 z-0 pointer-events-none bg-cover",
|
|
5
|
+
contentStyle: "relative z-10",
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
export { heroCardTheme };
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
/** How the backdrop image composites over the gradient fill. */
|
|
3
|
+
export type HeroCardBlendMode = "multiply" | "overlay" | "soft-light" | "hard-light" | "screen" | "luminosity" | "normal";
|
|
4
|
+
export interface HeroCardThemeOverrides {
|
|
5
|
+
baseStyle?: string;
|
|
6
|
+
imageStyle?: string;
|
|
7
|
+
contentStyle?: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* HeroCard — a gradient hero shell with an ambient blurred backdrop image.
|
|
11
|
+
* Children are the content (anything) and render above the backdrop.
|
|
12
|
+
*
|
|
13
|
+
* @example Default (bundled image + gradient)
|
|
14
|
+
* ```tsx
|
|
15
|
+
* <HeroCard>
|
|
16
|
+
* <h2 className="text-3xl font-semibold">Good morning, Maya</h2>
|
|
17
|
+
* </HeroCard>
|
|
18
|
+
* ```
|
|
19
|
+
*
|
|
20
|
+
* @example Full backdrop control
|
|
21
|
+
* ```tsx
|
|
22
|
+
* <HeroCard
|
|
23
|
+
* image="/bg/7.webp"
|
|
24
|
+
* imageBlur={32}
|
|
25
|
+
* imageScale={1.5}
|
|
26
|
+
* imageOpacity={0.35}
|
|
27
|
+
* imageBlend="overlay"
|
|
28
|
+
* imagePosition="top right"
|
|
29
|
+
* className="from-rose-500 via-purple-700 to-indigo-900"
|
|
30
|
+
* >
|
|
31
|
+
* …
|
|
32
|
+
* </HeroCard>
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export interface HeroCardProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
36
|
+
/**
|
|
37
|
+
* Backdrop image src. Defaults to the bundled `/bg/3.webp`
|
|
38
|
+
* (ship the `@flikk/ui/bg/*` assets at `/bg/` or pass your own URL).
|
|
39
|
+
* Pass `null` for a gradient-only hero.
|
|
40
|
+
*/
|
|
41
|
+
image?: string | null;
|
|
42
|
+
/** Backdrop blur radius in px. @default 24 */
|
|
43
|
+
imageBlur?: number;
|
|
44
|
+
/** Backdrop scale factor — zooming the abstract blobs in/out reframes the texture. @default 1.25 */
|
|
45
|
+
imageScale?: number;
|
|
46
|
+
/** Backdrop opacity, 0–1. @default 0.5 */
|
|
47
|
+
imageOpacity?: number;
|
|
48
|
+
/** Blend mode compositing the image over the gradient. @default "multiply" */
|
|
49
|
+
imageBlend?: HeroCardBlendMode;
|
|
50
|
+
/** CSS `background-position` — e.g. `"top right"`, `"30% 70%"`. @default "center" */
|
|
51
|
+
imagePosition?: string;
|
|
52
|
+
/**
|
|
53
|
+
* On pointer hover, drift the backdrop image opposite the cursor (damped) for a
|
|
54
|
+
* parallax-depth effect. Pairs with a `TiltCard` wrapper. Mouse-driven; respects
|
|
55
|
+
* `prefers-reduced-motion`; no-op without an `image`. Travel is bounded by the
|
|
56
|
+
* `imageScale` overscan so card edges never show.
|
|
57
|
+
* @default false
|
|
58
|
+
*/
|
|
59
|
+
parallax?: boolean;
|
|
60
|
+
/**
|
|
61
|
+
* Max backdrop travel in px (each direction) when `parallax` is on. Auto-clamped
|
|
62
|
+
* to the available `imageScale` overscan.
|
|
63
|
+
* @default 32
|
|
64
|
+
*/
|
|
65
|
+
parallaxIntensity?: number;
|
|
66
|
+
/** className for the content wrapper (the layer lifted above the backdrop). */
|
|
67
|
+
contentClassName?: string;
|
|
68
|
+
/** Theme overrides (shadcn approach — `className` still wins). */
|
|
69
|
+
theme?: HeroCardThemeOverrides;
|
|
70
|
+
}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Default theme configuration for Kbd component
|
|
3
3
|
*/
|
|
4
4
|
const kbdTheme = {
|
|
5
|
-
baseStyle: 'inline-flex items-center justify-center leading-none font-sans font-medium rounded-[calc(var(--radius-base)*0.75)] bg-[var(--color-
|
|
5
|
+
baseStyle: 'inline-flex items-center justify-center leading-none font-sans font-medium rounded-[calc(var(--radius-base)*0.75)] bg-[var(--color-surface-raised)] border border-[var(--color-border)] text-[var(--color-text-secondary)]',
|
|
6
6
|
sizes: {
|
|
7
7
|
sm: 'text-xs px-1 min-w-5 h-5',
|
|
8
8
|
md: 'text-xs px-1.5 min-w-6 h-6',
|
|
@@ -9,12 +9,15 @@ import { menuItemTheme } from './MenuItem.theme.js';
|
|
|
9
9
|
* Handles visual layout, base styling, keyboard activation, and focus tracking.
|
|
10
10
|
* Context-specific behavior (selection, checked state) is handled by consumers.
|
|
11
11
|
*/
|
|
12
|
-
const MenuItem = React__default.forwardRef(({ children, className, startContent, endContent, subtitle, shortcut, disabled = false, isDanger = false, onActivate, theme: themeOverrides, role = "menuitem", ...props }, ref) => {
|
|
12
|
+
const MenuItem = React__default.forwardRef(({ children, className, startContent, endContent, subtitle, shortcut, disabled = false, isDanger = false, selected = false, onActivate, theme: themeOverrides, role = "menuitem", ...props }, ref) => {
|
|
13
13
|
const [isFocused, setIsFocused] = useState(false);
|
|
14
14
|
const theme = {
|
|
15
15
|
...menuItemTheme,
|
|
16
16
|
...themeOverrides,
|
|
17
17
|
};
|
|
18
|
+
// Resolve state to plain utility classes (not data-[state] variants) so a
|
|
19
|
+
// consumer `className` always wins the cascade. See MenuItem.theme.ts.
|
|
20
|
+
const stateKey = disabled ? "disabled" : selected ? "selected" : "default";
|
|
18
21
|
const handleClick = useCallback(() => {
|
|
19
22
|
if (disabled)
|
|
20
23
|
return;
|
|
@@ -26,7 +29,7 @@ const MenuItem = React__default.forwardRef(({ children, className, startContent,
|
|
|
26
29
|
handleClick();
|
|
27
30
|
}
|
|
28
31
|
}, [handleClick]);
|
|
29
|
-
return (jsxs("div", { ref: ref, role: role, tabIndex: disabled ? undefined : -1, "aria-disabled": disabled, "data-focused": isFocused, "data-disabled": disabled, className: cn(theme.baseStyle, theme.
|
|
32
|
+
return (jsxs("div", { ref: ref, role: role, tabIndex: disabled ? undefined : -1, "aria-disabled": disabled, "data-focused": isFocused, "data-disabled": disabled, "data-selected": selected, className: cn(theme.baseStyle, theme.states[stateKey], isFocused && !disabled && !selected && theme.focusedStyle, isDanger && theme.dangerStyle, theme.focusStyle, className), onClick: handleClick, onKeyDown: handleKeyDown, onFocus: () => setIsFocused(true), onBlur: () => setIsFocused(false), ...props, children: [startContent && (jsx("div", { className: "flex items-center justify-center flex-shrink-0", children: startContent })), jsxs("div", { className: "flex-1 min-w-0", children: [jsxs("div", { className: "flex items-center justify-between gap-2", children: [jsx("span", { className: "truncate", children: children }), shortcut && (jsx("span", { className: "ml-auto flex-shrink-0", children: shortcut }))] }), subtitle && (typeof subtitle === 'string'
|
|
30
33
|
? jsx("div", { className: theme.subtitleStyle, children: subtitle })
|
|
31
34
|
: subtitle)] }), endContent && (jsx("div", { className: "flex items-center justify-center ml-2", children: endContent }))] }));
|
|
32
35
|
});
|