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 +220 -0
- package/dist/module.json +1 -1
- package/dist/module.mjs +244 -0
- package/dist/runtime/components/Flow.d.vue.ts +65 -0
- package/dist/runtime/components/Flow.vue +71 -0
- package/dist/runtime/components/Flow.vue.d.ts +65 -0
- package/dist/runtime/components/FlowBackground.d.vue.ts +21 -0
- package/dist/runtime/components/FlowBackground.vue +39 -0
- package/dist/runtime/components/FlowBackground.vue.d.ts +21 -0
- package/dist/runtime/components/FlowControls.d.vue.ts +29 -0
- package/dist/runtime/components/FlowControls.vue +37 -0
- package/dist/runtime/components/FlowControls.vue.d.ts +29 -0
- package/dist/runtime/components/FlowHandle.d.vue.ts +22 -0
- package/dist/runtime/components/FlowHandle.vue +33 -0
- package/dist/runtime/components/FlowHandle.vue.d.ts +22 -0
- package/dist/runtime/components/FlowMiniMap.d.vue.ts +37 -0
- package/dist/runtime/components/FlowMiniMap.vue +51 -0
- package/dist/runtime/components/FlowMiniMap.vue.d.ts +37 -0
- package/dist/runtime/components/FlowNode.d.vue.ts +26 -0
- package/dist/runtime/components/FlowNode.vue +39 -0
- package/dist/runtime/components/FlowNode.vue.d.ts +26 -0
- package/dist/runtime/types/index.d.ts +6 -0
- package/dist/runtime/types/index.js +6 -0
- package/package.json +25 -7
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
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.
|
|
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.
|
|
55
|
-
"@nuxt/eslint-config": "1.15.
|
|
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.
|
|
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.
|
|
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
|
-
"
|
|
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"
|