Skip to content

Commit 90cf58d

Browse files
committed
1.12.0
1 parent a501ea0 commit 90cf58d

File tree

13 files changed

+4544
-2800
lines changed

13 files changed

+4544
-2800
lines changed

CHANGELOG.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,17 @@
11
[//]: # (Don't use <tags>)
22

3+
## v1.12.0
4+
5+
> `2025-08-07`
6+
7+
### 🎉 Feature
8+
- Performance optimization. You should experience better performance when adding and moving elements in large forms.
9+
- Added `pt_PT` (Portuguese) builder locale.
10+
- Replaced SCSS `@import` with `@use`
11+
12+
### 🐞 Bug Fixes
13+
- Moving from container directly to the step container threw an error.
14+
315
## v1.11.5
416

517
> `2025-08-01`

index.css

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1049,6 +1049,9 @@ a.vfb-learn-more,
10491049
.vfb-icon {
10501050
@apply inline-block text-inherit overflow-visible align-icon;
10511051
}
1052+
.vfb-icon path {
1053+
pointer-events: none;
1054+
}
10521055

10531056
.vfb-icon-md {
10541057
@apply h-1em;

index.mjs

Lines changed: 2 additions & 2 deletions
Large diffs are not rendered by default.

locales/en_US/index.mjs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1690,5 +1690,5 @@ export default {
16901690
"expression_func_display_value_p0_value": "value",
16911691
"expression_func_display_value_p0_description": "A reference to an element holding the value.",
16921692
"expression_func_display_value_p1_value": "'full_path'",
1693-
"expression_func_display_value_p1_description": "The <b>full path</b> (not data path) of the field between single quotes, eg. `DISPLAY_VALUE(container.select, 'container.select')`. Siblings path (eg. 'list.*.select') cannot be used.",
1693+
"expression_func_display_value_p1_description": "The <b>full path</b> (not data path) of the field between single quotes, eg. `DISPLAY_VALUE(container.select, 'container.select')`. Siblings path (eg. 'list.*.select') cannot be used."
16941694
};

locales/pt_PT/index.mjs

Lines changed: 1694 additions & 0 deletions
Large diffs are not rendered by default.

nuxt/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@vueform/builder-nuxt",
3-
"version": "1.24.0",
3+
"version": "1.25.0",
44
"description": "Nuxt module for Vueform Builder",
55
"repository": "vueform/builder-nuxt",
66
"license": "MIT",
@@ -36,7 +36,7 @@
3636
"dependencies": {
3737
"@nuxt/kit": "^3.8.0",
3838
"@vueform/vueform": "^1.13.0",
39-
"@vueform/builder": "^1.11.5"
39+
"@vueform/builder": "^1.12.0"
4040
},
4141
"devDependencies": {
4242
"@nuxt/devtools": "latest",

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"private": false,
33
"name": "@vueform/builder",
4-
"version": "1.11.5",
4+
"version": "1.12.0",
55
"description": "Vueform Builder development build.",
66
"homepage": "https://vueform.com",
77
"license": "SEE LICENSE IN LICENSE.txt",

plugin.mjs

Lines changed: 56 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -1095,42 +1095,13 @@ export default function () {
10951095
}
10961096
}
10971097
}),
1098-
() => ({
1099-
apply: ['FormElements'],
1100-
props: {
1101-
draggingElement: {
1102-
required: false,
1103-
type: [null, String, Boolean],
1104-
},
1105-
draggingPage: {
1106-
required: false,
1107-
type: [null, String, Boolean],
1108-
},
1109-
draggedSchema: {
1110-
required: false,
1111-
type: Object,
1112-
},
1113-
},
1114-
}),
11151098
() => ({
11161099
apply: ['FormTabs', 'FormSteps'],
11171100
emits: [
11181101
'rename-page', 'add-page', 'remove-pages', 'remove-page', 'move-page', 'move-to-page', 'add-element',
11191102
'select-page', 'start-moving',
11201103
],
11211104
props: {
1122-
draggingElement: {
1123-
required: false,
1124-
type: [null, String, Boolean],
1125-
},
1126-
draggingPage: {
1127-
required: false,
1128-
type: [null, String, Boolean],
1129-
},
1130-
draggedSchema: {
1131-
required: false,
1132-
type: Object,
1133-
},
11341105
moving: {
11351106
required: false,
11361107
type: [Boolean, Object],
@@ -1301,18 +1272,6 @@ export default function () {
13011272
type: Object,
13021273
required: false,
13031274
},
1304-
draggingElement: {
1305-
required: false,
1306-
type: [null, String, Boolean],
1307-
},
1308-
draggingPage: {
1309-
required: false,
1310-
type: [null, String, Boolean],
1311-
},
1312-
draggedSchema: {
1313-
required: false,
1314-
type: Object,
1315-
},
13161275
moving: {
13171276
required: false,
13181277
type: [Boolean, Object],
@@ -1333,7 +1292,8 @@ export default function () {
13331292
return component
13341293
}
13351294

1336-
const { name, draggingPage, moving, pointer } = toRefs(props)
1295+
const { form$ } = component
1296+
const { name, moving, pointer } = toRefs(props)
13371297

13381298
const subscribeOnce = inject('subscribeOnce')
13391299

@@ -1352,7 +1312,7 @@ export default function () {
13521312
// ============== COMPUTED ==============
13531313

13541314
const beingDragged = computed(() => {
1355-
return draggingPage.value === name.value
1315+
return form$.value.draggingPage === name.value
13561316
})
13571317

13581318
const selectedPage = computed(() => {
@@ -1578,7 +1538,9 @@ export default function () {
15781538
})
15791539
})
15801540

1581-
let to = component.form$.value.tabs$.current$.elements?.pop()
1541+
let to = component.form$.value.tabs$
1542+
? component.form$.value.tabs$.current$.elements?.pop()
1543+
: component.form$.value.steps$.current$.elements?.pop()
15821544

15831545
// First move out the element from the container
15841546
component.form$.value.el$(path).$emit('move-element', path, 'after', to)
@@ -1880,7 +1842,6 @@ export default function () {
18801842
let startingMousePosition = 0
18811843

18821844
const {
1883-
draggingElement,
18841845
widths,
18851846
cols,
18861847
rows,
@@ -2364,7 +2325,6 @@ export default function () {
23642325
}
23652326
}
23662327
}),
2367-
23682328
() => ({
23692329
apply: ['FormElements', 'Vueform', 'GroupElement', 'ObjectElement', 'ListElement', 'GridElement'],
23702330
emits: [
@@ -2453,18 +2413,6 @@ export default function () {
24532413
type: Boolean,
24542414
default: true,
24552415
},
2456-
draggingElement: {
2457-
required: false,
2458-
type: [null, String, Boolean],
2459-
},
2460-
draggingPage: {
2461-
required: false,
2462-
type: [null, String, Boolean],
2463-
},
2464-
draggedSchema: {
2465-
required: false,
2466-
type: Object,
2467-
},
24682416
moving: {
24692417
required: false,
24702418
type: [Boolean, Object],
@@ -2481,7 +2429,8 @@ export default function () {
24812429
return component
24822430
}
24832431

2484-
const { droppable, draggingElement, moving, pointer } = toRefs(props)
2432+
const { form$ } = component
2433+
const { droppable, moving, pointer } = toRefs(props)
24852434

24862435
// ================ DATA ================
24872436

@@ -2490,7 +2439,7 @@ export default function () {
24902439
// ============== COMPUTED ==============
24912440

24922441
const beingDragged = computed(() => {
2493-
return draggingElement.value === component.path.value
2442+
return form$.value.draggingElement === component.path.value
24942443
})
24952444

24962445
const Droppable = computed(() => {
@@ -2522,20 +2471,6 @@ export default function () {
25222471
emits: [
25232472
'add-element', 'select-element', 'clone-element', 'remove-element', 'resize-element', 'announce',
25242473
],
2525-
props: {
2526-
draggingElement: {
2527-
required: false,
2528-
type: [null, String, Boolean],
2529-
},
2530-
draggingPage: {
2531-
required: false,
2532-
type: [null, String, Boolean],
2533-
},
2534-
draggedSchema: {
2535-
required: false,
2536-
type: Object,
2537-
},
2538-
},
25392474
setup(props, context, component) {
25402475
if (!component.form$.value.builder) {
25412476
return component
@@ -2549,6 +2484,8 @@ export default function () {
25492484

25502485
const hovered = ref(false)
25512486
const focused = ref(false)
2487+
const beingDraggedOver = ref(false)
2488+
const DropArea = ref()
25522489

25532490
const startingWidth = ref(0)
25542491
const elementWidth = ref(null)
@@ -2672,19 +2609,19 @@ export default function () {
26722609
const canDragInside = computed(() => {
26732610
if (['object', 'group'].indexOf(component.el$.value.type) !== -1) {
26742611
return !Object.keys(component.el$.value.children).length &&
2675-
(!component.el$.value.draggedSchema || ['tabs', 'steps'].indexOf(component.el$.value.draggedSchema.type) === -1)
2612+
(!component.form$.value.draggedSchema || ['tabs', 'steps'].indexOf(component.form$.value.draggedSchema.type) === -1)
26762613
}
26772614

26782615
else if (['list'].indexOf(component.el$.value.type) !== -1) {
26792616
return !component.el$.value.hasPrototype &&
2680-
(!component.el$.value.draggedSchema || ['list', 'tabs', 'steps'].indexOf(component.el$.value.draggedSchema.type) === -1)
2617+
(!component.form$.value.draggedSchema || ['list', 'tabs', 'steps'].indexOf(component.form$.value.draggedSchema.type) === -1)
26812618
}
26822619

26832620
return false
26842621
})
26852622

26862623
const canDragSibling = computed(() => {
2687-
return (!component.el$.value.draggedSchema || ['tabs', 'steps'].indexOf(component.el$.value.draggedSchema.type) === -1)
2624+
return (!component.form$.value.draggedSchema || ['tabs', 'steps'].indexOf(component.form$.value.draggedSchema.type) === -1)
26882625
})
26892626

26902627
const hideColumns = computed(() => {
@@ -3202,6 +3139,41 @@ export default function () {
32023139
focused.value = false
32033140
}
32043141

3142+
const handleContainerDragenter = (e) => {
3143+
beingDraggedOver.value = true
3144+
}
3145+
3146+
const handleContainerDragleave = (e) => {
3147+
if (DropArea.value.contains(e.target)) return
3148+
3149+
beingDraggedOver.value = false
3150+
}
3151+
3152+
const handleContainerDrop = (e) => {
3153+
beingDraggedOver.value = false
3154+
}
3155+
3156+
const handleContainerMouseover = (e) => {
3157+
hovered.value = true
3158+
}
3159+
3160+
const handleContainerMouseout = (e) => {
3161+
if (e.relatedTarget?.closest('.vfb-preview-element-container')?.getAttribute('data-path') === DropArea.value?.getAttribute('data-path')) {
3162+
return
3163+
}
3164+
3165+
if ([
3166+
'vfb-icon',
3167+
'vfb-preview-element-resizer',
3168+
'vfb-preview-element-remove',
3169+
'vfb-preview-element-clone',
3170+
'vfb-preview-element-name-tag',
3171+
'vfb-preview-element-edit-cells',
3172+
].some(c => e.relatedTarget?.classList?.contains(c))) return
3173+
3174+
hovered.value = false
3175+
}
3176+
32053177
const decreaseColumns = (shiftKey) => {
32063178
let value = lastWidth.value - 1
32073179

@@ -3409,6 +3381,8 @@ export default function () {
34093381
highlighted,
34103382
hovered,
34113383
focused,
3384+
beingDraggedOver,
3385+
DropArea,
34123386
startingWidth,
34133387
elementWidth,
34143388
lastWidth,
@@ -3450,6 +3424,11 @@ export default function () {
34503424
handleResizeMultiDragMouseUp,
34513425
handleDrag,
34523426
handleEditCellsClick,
3427+
handleContainerDragenter,
3428+
handleContainerDragleave,
3429+
handleContainerDrop,
3430+
handleContainerMouseover,
3431+
handleContainerMouseout,
34533432
}
34543433
}
34553434
})

scss/_utils.scss

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,10 @@ a.vfb-learn-more,
4444

4545
.vfb-icon {
4646
@apply inline-block text-inherit overflow-visible align-icon;
47+
48+
path {
49+
pointer-events: none;
50+
}
4751
}
4852

4953
.vfb-icon-md {

scss/index.scss

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,33 @@
11
// Misc
2-
@import 'vars';
3-
@import 'code';
4-
@import 'global';
5-
@import 'tools';
6-
@import 'transitions';
7-
@import 'colorpicker';
8-
@import 'utils';
9-
@import 'animations';
10-
@import 'toaster';
11-
@import 'modal';
12-
@import 'expression';
13-
@import 'conditions';
14-
@import 'fields';
15-
@import 'grid';
2+
@use 'vars';
3+
@use 'code';
4+
@use 'global';
5+
@use 'tools';
6+
@use 'transitions';
7+
@use 'colorpicker';
8+
@use 'utils';
9+
@use 'animations';
10+
@use 'toaster';
11+
@use 'modal';
12+
@use 'expression';
13+
@use 'conditions';
14+
@use 'fields';
15+
@use 'grid';
1616

1717
// Panels
18-
@import 'config-panel';
19-
@import 'elements';
20-
@import 'tree';
21-
@import 'model-preview';
18+
@use 'config-panel';
19+
@use 'elements';
20+
@use 'tree';
21+
@use 'model-preview';
2222

2323
// Main
24-
@import 'export';
25-
@import 'panels';
26-
@import 'preview';
27-
@import 'breakpoints';
28-
@import 'builder';
24+
@use 'export';
25+
@use 'panels';
26+
@use 'preview';
27+
@use 'breakpoints';
28+
@use 'builder';
2929

3030
// Preview
31-
@import 'form-tabs';
32-
@import 'form-steps';
33-
@import 'preview-element';
31+
@use 'form-tabs';
32+
@use 'form-steps';
33+
@use 'preview-element';

0 commit comments

Comments
 (0)