pull/6674/head
Cagatay Civici 2024-10-28 14:12:17 +03:00
commit 3840fa3599
23 changed files with 389 additions and 37 deletions

View File

@ -8517,6 +8517,14 @@
"default": "", "default": "",
"description": "Used to pass attributes to the label's DOM element." "description": "Used to pass attributes to the label's DOM element."
}, },
{
"name": "clearIcon",
"optional": true,
"readonly": false,
"type": "CascadeSelectPassThroughOptionType",
"default": "",
"description": "Used to pass attributes to the label's DOM element."
},
{ {
"name": "dropdown", "name": "dropdown",
"optional": true, "optional": true,
@ -8950,6 +8958,22 @@
"default": "", "default": "",
"description": "A property to uniquely identify an option." "description": "A property to uniquely identify an option."
}, },
{
"name": "showClear",
"optional": true,
"readonly": false,
"type": "boolean",
"default": "false",
"description": "When enabled, a clear icon is displayed to clear the value."
},
{
"name": "clearIcon",
"optional": true,
"readonly": false,
"type": "string",
"default": "",
"description": "Icon to display in clear button."
},
{ {
"name": "inputId", "name": "inputId",
"optional": true, "optional": true,
@ -9298,6 +9322,19 @@
], ],
"returnType": "VNode<RendererNode, RendererElement, Object>[]", "returnType": "VNode<RendererNode, RendererElement, Object>[]",
"description": "Custom footer template." "description": "Custom footer template."
},
{
"name": "clearicon",
"parameters": [
{
"name": "scope",
"optional": false,
"type": "{\n \t <span class=\"ml-3 doc-option-parameter-name\">clearCallback</span>: <span class=\"doc-option-parameter-type\">(<span class=\"doc-option-parameter-name\">event</span>: Event) &rArr; void</span>, <span class=\"doc-option-parameter-type\">// Clear icon click function.</span>\n}",
"description": "clear icon slot's params."
}
],
"returnType": "VNode<RendererNode, RendererElement, Object>[]",
"description": "Custom clear icon template."
} }
] ]
}, },
@ -9545,6 +9582,13 @@
"value": "\"p-cascadeselect-loading-icon\"", "value": "\"p-cascadeselect-loading-icon\"",
"description": "Class name of the loading icon element" "description": "Class name of the loading icon element"
}, },
{
"name": "clearIcon",
"optional": false,
"readonly": false,
"value": "\"p-cascadeselect-clear-icon\"",
"description": "Class name of the dropdown icon element"
},
{ {
"name": "dropdownIcon", "name": "dropdownIcon",
"optional": false, "optional": false,
@ -42307,6 +42351,14 @@
"default": "", "default": "",
"description": "Used to pass attributes to the label's DOM element." "description": "Used to pass attributes to the label's DOM element."
}, },
{
"name": "clearIcon",
"optional": true,
"readonly": false,
"type": "MultiSelectPassThroughOptionType",
"default": "",
"description": "Used to pass attributes to the label's DOM element."
},
{ {
"name": "chipItem", "name": "chipItem",
"optional": true, "optional": true,
@ -42807,6 +42859,30 @@
"default": "", "default": "",
"description": "A property to uniquely identify an option." "description": "A property to uniquely identify an option."
}, },
{
"name": "showClear",
"optional": true,
"readonly": false,
"type": "boolean",
"default": "false",
"description": "When enabled, a clear icon is displayed to clear the value."
},
{
"name": "clearIcon",
"optional": true,
"readonly": false,
"type": "string",
"default": "",
"description": "Icon to display in clear button."
},
{
"name": "resetFilterOnClear",
"optional": true,
"readonly": false,
"type": "boolean",
"default": "false",
"description": "Clears the filter value when clicking on the clear icon."
},
{ {
"name": "filter", "name": "filter",
"optional": true, "optional": true,
@ -43314,6 +43390,19 @@
"returnType": "VNode<RendererNode, RendererElement, Object>[]", "returnType": "VNode<RendererNode, RendererElement, Object>[]",
"description": "Custom loading icon template." "description": "Custom loading icon template."
}, },
{
"name": "clearicon",
"parameters": [
{
"name": "scope",
"optional": false,
"type": "{\n \t <span class=\"ml-3 doc-option-parameter-name\">clearCallback</span>: <span class=\"doc-option-parameter-type\">(<span class=\"doc-option-parameter-name\">event</span>: Event) &rArr; void</span>, <span class=\"doc-option-parameter-type\">// Clear icon click function.</span>\n}",
"description": "clear icon slot's params."
}
],
"returnType": "VNode<RendererNode, RendererElement, Object>[]",
"description": "Custom clear icon template."
},
{ {
"name": "dropdownicon", "name": "dropdownicon",
"parameters": [ "parameters": [
@ -77210,6 +77299,14 @@
"default": "", "default": "",
"description": "Used to pass tokens of the option section" "description": "Used to pass tokens of the option section"
}, },
{
"name": "clearIcon",
"optional": true,
"readonly": false,
"type": "Object",
"default": "",
"description": "Used to pass tokens of the clear icon section"
},
{ {
"name": "colorScheme", "name": "colorScheme",
"optional": true, "optional": true,
@ -77677,6 +77774,15 @@
"type": "string", "type": "string",
"default": "", "default": "",
"description": "Icon size of option" "description": "Icon size of option"
},
{
"name": "clearIcon.color",
"token": "cascadeselect.clear.icon.color",
"optional": true,
"readonly": false,
"type": "string",
"default": "",
"description": "Color of clear icon"
} }
] ]
} }
@ -89066,6 +89172,14 @@
"default": "", "default": "",
"description": "Used to pass tokens of the option group section" "description": "Used to pass tokens of the option group section"
}, },
{
"name": "clearIcon",
"optional": true,
"readonly": false,
"type": "Object",
"default": "",
"description": "Used to pass tokens of the clear icon section"
},
{ {
"name": "chip", "name": "chip",
"optional": true, "optional": true,
@ -89561,6 +89675,15 @@
"default": "", "default": "",
"description": "Padding of option group" "description": "Padding of option group"
}, },
{
"name": "clearIcon.color",
"token": "multiselect.clear.icon.color",
"optional": true,
"readonly": false,
"type": "string",
"default": "",
"description": "Color of clear icon"
},
{ {
"name": "chip.borderRadius", "name": "chip.borderRadius",
"token": "multiselect.chip.border.radius", "token": "multiselect.chip.border.radius",

View File

@ -18,6 +18,14 @@ export default {
default: '960px' default: '960px'
}, },
dataKey: null, dataKey: null,
showClear: {
type: Boolean,
default: false
},
clearIcon: {
type: String,
default: undefined
},
inputId: { inputId: {
type: String, type: String,
default: null default: null

View File

@ -88,6 +88,10 @@ export interface CascadeSelectPassThroughOptions {
* Used to pass attributes to the label's DOM element. * Used to pass attributes to the label's DOM element.
*/ */
label?: CascadeSelectPassThroughOptionType; label?: CascadeSelectPassThroughOptionType;
/**
* Used to pass attributes to the label's DOM element.
*/
clearIcon?: CascadeSelectPassThroughOptionType;
/** /**
* Used to pass attributes to the dropdown button's DOM element. * Used to pass attributes to the dropdown button's DOM element.
*/ */
@ -327,6 +331,15 @@ export interface CascadeSelectProps {
* A property to uniquely identify an option. * A property to uniquely identify an option.
*/ */
dataKey?: string | undefined; dataKey?: string | undefined;
/**
* When enabled, a clear icon is displayed to clear the value.
* @defaultValue false
*/
showClear?: boolean | undefined;
/**
* Icon to display in clear button.
*/
clearIcon?: string | undefined;
/** /**
* Identifier of the underlying input element. * Identifier of the underlying input element.
*/ */
@ -553,6 +566,17 @@ export interface CascadeSelectSlots {
*/ */
options: any[]; options: any[];
}): VNode[]; }): VNode[];
/**
* Custom clear icon template.
* @param {Object} scope - clear icon slot's params.
*/
clearicon(scope: {
/**
* Clear icon click function.
* @param {Event} event - Browser event
*/
clearCallback: (event: Event) => void;
}): VNode[];
} }
/** /**

View File

@ -30,6 +30,9 @@
{{ label }} {{ label }}
</slot> </slot>
</span> </span>
<slot v-if="isClearIconVisible" name="clearicon" :class="cx('clearIcon')" :clearCallback="onClearClick">
<component :is="clearIcon ? 'i' : 'TimesIcon'" ref="clearIcon" :class="[cx('clearIcon'), clearIcon]" @click="onClearClick" v-bind="ptm('clearIcon')" data-pc-section="clearicon" />
</slot>
<div :class="cx('dropdown')" role="button" tabindex="-1" v-bind="ptm('dropdown')"> <div :class="cx('dropdown')" role="button" tabindex="-1" v-bind="ptm('dropdown')">
<slot v-if="loading" name="loadingicon" :class="cx('loadingIcon')"> <slot v-if="loading" name="loadingicon" :class="cx('loadingIcon')">
<span v-if="loadingIcon" :class="[cx('loadingIcon'), 'pi-spin', loadingIcon]" aria-hidden="true" v-bind="ptm('loadingIcon')" /> <span v-if="loadingIcon" :class="[cx('loadingIcon'), 'pi-spin', loadingIcon]" aria-hidden="true" v-bind="ptm('loadingIcon')" />
@ -101,6 +104,7 @@ import OverlayEventBus from 'primevue/overlayeventbus';
import Portal from 'primevue/portal'; import Portal from 'primevue/portal';
import BaseCascadeSelect from './BaseCascadeSelect.vue'; import BaseCascadeSelect from './BaseCascadeSelect.vue';
import CascadeSelectSub from './CascadeSelectSub.vue'; import CascadeSelectSub from './CascadeSelectSub.vue';
import TimesIcon from '@primevue/icons/times';
export default { export default {
name: 'CascadeSelect', name: 'CascadeSelect',
@ -383,7 +387,9 @@ export default {
return; return;
} }
if (!this.overlay || !this.overlay.contains(event.target)) { if (event.target.getAttribute('data-pc-section') === 'clearicon' || event.target.closest('[data-pc-section="clearicon"]')) {
return;
} else if (!this.overlay || !this.overlay.contains(event.target)) {
this.overlayVisible ? this.hide() : this.show(); this.overlayVisible ? this.hide() : this.show();
focus(this.$refs.focusInput); focus(this.$refs.focusInput);
} }
@ -391,6 +397,9 @@ export default {
this.clicked = true; this.clicked = true;
this.$emit('click', event); this.$emit('click', event);
}, },
onClearClick(event) {
this.updateModel(event, null);
},
onOverlayClick(event) { onOverlayClick(event) {
OverlayEventBus.emit('overlay-click', { OverlayEventBus.emit('overlay-click', {
originalEvent: event, originalEvent: event,
@ -841,14 +850,18 @@ export default {
}, },
focusedOptionId() { focusedOptionId() {
return this.focusedOptionInfo.index !== -1 ? `${this.id}${isNotEmpty(this.focusedOptionInfo.parentKey) ? '_' + this.focusedOptionInfo.parentKey : ''}_${this.focusedOptionInfo.index}` : null; return this.focusedOptionInfo.index !== -1 ? `${this.id}${isNotEmpty(this.focusedOptionInfo.parentKey) ? '_' + this.focusedOptionInfo.parentKey : ''}_${this.focusedOptionInfo.index}` : null;
},
isClearIconVisible() {
return this.showClear && this.d_value != null && isNotEmpty(this.options);
} }
}, },
components: { components: {
CascadeSelectSub: CascadeSelectSub, CascadeSelectSub,
Portal: Portal, Portal,
ChevronDownIcon: ChevronDownIcon, ChevronDownIcon,
SpinnerIcon: SpinnerIcon, SpinnerIcon,
AngleRightIcon: AngleRightIcon AngleRightIcon,
TimesIcon
} }
}; };
</script> </script>

View File

@ -26,6 +26,10 @@ export enum CascadeSelectClasses {
* Class name of the loading icon element * Class name of the loading icon element
*/ */
loadingIcon = 'p-cascadeselect-loading-icon', loadingIcon = 'p-cascadeselect-loading-icon',
/**
* Class name of the dropdown icon element
*/
clearIcon = 'p-cascadeselect-clear-icon',
/** /**
* Class name of the dropdown icon element * Class name of the dropdown icon element
*/ */

View File

@ -60,6 +60,14 @@ const theme = ({ dt }) => `
border-end-end-radius: ${dt('border.radius.md')}; border-end-end-radius: ${dt('border.radius.md')};
} }
.p-cascadeselect-clear-icon {
position: absolute;
top: 50%;
margin-top: -0.5rem;
color: ${dt('cascadeselect.clear.icon.color')};
inset-inline-end: ${dt('cascadeselect.dropdown.width')};
}
.p-cascadeselect-label { .p-cascadeselect-label {
display: block; display: block;
white-space: nowrap; white-space: nowrap;
@ -262,6 +270,7 @@ const classes = {
'p-cascadeselect-label-empty': !instance.$slots['value'] && (instance.label === 'p-emptylabel' || instance.label.length === 0) 'p-cascadeselect-label-empty': !instance.$slots['value'] && (instance.label === 'p-emptylabel' || instance.label.length === 0)
} }
], ],
clearIcon: 'p-cascadeselect-clear-icon',
dropdown: 'p-cascadeselect-dropdown', dropdown: 'p-cascadeselect-dropdown',
loadingIcon: 'p-cascadeselect-loading-icon', loadingIcon: 'p-cascadeselect-loading-icon',
dropdownIcon: 'p-cascadeselect-dropdown-icon', dropdownIcon: 'p-cascadeselect-dropdown-icon',

View File

@ -38,6 +38,18 @@ export default {
default: null default: null
}, },
dataKey: null, dataKey: null,
showClear: {
type: Boolean,
default: false
},
clearIcon: {
type: String,
default: undefined
},
resetFilterOnClear: {
type: Boolean,
default: false
},
filter: Boolean, filter: Boolean,
filterPlaceholder: String, filterPlaceholder: String,
filterLocale: String, filterLocale: String,

View File

@ -131,6 +131,10 @@ export interface MultiSelectPassThroughOptions {
* Used to pass attributes to the label's DOM element. * Used to pass attributes to the label's DOM element.
*/ */
label?: MultiSelectPassThroughOptionType; label?: MultiSelectPassThroughOptionType;
/**
* Used to pass attributes to the label's DOM element.
*/
clearIcon?: MultiSelectPassThroughOptionType;
/** /**
* Used to pass attributes to the chip's DOM element. * Used to pass attributes to the chip's DOM element.
*/ */
@ -407,6 +411,20 @@ export interface MultiSelectProps {
* A property to uniquely identify an option. * A property to uniquely identify an option.
*/ */
dataKey?: string | undefined; dataKey?: string | undefined;
/**
* When enabled, a clear icon is displayed to clear the value.
* @defaultValue false
*/
showClear?: boolean | undefined;
/**
* Icon to display in clear button.
*/
clearIcon?: string | undefined;
/**
* Clears the filter value when clicking on the clear icon.
* @defaultValue false
*/
resetFilterOnClear?: boolean;
/** /**
* When specified, displays a filter input at header. * When specified, displays a filter input at header.
* @defaultValue false * @defaultValue false
@ -803,6 +821,17 @@ export interface MultiSelectSlots {
*/ */
class: string; class: string;
}): VNode[]; }): VNode[];
/**
* Custom clear icon template.
* @param {Object} scope - clear icon slot's params.
*/
clearicon(scope: {
/**
* Clear icon click function.
* @param {Event} event - Browser event
*/
clearCallback: (event: Event) => void;
}): VNode[];
/** /**
* Custom dropdown icon template. * Custom dropdown icon template.
* @param {Object} scope - dropdownicon slot's params. * @param {Object} scope - dropdownicon slot's params.

View File

@ -50,6 +50,9 @@
</slot> </slot>
</div> </div>
</div> </div>
<slot v-if="isClearIconVisible" name="clearicon" :class="cx('clearIcon')" :clearCallback="onClearClick">
<component :is="clearIcon ? 'i' : 'TimesIcon'" ref="clearIcon" :class="[cx('clearIcon'), clearIcon]" @click="onClearClick" v-bind="ptm('clearIcon')" data-pc-section="clearicon" />
</slot>
<div :class="cx('dropdown')" v-bind="ptm('dropdown')"> <div :class="cx('dropdown')" v-bind="ptm('dropdown')">
<slot v-if="loading" name="loadingicon" :class="cx('loadingIcon')"> <slot v-if="loading" name="loadingicon" :class="cx('loadingIcon')">
<span v-if="loadingIcon" :class="[cx('loadingIcon'), 'pi-spin', loadingIcon]" aria-hidden="true" v-bind="ptm('loadingIcon')" /> <span v-if="loadingIcon" :class="[cx('loadingIcon'), 'pi-spin', loadingIcon]" aria-hidden="true" v-bind="ptm('loadingIcon')" />
@ -458,12 +461,18 @@ export default {
return; return;
} }
if (!this.overlay || !this.overlay.contains(event.target)) { if (event.target.tagName === 'INPUT' || event.target.getAttribute('data-pc-section') === 'clearicon' || event.target.closest('[data-pc-section="clearicon"]')) {
return;
} else if (!this.overlay || !this.overlay.contains(event.target)) {
this.overlayVisible ? this.hide(true) : this.show(true); this.overlayVisible ? this.hide(true) : this.show(true);
} }
this.clicked = true; this.clicked = true;
}, },
onClearClick(event) {
this.updateModel(event, null);
this.resetFilterOnClear && (this.filterValue = null);
},
onFirstHiddenFocus(event) { onFirstHiddenFocus(event) {
const focusableEl = event.relatedTarget === this.$refs.focusInput ? getFirstFocusableElement(this.overlay, ':not([data-p-hidden-focusable="true"])') : this.$refs.focusInput; const focusableEl = event.relatedTarget === this.$refs.focusInput ? getFirstFocusableElement(this.overlay, ':not([data-p-hidden-focusable="true"])') : this.$refs.focusInput;
@ -1121,6 +1130,9 @@ export default {
}, },
hasFluid() { hasFluid() {
return isEmpty(this.fluid) ? !!this.$pcFluid : this.fluid; return isEmpty(this.fluid) ? !!this.$pcFluid : this.fluid;
},
isClearIconVisible() {
return this.showClear && this.d_value != null && isNotEmpty(this.options);
} }
}, },
directives: { directives: {

View File

@ -60,6 +60,14 @@ const theme = ({ dt }) => `
border-end-end-radius: ${dt('multiselect.border.radius')}; border-end-end-radius: ${dt('multiselect.border.radius')};
} }
.p-multiselect-clear-icon {
position: absolute;
top: 50%;
margin-top: -0.5rem;
color: ${dt('multiselect.clear.icon.color')};
inset-inline-end: ${dt('multiselect.dropdown.width')};
}
.p-multiselect-label-container { .p-multiselect-label-container {
overflow: hidden; overflow: hidden;
flex: 1 1 auto; flex: 1 1 auto;
@ -253,6 +261,7 @@ const classes = {
'p-multiselect-label-empty': !props.placeholder && (!props.modelValue || props.modelValue.length === 0) 'p-multiselect-label-empty': !props.placeholder && (!props.modelValue || props.modelValue.length === 0)
} }
], ],
clearIcon: 'p-multiselect-clear-icon',
chipItem: 'p-multiselect-chip-item', chipItem: 'p-multiselect-chip-item',
pcChip: 'p-multiselect-chip', pcChip: 'p-multiselect-chip',
chipIcon: 'p-multiselect-chip-icon', chipIcon: 'p-multiselect-chip-icon',

View File

@ -40,8 +40,8 @@
</template> </template>
<script> <script>
import { addClass, getHeight, removeClass } from '@primeuix/utils/dom';
import { UniqueComponentId } from '@primevue/core/utils'; import { UniqueComponentId } from '@primevue/core/utils';
import { getHeight, addClass, removeClass } from '@primeuix/utils/dom';
import BaseScrollPanel from './BaseScrollPanel.vue'; import BaseScrollPanel from './BaseScrollPanel.vue';
export default { export default {
@ -61,12 +61,14 @@ export default {
lastPageY: null, lastPageY: null,
timer: null, timer: null,
outsideClickListener: null, outsideClickListener: null,
mutationObserver: null,
data() { data() {
return { return {
id: this.$attrs.id, id: this.$attrs.id,
orientation: 'vertical', orientation: 'vertical',
lastScrollTop: 0, lastScrollTop: 0,
lastScrollLeft: 0 lastScrollLeft: 0,
isRTL: false
}; };
}, },
watch: { watch: {
@ -80,6 +82,9 @@ export default {
if (this.$el.offsetParent) { if (this.$el.offsetParent) {
this.initialize(); this.initialize();
} }
this.updateDirection();
this.observeDirectionChanges();
}, },
updated() { updated() {
if (!this.initialized && this.$el.offsetParent) { if (!this.initialized && this.$el.offsetParent) {
@ -92,8 +97,25 @@ export default {
if (this.frame) { if (this.frame) {
window.cancelAnimationFrame(this.frame); window.cancelAnimationFrame(this.frame);
} }
if (this.mutationObserver) {
this.mutationObserver.disconnect();
}
}, },
methods: { methods: {
updateDirection() {
this.isRTL = !!this.$el.closest('[dir="rtl"]');
},
observeDirectionChanges() {
const targetNode = document.documentElement;
const config = { attributes: true, attributeFilter: ['dir'] };
this.mutationObserver = new MutationObserver(() => {
this.updateDirection();
});
this.mutationObserver.observe(targetNode, config);
},
initialize() { initialize() {
this.moveBar(); this.moveBar();
this.bindDocumentResizeListener(); this.bindDocumentResizeListener();
@ -137,7 +159,12 @@ export default {
} else { } else {
this.$refs.xBar.setAttribute('data-p-scrollpanel-hidden', 'false'); this.$refs.xBar.setAttribute('data-p-scrollpanel-hidden', 'false');
!this.isUnstyled && removeClass(this.$refs.xBar, 'p-scrollpanel-hidden'); !this.isUnstyled && removeClass(this.$refs.xBar, 'p-scrollpanel-hidden');
this.$refs.xBar.style.cssText = 'width:' + Math.max(this.scrollXRatio * 100, 10) + '%; left:' + (this.$refs.content.scrollLeft / totalWidth) * 100 + '%;bottom:' + bottom + 'px;';
if (this.isRTL) {
this.$refs.xBar.style.cssText = 'width:' + Math.max(this.scrollXRatio * 100, 10) + '%; right:' + (this.$refs.content.scrollLeft / totalWidth) * 100 + '%;bottom:' + bottom + 'px;';
} else {
this.$refs.xBar.style.cssText = 'width:' + Math.max(this.scrollXRatio * 100, 10) + '%; left:' + (this.$refs.content.scrollLeft / totalWidth) * 100 + '%;bottom:' + bottom + 'px;';
}
} }
} }
@ -148,8 +175,14 @@ export default {
} else { } else {
this.$refs.yBar.setAttribute('data-p-scrollpanel-hidden', 'false'); this.$refs.yBar.setAttribute('data-p-scrollpanel-hidden', 'false');
!this.isUnstyled && removeClass(this.$refs.yBar, 'p-scrollpanel-hidden'); !this.isUnstyled && removeClass(this.$refs.yBar, 'p-scrollpanel-hidden');
this.$refs.yBar.style.cssText =
'height:' + Math.max(this.scrollYRatio * 100, 10) + '%; top: calc(' + (this.$refs.content.scrollTop / totalHeight) * 100 + '% - ' + this.$refs.xBar.clientHeight + 'px);right:' + right + 'px;'; if (this.isRTL) {
this.$refs.yBar.style.cssText =
'height:' + Math.max(this.scrollYRatio * 100, 10) + '%; top: calc(' + (this.$refs.content.scrollTop / totalHeight) * 100 + '% - ' + this.$refs.xBar.clientHeight + 'px);left:' + right + 'px;';
} else {
this.$refs.yBar.style.cssText =
'height:' + Math.max(this.scrollYRatio * 100, 10) + '%; top: calc(' + (this.$refs.content.scrollTop / totalHeight) * 100 + '% - ' + this.$refs.xBar.clientHeight + 'px);right:' + right + 'px;';
}
} }
} }
}); });

View File

@ -31,7 +31,6 @@ const theme = ({ dt }) => `
cursor: pointer; cursor: pointer;
opacity: 0; opacity: 0;
outline-color: transparent; outline-color: transparent;
transition: outline-color ${dt('scrollpanel.transition.duration')};
background: ${dt('scrollpanel.bar.background')}; background: ${dt('scrollpanel.bar.background')};
border: 0 none; border: 0 none;
transition: outline-color ${dt('scrollpanel.transition.duration')}, opacity ${dt('scrollpanel.transition.duration')}; transition: outline-color ${dt('scrollpanel.transition.duration')}, opacity ${dt('scrollpanel.transition.duration')};
@ -45,12 +44,12 @@ const theme = ({ dt }) => `
.p-scrollpanel-bar-y { .p-scrollpanel-bar-y {
width: ${dt('scrollpanel.bar.size')}; width: ${dt('scrollpanel.bar.size')};
top: 0; inset-block-start: 0;
} }
.p-scrollpanel-bar-x { .p-scrollpanel-bar-x {
height: ${dt('scrollpanel.bar.size')}; height: ${dt('scrollpanel.bar.size')};
bottom: 0; inset-block-end: 0;
} }
.p-scrollpanel-hidden { .p-scrollpanel-hidden {

View File

@ -47,19 +47,40 @@ export default {
panelSizes: null, panelSizes: null,
prevPanelIndex: null, prevPanelIndex: null,
timer: null, timer: null,
mutationObserver: null,
data() { data() {
return { return {
prevSize: null prevSize: null,
isRTL: false
}; };
}, },
mounted() { mounted() {
this.initializePanels(); this.initializePanels();
this.updateDirection();
this.observeDirectionChanges();
}, },
beforeUnmount() { beforeUnmount() {
this.clear(); this.clear();
this.unbindMouseListeners(); this.unbindMouseListeners();
if (this.mutationObserver) {
this.mutationObserver.disconnect();
}
}, },
methods: { methods: {
updateDirection() {
this.isRTL = !!this.$el.closest('[dir="rtl"]');
},
observeDirectionChanges() {
const targetNode = document.documentElement;
const config = { attributes: true, attributeFilter: ['dir'] };
this.mutationObserver = new MutationObserver(() => {
this.updateDirection();
});
this.mutationObserver.observe(targetNode, config);
},
isSplitterPanel(child) { isSplitterPanel(child) {
return child.type.name === 'SplitterPanel'; return child.type.name === 'SplitterPanel';
}, },
@ -125,8 +146,15 @@ export default {
newNextPanelSize = (100 * (this.nextPanelSize + step)) / this.size; newNextPanelSize = (100 * (this.nextPanelSize + step)) / this.size;
} }
} else { } else {
if (this.horizontal) newPos = (event.pageX * 100) / this.size - (this.startPos * 100) / this.size; if (this.horizontal) {
else newPos = (event.pageY * 100) / this.size - (this.startPos * 100) / this.size; if (this.isRTL) {
newPos = ((this.startPos - event.pageX) * 100) / this.size;
} else {
newPos = ((event.pageX - this.startPos) * 100) / this.size;
}
} else {
newPos = ((event.pageY - this.startPos) * 100) / this.size;
}
newPrevPanelSize = this.prevPanelSize + newPos; newPrevPanelSize = this.prevPanelSize + newPos;
newNextPanelSize = this.nextPanelSize - newPos; newNextPanelSize = this.nextPanelSize - newPos;

View File

@ -170,6 +170,10 @@ const theme = ({ dt }) => `
left: calc(-1 * ${dt('stepper.separator.size')}); left: calc(-1 * ${dt('stepper.separator.size')});
} }
.p-stepitem .p-stepper-separator:dir(rtl) {
left: calc(-9 * ${dt('stepper.separator.size')});
}
.p-stepitem:has(~ .p-stepitem-active) .p-stepper-separator { .p-stepitem:has(~ .p-stepitem-active) .p-stepper-separator {
background: ${dt('stepper.separator.active.background')}; background: ${dt('stepper.separator.active.background')};
} }

View File

@ -66,5 +66,8 @@ export default {
focusColor: '{list.option.icon.focus.color}', focusColor: '{list.option.icon.focus.color}',
size: '0.875rem' size: '0.875rem'
} }
},
clearIcon: {
color: '{form.field.icon.color}'
} }
}; };

View File

@ -71,6 +71,9 @@ export default {
fontWeight: '{list.option.group.font.weight}', fontWeight: '{list.option.group.font.weight}',
padding: '{list.option.group.padding}' padding: '{list.option.group.padding}'
}, },
clearIcon: {
color: '{form.field.icon.color}'
},
chip: { chip: {
borderRadius: '{border.radius.sm}' borderRadius: '{border.radius.sm}'
}, },

View File

@ -67,6 +67,9 @@ export default {
size: '0.875rem' size: '0.875rem'
} }
}, },
clearIcon: {
color: '{form.field.icon.color}'
},
css: ({ dt }) => ` css: ({ dt }) => `
.p-cascadeselect.p-variant-filled { .p-cascadeselect.p-variant-filled {
border-bottom-left-radius: 0; border-bottom-left-radius: 0;

View File

@ -74,6 +74,9 @@ export default {
chip: { chip: {
borderRadius: '{border.radius.sm}' borderRadius: '{border.radius.sm}'
}, },
clearIcon: {
color: '{form.field.icon.color}'
},
emptyMessage: { emptyMessage: {
padding: '{list.option.padding}' padding: '{list.option.padding}'
}, },

View File

@ -66,5 +66,8 @@ export default {
focusColor: '{list.option.icon.focus.color}', focusColor: '{list.option.icon.focus.color}',
size: '0.875rem' size: '0.875rem'
} }
},
clearIcon: {
color: '{form.field.icon.color}'
} }
}; };

View File

@ -71,6 +71,9 @@ export default {
fontWeight: '{list.option.group.font.weight}', fontWeight: '{list.option.group.font.weight}',
padding: '{list.option.group.padding}' padding: '{list.option.group.padding}'
}, },
clearIcon: {
color: '{form.field.icon.color}'
},
chip: { chip: {
borderRadius: '{border.radius.xs}' borderRadius: '{border.radius.xs}'
}, },

View File

@ -356,4 +356,15 @@ export interface CascadeSelectDesignTokens extends ColorSchemeDesignToken<Cascad
size?: string; size?: string;
}; };
}; };
/**
* Used to pass tokens of the clear icon section
*/
clearIcon?: {
/**
* Color of clear icon
*
* @designToken cascadeselect.clear.icon.color
*/
color?: string;
};
} }

View File

@ -373,6 +373,17 @@ export interface MultiSelectDesignTokens extends ColorSchemeDesignToken<MultiSel
*/ */
padding?: string; padding?: string;
}; };
/**
* Used to pass tokens of the clear icon section
*/
clearIcon?: {
/**
* Color of clear icon
*
* @designToken multiselect.clear.icon.color
*/
color?: string;
};
/** /**
* Used to pass tokens of the chip section * Used to pass tokens of the chip section
*/ */

View File

@ -52,7 +52,7 @@ importers:
version: 4.2.1(eslint-config-prettier@8.10.0(eslint@8.57.1))(eslint@8.57.1)(prettier@2.7.1) version: 4.2.1(eslint-config-prettier@8.10.0(eslint@8.57.1))(eslint@8.57.1)(prettier@2.7.1)
eslint-plugin-vue: eslint-plugin-vue:
specifier: ^9.4.0 specifier: ^9.4.0
version: 9.29.1(eslint@8.57.1) version: 9.30.0(eslint@8.57.1)
pnpm: pnpm:
specifier: ^9.6.0 specifier: ^9.6.0
version: 9.12.3 version: 9.12.3
@ -234,7 +234,7 @@ importers:
devDependencies: devDependencies:
'@nuxt/devtools': '@nuxt/devtools':
specifier: ^0.8.5 specifier: ^0.8.5
version: 0.8.5(nuxt@3.3.2(@types/node@18.19.59)(encoding@0.1.13)(eslint@8.57.1)(ioredis@5.4.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.24.2)(terser@5.36.0)(typescript@5.6.3))(rollup@4.24.2) version: 0.8.5(nuxt@3.3.2(@types/node@18.19.59)(encoding@0.1.13)(eslint@8.57.1)(ioredis@5.4.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.24.2)(terser@5.36.0)(typescript@5.6.3))(rollup@4.24.2)(vite@5.4.10(@types/node@18.19.59)(terser@5.36.0))
'@nuxt/eslint-config': '@nuxt/eslint-config':
specifier: ^0.2.0 specifier: ^0.2.0
version: 0.2.0(eslint@8.57.1) version: 0.2.0(eslint@8.57.1)
@ -246,7 +246,7 @@ importers:
version: 3.13.2(rollup@4.24.2) version: 3.13.2(rollup@4.24.2)
'@nuxt/test-utils': '@nuxt/test-utils':
specifier: ^3.7.3 specifier: ^3.7.3
version: 3.14.4(@vue/test-utils@2.4.6)(h3@1.13.0)(magicast@0.3.5)(nitropack@2.9.7(encoding@0.1.13)(magicast@0.3.5))(rollup@4.24.2)(vitest@1.6.0(@types/node@18.19.59)(terser@5.36.0))(vue-router@4.4.5(vue@3.5.12(typescript@5.6.3)))(vue@3.5.12(typescript@5.6.3)) version: 3.14.4(@vue/test-utils@2.4.6)(h3@1.13.0)(magicast@0.3.5)(nitropack@2.9.7(encoding@0.1.13)(magicast@0.3.5))(rollup@4.24.2)(vite@5.4.10(@types/node@18.19.59)(terser@5.36.0))(vitest@1.6.0(@types/node@18.19.59)(terser@5.36.0))(vue-router@4.4.5(vue@3.5.12(typescript@5.6.3)))(vue@3.5.12(typescript@5.6.3))
'@primevue/themes': '@primevue/themes':
specifier: workspace:* specifier: workspace:*
version: link:../themes version: link:../themes
@ -3580,8 +3580,8 @@ packages:
eslint-config-prettier: eslint-config-prettier:
optional: true optional: true
eslint-plugin-vue@9.29.1: eslint-plugin-vue@9.30.0:
resolution: {integrity: sha512-MH/MbVae4HV/tM8gKAVWMPJbYgW04CK7SuzYRrlNERpxbO0P3+Zdsa2oAcFBW6xNu7W6lIkGOsFAMCRTYmrlWQ==} resolution: {integrity: sha512-CyqlRgShvljFkOeYK8wN5frh/OGTvkj1S7wlr2Q2pUvwq+X5VYiLd6ZjujpgSgLnys2W8qrBLkXQ41SUYaoPIQ==}
engines: {node: ^14.17.0 || >=16.0.0} engines: {node: ^14.17.0 || >=16.0.0}
peerDependencies: peerDependencies:
eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0
@ -8315,12 +8315,13 @@ snapshots:
'@nuxt/devalue@2.0.2': {} '@nuxt/devalue@2.0.2': {}
'@nuxt/devtools-kit@0.8.5(magicast@0.3.5)(nuxt@3.3.2(@types/node@18.19.59)(encoding@0.1.13)(eslint@8.57.1)(ioredis@5.4.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.24.2)(terser@5.36.0)(typescript@5.6.3))(rollup@4.24.2)': '@nuxt/devtools-kit@0.8.5(magicast@0.3.5)(nuxt@3.3.2(@types/node@18.19.59)(encoding@0.1.13)(eslint@8.57.1)(ioredis@5.4.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.24.2)(terser@5.36.0)(typescript@5.6.3))(rollup@4.24.2)(vite@5.4.10(@types/node@18.19.59)(terser@5.36.0))':
dependencies: dependencies:
'@nuxt/kit': 3.13.2(magicast@0.3.5)(rollup@4.24.2) '@nuxt/kit': 3.13.2(magicast@0.3.5)(rollup@4.24.2)
'@nuxt/schema': 3.13.2(rollup@4.24.2) '@nuxt/schema': 3.13.2(rollup@4.24.2)
execa: 7.2.0 execa: 7.2.0
nuxt: 3.3.2(@types/node@18.19.59)(encoding@0.1.13)(eslint@8.57.1)(ioredis@5.4.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.24.2)(terser@5.36.0)(typescript@5.6.3) nuxt: 3.3.2(@types/node@18.19.59)(encoding@0.1.13)(eslint@8.57.1)(ioredis@5.4.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.24.2)(terser@5.36.0)(typescript@5.6.3)
vite: 5.4.10(@types/node@18.19.59)(terser@5.36.0)
transitivePeerDependencies: transitivePeerDependencies:
- magicast - magicast
- rollup - rollup
@ -8340,10 +8341,10 @@ snapshots:
rc9: 2.1.2 rc9: 2.1.2
semver: 7.6.3 semver: 7.6.3
'@nuxt/devtools@0.8.5(nuxt@3.3.2(@types/node@18.19.59)(encoding@0.1.13)(eslint@8.57.1)(ioredis@5.4.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.24.2)(terser@5.36.0)(typescript@5.6.3))(rollup@4.24.2)': '@nuxt/devtools@0.8.5(nuxt@3.3.2(@types/node@18.19.59)(encoding@0.1.13)(eslint@8.57.1)(ioredis@5.4.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.24.2)(terser@5.36.0)(typescript@5.6.3))(rollup@4.24.2)(vite@5.4.10(@types/node@18.19.59)(terser@5.36.0))':
dependencies: dependencies:
'@antfu/utils': 0.7.10 '@antfu/utils': 0.7.10
'@nuxt/devtools-kit': 0.8.5(magicast@0.3.5)(nuxt@3.3.2(@types/node@18.19.59)(encoding@0.1.13)(eslint@8.57.1)(ioredis@5.4.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.24.2)(terser@5.36.0)(typescript@5.6.3))(rollup@4.24.2) '@nuxt/devtools-kit': 0.8.5(magicast@0.3.5)(nuxt@3.3.2(@types/node@18.19.59)(encoding@0.1.13)(eslint@8.57.1)(ioredis@5.4.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.24.2)(terser@5.36.0)(typescript@5.6.3))(rollup@4.24.2)(vite@5.4.10(@types/node@18.19.59)(terser@5.36.0))
'@nuxt/devtools-wizard': 0.8.5 '@nuxt/devtools-wizard': 0.8.5
'@nuxt/kit': 3.13.2(magicast@0.3.5)(rollup@4.24.2) '@nuxt/kit': 3.13.2(magicast@0.3.5)(rollup@4.24.2)
birpc: 0.2.19 birpc: 0.2.19
@ -8374,8 +8375,9 @@ snapshots:
simple-git: 3.27.0 simple-git: 3.27.0
sirv: 2.0.4 sirv: 2.0.4
unimport: 3.13.1(rollup@4.24.2) unimport: 3.13.1(rollup@4.24.2)
vite-plugin-inspect: 0.7.42(@nuxt/kit@3.13.2(magicast@0.3.5)(rollup@4.24.2))(rollup@4.24.2) vite: 5.4.10(@types/node@18.19.59)(terser@5.36.0)
vite-plugin-vue-inspector: 3.7.2 vite-plugin-inspect: 0.7.42(@nuxt/kit@3.13.2(magicast@0.3.5)(rollup@4.24.2))(rollup@4.24.2)(vite@5.4.10(@types/node@18.19.59)(terser@5.36.0))
vite-plugin-vue-inspector: 3.7.2(vite@5.4.10(@types/node@18.19.59)(terser@5.36.0))
wait-on: 7.2.0 wait-on: 7.2.0
which: 3.0.1 which: 3.0.1
ws: 8.18.0 ws: 8.18.0
@ -8394,7 +8396,7 @@ snapshots:
'@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3) '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3)
'@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.6.3) '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.6.3)
eslint: 8.57.1 eslint: 8.57.1
eslint-plugin-vue: 9.29.1(eslint@8.57.1) eslint-plugin-vue: 9.30.0(eslint@8.57.1)
typescript: 5.6.3 typescript: 5.6.3
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@ -8685,7 +8687,7 @@ snapshots:
- supports-color - supports-color
- webpack-sources - webpack-sources
'@nuxt/test-utils@3.14.4(@vue/test-utils@2.4.6)(h3@1.13.0)(magicast@0.3.5)(nitropack@2.9.7(encoding@0.1.13)(magicast@0.3.5))(rollup@4.24.2)(vitest@1.6.0(@types/node@18.19.59)(terser@5.36.0))(vue-router@4.4.5(vue@3.5.12(typescript@5.6.3)))(vue@3.5.12(typescript@5.6.3))': '@nuxt/test-utils@3.14.4(@vue/test-utils@2.4.6)(h3@1.13.0)(magicast@0.3.5)(nitropack@2.9.7(encoding@0.1.13)(magicast@0.3.5))(rollup@4.24.2)(vite@5.4.10(@types/node@18.19.59)(terser@5.36.0))(vitest@1.6.0(@types/node@18.19.59)(terser@5.36.0))(vue-router@4.4.5(vue@3.5.12(typescript@5.6.3)))(vue@3.5.12(typescript@5.6.3))':
dependencies: dependencies:
'@nuxt/kit': 3.13.2(magicast@0.3.5)(rollup@4.24.2) '@nuxt/kit': 3.13.2(magicast@0.3.5)(rollup@4.24.2)
'@nuxt/schema': 3.13.2(rollup@4.24.2) '@nuxt/schema': 3.13.2(rollup@4.24.2)
@ -8711,7 +8713,8 @@ snapshots:
ufo: 1.5.4 ufo: 1.5.4
unenv: 1.10.0 unenv: 1.10.0
unplugin: 1.14.1(webpack-sources@3.2.3) unplugin: 1.14.1(webpack-sources@3.2.3)
vitest-environment-nuxt: 1.0.1(@vue/test-utils@2.4.6)(h3@1.13.0)(magicast@0.3.5)(nitropack@2.9.7(encoding@0.1.13)(magicast@0.3.5))(rollup@4.24.2)(vitest@1.6.0(@types/node@18.19.59)(terser@5.36.0))(vue-router@4.4.5(vue@3.5.12(typescript@5.6.3)))(vue@3.5.12(typescript@5.6.3)) vite: 5.4.10(@types/node@18.19.59)(terser@5.36.0)
vitest-environment-nuxt: 1.0.1(@vue/test-utils@2.4.6)(h3@1.13.0)(magicast@0.3.5)(nitropack@2.9.7(encoding@0.1.13)(magicast@0.3.5))(rollup@4.24.2)(vite@5.4.10(@types/node@18.19.59)(terser@5.36.0))(vitest@1.6.0(@types/node@18.19.59)(terser@5.36.0))(vue-router@4.4.5(vue@3.5.12(typescript@5.6.3)))(vue@3.5.12(typescript@5.6.3))
vue: 3.5.12(typescript@5.6.3) vue: 3.5.12(typescript@5.6.3)
vue-router: 4.4.5(vue@3.5.12(typescript@5.6.3)) vue-router: 4.4.5(vue@3.5.12(typescript@5.6.3))
optionalDependencies: optionalDependencies:
@ -10764,7 +10767,7 @@ snapshots:
eslint-plugin-nuxt@4.0.0(eslint@8.57.1): eslint-plugin-nuxt@4.0.0(eslint@8.57.1):
dependencies: dependencies:
eslint-plugin-vue: 9.29.1(eslint@8.57.1) eslint-plugin-vue: 9.30.0(eslint@8.57.1)
semver: 7.6.3 semver: 7.6.3
vue-eslint-parser: 9.4.3(eslint@8.57.1) vue-eslint-parser: 9.4.3(eslint@8.57.1)
transitivePeerDependencies: transitivePeerDependencies:
@ -10779,7 +10782,7 @@ snapshots:
optionalDependencies: optionalDependencies:
eslint-config-prettier: 8.10.0(eslint@8.57.1) eslint-config-prettier: 8.10.0(eslint@8.57.1)
eslint-plugin-vue@9.29.1(eslint@8.57.1): eslint-plugin-vue@9.30.0(eslint@8.57.1):
dependencies: dependencies:
'@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1)
eslint: 8.57.1 eslint: 8.57.1
@ -14231,7 +14234,7 @@ snapshots:
optionator: 0.9.4 optionator: 0.9.4
typescript: 5.6.3 typescript: 5.6.3
vite-plugin-inspect@0.7.42(@nuxt/kit@3.13.2(magicast@0.3.5)(rollup@4.24.2))(rollup@4.24.2): vite-plugin-inspect@0.7.42(@nuxt/kit@3.13.2(magicast@0.3.5)(rollup@4.24.2))(rollup@4.24.2)(vite@5.4.10(@types/node@18.19.59)(terser@5.36.0)):
dependencies: dependencies:
'@antfu/utils': 0.7.10 '@antfu/utils': 0.7.10
'@rollup/pluginutils': 5.1.3(rollup@4.24.2) '@rollup/pluginutils': 5.1.3(rollup@4.24.2)
@ -14241,13 +14244,14 @@ snapshots:
open: 9.1.0 open: 9.1.0
picocolors: 1.1.1 picocolors: 1.1.1
sirv: 2.0.4 sirv: 2.0.4
vite: 5.4.10(@types/node@18.19.59)(terser@5.36.0)
optionalDependencies: optionalDependencies:
'@nuxt/kit': 3.13.2(magicast@0.3.5)(rollup@4.24.2) '@nuxt/kit': 3.13.2(magicast@0.3.5)(rollup@4.24.2)
transitivePeerDependencies: transitivePeerDependencies:
- rollup - rollup
- supports-color - supports-color
vite-plugin-vue-inspector@3.7.2: vite-plugin-vue-inspector@3.7.2(vite@5.4.10(@types/node@18.19.59)(terser@5.36.0)):
dependencies: dependencies:
'@babel/core': 7.26.0 '@babel/core': 7.26.0
'@babel/plugin-proposal-decorators': 7.25.9(@babel/core@7.26.0) '@babel/plugin-proposal-decorators': 7.25.9(@babel/core@7.26.0)
@ -14258,6 +14262,7 @@ snapshots:
'@vue/compiler-dom': 3.5.12 '@vue/compiler-dom': 3.5.12
kolorist: 1.8.0 kolorist: 1.8.0
magic-string: 0.30.12 magic-string: 0.30.12
vite: 5.4.10(@types/node@18.19.59)(terser@5.36.0)
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@ -14294,9 +14299,9 @@ snapshots:
fsevents: 2.3.3 fsevents: 2.3.3
terser: 5.36.0 terser: 5.36.0
vitest-environment-nuxt@1.0.1(@vue/test-utils@2.4.6)(h3@1.13.0)(magicast@0.3.5)(nitropack@2.9.7(encoding@0.1.13)(magicast@0.3.5))(rollup@4.24.2)(vitest@1.6.0(@types/node@18.19.59)(terser@5.36.0))(vue-router@4.4.5(vue@3.5.12(typescript@5.6.3)))(vue@3.5.12(typescript@5.6.3)): vitest-environment-nuxt@1.0.1(@vue/test-utils@2.4.6)(h3@1.13.0)(magicast@0.3.5)(nitropack@2.9.7(encoding@0.1.13)(magicast@0.3.5))(rollup@4.24.2)(vite@5.4.10(@types/node@18.19.59)(terser@5.36.0))(vitest@1.6.0(@types/node@18.19.59)(terser@5.36.0))(vue-router@4.4.5(vue@3.5.12(typescript@5.6.3)))(vue@3.5.12(typescript@5.6.3)):
dependencies: dependencies:
'@nuxt/test-utils': 3.14.4(@vue/test-utils@2.4.6)(h3@1.13.0)(magicast@0.3.5)(nitropack@2.9.7(encoding@0.1.13)(magicast@0.3.5))(rollup@4.24.2)(vitest@1.6.0(@types/node@18.19.59)(terser@5.36.0))(vue-router@4.4.5(vue@3.5.12(typescript@5.6.3)))(vue@3.5.12(typescript@5.6.3)) '@nuxt/test-utils': 3.14.4(@vue/test-utils@2.4.6)(h3@1.13.0)(magicast@0.3.5)(nitropack@2.9.7(encoding@0.1.13)(magicast@0.3.5))(rollup@4.24.2)(vite@5.4.10(@types/node@18.19.59)(terser@5.36.0))(vitest@1.6.0(@types/node@18.19.59)(terser@5.36.0))(vue-router@4.4.5(vue@3.5.12(typescript@5.6.3)))(vue@3.5.12(typescript@5.6.3))
transitivePeerDependencies: transitivePeerDependencies:
- '@cucumber/cucumber' - '@cucumber/cucumber'
- '@jest/globals' - '@jest/globals'