Skip to content

Commit 40e4472

Browse files
committed
Merge branch 'master' into dev
2 parents 18ac731 + 4df01ff commit 40e4472

File tree

27 files changed

+300
-152
lines changed

27 files changed

+300
-152
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.9.5"
16+
"version": "3.9.6"
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.9.5",
4+
"version": "3.9.6",
55
"private": true,
66
"description": "",
77
"scripts": {

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.9.5",
7+
"version": "3.9.6",
88
"repository": {
99
"type": "git",
1010
"url": "git+https://github.com/vuetifyjs/vuetify.git",

packages/docs/src/composables/markdown.ts

Lines changed: 50 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ export function useMarkdown () {
2020
return
2121
}
2222

23-
let markdownContent = `# ${frontmatter.value?.meta.title || 'Page Title'}\\n\\n`
24-
markdownContent += `Source: ${window.location.origin}${route.path}\\n\\n`
23+
let markdownContent = `# ${frontmatter.value?.meta.title || 'Page Title'}\n\n`
24+
markdownContent += `Source: ${window.location.origin}${route.path}\n\n`
2525

2626
try {
2727
const path = `packages/docs/src/pages${route.path.replace(/\/$/, '')}.md`
@@ -35,7 +35,54 @@ export function useMarkdown () {
3535

3636
if (response.data && 'content' in response.data) {
3737
const rawMd = atob(response.data.content)
38-
const contentWithoutFrontmatter = rawMd.replace(/---[\\s\\S]*?---/, '').trim()
38+
let processedMd = rawMd
39+
40+
// Remove <ApiInline /> and <ExamplesUsage /> tags completely
41+
processedMd = processedMd
42+
.replace(/<ApiInline[\s\S]*?>([\s\S]*?\/>\n\n)?/g, '')
43+
.replace(/<ExamplesUsage[\s\S]*?>([\s\S]*?\/>\n\n)?/g, '')
44+
45+
// Replace every <ExamplesExample ...> tag with the raw Vue source of its file
46+
if (processedMd.includes('<ExamplesExample')) {
47+
const tagRegex = /<ExamplesExample\b([^>]*?)>(?:[\s\S]*?<\/ExamplesExample>)|<ExamplesExample\b([^>]*?)\/>/g
48+
const matches = [...processedMd.matchAll(tagRegex)]
49+
50+
for (const m of matches) {
51+
const attrs = m[1] ?? m[2] ?? ''
52+
const fileMatch = attrs.match(/\bfile\s*=\s*"([^"]+)"/)
53+
if (!fileMatch) {
54+
// Remove tag if no file attribute
55+
processedMd = processedMd.replace(m[0], '')
56+
continue
57+
}
58+
59+
const filePath = fileMatch[1].replace(/\\+/g, '/').replace(/\/$/, '')
60+
const pathExamples = `packages/docs/src/examples/${filePath}.vue`
61+
62+
try {
63+
const responseExamples = await octokit.request('GET /repos/{owner}/{repo}/contents/{path}', {
64+
owner: 'vuetifyjs',
65+
repo: 'vuetify',
66+
path: pathExamples,
67+
ref: branch,
68+
})
69+
70+
if (responseExamples.data && 'content' in responseExamples.data) {
71+
const rawVue = atob(responseExamples.data.content)
72+
// Replace whole tag with fenced code block of the example source
73+
processedMd = processedMd.replace(m[0], `\n\`\`\`vue\n${rawVue}\n\`\`\`\n`)
74+
} else {
75+
// If fetch fails, strip the tag to avoid leaving placeholders
76+
processedMd = processedMd.replace(m[0], '')
77+
}
78+
} catch (e) {
79+
console.error('Error fetching example file', filePath, e)
80+
processedMd = processedMd.replace(m[0], '')
81+
}
82+
}
83+
}
84+
85+
const contentWithoutFrontmatter = processedMd.replace(/---[\s\S]*?---/, '').trim()
3986
markdownContent += contentWithoutFrontmatter
4087
} else {
4188
markdownContent += 'Could not fetch page content.'

packages/docs/src/data/team.json

Lines changed: 34 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -100,20 +100,6 @@
100100
"work": "CEO at Foundational Technologies LLC",
101101
"joined": "Feb 2021"
102102
},
103-
"yuwu9145": {
104-
"discord": "yuwu9145",
105-
"focus": [
106-
"[vuetifyjs](https://github.com/vuetifyjs)"
107-
],
108-
"languages": [
109-
"English",
110-
"Chinese(Mandarin)"
111-
],
112-
"location": "Melbourne, Australia",
113-
"name": "Yuchao Wu",
114-
"team": "core",
115-
"joined": "Mar 2023"
116-
},
117103
"userquin": {
118104
"discord": "userquin",
119105
"focus": [
@@ -130,26 +116,6 @@
130116
"team": "core",
131117
"joined": "Mar 2024"
132118
},
133-
"kieuminhcanh": {
134-
"discord": "kieuminhcanh",
135-
"focus": [
136-
"[vuetifyjs/studio](https://github.com/vuetifyjs/studio)"
137-
],
138-
"funding": [
139-
"[GitHub Sponsors](https://github.com/sponsors/kieuminhcanh)",
140-
"[Patreon](https://patreon.com/kieuminhcanh)",
141-
"[Open Collective](https://opencollective.com/vuetify)"
142-
],
143-
"languages": [
144-
"English",
145-
"Vietnamese"
146-
],
147-
"location": "California, US",
148-
"name": "Ken Kieu",
149-
"team": "core",
150-
"twitter": "kieuminhcanh",
151-
"joined": "April 2024"
152-
},
153119
"MatthewAry": {
154120
"discord": "bitshift_",
155121
"focus": [
@@ -193,16 +159,6 @@
193159
"location": "Delhi, India",
194160
"joined": "March 2025"
195161
},
196-
"eesayas": {
197-
"name": "Isaias Briones",
198-
"team": "core",
199-
"discord": "ibriones",
200-
"linkedin": "ibriones",
201-
"avatar": "https://avatars.githubusercontent.com/u/47291268",
202-
"focus": ["[vuetifyjs/*](https://github.com/vuetifyjs)"],
203-
"languages": ["English", "Filipino"],
204-
"location": "Edmonton, AB, Canada"
205-
},
206162
"Haviles04": {
207163
"name": "Henry Aviles",
208164
"team": "core",
@@ -280,6 +236,40 @@
280236
"joined": "March 2025",
281237
"location": "Casablanca, Morocco"
282238
},
239+
"yuwu9145": {
240+
"discord": "yuwu9145",
241+
"focus": [
242+
"[vuetifyjs](https://github.com/vuetifyjs)"
243+
],
244+
"languages": [
245+
"English",
246+
"Chinese(Mandarin)"
247+
],
248+
"location": "Melbourne, Australia",
249+
"name": "Yuchao Wu",
250+
"team": "legends",
251+
"joined": "Mar 2023"
252+
},
253+
"kieuminhcanh": {
254+
"discord": "kieuminhcanh",
255+
"focus": [
256+
"[vuetifyjs/studio](https://github.com/vuetifyjs/studio)"
257+
],
258+
"funding": [
259+
"[GitHub Sponsors](https://github.com/sponsors/kieuminhcanh)",
260+
"[Patreon](https://patreon.com/kieuminhcanh)",
261+
"[Open Collective](https://opencollective.com/vuetify)"
262+
],
263+
"languages": [
264+
"English",
265+
"Vietnamese"
266+
],
267+
"location": "California, US",
268+
"name": "Ken Kieu",
269+
"team": "legends",
270+
"twitter": "kieuminhcanh",
271+
"joined": "April 2024"
272+
},
283273
"jacekkarczmarczyk": {
284274
"discord": "jacek#3542",
285275
"languages": [

packages/docs/src/examples/v-btn/prop-icon.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
</v-col>
77

88
<v-col cols="auto">
9-
<v-btn density="comfortable" icon="$vuetify"></v-btn>
9+
<v-btn density="comfortable" icon="mdi-cow"></v-btn>
1010
</v-col>
1111

1212
<v-col cols="auto">
@@ -24,7 +24,7 @@
2424
</v-col>
2525

2626
<v-col cols="auto">
27-
<v-btn icon="$vuetify"></v-btn>
27+
<v-btn icon="mdi-cow"></v-btn>
2828
</v-col>
2929

3030
<v-col cols="auto">

packages/docs/src/pages/en/components/icon-buttons.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ related:
1010
- /components/buttons/
1111
- /components/floating-action-buttons/
1212
features:
13-
github: /components/VIconBtn/
13+
github: /labs/VIconBtn/
1414
label: 'C: VIconBtn'
1515
report: true
1616
spec: https://m3.material.io/components/icon-buttons/

packages/docs/src/pages/en/features/icon-fonts.md

Lines changed: 54 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -439,12 +439,64 @@ app.mount('#app')
439439
</template>
440440
```
441441

442-
## Built-in aliases
442+
## Icon aliases
443443

444-
The following icons are available as aliases for use in Vuetify components:
444+
Icon aliases allow you to define short, reusable names for icons that can map to different sources — such as icon names from a set, local Vue components, or raw SVG paths. Aliases are referenced with an initial `$` followed by the name of the alias, e.g. `$product`. The following icons are available as aliases for use in Vuetify components:
445445

446446
<DocIconTable />
447447

448+
### Custom aliases
449+
450+
If you are developing custom Vuetify components, you can extend the `aliases` object to utilize the same functionality that internal Vuetify components use. This makes it easier to manage icons consistently throughout your project.
451+
452+
Here’s an example:
453+
454+
```js { resource="src/plugins/vuetify.js" }
455+
import { createVuetify } from 'vuetify'
456+
import AccountIcon from './account-icon.vue'
457+
import ClosetIcon from './closet-icon.vue'
458+
459+
export const customIcons = {
460+
mdiCustomAlias: 'mdi-cow',
461+
account: AccountIcon,
462+
annotation: [
463+
'M14 9.45h-1v-1a1 1 0 0 0-2 0v1h-1a1 1 0 0 0 0 2h1v1a1 1 0 0 0 2 0v-1h1a1 1 0 0 0 0-2Zm6.46.18A8.5 8.5 0 1 0 6 16.46l5.3 5.31a1 1 0 0 0 1.42 0L18 16.46a8.46 8.46 0 0 0 2.46-6.83Zm-3.86 5.42l-4.6 4.6l-4.6-4.6a6.49 6.49 0 0 1-1.87-5.22A6.57 6.57 0 0 1 8.42 5a6.47 6.47 0 0 1 7.16 0a6.57 6.57 0 0 1 2.89 4.81a6.49 6.49 0 0 1-1.87 5.24Z',
464+
],
465+
closet: ClosetIcon,
466+
}
467+
468+
export const vuetify = createVuetify({
469+
theme: {
470+
defaultTheme: 'light',
471+
//
472+
},
473+
icons: {
474+
defaultSet: 'mdi',
475+
aliases: {
476+
...customIcons,
477+
},
478+
},
479+
})
480+
```
481+
482+
```html
483+
<template>
484+
<v-btn prepend-icon="$account">Custom Icon 1</v-btn>
485+
<v-btn prepend-icon="$mdiCustomAlias">Custom Icon 2</v-btn>
486+
<v-btn prepend-icon="$closet">Custom Icon 3</v-btn>
487+
<v-btn prepend-icon="$annotation">Custom Icon 4</v-btn>
488+
<v-btn prepend-icon="mdi-close">Default MDI Icon</v-btn>
489+
</template>
490+
```
491+
492+
In this setup:
493+
494+
* $account and $closet render your own Vue component SVG icons.
495+
* $mdiCustomAlias references an alias for the mdi-cow icon.
496+
* $annotation references inline SVG path data.
497+
498+
This approach gives you flexibility: you can mix external libraries with your own icons seamlessly, while keeping your templates cleaner and easier to maintain.
499+
448500
## Multiple icon sets
449501

450502
Out of the box, Vuetify supports the use of multiple *different* icon sets at the same time. The following example demonstrates how to change the default icon font to Font Awesome (`fa`) while still maintaining access to the original Material Design Icons (`mdi`) through the use of a prefix:
@@ -550,29 +602,3 @@ export default createVuetify({
550602
},
551603
})
552604
```
553-
554-
## Extending available aliases
555-
556-
If you are developing custom Vuetify components, you can extend the `aliases` object to utilize the same functionality that internal Vuetify components use. Icon aliases are referenced with an initial `$` followed by the name of the alias, e.g. `$product`.
557-
558-
```js { resource="src/plugins/vuetify.js" }
559-
import { createVuetify } from 'vuetify'
560-
import { aliases, mdi } from 'vuetify/iconsets/mdi'
561-
562-
export default createVuetify({
563-
icons: {
564-
aliases: {
565-
...aliases,
566-
product: 'mdi-dropbox',
567-
support: 'mdi-lifebuoy',
568-
},
569-
},
570-
})
571-
```
572-
573-
```html
574-
<template>
575-
<v-icon icon="$product" />
576-
<v-icon icon="$support" />
577-
</template>
578-
```

packages/vuetify/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "vuetify",
33
"description": "Vue Material Component Framework",
4-
"version": "3.9.5",
4+
"version": "3.9.6",
55
"author": {
66
"name": "John Leider",
77
"email": "[email protected]"

packages/vuetify/src/components/VBtn/VBtn.sass

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,3 +268,15 @@
268268

269269
.v-pagination__item--is-active .v-btn__overlay
270270
opacity: $button-pagination-active-overlay-opacity
271+
272+
@media (forced-colors: active)
273+
.v-btn
274+
&:not(
275+
&--variant-text,
276+
&--variant-plain
277+
)
278+
border: thin solid
279+
280+
&:focus-visible
281+
outline: 2px solid
282+
outline-offset: 2px

0 commit comments

Comments
 (0)