@flikk/ui 1.0.0-beta.27 → 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 -143
- package/dist/components/ai/PromptInput/VoiceRecorder.js +0 -88
- 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 +2 -2
- 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/CommandPalette.theme.js +2 -2
- package/dist/components/core/ContextMenu/ContextMenu.theme.js +2 -2
- package/dist/components/core/ContextMenu/ContextMenuItem.js +1 -1
- package/dist/components/core/ContextMenu/ContextMenuSubTrigger.js +1 -1
- package/dist/components/core/Dropdown/Dropdown.theme.js +3 -3
- package/dist/components/core/Dropdown/DropdownMenu.js +57 -29
- 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/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/PageHeading/PageHeading.theme.js +2 -2
- package/dist/components/core/Popover/Popover.theme.js +1 -1
- 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/Tooltip/Tooltip.theme.js +1 -1
- package/dist/components/core/index.d.ts +1 -0
- package/dist/components/core/index.js +2 -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/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 +24 -4
- 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/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/DatePicker/DatePicker.theme.js +2 -2
- package/dist/components/forms/DateRangePicker/DateRangePicker.theme.js +1 -1
- package/dist/components/forms/FileUpload/FileUpload.js +1 -89
- package/dist/components/forms/FormLabel/FormLabel.theme.js +1 -1
- package/dist/components/forms/RichTextEditor/RichTextEditor.theme.js +2 -2
- 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 -90
- package/dist/components/forms/forms.theme.js +1 -1
- package/dist/components/forms/index.d.ts +0 -4
- package/dist/components/forms/index.js +0 -92
- 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.theme.js +2 -2
- package/dist/components/layout/FormLayout/FormLayout.js +1 -90
- 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 +3 -0
- package/dist/components/layout/index.js +6 -0
- package/dist/generative.schema.json +1637 -0
- package/dist/index.js +180 -180
- package/dist/registry.json +648 -464
- package/dist/styles.css +1 -1
- package/dist/tools.json +1731 -0
- package/package.json +17 -4
- package/src/global.scss +53 -101
- package/src/styles/theme.css +687 -493
- 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 -75
- 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
|
@@ -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
|
|
|
@@ -2,14 +2,14 @@ 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
15
|
// Separator between sections (--color-border flips for dark mode on its own)
|
|
@@ -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
|
: {
|
|
@@ -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',
|
|
@@ -3,7 +3,7 @@ import { ModalProps, ModalContextValue } from "./Modal.types";
|
|
|
3
3
|
export declare const ModalContext: React.Context<ModalContextValue | undefined>;
|
|
4
4
|
export declare const useModalContext: () => ModalContextValue;
|
|
5
5
|
export declare const Modal: {
|
|
6
|
-
({ isOpen, onClose, size,
|
|
6
|
+
({ isOpen, onClose, size, closeOnOverlayClick, closeOnEsc, showCloseButton, role, children, className, theme: themeOverrides, ...props }: ModalProps): import("react/jsx-runtime").JSX.Element;
|
|
7
7
|
displayName: string;
|
|
8
8
|
} & {
|
|
9
9
|
Header: {
|
|
@@ -18,8 +18,7 @@ const useModalContext = () => {
|
|
|
18
18
|
throw new Error("Modal compound components must be used within <Modal>");
|
|
19
19
|
return ctx;
|
|
20
20
|
};
|
|
21
|
-
const ModalRoot = ({ isOpen, onClose, size = "md",
|
|
22
|
-
var _a;
|
|
21
|
+
const ModalRoot = ({ isOpen, onClose, size = "md", closeOnOverlayClick = true, closeOnEsc = true, showCloseButton = true, role = "dialog", children, className, theme: themeOverrides, ...props }) => {
|
|
23
22
|
// Generate unique IDs for ARIA linkage
|
|
24
23
|
const id = useId();
|
|
25
24
|
const titleId = `${id}-title`;
|
|
@@ -39,10 +38,6 @@ const ModalRoot = ({ isOpen, onClose, size = "md", variant = "default", closeOnO
|
|
|
39
38
|
const theme = {
|
|
40
39
|
...modalTheme,
|
|
41
40
|
...(themeOverrides || {}),
|
|
42
|
-
containerVariants: {
|
|
43
|
-
...modalTheme.containerVariants,
|
|
44
|
-
...((themeOverrides === null || themeOverrides === void 0 ? void 0 : themeOverrides.containerVariants) || {}),
|
|
45
|
-
},
|
|
46
41
|
};
|
|
47
42
|
// Context value
|
|
48
43
|
const contextValue = useMemo(() => ({
|
|
@@ -59,7 +54,7 @@ const ModalRoot = ({ isOpen, onClose, size = "md", variant = "default", closeOnO
|
|
|
59
54
|
titleId,
|
|
60
55
|
subtitleId,
|
|
61
56
|
}), [isOpen, onClose, size, isSizeToken, closeOnOverlayClick, closeOnEsc, showCloseButton, theme, isBodyScrollable, setIsBodyScrollable, titleId, subtitleId]);
|
|
62
|
-
return (jsx(Overlay, { isOpen: isOpen, onClose: onClose, closeOnOverlayClick: closeOnOverlayClick, closeOnEsc: closeOnEsc, position: "center", role: role, ariaModal: true, ariaLabelledBy: titleId, ariaDescribedBy: subtitleId, contentClassName: cn(theme.container,
|
|
57
|
+
return (jsx(Overlay, { isOpen: isOpen, onClose: onClose, closeOnOverlayClick: closeOnOverlayClick, closeOnEsc: closeOnEsc, position: "center", role: role, ariaModal: true, ariaLabelledBy: titleId, ariaDescribedBy: subtitleId, contentClassName: cn(theme.container, isSizeToken ? modalSizeVariants[size] : size, className), animations: {
|
|
63
58
|
overlay: modalOverlayAnimations,
|
|
64
59
|
content: modalContentAnimations,
|
|
65
60
|
}, ...props, children: jsx(ModalContext.Provider, { value: contextValue, children: children }) }));
|
|
@@ -1,17 +1,13 @@
|
|
|
1
1
|
const modalTheme = {
|
|
2
2
|
// Note: overlay styling is now handled by the shared Overlay component
|
|
3
3
|
overlay: "",
|
|
4
|
-
container: "relative w-full max-h-[calc(100vh-2rem)] rounded-[var(--modal-radius)] shadow-2xl shadow-black/30 flex flex-col my-4 min-h-0 overflow-hidden",
|
|
5
|
-
|
|
6
|
-
default: "bg-[var(--color-surface-raised)] ring-4 !ring-white/10 dark:bg-[var(--color-surface-raised)] border border-[var(--color-border)]",
|
|
7
|
-
translucent: "bg-gradient-to-b from-[var(--color-background)]/90 to-[var(--color-background)]/70 backdrop-blur-xl ring-4 ring-white/20 border-t border-[var(--color-border)]",
|
|
8
|
-
},
|
|
9
|
-
header: "flex items-start justify-between p-6 pb-0 shrink-0 border-b border-transparent gap-6 relative",
|
|
4
|
+
container: "relative w-full max-h-[calc(100vh-2rem)] rounded-[var(--modal-radius)] shadow-2xl shadow-black/30 flex flex-col my-4 min-h-0 overflow-hidden bg-[var(--color-surface-raised)]/80 ring-6 !ring-white/10 border border-[var(--color-border)]",
|
|
5
|
+
header: "flex items-start justify-between p-4 pb-0 shrink-0 border-b border-transparent gap-6 relative",
|
|
10
6
|
headerContent: "flex flex-col items-start gap-2 flex-1",
|
|
11
7
|
title: "text-base leading-6 font-semibold text-[var(--color-text-primary)]",
|
|
12
8
|
subtitle: "text-sm text-[var(--color-text-muted)] mt-0.5",
|
|
13
|
-
body: "flex-1 overflow-y-auto p-
|
|
14
|
-
footer: "flex items-center justify-end gap-2 p-
|
|
9
|
+
body: "flex-1 overflow-y-auto p-4 pb-3",
|
|
10
|
+
footer: "flex items-center justify-end gap-2 p-3 py-2 border-t border-transparent",
|
|
15
11
|
};
|
|
16
12
|
// Size variants for the modal container
|
|
17
13
|
const modalSizeVariants = {
|
|
@@ -2,11 +2,9 @@ import React from "react";
|
|
|
2
2
|
export type ModalSizeToken = "sm" | "md" | "lg" | "xl" | "full";
|
|
3
3
|
/** Preset size token or any arbitrary Tailwind width class, e.g. `"w-80"`, `"w-[50vw]"` */
|
|
4
4
|
export type ModalSize = ModalSizeToken | (string & {});
|
|
5
|
-
export type ModalVariant = "default" | "translucent";
|
|
6
5
|
export interface ModalTheme {
|
|
7
6
|
overlay: string;
|
|
8
7
|
container: string;
|
|
9
|
-
containerVariants: Record<ModalVariant, string>;
|
|
10
8
|
header: string;
|
|
11
9
|
headerContent: string;
|
|
12
10
|
title: string;
|
|
@@ -17,7 +15,6 @@ export interface ModalTheme {
|
|
|
17
15
|
export interface ModalThemeOverrides {
|
|
18
16
|
overlay?: string;
|
|
19
17
|
container?: string;
|
|
20
|
-
containerVariants?: Partial<Record<ModalVariant, string>>;
|
|
21
18
|
header?: string;
|
|
22
19
|
headerContent?: string;
|
|
23
20
|
title?: string;
|
|
@@ -43,13 +40,6 @@ export interface ModalProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "
|
|
|
43
40
|
isOpen: boolean;
|
|
44
41
|
onClose: () => void;
|
|
45
42
|
size?: ModalSize;
|
|
46
|
-
/**
|
|
47
|
-
* Visual variant of the modal container.
|
|
48
|
-
* - `default`: Solid background with subtle ring
|
|
49
|
-
* - `translucent`: Frosted glass effect with reduced opacity and backdrop blur
|
|
50
|
-
* @default "default"
|
|
51
|
-
*/
|
|
52
|
-
variant?: ModalVariant;
|
|
53
43
|
closeOnOverlayClick?: boolean;
|
|
54
44
|
closeOnEsc?: boolean;
|
|
55
45
|
showCloseButton?: boolean;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export { Modal } from "./Modal";
|
|
2
|
-
export type { ModalProps, ModalSize,
|
|
2
|
+
export type { ModalProps, ModalSize, ModalThemeOverrides } from "./Modal.types";
|
|
@@ -5,7 +5,7 @@ export declare const ModalStack: {
|
|
|
5
5
|
displayName: string;
|
|
6
6
|
} & {
|
|
7
7
|
Modal: {
|
|
8
|
-
({ size,
|
|
8
|
+
({ size, showCloseButton, showBackButton, onClose, onBack, children, className, theme: themeOverrides, _stackOnClose, _isBackModal, }: ModalStackModalInternalProps): import("react/jsx-runtime").JSX.Element;
|
|
9
9
|
displayName: string;
|
|
10
10
|
};
|
|
11
11
|
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React from "react";
|
|
2
|
-
import { ModalSize,
|
|
2
|
+
import { ModalSize, ModalThemeOverrides } from "../Modal/Modal.types";
|
|
3
3
|
export interface ModalStackProps {
|
|
4
4
|
isOpen: boolean;
|
|
5
5
|
onClose: () => void;
|
|
@@ -12,7 +12,6 @@ export interface ModalStackModalProps {
|
|
|
12
12
|
isOpen?: boolean;
|
|
13
13
|
onClose?: () => void;
|
|
14
14
|
size?: ModalSize;
|
|
15
|
-
variant?: ModalVariant;
|
|
16
15
|
showCloseButton?: boolean;
|
|
17
16
|
showBackButton?: boolean;
|
|
18
17
|
onBack?: () => void;
|
|
@@ -6,6 +6,6 @@ export interface ModalStackModalInternalProps extends ModalStackModalProps {
|
|
|
6
6
|
_isBackModal?: boolean;
|
|
7
7
|
}
|
|
8
8
|
export declare const ModalStackModal: {
|
|
9
|
-
({ size,
|
|
9
|
+
({ size, showCloseButton, showBackButton, onClose, onBack, children, className, theme: themeOverrides, _stackOnClose, _isBackModal, }: ModalStackModalInternalProps): import("react/jsx-runtime").JSX.Element;
|
|
10
10
|
displayName: string;
|
|
11
11
|
};
|
|
@@ -7,8 +7,7 @@ import { ArrowLeftIcon } from '@heroicons/react/24/outline';
|
|
|
7
7
|
import { modalStackTheme } from './ModalStack.theme.js';
|
|
8
8
|
import { Button } from '../Button/Button.js';
|
|
9
9
|
|
|
10
|
-
const ModalStackModal = ({ size = "md",
|
|
11
|
-
var _a;
|
|
10
|
+
const ModalStackModal = ({ size = "md", showCloseButton = true, showBackButton = false, onClose, onBack, children, className, theme: themeOverrides, _stackOnClose, _isBackModal, }) => {
|
|
12
11
|
const id = useId();
|
|
13
12
|
const titleId = `${id}-title`;
|
|
14
13
|
const subtitleId = `${id}-subtitle`;
|
|
@@ -25,10 +24,6 @@ const ModalStackModal = ({ size = "md", variant = "default", showCloseButton = t
|
|
|
25
24
|
const theme = {
|
|
26
25
|
...modalTheme,
|
|
27
26
|
...(themeOverrides || {}),
|
|
28
|
-
containerVariants: {
|
|
29
|
-
...modalTheme.containerVariants,
|
|
30
|
-
...((themeOverrides === null || themeOverrides === void 0 ? void 0 : themeOverrides.containerVariants) || {}),
|
|
31
|
-
},
|
|
32
27
|
};
|
|
33
28
|
const contextValue = {
|
|
34
29
|
isOpen: true,
|
|
@@ -44,7 +39,7 @@ const ModalStackModal = ({ size = "md", variant = "default", showCloseButton = t
|
|
|
44
39
|
titleId,
|
|
45
40
|
subtitleId,
|
|
46
41
|
};
|
|
47
|
-
return (jsx(ModalContext.Provider, { value: contextValue, children: jsxs("div", { className: cn(theme.container,
|
|
42
|
+
return (jsx(ModalContext.Provider, { value: contextValue, children: jsxs("div", { className: cn(theme.container, modalSizeVariants[size], className), role: "dialog", "aria-modal": "true", "aria-labelledby": titleId, "aria-describedby": subtitleId, children: [showBackButton && (jsx("div", { className: cn(modalStackTheme.backButton), children: jsxs(Button, { onClick: backHandler, "aria-label": "Go back", variant: "link", size: "sm", children: [jsx(ArrowLeftIcon, { className: "size-4" }), "Back"] }) })), children] }) }));
|
|
48
43
|
};
|
|
49
44
|
ModalStackModal.displayName = "ModalStack.Modal";
|
|
50
45
|
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
const pageHeadingTheme = {
|
|
2
2
|
baseStyle: "flex flex-col pb-6 mb-6",
|
|
3
3
|
headerStyle: "flex items-center gap-4",
|
|
4
|
-
titleStyle: "text-xl font-
|
|
5
|
-
subtitleStyle: "text-sm text-[var(--color-text-
|
|
4
|
+
titleStyle: "text-xl font-bold text-[var(--color-text-primary)]",
|
|
5
|
+
subtitleStyle: "text-sm text-[var(--color-text-secondary)] mt-1",
|
|
6
6
|
actionsStyle: "sm:ml-auto flex items-center gap-2 shrink-0",
|
|
7
7
|
iconStyle: "flex items-center justify-center shrink-0 text-[var(--color-text-muted)]",
|
|
8
8
|
separatorStyle: "border-b border-[var(--color-border)] mt-4",
|
|
@@ -5,7 +5,7 @@ const popoverTheme = {
|
|
|
5
5
|
// Base styles for the popover
|
|
6
6
|
baseStyle: "z-50 outline-none",
|
|
7
7
|
// Body styles
|
|
8
|
-
bodyStyle: "bg-[var(--color-surface-overlay)] border border-[var(--color-border)] rounded-[var(--popover-radius)] shadow-real-xl p-4 max-w-[min(24rem,calc(100vw-2rem))]
|
|
8
|
+
bodyStyle: "bg-[var(--color-surface-overlay)]/80 backdrop-blur-md border border-[var(--color-border)] rounded-[var(--popover-radius)] shadow-real-xl p-4 max-w-[min(24rem,calc(100vw-2rem))]",
|
|
9
9
|
};
|
|
10
10
|
|
|
11
11
|
export { popoverTheme };
|