@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
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { ConnectionState } from "./context/ConnectionContext";
|
|
2
|
+
import type { NodeCanvasEdge, NodeCanvasNode } from "./NodeCanvas.types";
|
|
3
|
+
interface EdgeLayerProps {
|
|
4
|
+
nodes: NodeCanvasNode[];
|
|
5
|
+
edges: NodeCanvasEdge[];
|
|
6
|
+
connection: ConnectionState | null;
|
|
7
|
+
onSelectEdge: (id: string, additive: boolean) => void;
|
|
8
|
+
onDeleteEdge: (id: string) => void;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* SVG layer (inside the zoom-scaled world) that draws every edge, the in-progress
|
|
12
|
+
* connection ghost, and a delete (×) button at the midpoint of hovered/selected
|
|
13
|
+
* edges. Anchors come from `node.position + handleOffset`, so edges stay locked to
|
|
14
|
+
* handles through pan / zoom / node drag. The × is counter-scaled so it stays a
|
|
15
|
+
* constant on-screen size.
|
|
16
|
+
*/
|
|
17
|
+
export declare function EdgeLayer({ nodes, edges, connection, onSelectEdge, onDeleteEdge, }: EdgeLayerProps): import("react/jsx-runtime").JSX.Element;
|
|
18
|
+
export {};
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { useState, useMemo } from 'react';
|
|
3
|
+
import { edgeMidpoint, Edge } from './Edge.js';
|
|
4
|
+
import { useHandleRegistry } from './context/HandleRegistry.js';
|
|
5
|
+
import { useNodeCanvasContext } from './context/CanvasContext.js';
|
|
6
|
+
|
|
7
|
+
const SIDE_NORMAL = {
|
|
8
|
+
top: [0, -1],
|
|
9
|
+
right: [1, 0],
|
|
10
|
+
bottom: [0, 1],
|
|
11
|
+
left: [-1, 0],
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* SVG layer (inside the zoom-scaled world) that draws every edge, the in-progress
|
|
15
|
+
* connection ghost, and a delete (×) button at the midpoint of hovered/selected
|
|
16
|
+
* edges. Anchors come from `node.position + handleOffset`, so edges stay locked to
|
|
17
|
+
* handles through pan / zoom / node drag. The × is counter-scaled so it stays a
|
|
18
|
+
* constant on-screen size.
|
|
19
|
+
*/
|
|
20
|
+
function EdgeLayer({ nodes, edges, connection, onSelectEdge, onDeleteEdge, }) {
|
|
21
|
+
const { handlesRef, version } = useHandleRegistry();
|
|
22
|
+
const { viewport } = useNodeCanvasContext();
|
|
23
|
+
const [hoveredEdge, setHoveredEdge] = useState(null);
|
|
24
|
+
const nodeMap = useMemo(() => new Map(nodes.map((n) => [n.id, n])), [nodes]);
|
|
25
|
+
const anchorAt = (node, h) => ({
|
|
26
|
+
point: { x: node.position.x + h.offset.x, y: node.position.y + h.offset.y },
|
|
27
|
+
position: h.position,
|
|
28
|
+
});
|
|
29
|
+
/** Node center (in flow coords), derived from the 4 auto-handle side-centers. */
|
|
30
|
+
const nodeCenter = (node) => {
|
|
31
|
+
var _a;
|
|
32
|
+
const auto = ((_a = handlesRef.current.get(node.id)) !== null && _a !== void 0 ? _a : []).filter((h) => h.kind === "auto");
|
|
33
|
+
if (auto.length) {
|
|
34
|
+
const sum = auto.reduce((a, h) => ({ x: a.x + h.offset.x, y: a.y + h.offset.y }), {
|
|
35
|
+
x: 0,
|
|
36
|
+
y: 0,
|
|
37
|
+
});
|
|
38
|
+
return { x: node.position.x + sum.x / auto.length, y: node.position.y + sum.y / auto.length };
|
|
39
|
+
}
|
|
40
|
+
return { x: node.position.x + 90, y: node.position.y + 40 };
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* Anchor an edge end. An explicit (non-auto) `<Handle>` is honored; otherwise the
|
|
44
|
+
* edge "floats" — it anchors to whichever auto-handle side faces `toward`, so edges
|
|
45
|
+
* route cleanly and re-route as nodes move.
|
|
46
|
+
*/
|
|
47
|
+
const anchorFor = (nodeId, handleId, type, toward) => {
|
|
48
|
+
var _a;
|
|
49
|
+
const node = nodeMap.get(nodeId);
|
|
50
|
+
if (!node)
|
|
51
|
+
return null;
|
|
52
|
+
const list = (_a = handlesRef.current.get(nodeId)) !== null && _a !== void 0 ? _a : [];
|
|
53
|
+
const explicit = handleId
|
|
54
|
+
? list.find((h) => h.id === handleId && h.kind !== "auto")
|
|
55
|
+
: list.find((h) => h.type === type && h.kind !== "auto");
|
|
56
|
+
if (explicit)
|
|
57
|
+
return anchorAt(node, explicit);
|
|
58
|
+
// Float: pick the auto-handle whose side best faces the other node.
|
|
59
|
+
const auto = list.filter((h) => h.kind === "auto");
|
|
60
|
+
if (auto.length) {
|
|
61
|
+
const center = nodeCenter(node);
|
|
62
|
+
const dir = { x: toward.x - center.x, y: toward.y - center.y };
|
|
63
|
+
let best = auto[0];
|
|
64
|
+
let bestDot = -Infinity;
|
|
65
|
+
for (const h of auto) {
|
|
66
|
+
const n = SIDE_NORMAL[h.position];
|
|
67
|
+
const dot = n[0] * dir.x + n[1] * dir.y;
|
|
68
|
+
if (dot > bestDot) {
|
|
69
|
+
bestDot = dot;
|
|
70
|
+
best = h;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return anchorAt(node, best);
|
|
74
|
+
}
|
|
75
|
+
return { point: { ...node.position }, position: type === "source" ? "right" : "left" };
|
|
76
|
+
};
|
|
77
|
+
const resolveEdge = (edge) => {
|
|
78
|
+
const sNode = nodeMap.get(edge.source);
|
|
79
|
+
const tNode = nodeMap.get(edge.target);
|
|
80
|
+
if (!sNode || !tNode)
|
|
81
|
+
return null;
|
|
82
|
+
const s = anchorFor(edge.source, edge.sourceHandle, "source", nodeCenter(tNode));
|
|
83
|
+
const t = anchorFor(edge.target, edge.targetHandle, "target", nodeCenter(sNode));
|
|
84
|
+
if (!s || !t)
|
|
85
|
+
return null;
|
|
86
|
+
return { s, t };
|
|
87
|
+
};
|
|
88
|
+
let ghost = null;
|
|
89
|
+
if (connection) {
|
|
90
|
+
// Ghost source floats toward the cursor.
|
|
91
|
+
ghost = anchorFor(connection.sourceNodeId, connection.sourceHandleId, connection.sourceType, connection.to);
|
|
92
|
+
}
|
|
93
|
+
return (jsxs("svg", { className: "absolute top-0 left-0 overflow-visible pointer-events-none", style: { width: 1, height: 1 }, children: [edges.map((edge) => {
|
|
94
|
+
var _a;
|
|
95
|
+
const resolved = resolveEdge(edge);
|
|
96
|
+
if (!resolved)
|
|
97
|
+
return null;
|
|
98
|
+
const { s, t } = resolved;
|
|
99
|
+
const showDelete = !connection && (edge.selected || hoveredEdge === edge.id);
|
|
100
|
+
const mid = edgeMidpoint((_a = edge.type) !== null && _a !== void 0 ? _a : "bezier", s.point, s.position, t.point, t.position);
|
|
101
|
+
return (jsxs("g", { onPointerEnter: () => setHoveredEdge(edge.id), onPointerLeave: () => setHoveredEdge((h) => (h === edge.id ? null : h)), children: [jsx(Edge, { id: edge.id, type: edge.type, source: s.point, sourcePosition: s.position, target: t.point, targetPosition: t.position, selected: edge.selected, color: edge.color, onPointerDown: (e) => {
|
|
102
|
+
e.stopPropagation();
|
|
103
|
+
onSelectEdge(edge.id, e.shiftKey);
|
|
104
|
+
} }), showDelete && (jsxs("g", { transform: `translate(${mid.x} ${mid.y}) scale(${1 / viewport.zoom})`, style: { pointerEvents: "auto", cursor: "pointer" }, className: "group/delete", onPointerDown: (e) => {
|
|
105
|
+
e.stopPropagation();
|
|
106
|
+
onDeleteEdge(edge.id);
|
|
107
|
+
}, "aria-label": "Delete connection", children: [jsx("circle", { r: 9, className: "fill-[var(--color-surface)] stroke-[var(--color-border)] drop-shadow-sm transition-colors group-hover/delete:fill-[var(--color-danger)] group-hover/delete:stroke-[var(--color-danger)]", strokeWidth: 1 }), jsx("path", { d: "M -3 -3 L 3 3 M 3 -3 L -3 3", className: "stroke-[var(--color-danger)] transition-colors group-hover/delete:stroke-white", strokeWidth: 1.5, strokeLinecap: "round", fill: "none" })] }))] }, edge.id));
|
|
108
|
+
}), connection && ghost && (jsx(Edge, { source: ghost.point, sourcePosition: ghost.position, target: connection.to, targetPosition: connection.to.x >= ghost.point.x ? "left" : "right", dashed: true, selected: true }))] }));
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
export { EdgeLayer };
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { HandleProps } from "./NodeCanvas.types";
|
|
2
|
+
/**
|
|
3
|
+
* A connection port, declared inside a custom node. Registers its center offset
|
|
4
|
+
* (in flow coords, relative to the node) so edges and connection drags anchor to
|
|
5
|
+
* `node.position + offset` — stable under pan/zoom/drag. Measured once after
|
|
6
|
+
* render and again only when the node's size changes.
|
|
7
|
+
*/
|
|
8
|
+
export declare function Handle({ type, id, position, isConnectable, className, style, children, }: HandleProps): import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
export declare namespace Handle {
|
|
10
|
+
var displayName: string;
|
|
11
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { useRef, useEffect } from 'react';
|
|
3
|
+
import { cn } from '../../utils/cn.js';
|
|
4
|
+
import { useNodeId } from './context/NodeIdContext.js';
|
|
5
|
+
import { useHandleRegistry, handleKey } from './context/HandleRegistry.js';
|
|
6
|
+
import { useNodeCanvasContext } from './context/CanvasContext.js';
|
|
7
|
+
import { useConnection } from './hooks/useConnection.js';
|
|
8
|
+
|
|
9
|
+
const SIDE_CLASSES = {
|
|
10
|
+
top: "top-0 left-1/2 -translate-x-1/2 -translate-y-1/2",
|
|
11
|
+
right: "right-0 top-1/2 translate-x-1/2 -translate-y-1/2",
|
|
12
|
+
bottom: "bottom-0 left-1/2 -translate-x-1/2 translate-y-1/2",
|
|
13
|
+
left: "left-0 top-1/2 -translate-x-1/2 -translate-y-1/2",
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* A connection port, declared inside a custom node. Registers its center offset
|
|
17
|
+
* (in flow coords, relative to the node) so edges and connection drags anchor to
|
|
18
|
+
* `node.position + offset` — stable under pan/zoom/drag. Measured once after
|
|
19
|
+
* render and again only when the node's size changes.
|
|
20
|
+
*/
|
|
21
|
+
function Handle({ type, id, position = type === "source" ? "right" : "left", isConnectable = true, className, style, children, }) {
|
|
22
|
+
const nodeId = useNodeId();
|
|
23
|
+
const ref = useRef(null);
|
|
24
|
+
const { register, unregister } = useHandleRegistry();
|
|
25
|
+
const { viewportRef, locked } = useNodeCanvasContext();
|
|
26
|
+
const { onPointerDown } = useConnection({ nodeId, handleId: id, type });
|
|
27
|
+
const connectable = isConnectable && !locked;
|
|
28
|
+
useEffect(() => {
|
|
29
|
+
const el = ref.current;
|
|
30
|
+
if (!el)
|
|
31
|
+
return;
|
|
32
|
+
const nodeEl = el.closest("[data-flikkui-node]");
|
|
33
|
+
if (!nodeEl)
|
|
34
|
+
return;
|
|
35
|
+
const measure = () => {
|
|
36
|
+
const hr = el.getBoundingClientRect();
|
|
37
|
+
const nr = nodeEl.getBoundingClientRect();
|
|
38
|
+
const zoom = viewportRef.current.zoom || 1;
|
|
39
|
+
register(nodeId, {
|
|
40
|
+
id,
|
|
41
|
+
type,
|
|
42
|
+
position,
|
|
43
|
+
offset: {
|
|
44
|
+
x: (hr.left + hr.width / 2 - nr.left) / zoom,
|
|
45
|
+
y: (hr.top + hr.height / 2 - nr.top) / zoom,
|
|
46
|
+
},
|
|
47
|
+
});
|
|
48
|
+
};
|
|
49
|
+
measure();
|
|
50
|
+
const ro = new ResizeObserver(measure);
|
|
51
|
+
ro.observe(nodeEl);
|
|
52
|
+
return () => {
|
|
53
|
+
ro.disconnect();
|
|
54
|
+
unregister(nodeId, handleKey(type, id));
|
|
55
|
+
};
|
|
56
|
+
}, [nodeId, id, type, position, register, unregister, viewportRef]);
|
|
57
|
+
return (jsx("div", { ref: ref, "data-flikkui-handle": "", "data-node-id": nodeId, "data-handle-type": type, "data-handle-id": id !== null && id !== void 0 ? id : "", className: cn("nodrag absolute z-10", children
|
|
58
|
+
? "grid place-items-center"
|
|
59
|
+
: "size-3 rounded-full border-2 bg-[var(--color-surface)] border-[var(--color-primary)]", SIDE_CLASSES[position], connectable ? "cursor-crosshair" : "opacity-50", className), style: style, onPointerDown: connectable ? onPointerDown : undefined, children: children }));
|
|
60
|
+
}
|
|
61
|
+
Handle.displayName = "Handle";
|
|
62
|
+
|
|
63
|
+
export { Handle };
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
declare const POSITIONS: {
|
|
2
|
+
readonly "bottom-left": "bottom-4 left-4";
|
|
3
|
+
readonly "bottom-right": "bottom-4 right-4";
|
|
4
|
+
readonly "top-left": "top-4 left-4";
|
|
5
|
+
readonly "top-right": "top-4 right-4";
|
|
6
|
+
};
|
|
7
|
+
export interface MiniMapProps {
|
|
8
|
+
position?: keyof typeof POSITIONS;
|
|
9
|
+
width?: number;
|
|
10
|
+
height?: number;
|
|
11
|
+
className?: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Overview map: all nodes + the current viewport rectangle, scaled to fit. Click or
|
|
15
|
+
* drag inside it to recenter the canvas on that point. Pane-level chrome (`z-20`),
|
|
16
|
+
* opted out of canvas panning via `data-flikkui-nopan`.
|
|
17
|
+
*/
|
|
18
|
+
export declare function MiniMap({ position, width, height, className, }: MiniMapProps): import("react/jsx-runtime").JSX.Element;
|
|
19
|
+
export declare namespace MiniMap {
|
|
20
|
+
var displayName: string;
|
|
21
|
+
}
|
|
22
|
+
export {};
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
|
+
import { useRef } from 'react';
|
|
3
|
+
import { cn } from '../../utils/cn.js';
|
|
4
|
+
import { useNodeCanvasContext } from './context/CanvasContext.js';
|
|
5
|
+
|
|
6
|
+
const POSITIONS = {
|
|
7
|
+
"bottom-left": "bottom-4 left-4",
|
|
8
|
+
"bottom-right": "bottom-4 right-4",
|
|
9
|
+
"top-left": "top-4 left-4",
|
|
10
|
+
"top-right": "top-4 right-4",
|
|
11
|
+
};
|
|
12
|
+
/** Estimated node footprint (node sizes aren't measured yet — issue 4 fast-follow). */
|
|
13
|
+
const NODE_W = 180;
|
|
14
|
+
const NODE_H = 80;
|
|
15
|
+
const PADDING = 40;
|
|
16
|
+
/**
|
|
17
|
+
* Overview map: all nodes + the current viewport rectangle, scaled to fit. Click or
|
|
18
|
+
* drag inside it to recenter the canvas on that point. Pane-level chrome (`z-20`),
|
|
19
|
+
* opted out of canvas panning via `data-flikkui-nopan`.
|
|
20
|
+
*/
|
|
21
|
+
function MiniMap({ position = "bottom-left", width = 200, height = 140, className, }) {
|
|
22
|
+
var _a, _b;
|
|
23
|
+
const { nodes, viewport, setViewport, paneRef } = useNodeCanvasContext();
|
|
24
|
+
const svgRef = useRef(null);
|
|
25
|
+
const dragging = useRef(false);
|
|
26
|
+
const pane = paneRef.current;
|
|
27
|
+
const paneW = (_a = pane === null || pane === void 0 ? void 0 : pane.clientWidth) !== null && _a !== void 0 ? _a : 0;
|
|
28
|
+
const paneH = (_b = pane === null || pane === void 0 ? void 0 : pane.clientHeight) !== null && _b !== void 0 ? _b : 0;
|
|
29
|
+
// Current viewport rectangle in flow coords.
|
|
30
|
+
const vx = -viewport.x / viewport.zoom;
|
|
31
|
+
const vy = -viewport.y / viewport.zoom;
|
|
32
|
+
const vw = paneW / viewport.zoom;
|
|
33
|
+
const vh = paneH / viewport.zoom;
|
|
34
|
+
// Bounds = union of node bounds and the viewport rect, padded.
|
|
35
|
+
let minX = vx;
|
|
36
|
+
let minY = vy;
|
|
37
|
+
let maxX = vx + vw;
|
|
38
|
+
let maxY = vy + vh;
|
|
39
|
+
for (const n of nodes) {
|
|
40
|
+
minX = Math.min(minX, n.position.x);
|
|
41
|
+
minY = Math.min(minY, n.position.y);
|
|
42
|
+
maxX = Math.max(maxX, n.position.x + NODE_W);
|
|
43
|
+
maxY = Math.max(maxY, n.position.y + NODE_H);
|
|
44
|
+
}
|
|
45
|
+
minX -= PADDING;
|
|
46
|
+
minY -= PADDING;
|
|
47
|
+
maxX += PADDING;
|
|
48
|
+
maxY += PADDING;
|
|
49
|
+
const bw = Math.max(maxX - minX, 1);
|
|
50
|
+
const bh = Math.max(maxY - minY, 1);
|
|
51
|
+
const scale = Math.min(width / bw, height / bh);
|
|
52
|
+
const ox = (width - bw * scale) / 2;
|
|
53
|
+
const oy = (height - bh * scale) / 2;
|
|
54
|
+
const toMM = (x, y) => ({
|
|
55
|
+
x: (x - minX) * scale + ox,
|
|
56
|
+
y: (y - minY) * scale + oy,
|
|
57
|
+
});
|
|
58
|
+
const recenter = (clientX, clientY) => {
|
|
59
|
+
var _a;
|
|
60
|
+
const r = (_a = svgRef.current) === null || _a === void 0 ? void 0 : _a.getBoundingClientRect();
|
|
61
|
+
if (!r)
|
|
62
|
+
return;
|
|
63
|
+
const flowX = (clientX - r.left - ox) / scale + minX;
|
|
64
|
+
const flowY = (clientY - r.top - oy) / scale + minY;
|
|
65
|
+
setViewport((v) => ({
|
|
66
|
+
zoom: v.zoom,
|
|
67
|
+
x: paneW / 2 - flowX * v.zoom,
|
|
68
|
+
y: paneH / 2 - flowY * v.zoom,
|
|
69
|
+
}));
|
|
70
|
+
};
|
|
71
|
+
const onPointerDown = (e) => {
|
|
72
|
+
var _a;
|
|
73
|
+
e.stopPropagation();
|
|
74
|
+
dragging.current = true;
|
|
75
|
+
recenter(e.clientX, e.clientY);
|
|
76
|
+
try {
|
|
77
|
+
(_a = svgRef.current) === null || _a === void 0 ? void 0 : _a.setPointerCapture(e.pointerId);
|
|
78
|
+
}
|
|
79
|
+
catch (_b) {
|
|
80
|
+
/* pointer inactive — drag still tracked via pointermove */
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
const onPointerMove = (e) => {
|
|
84
|
+
if (dragging.current)
|
|
85
|
+
recenter(e.clientX, e.clientY);
|
|
86
|
+
};
|
|
87
|
+
const onPointerUp = (e) => {
|
|
88
|
+
var _a;
|
|
89
|
+
dragging.current = false;
|
|
90
|
+
try {
|
|
91
|
+
(_a = svgRef.current) === null || _a === void 0 ? void 0 : _a.releasePointerCapture(e.pointerId);
|
|
92
|
+
}
|
|
93
|
+
catch (_b) {
|
|
94
|
+
/* noop */
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
const view = toMM(vx, vy);
|
|
98
|
+
return (jsx("div", { "data-flikkui-nopan": "", className: cn("absolute z-20 overflow-hidden rounded-lg border border-[var(--color-border)] bg-[var(--color-surface-overlay)] shadow-md", POSITIONS[position], className), style: { width, height }, children: jsxs("svg", { ref: svgRef, width: width, height: height, className: "cursor-pointer touch-none", onPointerDown: onPointerDown, onPointerMove: onPointerMove, onPointerUp: onPointerUp, children: [nodes.map((n) => {
|
|
99
|
+
const p = toMM(n.position.x, n.position.y);
|
|
100
|
+
return (jsx("rect", { x: p.x, y: p.y, width: NODE_W * scale, height: NODE_H * scale, rx: 2, className: cn(n.selected ? "fill-[var(--color-primary)]" : "fill-[var(--color-border)]") }, n.id));
|
|
101
|
+
}), jsx("rect", { x: view.x, y: view.y, width: vw * scale, height: vh * scale, className: "fill-[var(--color-primary)]/10 stroke-[var(--color-primary)]", strokeWidth: 1.5 })] }) }));
|
|
102
|
+
}
|
|
103
|
+
MiniMap.displayName = "MiniMap";
|
|
104
|
+
|
|
105
|
+
export { MiniMap };
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import type { NodeCanvasProps } from "./NodeCanvas.types";
|
|
3
|
+
/**
|
|
4
|
+
* The node-editor canvas: a pannable / zoomable viewport over an unbounded flow
|
|
5
|
+
* space. Renders nodes from `nodes` (via the `nodeTypes` registry) and edges from
|
|
6
|
+
* `edges`, supports drag-to-connect, and exposes everything through change-object
|
|
7
|
+
* callbacks. `children` are pane-level chrome (e.g. `Background`, controls) drawn
|
|
8
|
+
* over the canvas; nodes + edges live in the transformed world.
|
|
9
|
+
*/
|
|
10
|
+
export declare const NodeCanvas: React.ForwardRefExoticComponent<NodeCanvasProps & React.RefAttributes<HTMLDivElement>>;
|