Skip to content

Commit b7a38e1

Browse files
committed
Merge branch 'master' into dev
2 parents a87a3fd + 7d3f26a commit b7a38e1

File tree

28 files changed

+364
-81
lines changed

28 files changed

+364
-81
lines changed

lerna.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,5 @@
1313
}
1414
},
1515
"npmClient": "pnpm",
16-
"version": "3.10.3"
16+
"version": "3.10.4"
1717
}

packages/api-generator/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "@vuetify/api-generator",
33
"type": "module",
4-
"version": "3.10.3",
4+
"version": "3.10.4",
55
"private": true,
66
"description": "",
77
"scripts": {

packages/api-generator/src/locale/en/VCombobox.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
{
22
"props": {
3+
"alwaysFilter": "When enabled, dropdown list will always show items matching non-empty value within the field. Recommended when the list is meant to show suggestions rather than options to choose from. For optimal UX, should be combined with `:menu-icon=\"false\"` and `hide-selected`.",
34
"autoSelectFirst": "When searching, will always highlight the first option and select it on blur. `exact` will only highlight and select exact matches.",
45
"clearOnSelect": "Reset the search text when a selection is made while using the **multiple** prop.",
56
"itemChildren": "This property currently has **no effect**.",

packages/docs/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
"description": "A Vue.js project",
55
"private": true,
66
"author": "John Leider <[email protected]>",
7-
"version": "3.10.3",
7+
"version": "3.10.4",
88
"repository": {
99
"type": "git",
1010
"url": "git+https://github.com/vuetifyjs/vuetify.git",

packages/docs/src/components/introduction/ConsultingServices.vue

Lines changed: 28 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -13,22 +13,24 @@
1313

1414
<v-container class="pt-9 px-5" fluid>
1515
<v-row justify="space-around" dense>
16-
<template v-for="({ src, text, href, name}, i) in cards" :key="i">
16+
<template v-for="({ text, href, name, btnText, notes }, i) in cards" :key="i">
1717
<v-col cols="12" md="6">
1818
<v-responsive class="h-100" content-class="d-flex flex-column">
1919
<h3 class="d-flex align-center text-h6 font-weight-medium mb-4">
20-
<v-avatar :image="src" class="me-3" />
21-
<div>
22-
{{ name }}
23-
</div>
20+
{{ name }}
2421
</h3>
2522

26-
<div class="text-caption mb-auto">{{ text }}</div>
23+
<div class="mb-auto text-caption">
24+
<div class="mb-4">{{ text }}</div>
25+
<ul v-if="notes && notes.length" class="mb-0 ml-5">
26+
<li v-for="(item, j) in notes" :key="j">{{ item }}</li>
27+
</ul>
28+
</div>
2729

2830
<v-btn
2931
:href="href"
30-
:text="name === 'Frontend Code Audit' ? 'Request Audit' : 'Learn more'"
31-
:variant="i === 1 ? 'flat' : 'outlined'"
32+
:text="btnText"
33+
:variant="i === 3 ? 'flat' : 'outlined'"
3234
class="text-none mt-8"
3335
color="primary"
3436
rel="noopener"
@@ -54,28 +56,30 @@
5456
<script setup>
5557
const cards = [
5658
{
57-
name: 'Development and Support',
58-
href: 'https://www.epicmax.co/what-we-do?ref=vuetify',
59-
src: 'https://cdn.vuetifyjs.com/docs/images/discord/tiers/planetary.png',
60-
text: 'Epicmax provides dedicated development and ongoing support for Vuetify-based projects, ensuring your product is built and maintained with best practices for maximum performance and stability.',
59+
name: '🧩 Vuetify App Development',
60+
href: 'https://calendar.google.com/calendar/u/0/appointments/schedules/AcZssZ1ICL1_pVx87WpbxCeAKPNljw8Wr8Og4-NuzbUV-RHlxs-c_B8s2nYZ0RAWPcVqTx4Dn568c5OA',
61+
text: 'Epicmax helps companies build and improve Vuetify apps of any size - from brand-new products to complex legacy systems. Our senior Vue.js team resolves performance issues, modernizes legacy codebases, and develops scalable frontend architectures with clean, intuitive UI/UX designs. If you need reliable Vuetify experts to optimize, upgrade, or extend your app, we’ve got you covered.',
62+
btnText: 'Book a Consultation',
6163
},
6264
{
63-
name: 'Frontend Code Audit',
64-
href: 'https://www.epicmax.co/code-audit?ref=vuetify',
65-
src: 'https://cdn.vuetifyjs.com/docs/images/avatars/galaxy.png',
66-
text: 'Identify and resolve potential issues in your frontend code with a thorough audit from Epicmax\'s seasoned experts. Their in-depth analysis ensures that your codebase is optimized, clean, and ready for scale. Use code "VUETIFY" to get 20% off.',
65+
name: '🔁 Vuetify 2 → Vuetify 3 Migration',
66+
href: 'https://epicmax.co/vue-3-migration#migration-form',
67+
text: 'Still running on Vuetify 2? Our Vuetify migration experts ensure a smooth upgrade to Vuetify 3 - with zero downtime, clear budget estimates, and long-term support.',
68+
notes: ['⚙️ Every migration includes a free audit and upgrade plan.'],
69+
btnText: 'Request Migration',
6770
},
6871
{
69-
name: 'Flexible Consulting',
70-
href: 'https://www.epicmax.co/?ref=vuetify',
71-
src: 'https://cdn.vuetifyjs.com/docs/images/avatars/multiverse.png',
72-
text: 'Whether you need short-term assistance or a long-term strategy, Epicmax provides flexible consulting services that adapt to your specific project needs and timeline.',
72+
name: '🔍 Frontend Code Audit Services',
73+
href: 'https://epicmax.co/code-audit#request_form',
74+
text: 'Ensure your app runs at its best with Epicmax’s Vue.js and Vuetify code audit services. We provide a detailed technical review, highlight performance bottlenecks, and deliver a prioritized roadmap with actionable fixes.',
75+
notes: ['💡 Use code VUETIFY for 20% off.'],
76+
btnText: 'Request an Audit',
7377
},
7478
{
75-
name: 'Team Augmentation',
76-
href: 'https://www.epicmax.co/?ref=vuetify',
77-
src: 'https://cdn.vuetifyjs.com/docs/images/discord/tiers/gold.png',
78-
text: 'Epicmax can boost your team with skilled developers who integrate seamlessly into your workflow. Whether for short-term projects or ongoing support, they help you scale and meet your goals efficiently.',
79+
name: '👨‍💻 Hire Senior Vuetify Developers',
80+
href: 'https://calendar.google.com/calendar/u/0/appointments/schedules/AcZssZ1ICL1_pVx87WpbxCeAKPNljw8Wr8Og4-NuzbUV-RHlxs-c_B8s2nYZ0RAWPcVqTx4Dn568c5OA',
81+
text: 'Scale your team with Epicmax’s senior Vue.js and Vuetify developers. Our engineers seamlessly integrate into your workflow, modernize legacy Vue.js applications, optimize frontend performance, and build scalable web applications with clean, reliable UI/UX.',
82+
btnText: 'Hire Developers',
7983
},
8084
]
8185
</script>

packages/docs/src/data/new-in.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@
6060
},
6161
"VCombobox": {
6262
"props": {
63+
"alwaysFilter": "3.10.4",
6364
"autocomplete": "3.10.0",
6465
"clearOnSelect": "3.5.0",
6566
"listProps": "3.5.0"
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<template>
2+
<v-app>
3+
<v-container>
4+
<v-btn class="ma-2" color="primary" @click="expand = !expand">
5+
Expand Transition
6+
</v-btn>
7+
8+
<v-expand-x-transition>
9+
<v-responsive v-show="expand" width="fit-content">
10+
<v-alert
11+
class="text-no-wrap"
12+
text="Smooth transition here"
13+
type="info"
14+
></v-alert>
15+
</v-responsive>
16+
</v-expand-x-transition>
17+
</v-container>
18+
</v-app>
19+
</template>
20+
21+
<script setup>
22+
import { ref } from 'vue'
23+
24+
const expand = ref(false)
25+
</script>
26+
27+
<script>
28+
export default {
29+
data: () => ({
30+
expand: false,
31+
}),
32+
}
33+
</script>
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
<template>
2+
<v-app>
3+
<v-container>
4+
<v-chip-group v-model="selectedSize" class="mb-4" mandatory row>
5+
<v-chip
6+
v-for="size in sizes"
7+
:key="size"
8+
:value="size"
9+
color="primary"
10+
variant="outlined"
11+
>
12+
{{ size }} items
13+
</v-chip>
14+
</v-chip-group>
15+
16+
<v-data-table-virtual
17+
:headers="headers"
18+
:items="items"
19+
height="400"
20+
item-key="id"
21+
fixed-header
22+
>
23+
<template v-slot:item="{ columns, internalItem, props, itemRef }">
24+
<tr v-bind="props" :ref="itemRef">
25+
<td v-for="column in columns" :key="column.key">
26+
{{ internalItem.raw[column.key] }}
27+
</td>
28+
</tr>
29+
</template>
30+
</v-data-table-virtual>
31+
</v-container>
32+
</v-app>
33+
</template>
34+
35+
<script setup>
36+
import { computed, ref } from 'vue'
37+
38+
const sizes = [100, 400, 800]
39+
const selectedSize = ref(100)
40+
41+
const headers = [
42+
{ title: 'ID', value: 'id', sortable: true },
43+
{ title: 'Title', value: 'title', sortable: true },
44+
{ title: 'Name', value: 'name', sortable: true },
45+
{ title: 'Email', value: 'email', sortable: true },
46+
{ title: 'Role', value: 'role', sortable: true },
47+
]
48+
49+
const baseItems = [
50+
{ title: 'Mr.', name: 'James Smith', email: '[email protected]', role: 'Owner' },
51+
{ title: 'Ms.', name: 'Mary Johnson', email: '[email protected]', role: 'Manager' },
52+
{ title: 'Dr.', name: 'Robert Williams', email: '[email protected]', role: 'Board Member' },
53+
{ title: 'Mrs.', name: 'Patricia Brown', email: '[email protected]', role: 'Developer' },
54+
{ title: 'Mr.', name: 'John Davis', email: '[email protected]', role: 'Designer' },
55+
{ title: 'Ms.', name: 'Jennifer Garcia', email: '[email protected]', role: 'Manager' },
56+
{ title: 'Mr.', name: 'Michael Miller', email: '[email protected]', role: 'Owner' },
57+
{ title: 'Mrs.', name: 'Linda Martinez', email: '[email protected]', role: 'Developer' },
58+
{ title: 'Dr.', name: 'William Rodriguez', email: '[email protected]', role: 'Board Member' },
59+
{ title: 'Ms.', name: 'Elizabeth Hernandez', email: '[email protected]', role: 'Designer' },
60+
{ title: 'Mr.', name: 'David Lopez', email: '[email protected]', role: 'Manager' },
61+
{ title: 'Mrs.', name: 'Barbara Gonzalez', email: '[email protected]', role: 'Owner' },
62+
]
63+
64+
const items = computed(() => {
65+
return Array.from({ length: selectedSize.value }).map((_, i) => {
66+
const base = baseItems[i % baseItems.length]
67+
return { id: i + 1, ...base }
68+
})
69+
})
70+
</script>
71+
72+
<script>
73+
export default {
74+
data () {
75+
return {
76+
sizes: [100, 400, 800],
77+
selectedSize: 100,
78+
headers: [
79+
{ title: 'ID', value: 'id', sortable: true },
80+
{ title: 'Title', value: 'title', sortable: true },
81+
{ title: 'Name', value: 'name', sortable: true },
82+
{ title: 'Email', value: 'email', sortable: true },
83+
{ title: 'Role', value: 'role', sortable: true },
84+
],
85+
baseItems: [
86+
{ title: 'Mr.', name: 'James Smith', email: '[email protected]', role: 'Owner' },
87+
{ title: 'Ms.', name: 'Mary Johnson', email: '[email protected]', role: 'Manager' },
88+
{ title: 'Dr.', name: 'Robert Williams', email: '[email protected]', role: 'Board Member' },
89+
{ title: 'Mrs.', name: 'Patricia Brown', email: '[email protected]', role: 'Developer' },
90+
{ title: 'Mr.', name: 'John Davis', email: '[email protected]', role: 'Designer' },
91+
{ title: 'Ms.', name: 'Jennifer Garcia', email: '[email protected]', role: 'Manager' },
92+
{ title: 'Mr.', name: 'Michael Miller', email: '[email protected]', role: 'Owner' },
93+
{ title: 'Mrs.', name: 'Linda Martinez', email: '[email protected]', role: 'Developer' },
94+
{ title: 'Dr.', name: 'William Rodriguez', email: '[email protected]', role: 'Board Member' },
95+
{ title: 'Ms.', name: 'Elizabeth Hernandez', email: '[email protected]', role: 'Designer' },
96+
{ title: 'Mr.', name: 'David Lopez', email: '[email protected]', role: 'Manager' },
97+
{ title: 'Mrs.', name: 'Barbara Gonzalez', email: '[email protected]', role: 'Owner' },
98+
],
99+
}
100+
},
101+
102+
computed: {
103+
items () {
104+
return Array.from({ length: this.selectedSize }).map((_, i) => {
105+
const base = this.baseItems[i % this.baseItems.length]
106+
return { id: i + 1, ...base }
107+
})
108+
},
109+
},
110+
}
111+
</script>

packages/docs/src/pages/en/components/data-tables/virtual-tables.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,3 +35,7 @@ The v-data-table-virtual component relies on all data being available locally. B
3535
### Basic example
3636

3737
<ExamplesExample file="v-data-table/virtual" />
38+
39+
When customizing rows with the `#item` slot, you must bind the provided `itemRef` to your `<tr>`. This ensures that the virtual scroller can correctly measure and recycle rows.
40+
41+
<ExamplesExample file="v-data-table/virtual-custom" />

packages/docs/src/pages/en/features/internationalization.md

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ If you are building custom Vuetify components that need to hook into the locale
173173

174174
## vue-i18n
175175

176-
If you are using the vue-i18n library, you can very easily integrate it with Vuetify. This allows you to keep all of your translations in one place. Simply create an entry for $vuetify within your messages and add the corresponding language changes. Then hook up vue-i18n to Vuetify by using the provided adapter function (as seen in the example below).
176+
If you are using the vue-i18n library, you can very easily integrate it with Vuetify. This allows you to keep all of your translations in one place. Simply use the spread operator to import the existing Vuetify messages and add the corresponding language changes. Then hook up vue-i18n to Vuetify by using the provided adapter function (as seen in the example below).
177177

178178
```js { resource="src/main.js" }
179179
import { createApp } from 'vue'
@@ -184,21 +184,19 @@ import { en, sv } from 'vuetify/locale'
184184

185185
const messages = {
186186
en: {
187-
$vuetify: {
188-
...en,
189-
dataIterator: {
190-
rowsPerPageText: 'Items per page:',
191-
pageText: '{0}-{1} of {2}',
192-
},
187+
...en,
188+
dataFooter: {
189+
...en.dataFooter,
190+
itemsPerPageText: 'Items per page:',
191+
pageText: '{0}-{1} of {2}',
193192
},
194193
},
195194
sv: {
196-
$vuetify: {
197-
...sv,
198-
dataIterator: {
199-
rowsPerPageText: 'Element per sida:',
200-
pageText: '{0}-{1} av {2}',
201-
},
195+
...sv,
196+
dataFooter: {
197+
...sv.dataFooter,
198+
itemsPerPageText: 'Element per sida:',
199+
pageText: '{0}-{1} av {2}',
202200
},
203201
},
204202
}

0 commit comments

Comments
 (0)