nuxt-ui-elements 0.1.40 → 0.1.41

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/README.md CHANGED
@@ -21,6 +21,7 @@ This module extends Nuxt UI with additional components and utilities designed to
21
21
  - 🔄 **Auto-import** - Components and composables are automatically available
22
22
  - 🎯 **TypeScript** - Full type safety out of the box
23
23
  - 🌙 **Dark Mode** - Automatic theme switching compatible with Nuxt UI
24
+ - 🔀 **Vue Flow Integration** - Themed wrapper components for interactive flowcharts and diagrams
24
25
 
25
26
  ## Requirements
26
27
 
@@ -154,6 +155,225 @@ async function handleDelete() {
154
155
 
155
156
  **Async Support**: When `onConfirm` returns a Promise, the dialog automatically shows loading state and displays success/error feedback before closing.
156
157
 
158
+ ### Flow Components
159
+
160
+ Themed wrapper components for [Vue Flow](https://vueflow.dev/), providing interactive flowcharts and node-based diagrams with Nuxt UI theming integration.
161
+
162
+ #### Prerequisites
163
+
164
+ Flow components require the `@vue-flow` packages. Install them alongside `nuxt-ui-elements`:
165
+
166
+ ```bash
167
+ pnpm add @vue-flow/core @vue-flow/background @vue-flow/controls @vue-flow/minimap
168
+ ```
169
+
170
+ #### Flow
171
+
172
+ The main container component that wraps Vue Flow with Nuxt UI theming and SSR safety via `<ClientOnly>`.
173
+
174
+ ```vue
175
+ <script setup>
176
+ const nodes = ref([
177
+ { id: '1', type: 'custom', position: { x: 0, y: 0 }, data: { label: 'Start' } },
178
+ { id: '2', type: 'custom', position: { x: 250, y: 100 }, data: { label: 'Process' } },
179
+ ])
180
+
181
+ const edges = ref([
182
+ { id: 'e1-2', source: '1', target: '2', animated: true },
183
+ ])
184
+ </script>
185
+
186
+ <template>
187
+ <UEFlow :nodes="nodes" :edges="edges" @connect="onConnect">
188
+ <template #node-custom="{ data }">
189
+ <UEFlowNode :label="data.label" color="primary" variant="outline">
190
+ <UEFlowHandle type="target" position="left" />
191
+ <UEFlowHandle type="source" position="right" />
192
+ </UEFlowNode>
193
+ </template>
194
+
195
+ <UEFlowBackground />
196
+ <UEFlowControls />
197
+ <UEFlowMiniMap />
198
+ </UEFlow>
199
+ </template>
200
+ ```
201
+
202
+ **Flow API:**
203
+
204
+ | Property | Type | Default | Description |
205
+ |----------|------|---------|-------------|
206
+ | `nodes` | `Node[]` | `[]` | Array of node objects |
207
+ | `edges` | `Edge[]` | `[]` | Array of edge objects |
208
+ | `nodeTypes` | `Record<string, any>` | `undefined` | Map of custom node type components |
209
+ | `edgeTypes` | `Record<string, any>` | `undefined` | Map of custom edge type components |
210
+ | `fitViewOnInit` | `boolean` | `true` | Fit view on initialization |
211
+ | `minZoom` | `number` | `0.2` | Minimum zoom level |
212
+ | `maxZoom` | `number` | `4` | Maximum zoom level |
213
+ | `nodesDraggable` | `boolean` | `true` | Whether nodes are draggable |
214
+ | `nodesConnectable` | `boolean` | `true` | Whether nodes are connectable |
215
+ | `elementsSelectable` | `boolean` | `true` | Whether elements are selectable |
216
+ | `connectionMode` | `ConnectionMode` | `undefined` | Connection mode |
217
+ | `defaultEdgeOptions` | `Record<string, any>` | `undefined` | Default options for edges |
218
+ | `ui` | `object` | `{}` | Custom UI classes override |
219
+
220
+ **Events:**
221
+
222
+ | Event | Payload | Description |
223
+ |-------|---------|-------------|
224
+ | `update:nodes` | `Node[]` | Emitted when nodes change |
225
+ | `update:edges` | `Edge[]` | Emitted when edges change |
226
+ | `nodeClick` | `event` | Emitted on node click |
227
+ | `edgeClick` | `event` | Emitted on edge click |
228
+ | `paneClick` | `event` | Emitted on pane click |
229
+ | `connect` | `params` | Emitted when a connection is made |
230
+
231
+ **Slots:** All Vue Flow slots are forwarded, including custom node/edge type slots (e.g., `#node-custom`).
232
+
233
+ #### FlowNode
234
+
235
+ A styled node component with color and variant theming. Use inside custom node type slots.
236
+
237
+ ```vue
238
+ <template #node-custom="{ data, selected }">
239
+ <UEFlowNode :label="data.label" color="success" variant="soft" :selected="selected">
240
+ <UEFlowHandle type="target" position="top" />
241
+ <template #default>
242
+ <p>Custom content here</p>
243
+ </template>
244
+ <UEFlowHandle type="source" position="bottom" />
245
+ </UEFlowNode>
246
+ </template>
247
+ ```
248
+
249
+ **FlowNode API:**
250
+
251
+ | Property | Type | Default | Description |
252
+ |----------|------|---------|-------------|
253
+ | `label` | `string` | `undefined` | Node label text |
254
+ | `color` | `'primary' \| 'secondary' \| 'success' \| 'info' \| 'warning' \| 'error' \| 'neutral'` | `'primary'` | Theme color |
255
+ | `variant` | `'solid' \| 'outline' \| 'soft' \| 'subtle'` | `'outline'` | Visual variant |
256
+ | `selected` | `boolean` | `false` | Whether the node is selected (adds ring indicator) |
257
+ | `ui` | `object` | `{}` | Custom UI classes override |
258
+
259
+ **Slots:**
260
+
261
+ | Slot | Description |
262
+ |------|-------------|
263
+ | `default` | Custom content rendered below the label |
264
+
265
+ #### FlowHandle
266
+
267
+ A themed connection handle for nodes. Place inside `FlowNode` to define source/target connection points.
268
+
269
+ ```vue
270
+ <UEFlowNode label="My Node" color="primary">
271
+ <UEFlowHandle type="target" position="top" color="primary" />
272
+ <UEFlowHandle type="source" position="bottom" color="primary" :connected="true" />
273
+ </UEFlowNode>
274
+ ```
275
+
276
+ **FlowHandle API:**
277
+
278
+ | Property | Type | Default | Description |
279
+ |----------|------|---------|-------------|
280
+ | `type` | `'source' \| 'target'` | **(required)** | Handle type |
281
+ | `position` | `Position \| 'top' \| 'bottom' \| 'left' \| 'right'` | `'bottom'` | Handle position on the node |
282
+ | `id` | `string` | `undefined` | Handle ID (required when a node has multiple handles of the same type) |
283
+ | `color` | `'primary' \| 'secondary' \| 'success' \| 'info' \| 'warning' \| 'error' \| 'neutral'` | `'primary'` | Theme color |
284
+ | `connected` | `boolean` | `false` | Whether a connection is active (fills the handle with color) |
285
+ | `ui` | `object` | `{}` | Custom UI classes override |
286
+
287
+ #### FlowBackground
288
+
289
+ A themed background pattern for the flow canvas.
290
+
291
+ ```vue
292
+ <UEFlow :nodes="nodes" :edges="edges">
293
+ <!-- Dot pattern (default) -->
294
+ <UEFlowBackground />
295
+
296
+ <!-- Line pattern with custom settings -->
297
+ <UEFlowBackground pattern="lines" :gap="30" :size="2" color="#ccc" />
298
+ </UEFlow>
299
+ ```
300
+
301
+ **FlowBackground API:**
302
+
303
+ | Property | Type | Default | Description |
304
+ |----------|------|---------|-------------|
305
+ | `pattern` | `'dots' \| 'lines'` | `'dots'` | Background pattern |
306
+ | `gap` | `number \| number[]` | `20` | Pattern gap spacing |
307
+ | `size` | `number` | `1` | Pattern element size |
308
+ | `color` | `string` | `undefined` | Pattern color |
309
+ | `lineWidth` | `number` | `undefined` | Line width (only for `lines` pattern) |
310
+ | `ui` | `object` | `{}` | Custom UI classes override |
311
+
312
+ #### FlowControls
313
+
314
+ A themed control panel for zoom, fit view, and interactivity toggles.
315
+
316
+ ```vue
317
+ <UEFlow :nodes="nodes" :edges="edges">
318
+ <!-- Default controls (all visible) -->
319
+ <UEFlowControls />
320
+
321
+ <!-- Only zoom and fit view -->
322
+ <UEFlowControls :show-interactive="false" position="top-left" />
323
+ </UEFlow>
324
+ ```
325
+
326
+ **FlowControls API:**
327
+
328
+ | Property | Type | Default | Description |
329
+ |----------|------|---------|-------------|
330
+ | `showZoom` | `boolean` | `true` | Show zoom in/out buttons |
331
+ | `showFitView` | `boolean` | `true` | Show fit-view button |
332
+ | `showInteractive` | `boolean` | `true` | Show interactive toggle |
333
+ | `fitViewParams` | `FitViewParams` | `undefined` | Parameters for fit view action |
334
+ | `position` | `PanelPositionType` | `'bottom-left'` | Panel position on the canvas |
335
+ | `ui` | `object` | `{}` | Custom UI classes override |
336
+
337
+ **Slots:**
338
+
339
+ | Slot | Description |
340
+ |------|-------------|
341
+ | `default` | Additional custom controls |
342
+
343
+ #### FlowMiniMap
344
+
345
+ A themed minimap for navigating large flow diagrams.
346
+
347
+ ```vue
348
+ <UEFlow :nodes="nodes" :edges="edges">
349
+ <!-- Default minimap -->
350
+ <UEFlowMiniMap />
351
+
352
+ <!-- Customized minimap -->
353
+ <UEFlowMiniMap
354
+ :pannable="true"
355
+ :zoomable="true"
356
+ position="top-right"
357
+ :node-border-radius="8"
358
+ />
359
+ </UEFlow>
360
+ ```
361
+
362
+ **FlowMiniMap API:**
363
+
364
+ | Property | Type | Default | Description |
365
+ |----------|------|---------|-------------|
366
+ | `pannable` | `boolean` | `true` | Enable drag to pan the viewport |
367
+ | `zoomable` | `boolean` | `true` | Enable scroll to zoom the viewport |
368
+ | `position` | `PanelPositionType` | `'bottom-right'` | Panel position on the canvas |
369
+ | `nodeColor` | `string` | `undefined` | Node fill color in the minimap |
370
+ | `nodeStrokeColor` | `string` | `undefined` | Node stroke color in the minimap |
371
+ | `nodeBorderRadius` | `number` | `4` | Node border radius in the minimap |
372
+ | `maskColor` | `string` | `undefined` | Viewport mask overlay color |
373
+ | `width` | `number` | `undefined` | Minimap width |
374
+ | `height` | `number` | `undefined` | Minimap height |
375
+ | `ui` | `object` | `{}` | Custom UI classes override |
376
+
157
377
  ## Standard Utilities (`#std`)
158
378
 
159
379
  The module provides tree-shakeable utility functions via the `#std` alias. These are **not** auto-imported and must be explicitly imported.
package/dist/module.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "nuxt-ui-elements",
3
3
  "configKey": "uiElements",
4
- "version": "0.1.40",
4
+ "version": "0.1.41",
5
5
  "builder": {
6
6
  "@nuxt/module-builder": "1.0.2",
7
7
  "unbuild": "3.6.1"
package/dist/module.mjs CHANGED
@@ -166,10 +166,222 @@ const toggleGroup = (_options) => ({
166
166
  }
167
167
  });
168
168
 
169
+ const flow = (_options) => ({
170
+ slots: {
171
+ root: "w-full h-[500px] relative",
172
+ wrapper: ""
173
+ },
174
+ variants: {},
175
+ defaultVariants: {}
176
+ });
177
+
178
+ const flowNode = (options) => ({
179
+ slots: {
180
+ root: [
181
+ "rounded-lg border px-4 py-3 shadow-sm",
182
+ "transition-all duration-200",
183
+ "min-w-[150px]"
184
+ ],
185
+ label: "text-sm font-medium",
186
+ content: "text-xs mt-1 opacity-80"
187
+ },
188
+ variants: {
189
+ color: {
190
+ ...Object.fromEntries((options.theme.colors || []).map((color) => [color, ""])),
191
+ neutral: ""
192
+ },
193
+ variant: {
194
+ solid: "",
195
+ outline: "",
196
+ soft: "",
197
+ subtle: ""
198
+ },
199
+ selected: {
200
+ true: {
201
+ root: "ring-2 ring-offset-2 ring-offset-default"
202
+ },
203
+ false: ""
204
+ }
205
+ },
206
+ compoundVariants: [
207
+ // Solid variants
208
+ ...(options.theme.colors || []).map((color) => ({
209
+ color,
210
+ variant: "solid",
211
+ class: {
212
+ root: `bg-${color} text-inverted border-${color}`
213
+ }
214
+ })),
215
+ {
216
+ color: "neutral",
217
+ variant: "solid",
218
+ class: {
219
+ root: "bg-inverted text-inverted border-inverted"
220
+ }
221
+ },
222
+ // Outline variants
223
+ ...(options.theme.colors || []).map((color) => ({
224
+ color,
225
+ variant: "outline",
226
+ class: {
227
+ root: `bg-default border-${color} text-${color}`
228
+ }
229
+ })),
230
+ {
231
+ color: "neutral",
232
+ variant: "outline",
233
+ class: {
234
+ root: "bg-default border-accented text-highlighted"
235
+ }
236
+ },
237
+ // Soft variants
238
+ ...(options.theme.colors || []).map((color) => ({
239
+ color,
240
+ variant: "soft",
241
+ class: {
242
+ root: `bg-${color}/10 border-${color}/20 text-${color}`
243
+ }
244
+ })),
245
+ {
246
+ color: "neutral",
247
+ variant: "soft",
248
+ class: {
249
+ root: "bg-elevated border-accented text-highlighted"
250
+ }
251
+ },
252
+ // Subtle variants
253
+ ...(options.theme.colors || []).map((color) => ({
254
+ color,
255
+ variant: "subtle",
256
+ class: {
257
+ root: `bg-${color}/5 border-transparent text-${color}`
258
+ }
259
+ })),
260
+ {
261
+ color: "neutral",
262
+ variant: "subtle",
263
+ class: {
264
+ root: "bg-elevated/50 border-transparent text-highlighted"
265
+ }
266
+ },
267
+ // Selected + color ring
268
+ ...(options.theme.colors || []).map((color) => ({
269
+ color,
270
+ selected: true,
271
+ class: {
272
+ root: `ring-${color}`
273
+ }
274
+ })),
275
+ {
276
+ color: "neutral",
277
+ selected: true,
278
+ class: {
279
+ root: "ring-accented"
280
+ }
281
+ }
282
+ ],
283
+ defaultVariants: {
284
+ color: "primary",
285
+ variant: "outline",
286
+ selected: false
287
+ }
288
+ });
289
+
290
+ const flowHandle = (options) => ({
291
+ slots: {
292
+ root: [
293
+ "!size-3 !rounded-full !border-2 !bg-default",
294
+ "transition-colors duration-150"
295
+ ]
296
+ },
297
+ variants: {
298
+ color: {
299
+ ...Object.fromEntries((options.theme.colors || []).map((color) => [color, ""])),
300
+ neutral: ""
301
+ },
302
+ connected: {
303
+ true: "",
304
+ false: ""
305
+ }
306
+ },
307
+ compoundVariants: [
308
+ // Default state: colored border, fill on hover
309
+ ...(options.theme.colors || []).map((color) => ({
310
+ color,
311
+ class: {
312
+ root: `!border-${color} hover:!bg-${color}`
313
+ }
314
+ })),
315
+ {
316
+ color: "neutral",
317
+ class: {
318
+ root: "!border-accented hover:!bg-inverted"
319
+ }
320
+ },
321
+ // Connected state: filled with color
322
+ ...(options.theme.colors || []).map((color) => ({
323
+ color,
324
+ connected: true,
325
+ class: {
326
+ root: `!bg-${color}`
327
+ }
328
+ })),
329
+ {
330
+ color: "neutral",
331
+ connected: true,
332
+ class: {
333
+ root: "!bg-inverted"
334
+ }
335
+ }
336
+ ],
337
+ defaultVariants: {
338
+ color: "primary",
339
+ connected: false
340
+ }
341
+ });
342
+
343
+ const flowBackground = (_options) => ({
344
+ slots: {
345
+ root: ""
346
+ },
347
+ variants: {
348
+ pattern: {
349
+ dots: "",
350
+ lines: ""
351
+ }
352
+ },
353
+ defaultVariants: {
354
+ pattern: "dots"
355
+ }
356
+ });
357
+
358
+ const flowControls = (_options) => ({
359
+ slots: {
360
+ root: "bg-default border border-accented rounded-lg shadow-sm overflow-hidden",
361
+ button: "p-2 hover:bg-elevated transition-colors border-b border-accented last:border-b-0"
362
+ },
363
+ variants: {},
364
+ defaultVariants: {}
365
+ });
366
+
367
+ const flowMiniMap = (_options) => ({
368
+ slots: {
369
+ root: "border border-accented rounded-lg shadow-sm overflow-hidden"
370
+ },
371
+ variants: {},
372
+ defaultVariants: {}
373
+ });
374
+
169
375
  const theme = {
170
376
  __proto__: null,
171
377
  dialogAlert: dialogAlert,
172
378
  dialogConfirm: dialogConfirm,
379
+ flow: flow,
380
+ flowBackground: flowBackground,
381
+ flowControls: flowControls,
382
+ flowHandle: flowHandle,
383
+ flowMiniMap: flowMiniMap,
384
+ flowNode: flowNode,
173
385
  toggleGroup: toggleGroup
174
386
  };
175
387
 
@@ -288,6 +500,38 @@ const module$1 = defineNuxtModule({
288
500
  path: resolver.resolve("./runtime/components"),
289
501
  prefix: options.prefix
290
502
  });
503
+ try {
504
+ const vueFlowCorePath = resolver.resolve("@vue-flow/core");
505
+ if (vueFlowCorePath) {
506
+ nuxt.options.css.push("@vue-flow/core/dist/style.css");
507
+ nuxt.options.css.push("@vue-flow/core/dist/theme-default.css");
508
+ nuxt.options.build.transpile.push("@vue-flow/core");
509
+ }
510
+ } catch {
511
+ }
512
+ try {
513
+ const bgPath = resolver.resolve("@vue-flow/background");
514
+ if (bgPath) {
515
+ nuxt.options.build.transpile.push("@vue-flow/background");
516
+ }
517
+ } catch {
518
+ }
519
+ try {
520
+ const controlsPath = resolver.resolve("@vue-flow/controls");
521
+ if (controlsPath) {
522
+ nuxt.options.css.push("@vue-flow/controls/dist/style.css");
523
+ nuxt.options.build.transpile.push("@vue-flow/controls");
524
+ }
525
+ } catch {
526
+ }
527
+ try {
528
+ const minimapPath = resolver.resolve("@vue-flow/minimap");
529
+ if (minimapPath) {
530
+ nuxt.options.css.push("@vue-flow/minimap/dist/style.css");
531
+ nuxt.options.build.transpile.push("@vue-flow/minimap");
532
+ }
533
+ } catch {
534
+ }
291
535
  }
292
536
  });
293
537
 
@@ -0,0 +1,65 @@
1
+ import type { AppConfig } from "@nuxt/schema";
2
+ import theme from "#build/ui-elements/flow";
3
+ import type { ComponentConfig } from "../types/index.js";
4
+ import type { Node, Edge, ConnectionMode } from "@vue-flow/core";
5
+ type Flow = ComponentConfig<typeof theme, AppConfig, "flow">;
6
+ export interface FlowProps {
7
+ /** Array of node objects */
8
+ nodes?: Node[];
9
+ /** Array of edge objects */
10
+ edges?: Edge[];
11
+ /** Map of custom node type components */
12
+ nodeTypes?: Record<string, any>;
13
+ /** Map of custom edge type components */
14
+ edgeTypes?: Record<string, any>;
15
+ /** Fit view on initialization */
16
+ fitViewOnInit?: boolean;
17
+ /** Minimum zoom level */
18
+ minZoom?: number;
19
+ /** Maximum zoom level */
20
+ maxZoom?: number;
21
+ /** Whether nodes are draggable */
22
+ nodesDraggable?: boolean;
23
+ /** Whether nodes are connectable */
24
+ nodesConnectable?: boolean;
25
+ /** Whether elements are selectable */
26
+ elementsSelectable?: boolean;
27
+ /** Connection mode */
28
+ connectionMode?: ConnectionMode;
29
+ /** Default edge options */
30
+ defaultEdgeOptions?: Record<string, any>;
31
+ /** Theme slot overrides */
32
+ ui?: Flow["slots"];
33
+ }
34
+ export interface FlowEmits {
35
+ "update:nodes": [nodes: Node[]];
36
+ "update:edges": [edges: Edge[]];
37
+ nodeClick: [event: any];
38
+ edgeClick: [event: any];
39
+ paneClick: [event: any];
40
+ connect: [params: any];
41
+ }
42
+ declare const _default: typeof __VLS_export;
43
+ export default _default;
44
+ declare const __VLS_export: __VLS_WithSlots<import("vue").DefineComponent<FlowProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
45
+ "update:nodes": (nodes: Node<any, any, string>[]) => any;
46
+ "update:edges": (edges: Edge[]) => any;
47
+ nodeClick: (event: any) => any;
48
+ edgeClick: (event: any) => any;
49
+ paneClick: (event: any) => any;
50
+ connect: (params: any) => any;
51
+ }, string, import("vue").PublicProps, Readonly<FlowProps> & Readonly<{
52
+ "onUpdate:nodes"?: ((nodes: Node<any, any, string>[]) => any) | undefined;
53
+ "onUpdate:edges"?: ((edges: Edge[]) => any) | undefined;
54
+ onNodeClick?: ((event: any) => any) | undefined;
55
+ onEdgeClick?: ((event: any) => any) | undefined;
56
+ onPaneClick?: ((event: any) => any) | undefined;
57
+ onConnect?: ((params: any) => any) | undefined;
58
+ }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>, {
59
+ [x: string]: ((props: any) => any) | undefined;
60
+ }>;
61
+ type __VLS_WithSlots<T, S> = T & {
62
+ new (): {
63
+ $slots: S;
64
+ };
65
+ };
@@ -0,0 +1,71 @@
1
+ <script>
2
+ import theme from "#build/ui-elements/flow";
3
+ </script>
4
+
5
+ <script setup>
6
+ import { computed } from "vue";
7
+ import { VueFlow } from "@vue-flow/core";
8
+ import { tv } from "../utils/tv";
9
+ const {
10
+ nodes = [],
11
+ edges = [],
12
+ fitViewOnInit = true,
13
+ minZoom = 0.2,
14
+ maxZoom = 4,
15
+ nodesDraggable = true,
16
+ nodesConnectable = true,
17
+ elementsSelectable = true,
18
+ ui: uiProps = {}
19
+ } = defineProps({
20
+ nodes: { type: Array, required: false },
21
+ edges: { type: Array, required: false },
22
+ nodeTypes: { type: Object, required: false },
23
+ edgeTypes: { type: Object, required: false },
24
+ fitViewOnInit: { type: Boolean, required: false },
25
+ minZoom: { type: Number, required: false },
26
+ maxZoom: { type: Number, required: false },
27
+ nodesDraggable: { type: Boolean, required: false },
28
+ nodesConnectable: { type: Boolean, required: false },
29
+ elementsSelectable: { type: Boolean, required: false },
30
+ connectionMode: { type: String, required: false },
31
+ defaultEdgeOptions: { type: Object, required: false },
32
+ ui: { type: Object, required: false }
33
+ });
34
+ const emit = defineEmits(["update:nodes", "update:edges", "nodeClick", "edgeClick", "paneClick", "connect"]);
35
+ const ui = computed(() => tv({ extend: tv(theme) })({}));
36
+ </script>
37
+
38
+ <template>
39
+ <ClientOnly>
40
+ <div :class="ui.root({ class: uiProps?.root })">
41
+ <VueFlow
42
+ :nodes="nodes"
43
+ :edges="edges"
44
+ :node-types="nodeTypes"
45
+ :edge-types="edgeTypes"
46
+ :fit-view-on-init="fitViewOnInit"
47
+ :min-zoom="minZoom"
48
+ :max-zoom="maxZoom"
49
+ :nodes-draggable="nodesDraggable"
50
+ :nodes-connectable="nodesConnectable"
51
+ :elements-selectable="elementsSelectable"
52
+ :connection-mode="connectionMode"
53
+ :default-edge-options="defaultEdgeOptions"
54
+ :class="ui.wrapper({ class: uiProps?.wrapper })"
55
+ @update:nodes="emit('update:nodes', $event)"
56
+ @update:edges="emit('update:edges', $event)"
57
+ @node-click="emit('nodeClick', $event)"
58
+ @edge-click="emit('edgeClick', $event)"
59
+ @pane-click="emit('paneClick', $event)"
60
+ @connect="emit('connect', $event)">
61
+ <template v-for="(_, name) in $slots" #[name]="slotData">
62
+ <slot :name="name" v-bind="slotData ?? {}" />
63
+ </template>
64
+ </VueFlow>
65
+ </div>
66
+
67
+ <template #fallback>
68
+ <div :class="ui.root({ class: uiProps?.root })" />
69
+ </template>
70
+ </ClientOnly>
71
+ </template>
@@ -0,0 +1,65 @@
1
+ import type { AppConfig } from "@nuxt/schema";
2
+ import theme from "#build/ui-elements/flow";
3
+ import type { ComponentConfig } from "../types/index.js";
4
+ import type { Node, Edge, ConnectionMode } from "@vue-flow/core";
5
+ type Flow = ComponentConfig<typeof theme, AppConfig, "flow">;
6
+ export interface FlowProps {
7
+ /** Array of node objects */
8
+ nodes?: Node[];
9
+ /** Array of edge objects */
10
+ edges?: Edge[];
11
+ /** Map of custom node type components */
12
+ nodeTypes?: Record<string, any>;
13
+ /** Map of custom edge type components */
14
+ edgeTypes?: Record<string, any>;
15
+ /** Fit view on initialization */
16
+ fitViewOnInit?: boolean;
17
+ /** Minimum zoom level */
18
+ minZoom?: number;
19
+ /** Maximum zoom level */
20
+ maxZoom?: number;
21
+ /** Whether nodes are draggable */
22
+ nodesDraggable?: boolean;
23
+ /** Whether nodes are connectable */
24
+ nodesConnectable?: boolean;
25
+ /** Whether elements are selectable */
26
+ elementsSelectable?: boolean;
27
+ /** Connection mode */
28
+ connectionMode?: ConnectionMode;
29
+ /** Default edge options */
30
+ defaultEdgeOptions?: Record<string, any>;
31
+ /** Theme slot overrides */
32
+ ui?: Flow["slots"];
33
+ }
34
+ export interface FlowEmits {
35
+ "update:nodes": [nodes: Node[]];
36
+ "update:edges": [edges: Edge[]];
37
+ nodeClick: [event: any];
38
+ edgeClick: [event: any];
39
+ paneClick: [event: any];
40
+ connect: [params: any];
41
+ }
42
+ declare const _default: typeof __VLS_export;
43
+ export default _default;
44
+ declare const __VLS_export: __VLS_WithSlots<import("vue").DefineComponent<FlowProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
45
+ "update:nodes": (nodes: Node<any, any, string>[]) => any;
46
+ "update:edges": (edges: Edge[]) => any;
47
+ nodeClick: (event: any) => any;
48
+ edgeClick: (event: any) => any;
49
+ paneClick: (event: any) => any;
50
+ connect: (params: any) => any;
51
+ }, string, import("vue").PublicProps, Readonly<FlowProps> & Readonly<{
52
+ "onUpdate:nodes"?: ((nodes: Node<any, any, string>[]) => any) | undefined;
53
+ "onUpdate:edges"?: ((edges: Edge[]) => any) | undefined;
54
+ onNodeClick?: ((event: any) => any) | undefined;
55
+ onEdgeClick?: ((event: any) => any) | undefined;
56
+ onPaneClick?: ((event: any) => any) | undefined;
57
+ onConnect?: ((params: any) => any) | undefined;
58
+ }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>, {
59
+ [x: string]: ((props: any) => any) | undefined;
60
+ }>;
61
+ type __VLS_WithSlots<T, S> = T & {
62
+ new (): {
63
+ $slots: S;
64
+ };
65
+ };
@@ -0,0 +1,21 @@
1
+ import type { AppConfig } from "@nuxt/schema";
2
+ import theme from "#build/ui-elements/flow-background";
3
+ import type { ComponentConfig } from "../types/index.js";
4
+ type FlowBackground = ComponentConfig<typeof theme, AppConfig, "flowBackground">;
5
+ export interface FlowBackgroundProps {
6
+ /** Background pattern variant */
7
+ pattern?: "dots" | "lines";
8
+ /** Background pattern gap */
9
+ gap?: number | number[];
10
+ /** Background pattern size */
11
+ size?: number;
12
+ /** Background pattern color */
13
+ color?: string;
14
+ /** Background line width (for lines pattern) */
15
+ lineWidth?: number;
16
+ /** Theme slot overrides */
17
+ ui?: FlowBackground["slots"];
18
+ }
19
+ declare const _default: typeof __VLS_export;
20
+ export default _default;
21
+ declare const __VLS_export: import("vue").DefineComponent<FlowBackgroundProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<FlowBackgroundProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
@@ -0,0 +1,39 @@
1
+ <script>
2
+ import theme from "#build/ui-elements/flow-background";
3
+ </script>
4
+
5
+ <script setup>
6
+ import { computed } from "vue";
7
+ import { Background } from "@vue-flow/background";
8
+ import { tv } from "../utils/tv";
9
+ const {
10
+ pattern = "dots",
11
+ gap = 20,
12
+ size = 1,
13
+ color,
14
+ lineWidth,
15
+ ui: uiProps = {}
16
+ } = defineProps({
17
+ pattern: { type: String, required: false },
18
+ gap: { type: [Number, Array], required: false },
19
+ size: { type: Number, required: false },
20
+ color: { type: String, required: false },
21
+ lineWidth: { type: Number, required: false },
22
+ ui: { type: Object, required: false }
23
+ });
24
+ const ui = computed(
25
+ () => tv({ extend: tv(theme) })({
26
+ pattern
27
+ })
28
+ );
29
+ </script>
30
+
31
+ <template>
32
+ <Background
33
+ :variant="pattern"
34
+ :gap="gap"
35
+ :size="size"
36
+ :color="color"
37
+ :line-width="lineWidth"
38
+ :class="ui.root({ class: uiProps?.root })" />
39
+ </template>
@@ -0,0 +1,21 @@
1
+ import type { AppConfig } from "@nuxt/schema";
2
+ import theme from "#build/ui-elements/flow-background";
3
+ import type { ComponentConfig } from "../types/index.js";
4
+ type FlowBackground = ComponentConfig<typeof theme, AppConfig, "flowBackground">;
5
+ export interface FlowBackgroundProps {
6
+ /** Background pattern variant */
7
+ pattern?: "dots" | "lines";
8
+ /** Background pattern gap */
9
+ gap?: number | number[];
10
+ /** Background pattern size */
11
+ size?: number;
12
+ /** Background pattern color */
13
+ color?: string;
14
+ /** Background line width (for lines pattern) */
15
+ lineWidth?: number;
16
+ /** Theme slot overrides */
17
+ ui?: FlowBackground["slots"];
18
+ }
19
+ declare const _default: typeof __VLS_export;
20
+ export default _default;
21
+ declare const __VLS_export: import("vue").DefineComponent<FlowBackgroundProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<FlowBackgroundProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
@@ -0,0 +1,29 @@
1
+ import type { AppConfig } from "@nuxt/schema";
2
+ import theme from "#build/ui-elements/flow-controls";
3
+ import type { ComponentConfig } from "../types/index.js";
4
+ import type { PanelPositionType, FitViewParams } from "@vue-flow/core";
5
+ type FlowControls = ComponentConfig<typeof theme, AppConfig, "flowControls">;
6
+ export interface FlowControlsProps {
7
+ /** Show zoom controls */
8
+ showZoom?: boolean;
9
+ /** Show fit-view button */
10
+ showFitView?: boolean;
11
+ /** Show interactive toggle */
12
+ showInteractive?: boolean;
13
+ /** Fit view params */
14
+ fitViewParams?: FitViewParams;
15
+ /** Panel position */
16
+ position?: PanelPositionType;
17
+ /** Theme slot overrides */
18
+ ui?: FlowControls["slots"];
19
+ }
20
+ declare const _default: typeof __VLS_export;
21
+ export default _default;
22
+ declare const __VLS_export: __VLS_WithSlots<import("vue").DefineComponent<FlowControlsProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<FlowControlsProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>, {
23
+ default?: (props: {}) => any;
24
+ }>;
25
+ type __VLS_WithSlots<T, S> = T & {
26
+ new (): {
27
+ $slots: S;
28
+ };
29
+ };
@@ -0,0 +1,37 @@
1
+ <script>
2
+ import theme from "#build/ui-elements/flow-controls";
3
+ </script>
4
+
5
+ <script setup>
6
+ import { computed } from "vue";
7
+ import { Controls } from "@vue-flow/controls";
8
+ import { tv } from "../utils/tv";
9
+ const {
10
+ showZoom = true,
11
+ showFitView = true,
12
+ showInteractive = true,
13
+ fitViewParams,
14
+ position = "bottom-left",
15
+ ui: uiProps = {}
16
+ } = defineProps({
17
+ showZoom: { type: Boolean, required: false },
18
+ showFitView: { type: Boolean, required: false },
19
+ showInteractive: { type: Boolean, required: false },
20
+ fitViewParams: { type: Object, required: false },
21
+ position: { type: String, required: false },
22
+ ui: { type: Object, required: false }
23
+ });
24
+ const ui = computed(() => tv({ extend: tv(theme) })({}));
25
+ </script>
26
+
27
+ <template>
28
+ <Controls
29
+ :show-zoom="showZoom"
30
+ :show-fit-view="showFitView"
31
+ :show-interactive="showInteractive"
32
+ :fit-view-params="fitViewParams"
33
+ :position="position"
34
+ :class="ui.root({ class: uiProps?.root })">
35
+ <slot />
36
+ </Controls>
37
+ </template>
@@ -0,0 +1,29 @@
1
+ import type { AppConfig } from "@nuxt/schema";
2
+ import theme from "#build/ui-elements/flow-controls";
3
+ import type { ComponentConfig } from "../types/index.js";
4
+ import type { PanelPositionType, FitViewParams } from "@vue-flow/core";
5
+ type FlowControls = ComponentConfig<typeof theme, AppConfig, "flowControls">;
6
+ export interface FlowControlsProps {
7
+ /** Show zoom controls */
8
+ showZoom?: boolean;
9
+ /** Show fit-view button */
10
+ showFitView?: boolean;
11
+ /** Show interactive toggle */
12
+ showInteractive?: boolean;
13
+ /** Fit view params */
14
+ fitViewParams?: FitViewParams;
15
+ /** Panel position */
16
+ position?: PanelPositionType;
17
+ /** Theme slot overrides */
18
+ ui?: FlowControls["slots"];
19
+ }
20
+ declare const _default: typeof __VLS_export;
21
+ export default _default;
22
+ declare const __VLS_export: __VLS_WithSlots<import("vue").DefineComponent<FlowControlsProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<FlowControlsProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>, {
23
+ default?: (props: {}) => any;
24
+ }>;
25
+ type __VLS_WithSlots<T, S> = T & {
26
+ new (): {
27
+ $slots: S;
28
+ };
29
+ };
@@ -0,0 +1,22 @@
1
+ import type { AppConfig } from "@nuxt/schema";
2
+ import theme from "#build/ui-elements/flow-handle";
3
+ import type { ComponentConfig } from "../types/index.js";
4
+ import type { Position } from "@vue-flow/core";
5
+ type FlowHandle = ComponentConfig<typeof theme, AppConfig, "flowHandle">;
6
+ export interface FlowHandleProps {
7
+ /** Handle type: source or target */
8
+ type: "source" | "target";
9
+ /** Handle position */
10
+ position?: Position | "top" | "bottom" | "left" | "right";
11
+ /** Handle ID (for multiple handles per node) */
12
+ id?: string;
13
+ /** Theme color */
14
+ color?: FlowHandle["variants"]["color"];
15
+ /** Whether a connection is active on this handle */
16
+ connected?: boolean;
17
+ /** Theme slot overrides */
18
+ ui?: FlowHandle["slots"];
19
+ }
20
+ declare const _default: typeof __VLS_export;
21
+ export default _default;
22
+ declare const __VLS_export: import("vue").DefineComponent<FlowHandleProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<FlowHandleProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
@@ -0,0 +1,33 @@
1
+ <script>
2
+ import theme from "#build/ui-elements/flow-handle";
3
+ </script>
4
+
5
+ <script setup>
6
+ import { computed } from "vue";
7
+ import { Handle, Position as VFPosition } from "@vue-flow/core";
8
+ import { tv } from "../utils/tv";
9
+ const {
10
+ type,
11
+ position = VFPosition.Bottom,
12
+ color = "primary",
13
+ connected = false,
14
+ ui: uiProps = {}
15
+ } = defineProps({
16
+ type: { type: String, required: true },
17
+ position: { type: String, required: false },
18
+ id: { type: String, required: false },
19
+ color: { type: null, required: false },
20
+ connected: { type: Boolean, required: false },
21
+ ui: { type: Object, required: false }
22
+ });
23
+ const ui = computed(
24
+ () => tv({ extend: tv(theme) })({
25
+ color,
26
+ connected
27
+ })
28
+ );
29
+ </script>
30
+
31
+ <template>
32
+ <Handle :id="id" :type="type" :position="position" :class="ui.root({ class: uiProps?.root })" />
33
+ </template>
@@ -0,0 +1,22 @@
1
+ import type { AppConfig } from "@nuxt/schema";
2
+ import theme from "#build/ui-elements/flow-handle";
3
+ import type { ComponentConfig } from "../types/index.js";
4
+ import type { Position } from "@vue-flow/core";
5
+ type FlowHandle = ComponentConfig<typeof theme, AppConfig, "flowHandle">;
6
+ export interface FlowHandleProps {
7
+ /** Handle type: source or target */
8
+ type: "source" | "target";
9
+ /** Handle position */
10
+ position?: Position | "top" | "bottom" | "left" | "right";
11
+ /** Handle ID (for multiple handles per node) */
12
+ id?: string;
13
+ /** Theme color */
14
+ color?: FlowHandle["variants"]["color"];
15
+ /** Whether a connection is active on this handle */
16
+ connected?: boolean;
17
+ /** Theme slot overrides */
18
+ ui?: FlowHandle["slots"];
19
+ }
20
+ declare const _default: typeof __VLS_export;
21
+ export default _default;
22
+ declare const __VLS_export: import("vue").DefineComponent<FlowHandleProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<FlowHandleProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
@@ -0,0 +1,37 @@
1
+ import type { AppConfig } from "@nuxt/schema";
2
+ import theme from "#build/ui-elements/flow-mini-map";
3
+ import type { ComponentConfig } from "../types/index.js";
4
+ import type { PanelPositionType } from "@vue-flow/core";
5
+ type FlowMiniMap = ComponentConfig<typeof theme, AppConfig, "flowMiniMap">;
6
+ export interface FlowMiniMapProps {
7
+ /** Enable drag to pan viewport */
8
+ pannable?: boolean;
9
+ /** Enable zoom to zoom viewport */
10
+ zoomable?: boolean;
11
+ /** Panel position */
12
+ position?: PanelPositionType;
13
+ /** Node color */
14
+ nodeColor?: string;
15
+ /** Node stroke color */
16
+ nodeStrokeColor?: string;
17
+ /** Node border radius */
18
+ nodeBorderRadius?: number;
19
+ /** Mask color */
20
+ maskColor?: string;
21
+ /** Width */
22
+ width?: number;
23
+ /** Height */
24
+ height?: number;
25
+ /** Theme slot overrides */
26
+ ui?: FlowMiniMap["slots"];
27
+ }
28
+ declare const _default: typeof __VLS_export;
29
+ export default _default;
30
+ declare const __VLS_export: __VLS_WithSlots<import("vue").DefineComponent<FlowMiniMapProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<FlowMiniMapProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>, {
31
+ [x: string]: ((props: any) => any) | undefined;
32
+ }>;
33
+ type __VLS_WithSlots<T, S> = T & {
34
+ new (): {
35
+ $slots: S;
36
+ };
37
+ };
@@ -0,0 +1,51 @@
1
+ <script>
2
+ import theme from "#build/ui-elements/flow-mini-map";
3
+ </script>
4
+
5
+ <script setup>
6
+ import { computed } from "vue";
7
+ import { MiniMap } from "@vue-flow/minimap";
8
+ import { tv } from "../utils/tv";
9
+ const {
10
+ pannable = true,
11
+ zoomable = true,
12
+ position = "bottom-right",
13
+ nodeColor,
14
+ nodeStrokeColor,
15
+ nodeBorderRadius = 4,
16
+ maskColor,
17
+ width,
18
+ height,
19
+ ui: uiProps = {}
20
+ } = defineProps({
21
+ pannable: { type: Boolean, required: false },
22
+ zoomable: { type: Boolean, required: false },
23
+ position: { type: String, required: false },
24
+ nodeColor: { type: String, required: false },
25
+ nodeStrokeColor: { type: String, required: false },
26
+ nodeBorderRadius: { type: Number, required: false },
27
+ maskColor: { type: String, required: false },
28
+ width: { type: Number, required: false },
29
+ height: { type: Number, required: false },
30
+ ui: { type: Object, required: false }
31
+ });
32
+ const ui = computed(() => tv({ extend: tv(theme) })({}));
33
+ </script>
34
+
35
+ <template>
36
+ <MiniMap
37
+ :pannable="pannable"
38
+ :zoomable="zoomable"
39
+ :position="position"
40
+ :node-color="nodeColor"
41
+ :node-stroke-color="nodeStrokeColor"
42
+ :node-border-radius="nodeBorderRadius"
43
+ :mask-color="maskColor"
44
+ :width="width"
45
+ :height="height"
46
+ :class="ui.root({ class: uiProps?.root })">
47
+ <template v-for="(_, name) in $slots" #[name]="slotData">
48
+ <slot :name="name" v-bind="slotData ?? {}" />
49
+ </template>
50
+ </MiniMap>
51
+ </template>
@@ -0,0 +1,37 @@
1
+ import type { AppConfig } from "@nuxt/schema";
2
+ import theme from "#build/ui-elements/flow-mini-map";
3
+ import type { ComponentConfig } from "../types/index.js";
4
+ import type { PanelPositionType } from "@vue-flow/core";
5
+ type FlowMiniMap = ComponentConfig<typeof theme, AppConfig, "flowMiniMap">;
6
+ export interface FlowMiniMapProps {
7
+ /** Enable drag to pan viewport */
8
+ pannable?: boolean;
9
+ /** Enable zoom to zoom viewport */
10
+ zoomable?: boolean;
11
+ /** Panel position */
12
+ position?: PanelPositionType;
13
+ /** Node color */
14
+ nodeColor?: string;
15
+ /** Node stroke color */
16
+ nodeStrokeColor?: string;
17
+ /** Node border radius */
18
+ nodeBorderRadius?: number;
19
+ /** Mask color */
20
+ maskColor?: string;
21
+ /** Width */
22
+ width?: number;
23
+ /** Height */
24
+ height?: number;
25
+ /** Theme slot overrides */
26
+ ui?: FlowMiniMap["slots"];
27
+ }
28
+ declare const _default: typeof __VLS_export;
29
+ export default _default;
30
+ declare const __VLS_export: __VLS_WithSlots<import("vue").DefineComponent<FlowMiniMapProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<FlowMiniMapProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>, {
31
+ [x: string]: ((props: any) => any) | undefined;
32
+ }>;
33
+ type __VLS_WithSlots<T, S> = T & {
34
+ new (): {
35
+ $slots: S;
36
+ };
37
+ };
@@ -0,0 +1,26 @@
1
+ import type { AppConfig } from "@nuxt/schema";
2
+ import theme from "#build/ui-elements/flow-node";
3
+ import type { ComponentConfig } from "../types/index.js";
4
+ type FlowNode = ComponentConfig<typeof theme, AppConfig, "flowNode">;
5
+ export interface FlowNodeProps {
6
+ /** Label text */
7
+ label?: string;
8
+ /** Theme color */
9
+ color?: FlowNode["variants"]["color"];
10
+ /** Visual variant */
11
+ variant?: FlowNode["variants"]["variant"];
12
+ /** Whether the node is currently selected */
13
+ selected?: boolean;
14
+ /** Theme slot overrides */
15
+ ui?: FlowNode["slots"];
16
+ }
17
+ declare const _default: typeof __VLS_export;
18
+ export default _default;
19
+ declare const __VLS_export: __VLS_WithSlots<import("vue").DefineComponent<FlowNodeProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<FlowNodeProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>, {
20
+ default?: (props: {}) => any;
21
+ }>;
22
+ type __VLS_WithSlots<T, S> = T & {
23
+ new (): {
24
+ $slots: S;
25
+ };
26
+ };
@@ -0,0 +1,39 @@
1
+ <script>
2
+ import theme from "#build/ui-elements/flow-node";
3
+ </script>
4
+
5
+ <script setup>
6
+ import { computed } from "vue";
7
+ import { tv } from "../utils/tv";
8
+ const {
9
+ label,
10
+ color = "primary",
11
+ variant = "outline",
12
+ selected = false,
13
+ ui: uiProps = {}
14
+ } = defineProps({
15
+ label: { type: String, required: false },
16
+ color: { type: null, required: false },
17
+ variant: { type: null, required: false },
18
+ selected: { type: Boolean, required: false },
19
+ ui: { type: Object, required: false }
20
+ });
21
+ const ui = computed(
22
+ () => tv({ extend: tv(theme) })({
23
+ color,
24
+ variant,
25
+ selected
26
+ })
27
+ );
28
+ </script>
29
+
30
+ <template>
31
+ <div :class="ui.root({ class: uiProps?.root })">
32
+ <div v-if="label" :class="ui.label({ class: uiProps?.label })">
33
+ {{ label }}
34
+ </div>
35
+ <div v-if="$slots.default" :class="ui.content({ class: uiProps?.content })">
36
+ <slot />
37
+ </div>
38
+ </div>
39
+ </template>
@@ -0,0 +1,26 @@
1
+ import type { AppConfig } from "@nuxt/schema";
2
+ import theme from "#build/ui-elements/flow-node";
3
+ import type { ComponentConfig } from "../types/index.js";
4
+ type FlowNode = ComponentConfig<typeof theme, AppConfig, "flowNode">;
5
+ export interface FlowNodeProps {
6
+ /** Label text */
7
+ label?: string;
8
+ /** Theme color */
9
+ color?: FlowNode["variants"]["color"];
10
+ /** Visual variant */
11
+ variant?: FlowNode["variants"]["variant"];
12
+ /** Whether the node is currently selected */
13
+ selected?: boolean;
14
+ /** Theme slot overrides */
15
+ ui?: FlowNode["slots"];
16
+ }
17
+ declare const _default: typeof __VLS_export;
18
+ export default _default;
19
+ declare const __VLS_export: __VLS_WithSlots<import("vue").DefineComponent<FlowNodeProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<FlowNodeProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>, {
20
+ default?: (props: {}) => any;
21
+ }>;
22
+ type __VLS_WithSlots<T, S> = T & {
23
+ new (): {
24
+ $slots: S;
25
+ };
26
+ };
@@ -1,5 +1,11 @@
1
1
  export * from "../components/DialogConfirm.vue.js";
2
2
  export * from "../components/DialogAlert.vue.js";
3
3
  export * from "../components/ToggleGroup.vue.js";
4
+ export * from "../components/Flow.vue.js";
5
+ export * from "../components/FlowNode.vue.js";
6
+ export * from "../components/FlowHandle.vue.js";
7
+ export * from "../components/FlowBackground.vue.js";
8
+ export * from "../components/FlowControls.vue.js";
9
+ export * from "../components/FlowMiniMap.vue.js";
4
10
  export * from "./tv.js";
5
11
  export * from "./utils.js";
@@ -1,5 +1,11 @@
1
1
  export * from "../components/DialogConfirm.vue";
2
2
  export * from "../components/DialogAlert.vue";
3
3
  export * from "../components/ToggleGroup.vue";
4
+ export * from "../components/Flow.vue";
5
+ export * from "../components/FlowNode.vue";
6
+ export * from "../components/FlowHandle.vue";
7
+ export * from "../components/FlowBackground.vue";
8
+ export * from "../components/FlowControls.vue";
9
+ export * from "../components/FlowMiniMap.vue";
4
10
  export * from "./tv.js";
5
11
  export * from "./utils.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nuxt-ui-elements",
3
- "version": "0.1.40",
3
+ "version": "0.1.41",
4
4
  "description": "A collection of beautiful, animated UI components for Nuxt applications",
5
5
  "license": "MIT",
6
6
  "repository": "https://github.com/genu/nuxt-ui-elements.git",
@@ -51,8 +51,8 @@
51
51
  "tailwind-variants": "3.2.2"
52
52
  },
53
53
  "devDependencies": {
54
- "@nuxt/devtools": "3.2.1",
55
- "@nuxt/eslint-config": "1.15.1",
54
+ "@nuxt/devtools": "3.2.2",
55
+ "@nuxt/eslint-config": "1.15.2",
56
56
  "@nuxt/module-builder": "1.0.2",
57
57
  "@nuxt/schema": "4.3.1",
58
58
  "@nuxt/test-utils": "4.0.0",
@@ -60,19 +60,37 @@
60
60
  "@types/node": "latest",
61
61
  "@vitest/coverage-v8": "4.0.18",
62
62
  "better-sqlite3": "12.6.2",
63
- "eslint": "10.0.0",
63
+ "eslint": "10.0.2",
64
64
  "eslint-config-prettier": "10.1.8",
65
65
  "eslint-plugin-prettier": "5.5.5",
66
66
  "nuxt": "4.3.1",
67
67
  "prettier": "3.8.1",
68
68
  "typescript": "5.9.3",
69
69
  "vitest": "4.0.18",
70
- "vue-tsc": "3.2.4"
70
+ "vue-tsc": "3.2.5"
71
71
  },
72
72
  "peerDependencies": {
73
- "@nuxt/ui": "^4.0.0"
73
+ "@nuxt/ui": "^4.0.0",
74
+ "@vue-flow/core": "^1.48.0",
75
+ "@vue-flow/background": "^1.3.0",
76
+ "@vue-flow/controls": "^1.1.0",
77
+ "@vue-flow/minimap": "^1.5.0"
74
78
  },
75
- "packageManager": "pnpm@10.29.2+sha512.bef43fa759d91fd2da4b319a5a0d13ef7a45bb985a3d7342058470f9d2051a3ba8674e629672654686ef9443ad13a82da2beb9eeb3e0221c87b8154fff9d74b8",
79
+ "peerDependenciesMeta": {
80
+ "@vue-flow/core": {
81
+ "optional": true
82
+ },
83
+ "@vue-flow/background": {
84
+ "optional": true
85
+ },
86
+ "@vue-flow/controls": {
87
+ "optional": true
88
+ },
89
+ "@vue-flow/minimap": {
90
+ "optional": true
91
+ }
92
+ },
93
+ "packageManager": "pnpm@10.30.3+sha512.c961d1e0a2d8e354ecaa5166b822516668b7f44cb5bd95122d590dd81922f606f5473b6d23ec4a5be05e7fcd18e8488d47d978bbe981872f1145d06e9a740017",
76
94
  "pnpm": {
77
95
  "onlyBuiltDependencies": [
78
96
  "better-sqlite3"