From a194622437e9baa0e9202a349fbc97dee95885cf Mon Sep 17 00:00:00 2001 From: WebDevNerdStuff Date: Thu, 2 May 2024 19:55:33 -0700 Subject: [PATCH 001/122] fix(VDataTable): change mobile default to false (#19744) Co-authored-by: John Leider --- packages/api-generator/src/locale/en/display.json | 4 ++-- .../src/components/VNavigationDrawer/VNavigationDrawer.tsx | 2 +- packages/vuetify/src/composables/display.ts | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/api-generator/src/locale/en/display.json b/packages/api-generator/src/locale/en/display.json index 1fea0af1766..22b1639681f 100644 --- a/packages/api-generator/src/locale/en/display.json +++ b/packages/api-generator/src/locale/en/display.json @@ -1,6 +1,6 @@ { "props": { - "mobile": "Explicitly designate as a mobile display configuration.", - "mobileBreakpoint": "Overrides the display configuration default." + "mobile": "Determines the display mode of the component. If true, the component will be displayed in mobile mode. If false, the component will be displayed in desktop mode. If null, will be based on the current mobile-breakpoint", + "mobileBreakpoint": "Overrides the display configuration default screen size that the component should be considered in mobile." } } diff --git a/packages/vuetify/src/components/VNavigationDrawer/VNavigationDrawer.tsx b/packages/vuetify/src/components/VNavigationDrawer/VNavigationDrawer.tsx index 55fb512e9bb..ef077b7c8da 100644 --- a/packages/vuetify/src/components/VNavigationDrawer/VNavigationDrawer.tsx +++ b/packages/vuetify/src/components/VNavigationDrawer/VNavigationDrawer.tsx @@ -87,7 +87,7 @@ export const makeVNavigationDrawerProps = propsFactory({ ...makeBorderProps(), ...makeComponentProps(), ...makeDelayProps(), - ...makeDisplayProps(), + ...makeDisplayProps({ mobile: null }), ...makeElevationProps(), ...makeLayoutItemProps(), ...makeRoundedProps(), diff --git a/packages/vuetify/src/composables/display.ts b/packages/vuetify/src/composables/display.ts index eee63db72b6..98e1416ea27 100644 --- a/packages/vuetify/src/composables/display.ts +++ b/packages/vuetify/src/composables/display.ts @@ -216,8 +216,8 @@ export function createDisplay (options?: DisplayOptions, ssr?: SSROptions): Disp export const makeDisplayProps = propsFactory({ mobile: { - type: Boolean, - default: null, + type: Boolean as PropType, + default: false, }, mobileBreakpoint: [Number, String] as PropType, }, 'display') From 6b06e37d8a7e60fd5ac238986d466e29cb51a111 Mon Sep 17 00:00:00 2001 From: Matthew Ary <157217+MatthewAry@users.noreply.github.com> Date: Sat, 4 May 2024 09:05:42 -0700 Subject: [PATCH 002/122] docs(team.json): add new team member (#19750) --- packages/docs/src/data/team.json | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/packages/docs/src/data/team.json b/packages/docs/src/data/team.json index 3a1279181ca..86a2ff2a029 100644 --- a/packages/docs/src/data/team.json +++ b/packages/docs/src/data/team.json @@ -182,6 +182,22 @@ "twitter": "kieuminhcanh", "joined": "April 2024" }, + "MatthewAry": { + "discord": "bitshift_", + "focus": [ + "[vuetifyjs/*](https://github.com/vuetifyjs)" + ], + "languages": [ + "English" + ], + "location": "Spokane, WA, USA", + "name": "Matthew Ary", + "twitter": "MatthewAry", + "linkedin": "matthewary", + "work": "Director of Product Development at Symplsoft Inc.", + "team": "core", + "joined": "May 2024" + }, "jacekkarczmarczyk": { "discord": "jacek#3542", "languages": [ From daa96e98f1a6d84c14a3c610e654faed47160c62 Mon Sep 17 00:00:00 2001 From: John Leider Date: Sun, 5 May 2024 17:28:44 -0500 Subject: [PATCH 003/122] fix(VToolbar/VAppBar): nav-icon and title alignment supposed to line up with default v-list-item spacing --- packages/vuetify/src/components/VToolbar/_variables.scss | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/vuetify/src/components/VToolbar/_variables.scss b/packages/vuetify/src/components/VToolbar/_variables.scss index 333b257f9d2..e1dfb43a657 100644 --- a/packages/vuetify/src/components/VToolbar/_variables.scss +++ b/packages/vuetify/src/components/VToolbar/_variables.scss @@ -17,13 +17,13 @@ $toolbar-collapsed-max-width: 112px !default; $toolbar-elevation: 0 !default; $toolbar-flat-elevation: 0 !default; $toolbar-flex: none !default; -$toolbar-prepend-btn-margin-start: 10px !default; -$toolbar-append-btn-margin-end: 10px !default; +$toolbar-prepend-btn-margin-start: 4px !default; +$toolbar-append-btn-margin-end: 4px !default; $toolbar-rounded-border-radius: variables.$border-radius-root !default; $toolbar-transition: .2s variables.$standard-easing !default; // VToolbarTitle -$toolbar-title-margin: 16px !default; +$toolbar-title-margin: 20px !default; $toolbar-title-font-size: 1.25rem !default; $toolbar-title-font-weight: 400 !default; $toolbar-title-letter-spacing: 0 !default; From 43529fa936cbb0d58d78e1c48aebc1e6c7fe3d1e Mon Sep 17 00:00:00 2001 From: John Leider Date: Sun, 5 May 2024 19:17:43 -0500 Subject: [PATCH 004/122] fix(colors): apply theme-on-surface override for bg text color --- packages/vuetify/src/styles/generic/_colors.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/vuetify/src/styles/generic/_colors.scss b/packages/vuetify/src/styles/generic/_colors.scss index ce4d091c42a..487ebe6ddd5 100644 --- a/packages/vuetify/src/styles/generic/_colors.scss +++ b/packages/vuetify/src/styles/generic/_colors.scss @@ -13,6 +13,7 @@ @mixin background-text-color($color_name, $color_type) { $map_value: map-deep-get(colors.$text-on-colors, $color_name, $color_type); + --v-theme-on-surface: #{$map_value} !important; color: $map_value !important; } From 67b30e70435f7bcbb7abb64d2a5b9c4dc191355d Mon Sep 17 00:00:00 2001 From: Kael Date: Mon, 6 May 2024 20:39:51 +1000 Subject: [PATCH 005/122] fix(VTabs): inherit attrs and scope id fixes #19752 fixes #19754 --- packages/vuetify/src/components/VTabs/VTabs.tsx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/vuetify/src/components/VTabs/VTabs.tsx b/packages/vuetify/src/components/VTabs/VTabs.tsx index df42d23bb31..31ddf16dc35 100644 --- a/packages/vuetify/src/components/VTabs/VTabs.tsx +++ b/packages/vuetify/src/components/VTabs/VTabs.tsx @@ -12,6 +12,7 @@ import { useBackgroundColor } from '@/composables/color' import { provideDefaults } from '@/composables/defaults' import { makeDensityProps, useDensity } from '@/composables/density' import { useProxiedModel } from '@/composables/proxiedModel' +import { useScopeId } from '@/composables/scopeId' import { makeTagProps } from '@/composables/tag' // Utilities @@ -86,11 +87,12 @@ export const VTabs = genericComponent()({ 'update:modelValue': (v: unknown) => true, }, - setup (props, { slots }) { + setup (props, { attrs, slots }) { const model = useProxiedModel(props, 'modelValue') const items = computed(() => parseItems(props.items)) const { densityClasses } = useDensity(props) const { backgroundColorClasses, backgroundColorStyles } = useBackgroundColor(toRef(props, 'bgColor')) + const { scopeId } = useScopeId() provideDefaults({ VTab: { @@ -132,6 +134,8 @@ export const VTabs = genericComponent()({ ]} role="tablist" symbol={ VTabsSymbol } + { ...scopeId } + { ...attrs } > { slots.default?.() ?? items.value.map(item => ( slots.tab?.({ item }) ?? ( @@ -151,6 +155,7 @@ export const VTabs = genericComponent()({ { items.value.map(item => slots.item?.({ item }) ?? ( Date: Tue, 7 May 2024 01:58:09 +1000 Subject: [PATCH 006/122] fix(VNumberInput): use VTextField as the base component (#19714) fixes #19659 fixes #19757 --- .../src/labs/VNumberInput/VNumberInput.tsx | 184 +++++++----------- 1 file changed, 72 insertions(+), 112 deletions(-) diff --git a/packages/vuetify/src/labs/VNumberInput/VNumberInput.tsx b/packages/vuetify/src/labs/VNumberInput/VNumberInput.tsx index ea9b8cced49..3fa97c4cf7a 100644 --- a/packages/vuetify/src/labs/VNumberInput/VNumberInput.tsx +++ b/packages/vuetify/src/labs/VNumberInput/VNumberInput.tsx @@ -5,27 +5,24 @@ import './VNumberInput.sass' import { VBtn } from '../../components/VBtn' import { VDefaultsProvider } from '../../components/VDefaultsProvider' import { VDivider } from '../../components/VDivider' -import { filterFieldProps, makeVFieldProps, VField } from '@/components/VField/VField' -import { makeVInputProps, VInput } from '@/components/VInput/VInput' +import { makeVTextFieldProps, VTextField } from '@/components/VTextField/VTextField' // Composables -import { makeFocusProps, useFocus } from '@/composables/focus' import { useProxiedModel } from '@/composables/proxiedModel' // Utilities -import { computed, ref, watchEffect } from 'vue' -import { clamp, filterInputAttrs, genericComponent, getDecimals, only, propsFactory, useRender } from '@/util' +import { computed, watchEffect } from 'vue' +import { clamp, genericComponent, getDecimals, omit, propsFactory, useRender } from '@/util' // Types import type { PropType } from 'vue' -import type { VFieldSlots } from '@/components/VField/VField' -import type { VInputSlots } from '@/components/VInput/VInput' +import type { VTextFieldSlots } from '@/components/VTextField/VTextField' type ControlSlot = { click: () => void } -type VNumberInputSlots = Omit & { +type VNumberInputSlots = Omit & { increment: ControlSlot decrement: ControlSlot } @@ -52,31 +49,7 @@ const makeVNumberInputProps = propsFactory({ default: 1, }, - ...only(makeVInputProps(), [ - 'density', - 'disabled', - 'focused', - 'hideDetails', - 'hint', - 'label', - 'persistentHint', - 'readonly', - ]), - ...only(makeVFieldProps(), [ - 'baseColor', - 'bgColor', - 'class', - 'color', - 'disabled', - 'error', - 'loading', - 'reverse', - 'rounded', - 'style', - 'theme', - 'variant', - ]), - ...makeFocusProps(), + ...omit(makeVTextFieldProps(), ['appendInnerIcon', 'prependInnerIcon']), }, 'VNumberInput') export const VNumberInput = genericComponent()({ @@ -86,11 +59,6 @@ export const VNumberInput = genericComponent()({ props: { ...makeVNumberInputProps(), - - modelValue: { - type: Number, - default: undefined, - }, }, emits: { @@ -99,8 +67,6 @@ export const VNumberInput = genericComponent()({ setup (props, { attrs, emit, slots }) { const model = useProxiedModel(props, 'modelValue') - const { isFocused, focus, blur } = useFocus(props) - const inputRef = ref() const stepDecimals = computed(() => getDecimals(props.step)) const modelDecimals = computed(() => model.value != null ? getDecimals(model.value) : 0) @@ -120,10 +86,6 @@ export const VNumberInput = genericComponent()({ } }) - function onFocus () { - if (!isFocused.value) focus() - } - const controlVariant = computed(() => { return props.hideInput ? 'stacked' : props.controlVariant }) @@ -156,7 +118,7 @@ export const VNumberInput = genericComponent()({ function onKeydown (e: KeyboardEvent) { if ( - ['Enter', 'ArrowLeft', 'ArrowRight', 'Backspace'].includes(e.key) || + ['Enter', 'ArrowLeft', 'ArrowRight', 'Backspace', 'Tab'].includes(e.key) || e.ctrlKey ) return @@ -177,15 +139,12 @@ export const VNumberInput = genericComponent()({ } } - function onInput (e: Event) { - const el = e.target as HTMLInputElement - model.value = el.value ? +(el.value) : undefined + function onModelUpdate (v: string) { + model.value = v ? +(v) : undefined } useRender(() => { - const fieldProps = filterFieldProps(props) - const [rootAttrs, inputAttrs] = filterInputAttrs(attrs) - const { modelValue: _, ...inputProps } = VInput.filterProps(props) + const { modelValue: _, ...textFieldProps } = VTextField.filterProps(props) function controlNode () { const defaultHeight = controlVariant.value === 'stacked' ? 'auto' : '100%' @@ -201,6 +160,7 @@ export const VNumberInput = genericComponent()({ name="decrement-btn" icon="$expand" size="small" + tabindex="-1" onClick={ onClickDown } /> ) : ( @@ -236,6 +196,7 @@ export const VNumberInput = genericComponent()({ icon="$collapse" onClick={ onClickUp } size="small" + tabindex="-1" /> ) : ( ()({ return !props.hideInput && !props.inset ? : undefined } + const appendInnerControl = + controlVariant.value === 'split' + ? ( +
+ + + +
+ ) : (!props.reverse + ? <>{ dividerNode() }{ controlNode() } + : undefined) + + const hasAppendInner = slots['append-inner'] || appendInnerControl + + const prependInnerControl = + controlVariant.value === 'split' + ? ( +
+ + + +
+ ) : (props.reverse + ? <>{ controlNode() }{ dividerNode() } + : undefined) + + const hasPrependInner = slots['prepend-inner'] || prependInnerControl + return ( - ()({ }, props.class, ]} - { ...rootAttrs } - { ...inputProps } - focused={ isFocused.value } + { ...textFieldProps } style={ props.style } > {{ ...slots, - default: () => ( - - {{ - ...slots, - default: ({ - props: { class: fieldClass, ...slotProps }, - }) => ( - - ), - 'append-inner': controlVariant.value === 'split' ? () => ( -
- - - -
- ) : (!props.reverse - ? () => <>{ dividerNode() }{ controlNode() } - : undefined), - 'prepend-inner': controlVariant.value === 'split' ? () => ( -
- - - -
- ) : (props.reverse - ? () => <>{ controlNode() }{ dividerNode() } - : undefined), - }} -
- ), + 'append-inner': hasAppendInner ? (...args) => ( + <> + { slots['append-inner']?.(...args) } + { appendInnerControl } + + ) : undefined, + 'prepend-inner': hasPrependInner ? (...args) => ( + <> + { prependInnerControl } + { slots['prepend-inner']?.(...args) } + + ) : undefined, }} -
+ ) }) }, From fce7f758cfa26dac23e79fafa5c6fc5b67294e5d Mon Sep 17 00:00:00 2001 From: John Leider Date: Mon, 6 May 2024 11:51:17 -0500 Subject: [PATCH 007/122] fix(VFileInput): correctly set single value to null when cleared --- packages/vuetify/src/components/VFileInput/VFileInput.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/vuetify/src/components/VFileInput/VFileInput.tsx b/packages/vuetify/src/components/VFileInput/VFileInput.tsx index 6e613ab7a0d..b074aa85f75 100644 --- a/packages/vuetify/src/components/VFileInput/VFileInput.tsx +++ b/packages/vuetify/src/components/VFileInput/VFileInput.tsx @@ -67,7 +67,7 @@ export const makeVFileInputProps = propsFactory({ ...makeVInputProps({ prependIcon: '$file' }), modelValue: { - type: [Array, Object] as PropType, + type: [Array, Object] as PropType, default: (props: any) => props.multiple ? [] : null, validator: (val: any) => { return wrapInArray(val).every(v => v != null && typeof v === 'object') @@ -98,7 +98,7 @@ export const VFileInput = genericComponent()({ 'modelValue', props.modelValue, val => wrapInArray(val), - val => (props.multiple || Array.isArray(props.modelValue)) ? val : val[0], + val => (props.multiple || Array.isArray(props.modelValue)) ? val : (val[0] ?? null), ) const { isFocused, focus, blur } = useFocus(props) const base = computed(() => typeof props.showSize !== 'boolean' ? props.showSize : undefined) From 330baa073d4cc93a996f5e9ca039a8721cef8691 Mon Sep 17 00:00:00 2001 From: Zhaolin Liang Date: Tue, 7 May 2024 03:42:31 +0800 Subject: [PATCH 008/122] fix(VTreeview): lines prop supports boolean type (#19668) fixes #19638 --- packages/vuetify/src/components/VList/VListItem.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vuetify/src/components/VList/VListItem.tsx b/packages/vuetify/src/components/VList/VListItem.tsx index a273e4fa568..d059c55f130 100644 --- a/packages/vuetify/src/components/VList/VListItem.tsx +++ b/packages/vuetify/src/components/VList/VListItem.tsx @@ -69,7 +69,7 @@ export const makeVListItemProps = propsFactory({ appendIcon: IconValue, baseColor: String, disabled: Boolean, - lines: String as PropType<'one' | 'two' | 'three'>, + lines: [Boolean, String] as PropType<'one' | 'two' | 'three' | false>, link: { type: Boolean, default: undefined, From d02e1b3cec7b98a29eb69f42249f15ace6da25f3 Mon Sep 17 00:00:00 2001 From: NassBin Date: Tue, 7 May 2024 02:20:46 +0200 Subject: [PATCH 009/122] fix(VAutocomplete): only clear search on blur in multiple or using chips/selection shots (#19701) resolves #19543 Co-authored-by: Yuchao Wu --- packages/vuetify/src/components/VAutocomplete/VAutocomplete.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vuetify/src/components/VAutocomplete/VAutocomplete.tsx b/packages/vuetify/src/components/VAutocomplete/VAutocomplete.tsx index 81d862e4185..8e2cc9ac41c 100644 --- a/packages/vuetify/src/components/VAutocomplete/VAutocomplete.tsx +++ b/packages/vuetify/src/components/VAutocomplete/VAutocomplete.tsx @@ -377,7 +377,7 @@ export const VAutocomplete = genericComponent Date: Tue, 7 May 2024 16:29:04 +1000 Subject: [PATCH 010/122] chore: revert unrelated type changes partially reverts 75ed37b6eeda4434c73bd2089e2fa528ce6323d6 --- packages/vuetify/src/components/VOverlay/VOverlay.tsx | 7 ++----- packages/vuetify/src/components/VSnackbar/VSnackbar.tsx | 2 +- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/packages/vuetify/src/components/VOverlay/VOverlay.tsx b/packages/vuetify/src/components/VOverlay/VOverlay.tsx index 1f8f910efcf..c683fffa6b2 100644 --- a/packages/vuetify/src/components/VOverlay/VOverlay.tsx +++ b/packages/vuetify/src/components/VOverlay/VOverlay.tsx @@ -93,10 +93,7 @@ export const makeVOverlayProps = propsFactory({ disabled: Boolean, opacity: [Number, String], noClickAnimation: Boolean, - modelValue: { - type: Boolean as PropType, - default: null, - }, + modelValue: Boolean, persistent: Boolean, scrim: { type: [Boolean, String], @@ -140,7 +137,7 @@ export const VOverlay = genericComponent()({ setup (props, { slots, attrs, emit }) { const model = useProxiedModel(props, 'modelValue') const isActive = computed({ - get: () => Boolean(model.value), + get: () => model.value, set: v => { if (!(v && props.disabled)) model.value = v }, diff --git a/packages/vuetify/src/components/VSnackbar/VSnackbar.tsx b/packages/vuetify/src/components/VSnackbar/VSnackbar.tsx index 74e72b5dc35..600414a1777 100644 --- a/packages/vuetify/src/components/VSnackbar/VSnackbar.tsx +++ b/packages/vuetify/src/components/VSnackbar/VSnackbar.tsx @@ -30,7 +30,7 @@ import type { Ref } from 'vue' type VSnackbarSlots = { activator: { isActive: boolean, props: Record } default: never - actions: { isActive: Ref } + actions: { isActive: Ref } text: never } From 1a8db40219d859631d63c5efb4e6c589296f6d97 Mon Sep 17 00:00:00 2001 From: Kael Date: Tue, 7 May 2024 16:36:24 +1000 Subject: [PATCH 011/122] chore: update vue to 3.4.27 --- package.json | 4 +- packages/api-generator/package.json | 2 +- packages/docs/package.json | 4 +- packages/vuetify/package.json | 2 +- .../components/VSlideGroup/VSlideGroup.tsx | 2 +- packages/vuetify/src/globals.d.ts | 10 -- yarn.lock | 126 +++++++++++++----- 7 files changed, 101 insertions(+), 49 deletions(-) diff --git a/package.json b/package.json index 986155b7f7d..df2ba25274d 100755 --- a/package.json +++ b/package.json @@ -43,7 +43,7 @@ "@typescript-eslint/eslint-plugin": "^6.21.0", "@typescript-eslint/parser": "^6.21.0", "@unhead/vue": "^1.9.4", - "@vue/compiler-sfc": "^3.4.21", + "@vue/compiler-sfc": "^3.4.27", "@vueuse/head": "^1.3.1", "babel-eslint": "^10.1.0", "babel-jest": "^28.1.3", @@ -82,7 +82,7 @@ "upath": "^2.0.1", "vite-plugin-inspect": "^0.8.3", "vite-plugin-warmup": "^0.1.0", - "vue": "^3.4.21", + "vue": "^3.4.27", "vue-analytics": "^5.16.1", "vue-router": "^4.3.0", "vue-tsc": "^1.8.27", diff --git a/packages/api-generator/package.json b/packages/api-generator/package.json index ba8f15c7a9c..113dae776c2 100755 --- a/packages/api-generator/package.json +++ b/packages/api-generator/package.json @@ -16,7 +16,7 @@ "prettier": "^3.2.5", "ts-morph": "^22.0.0", "tsx": "^4.7.2", - "vue": "^3.4.21", + "vue": "^3.4.27", "vuetify": "^3.6.3" }, "devDependencies": { diff --git a/packages/docs/package.json b/packages/docs/package.json index 449a64171ab..3385989eca2 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -33,7 +33,7 @@ "prismjs": "^1.29.0", "roboto-fontface": "^0.10.0", "vee-validate": "^4.12.6", - "vue": "^3.4.21", + "vue": "^3.4.27", "vue-gtag-next": "^1.14.0", "vue-i18n": "^9.11.0", "vue-instantsearch": "^4.15.0", @@ -49,7 +49,7 @@ "@types/prismjs": "^1.26.3", "@vitejs/plugin-basic-ssl": "^1.1.0", "@vitejs/plugin-vue": "^5.0.4", - "@vue/compiler-sfc": "^3.4.21", + "@vue/compiler-sfc": "^3.4.27", "@vuetify/api-generator": "^3.6.3", "ajv": "^8.12.0", "async-es": "^3.2.5", diff --git a/packages/vuetify/package.json b/packages/vuetify/package.json index a5addaba149..1b82b1f18ed 100755 --- a/packages/vuetify/package.json +++ b/packages/vuetify/package.json @@ -138,7 +138,7 @@ "@vitejs/plugin-vue": "^5.0.4", "@vitejs/plugin-vue-jsx": "^3.1.0", "@vue/babel-plugin-jsx": "^1.2.2", - "@vue/test-utils": "2.4.5", + "@vue/test-utils": "2.4.6", "acorn-walk": "^8.3.2", "autoprefixer": "^10.4.19", "babel-plugin-add-import-extension": "1.5.1", diff --git a/packages/vuetify/src/components/VSlideGroup/VSlideGroup.tsx b/packages/vuetify/src/components/VSlideGroup/VSlideGroup.tsx index 676486fe22e..0fa926635c9 100644 --- a/packages/vuetify/src/components/VSlideGroup/VSlideGroup.tsx +++ b/packages/vuetify/src/components/VSlideGroup/VSlideGroup.tsx @@ -207,7 +207,7 @@ export const VSlideGroup = genericComponent( } } - function onScroll (e: UIEvent) { + function onScroll (e: Event) { const { scrollTop, scrollLeft } = e.target as HTMLElement scrollOffset.value = isHorizontal.value ? scrollLeft : scrollTop diff --git a/packages/vuetify/src/globals.d.ts b/packages/vuetify/src/globals.d.ts index cb06c7aeac7..8068100005b 100644 --- a/packages/vuetify/src/globals.d.ts +++ b/packages/vuetify/src/globals.d.ts @@ -58,16 +58,6 @@ declare global { path?: EventTarget[] } - interface UIEvent { - initUIEvent ( - typeArg: string, - canBubbleArg: boolean, - cancelableArg: boolean, - viewArg: Window, - detailArg: number, - ): void - } - interface MouseEvent { sourceCapabilities?: { firesTouchEvents: boolean } } diff --git a/yarn.lock b/yarn.lock index 063b4d09793..e54478ecf52 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3991,6 +3991,17 @@ estree-walker "^2.0.2" source-map-js "^1.0.2" +"@vue/compiler-core@3.4.27": + version "3.4.27" + resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.4.27.tgz#e69060f4b61429fe57976aa5872cfa21389e4d91" + integrity sha512-E+RyqY24KnyDXsCuQrI+mlcdW3ALND6U7Gqa/+bVwbcpcR3BRRIckFoz7Qyd4TTlnugtwuI7YgjbvsLmxb+yvg== + dependencies: + "@babel/parser" "^7.24.4" + "@vue/shared" "3.4.27" + entities "^4.5.0" + estree-walker "^2.0.2" + source-map-js "^1.2.0" + "@vue/compiler-dom@3.4.21", "@vue/compiler-dom@^3.3.0": version "3.4.21" resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.4.21.tgz#0077c355e2008207283a5a87d510330d22546803" @@ -3999,7 +4010,30 @@ "@vue/compiler-core" "3.4.21" "@vue/shared" "3.4.21" -"@vue/compiler-sfc@3.4.21", "@vue/compiler-sfc@^3.2.47", "@vue/compiler-sfc@^3.4.15", "@vue/compiler-sfc@^3.4.21": +"@vue/compiler-dom@3.4.27": + version "3.4.27" + resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.4.27.tgz#d51d35f40d00ce235d7afc6ad8b09dfd92b1cc1c" + integrity sha512-kUTvochG/oVgE1w5ViSr3KUBh9X7CWirebA3bezTbB5ZKBQZwR2Mwj9uoSKRMFcz4gSMzzLXBPD6KpCLb9nvWw== + dependencies: + "@vue/compiler-core" "3.4.27" + "@vue/shared" "3.4.27" + +"@vue/compiler-sfc@3.4.27", "@vue/compiler-sfc@^3.4.27": + version "3.4.27" + resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.4.27.tgz#399cac1b75c6737bf5440dc9cf3c385bb2959701" + integrity sha512-nDwntUEADssW8e0rrmE0+OrONwmRlegDA1pD6QhVeXxjIytV03yDqTey9SBDiALsvAd5U4ZrEKbMyVXhX6mCGA== + dependencies: + "@babel/parser" "^7.24.4" + "@vue/compiler-core" "3.4.27" + "@vue/compiler-dom" "3.4.27" + "@vue/compiler-ssr" "3.4.27" + "@vue/shared" "3.4.27" + estree-walker "^2.0.2" + magic-string "^0.30.10" + postcss "^8.4.38" + source-map-js "^1.2.0" + +"@vue/compiler-sfc@^3.2.47", "@vue/compiler-sfc@^3.4.15": version "3.4.21" resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.4.21.tgz#4af920dc31ab99e1ff5d152b5fe0ad12181145b2" integrity sha512-me7epoTxYlY+2CUM7hy9PCDdpMPfIwrOvAXud2Upk10g4YLv9UBW7kL798TvMeDhPthkZ0CONNrK2GoeI1ODiQ== @@ -4022,6 +4056,14 @@ "@vue/compiler-dom" "3.4.21" "@vue/shared" "3.4.21" +"@vue/compiler-ssr@3.4.27": + version "3.4.27" + resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.4.27.tgz#2a8ecfef1cf448b09be633901a9c020360472e3d" + integrity sha512-CVRzSJIltzMG5FcidsW0jKNQnNRYC8bT21VegyMMtHmhW3UOI7knmUehzswXLrExDLE6lQCZdrhD4ogI7c+vuw== + dependencies: + "@vue/compiler-dom" "3.4.27" + "@vue/shared" "3.4.27" + "@vue/devtools-api@^6.5.0", "@vue/devtools-api@^6.5.1": version "6.5.1" resolved "https://registry.yarnpkg.com/@vue/devtools-api/-/devtools-api-6.5.1.tgz#7f71f31e40973eeee65b9a64382b13593fdbd697" @@ -4042,31 +4084,39 @@ path-browserify "^1.0.1" vue-template-compiler "^2.7.14" -"@vue/reactivity@3.4.21": - version "3.4.21" - resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.4.21.tgz#affd3415115b8ebf4927c8d2a0d6a24bccfa9f02" - integrity sha512-UhenImdc0L0/4ahGCyEzc/pZNwVgcglGy9HVzJ1Bq2Mm9qXOpP8RyNTjookw/gOCUlXSEtuZ2fUg5nrHcoqJcw== +"@vue/reactivity@3.4.27": + version "3.4.27" + resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.4.27.tgz#6ece72331bf719953f5eaa95ec60b2b8d49e3791" + integrity sha512-kK0g4NknW6JX2yySLpsm2jlunZJl2/RJGZ0H9ddHdfBVHcNzxmQ0sS0b09ipmBoQpY8JM2KmUw+a6sO8Zo+zIA== dependencies: - "@vue/shared" "3.4.21" + "@vue/shared" "3.4.27" -"@vue/runtime-core@3.4.21": - version "3.4.21" - resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.4.21.tgz#3749c3f024a64c4c27ecd75aea4ca35634db0062" - integrity sha512-pQthsuYzE1XcGZznTKn73G0s14eCJcjaLvp3/DKeYWoFacD9glJoqlNBxt3W2c5S40t6CCcpPf+jG01N3ULyrA== +"@vue/runtime-core@3.4.27": + version "3.4.27" + resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.4.27.tgz#1b6e1d71e4604ba7442dd25ed22e4a1fc6adbbda" + integrity sha512-7aYA9GEbOOdviqVvcuweTLe5Za4qBZkUY7SvET6vE8kyypxVgaT1ixHLg4urtOlrApdgcdgHoTZCUuTGap/5WA== dependencies: - "@vue/reactivity" "3.4.21" - "@vue/shared" "3.4.21" + "@vue/reactivity" "3.4.27" + "@vue/shared" "3.4.27" -"@vue/runtime-dom@3.4.21": - version "3.4.21" - resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.4.21.tgz#91f867ef64eff232cac45095ab28ebc93ac74588" - integrity sha512-gvf+C9cFpevsQxbkRBS1NpU8CqxKw0ebqMvLwcGQrNpx6gqRDodqKqA+A2VZZpQ9RpK2f9yfg8VbW/EpdFUOJw== +"@vue/runtime-dom@3.4.27": + version "3.4.27" + resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.4.27.tgz#fe8d1ce9bbe8921d5dd0ad5c10df0e04ef7a5ee7" + integrity sha512-ScOmP70/3NPM+TW9hvVAz6VWWtZJqkbdf7w6ySsws+EsqtHvkhxaWLecrTorFxsawelM5Ys9FnDEMt6BPBDS0Q== dependencies: - "@vue/runtime-core" "3.4.21" - "@vue/shared" "3.4.21" + "@vue/runtime-core" "3.4.27" + "@vue/shared" "3.4.27" csstype "^3.1.3" -"@vue/server-renderer@3.4.21", "@vue/server-renderer@^3.2.26": +"@vue/server-renderer@3.4.27": + version "3.4.27" + resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.4.27.tgz#3306176f37e648ba665f97dda3ce705687be63d2" + integrity sha512-dlAMEuvmeA3rJsOMJ2J1kXU7o7pOxgsNHVr9K8hB3ImIkSuBrIdy0vF66h8gf8Tuinf1TK3mPAz2+2sqyf3KzA== + dependencies: + "@vue/compiler-ssr" "3.4.27" + "@vue/shared" "3.4.27" + +"@vue/server-renderer@^3.2.26": version "3.4.21" resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.4.21.tgz#150751579d26661ee3ed26a28604667fa4222a97" integrity sha512-aV1gXyKSN6Rz+6kZ6kr5+Ll14YzmIbeuWe7ryJl5muJ4uwSwY/aStXTixx76TwkZFJLm1aAlA/HSWEJ4EyiMkg== @@ -4079,10 +4129,15 @@ resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.4.21.tgz#de526a9059d0a599f0b429af7037cd0c3ed7d5a1" integrity sha512-PuJe7vDIi6VYSinuEbUIQgMIRZGgM8e4R+G+/dQTk0X1NEdvgvvgv7m+rfmDH1gZzyA1OjjoWskvHlfRNfQf3g== -"@vue/test-utils@2.4.5": - version "2.4.5" - resolved "https://registry.yarnpkg.com/@vue/test-utils/-/test-utils-2.4.5.tgz#010aa4debe6602d83dc75f233b397092742105a2" - integrity sha512-oo2u7vktOyKUked36R93NB7mg2B+N7Plr8lxp2JBGwr18ch6EggFjixSCdIVVLkT6Qr0z359Xvnafc9dcKyDUg== +"@vue/shared@3.4.27": + version "3.4.27" + resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.4.27.tgz#f05e3cd107d157354bb4ae7a7b5fc9cf73c63b50" + integrity sha512-DL3NmY2OFlqmYYrzp39yi3LDkKxa5vZVwxWdQ3rG0ekuWscHraeIbnI8t+aZK7qhYqEqWKTUdijadunb9pnrgA== + +"@vue/test-utils@2.4.6": + version "2.4.6" + resolved "https://registry.yarnpkg.com/@vue/test-utils/-/test-utils-2.4.6.tgz#7d534e70c4319d2a587d6a3b45a39e9695ade03c" + integrity sha512-FMxEjOpYNYiFe0GkaHsnJPXFHxQ6m4t8vI/ElPGpMWxZKpmRvQ33OIrvRXemy6yha03RxhOlQuy+gZMC3CQSow== dependencies: js-beautify "^1.14.9" vue-component-type-helpers "^2.0.0" @@ -10419,6 +10474,13 @@ magic-string@^0.25.0, magic-string@^0.25.7: dependencies: sourcemap-codec "^1.4.4" +magic-string@^0.30.10: + version "0.30.10" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.10.tgz#123d9c41a0cb5640c892b041d4cfb3bd0aa4b39e" + integrity sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ== + dependencies: + "@jridgewell/sourcemap-codec" "^1.4.15" + magic-string@^0.30.3, magic-string@^0.30.4, magic-string@^0.30.5, magic-string@^0.30.7, magic-string@^0.30.9: version "0.30.9" resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.9.tgz#8927ae21bfdd856310e07a1bc8dd5e73cb6c251d" @@ -14806,16 +14868,16 @@ vue-tsc@^1.8.27: "@vue/language-core" "1.8.27" semver "^7.5.4" -vue@^3.4.21: - version "3.4.21" - resolved "https://registry.yarnpkg.com/vue/-/vue-3.4.21.tgz#69ec30e267d358ee3a0ce16612ba89e00aaeb731" - integrity sha512-5hjyV/jLEIKD/jYl4cavMcnzKwjMKohureP8ejn3hhEjwhWIhWeuzL2kJAjzl/WyVsgPY56Sy4Z40C3lVshxXA== +vue@^3.4.27: + version "3.4.27" + resolved "https://registry.yarnpkg.com/vue/-/vue-3.4.27.tgz#40b7d929d3e53f427f7f5945386234d2854cc2a1" + integrity sha512-8s/56uK6r01r1icG/aEOHqyMVxd1bkYcSe9j8HcKtr/xTOFWvnzIVTehNW+5Yt89f+DLBe4A569pnZLS5HzAMA== dependencies: - "@vue/compiler-dom" "3.4.21" - "@vue/compiler-sfc" "3.4.21" - "@vue/runtime-dom" "3.4.21" - "@vue/server-renderer" "3.4.21" - "@vue/shared" "3.4.21" + "@vue/compiler-dom" "3.4.27" + "@vue/compiler-sfc" "3.4.27" + "@vue/runtime-dom" "3.4.27" + "@vue/server-renderer" "3.4.27" + "@vue/shared" "3.4.27" w3c-hr-time@^1.0.2: version "1.0.2" From 94a05d1f1aae54b97a9a9ea27c61d3c28314f953 Mon Sep 17 00:00:00 2001 From: Kael Date: Tue, 7 May 2024 16:44:43 +1000 Subject: [PATCH 012/122] fix(VList): allow group activators to be links closes #10981 --- packages/vuetify/src/components/VList/VListItem.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/vuetify/src/components/VList/VListItem.tsx b/packages/vuetify/src/components/VList/VListItem.tsx index d059c55f130..ec51bda0e14 100644 --- a/packages/vuetify/src/components/VList/VListItem.tsx +++ b/packages/vuetify/src/components/VList/VListItem.tsx @@ -174,10 +174,12 @@ export const VListItem = genericComponent()({ function onClick (e: MouseEvent) { emit('click', e) - if (isGroupActivator || !isClickable.value) return + if (!isClickable.value) return link.navigate?.(e) + if (isGroupActivator) return + if (root.activatable.value) { activate(!isActivated.value, e) } else if (root.selectable.value) { From 8f0322d095f277074678f4b454bdc83203d592bc Mon Sep 17 00:00:00 2001 From: Kael Date: Tue, 7 May 2024 17:49:51 +1000 Subject: [PATCH 013/122] fix(VResponsive): contentClass accepts array and object fixes #19729 --- packages/vuetify/src/components/VResponsive/VResponsive.tsx | 2 +- packages/vuetify/src/composables/component.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/vuetify/src/components/VResponsive/VResponsive.tsx b/packages/vuetify/src/components/VResponsive/VResponsive.tsx index 25edf092a90..f23f011e8a9 100644 --- a/packages/vuetify/src/components/VResponsive/VResponsive.tsx +++ b/packages/vuetify/src/components/VResponsive/VResponsive.tsx @@ -28,7 +28,7 @@ export function useAspectStyles (props: { aspectRatio?: string | number }) { export const makeVResponsiveProps = propsFactory({ aspectRatio: [String, Number], - contentClass: String, + contentClass: null, inline: Boolean, ...makeComponentProps(), diff --git a/packages/vuetify/src/composables/component.ts b/packages/vuetify/src/composables/component.ts index e1d961c0ef4..c5d426d3882 100644 --- a/packages/vuetify/src/composables/component.ts +++ b/packages/vuetify/src/composables/component.ts @@ -7,13 +7,13 @@ import type { PropType, StyleValue } from 'vue' export type ClassValue = any export interface ComponentProps { - class?: ClassValue + class: ClassValue style: StyleValue | undefined } // Composables export const makeComponentProps = propsFactory({ - class: [String, Array] as PropType, + class: [String, Array, Object] as PropType, style: { type: [String, Array, Object] as PropType, default: null, From 6c78760ce11f836afac38b6a7ce6c26b1aa74b28 Mon Sep 17 00:00:00 2001 From: Kael Date: Tue, 7 May 2024 17:59:04 +1000 Subject: [PATCH 014/122] chore: update vue-instantsearch to 4.16.1 --- packages/docs/package.json | 4 +- yarn.lock | 392 ++++++++++++++++--------------------- 2 files changed, 167 insertions(+), 229 deletions(-) diff --git a/packages/docs/package.json b/packages/docs/package.json index 3385989eca2..2d39be53f3d 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -24,7 +24,7 @@ "@vuelidate/core": "^2.0.3", "@vuelidate/validators": "^2.0.4", "@vuetify/one": "^1.8.1", - "algoliasearch": "^4.23.2", + "algoliasearch": "^4.23.3", "fflate": "^0.8.2", "isomorphic-fetch": "^3.0.0", "lodash-es": "^4.17.21", @@ -36,7 +36,7 @@ "vue": "^3.4.27", "vue-gtag-next": "^1.14.0", "vue-i18n": "^9.11.0", - "vue-instantsearch": "^4.15.0", + "vue-instantsearch": "^4.16.1", "vue-prism-component": "^2.0.0", "vuetify": "^3.6.3" }, diff --git a/yarn.lock b/yarn.lock index e54478ecf52..42fb9ecea29 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7,131 +7,131 @@ resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== -"@algolia/cache-browser-local-storage@4.23.2": - version "4.23.2" - resolved "https://registry.yarnpkg.com/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.23.2.tgz#060d15e89588fcac18e73643201fce0f4f7d5ca0" - integrity sha512-PvRQdCmtiU22dw9ZcTJkrVKgNBVAxKgD0/cfiqyxhA5+PHzA2WDt6jOmZ9QASkeM2BpyzClJb/Wr1yt2/t78Kw== - dependencies: - "@algolia/cache-common" "4.23.2" - -"@algolia/cache-common@4.23.2": - version "4.23.2" - resolved "https://registry.yarnpkg.com/@algolia/cache-common/-/cache-common-4.23.2.tgz#c68706ce34b18377e56e71ac13cce2dd5662dcee" - integrity sha512-OUK/6mqr6CQWxzl/QY0/mwhlGvS6fMtvEPyn/7AHUx96NjqDA4X4+Ju7aXFQKh+m3jW9VPB0B9xvEQgyAnRPNw== - -"@algolia/cache-in-memory@4.23.2": - version "4.23.2" - resolved "https://registry.yarnpkg.com/@algolia/cache-in-memory/-/cache-in-memory-4.23.2.tgz#94cd828275d7a12186959bf1b95a13247e103b23" - integrity sha512-rfbi/SnhEa3MmlqQvgYz/9NNJ156NkU6xFxjbxBtLWnHbpj+qnlMoKd+amoiacHRITpajg6zYbLM9dnaD3Bczw== - dependencies: - "@algolia/cache-common" "4.23.2" - -"@algolia/client-account@4.23.2": - version "4.23.2" - resolved "https://registry.yarnpkg.com/@algolia/client-account/-/client-account-4.23.2.tgz#b53cb14e730fd8e0a0a227cf650b287b570a08bc" - integrity sha512-VbrOCLIN/5I7iIdskSoSw3uOUPF516k4SjDD4Qz3BFwa3of7D9A0lzBMAvQEJJEPHWdVraBJlGgdJq/ttmquJQ== - dependencies: - "@algolia/client-common" "4.23.2" - "@algolia/client-search" "4.23.2" - "@algolia/transporter" "4.23.2" - -"@algolia/client-analytics@4.23.2": - version "4.23.2" - resolved "https://registry.yarnpkg.com/@algolia/client-analytics/-/client-analytics-4.23.2.tgz#7fdcf1cb27f0ae93e5da6beb4e612fc06a880b0c" - integrity sha512-lLj7irsAztGhMoEx/SwKd1cwLY6Daf1Q5f2AOsZacpppSvuFvuBrmkzT7pap1OD/OePjLKxicJS8wNA0+zKtuw== - dependencies: - "@algolia/client-common" "4.23.2" - "@algolia/client-search" "4.23.2" - "@algolia/requester-common" "4.23.2" - "@algolia/transporter" "4.23.2" - -"@algolia/client-common@4.23.2": - version "4.23.2" - resolved "https://registry.yarnpkg.com/@algolia/client-common/-/client-common-4.23.2.tgz#e5f86fc2de707eb6bf9f1109b70187dae179c72c" - integrity sha512-Q2K1FRJBern8kIfZ0EqPvUr3V29ICxCm/q42zInV+VJRjldAD9oTsMGwqUQ26GFMdFYmqkEfCbY4VGAiQhh22g== - dependencies: - "@algolia/requester-common" "4.23.2" - "@algolia/transporter" "4.23.2" - -"@algolia/client-personalization@4.23.2": - version "4.23.2" - resolved "https://registry.yarnpkg.com/@algolia/client-personalization/-/client-personalization-4.23.2.tgz#0472d9c207402eefcc9c98f7ffba5d26fe8e2fd0" - integrity sha512-vwPsgnCGhUcHhhQG5IM27z8q7dWrN9itjdvgA6uKf2e9r7vB+WXt4OocK0CeoYQt3OGEAExryzsB8DWqdMK5wg== - dependencies: - "@algolia/client-common" "4.23.2" - "@algolia/requester-common" "4.23.2" - "@algolia/transporter" "4.23.2" - -"@algolia/client-search@4.23.2": - version "4.23.2" - resolved "https://registry.yarnpkg.com/@algolia/client-search/-/client-search-4.23.2.tgz#9b2741f0a209596459f06a44583118207ea287f7" - integrity sha512-CxSB29OVGSE7l/iyoHvamMonzq7Ev8lnk/OkzleODZ1iBcCs3JC/XgTIKzN/4RSTrJ9QybsnlrN/bYCGufo7qw== - dependencies: - "@algolia/client-common" "4.23.2" - "@algolia/requester-common" "4.23.2" - "@algolia/transporter" "4.23.2" +"@algolia/cache-browser-local-storage@4.23.3": + version "4.23.3" + resolved "https://registry.yarnpkg.com/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.23.3.tgz#0cc26b96085e1115dac5fcb9d826651ba57faabc" + integrity sha512-vRHXYCpPlTDE7i6UOy2xE03zHF2C8MEFjPN2v7fRbqVpcOvAUQK81x3Kc21xyb5aSIpYCjWCZbYZuz8Glyzyyg== + dependencies: + "@algolia/cache-common" "4.23.3" + +"@algolia/cache-common@4.23.3": + version "4.23.3" + resolved "https://registry.yarnpkg.com/@algolia/cache-common/-/cache-common-4.23.3.tgz#3bec79092d512a96c9bfbdeec7cff4ad36367166" + integrity sha512-h9XcNI6lxYStaw32pHpB1TMm0RuxphF+Ik4o7tcQiodEdpKK+wKufY6QXtba7t3k8eseirEMVB83uFFF3Nu54A== + +"@algolia/cache-in-memory@4.23.3": + version "4.23.3" + resolved "https://registry.yarnpkg.com/@algolia/cache-in-memory/-/cache-in-memory-4.23.3.tgz#3945f87cd21ffa2bec23890c85305b6b11192423" + integrity sha512-yvpbuUXg/+0rbcagxNT7un0eo3czx2Uf0y4eiR4z4SD7SiptwYTpbuS0IHxcLHG3lq22ukx1T6Kjtk/rT+mqNg== + dependencies: + "@algolia/cache-common" "4.23.3" + +"@algolia/client-account@4.23.3": + version "4.23.3" + resolved "https://registry.yarnpkg.com/@algolia/client-account/-/client-account-4.23.3.tgz#8751bbf636e6741c95e7c778488dee3ee430ac6f" + integrity sha512-hpa6S5d7iQmretHHF40QGq6hz0anWEHGlULcTIT9tbUssWUriN9AUXIFQ8Ei4w9azD0hc1rUok9/DeQQobhQMA== + dependencies: + "@algolia/client-common" "4.23.3" + "@algolia/client-search" "4.23.3" + "@algolia/transporter" "4.23.3" + +"@algolia/client-analytics@4.23.3": + version "4.23.3" + resolved "https://registry.yarnpkg.com/@algolia/client-analytics/-/client-analytics-4.23.3.tgz#f88710885278fe6fb6964384af59004a5a6f161d" + integrity sha512-LBsEARGS9cj8VkTAVEZphjxTjMVCci+zIIiRhpFun9jGDUlS1XmhCW7CTrnaWeIuCQS/2iPyRqSy1nXPjcBLRA== + dependencies: + "@algolia/client-common" "4.23.3" + "@algolia/client-search" "4.23.3" + "@algolia/requester-common" "4.23.3" + "@algolia/transporter" "4.23.3" + +"@algolia/client-common@4.23.3": + version "4.23.3" + resolved "https://registry.yarnpkg.com/@algolia/client-common/-/client-common-4.23.3.tgz#891116aa0db75055a7ecc107649f7f0965774704" + integrity sha512-l6EiPxdAlg8CYhroqS5ybfIczsGUIAC47slLPOMDeKSVXYG1n0qGiz4RjAHLw2aD0xzh2EXZ7aRguPfz7UKDKw== + dependencies: + "@algolia/requester-common" "4.23.3" + "@algolia/transporter" "4.23.3" + +"@algolia/client-personalization@4.23.3": + version "4.23.3" + resolved "https://registry.yarnpkg.com/@algolia/client-personalization/-/client-personalization-4.23.3.tgz#35fa8e5699b0295fbc400a8eb211dc711e5909db" + integrity sha512-3E3yF3Ocr1tB/xOZiuC3doHQBQ2zu2MPTYZ0d4lpfWads2WTKG7ZzmGnsHmm63RflvDeLK/UVx7j2b3QuwKQ2g== + dependencies: + "@algolia/client-common" "4.23.3" + "@algolia/requester-common" "4.23.3" + "@algolia/transporter" "4.23.3" + +"@algolia/client-search@4.23.3": + version "4.23.3" + resolved "https://registry.yarnpkg.com/@algolia/client-search/-/client-search-4.23.3.tgz#a3486e6af13a231ec4ab43a915a1f318787b937f" + integrity sha512-P4VAKFHqU0wx9O+q29Q8YVuaowaZ5EM77rxfmGnkHUJggh28useXQdopokgwMeYw2XUht49WX5RcTQ40rZIabw== + dependencies: + "@algolia/client-common" "4.23.3" + "@algolia/requester-common" "4.23.3" + "@algolia/transporter" "4.23.3" "@algolia/events@^4.0.1": version "4.0.1" resolved "https://registry.yarnpkg.com/@algolia/events/-/events-4.0.1.tgz#fd39e7477e7bc703d7f893b556f676c032af3950" integrity sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ== -"@algolia/logger-common@4.23.2": - version "4.23.2" - resolved "https://registry.yarnpkg.com/@algolia/logger-common/-/logger-common-4.23.2.tgz#5441a828f0fad1ceaae3a27caec7b663d40dd27f" - integrity sha512-jGM49Q7626cXZ7qRAWXn0jDlzvoA1FvN4rKTi1g0hxKsTTSReyYk0i1ADWjChDPl3Q+nSDhJuosM2bBUAay7xw== - -"@algolia/logger-console@4.23.2": - version "4.23.2" - resolved "https://registry.yarnpkg.com/@algolia/logger-console/-/logger-console-4.23.2.tgz#fda4252bb02df7c52a92c63f1e357bf7370cc8db" - integrity sha512-oo+lnxxEmlhTBTFZ3fGz1O8PJ+G+8FiAoMY2Qo3Q4w23xocQev6KqDTA1JQAGPDxAewNA2VBwWOsVXeXFjrI/Q== - dependencies: - "@algolia/logger-common" "4.23.2" - -"@algolia/recommend@4.23.2": - version "4.23.2" - resolved "https://registry.yarnpkg.com/@algolia/recommend/-/recommend-4.23.2.tgz#02bf57f836ced2c850633239d493a0414be76a7f" - integrity sha512-Q75CjnzRCDzgIlgWfPnkLtrfF4t82JCirhalXkSSwe/c1GH5pWh4xUyDOR3KTMo+YxxX3zTlrL/FjHmUJEWEcg== - dependencies: - "@algolia/cache-browser-local-storage" "4.23.2" - "@algolia/cache-common" "4.23.2" - "@algolia/cache-in-memory" "4.23.2" - "@algolia/client-common" "4.23.2" - "@algolia/client-search" "4.23.2" - "@algolia/logger-common" "4.23.2" - "@algolia/logger-console" "4.23.2" - "@algolia/requester-browser-xhr" "4.23.2" - "@algolia/requester-common" "4.23.2" - "@algolia/requester-node-http" "4.23.2" - "@algolia/transporter" "4.23.2" - -"@algolia/requester-browser-xhr@4.23.2": - version "4.23.2" - resolved "https://registry.yarnpkg.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.23.2.tgz#2d0a6b642e2a2bbfb2e2ff3d1e82158e3e143def" - integrity sha512-TO9wLlp8+rvW9LnIfyHsu8mNAMYrqNdQ0oLF6eTWFxXfxG3k8F/Bh7nFYGk2rFAYty4Fw4XUtrv/YjeNDtM5og== - dependencies: - "@algolia/requester-common" "4.23.2" - -"@algolia/requester-common@4.23.2": - version "4.23.2" - resolved "https://registry.yarnpkg.com/@algolia/requester-common/-/requester-common-4.23.2.tgz#9c2e5da4dc15e65f9b9bbe5bedb419cf23092ef1" - integrity sha512-3EfpBS0Hri0lGDB5H/BocLt7Vkop0bTTLVUBB844HH6tVycwShmsV6bDR7yXbQvFP1uNpgePRD3cdBCjeHmk6Q== - -"@algolia/requester-node-http@4.23.2": - version "4.23.2" - resolved "https://registry.yarnpkg.com/@algolia/requester-node-http/-/requester-node-http-4.23.2.tgz#718ae71f58949eab3b5fcfc440be42af41bd640f" - integrity sha512-SVzgkZM/malo+2SB0NWDXpnT7nO5IZwuDTaaH6SjLeOHcya1o56LSWXk+3F3rNLz2GVH+I/rpYKiqmHhSOjerw== - dependencies: - "@algolia/requester-common" "4.23.2" - -"@algolia/transporter@4.23.2": - version "4.23.2" - resolved "https://registry.yarnpkg.com/@algolia/transporter/-/transporter-4.23.2.tgz#61e7b9288d4f561b2015ddde689ba31e08c21644" - integrity sha512-GY3aGKBy+8AK4vZh8sfkatDciDVKad5rTY2S10Aefyjh7e7UGBP4zigf42qVXwU8VOPwi7l/L7OACGMOFcjB0Q== - dependencies: - "@algolia/cache-common" "4.23.2" - "@algolia/logger-common" "4.23.2" - "@algolia/requester-common" "4.23.2" +"@algolia/logger-common@4.23.3": + version "4.23.3" + resolved "https://registry.yarnpkg.com/@algolia/logger-common/-/logger-common-4.23.3.tgz#35c6d833cbf41e853a4f36ba37c6e5864920bfe9" + integrity sha512-y9kBtmJwiZ9ZZ+1Ek66P0M68mHQzKRxkW5kAAXYN/rdzgDN0d2COsViEFufxJ0pb45K4FRcfC7+33YB4BLrZ+g== + +"@algolia/logger-console@4.23.3": + version "4.23.3" + resolved "https://registry.yarnpkg.com/@algolia/logger-console/-/logger-console-4.23.3.tgz#30f916781826c4db5f51fcd9a8a264a06e136985" + integrity sha512-8xoiseoWDKuCVnWP8jHthgaeobDLolh00KJAdMe9XPrWPuf1by732jSpgy2BlsLTaT9m32pHI8CRfrOqQzHv3A== + dependencies: + "@algolia/logger-common" "4.23.3" + +"@algolia/recommend@4.23.3": + version "4.23.3" + resolved "https://registry.yarnpkg.com/@algolia/recommend/-/recommend-4.23.3.tgz#53d4f194d22d9c72dc05f3f7514c5878f87c5890" + integrity sha512-9fK4nXZF0bFkdcLBRDexsnGzVmu4TSYZqxdpgBW2tEyfuSSY54D4qSRkLmNkrrz4YFvdh2GM1gA8vSsnZPR73w== + dependencies: + "@algolia/cache-browser-local-storage" "4.23.3" + "@algolia/cache-common" "4.23.3" + "@algolia/cache-in-memory" "4.23.3" + "@algolia/client-common" "4.23.3" + "@algolia/client-search" "4.23.3" + "@algolia/logger-common" "4.23.3" + "@algolia/logger-console" "4.23.3" + "@algolia/requester-browser-xhr" "4.23.3" + "@algolia/requester-common" "4.23.3" + "@algolia/requester-node-http" "4.23.3" + "@algolia/transporter" "4.23.3" + +"@algolia/requester-browser-xhr@4.23.3": + version "4.23.3" + resolved "https://registry.yarnpkg.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.23.3.tgz#9e47e76f60d540acc8b27b4ebc7a80d1b41938b9" + integrity sha512-jDWGIQ96BhXbmONAQsasIpTYWslyjkiGu0Quydjlowe+ciqySpiDUrJHERIRfELE5+wFc7hc1Q5hqjGoV7yghw== + dependencies: + "@algolia/requester-common" "4.23.3" + +"@algolia/requester-common@4.23.3": + version "4.23.3" + resolved "https://registry.yarnpkg.com/@algolia/requester-common/-/requester-common-4.23.3.tgz#7dbae896e41adfaaf1d1fa5f317f83a99afb04b3" + integrity sha512-xloIdr/bedtYEGcXCiF2muajyvRhwop4cMZo+K2qzNht0CMzlRkm8YsDdj5IaBhshqfgmBb3rTg4sL4/PpvLYw== + +"@algolia/requester-node-http@4.23.3": + version "4.23.3" + resolved "https://registry.yarnpkg.com/@algolia/requester-node-http/-/requester-node-http-4.23.3.tgz#c9f94a5cb96a15f48cea338ab6ef16bbd0ff989f" + integrity sha512-zgu++8Uj03IWDEJM3fuNl34s746JnZOWn1Uz5taV1dFyJhVM/kTNw9Ik7YJWiUNHJQXcaD8IXD1eCb0nq/aByA== + dependencies: + "@algolia/requester-common" "4.23.3" + +"@algolia/transporter@4.23.3": + version "4.23.3" + resolved "https://registry.yarnpkg.com/@algolia/transporter/-/transporter-4.23.3.tgz#545b045b67db3850ddf0bbecbc6c84ff1f3398b7" + integrity sha512-Wjl5gttqnf/gQKJA+dafnD0Y6Yw97yvfY8R9h0dQltX1GXTgNs1zWgvtWW0tHl1EgMdhAyw189uWiZMnL3QebQ== + dependencies: + "@algolia/cache-common" "4.23.3" + "@algolia/logger-common" "4.23.3" + "@algolia/requester-common" "4.23.3" "@ampproject/remapping@^2.2.0": version "2.2.0" @@ -3980,17 +3980,6 @@ "@babel/parser" "^7.23.9" "@vue/compiler-sfc" "^3.4.15" -"@vue/compiler-core@3.4.21": - version "3.4.21" - resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.4.21.tgz#868b7085378fc24e58c9aed14c8d62110a62be1a" - integrity sha512-MjXawxZf2SbZszLPYxaFCjxfibYrzr3eYbKxwpLR9EQN+oaziSu3qKVbwBERj1IFIB8OLUewxB5m/BFzi613og== - dependencies: - "@babel/parser" "^7.23.9" - "@vue/shared" "3.4.21" - entities "^4.5.0" - estree-walker "^2.0.2" - source-map-js "^1.0.2" - "@vue/compiler-core@3.4.27": version "3.4.27" resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.4.27.tgz#e69060f4b61429fe57976aa5872cfa21389e4d91" @@ -4002,15 +3991,7 @@ estree-walker "^2.0.2" source-map-js "^1.2.0" -"@vue/compiler-dom@3.4.21", "@vue/compiler-dom@^3.3.0": - version "3.4.21" - resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.4.21.tgz#0077c355e2008207283a5a87d510330d22546803" - integrity sha512-IZC6FKowtT1sl0CR5DpXSiEB5ayw75oT2bma1BEhV7RRR1+cfwLrxc2Z8Zq/RGFzJ8w5r9QtCOvTjQgdn0IKmA== - dependencies: - "@vue/compiler-core" "3.4.21" - "@vue/shared" "3.4.21" - -"@vue/compiler-dom@3.4.27": +"@vue/compiler-dom@3.4.27", "@vue/compiler-dom@^3.3.0": version "3.4.27" resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.4.27.tgz#d51d35f40d00ce235d7afc6ad8b09dfd92b1cc1c" integrity sha512-kUTvochG/oVgE1w5ViSr3KUBh9X7CWirebA3bezTbB5ZKBQZwR2Mwj9uoSKRMFcz4gSMzzLXBPD6KpCLb9nvWw== @@ -4018,7 +3999,7 @@ "@vue/compiler-core" "3.4.27" "@vue/shared" "3.4.27" -"@vue/compiler-sfc@3.4.27", "@vue/compiler-sfc@^3.4.27": +"@vue/compiler-sfc@3.4.27", "@vue/compiler-sfc@^3.2.47", "@vue/compiler-sfc@^3.4.15", "@vue/compiler-sfc@^3.4.27": version "3.4.27" resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.4.27.tgz#399cac1b75c6737bf5440dc9cf3c385bb2959701" integrity sha512-nDwntUEADssW8e0rrmE0+OrONwmRlegDA1pD6QhVeXxjIytV03yDqTey9SBDiALsvAd5U4ZrEKbMyVXhX6mCGA== @@ -4033,29 +4014,6 @@ postcss "^8.4.38" source-map-js "^1.2.0" -"@vue/compiler-sfc@^3.2.47", "@vue/compiler-sfc@^3.4.15": - version "3.4.21" - resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.4.21.tgz#4af920dc31ab99e1ff5d152b5fe0ad12181145b2" - integrity sha512-me7epoTxYlY+2CUM7hy9PCDdpMPfIwrOvAXud2Upk10g4YLv9UBW7kL798TvMeDhPthkZ0CONNrK2GoeI1ODiQ== - dependencies: - "@babel/parser" "^7.23.9" - "@vue/compiler-core" "3.4.21" - "@vue/compiler-dom" "3.4.21" - "@vue/compiler-ssr" "3.4.21" - "@vue/shared" "3.4.21" - estree-walker "^2.0.2" - magic-string "^0.30.7" - postcss "^8.4.35" - source-map-js "^1.0.2" - -"@vue/compiler-ssr@3.4.21": - version "3.4.21" - resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.4.21.tgz#b84ae64fb9c265df21fc67f7624587673d324fef" - integrity sha512-M5+9nI2lPpAsgXOGQobnIueVqc9sisBFexh5yMIMRAPYLa7+5wEJs8iqOZc1WAa9WQbx9GR2twgznU8LTIiZ4Q== - dependencies: - "@vue/compiler-dom" "3.4.21" - "@vue/shared" "3.4.21" - "@vue/compiler-ssr@3.4.27": version "3.4.27" resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.4.27.tgz#2a8ecfef1cf448b09be633901a9c020360472e3d" @@ -4108,7 +4066,7 @@ "@vue/shared" "3.4.27" csstype "^3.1.3" -"@vue/server-renderer@3.4.27": +"@vue/server-renderer@3.4.27", "@vue/server-renderer@^3.2.26": version "3.4.27" resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.4.27.tgz#3306176f37e648ba665f97dda3ce705687be63d2" integrity sha512-dlAMEuvmeA3rJsOMJ2J1kXU7o7pOxgsNHVr9K8hB3ImIkSuBrIdy0vF66h8gf8Tuinf1TK3mPAz2+2sqyf3KzA== @@ -4116,20 +4074,7 @@ "@vue/compiler-ssr" "3.4.27" "@vue/shared" "3.4.27" -"@vue/server-renderer@^3.2.26": - version "3.4.21" - resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.4.21.tgz#150751579d26661ee3ed26a28604667fa4222a97" - integrity sha512-aV1gXyKSN6Rz+6kZ6kr5+Ll14YzmIbeuWe7ryJl5muJ4uwSwY/aStXTixx76TwkZFJLm1aAlA/HSWEJ4EyiMkg== - dependencies: - "@vue/compiler-ssr" "3.4.21" - "@vue/shared" "3.4.21" - -"@vue/shared@3.4.21", "@vue/shared@^3.3.0": - version "3.4.21" - resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.4.21.tgz#de526a9059d0a599f0b429af7037cd0c3ed7d5a1" - integrity sha512-PuJe7vDIi6VYSinuEbUIQgMIRZGgM8e4R+G+/dQTk0X1NEdvgvvgv7m+rfmDH1gZzyA1OjjoWskvHlfRNfQf3g== - -"@vue/shared@3.4.27": +"@vue/shared@3.4.27", "@vue/shared@^3.3.0": version "3.4.27" resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.4.27.tgz#f05e3cd107d157354bb4ae7a7b5fc9cf73c63b50" integrity sha512-DL3NmY2OFlqmYYrzp39yi3LDkKxa5vZVwxWdQ3rG0ekuWscHraeIbnI8t+aZK7qhYqEqWKTUdijadunb9pnrgA== @@ -4342,33 +4287,33 @@ ajv@^8.12.0, ajv@^8.6.0, ajv@^8.6.2: require-from-string "^2.0.2" uri-js "^4.2.2" -algoliasearch-helper@3.17.0: - version "3.17.0" - resolved "https://registry.yarnpkg.com/algoliasearch-helper/-/algoliasearch-helper-3.17.0.tgz#b8f2f98c9a49d9affb51205f8df116164050a842" - integrity sha512-R5422OiQjvjlK3VdpNQ/Qk7KsTIGeM5ACm8civGifOVWdRRV/3SgXuKmeNxe94Dz6fwj/IgpVmXbHutU4mHubg== +algoliasearch-helper@3.19.0: + version "3.19.0" + resolved "https://registry.yarnpkg.com/algoliasearch-helper/-/algoliasearch-helper-3.19.0.tgz#56f9c61f46ecb0a0f7497f127a5d32a94d87e090" + integrity sha512-AaSb5DZDMZmDQyIy6lf4aL0OZGgyIdqvLIIvSuVQOIOqfhrYSY7TvotIFI2x0Q3cP3xUpTd7lI1astUC4aXBJw== dependencies: "@algolia/events" "^4.0.1" -algoliasearch@^4.23.2: - version "4.23.2" - resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-4.23.2.tgz#3b7bc93d98f3965628c73a06cbf9203531324a9d" - integrity sha512-8aCl055IsokLuPU8BzLjwzXjb7ty9TPcUFFOk0pYOwsE5DMVhE3kwCMFtsCFKcnoPZK7oObm+H5mbnSO/9ioxQ== - dependencies: - "@algolia/cache-browser-local-storage" "4.23.2" - "@algolia/cache-common" "4.23.2" - "@algolia/cache-in-memory" "4.23.2" - "@algolia/client-account" "4.23.2" - "@algolia/client-analytics" "4.23.2" - "@algolia/client-common" "4.23.2" - "@algolia/client-personalization" "4.23.2" - "@algolia/client-search" "4.23.2" - "@algolia/logger-common" "4.23.2" - "@algolia/logger-console" "4.23.2" - "@algolia/recommend" "4.23.2" - "@algolia/requester-browser-xhr" "4.23.2" - "@algolia/requester-common" "4.23.2" - "@algolia/requester-node-http" "4.23.2" - "@algolia/transporter" "4.23.2" +algoliasearch@^4.23.3: + version "4.23.3" + resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-4.23.3.tgz#e09011d0a3b0651444916a3e6bbcba064ec44b60" + integrity sha512-Le/3YgNvjW9zxIQMRhUHuhiUjAlKY/zsdZpfq4dlLqg6mEm0nL6yk+7f2hDOtLpxsgE4jSzDmvHL7nXdBp5feg== + dependencies: + "@algolia/cache-browser-local-storage" "4.23.3" + "@algolia/cache-common" "4.23.3" + "@algolia/cache-in-memory" "4.23.3" + "@algolia/client-account" "4.23.3" + "@algolia/client-analytics" "4.23.3" + "@algolia/client-common" "4.23.3" + "@algolia/client-personalization" "4.23.3" + "@algolia/client-search" "4.23.3" + "@algolia/logger-common" "4.23.3" + "@algolia/logger-console" "4.23.3" + "@algolia/recommend" "4.23.3" + "@algolia/requester-browser-xhr" "4.23.3" + "@algolia/requester-common" "4.23.3" + "@algolia/requester-node-http" "4.23.3" + "@algolia/transporter" "4.23.3" ansi-colors@^4.1.1: version "4.1.1" @@ -8830,27 +8775,27 @@ inquirer@^6.2.0, inquirer@^6.5.2: strip-ansi "^5.1.0" through "^2.3.6" -instantsearch-ui-components@0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/instantsearch-ui-components/-/instantsearch-ui-components-0.4.0.tgz#0aabc136107b1adac42bbb93c6dc3cfb1942b24e" - integrity sha512-Isa9Ankm89e9PUXsUto6TxYzcQpXKlWZMsKLXc//dO4i9q5JS8s0Es+c+U65jRLK2j1DiVlNx/Z6HshRIZwA8w== +instantsearch-ui-components@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/instantsearch-ui-components/-/instantsearch-ui-components-0.5.0.tgz#922e94a5a95b7c8a3bc8547a4090fa327a3ac279" + integrity sha512-iDdbAbPDyKZOCdOd4aiMkMVJ1WFhc+QU0dM0EIgfZqDYHFuw8XfyLakRK+S7YcQi4bomoqWZ4FiQ/gTFFWo4rQ== dependencies: "@babel/runtime" "^7.1.2" -instantsearch.js@4.66.1: - version "4.66.1" - resolved "https://registry.yarnpkg.com/instantsearch.js/-/instantsearch.js-4.66.1.tgz#cd83a56f9ac2a591fe5809ed1bd791513b1ee117" - integrity sha512-RXFLrDSVHTBXeaGrS9Gqb6Vo1a6U0iCoDzNsJDn2kzIGjzP/SaFVLMdFW5ewAgCn9EUPmP2yImQv7mqgzmxe/g== +instantsearch.js@4.68.0: + version "4.68.0" + resolved "https://registry.yarnpkg.com/instantsearch.js/-/instantsearch.js-4.68.0.tgz#8a2b57a17beaea3b1f8e0bafa1209a7e6c7dc8e9" + integrity sha512-eIh7jgXAd/TH3OBSgNmfXo6Dl2Apg05EKWqxrbOv0QCAKaouColPkmF6xujhNhjCUM/MVLyidMpSbGbEHa+GUw== dependencies: "@algolia/events" "^4.0.1" "@types/dom-speech-recognition" "^0.0.1" "@types/google.maps" "^3.45.3" "@types/hogan.js" "^3.0.0" "@types/qs" "^6.5.3" - algoliasearch-helper "3.17.0" + algoliasearch-helper "3.19.0" hogan.js "^3.0.2" htm "^3.0.0" - instantsearch-ui-components "0.4.0" + instantsearch-ui-components "0.5.0" preact "^10.10.0" qs "^6.5.1 < 6.10" search-insights "^2.13.0" @@ -10474,20 +10419,13 @@ magic-string@^0.25.0, magic-string@^0.25.7: dependencies: sourcemap-codec "^1.4.4" -magic-string@^0.30.10: +magic-string@^0.30.10, magic-string@^0.30.3, magic-string@^0.30.4, magic-string@^0.30.5, magic-string@^0.30.9: version "0.30.10" resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.10.tgz#123d9c41a0cb5640c892b041d4cfb3bd0aa4b39e" integrity sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ== dependencies: "@jridgewell/sourcemap-codec" "^1.4.15" -magic-string@^0.30.3, magic-string@^0.30.4, magic-string@^0.30.5, magic-string@^0.30.7, magic-string@^0.30.9: - version "0.30.9" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.9.tgz#8927ae21bfdd856310e07a1bc8dd5e73cb6c251d" - integrity sha512-S1+hd+dIrC8EZqKyT9DstTH/0Z+f76kmmvZnkfQVmOpDEF9iVgdYif3Q/pIWHmCoo59bQVGW0kVL3e2nl+9+Sw== - dependencies: - "@jridgewell/sourcemap-codec" "^1.4.15" - make-dir@^1.0.0: version "1.3.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" @@ -12161,7 +12099,7 @@ postcss-value-parser@^4.2.0: resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@^8.4.27, postcss@^8.4.35, postcss@^8.4.38: +postcss@^8.4.27, postcss@^8.4.38: version "8.4.38" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e" integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== @@ -14830,13 +14768,13 @@ vue-i18n@^9.11.0, vue-i18n@^9.7.1: "@intlify/shared" "9.11.1" "@vue/devtools-api" "^6.5.0" -vue-instantsearch@^4.15.0: - version "4.15.0" - resolved "https://registry.yarnpkg.com/vue-instantsearch/-/vue-instantsearch-4.15.0.tgz#313ca86436ee26d7fec35ac1d8ae2cda56d526f8" - integrity sha512-iiKwhpgw4wj23/+sdmw75Y81W6F5KdoWAAs4g1I7N+eCvrPRoVhzhb9DVwURj1aNCPQGla3Gh86BaMt/yAgLGQ== +vue-instantsearch@^4.16.1: + version "4.16.1" + resolved "https://registry.yarnpkg.com/vue-instantsearch/-/vue-instantsearch-4.16.1.tgz#bbffe6dcb71c2353a394d064131e7ff9c3858e9b" + integrity sha512-MO1y4tYHGZr+w4JOhH2UuB67mdXjFFEKpzbVGiAwfdy0isa+XWVDQVvjmNySbOx9YQoKb/vtDQ5uRYDY/RsRBg== dependencies: - instantsearch-ui-components "0.4.0" - instantsearch.js "4.66.1" + instantsearch-ui-components "0.5.0" + instantsearch.js "4.68.0" mitt "^2.1.0" vue-prism-component@^2.0.0: From 0db429726b3bfd6f85984c372fd4536436fdc754 Mon Sep 17 00:00:00 2001 From: Kael Date: Tue, 7 May 2024 22:14:27 +1000 Subject: [PATCH 015/122] fix(nested): correct prop types (#19758) --- packages/api-generator/src/types.ts | 3 ++ .../vuetify/src/components/VList/VList.tsx | 14 +++--- .../composables/nested/activeStrategies.ts | 30 ++++++----- .../vuetify/src/composables/nested/nested.ts | 50 +++++++++++++------ .../vuetify/src/labs/VTreeview/VTreeview.tsx | 6 +-- 5 files changed, 65 insertions(+), 38 deletions(-) diff --git a/packages/api-generator/src/types.ts b/packages/api-generator/src/types.ts index 76c410b852a..640bdf5ff52 100644 --- a/packages/api-generator/src/types.ts +++ b/packages/api-generator/src/types.ts @@ -309,6 +309,7 @@ function count (arr: string[], needle: string) { // Types that are displayed as links const allowedRefs = [ 'Anchor', + 'ActiveStrategy', 'DataIteratorItem', 'DataTableHeader', 'DataTableItem', @@ -319,9 +320,11 @@ const allowedRefs = [ 'ListItem', 'LocationStrategyFn', 'OpenSelectStrategyFn', + 'OpenStrategy', 'OpenStrategyFn', 'ScrollStrategyFn', 'SelectItemKey', + 'SelectStrategy', 'SelectStrategyFn', 'SortItem', 'SubmitEventPromise', diff --git a/packages/vuetify/src/components/VList/VList.tsx b/packages/vuetify/src/components/VList/VList.tsx index 868ee43d2cd..567728ccd1c 100644 --- a/packages/vuetify/src/components/VList/VList.tsx +++ b/packages/vuetify/src/components/VList/VList.tsx @@ -128,10 +128,10 @@ export const VList = genericComponent> itemChildren?: SelectItemKey> itemProps?: SelectItemKey> - selected?: readonly S[] - 'onUpdate:selected'?: (value: S[]) => void - opened?: readonly O[] - 'onUpdate:opened'?: (value: O[]) => void + selected?: S + 'onUpdate:selected'?: (value: S) => void + opened?: O + 'onUpdate:opened'?: (value: O) => void }, slots: VListChildrenSlots> ) => GenericProps>()({ @@ -140,9 +140,9 @@ export const VList = genericComponent true, - 'update:activated': (value: unknown[]) => true, - 'update:opened': (value: unknown[]) => true, + 'update:selected': (value: unknown) => true, + 'update:activated': (value: unknown) => true, + 'update:opened': (value: unknown) => true, 'click:open': (value: { id: unknown, value: boolean, path: unknown[] }) => true, 'click:activate': (value: { id: unknown, value: boolean, path: unknown[] }) => true, 'click:select': (value: { id: unknown, value: boolean, path: unknown[] }) => true, diff --git a/packages/vuetify/src/composables/nested/activeStrategies.ts b/packages/vuetify/src/composables/nested/activeStrategies.ts index 495cfcef2af..3487da0a779 100644 --- a/packages/vuetify/src/composables/nested/activeStrategies.ts +++ b/packages/vuetify/src/composables/nested/activeStrategies.ts @@ -1,6 +1,7 @@ /* eslint-disable sonarjs/no-identical-functions */ // Utilities import { toRaw } from 'vue' +import { wrapInArray } from '@/util' export type ActiveStrategyFn = (data: { id: unknown @@ -12,7 +13,7 @@ export type ActiveStrategyFn = (data: { }) => Set export type ActiveStrategyTransformInFn = ( - v: readonly unknown[] | undefined, + v: unknown | undefined, children: Map, parents: Map, ) => Set @@ -21,7 +22,7 @@ export type ActiveStrategyTransformOutFn = ( v: Set, children: Map, parents: Map, -) => unknown[] +) => unknown export type ActiveStrategy = { activate: ActiveStrategyFn @@ -49,14 +50,16 @@ export const independentActiveStrategy = (mandatory?: boolean): ActiveStrategy = in: (v, children, parents) => { let set = new Set() - for (const id of (v || [])) { - set = strategy.activate({ - id, - value: true, - activated: new Set(set), - children, - parents, - }) + if (v != null) { + for (const id of wrapInArray(v)) { + set = strategy.activate({ + id, + value: true, + activated: new Set(set), + children, + parents, + }) + } } return set @@ -81,8 +84,11 @@ export const independentSingleActiveStrategy = (mandatory?: boolean): ActiveStra in: (v, children, parents) => { let set = new Set() - if (v?.length) { - set = parentStrategy.in(v.slice(0, 1), children, parents) + if (v != null) { + const arr = wrapInArray(v) + if (arr.length) { + set = parentStrategy.in(arr.slice(0, 1), children, parents) + } } return set diff --git a/packages/vuetify/src/composables/nested/nested.ts b/packages/vuetify/src/composables/nested/nested.ts index aa006fa4f72..51adb784e56 100644 --- a/packages/vuetify/src/composables/nested/nested.ts +++ b/packages/vuetify/src/composables/nested/nested.ts @@ -5,7 +5,8 @@ import { useProxiedModel } from '@/composables/proxiedModel' import { computed, inject, onBeforeUnmount, provide, ref, shallowRef, toRaw, toRef } from 'vue' import { independentActiveStrategy, - independentSingleActiveStrategy, leafActiveStrategy, + independentSingleActiveStrategy, + leafActiveStrategy, leafSingleActiveStrategy, } from './activeStrategies' import { listOpenStrategy, multipleOpenStrategy, singleOpenStrategy } from './openStrategies' @@ -20,26 +21,41 @@ import { getCurrentInstance, getUid, propsFactory } from '@/util' // Types import type { InjectionKey, PropType, Ref } from 'vue' +import type { ActiveStrategy } from './activeStrategies' import type { OpenStrategy } from './openStrategies' -import type { SelectStrategyFn } from './selectStrategies' +import type { SelectStrategy } from './selectStrategies' import type { EventProp } from '@/util' -export type SelectStrategy = 'single-leaf' | 'leaf' | 'independent' | 'single-independent' | 'classic' | SelectStrategyFn +export type ActiveStrategyProp = + | 'single-leaf' + | 'leaf' + | 'independent' + | 'single-independent' + | ActiveStrategy + | ((mandatory: boolean) => ActiveStrategy) +export type SelectStrategyProp = + | 'single-leaf' + | 'leaf' + | 'independent' + | 'single-independent' + | 'classic' + | SelectStrategy + | ((mandatory: boolean) => SelectStrategy) export type OpenStrategyProp = 'single' | 'multiple' | 'list' | OpenStrategy export interface NestedProps { activatable: boolean selectable: boolean - activeStrategy: SelectStrategy | undefined - selectStrategy: SelectStrategy | undefined + activeStrategy: ActiveStrategyProp | undefined + selectStrategy: SelectStrategyProp | undefined openStrategy: OpenStrategyProp | undefined - activated: readonly unknown[] | undefined - selected: readonly unknown[] | undefined - opened: readonly unknown[] | undefined + activated: any + selected: any + opened: any mandatory: boolean - 'onUpdate:activated': EventProp<[unknown[]]> | undefined - 'onUpdate:selected': EventProp<[unknown[]]> | undefined - 'onUpdate:opened': EventProp<[unknown[]]> | undefined + 'onUpdate:activated': EventProp<[any]> | undefined + 'onUpdate:selected': EventProp<[any]> | undefined + 'onUpdate:opened': EventProp<[any]> | undefined } type NestedProvide = { @@ -88,12 +104,12 @@ export const emptyNested: NestedProvide = { export const makeNestedProps = propsFactory({ activatable: Boolean, selectable: Boolean, - activeStrategy: [String, Function] as PropType, - selectStrategy: [String, Function] as PropType, + activeStrategy: [String, Function, Object] as PropType, + selectStrategy: [String, Function, Object] as PropType, openStrategy: [String, Object] as PropType, - opened: Array as PropType, - activated: Array as PropType, - selected: Array as PropType, + opened: null, + activated: null, + selected: null, mandatory: Boolean, }, 'nested') @@ -106,6 +122,7 @@ export const useNested = (props: NestedProps) => { const activeStrategy = computed(() => { if (typeof props.activeStrategy === 'object') return props.activeStrategy + if (typeof props.activeStrategy === 'function') return props.activeStrategy(props.mandatory) switch (props.activeStrategy) { case 'leaf': return leafActiveStrategy(props.mandatory) @@ -118,6 +135,7 @@ export const useNested = (props: NestedProps) => { const selectStrategy = computed(() => { if (typeof props.selectStrategy === 'object') return props.selectStrategy + if (typeof props.selectStrategy === 'function') return props.selectStrategy(props.mandatory) switch (props.selectStrategy) { case 'single-leaf': return leafSingleSelectStrategy(props.mandatory) diff --git a/packages/vuetify/src/labs/VTreeview/VTreeview.tsx b/packages/vuetify/src/labs/VTreeview/VTreeview.tsx index 5feb99f56d9..693d45e41aa 100644 --- a/packages/vuetify/src/labs/VTreeview/VTreeview.tsx +++ b/packages/vuetify/src/labs/VTreeview/VTreeview.tsx @@ -51,9 +51,9 @@ export const VTreeview = genericComponent( props: makeVTreeviewProps(), emits: { - 'update:opened': (val: unknown[]) => true, - 'update:activated': (val: unknown[]) => true, - 'update:selected': (val: unknown[]) => true, + 'update:opened': (val: unknown) => true, + 'update:activated': (val: unknown) => true, + 'update:selected': (val: unknown) => true, 'click:open': (value: { id: unknown, value: boolean, path: unknown[] }) => true, 'click:select': (value: { id: unknown, value: boolean, path: unknown[] }) => true, }, From f2c605046ffa47c487c73c0c076ba706e5a0edc9 Mon Sep 17 00:00:00 2001 From: Yuchao Date: Tue, 7 May 2024 22:15:11 +1000 Subject: [PATCH 016/122] fix: pass template refs to slots as functions (#19731) fixes #19713 fixes #19685 Co-authored-by: Kael --- packages/api-generator/src/types.ts | 1 + .../VColorPicker/VColorPickerCanvas.tsx | 2 +- .../VDataTable/VDataTableVirtual.tsx | 5 +- .../VDatePicker/VDatePickerYears.tsx | 9 ++-- .../src/components/VOverlay/VOverlay.tsx | 8 ++- .../src/components/VOverlay/useActivator.tsx | 10 ++-- .../components/VSlideGroup/VSlideGroup.tsx | 50 +++++++++---------- .../VVirtualScroll/VVirtualScrollItem.tsx | 5 +- .../vuetify/src/composables/resizeObserver.ts | 13 ++--- packages/vuetify/src/util/helpers.ts | 23 +++++++++ 10 files changed, 74 insertions(+), 52 deletions(-) diff --git a/packages/api-generator/src/types.ts b/packages/api-generator/src/types.ts index 640bdf5ff52..0f14e001888 100644 --- a/packages/api-generator/src/types.ts +++ b/packages/api-generator/src/types.ts @@ -328,6 +328,7 @@ const allowedRefs = [ 'SelectStrategyFn', 'SortItem', 'SubmitEventPromise', + 'TemplateRef', 'TouchHandlers', 'ValidationRule', ] diff --git a/packages/vuetify/src/components/VColorPicker/VColorPickerCanvas.tsx b/packages/vuetify/src/components/VColorPicker/VColorPickerCanvas.tsx index 5b76f1fb410..fa3f6e32a04 100644 --- a/packages/vuetify/src/components/VColorPicker/VColorPickerCanvas.tsx +++ b/packages/vuetify/src/components/VColorPicker/VColorPickerCanvas.tsx @@ -80,7 +80,7 @@ export const VColorPickerCanvas = defineComponent({ }) const { resizeRef } = useResizeObserver(entries => { - if (!resizeRef.value?.offsetParent) return + if (!resizeRef.el?.offsetParent) return const { width, height } = entries[0].contentRect diff --git a/packages/vuetify/src/components/VDataTable/VDataTableVirtual.tsx b/packages/vuetify/src/components/VDataTable/VDataTableVirtual.tsx index dc2c3b1941a..bee0fb23013 100644 --- a/packages/vuetify/src/components/VDataTable/VDataTableVirtual.tsx +++ b/packages/vuetify/src/components/VDataTable/VDataTableVirtual.tsx @@ -23,12 +23,11 @@ import { computed, shallowRef, toRef } from 'vue' import { convertToUnit, genericComponent, propsFactory, useRender } from '@/util' // Types -import type { Ref } from 'vue' import type { VDataTableSlotProps } from './VDataTable' import type { VDataTableHeadersSlots } from './VDataTableHeaders' import type { VDataTableRowsSlots } from './VDataTableRows' import type { CellProps, RowProps } from '@/components/VDataTable/types' -import type { GenericProps, SelectItemKey } from '@/util' +import type { GenericProps, SelectItemKey, TemplateRef } from '@/util' type VDataTableVirtualSlotProps = Omit< VDataTableSlotProps, @@ -46,7 +45,7 @@ export type VDataTableVirtualSlots = VDataTableRowsSlots & VDataTableHeade 'body.prepend': VDataTableVirtualSlotProps 'body.append': VDataTableVirtualSlotProps item: { - itemRef: Ref + itemRef: TemplateRef } } diff --git a/packages/vuetify/src/components/VDatePicker/VDatePickerYears.tsx b/packages/vuetify/src/components/VDatePicker/VDatePickerYears.tsx index d596f29ab92..4910d073cd2 100644 --- a/packages/vuetify/src/components/VDatePicker/VDatePickerYears.tsx +++ b/packages/vuetify/src/components/VDatePicker/VDatePickerYears.tsx @@ -9,8 +9,8 @@ import { useDate } from '@/composables/date' import { useProxiedModel } from '@/composables/proxiedModel' // Utilities -import { computed, nextTick, onMounted, ref, watchEffect } from 'vue' -import { convertToUnit, createRange, genericComponent, propsFactory, useRender } from '@/util' +import { computed, nextTick, onMounted, watchEffect } from 'vue' +import { convertToUnit, createRange, genericComponent, propsFactory, templateRef, useRender } from '@/util' // Types import type { PropType } from 'vue' @@ -87,10 +87,11 @@ export const VDatePickerYears = genericComponent()({ model.value = model.value ?? adapter.getYear(adapter.date()) }) - const yearRef = ref() + const yearRef = templateRef() + onMounted(async () => { await nextTick() - yearRef.value?.$el.scrollIntoView({ block: 'center' }) + yearRef.el?.scrollIntoView({ block: 'center' }) }) useRender(() => ( diff --git a/packages/vuetify/src/components/VOverlay/VOverlay.tsx b/packages/vuetify/src/components/VOverlay/VOverlay.tsx index c683fffa6b2..75da73ed33b 100644 --- a/packages/vuetify/src/components/VOverlay/VOverlay.tsx +++ b/packages/vuetify/src/components/VOverlay/VOverlay.tsx @@ -46,11 +46,9 @@ import { } from '@/util' // Types -import type { - ComponentPublicInstance, PropType, - Ref, -} from 'vue' +import type { PropType, Ref } from 'vue' import type { BackgroundColorData } from '@/composables/color' +import type { TemplateRef } from '@/util' interface ScrimProps { [key: string]: unknown @@ -77,7 +75,7 @@ function Scrim (props: ScrimProps) { export type OverlaySlots = { default: { isActive: Ref } - activator: { isActive: boolean, props: Record, targetRef: Ref | HTMLElement> } + activator: { isActive: boolean, props: Record, targetRef: TemplateRef } } export const makeVOverlayProps = propsFactory({ diff --git a/packages/vuetify/src/components/VOverlay/useActivator.tsx b/packages/vuetify/src/components/VOverlay/useActivator.tsx index b1555ee3c48..0bf11e5ac86 100644 --- a/packages/vuetify/src/components/VOverlay/useActivator.tsx +++ b/packages/vuetify/src/components/VOverlay/useActivator.tsx @@ -22,7 +22,7 @@ import { IN_BROWSER, matchesSelector, propsFactory, - refElement, + templateRef, unbindProps, } from '@/util' @@ -228,19 +228,19 @@ export function useActivator ( } }, { flush: 'post' }) - const activatorRef = ref() + const activatorRef = templateRef() watchEffect(() => { if (!activatorRef.value) return nextTick(() => { - activatorEl.value = refElement(activatorRef.value) + activatorEl.value = activatorRef.el }) }) - const targetRef = ref | HTMLElement>() + const targetRef = templateRef() const target = computed(() => { if (props.target === 'cursor' && cursorTarget.value) return cursorTarget.value - if (targetRef.value) return refElement(targetRef.value) + if (targetRef.value) return targetRef.el return getTarget(props.target, vm) || activatorEl.value }) const targetEl = computed(() => { diff --git a/packages/vuetify/src/components/VSlideGroup/VSlideGroup.tsx b/packages/vuetify/src/components/VSlideGroup/VSlideGroup.tsx index 0fa926635c9..dee0b516718 100644 --- a/packages/vuetify/src/components/VSlideGroup/VSlideGroup.tsx +++ b/packages/vuetify/src/components/VSlideGroup/VSlideGroup.tsx @@ -116,7 +116,7 @@ export const VSlideGroup = genericComponent( const goTo = useGoTo() const goToOptions = computed>(() => { return { - container: containerRef.value, + container: containerRef.el, duration: 200, easing: 'easeOutQuart', } @@ -148,9 +148,9 @@ export const VSlideGroup = genericComponent( isOverflowing.value = containerSize.value + 1 < contentSize.value } - if (firstSelectedIndex.value >= 0 && contentRef.value) { + if (firstSelectedIndex.value >= 0 && contentRef.el) { // TODO: Is this too naive? Should we store element references in group composable? - const selectedElement = contentRef.value.children[lastSelectedIndex.value] as HTMLElement + const selectedElement = contentRef.el.children[lastSelectedIndex.value] as HTMLElement scrollToChildren(selectedElement, props.centerActive) } @@ -165,13 +165,13 @@ export const VSlideGroup = genericComponent( if (center) { target = calculateCenteredTarget({ - containerElement: containerRef.value!, + containerElement: containerRef.el!, isHorizontal: isHorizontal.value, selectedElement: children, }) } else { target = calculateUpdatedTarget({ - containerElement: containerRef.value!, + containerElement: containerRef.el!, isHorizontal: isHorizontal.value, isRtl: isRtl.value, selectedElement: children, @@ -182,11 +182,11 @@ export const VSlideGroup = genericComponent( } function scrollToPosition (newPosition: number) { - if (!IN_BROWSER || !containerRef.value) return + if (!IN_BROWSER || !containerRef.el) return - const offsetSize = getOffsetSize(isHorizontal.value, containerRef.value) - const scrollPosition = getScrollPosition(isHorizontal.value, isRtl.value, containerRef.value) - const scrollSize = getScrollSize(isHorizontal.value, containerRef.value) + const offsetSize = getOffsetSize(isHorizontal.value, containerRef.el) + const scrollPosition = getScrollPosition(isHorizontal.value, isRtl.value, containerRef.el) + const scrollSize = getScrollSize(isHorizontal.value, containerRef.el) if ( scrollSize <= offsetSize || @@ -194,8 +194,8 @@ export const VSlideGroup = genericComponent( Math.abs(newPosition - scrollPosition) < 16 ) return - if (isHorizontal.value && isRtl.value && containerRef.value) { - const { scrollWidth, offsetWidth: containerWidth } = containerRef.value! + if (isHorizontal.value && isRtl.value && containerRef.el) { + const { scrollWidth, offsetWidth: containerWidth } = containerRef.el! newPosition = (scrollWidth - containerWidth) - newPosition } @@ -216,12 +216,12 @@ export const VSlideGroup = genericComponent( function onFocusin (e: FocusEvent) { isFocused.value = true - if (!isOverflowing.value || !contentRef.value) return + if (!isOverflowing.value || !contentRef.el) return // Focused element is likely to be the root of an item, so a // breadth-first search will probably find it in the first iteration for (const el of e.composedPath()) { - for (const item of contentRef.value.children) { + for (const item of contentRef.el.children) { if (item === el) { scrollToChildren(item as HTMLElement) return @@ -240,7 +240,7 @@ export const VSlideGroup = genericComponent( if ( !ignoreFocusEvent && !isFocused.value && - !(e.relatedTarget && contentRef.value?.contains(e.relatedTarget as Node)) + !(e.relatedTarget && contentRef.el?.contains(e.relatedTarget as Node)) ) focus() ignoreFocusEvent = false @@ -251,7 +251,7 @@ export const VSlideGroup = genericComponent( } function onKeydown (e: KeyboardEvent) { - if (!contentRef.value) return + if (!contentRef.el) return function toFocus (location: Parameters[0]) { e.preventDefault() @@ -280,25 +280,25 @@ export const VSlideGroup = genericComponent( } function focus (location?: 'next' | 'prev' | 'first' | 'last') { - if (!contentRef.value) return + if (!contentRef.el) return let el: HTMLElement | undefined if (!location) { - const focusable = focusableChildren(contentRef.value) + const focusable = focusableChildren(contentRef.el) el = focusable[0] } else if (location === 'next') { - el = contentRef.value.querySelector(':focus')?.nextElementSibling as HTMLElement | undefined + el = contentRef.el.querySelector(':focus')?.nextElementSibling as HTMLElement | undefined if (!el) return focus('first') } else if (location === 'prev') { - el = contentRef.value.querySelector(':focus')?.previousElementSibling as HTMLElement | undefined + el = contentRef.el.querySelector(':focus')?.previousElementSibling as HTMLElement | undefined if (!el) return focus('last') } else if (location === 'first') { - el = (contentRef.value.firstElementChild as HTMLElement) + el = (contentRef.el.firstElementChild as HTMLElement) } else if (location === 'last') { - el = (contentRef.value.lastElementChild as HTMLElement) + el = (contentRef.el.lastElementChild as HTMLElement) } if (el) { @@ -314,8 +314,8 @@ export const VSlideGroup = genericComponent( let newPosition = scrollOffset.value + offsetStep // TODO: improve it - if (isHorizontal.value && isRtl.value && containerRef.value) { - const { scrollWidth, offsetWidth: containerWidth } = containerRef.value! + if (isHorizontal.value && isRtl.value && containerRef.el) { + const { scrollWidth, offsetWidth: containerWidth } = containerRef.el! newPosition += scrollWidth - containerWidth } @@ -366,8 +366,8 @@ export const VSlideGroup = genericComponent( const hasNext = computed(() => { if (!containerRef.value) return false - const scrollSize = getScrollSize(isHorizontal.value, containerRef.value) - const clientSize = getClientSize(isHorizontal.value, containerRef.value) + const scrollSize = getScrollSize(isHorizontal.value, containerRef.el) + const clientSize = getClientSize(isHorizontal.value, containerRef.el) const scrollSizeMax = scrollSize - clientSize diff --git a/packages/vuetify/src/components/VVirtualScroll/VVirtualScrollItem.tsx b/packages/vuetify/src/components/VVirtualScroll/VVirtualScrollItem.tsx index 28cb31df9ca..a7327248cf0 100644 --- a/packages/vuetify/src/components/VVirtualScroll/VVirtualScrollItem.tsx +++ b/packages/vuetify/src/components/VVirtualScroll/VVirtualScrollItem.tsx @@ -7,8 +7,7 @@ import { watch } from 'vue' import { genericComponent, propsFactory, useRender } from '@/util' // Types -import type { Ref } from 'vue' -import type { GenericProps } from '@/util' +import type { GenericProps, TemplateRef } from '@/util' export const makeVVirtualScrollItemProps = propsFactory({ renderless: Boolean, @@ -22,7 +21,7 @@ export const VVirtualScrollItem = genericComponent + itemRef: TemplateRef } : never } ) => GenericProps>()({ diff --git a/packages/vuetify/src/composables/resizeObserver.ts b/packages/vuetify/src/composables/resizeObserver.ts index f9a6db1a0af..3652e258872 100644 --- a/packages/vuetify/src/composables/resizeObserver.ts +++ b/packages/vuetify/src/composables/resizeObserver.ts @@ -1,18 +1,19 @@ // Utilities import { onBeforeUnmount, readonly, ref, watch } from 'vue' -import { refElement } from '@/util' +import { templateRef } from '@/util' import { IN_BROWSER } from '@/util/globals' // Types import type { DeepReadonly, Ref } from 'vue' +import type { TemplateRef } from '@/util' interface ResizeState { - resizeRef: Ref + resizeRef: TemplateRef contentRect: DeepReadonly> } export function useResizeObserver (callback?: ResizeObserverCallback, box: 'content' | 'border' = 'content'): ResizeState { - const resizeRef = ref() + const resizeRef = templateRef() const contentRect = ref() if (IN_BROWSER) { @@ -32,13 +33,13 @@ export function useResizeObserver (callback?: ResizeObserverCallback, box: 'cont observer.disconnect() }) - watch(resizeRef, (newValue, oldValue) => { + watch(() => resizeRef.el, (newValue, oldValue) => { if (oldValue) { - observer.unobserve(refElement(oldValue) as Element) + observer.unobserve(oldValue) contentRect.value = undefined } - if (newValue) observer.observe(refElement(newValue) as Element) + if (newValue) observer.observe(newValue) }, { flush: 'post', }) diff --git a/packages/vuetify/src/util/helpers.ts b/packages/vuetify/src/util/helpers.ts index cb60134d49a..cfff79aa004 100644 --- a/packages/vuetify/src/util/helpers.ts +++ b/packages/vuetify/src/util/helpers.ts @@ -735,3 +735,26 @@ export function isClickInsideElement (event: MouseEvent, targetDiv: HTMLElement) return mouseX >= divLeft && mouseX <= divRight && mouseY >= divTop && mouseY <= divBottom } + +export type TemplateRef = { + (target: Element | ComponentPublicInstance | null): void + value: HTMLElement | ComponentPublicInstance | null | undefined + readonly el: HTMLElement | undefined +} +export function templateRef () { + const el = shallowRef() + const fn = (target: HTMLElement | ComponentPublicInstance | null) => { + el.value = target + } + Object.defineProperty(fn, 'value', { + enumerable: true, + get: () => el.value, + set: val => el.value = val, + }) + Object.defineProperty(fn, 'el', { + enumerable: true, + get: () => refElement(el.value), + }) + + return fn as TemplateRef +} From 49fc5c59d153032dabe41d711f863841e0ce75c3 Mon Sep 17 00:00:00 2001 From: John Leider Date: Tue, 7 May 2024 10:30:24 -0500 Subject: [PATCH 017/122] fix(VStepperWindow/Item/VTabsWindow): add missing class / style passthrough --- packages/vuetify/src/components/VStepper/VStepperWindow.tsx | 6 +++++- .../vuetify/src/components/VStepper/VStepperWindowItem.tsx | 6 +++++- packages/vuetify/src/components/VTabs/VTabsWindow.tsx | 6 +++++- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/packages/vuetify/src/components/VStepper/VStepperWindow.tsx b/packages/vuetify/src/components/VStepper/VStepperWindow.tsx index 87a8a338023..b59f2da9023 100644 --- a/packages/vuetify/src/components/VStepper/VStepperWindow.tsx +++ b/packages/vuetify/src/components/VStepper/VStepperWindow.tsx @@ -54,7 +54,11 @@ export const VStepperWindow = genericComponent()({ _as="VStepperWindow" { ...windowProps } v-model={ model.value } - class="v-stepper-window" + class={[ + 'v-stepper-window', + props.class, + ]} + style={ props.style } mandatory={ false } touch={ false } v-slots={ slots } diff --git a/packages/vuetify/src/components/VStepper/VStepperWindowItem.tsx b/packages/vuetify/src/components/VStepper/VStepperWindowItem.tsx index 55f7e6631c7..4adebdaff3d 100644 --- a/packages/vuetify/src/components/VStepper/VStepperWindowItem.tsx +++ b/packages/vuetify/src/components/VStepper/VStepperWindowItem.tsx @@ -21,7 +21,11 @@ export const VStepperWindowItem = genericComponent()({ ) diff --git a/packages/vuetify/src/components/VTabs/VTabsWindow.tsx b/packages/vuetify/src/components/VTabs/VTabsWindow.tsx index ea39d0b36a6..df9fb72b680 100644 --- a/packages/vuetify/src/components/VTabs/VTabsWindow.tsx +++ b/packages/vuetify/src/components/VTabs/VTabsWindow.tsx @@ -51,7 +51,11 @@ export const VTabsWindow = genericComponent()({ _as="VTabsWindow" { ...windowProps } v-model={ model.value } - class="v-tabs-window" + class={[ + 'v-tabs-window', + props.class, + ]} + style={ props.style } mandatory={ false } touch={ false } v-slots={ slots } From 7c6439280e9686f46e787ed0bc1ac5b70b954edf Mon Sep 17 00:00:00 2001 From: Zhaolin Liang Date: Tue, 7 May 2024 23:40:34 +0800 Subject: [PATCH 018/122] fix(VDataTable): correctly update the value of showSelectAll (#19762) fixes #19069 --- .../components/VDataTable/VDataTableHeaders.tsx | 2 +- .../VDataTable/__tests__/VDataTable.spec.cy.tsx | 14 ++++++++++++++ .../components/VDataTable/composables/select.ts | 3 ++- 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/packages/vuetify/src/components/VDataTable/VDataTableHeaders.tsx b/packages/vuetify/src/components/VDataTable/VDataTableHeaders.tsx index c2755cd9619..d075842d788 100644 --- a/packages/vuetify/src/components/VDataTable/VDataTableHeaders.tsx +++ b/packages/vuetify/src/components/VDataTable/VDataTableHeaders.tsx @@ -180,7 +180,7 @@ export const VDataTableHeaders = genericComponent()({ if (slots[columnSlotName]) return slots[columnSlotName]!(columnSlotProps) if (column.key === 'data-table-select') { - return slots['header.data-table-select']?.(columnSlotProps) ?? (showSelectAll && ( + return slots['header.data-table-select']?.(columnSlotProps) ?? (showSelectAll.value && ( { .should('deep.equal', [[2], [1]]) }) + // https://github.com/vuetifyjs/vuetify/issues/19069 + it('should update the select all checkbox when changing the select-strategy', () => { + const strategy = ref('single') + cy.mount(() => ( + + + + )).get('thead .v-selection-control').should('not.exist') + .then(() => strategy.value = 'all') + .get('thead .v-selection-control').should('exist') + .then(() => strategy.value = 'page') + .get('thead .v-selection-control').should('exist') + }) + describe('slots', () => { it('should have top slot', () => { cy.mount(() => ( diff --git a/packages/vuetify/src/components/VDataTable/composables/select.ts b/packages/vuetify/src/components/VDataTable/composables/select.ts index 419aecef2fb..fcea69f19a7 100644 --- a/packages/vuetify/src/components/VDataTable/composables/select.ts +++ b/packages/vuetify/src/components/VDataTable/composables/select.ts @@ -163,6 +163,7 @@ export function provideSelection ( }) return !!items.length && isSelected(items) }) + const showSelectAll = computed(() => selectStrategy.value.showSelectAll) const data = { toggleSelect, @@ -172,7 +173,7 @@ export function provideSelection ( isSomeSelected, someSelected, allSelected, - showSelectAll: selectStrategy.value.showSelectAll, + showSelectAll, } provide(VDataTableSelectionSymbol, data) From 21e9f5e74267706cc4eebf351a27889563e89047 Mon Sep 17 00:00:00 2001 From: "Adrian D. Alvarez" <06b@users.noreply.github.com> Date: Tue, 7 May 2024 11:53:08 -0400 Subject: [PATCH 019/122] fix(VSlider): render in forced-colors mode (#19706) fixes #19705 Co-authored-by: John Leider --- .../vuetify/src/components/VSlider/VSliderThumb.sass | 3 +++ .../vuetify/src/components/VSlider/VSliderTrack.sass | 9 +++++++++ 2 files changed, 12 insertions(+) diff --git a/packages/vuetify/src/components/VSlider/VSliderThumb.sass b/packages/vuetify/src/components/VSlider/VSliderThumb.sass index 977d221cd3d..2d9b5a15605 100644 --- a/packages/vuetify/src/components/VSlider/VSliderThumb.sass +++ b/packages/vuetify/src/components/VSlider/VSliderThumb.sass @@ -35,6 +35,9 @@ user-select: none background-color: currentColor + @media (forced-colors: active) + background-color: highlight + &::before transition: 0.3s settings.$standard-easing content: '' diff --git a/packages/vuetify/src/components/VSlider/VSliderTrack.sass b/packages/vuetify/src/components/VSlider/VSliderTrack.sass index 0e457ac997d..167b4a48871 100644 --- a/packages/vuetify/src/components/VSlider/VSliderTrack.sass +++ b/packages/vuetify/src/components/VSlider/VSliderTrack.sass @@ -9,9 +9,15 @@ .v-slider-track__background background-color: rgb(var(--v-theme-surface-variant)) + @media (forced-colors: active) + background-color: highlight + .v-slider-track__fill background-color: rgb(var(--v-theme-surface-variant)) + @media (forced-colors: active) + background-color: highlight + .v-slider-track__tick background-color: rgb(var(--v-theme-surface-variant)) @@ -22,6 +28,9 @@ .v-slider-track border-radius: $slider-track-border-radius + @media (forced-colors: active) + border: thin solid buttontext + .v-slider-track &__background, &__fill position: absolute From c4b33c011fc4d2c869284e1afca01121c3d273c6 Mon Sep 17 00:00:00 2001 From: WebDevNerdStuff Date: Tue, 7 May 2024 09:02:01 -0700 Subject: [PATCH 020/122] fix(VDataTable): header title font weight (#19742) fixes #19737 --- packages/vuetify/src/components/VDataTable/VDataTable.sass | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/vuetify/src/components/VDataTable/VDataTable.sass b/packages/vuetify/src/components/VDataTable/VDataTable.sass index 63025c0a5de..2f619910dfe 100644 --- a/packages/vuetify/src/components/VDataTable/VDataTable.sass +++ b/packages/vuetify/src/components/VDataTable/VDataTable.sass @@ -2,6 +2,7 @@ @use '../../styles/tools' @use '../../components/VTable/variables' as * @use './variables' as * +@use '../VTable/variables' as VTable @include tools.layer('components') .v-data-table @@ -147,7 +148,7 @@ border-bottom: 0 !important .v-data-table__td-title - font-weight: bold + font-weight: VTable.$table-header-font-weight text-align: left .v-data-table__td-value From 5a39b60ac261c0de4f71c36f76565f0d8aa69e87 Mon Sep 17 00:00:00 2001 From: SonTT19 <49301480+SonTT19@users.noreply.github.com> Date: Tue, 7 May 2024 23:13:54 +0700 Subject: [PATCH 021/122] fix(VCalendar): add theme background color (#19745) fixes #18988 Co-authored-by: John Leider --- packages/vuetify/src/labs/VCalendar/VCalendar.sass | 5 +++-- packages/vuetify/src/labs/VCalendar/_variables.scss | 8 ++++++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/packages/vuetify/src/labs/VCalendar/VCalendar.sass b/packages/vuetify/src/labs/VCalendar/VCalendar.sass index ebadddd2877..ae0a5318eb6 100644 --- a/packages/vuetify/src/labs/VCalendar/VCalendar.sass +++ b/packages/vuetify/src/labs/VCalendar/VCalendar.sass @@ -2,6 +2,9 @@ @use './variables' as * @include tools.layer('components') + .v-calendar + @include tools.theme($calendar-theme...) + .v-calendar-weekly width: 100% height: 100% @@ -9,8 +12,6 @@ flex-direction: column // https://github.com/vuetifyjs/vuetify/issues/8319 min-height: 0 - // Themed - background-color: #fff .v-calendar__container border-top: $calendar-line-width solid $calendar-line-color diff --git a/packages/vuetify/src/labs/VCalendar/_variables.scss b/packages/vuetify/src/labs/VCalendar/_variables.scss index e362a2098ce..e79f55c804a 100644 --- a/packages/vuetify/src/labs/VCalendar/_variables.scss +++ b/packages/vuetify/src/labs/VCalendar/_variables.scss @@ -1,3 +1,6 @@ +$calendar-color: rgba(var(--v-theme-on-background), var(--v-high-emphasis-opacity)) !default; +$calendar-background: rgb(var(--v-theme-background)) !default; + $calendar-line-width: thin !default; $calendar-line-color: #e0e0e0 !default; @@ -45,3 +48,8 @@ $calendar-event-border-width: 1px !default; $calendar-event-font-size: 12px !default; $calendar-event-line-height: 20px !default; $calendar-event-right-empty: 10px !default; + +$calendar-theme: ( + $calendar-background, + $calendar-color +) !default; From 183a2f9536810562a14f88958b63bc6073a6ba35 Mon Sep 17 00:00:00 2001 From: John Leider Date: Tue, 7 May 2024 11:14:06 -0500 Subject: [PATCH 022/122] fix(VSheet): base color off of on-surface istead of on-background --- packages/vuetify/src/components/VSheet/_variables.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vuetify/src/components/VSheet/_variables.scss b/packages/vuetify/src/components/VSheet/_variables.scss index 60b8f3ab839..a6ed9b2c767 100644 --- a/packages/vuetify/src/components/VSheet/_variables.scss +++ b/packages/vuetify/src/components/VSheet/_variables.scss @@ -7,7 +7,7 @@ $sheet-border-radius: 0 !default; $sheet-border-style: settings.$border-style-root !default; $sheet-border-thin-width: thin !default; $sheet-border-width: 0 !default; -$sheet-color: rgba(var(--v-theme-on-background), var(--v-high-emphasis-opacity)) !default; +$sheet-color: rgba(var(--v-theme-on-surface), var(--v-high-emphasis-opacity)) !default; $sheet-elevation: 0 !default; $sheet-positions: absolute fixed relative sticky !default; $sheet-rounded-border-radius: settings.$border-radius-root !default; From e577b5ad05851b100a83704383a9b3433a2f957d Mon Sep 17 00:00:00 2001 From: John Leider Date: Tue, 7 May 2024 11:31:08 -0500 Subject: [PATCH 023/122] docs(team): fix focus link --- packages/docs/src/data/team.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/docs/src/data/team.json b/packages/docs/src/data/team.json index 86a2ff2a029..69bdddd4f29 100644 --- a/packages/docs/src/data/team.json +++ b/packages/docs/src/data/team.json @@ -39,7 +39,7 @@ "avatar": "https://cdn.vuetifyjs.com/docs/images/team/alexandria.jpg", "discord": "alexandriajackson_", "focus": [ - "vuetifyjs/*" + "[vuetifyjs/*](https://github.com/vuetifyjs)" ], "languages": [ "English" From b7a4c360c69db9f69156bcfbb6c909ee8c8a1699 Mon Sep 17 00:00:00 2001 From: NassBin Date: Tue, 7 May 2024 18:43:32 +0200 Subject: [PATCH 024/122] fix(VInfiniteScroll): do not emit load event if status is empty (#19764) fixes #18895 Co-authored-by: John Leider --- .../vuetify/src/components/VInfiniteScroll/VInfiniteScroll.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vuetify/src/components/VInfiniteScroll/VInfiniteScroll.tsx b/packages/vuetify/src/components/VInfiniteScroll/VInfiniteScroll.tsx index c3fb7f5b7cb..50924090ab9 100644 --- a/packages/vuetify/src/components/VInfiniteScroll/VInfiniteScroll.tsx +++ b/packages/vuetify/src/components/VInfiniteScroll/VInfiniteScroll.tsx @@ -177,7 +177,7 @@ export const VInfiniteScroll = genericComponent()({ if (props.mode !== 'manual' && !isIntersecting.value) return const status = getStatus(side) - if (!rootEl.value || status === 'loading') return + if (!rootEl.value || ['empty', 'loading'].includes(status)) return previousScrollSize = getScrollSize() setStatus(side, 'loading') From 767ecdcedd75a6d28379ee4058b8c3b70bb66feb Mon Sep 17 00:00:00 2001 From: John Leider Date: Tue, 7 May 2024 12:17:25 -0500 Subject: [PATCH 025/122] chore(release): publish v3.6.4 --- lerna.json | 2 +- packages/api-generator/package.json | 4 ++-- packages/docs/package.json | 6 +++--- packages/vuetify/package.json | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/lerna.json b/lerna.json index d731f79c2b7..97dcc3b9a4f 100644 --- a/lerna.json +++ b/lerna.json @@ -13,6 +13,6 @@ } }, "npmClient": "yarn", - "version": "3.6.3", + "version": "3.6.4", "useWorkspaces": true } diff --git a/packages/api-generator/package.json b/packages/api-generator/package.json index 113dae776c2..7b5030b27f9 100755 --- a/packages/api-generator/package.json +++ b/packages/api-generator/package.json @@ -1,6 +1,6 @@ { "name": "@vuetify/api-generator", - "version": "3.6.3", + "version": "3.6.4", "private": true, "description": "", "scripts": { @@ -17,7 +17,7 @@ "ts-morph": "^22.0.0", "tsx": "^4.7.2", "vue": "^3.4.27", - "vuetify": "^3.6.3" + "vuetify": "^3.6.4" }, "devDependencies": { "@types/stringify-object": "^4.0.5" diff --git a/packages/docs/package.json b/packages/docs/package.json index 2d39be53f3d..d3ed4af0118 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -3,7 +3,7 @@ "description": "A Vue.js project", "private": true, "author": "John Leider ", - "version": "3.6.3", + "version": "3.6.4", "repository": { "type": "git", "url": "git+https://github.com/vuetifyjs/vuetify.git", @@ -38,7 +38,7 @@ "vue-i18n": "^9.11.0", "vue-instantsearch": "^4.16.1", "vue-prism-component": "^2.0.0", - "vuetify": "^3.6.3" + "vuetify": "^3.6.4" }, "devDependencies": { "@emailjs/browser": "^4.3.3", @@ -50,7 +50,7 @@ "@vitejs/plugin-basic-ssl": "^1.1.0", "@vitejs/plugin-vue": "^5.0.4", "@vue/compiler-sfc": "^3.4.27", - "@vuetify/api-generator": "^3.6.3", + "@vuetify/api-generator": "^3.6.4", "ajv": "^8.12.0", "async-es": "^3.2.5", "date-fns": "^3.6.0", diff --git a/packages/vuetify/package.json b/packages/vuetify/package.json index 1b82b1f18ed..a6fb9e68887 100755 --- a/packages/vuetify/package.json +++ b/packages/vuetify/package.json @@ -1,7 +1,7 @@ { "name": "vuetify", "description": "Vue Material Component Framework", - "version": "3.6.3", + "version": "3.6.4", "author": { "name": "John Leider", "email": "john@vuetifyjs.com" From 3d9deb7db53e70e0605b76f270f7d962d38f09e4 Mon Sep 17 00:00:00 2001 From: John Leider Date: Wed, 8 May 2024 15:37:19 -0500 Subject: [PATCH 026/122] fix(VStepper): do not spread raw property onto VStepperItem --- packages/vuetify/src/components/VStepper/VStepper.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vuetify/src/components/VStepper/VStepper.tsx b/packages/vuetify/src/components/VStepper/VStepper.tsx index 485280360cf..4e2fa4ebce2 100644 --- a/packages/vuetify/src/components/VStepper/VStepper.tsx +++ b/packages/vuetify/src/components/VStepper/VStepper.tsx @@ -150,7 +150,7 @@ export const VStepper = genericComponent()({ > { hasHeader && ( - { items.value.map((item, index) => ( + { items.value.map(({ raw, ...item }, index) => ( <> { !!index && () } From 34bb2020124553436691d7542ca77948452d7fab Mon Sep 17 00:00:00 2001 From: John Leider Date: Wed, 8 May 2024 16:10:41 -0500 Subject: [PATCH 027/122] fix(VStepper): only show edit icon if editable and selected --- packages/vuetify/src/components/VStepper/VStepperItem.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vuetify/src/components/VStepper/VStepperItem.tsx b/packages/vuetify/src/components/VStepper/VStepperItem.tsx index 7f7b5757742..ba3a583a820 100644 --- a/packages/vuetify/src/components/VStepper/VStepperItem.tsx +++ b/packages/vuetify/src/components/VStepper/VStepperItem.tsx @@ -91,7 +91,7 @@ export const VStepperItem = genericComponent()({ const icon = computed(() => { if (hasError.value) return props.errorIcon if (hasCompleted.value) return props.completeIcon - if (props.editable) return props.editIcon + if (group.isSelected.value && props.editable) return props.editIcon return props.icon }) From da6d5f3cd2d54bf6ad652688b61c9626933d969d Mon Sep 17 00:00:00 2001 From: John Leider Date: Wed, 8 May 2024 16:17:49 -0500 Subject: [PATCH 028/122] fix(VStepper): add missing non-linear styles --- packages/vuetify/src/components/VStepper/VStepperItem.sass | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/vuetify/src/components/VStepper/VStepperItem.sass b/packages/vuetify/src/components/VStepper/VStepperItem.sass index 26b21fd56ea..117d805b12b 100644 --- a/packages/vuetify/src/components/VStepper/VStepperItem.sass +++ b/packages/vuetify/src/components/VStepper/VStepperItem.sass @@ -14,6 +14,9 @@ transition-property: $stepper-item-transition-property transition-timing-function: $stepper-item-transition-timing-function + .v-stepper--non-linear & + opacity: var(--v-high-emphasis-opacity) + &--selected opacity: 1 From b45ab1aff93965c31a88cb567d83f934dac00e1d Mon Sep 17 00:00:00 2001 From: John Leider Date: Wed, 8 May 2024 16:34:54 -0500 Subject: [PATCH 029/122] fix(VStepper): add missing hover and focus styling --- .../src/components/VStepper/VStepperItem.sass | 15 +++++++++++++++ .../src/components/VStepper/VStepperItem.tsx | 4 ++++ 2 files changed, 19 insertions(+) diff --git a/packages/vuetify/src/components/VStepper/VStepperItem.sass b/packages/vuetify/src/components/VStepper/VStepperItem.sass index 117d805b12b..78ce758462d 100644 --- a/packages/vuetify/src/components/VStepper/VStepperItem.sass +++ b/packages/vuetify/src/components/VStepper/VStepperItem.sass @@ -8,12 +8,16 @@ align-self: stretch display: inline-flex flex: none + outline: none opacity: $stepper-item-opacity padding: $stepper-item-padding + position: relative transition-duration: $stepper-item-transition-duration transition-property: $stepper-item-transition-property transition-timing-function: $stepper-item-transition-timing-function + @include tools.states('.v-stepper-item__overlay') + .v-stepper--non-linear & opacity: var(--v-high-emphasis-opacity) @@ -74,3 +78,14 @@ .v-stepper--mobile & display: none + + .v-stepper-item__overlay + background-color: currentColor + border-radius: inherit + opacity: 0 + transition: opacity .2s ease-in-out + + .v-stepper-item__overlay, + .v-stepper-item__underlay + @include tools.absolute() + pointer-events: none diff --git a/packages/vuetify/src/components/VStepper/VStepperItem.tsx b/packages/vuetify/src/components/VStepper/VStepperItem.tsx index ba3a583a820..129bc0395c0 100644 --- a/packages/vuetify/src/components/VStepper/VStepperItem.tsx +++ b/packages/vuetify/src/components/VStepper/VStepperItem.tsx @@ -7,6 +7,7 @@ import { VIcon } from '@/components/VIcon/VIcon' // Composables import { makeGroupItemProps, useGroupItem } from '@/composables/group' +import { genOverlays } from '@/composables/variant' // Directives import { Ripple } from '@/directives/ripple' @@ -85,6 +86,7 @@ export const VStepperItem = genericComponent()({ const group = useGroupItem(props, VStepperSymbol, true) const step = computed(() => group?.value.value ?? props.value) const isValid = computed(() => props.rules.every(handler => handler() === true)) + const isClickable = computed(() => !props.disabled && props.editable) const canEdit = computed(() => !props.disabled && props.editable) const hasError = computed(() => props.error || !isValid.value) const hasCompleted = computed(() => props.complete || (props.rules.length > 0 && isValid.value)) @@ -141,6 +143,8 @@ export const VStepperItem = genericComponent()({ ]} onClick={ onClick } > + { isClickable.value && genOverlays(true, 'v-stepper-item') } + Date: Thu, 9 May 2024 13:25:30 +1000 Subject: [PATCH 030/122] fix(VFileInput): allow dirty prop to trigger dirty state fixes #19699 --- packages/vuetify/src/components/VFileInput/VFileInput.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vuetify/src/components/VFileInput/VFileInput.tsx b/packages/vuetify/src/components/VFileInput/VFileInput.tsx index b074aa85f75..57f8bc29c2d 100644 --- a/packages/vuetify/src/components/VFileInput/VFileInput.tsx +++ b/packages/vuetify/src/components/VFileInput/VFileInput.tsx @@ -211,7 +211,7 @@ export const VFileInput = genericComponent()({ { ...fieldProps } id={ id.value } active={ isActive.value || isDirty.value } - dirty={ isDirty.value } + dirty={ isDirty.value || props.dirty } disabled={ isDisabled.value } focused={ isFocused.value } error={ isValid.value === false } From a6340ac592fd3435c81f35b36eb60861cd426d02 Mon Sep 17 00:00:00 2001 From: Andrew Henry Date: Thu, 9 May 2024 11:55:50 -0400 Subject: [PATCH 031/122] fix(VDataTable): add missing hide-default-header/footer props (#19774) --- .../src/locale/en/VDataTable.json | 3 ++- .../pages/en/components/data-tables/basics.md | 4 ++-- .../src/components/VDataTable/VDataTable.tsx | 18 +++++++++++------- .../components/VDataTable/VDataTableServer.tsx | 18 ++++++++++-------- .../VDataTable/VDataTableVirtual.tsx | 16 +++++++++------- 5 files changed, 34 insertions(+), 25 deletions(-) diff --git a/packages/api-generator/src/locale/en/VDataTable.json b/packages/api-generator/src/locale/en/VDataTable.json index 96c8ef0c5db..df73bcca2a8 100644 --- a/packages/api-generator/src/locale/en/VDataTable.json +++ b/packages/api-generator/src/locale/en/VDataTable.json @@ -18,7 +18,8 @@ "headers": "An array of objects that each describe a header column. See the example below for a definition of all properties.", "headersLength": "Can be used in combination with `hide-default-header` to specify the number of columns in the table to allow expansion rows and loading bar to function properly.", "height": "Set an explicit height of table.", - "hideDefaultHeader": "Hide the default headers.", + "hideDefaultHeader": "Hides the default header.", + "hideDefaultFooter": "Hides the default footer. This has no effect on `v-data-table-virtual`.", "hover": "Adds a hover effects to a table rows.", "itemClass": "Property on supplied `items` that contains item's row class or function that takes an item as an argument and returns the class of corresponding row.", "itemsPerPage": "Changes how many items per page should be visible. Can be used with `.sync` modifier. Setting this prop to `-1` will display all items on the page.", diff --git a/packages/docs/src/pages/en/components/data-tables/basics.md b/packages/docs/src/pages/en/components/data-tables/basics.md index 615f7619ca5..b2075439fca 100644 --- a/packages/docs/src/pages/en/components/data-tables/basics.md +++ b/packages/docs/src/pages/en/components/data-tables/basics.md @@ -140,11 +140,11 @@ The `v-data-table` renders a default footer using the `v-data-footer` component. --> - + #### Selection diff --git a/packages/vuetify/src/components/VDataTable/VDataTable.tsx b/packages/vuetify/src/components/VDataTable/VDataTable.tsx index b2b4fd0d4f6..36ff04e6f59 100644 --- a/packages/vuetify/src/components/VDataTable/VDataTable.tsx +++ b/packages/vuetify/src/components/VDataTable/VDataTable.tsx @@ -73,6 +73,8 @@ export type VDataTableSlots = VDataTableRowsSlots & VDataTableHeadersSlots export const makeDataTableProps = propsFactory({ ...makeVDataTableRowsProps(), + hideDefaultFooter: Boolean, + hideDefaultHeader: Boolean, width: [String, Number], search: String, @@ -240,12 +242,14 @@ export const VDataTable = genericComponent( default: () => slots.default ? slots.default(slotProps.value) : ( <> { slots.colgroup?.(slotProps.value) } - - - + { !props.hideDefaultHeader && ( + + + + )} { slots.thead?.(slotProps.value) } { slots['body.prepend']?.(slotProps.value) } @@ -263,7 +267,7 @@ export const VDataTable = genericComponent( { slots.tfoot?.(slotProps.value) } ), - bottom: () => slots.bottom ? slots.bottom(slotProps.value) : ( + bottom: () => slots.bottom ? slots.bottom(slotProps.value) : !props.hideDefaultFooter && ( <> diff --git a/packages/vuetify/src/components/VDataTable/VDataTableServer.tsx b/packages/vuetify/src/components/VDataTable/VDataTableServer.tsx index 752b48c8cab..72e3496f213 100644 --- a/packages/vuetify/src/components/VDataTable/VDataTableServer.tsx +++ b/packages/vuetify/src/components/VDataTable/VDataTableServer.tsx @@ -165,13 +165,15 @@ export const VDataTableServer = genericComponent slots.default ? slots.default(slotProps.value) : ( <> { slots.colgroup?.(slotProps.value) } - - - + { !props.hideDefaultHeader && ( + + + + )} { slots.thead?.(slotProps.value) } { slots['body.prepend']?.(slotProps.value) } @@ -189,7 +191,7 @@ export const VDataTableServer = genericComponent ), - bottom: () => slots.bottom ? slots.bottom(slotProps.value) : ( + bottom: () => slots.bottom ? slots.bottom(slotProps.value) : !props.hideDefaultFooter && ( <> diff --git a/packages/vuetify/src/components/VDataTable/VDataTableVirtual.tsx b/packages/vuetify/src/components/VDataTable/VDataTableVirtual.tsx index bee0fb23013..ee4364ccf21 100644 --- a/packages/vuetify/src/components/VDataTable/VDataTableVirtual.tsx +++ b/packages/vuetify/src/components/VDataTable/VDataTableVirtual.tsx @@ -203,13 +203,15 @@ export const VDataTableVirtual = genericComponent { slots.colgroup?.(slotProps.value) } - - - + { !props.hideDefaultHeader && ( + + + + )} From 1bc66cd2a049677f68d2598d6e12450c75e6d117 Mon Sep 17 00:00:00 2001 From: John Leider <9064066+johnleider@users.noreply.github.com> Date: Fri, 10 May 2024 14:40:54 -0500 Subject: [PATCH 032/122] feat(VStepperVertical): create new component (#19524) --- .../api-generator/src/locale/en/Stepper.json | 27 +++ .../src/locale/en/StepperItem.json | 12 + .../src/locale/en/VExpansionPanelTitle.json | 3 +- .../api-generator/src/locale/en/VStepper.json | 22 +- .../src/locale/en/VStepperItem.json | 9 - .../locale/en/VStepperVerticalActions.json | 9 + .../src/locale/en/VStepperVerticalItem.json | 7 + packages/docs/src/data/nav.json | 4 + .../v-stepper-vertical/slot-actions.vue | 84 +++++++ .../src/examples/v-stepper-vertical/usage.vue | 53 +++++ .../pages/en/components/vertical-steppers.md | 70 ++++++ .../pages/en/getting-started/upgrade-guide.md | 5 + .../VExpansionPanel/VExpansionPanel.tsx | 4 +- .../VExpansionPanel/VExpansionPanels.tsx | 23 +- .../src/components/VStepper/VStepper.tsx | 9 +- .../src/components/VStepper/VStepperItem.tsx | 7 +- packages/vuetify/src/composables/group.ts | 10 + .../VStepperVertical/VStepperVertical.tsx | 138 ++++++++++++ .../VStepperVerticalActions.tsx | 51 +++++ .../VStepperVerticalItem.sass | 74 +++++++ .../VStepperVertical/VStepperVerticalItem.tsx | 206 ++++++++++++++++++ .../src/labs/VStepperVertical/_variables.scss | 3 + .../src/labs/VStepperVertical/index.ts | 3 + packages/vuetify/src/labs/components.ts | 1 + 24 files changed, 792 insertions(+), 42 deletions(-) create mode 100644 packages/api-generator/src/locale/en/Stepper.json create mode 100644 packages/api-generator/src/locale/en/StepperItem.json create mode 100644 packages/api-generator/src/locale/en/VStepperVerticalActions.json create mode 100644 packages/api-generator/src/locale/en/VStepperVerticalItem.json create mode 100644 packages/docs/src/examples/v-stepper-vertical/slot-actions.vue create mode 100644 packages/docs/src/examples/v-stepper-vertical/usage.vue create mode 100644 packages/docs/src/pages/en/components/vertical-steppers.md create mode 100644 packages/vuetify/src/labs/VStepperVertical/VStepperVertical.tsx create mode 100644 packages/vuetify/src/labs/VStepperVertical/VStepperVerticalActions.tsx create mode 100644 packages/vuetify/src/labs/VStepperVertical/VStepperVerticalItem.sass create mode 100644 packages/vuetify/src/labs/VStepperVertical/VStepperVerticalItem.tsx create mode 100644 packages/vuetify/src/labs/VStepperVertical/_variables.scss create mode 100644 packages/vuetify/src/labs/VStepperVertical/index.ts diff --git a/packages/api-generator/src/locale/en/Stepper.json b/packages/api-generator/src/locale/en/Stepper.json new file mode 100644 index 00000000000..797be50f8e6 --- /dev/null +++ b/packages/api-generator/src/locale/en/Stepper.json @@ -0,0 +1,27 @@ +{ + "props": { + "altLabels": "Places the labels beneath the step.", + "editable": "Marks step as editable.", + "hideActions": "Hide actions bar (prev and next buttons).", + "itemTitle": "Property on supplied `items` that contains its title.", + "itemValue": "Property on supplied `items` that contains its value.", + "mobile": "Forces the stepper into a mobile state, removing labels from stepper items.", + "nextText": "The text used for the Next button.", + "prevText": "The text used for the Prev button.", + "nonLinear": "Allow user to jump to any step." + }, + "slots": { + "[`header-item.${string}`]": "Slot for customizing header items when using the [items](/api/v-stepper/#props-items) prop.", + "[`item.${string}`]": "Slot for customizing the content for each step.", + "actions": "Slot for customizing [v-stepper-actions](/api/v-stepper-actions/).", + "header": "Slot for customizing the header.", + "header-item": "Slot for customizing all header items.", + "icon": "Slot for customizing all stepper item icons.", + "next": "Slot for customizing the next step functionailty", + "prev": "Slot for customizing the prev step functionality" + }, + "exposed": { + "next": "Move to the next step.", + "prev": "Move to the prev step." + } +} diff --git a/packages/api-generator/src/locale/en/StepperItem.json b/packages/api-generator/src/locale/en/StepperItem.json new file mode 100644 index 00000000000..3f1ddeb13a5 --- /dev/null +++ b/packages/api-generator/src/locale/en/StepperItem.json @@ -0,0 +1,12 @@ +{ + "props": { + "complete": "Marks step as complete.", + "completeIcon": "Icon to display when step is marked as completed.", + "editable": "Marks step as editable.", + "editIcon": "Icon to display when step is editable.", + "errorIcon": "Icon to display when step has an error.", + "error": "Puts the stepper item in a manual error state.", + "rules": "Accepts a mixed array of types `function`, `boolean` and `string`. Functions pass an input value as an argument and must return either `true` / `false` or a `string` containing an error message. The input field will enter an error state if a function returns (or any value in the array contains) `false` or is a `string`.", + "step": "Content to display inside step circle." + } +} diff --git a/packages/api-generator/src/locale/en/VExpansionPanelTitle.json b/packages/api-generator/src/locale/en/VExpansionPanelTitle.json index 814c6cca0c8..c3d385c2bf4 100644 --- a/packages/api-generator/src/locale/en/VExpansionPanelTitle.json +++ b/packages/api-generator/src/locale/en/VExpansionPanelTitle.json @@ -2,6 +2,7 @@ "props": { "collapseIcon": "Icon used when the expansion panel is in a collapsable state.", "expandIcon": "Icon used when the expansion panel is in a expandable state.", - "hideActions": "Hide the expand icon in the content title." + "hideActions": "Hide the expand icon in the content title.", + "static": "Remove title size expansion when selected." } } diff --git a/packages/api-generator/src/locale/en/VStepper.json b/packages/api-generator/src/locale/en/VStepper.json index 43b4515f855..ae3f59342c2 100644 --- a/packages/api-generator/src/locale/en/VStepper.json +++ b/packages/api-generator/src/locale/en/VStepper.json @@ -1,26 +1,6 @@ { "props": { - "altLabels": "Places the labels beneath the step.", - "editable": "Marks step as editable.", - "flat": "Removes the stepper's elevation.", - "hideActions": "Hide actions bar (prev and next buttons).", - "itemTitle": "Property on supplied `items` that contains its title.", - "itemValue": "Property on supplied `items` that contains its value.", - "mobile": "Forces the stepper into a mobile state, removing labels from stepper items.", - "nextText": "The text used for the Next button.", - "prevText": "The text used for the Prev button.", - "nonLinear": "Allow user to jump to any step.", - "vertical": "Display steps vertically." - }, - "slots": { - "[`header-item.${string}`]": "Slot for customizing header items when using the [items](/api/v-stepper/#props-items) prop.", - "[`item.${string}`]": "Slot for customizing the content for each step.", - "actions": "Slot for customizing [v-stepper-actions](/api/v-stepper-actions/).", - "header": "Slot for customizing the header.", - "header-item": "Slot for customizing all header items.", - "icon": "Slot for customizing all stepper item icons.", - "next": "Slot for customizing the next step functionailty", - "prev": "Slot for customizing the prev step functionality" + "flat": "Removes the stepper's elevation." }, "exposed": { "next": "Move to the next step.", diff --git a/packages/api-generator/src/locale/en/VStepperItem.json b/packages/api-generator/src/locale/en/VStepperItem.json index 6a4eb04f3bf..6ee1816d2a3 100644 --- a/packages/api-generator/src/locale/en/VStepperItem.json +++ b/packages/api-generator/src/locale/en/VStepperItem.json @@ -1,16 +1,7 @@ { "props": { - "complete": "Marks step as complete.", - "completeIcon": "Icon to display when step is marked as completed.", - "editable": "Marks step as editable.", - "editIcon": "Icon to display when step is editable.", - "errorIcon": "Icon to display when step has an error.", - "error": "Puts the stepper item in a manual error state.", - "rules": "Accepts a mixed array of types `function`, `boolean` and `string`. Functions pass an input value as an argument and must return either `true` / `false` or a `string` containing an error message. The input field will enter an error state if a function returns (or any value in the array contains) `false` or is a `string`.", - "step": "Content to display inside step circle." }, "events": { - "click": "Emitted when component is clicked." }, "slots": { "icon": "Slot for customizing all stepper item icons." diff --git a/packages/api-generator/src/locale/en/VStepperVerticalActions.json b/packages/api-generator/src/locale/en/VStepperVerticalActions.json new file mode 100644 index 00000000000..4ecea34c2de --- /dev/null +++ b/packages/api-generator/src/locale/en/VStepperVerticalActions.json @@ -0,0 +1,9 @@ +{ + "props": { + "finish": "Changes the Next button to use the finish text.", + "finishText": "The text used for the finish button. Shown when using the **finish** prop." + }, + "events": { + "click:finish": "Emitted when the clicking the finish button." + } +} diff --git a/packages/api-generator/src/locale/en/VStepperVerticalItem.json b/packages/api-generator/src/locale/en/VStepperVerticalItem.json new file mode 100644 index 00000000000..ca6696cfa26 --- /dev/null +++ b/packages/api-generator/src/locale/en/VStepperVerticalItem.json @@ -0,0 +1,7 @@ +{ + "events": { + "click:finish": "Event emitted when clicking the finish button", + "click:next": "Event emitted when clicking the next button", + "click:previous": "Event emitted when clicking the previous button" + } +} diff --git a/packages/docs/src/data/nav.json b/packages/docs/src/data/nav.json index 91446a8eadb..fa98c50da22 100644 --- a/packages/docs/src/data/nav.json +++ b/packages/docs/src/data/nav.json @@ -248,6 +248,10 @@ "title": "snackbar-queue", "subfolder": "components" }, + { + "title": "vertical-steppers", + "subfolder": "components" + }, { "title": "time-pickers", "subfolder": "components" diff --git a/packages/docs/src/examples/v-stepper-vertical/slot-actions.vue b/packages/docs/src/examples/v-stepper-vertical/slot-actions.vue new file mode 100644 index 00000000000..8b9b45cc840 --- /dev/null +++ b/packages/docs/src/examples/v-stepper-vertical/slot-actions.vue @@ -0,0 +1,84 @@ + + + + + diff --git a/packages/docs/src/examples/v-stepper-vertical/usage.vue b/packages/docs/src/examples/v-stepper-vertical/usage.vue new file mode 100644 index 00000000000..141dc55bf82 --- /dev/null +++ b/packages/docs/src/examples/v-stepper-vertical/usage.vue @@ -0,0 +1,53 @@ + + + diff --git a/packages/docs/src/pages/en/components/vertical-steppers.md b/packages/docs/src/pages/en/components/vertical-steppers.md new file mode 100644 index 00000000000..f7852a3c159 --- /dev/null +++ b/packages/docs/src/pages/en/components/vertical-steppers.md @@ -0,0 +1,70 @@ +--- +emphasized: true +meta: + nav: Steppers Vertical + title: Vertical Stepper component + description: The vertical stepper component is a navigation element that guides users through a sequence of steps. + keywords: vertical stepper, vuetify vertical stepper component, vue vertical stepper component +related: + - /components/buttons/ + - /components/icons/ + - /styles/transitions/ +features: + report: true +--- + +# Vertical Steppers + +The `v-stepper-vertical` component can be used as a navigation element that guides users through a sequence of steps. + + + +::: warning + +This feature requires [v3.5.14](/getting-started/release-notes/?version=v3.5.14) + +::: + +## Installation + +Labs components require a manual import and installation of the component. + +```js { resource="src/plugins/vuetify.js" } +import { VStepperVertical } from 'vuetify/labs/VStepperVertical' + +export default createVuetify({ + components: { + VStepperVertical, + }, +}) +``` + +## Usage + +Vertical steppers allow users to complete a series of actions in step order. + + + + + +## API + +| Component | Description | +| - | - | +| [v-stepper-vertical](/api/v-stepper-vertical/) | Primary Component | + + + +### Guide + +The `v-stepper-vertical` is the vertical variant of the [v-stepper](/components/steppers/) component. It also extends functionality of [v-expansion-panels](/components/expansion-panels/). + +#### Slots + +The `v-stepper-vertical` component has several slots for customization. + +##### Actions + +Customize the flow of your stepper by hooking into the available **prev** and **next** slots. + + diff --git a/packages/docs/src/pages/en/getting-started/upgrade-guide.md b/packages/docs/src/pages/en/getting-started/upgrade-guide.md index 39923393806..61737ab9450 100644 --- a/packages/docs/src/pages/en/getting-started/upgrade-guide.md +++ b/packages/docs/src/pages/en/getting-started/upgrade-guide.md @@ -232,6 +232,11 @@ app.use(vuetify) - `v-simple-table` has been renamed to `v-table` +### v-stepper (vertical) + +- `v-stepper-step` has been renamed to `v-stepper-vertical-item`. Move content into the **title** slot. +- `v-stepper-content` has been removed. Move content to the default slot of `v-stepper-vertical-item`. + ### v-data-table - Headers objects: diff --git a/packages/vuetify/src/components/VExpansionPanel/VExpansionPanel.tsx b/packages/vuetify/src/components/VExpansionPanel/VExpansionPanel.tsx index 021ae213381..4e913e6ffe5 100644 --- a/packages/vuetify/src/components/VExpansionPanel/VExpansionPanel.tsx +++ b/packages/vuetify/src/components/VExpansionPanel/VExpansionPanel.tsx @@ -124,7 +124,9 @@ export const VExpansionPanel = genericComponent()({ ) }) - return {} + return { + groupItem, + } }, }) diff --git a/packages/vuetify/src/components/VExpansionPanel/VExpansionPanels.tsx b/packages/vuetify/src/components/VExpansionPanel/VExpansionPanels.tsx index ead703dc956..f60ccb44420 100644 --- a/packages/vuetify/src/components/VExpansionPanel/VExpansionPanels.tsx +++ b/packages/vuetify/src/components/VExpansionPanel/VExpansionPanels.tsx @@ -23,6 +23,15 @@ const allowedVariants = ['default', 'accordion', 'inset', 'popout'] as const type Variant = typeof allowedVariants[number] +export type VExpansionPanelSlot = { + prev: () => void + next: () => void +} + +export type VExpansionPanelSlots = { + default: VExpansionPanelSlot +} + export const makeVExpansionPanelsProps = propsFactory({ flat: Boolean, @@ -37,7 +46,7 @@ export const makeVExpansionPanelsProps = propsFactory({ }, }, 'VExpansionPanels') -export const VExpansionPanels = genericComponent()({ +export const VExpansionPanels = genericComponent()({ name: 'VExpansionPanels', props: makeVExpansionPanelsProps(), @@ -47,7 +56,7 @@ export const VExpansionPanels = genericComponent()({ }, setup (props, { slots }) { - useGroup(props, VExpansionPanelSymbol) + const { next, prev } = useGroup(props, VExpansionPanelSymbol) const { themeClasses } = provideTheme(props) @@ -83,11 +92,15 @@ export const VExpansionPanels = genericComponent()({ props.class, ]} style={ props.style } - v-slots={ slots } - /> + > + { slots.default?.({ prev, next }) } + )) - return {} + return { + next, + prev, + } }, }) diff --git a/packages/vuetify/src/components/VStepper/VStepper.tsx b/packages/vuetify/src/components/VStepper/VStepper.tsx index 4e2fa4ebce2..1350134118c 100644 --- a/packages/vuetify/src/components/VStepper/VStepper.tsx +++ b/packages/vuetify/src/components/VStepper/VStepper.tsx @@ -20,13 +20,11 @@ import { genericComponent, getPropertyFromItem, only, propsFactory, useRender } // Types import type { InjectionKey, PropType } from 'vue' -import type { StepperItemSlot } from './VStepperItem' +import type { StepperItem, StepperItemSlot } from './VStepperItem' import type { GroupItemProvide } from '@/composables/group' export const VStepperSymbol: InjectionKey = Symbol.for('vuetify:v-stepper') -export type StepperItem = string | Record - export type VStepperSlot = { prev: () => void next: () => void @@ -48,7 +46,7 @@ export type VStepperSlots = { [key: `item.${string}`]: StepperItem } -export const makeVStepperProps = propsFactory({ +export const makeStepperProps = propsFactory({ altLabels: Boolean, bgColor: String, editable: Boolean, @@ -68,7 +66,10 @@ export const makeVStepperProps = propsFactory({ mobile: Boolean, nonLinear: Boolean, flat: Boolean, +}, 'Stepper') +export const makeVStepperProps = propsFactory({ + ...makeStepperProps(), ...makeGroupProps({ mandatory: 'force' as const, selectedClass: 'v-stepper-item--selected', diff --git a/packages/vuetify/src/components/VStepper/VStepperItem.tsx b/packages/vuetify/src/components/VStepper/VStepperItem.tsx index 129bc0395c0..42766e6221a 100644 --- a/packages/vuetify/src/components/VStepper/VStepperItem.tsx +++ b/packages/vuetify/src/components/VStepper/VStepperItem.tsx @@ -21,6 +21,8 @@ import { genericComponent, propsFactory, useRender } from '@/util' import type { PropType } from 'vue' import type { RippleDirectiveBinding } from '@/directives/ripple' +export type StepperItem = string | Record + export type StepperItemSlot = { canEdit: boolean hasError: boolean @@ -39,7 +41,7 @@ export type VStepperItemSlots = { export type ValidationRule = () => string | boolean -export const makeVStepperItemProps = propsFactory({ +export const makeStepperItemProps = propsFactory({ color: String, title: String, subtitle: String, @@ -67,7 +69,10 @@ export const makeVStepperItemProps = propsFactory({ type: Array as PropType, default: () => ([]), }, +}, 'StepperItem') +export const makeVStepperItemProps = propsFactory({ + ...makeStepperItemProps(), ...makeGroupItemProps(), }, 'VStepperItem') diff --git a/packages/vuetify/src/composables/group.ts b/packages/vuetify/src/composables/group.ts index 42d7e6b14a5..b039bbcecc6 100644 --- a/packages/vuetify/src/composables/group.ts +++ b/packages/vuetify/src/composables/group.ts @@ -47,6 +47,8 @@ export interface GroupProvide { export interface GroupItemProvide { id: number isSelected: Ref + isFirst: Ref + isLast: Ref toggle: () => void select: (value: boolean) => void selectedClass: Ref<(string | undefined)[] | false> @@ -129,6 +131,12 @@ export function useGroupItem ( const isSelected = computed(() => { return group.isSelected(id) }) + const isFirst = computed(() => { + return group.items.value[0].id === id + }) + const isLast = computed(() => { + return group.items.value[group.items.value.length - 1].id === id + }) const selectedClass = computed(() => isSelected.value && [group.selectedClass.value, props.selectedClass]) @@ -139,6 +147,8 @@ export function useGroupItem ( return { id, isSelected, + isFirst, + isLast, toggle: () => group.select(id, !isSelected.value), select: (value: boolean) => group.select(id, value), selectedClass, diff --git a/packages/vuetify/src/labs/VStepperVertical/VStepperVertical.tsx b/packages/vuetify/src/labs/VStepperVertical/VStepperVertical.tsx new file mode 100644 index 00000000000..2cd11d98ae4 --- /dev/null +++ b/packages/vuetify/src/labs/VStepperVertical/VStepperVertical.tsx @@ -0,0 +1,138 @@ +// Components +import { VStepperVerticalItem } from './VStepperVerticalItem' +import { makeVExpansionPanelsProps, VExpansionPanels } from '@/components/VExpansionPanel/VExpansionPanels' +import { makeStepperProps } from '@/components/VStepper/VStepper' + +// Composables +import { provideDefaults } from '@/composables/defaults' +import { useProxiedModel } from '@/composables/proxiedModel' + +// Utilities +import { computed, ref, toRefs } from 'vue' +import { genericComponent, getPropertyFromItem, omit, propsFactory, useRender } from '@/util' + +// Types +import type { VStepperSlot } from '@/components/VStepper/VStepper' +import type { StepperItem, StepperItemSlot } from '@/components/VStepper/VStepperItem' + +export type VStepperVerticalSlots = { + actions: StepperItemSlot + default: VStepperSlot & { step: unknown } + icon: StepperItemSlot + title: StepperItemSlot + subtitle: StepperItemSlot + item: StepperItem + prev: StepperItemSlot + next: StepperItemSlot +} & { + [key: `header-item.${string}`]: StepperItemSlot + [key: `item.${string}`]: StepperItem +} + +export const makeVStepperVerticalProps = propsFactory({ + prevText: { + type: String, + default: '$vuetify.stepper.prev', + }, + nextText: { + type: String, + default: '$vuetify.stepper.next', + }, + + ...makeStepperProps(), + ...omit(makeVExpansionPanelsProps({ + mandatory: 'force' as const, + variant: 'accordion' as const, + }), ['static']), +}, 'VStepperVertical') + +export const VStepperVertical = genericComponent()({ + name: 'VStepperVertical', + + props: makeVStepperVerticalProps(), + + emits: { + 'update:modelValue': (val: any) => true, + }, + + setup (props, { slots }) { + const vExpansionPanelsRef = ref() + const { color, editable, prevText, nextText, hideActions } = toRefs(props) + + const model = useProxiedModel(props, 'modelValue') + const items = computed(() => props.items.map((item, index) => { + const title = getPropertyFromItem(item, props.itemTitle, item) + const value = getPropertyFromItem(item, props.itemValue, index + 1) + + return { + title, + value, + raw: item, + } + })) + + provideDefaults({ + VStepperVerticalItem: { + color, + editable, + prevText, + nextText, + hideActions, + static: true, + }, + VStepperActions: { + color, + }, + }) + + useRender(() => { + const expansionPanelProps = VExpansionPanels.filterProps(props) + + return ( + + {{ + ...slots, + default: ({ + prev, + next, + }) => { + return ( + <> + { items.value.map(({ raw, ...item }) => ( + + {{ + ...slots, + default: slots[`item.${item.value}`], + }} + + ))} + + { slots.default?.({ prev, next, step: model.value }) } + + ) + }, + }} + + ) + }) + + return {} + }, +}) + +export type VStepperVertical = InstanceType diff --git a/packages/vuetify/src/labs/VStepperVertical/VStepperVerticalActions.tsx b/packages/vuetify/src/labs/VStepperVertical/VStepperVerticalActions.tsx new file mode 100644 index 00000000000..0246cdaad84 --- /dev/null +++ b/packages/vuetify/src/labs/VStepperVertical/VStepperVerticalActions.tsx @@ -0,0 +1,51 @@ +// Components +import { makeVStepperActionsProps, VStepperActions } from '@/components/VStepper/VStepperActions' + +// Utilities +import { genericComponent, propsFactory, useRender } from '@/util' + +// Types +import type { VStepperActionsSlots } from '@/components/VStepper/VStepperActions' + +export const makeVStepperVerticalActionsProps = propsFactory({ + ...makeVStepperActionsProps(), +}, 'VStepperActions') + +export const VStepperVerticalActions = genericComponent()({ + name: 'VStepperVerticalActions', + + props: makeVStepperVerticalActionsProps(), + + emits: { + 'click:prev': () => true, + 'click:next': () => true, + }, + + setup (props, { emit, slots }) { + function onClickPrev () { + emit('click:prev') + } + + function onClickNext () { + emit('click:next') + } + + useRender(() => { + const stepperActionsProps = VStepperActions.filterProps(props) + + return ( + + ) + }) + + return {} + }, +}) + +export type VStepperVerticalActions = InstanceType diff --git a/packages/vuetify/src/labs/VStepperVertical/VStepperVerticalItem.sass b/packages/vuetify/src/labs/VStepperVertical/VStepperVerticalItem.sass new file mode 100644 index 00000000000..96967cabc2f --- /dev/null +++ b/packages/vuetify/src/labs/VStepperVertical/VStepperVerticalItem.sass @@ -0,0 +1,74 @@ +@use '../../styles/settings' +@use '../../styles/tools' +@use './variables' as * + +.v-stepper-vertical-item + position: relative + transition-duration: $stepper-vertical-item-transition-duration + transition-property: $stepper-vertical-item-transition-property + transition-timing-function: $stepper-vertical-item-transition-timing-function + + &__title + font-size: 1rem + + &__subtitle + font-size: .75rem + + .v-expansion-panel-text + padding-inline-start: 32px + + &:not(:last-child):before + content: '' + position: absolute + width: 2px + height: calc(100% - 30px) + background: rgba(var(--v-border-color), var(--v-border-opacity)) + left: 35px + top: 44px + z-index: 1 + transition-duration: 300ms + transition-property: height + + &:after + display: none + + &.v-expansion-panel--disabled, + &:not(.v-stepper-vertical-item--editable) + .v-expansion-panel-title + pointer-events: none + + .v-expansion-panel-title__overlay + opacity: 0 + +.v-stepper-vertical-item__avatar.v-avatar + background: rgba(var(--v-theme-surface-variant), var(--v-medium-emphasis-opacity)) + color: rgb(var(--v-theme-on-surface-variant)) + transition-property: background + + .v-icon + font-size: .875rem + + .v-expansion-panel--active & + background: rgb(var(--v-theme-surface-variant)) + + .v-stepper-vertical-item--error & + background: rgb(var(--v-theme-error)) + color: rgb(var(--v-theme-on-error)) + +.v-stepper-vertical-item__title + .v-stepper-vertical-item--error & + color: rgb(var(--v-theme-error)) + +.v-stepper-vertical-item__subtitle + .v-stepper-vertical-item--error & + color: rgb(var(--v-theme-error)) + +.v-stepper-vertical-actions + &.v-stepper-actions + .v-btn + margin-inline-end: 8px + + .v-stepper & + justify-content: flex-end + padding: 24px 0 0 + flex-direction: row-reverse diff --git a/packages/vuetify/src/labs/VStepperVertical/VStepperVerticalItem.tsx b/packages/vuetify/src/labs/VStepperVertical/VStepperVerticalItem.tsx new file mode 100644 index 00000000000..fb2f13c0e7c --- /dev/null +++ b/packages/vuetify/src/labs/VStepperVertical/VStepperVerticalItem.tsx @@ -0,0 +1,206 @@ +// Styles +import './VStepperVerticalItem.sass' + +// Components +import { VStepperVerticalActions } from './VStepperVerticalActions' +import { VAvatar } from '@/components/VAvatar/VAvatar' +import { VDefaultsProvider } from '@/components/VDefaultsProvider/VDefaultsProvider' +import { VExpansionPanel } from '@/components/VExpansionPanel' +import { makeVExpansionPanelProps } from '@/components/VExpansionPanel/VExpansionPanel' +import { VIcon } from '@/components/VIcon/VIcon' +import { makeStepperItemProps } from '@/components/VStepper/VStepperItem' + +// Utilities +import { computed, ref } from 'vue' +import { genericComponent, omit, propsFactory, useRender } from '@/util' + +// Types +import type { StepperItemSlot } from '@/components/VStepper/VStepperItem' + +export type VStepperVerticalItemSlots = { + default: StepperItemSlot + icon: StepperItemSlot + subtitle: StepperItemSlot + title: StepperItemSlot + text: StepperItemSlot + prev: StepperItemSlot + next: StepperItemSlot + actions: StepperItemSlot & { + next: () => void + prev: () => void + } +} + +export const makeVStepperVerticalItemProps = propsFactory({ + hideActions: Boolean, + + ...makeStepperItemProps(), + ...omit(makeVExpansionPanelProps({ + expandIcon: '', + collapseIcon: '', + }), ['hideActions']), +}, 'VStepperVerticalItem') + +export const VStepperVerticalItem = genericComponent()({ + name: 'VStepperVerticalItem', + + props: makeVStepperVerticalItemProps(), + + emits: { + 'click:next': () => true, + 'click:prev': () => true, + 'click:finish': () => true, + }, + + setup (props, { emit, slots }) { + const vExpansionPanelRef = ref() + const step = computed(() => !isNaN(parseInt(props.value)) ? Number(props.value) : props.value) + const groupItem = computed(() => vExpansionPanelRef.value?.groupItem) + const isSelected = computed(() => groupItem.value?.isSelected.value ?? false) + const isValid = computed(() => isSelected.value ? props.rules.every(handler => handler() === true) : null) + const canEdit = computed(() => !props.disabled && props.editable) + const hasError = computed(() => props.error || (isSelected.value && !isValid.value)) + const hasCompleted = computed(() => props.complete || (props.rules.length > 0 && isValid.value === true)) + + const disabled = computed(() => { + if (props.disabled) return props.disabled + if (groupItem.value?.isFirst.value) return 'prev' + + return false + }) + const icon = computed(() => { + if (hasError.value) return props.errorIcon + if (hasCompleted.value) return props.completeIcon + if (groupItem.value?.isSelected.value && props.editable) return props.editIcon + + return props.icon + }) + + const slotProps = computed(() => ({ + canEdit: canEdit.value, + hasError: hasError.value, + hasCompleted: hasCompleted.value, + title: props.title, + subtitle: props.subtitle, + step: step.value, + value: props.value, + })) + + const actionProps = computed(() => ({ + ...slotProps.value, + prev: onClickPrev, + next: onClickNext, + })) + + function onClickNext () { + emit('click:next') + + if (groupItem.value?.isLast.value) return + + groupItem.value.group.next() + } + + function onClickPrev () { + emit('click:prev') + + groupItem.value.group.prev() + } + + useRender(() => { + const hasColor = ( + hasCompleted.value || + groupItem.value?.isSelected.value + ) && ( + !hasError.value && + !props.disabled + ) + + const hasActions = !props.hideActions || !!slots.actions + const expansionPanelProps = VExpansionPanel.filterProps(props) + + return ( + + {{ + title: () => ( + <> + + { slots.icon?.(slotProps.value) ?? ( + icon.value ? ( + + ) : step.value + )} + + +
+
+ { slots.title?.(slotProps.value) ?? props.title } +
+ +
+ { slots.subtitle?.(slotProps.value) ?? props.subtitle } +
+
+ + ), + text: () => ( + <> + { slots.default?.(slotProps.value) ?? props.text } + + { hasActions && ( + + { slots.actions?.(actionProps.value) ?? ( + slots.prev?.(actionProps.value) : undefined, + next: slots.next ? () => slots.next?.(actionProps.value) : undefined, + }} + /> + )} + + )} + + ), + }} +
+ ) + }) + + return {} + }, +}) + +export type VStepperVerticalItem = InstanceType diff --git a/packages/vuetify/src/labs/VStepperVertical/_variables.scss b/packages/vuetify/src/labs/VStepperVertical/_variables.scss new file mode 100644 index 00000000000..eecd20e1bcd --- /dev/null +++ b/packages/vuetify/src/labs/VStepperVertical/_variables.scss @@ -0,0 +1,3 @@ +$stepper-vertical-item-transition-duration: .2s !default; +$stepper-vertical-item-transition-property: opacity !default; +$stepper-vertical-item-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !default; diff --git a/packages/vuetify/src/labs/VStepperVertical/index.ts b/packages/vuetify/src/labs/VStepperVertical/index.ts new file mode 100644 index 00000000000..dc0127e0bb8 --- /dev/null +++ b/packages/vuetify/src/labs/VStepperVertical/index.ts @@ -0,0 +1,3 @@ +export { VStepperVertical } from './VStepperVertical' +export { VStepperVerticalItem } from './VStepperVerticalItem' +export { VStepperVerticalActions } from './VStepperVerticalActions' diff --git a/packages/vuetify/src/labs/components.ts b/packages/vuetify/src/labs/components.ts index 7f2adedc388..6b753ff8790 100644 --- a/packages/vuetify/src/labs/components.ts +++ b/packages/vuetify/src/labs/components.ts @@ -2,6 +2,7 @@ export * from './VCalendar' export * from './VDateInput' export * from './VNumberInput' export * from './VPicker' +export * from './VStepperVertical' export * from './VPullToRefresh' export * from './VSnackbarQueue' export * from './VTimePicker' From 322fb4f0ae99f756bfc7fd3f03ca7704c57d2bc9 Mon Sep 17 00:00:00 2001 From: John Leider Date: Fri, 10 May 2024 14:43:55 -0500 Subject: [PATCH 033/122] docs(VStepper): update alert with vertical link --- packages/docs/src/pages/en/components/steppers.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/docs/src/pages/en/components/steppers.md b/packages/docs/src/pages/en/components/steppers.md index 8c567dd420a..c5cc8c3dd85 100644 --- a/packages/docs/src/pages/en/components/steppers.md +++ b/packages/docs/src/pages/en/components/steppers.md @@ -38,7 +38,7 @@ A stepper can be used for a multitude of scenarios, including shopping carts, re ::: warning -Due to the massive differences in display and functionality between horizontal and vertical steppers, the **vertical** property is moving to a new component `v-stepper-vertical`. +Due to the massive differences in display and functionality between horizontal and vertical steppers, the **vertical** property is moving to a new component [v-stepper-vertical](/components/vertical-steppers/). ::: From fc2f154f2712a1ca44eadc9b9f7b7f73597d1b52 Mon Sep 17 00:00:00 2001 From: John Leider Date: Fri, 10 May 2024 14:55:47 -0500 Subject: [PATCH 034/122] chore(release): publish v3.6.5 --- lerna.json | 2 +- packages/api-generator/package.json | 4 ++-- packages/docs/package.json | 6 +++--- packages/vuetify/package.json | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/lerna.json b/lerna.json index 97dcc3b9a4f..75f37791928 100644 --- a/lerna.json +++ b/lerna.json @@ -13,6 +13,6 @@ } }, "npmClient": "yarn", - "version": "3.6.4", + "version": "3.6.5", "useWorkspaces": true } diff --git a/packages/api-generator/package.json b/packages/api-generator/package.json index 7b5030b27f9..fbaba5a6f08 100755 --- a/packages/api-generator/package.json +++ b/packages/api-generator/package.json @@ -1,6 +1,6 @@ { "name": "@vuetify/api-generator", - "version": "3.6.4", + "version": "3.6.5", "private": true, "description": "", "scripts": { @@ -17,7 +17,7 @@ "ts-morph": "^22.0.0", "tsx": "^4.7.2", "vue": "^3.4.27", - "vuetify": "^3.6.4" + "vuetify": "^3.6.5" }, "devDependencies": { "@types/stringify-object": "^4.0.5" diff --git a/packages/docs/package.json b/packages/docs/package.json index d3ed4af0118..44634b1e106 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -3,7 +3,7 @@ "description": "A Vue.js project", "private": true, "author": "John Leider ", - "version": "3.6.4", + "version": "3.6.5", "repository": { "type": "git", "url": "git+https://github.com/vuetifyjs/vuetify.git", @@ -38,7 +38,7 @@ "vue-i18n": "^9.11.0", "vue-instantsearch": "^4.16.1", "vue-prism-component": "^2.0.0", - "vuetify": "^3.6.4" + "vuetify": "^3.6.5" }, "devDependencies": { "@emailjs/browser": "^4.3.3", @@ -50,7 +50,7 @@ "@vitejs/plugin-basic-ssl": "^1.1.0", "@vitejs/plugin-vue": "^5.0.4", "@vue/compiler-sfc": "^3.4.27", - "@vuetify/api-generator": "^3.6.4", + "@vuetify/api-generator": "^3.6.5", "ajv": "^8.12.0", "async-es": "^3.2.5", "date-fns": "^3.6.0", diff --git a/packages/vuetify/package.json b/packages/vuetify/package.json index a6fb9e68887..2be48354daa 100755 --- a/packages/vuetify/package.json +++ b/packages/vuetify/package.json @@ -1,7 +1,7 @@ { "name": "vuetify", "description": "Vue Material Component Framework", - "version": "3.6.4", + "version": "3.6.5", "author": { "name": "John Leider", "email": "john@vuetifyjs.com" From edf29fda836b7252fb92d5d25c965f53bf46a523 Mon Sep 17 00:00:00 2001 From: Kael Date: Sat, 11 May 2024 18:47:50 +1000 Subject: [PATCH 035/122] docs(faq): add vue/compat instructions --- .../src/pages/en/getting-started/frequently-asked-questions.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/docs/src/pages/en/getting-started/frequently-asked-questions.md b/packages/docs/src/pages/en/getting-started/frequently-asked-questions.md index 0b41d3c1b9c..5fb39a95570 100644 --- a/packages/docs/src/pages/en/getting-started/frequently-asked-questions.md +++ b/packages/docs/src/pages/en/getting-started/frequently-asked-questions.md @@ -99,6 +99,6 @@ The following responses are a collection of common questions asked by the Vuetif * **Is Vuetify 3 compatible with `@vue/compat`?** - No. If this changes in the future, we will update this FAQ and make a public notification. + Not directly, you have to set `configureCompat({ MODE: 3 })` globally and `MODE: 2` in each of your components that you want to run in compatibility mode. There will still be some incorrect warnings that can be ignored with the `-ATTR_FALSE_VALUE` filter in devtools. From 6a9d8e68d53dc390c075f15bcabbb9366e1b465c Mon Sep 17 00:00:00 2001 From: Kael Date: Sat, 11 May 2024 18:54:18 +1000 Subject: [PATCH 036/122] docs(faq): add onMounted ref question closes #19736 --- .../pages/en/getting-started/frequently-asked-questions.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/docs/src/pages/en/getting-started/frequently-asked-questions.md b/packages/docs/src/pages/en/getting-started/frequently-asked-questions.md index 5fb39a95570..36c6ac88a46 100644 --- a/packages/docs/src/pages/en/getting-started/frequently-asked-questions.md +++ b/packages/docs/src/pages/en/getting-started/frequently-asked-questions.md @@ -101,4 +101,8 @@ The following responses are a collection of common questions asked by the Vuetif Not directly, you have to set `configureCompat({ MODE: 3 })` globally and `MODE: 2` in each of your components that you want to run in compatibility mode. There will still be some incorrect warnings that can be ignored with the `-ATTR_FALSE_VALUE` filter in devtools. +* **Why don't elements exist in the DOM yet in `onMounted()`?** ([#19736](https://github.com/vuetifyjs/vuetify/issues/19736)) + + Some vuetify components are asynchronous, so there is no guarantee that their children will be mounted immediately. Either wait for the target element itself to be mounted with `v-on:vue:mounted` or use `onMounted` in a separate component that only has plain elements between the `