diff --git a/.eslintrc.js b/.eslintrc.js index 92ae70b7419..4138d442178 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -94,6 +94,14 @@ module.exports = { 'vue/require-prop-types': 'off', 'vue/one-component-per-file': 'off', 'vue/custom-event-name-casing': ['error', { ignores: ['/^[a-z]+(?:-[a-z]+)*:[a-z]+(?:-[a-z]+)*$/u'] }], + + 'vue/attributes-order': ['error', { + order: [ + 'DEFINITION', 'LIST_RENDERING', 'CONDITIONALS', 'RENDER_MODIFIERS', 'UNIQUE', 'GLOBAL', 'SLOT', + 'TWO_WAY_BINDING', 'ATTR_DYNAMIC', 'ATTR_STATIC', 'ATTR_SHORTHAND_BOOL', 'OTHER_DIRECTIVES', 'EVENTS', 'CONTENT', + ], + alphabetical: true, + }], }, overrides: [ { diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml new file mode 100644 index 00000000000..2b7abfdfc6d --- /dev/null +++ b/.github/workflows/stale.yml @@ -0,0 +1,19 @@ +name: 'Close stale issues' +on: + workflow_dispatch: + schedule: + - cron: '08 11 * * *' + +jobs: + stale: + runs-on: ubuntu-latest + steps: + - uses: actions/stale@v9 + with: + days-before-stale: 180 + days-before-close: 14 + only-labels: 'S: triage' + stale-issue-label: 'S: stale' + stale-pr-label: 'S: stale' + exempt-all-milestones: true + exempt-draft-pr: true diff --git a/lerna.json b/lerna.json index 5c9cb5dff1e..9203879c545 100644 --- a/lerna.json +++ b/lerna.json @@ -13,6 +13,6 @@ } }, "npmClient": "yarn", - "version": "3.5.3", + "version": "3.5.8", "useWorkspaces": true } diff --git a/package.json b/package.json index 7eab0934c09..f76165e6f1f 100755 --- a/package.json +++ b/package.json @@ -43,12 +43,12 @@ "@typescript-eslint/eslint-plugin": "^6.18.1", "@typescript-eslint/parser": "^6.18.1", "@unhead/vue": "^1.8.9", - "@vue/compiler-sfc": "^3.4.7", + "@vue/compiler-sfc": "^3.4.19", "@vueuse/head": "^1.3.1", "babel-eslint": "^10.1.0", "babel-jest": "^28.1.3", "conventional-changelog-cli": "^4.1.0", - "conventional-changelog-vuetify": "^1.1.0", + "conventional-changelog-vuetify": "^1.2.1", "conventional-github-releaser": "^3.1.5", "cross-env": "^7.0.3", "cross-spawn": "^7.0.3", @@ -82,10 +82,14 @@ "upath": "^2.0.1", "vite-plugin-inspect": "^0.7.42", "vite-plugin-warmup": "^0.1.0", - "vue": "^3.4.7", + "vue": "^3.4.19", "vue-analytics": "^5.16.1", "vue-router": "^4.2.5", "vue-tsc": "^1.8.27", "yargs": "^17.7.2" + }, + "resolutions": { + "conventional-changelog": "4.0.0", + "conventional-changelog-preset-loader": "3.0.0" } } diff --git a/packages/api-generator/package.json b/packages/api-generator/package.json index f8647adbe9e..c15d98935d6 100755 --- a/packages/api-generator/package.json +++ b/packages/api-generator/package.json @@ -1,6 +1,6 @@ { "name": "@vuetify/api-generator", - "version": "3.5.3", + "version": "3.5.8", "private": true, "description": "", "scripts": { @@ -16,8 +16,8 @@ "prettier": "^3.1.1", "ts-morph": "^20.0.0", "tsx": "^4.6.2", - "vue": "^3.4.7", - "vuetify": "^3.5.3" + "vue": "^3.4.19", + "vuetify": "^3.5.8" }, "devDependencies": { "@types/stringify-object": "^4.0.5" diff --git a/packages/api-generator/src/index.ts b/packages/api-generator/src/index.ts index 7115d5693a8..0521edd3a1f 100644 --- a/packages/api-generator/src/index.ts +++ b/packages/api-generator/src/index.ts @@ -4,6 +4,7 @@ import { components } from 'vuetify/dist/vuetify-labs.js' import importMap from 'vuetify/dist/json/importMap.json' assert { type: 'json' } import importMapLabs from 'vuetify/dist/json/importMap-labs.json' assert { type: 'json' } import { kebabCase } from './helpers/text' +import type { BaseData, ComponentData, DirectiveData } from './types' import { generateComposableDataFromTypes, generateDirectiveDataFromTypes } from './types' import Piscina from 'piscina' import { addDescriptions, addDirectiveDescriptions, addPropData, stringifyProps } from './utils' @@ -36,6 +37,9 @@ const componentsInfo: Record = { ...importMapLabs.components, } +type Truthy = Exclude; +const BooleanFilter = (x: T): x is Truthy => Boolean(x) + const run = async () => { const argv = await yar.argv @@ -64,7 +68,7 @@ const run = async () => { const outPath = path.resolve('./dist/api') await mkdirp(outPath) - const componentData = await Promise.all( + const componentData = (await Promise.all( Object.entries(components).map(async ([componentName, componentInstance]) => { if (argv.components && !argv.components.includes(componentName)) return null @@ -74,40 +78,50 @@ const run = async () => { await addDescriptions(componentName, data, locales, sources) const sass = parseSassVariables(componentName) - const component = { displayName: componentName, fileName: kebabCase(componentName), ...data, sass } - await fs.writeFile(path.resolve(outPath, `${componentName}.json`), JSON.stringify(component, null, 2)) + const component = { + displayName: componentName, + fileName: componentName, + pathName: kebabCase(componentName), + ...data, + sass, + } satisfies ComponentData + await fs.writeFile(path.resolve(outPath, `${component.fileName}.json`), JSON.stringify(component, null, 2)) return component - }).filter(Boolean) - ) + }) + )).filter(BooleanFilter) // Composables if (!argv.skipComposables) { const composables = await Promise.all((await generateComposableDataFromTypes()).map(async composable => { - console.log(blue, composable.name, reset) - const kebabName = kebabCase(composable.name) - await addDescriptions(composable.name, composable.data, locales) - return { fileName: kebabName, displayName: composable.name, ...composable } + console.log(blue, composable.displayName, reset) + await addDescriptions(composable.fileName, composable, locales) + return composable })) - for (const { displayName, fileName, data } of composables) { - await fs.writeFile(path.resolve(outPath, `${displayName}.json`), JSON.stringify({ displayName, fileName, ...data }, null, 2)) + for (const composable of composables) { + await fs.writeFile( + path.resolve(outPath, `${composable.fileName}.json`), + JSON.stringify(composable, null, 2) + ) } } // Directives - let directives: any[] = [] + let directives: DirectiveData[] = [] if (!argv.skipDirectives) { - directives = await Promise.all((await generateDirectiveDataFromTypes()).map(async directive => { - const name = `v-${kebabCase(directive.name)}` - console.log(blue, name, reset) - await addDirectiveDescriptions(name, directive, locales) + directives = await Promise.all((await generateDirectiveDataFromTypes()).map(async data => { + console.log(blue, data.fileName, reset) + await addDirectiveDescriptions(data.fileName, data, locales) - return { fileName: name, displayName: name, ...directive } + return data })) - for (const { displayName, fileName, ...directive } of directives) { - await fs.writeFile(path.resolve(outPath, `${fileName}.json`), JSON.stringify({ displayName, fileName, ...directive }, null, 2)) + for (const directive of directives) { + await fs.writeFile( + path.resolve(outPath, `${directive.fileName}.json`), + JSON.stringify(directive, null, 2) + ) } } diff --git a/packages/api-generator/src/locale/en/Select.json b/packages/api-generator/src/locale/en/Select.json index 46d3a4625b9..e2af9a03120 100644 --- a/packages/api-generator/src/locale/en/Select.json +++ b/packages/api-generator/src/locale/en/Select.json @@ -5,6 +5,7 @@ "closableChips": "Enables the [closable](/api/v-chip/#props-closable) prop on all [v-chip](/components/chips/) components.", "hideSelected": "Do not display in the select menu items that are already selected.", "itemColor": "Sets color of selected items.", + "listProps": "Pass props through to the `v-list` component. Accepts an object with anything from [v-list](/api/v-list/#props) props, camelCase keys are recommended.", "menuProps": "Pass props through to the `v-menu` component. Accepts an object with anything from [v-menu](/api/v-menu/#props) props, camelCase keys are recommended.", "multiple": "Changes select to multiple. Accepts array for value.", "openOnClear": "Open's the menu whenever the clear icon is clicked.", diff --git a/packages/api-generator/src/locale/en/VBtn.json b/packages/api-generator/src/locale/en/VBtn.json index 222417ff8e5..4b1b7db3bf8 100644 --- a/packages/api-generator/src/locale/en/VBtn.json +++ b/packages/api-generator/src/locale/en/VBtn.json @@ -6,5 +6,8 @@ "plain": "Removes the default background change applied when hovering over the button.", "stacked": "Displays the button as a flex-column.", "slim": "Reduces padding to 0 8px." + }, + "exposed": { + "group": "Internal representation when used in VBtnToggle." } } diff --git a/packages/api-generator/src/locale/en/VChipGroup.json b/packages/api-generator/src/locale/en/VChipGroup.json index 3d6c467320d..66adad8c9ed 100644 --- a/packages/api-generator/src/locale/en/VChipGroup.json +++ b/packages/api-generator/src/locale/en/VChipGroup.json @@ -3,7 +3,6 @@ "centerActive": "Forces the selected chip to be centered.", "column": "Remove horizontal pagination and wrap items as needed.", "filter": "Applies an checkmark icon in front of every chip for using it like a filter.", - "mobileBreakpoint": "Sets the designated mobile breakpoint for the component.", "nextIcon": "Specify the icon to use for the next icon.", "prependIcon": "This icon used in the prepend slot (if shown).", "prevIcon": "Specify the icon to use for the prev icon.", diff --git a/packages/api-generator/src/locale/en/VConfirmEdit.json b/packages/api-generator/src/locale/en/VConfirmEdit.json new file mode 100644 index 00000000000..2ebe5cdd16f --- /dev/null +++ b/packages/api-generator/src/locale/en/VConfirmEdit.json @@ -0,0 +1,6 @@ +{ + "props": { + "cancelText": "Text for the cancel button", + "okText": "Text for the ok button" + } +} diff --git a/packages/api-generator/src/locale/en/VDataTableRows.json b/packages/api-generator/src/locale/en/VDataTableRows.json index 5a1a023e788..65a41784031 100644 --- a/packages/api-generator/src/locale/en/VDataTableRows.json +++ b/packages/api-generator/src/locale/en/VDataTableRows.json @@ -1,8 +1,10 @@ { "props": { + "cellProps": "An object of additional props to be passed to each `` in the table body. Also accepts a function that will be called for each cell. If the same prop is defined both here and in `cellProps` in a headers object, the value from the headers object will be used.", "loading": "Displays `loading` slot if set to `true`", "loadingText": "Text shown when the data is loading.", - "multiSort": "Allows sorting by multiple columns." + "multiSort": "Allows sorting by multiple columns.", + "rowProps": "An object of additional props to be passed to each `` in the table body. Also accepts a function that will be called for each row." }, "events": { "click:row": "Emitted when a row is clicked. Native event is passed as the first argument, row data as the second." diff --git a/packages/api-generator/src/locale/en/VDatePicker.json b/packages/api-generator/src/locale/en/VDatePicker.json index 2f5349e6fad..2234f5b312e 100644 --- a/packages/api-generator/src/locale/en/VDatePicker.json +++ b/packages/api-generator/src/locale/en/VDatePicker.json @@ -1,6 +1,5 @@ { "props": { - "activePicker": "Determines which picker in the date or month picker is being displayed. Allowed values: `'DATE'`, `'MONTH'`, `'YEAR'`.", "allowedDates": "Restricts which dates can be selected.", "calendarIcon": "The icon shown in the header when in 'input' **input-mode**.", "dayFormat": "Allows you to customize the format of the day string that appears in the date table. Called with date (ISO 8601 **date** string) arguments.", @@ -18,6 +17,7 @@ "localeFirstDayOfYear": "Sets the day that determines the first week of the year, starting with 0 for **Sunday**. For ISO 8601 this should be 4.", "max": "Maximum allowed date/month (ISO 8601 format).", "min": "Minimum allowed date/month (ISO 8601 format).", + "modeIcon": "Icon displayed next to the current month and year, toggles year selection when clicked.", "monthFormat": "Formatting function used for displaying months in the months table. Called with date (ISO 8601 **date** string) arguments.", "multiple": "Allow the selection of multiple dates. The **range** value selects all dates between two selections.", "nextIcon": "Sets the icon for next month/year button.", @@ -33,6 +33,7 @@ "titleDateFormat": "Allows you to customize the format of the date string that appears in the title of the date picker. Called with date (ISO 8601 **date** string) arguments.", "type": "Determines the type of the picker - `date` for date picker, `month` for month picker.", "value": "Date picker model (ISO 8601 format, YYYY-mm-dd or YYYY-mm).", + "viewMode": "Determines which picker in the date or month picker is being displayed. Allowed values: `'month'`, `'months'`, `'year'`.", "weekdayFormat": "Allows you to customize the format of the weekday string that appears in the body of the calendar. Called with date (ISO 8601 **date** string) arguments.", "width": "Width of the picker.", "yearFormat": "Allows you to customize the format of the year string that appears in the header of the calendar. Called with date (ISO 8601 **date** string) arguments.", @@ -43,7 +44,6 @@ ":month": "Emitted when the specified DOM event occurs on the month button.", ":year": "Emitted when the specified DOM event occurs on the year button.", "change": "Reactive date picker emits `input` even when any part of the date (year/month/day) changes, but `change` event is emitted only when the day (for date pickers) or month (for month pickers) changes. If `range` prop is set, date picker emits `change` when both [from, to] are selected.", - "update:activePicker": "The `.sync` event for `active-picker` prop.", "update:pickerDate": "The `.sync` event for `picker-date` prop." } } diff --git a/packages/api-generator/src/locale/en/VEmptyState.json b/packages/api-generator/src/locale/en/VEmptyState.json new file mode 100644 index 00000000000..7e0a4593d30 --- /dev/null +++ b/packages/api-generator/src/locale/en/VEmptyState.json @@ -0,0 +1,18 @@ +{ + "props": { + "actionText": "The text used for the action button.", + "headline": "A large headline often used for 404 pages.", + "href": "The URL the action button links to.", + "justify": "Control the justification of the text.", + "textWidth": "Sets the width of the text container.", + "to": "The URL the action button links to." + }, + "events": { + "click:action": "Event emitted when the action button is clicked." + }, + "slots": { + "actions": "Slot for the action button.", + "headline": "Slot for the component's headline.", + "media": "Slot for the component's media." + } +} diff --git a/packages/api-generator/src/locale/en/VFab.json b/packages/api-generator/src/locale/en/VFab.json new file mode 100644 index 00000000000..d40545ee82b --- /dev/null +++ b/packages/api-generator/src/locale/en/VFab.json @@ -0,0 +1,9 @@ +{ + "props": { + "app": "If true, attaches to the closest layout and positions according to the value of **location**.", + "appear": "Used to control the animation of the FAB.", + "extended": "An alternate style for the FAB that expects text.", + "location": "The location of the fab relative to the layout. Only works when using **app**.", + "offset": "Translates the Fab up or down, depending on if location is set to **top** or **bottom**." + } +} diff --git a/packages/api-generator/src/locale/en/VMenu.json b/packages/api-generator/src/locale/en/VMenu.json index eb773776e0d..1c722b31e76 100644 --- a/packages/api-generator/src/locale/en/VMenu.json +++ b/packages/api-generator/src/locale/en/VMenu.json @@ -1,6 +1,7 @@ { "props": { "attach": "Specifies which DOM element the overlay content should teleport to. Can be a direct element reference, querySelector string, or `true` to disable teleporting. Uses `body` by default. Generally not recommended except as a last resort: the default positioning algorithm should handle most scenarios better than is possible without teleporting, and you may have unexpected behavior if the menu ends up as child of its activator.", + "id": "The unique identifier of the component.", "closeOnClick": "Designates if menu should close on outside-activator click.", "closeOnContentClick": "Designates if menu should close when its content is clicked.", "closeDelay": "Milliseconds to wait before closing component. Only works with the **open-on-hover** prop.", diff --git a/packages/api-generator/src/locale/en/VSlideGroup.json b/packages/api-generator/src/locale/en/VSlideGroup.json index 2ba3a20de32..4003ee86c94 100644 --- a/packages/api-generator/src/locale/en/VSlideGroup.json +++ b/packages/api-generator/src/locale/en/VSlideGroup.json @@ -1,6 +1,7 @@ { "props": { "centerActive": "Forces the selected component to be centered.", + "direction": "Switch between horizontal and vertical modes.", "mobileBreakpoint": "Sets the designated mobile breakpoint for the component.", "nextIcon": "The appended slot when arrows are shown.", "prevIcon": "The prepended slot when arrows are shown.", diff --git a/packages/api-generator/src/locale/en/display.json b/packages/api-generator/src/locale/en/display.json new file mode 100644 index 00000000000..b60f4b1ce3f --- /dev/null +++ b/packages/api-generator/src/locale/en/display.json @@ -0,0 +1,5 @@ +{ + "props": { + "mobileBreakpoint": "Sets the designated mobile breakpoint for the component." + } +} diff --git a/packages/api-generator/src/locale/en/rounded.json b/packages/api-generator/src/locale/en/rounded.json index 68f51481c65..6d712a651b6 100644 --- a/packages/api-generator/src/locale/en/rounded.json +++ b/packages/api-generator/src/locale/en/rounded.json @@ -1,5 +1,6 @@ { "props": { - "rounded": "Designates the **border-radius** applied to the component. You can find more information on the [Border Radius page](/styles/border-radius)." + "rounded": "Designates the **border-radius** applied to the component. You can find more information on the [Border Radius page](/styles/border-radius).", + "tile": "Removes any applied **border-radius** from the component." } } diff --git a/packages/api-generator/src/types.ts b/packages/api-generator/src/types.ts index 16076570d83..998b7b83481 100644 --- a/packages/api-generator/src/types.ts +++ b/packages/api-generator/src/types.ts @@ -1,6 +1,7 @@ import type { Node, Type } from 'ts-morph' import { Project, ts } from 'ts-morph' import { prettifyType } from './utils' +import { kebabCase } from './helpers/text' const project = new Project({ tsConfigFilePath: './tsconfig.json', @@ -29,15 +30,15 @@ async function inspect (project: Project, node?: Node) { throw new Error(`Unsupported node kind: ${kind}`) } -export async function generateComposableDataFromTypes () { +export async function generateComposableDataFromTypes (): Promise { const sourceFile = project.addSourceFileAtPath('./templates/composables.d.ts') const composables = await inspect(project, sourceFile.getTypeAlias('Composables')) - return await Promise.all( + return Promise.all( Object.entries(composables.properties).map(async ([name, data]) => { const returnType = (data as FunctionDefinition).returnType - let exposed: Record | undefined + let exposed: Record = {} if (returnType.type === 'allOf') { exposed = returnType.items.reduce((acc, item) => { const props = (item as ObjectDefinition).properties @@ -56,33 +57,38 @@ export async function generateComposableDataFromTypes () { ) } + const kebabName = kebabCase(name) + return { - name, - data: { - exposed, - }, + fileName: name, + displayName: name, + pathName: kebabName, + exposed, } }) - ) as { name: string, data: { exposed: Record } }[] + ) } -export async function generateDirectiveDataFromTypes () { +export async function generateDirectiveDataFromTypes (): Promise { const sourceFile = project.addSourceFileAtPath('./templates/directives.d.ts') const directives = await inspect(project, sourceFile.getTypeAlias('Directives')) - return await Promise.all( + return Promise.all( Object.entries(directives.properties).map(async ([name, data]) => { + const kebabName = kebabCase(name) return { - name, + fileName: `v-${kebabName}`, + displayName: `v-${kebabName}`, + pathName: `v-${kebabName}-directive`, argument: { value: await prettifyType(name, (data as ObjectDefinition).properties.value) }, modifiers: ((data as ObjectDefinition).properties.modifiers as ObjectDefinition).properties, } }) - ) as { name: string, argument: { value: Definition }, modifiers: Record }[] + ) } -export async function generateComponentDataFromTypes (component: string) { +export async function generateComponentDataFromTypes (component: string): Promise { const sourceFile = project.addSourceFileAtPath(`./templates/tmp/${component}.d.ts`) const props = await inspect(project, sourceFile.getTypeAlias('ComponentProps')) @@ -200,6 +206,40 @@ export type Definition = | RecordDefinition | InterfaceDefinition +export type BaseData = { + displayName: string // user visible name used in page titles + fileName: string // file name for translation strings and generated types + pathName: string // kebab-case name for use in urls +} +export type ComponentData = BaseData & { + sass: Record + props: Record + slots: Record + events: Record + exposed: Record + argument?: never + modifiers?: never +} +export type DirectiveData = BaseData & { + sass?: never + props?: never + slots?: never + events?: never + exposed?: never + argument: { value: Definition } + modifiers: Record +} +export type ComposableData = BaseData & { + sass?: never + props?: never + slots?: never + events?: never + exposed: Record + argument?: never + modifiers?: never +} +export type PartData = ComponentData | DirectiveData | ComposableData + function isExternalDeclaration (declaration?: Node, definitionText?: string) { const filePath = declaration?.getSourceFile().getFilePath() diff --git a/packages/api-generator/src/vetur.ts b/packages/api-generator/src/vetur.ts index f36473eaf15..08b771426b5 100644 --- a/packages/api-generator/src/vetur.ts +++ b/packages/api-generator/src/vetur.ts @@ -1,15 +1,6 @@ import fs from 'fs' import { kebabCase } from './helpers/text' -import type { Definition } from './types' - -type ComponentData = { - props: Record - slots: Record - events: Record - exposed: Record - displayName: string - fileName: string -} +import type { ComponentData } from './types' export function createVeturApi (componentData: ComponentData[]) { const tags = componentData.reduce((obj, component) => { diff --git a/packages/api-generator/src/web-types.ts b/packages/api-generator/src/web-types.ts index 559d74db2c9..2303e7a2271 100644 --- a/packages/api-generator/src/web-types.ts +++ b/packages/api-generator/src/web-types.ts @@ -1,24 +1,8 @@ import fs from 'fs' import { capitalize } from './helpers/text' -import type { Definition, ObjectDefinition } from './types' +import type { ComponentData, DirectiveData } from './types' import pkg from '../package.json' assert { type: 'json' } -type ComponentData = { - props: Definition - slots: Definition - events: Definition - exposed: Definition - displayName: string - fileName: string -} - -type DirectiveData = { - name: string - fileName: string - argument: { value: Definition } - modifiers: Record -} - export const createWebTypesApi = (componentData: ComponentData[], directiveData: DirectiveData[]) => { const getDocUrl = (cmp: string, heading?: string) => `https://vuetifyjs.com/api/${cmp}` + (heading ? `#${heading}` : '') @@ -36,7 +20,7 @@ export const createWebTypesApi = (componentData: ComponentData[], directiveData: name, pattern: undefined, description: slot.description.en || '', - 'doc-url': getDocUrl(component.fileName, 'slots'), + 'doc-url': getDocUrl(component.pathName, 'slots'), 'vue-properties': slot.properties && Object.entries(slot.properties ?? {}).map(([name, prop]) => createTypedEntity(name, (prop as any).formatted)), } @@ -46,7 +30,7 @@ export const createWebTypesApi = (componentData: ComponentData[], directiveData: return { name, description: event.description.en || '', - 'doc-url': getDocUrl(component.fileName, 'events'), + 'doc-url': getDocUrl(component.pathName, 'events'), arguments: [createTypedEntity('argument', event.formatted)], } } @@ -78,7 +62,7 @@ export const createWebTypesApi = (componentData: ComponentData[], directiveData: }, aliases: undefined, // TODO: are we using this? deprecated name changes? description: '', // TODO: we should probably include component description in locale files - 'doc-url': getDocUrl(component.fileName), + 'doc-url': getDocUrl(component.pathName), attributes: Object.entries(component.props ?? {}).map(createTagAttribute), events: Object.entries(component.events ?? {}).map(createTagEvent), slots: Object.entries(component.slots ?? {}).map(createTagSlot), @@ -94,7 +78,7 @@ export const createWebTypesApi = (componentData: ComponentData[], directiveData: return { pattern: undefined, description: argument.description.en, - 'doc-url': getDocUrl(directive.name, 'argument'), + 'doc-url': getDocUrl(directive.pathName, 'argument'), required: undefined, } } @@ -104,7 +88,7 @@ export const createWebTypesApi = (componentData: ComponentData[], directiveData: name, pattern: undefined, description: modifier.description.en || '', - 'doc-url': getDocUrl(directive.name, 'modifiers'), + 'doc-url': getDocUrl(directive.pathName, 'modifiers'), } } @@ -116,16 +100,16 @@ export const createWebTypesApi = (componentData: ComponentData[], directiveData: } return { - name: directive.name, + name: directive.displayName, aliases: undefined, description: '', // TODO: we should probably include directive description in locale files - 'doc-url': getDocUrl(directive.name), + 'doc-url': getDocUrl(directive.pathName), default: '', required: false, value: createAttributeValue(directive.argument), source: { module: './src/directives/index.ts', - symbol: capitalize(directive.name.slice(2)), + symbol: capitalize(directive.displayName.slice(2)), }, 'vue-argument': directive.argument?.value && createAttributeVueArgument(directive.argument?.value), // TODO: how to use this in comparison to value? 'vue-modifiers': directive.modifiers && diff --git a/packages/docs/.eslintrc.js b/packages/docs/.eslintrc.js index 34f8338c918..80ac3912be8 100644 --- a/packages/docs/.eslintrc.js +++ b/packages/docs/.eslintrc.js @@ -3,6 +3,7 @@ module.exports = { 'vue/setup-compiler-macros': true, }, rules: { + 'no-undef': 'off', 'vue/multi-word-component-names': 'off', }, overrides: [ diff --git a/packages/docs/auto-imports.d.ts b/packages/docs/auto-imports.d.ts new file mode 100644 index 00000000000..3bc41125982 --- /dev/null +++ b/packages/docs/auto-imports.d.ts @@ -0,0 +1,273 @@ +/* eslint-disable */ +/* prettier-ignore */ +// @ts-nocheck +// noinspection JSUnusedGlobalSymbols +// Generated by unplugin-auto-import +export {} +declare global { + const ComponentPublicInstance: typeof import('vue')['ComponentPublicInstance'] + const IN_BROWSER: typeof import('./src/utils/globals')['IN_BROWSER'] + const IS_DEBUG: typeof import('./src/utils/globals')['IS_DEBUG'] + const IS_PROD: typeof import('./src/utils/globals')['IS_PROD'] + const IS_SERVER: typeof import('./src/utils/globals')['IS_SERVER'] + const PropType: typeof import('vue')['PropType'] + const anyLanguagePattern: typeof import('./src/utils/routes')['anyLanguagePattern'] + const camelCase: typeof import('lodash-es')['camelCase'] + const camelize: typeof import('vue')['camelize'] + const computed: typeof import('vue')['computed'] + const configureMarkdown: typeof import('./src/utils/markdown-it')['configureMarkdown'] + const copyElementContent: typeof import('./src/utils/helpers')['copyElementContent'] + const createAdProps: typeof import('./src/composables/ad')['createAdProps'] + const createOne: typeof import('@vuetify/one')['createOne'] + const defineStore: typeof import('pinia')['defineStore'] + const disabledLanguagePattern: typeof import('./src/utils/routes')['disabledLanguagePattern'] + const distance: typeof import('./src/utils/helpers')['distance'] + const eventName: typeof import('./src/utils/helpers')['eventName'] + const genAppMetaInfo: typeof import('./src/utils/metadata')['genAppMetaInfo'] + const genMetaInfo: typeof import('./src/utils/metadata')['genMetaInfo'] + const generatedRoutes: typeof import('./src/utils/routes')['generatedRoutes'] + const getBranch: typeof import('./src/utils/helpers')['getBranch'] + const getMatchMedia: typeof import('./src/utils/helpers')['getMatchMedia'] + const gtagClick: typeof import('./src/utils/analytics')['gtagClick'] + const h: typeof import('vue')['h'] + const insertLinks: typeof import('./src/utils/api')['insertLinks'] + const isOn: typeof import('./src/utils/helpers')['isOn'] + const kebabCase: typeof import('lodash-es')['kebabCase'] + const languagePattern: typeof import('./src/utils/routes')['languagePattern'] + const leadingSlash: typeof import('./src/utils/routes')['leadingSlash'] + const markdownItRules: typeof import('./src/utils/markdown-it-rules')['default'] + const mergeProps: typeof import('vue')['mergeProps'] + const nextTick: typeof import('vue')['nextTick'] + const onBeforeMount: typeof import('vue')['onBeforeMount'] + const onBeforeRouteLeave: typeof import('vue-router')['onBeforeRouteLeave'] + const onBeforeRouteUpdate: typeof import('vue-router')['onBeforeRouteUpdate'] + const onBeforeUnMount: typeof import('vue')['onBeforeUnMount'] + const onBeforeUnmount: typeof import('vue')['onBeforeUnmount'] + const onMounted: typeof import('vue')['onMounted'] + const onScopeDispose: typeof import('vue')['onScopeDispose'] + const onServerPrefetch: typeof import('vue')['onServerPrefetch'] + const preferredLocale: typeof import('./src/utils/routes')['preferredLocale'] + const propsToString: typeof import('./src/utils/helpers')['propsToString'] + const redirectRoutes: typeof import('./src/utils/routes')['redirectRoutes'] + const ref: typeof import('vue')['ref'] + const rpath: typeof import('./src/utils/routes')['rpath'] + const shallowRef: typeof import('vue')['shallowRef'] + const storeToRefs: typeof import('pinia')['storeToRefs'] + const stripLinks: typeof import('./src/utils/api')['stripLinks'] + const trailingSlash: typeof import('./src/utils/routes')['trailingSlash'] + const upperFirst: typeof import('lodash-es')['upperFirst'] + const useAd: typeof import('./src/composables/ad')['useAd'] + const useAdsStore: typeof import('./src/stores/ads')['useAdsStore'] + const useAppStore: typeof import('./src/stores/app')['useAppStore'] + const useAttrs: typeof import('vue')['useAttrs'] + const useAuthStore: typeof import('@vuetify/one')['useAuthStore'] + const useCommitsStore: typeof import('./src/stores/commits')['useCommitsStore'] + const useCosmic: typeof import('./src/composables/cosmic')['useCosmic'] + const useDate: typeof import('vuetify')['useDate'] + const useDisplay: typeof import('vuetify')['useDisplay'] + const useGoTo: typeof import('vuetify')['useGoTo'] + const useGtag: typeof import('vue-gtag-next')['useGtag'] + const useHttpStore: typeof import('@vuetify/one')['useHttpStore'] + const useI18n: typeof import('vue-i18n')['useI18n'] + const useJobsStore: typeof import('./src/stores/jobs')['useJobsStore'] + const useLocaleStore: typeof import('./src/stores/locale')['useLocaleStore'] + const useMadeWithVuetifyStore: typeof import('./src/stores/made-with-vuetify')['useMadeWithVuetifyStore'] + const useOneStore: typeof import('@vuetify/one')['useOneStore'] + const usePinsStore: typeof import('./src/stores/pins')['usePinsStore'] + const usePlayground: typeof import('./src/composables/playground')['usePlayground'] + const usePromotionsStore: typeof import('./src/stores/promotions')['usePromotionsStore'] + const useReleasesStore: typeof import('./src/stores/releases')['useReleasesStore'] + const useRoute: typeof import('vue-router')['useRoute'] + const useRouter: typeof import('vue-router')['useRouter'] + const useRtl: typeof import('vuetify')['useRtl'] + const useSettingsStore: typeof import('@vuetify/one')['useSettingsStore'] + const useShopifyStore: typeof import('./src/stores/shopify')['useShopifyStore'] + const useSponsorsStore: typeof import('./src/stores/sponsors')['useSponsorsStore'] + const useSpotStore: typeof import('./src/stores/spot')['useSpotStore'] + const useTeamStore: typeof import('./src/stores/team')['useTeamStore'] + const useTheme: typeof import('vuetify')['useTheme'] + const useUserStore: typeof import('@vuetify/one')['useUserStore'] + const wait: typeof import('./src/utils/helpers')['wait'] + const waitForReadystate: typeof import('./src/utils/helpers')['waitForReadystate'] + const watch: typeof import('vue')['watch'] + const watchEffect: typeof import('vue')['watchEffect'] + const wrapInArray: typeof import('./src/utils/helpers')['wrapInArray'] +} +// for vue template auto import +import { UnwrapRef } from 'vue' +declare module 'vue' { + interface ComponentCustomProperties { + readonly IN_BROWSER: UnwrapRef + readonly IS_DEBUG: UnwrapRef + readonly IS_PROD: UnwrapRef + readonly IS_SERVER: UnwrapRef + readonly anyLanguagePattern: UnwrapRef + readonly camelCase: UnwrapRef + readonly camelize: UnwrapRef + readonly computed: UnwrapRef + readonly configureMarkdown: UnwrapRef + readonly copyElementContent: UnwrapRef + readonly createAdProps: UnwrapRef + readonly createOne: UnwrapRef + readonly defineStore: UnwrapRef + readonly disabledLanguagePattern: UnwrapRef + readonly distance: UnwrapRef + readonly eventName: UnwrapRef + readonly genAppMetaInfo: UnwrapRef + readonly genMetaInfo: UnwrapRef + readonly generatedRoutes: UnwrapRef + readonly getBranch: UnwrapRef + readonly getMatchMedia: UnwrapRef + readonly gtagClick: UnwrapRef + readonly h: UnwrapRef + readonly insertLinks: UnwrapRef + readonly isOn: UnwrapRef + readonly kebabCase: UnwrapRef + readonly languagePattern: UnwrapRef + readonly leadingSlash: UnwrapRef + readonly markdownItRules: UnwrapRef + readonly mergeProps: UnwrapRef + readonly nextTick: UnwrapRef + readonly onBeforeMount: UnwrapRef + readonly onBeforeRouteLeave: UnwrapRef + readonly onBeforeRouteUpdate: UnwrapRef + readonly onBeforeUnmount: UnwrapRef + readonly onMounted: UnwrapRef + readonly onScopeDispose: UnwrapRef + readonly onServerPrefetch: UnwrapRef + readonly preferredLocale: UnwrapRef + readonly propsToString: UnwrapRef + readonly redirectRoutes: UnwrapRef + readonly ref: UnwrapRef + readonly rpath: UnwrapRef + readonly shallowRef: UnwrapRef + readonly storeToRefs: UnwrapRef + readonly stripLinks: UnwrapRef + readonly trailingSlash: UnwrapRef + readonly upperFirst: UnwrapRef + readonly useAd: UnwrapRef + readonly useAdsStore: UnwrapRef + readonly useAppStore: UnwrapRef + readonly useAttrs: UnwrapRef + readonly useAuthStore: UnwrapRef + readonly useCommitsStore: UnwrapRef + readonly useCosmic: UnwrapRef + readonly useDate: UnwrapRef + readonly useDisplay: UnwrapRef + readonly useGoTo: UnwrapRef + readonly useGtag: UnwrapRef + readonly useHttpStore: UnwrapRef + readonly useI18n: UnwrapRef + readonly useJobsStore: UnwrapRef + readonly useLocaleStore: UnwrapRef + readonly useMadeWithVuetifyStore: UnwrapRef + readonly useOneStore: UnwrapRef + readonly usePinsStore: UnwrapRef + readonly usePlayground: UnwrapRef + readonly usePromotionsStore: UnwrapRef + readonly useReleasesStore: UnwrapRef + readonly useRoute: UnwrapRef + readonly useRouter: UnwrapRef + readonly useRtl: UnwrapRef + readonly useSettingsStore: UnwrapRef + readonly useShopifyStore: UnwrapRef + readonly useSponsorsStore: UnwrapRef + readonly useSpotStore: UnwrapRef + readonly useTeamStore: UnwrapRef + readonly useTheme: UnwrapRef + readonly useUserStore: UnwrapRef + readonly wait: UnwrapRef + readonly waitForReadystate: UnwrapRef + readonly watch: UnwrapRef + readonly watchEffect: UnwrapRef + readonly wrapInArray: UnwrapRef + } +} +declare module '@vue/runtime-core' { + interface ComponentCustomProperties { + readonly IN_BROWSER: UnwrapRef + readonly IS_DEBUG: UnwrapRef + readonly IS_PROD: UnwrapRef + readonly IS_SERVER: UnwrapRef + readonly anyLanguagePattern: UnwrapRef + readonly camelCase: UnwrapRef + readonly camelize: UnwrapRef + readonly computed: UnwrapRef + readonly configureMarkdown: UnwrapRef + readonly copyElementContent: UnwrapRef + readonly createAdProps: UnwrapRef + readonly createOne: UnwrapRef + readonly defineStore: UnwrapRef + readonly disabledLanguagePattern: UnwrapRef + readonly distance: UnwrapRef + readonly eventName: UnwrapRef + readonly genAppMetaInfo: UnwrapRef + readonly genMetaInfo: UnwrapRef + readonly generatedRoutes: UnwrapRef + readonly getBranch: UnwrapRef + readonly getMatchMedia: UnwrapRef + readonly gtagClick: UnwrapRef + readonly h: UnwrapRef + readonly insertLinks: UnwrapRef + readonly isOn: UnwrapRef + readonly kebabCase: UnwrapRef + readonly languagePattern: UnwrapRef + readonly leadingSlash: UnwrapRef + readonly markdownItRules: UnwrapRef + readonly mergeProps: UnwrapRef + readonly nextTick: UnwrapRef + readonly onBeforeMount: UnwrapRef + readonly onBeforeRouteLeave: UnwrapRef + readonly onBeforeRouteUpdate: UnwrapRef + readonly onBeforeUnmount: UnwrapRef + readonly onMounted: UnwrapRef + readonly onScopeDispose: UnwrapRef + readonly onServerPrefetch: UnwrapRef + readonly preferredLocale: UnwrapRef + readonly propsToString: UnwrapRef + readonly redirectRoutes: UnwrapRef + readonly ref: UnwrapRef + readonly rpath: UnwrapRef + readonly shallowRef: UnwrapRef + readonly storeToRefs: UnwrapRef + readonly stripLinks: UnwrapRef + readonly trailingSlash: UnwrapRef + readonly upperFirst: UnwrapRef + readonly useAd: UnwrapRef + readonly useAdsStore: UnwrapRef + readonly useAppStore: UnwrapRef + readonly useAttrs: UnwrapRef + readonly useAuthStore: UnwrapRef + readonly useCommitsStore: UnwrapRef + readonly useCosmic: UnwrapRef + readonly useDate: UnwrapRef + readonly useDisplay: UnwrapRef + readonly useGoTo: UnwrapRef + readonly useGtag: UnwrapRef + readonly useHttpStore: UnwrapRef + readonly useI18n: UnwrapRef + readonly useJobsStore: UnwrapRef + readonly useLocaleStore: UnwrapRef + readonly useMadeWithVuetifyStore: UnwrapRef + readonly useOneStore: UnwrapRef + readonly usePinsStore: UnwrapRef + readonly usePlayground: UnwrapRef + readonly usePromotionsStore: UnwrapRef + readonly useReleasesStore: UnwrapRef + readonly useRoute: UnwrapRef + readonly useRouter: UnwrapRef + readonly useRtl: UnwrapRef + readonly useSettingsStore: UnwrapRef + readonly useShopifyStore: UnwrapRef + readonly useSponsorsStore: UnwrapRef + readonly useSpotStore: UnwrapRef + readonly useTeamStore: UnwrapRef + readonly useTheme: UnwrapRef + readonly useUserStore: UnwrapRef + readonly wait: UnwrapRef + readonly waitForReadystate: UnwrapRef + readonly watch: UnwrapRef + readonly watchEffect: UnwrapRef + readonly wrapInArray: UnwrapRef + } +} diff --git a/packages/docs/build/api-plugin.ts b/packages/docs/build/api-plugin.ts index 2459cd7c820..8da512afb60 100644 --- a/packages/docs/build/api-plugin.ts +++ b/packages/docs/build/api-plugin.ts @@ -14,12 +14,20 @@ const API_PAGES_ROOT = resolve('./node_modules/.cache/api-pages') const require = createRequire(import.meta.url) +const sections = ['props', 'events', 'slots', 'exposed', 'sass', 'argument', 'modifiers'] as const +// This can't be imported from the api-generator because it mixes the type definitions up +type Data = { + displayName: string // user visible name used in page titles + fileName: string // file name for translation strings and generated types + pathName: string // kebab-case name for use in urls +} & Record> + const localeList = locales .filter(item => item.enabled) .map(item => item.alternate || item.locale) function genApiLinks (componentName: string, header: string) { - const section = ['', ''] + const section = ['', ''] const links = (Object.keys(pageToApi) as (keyof typeof pageToApi)[]) .filter(page => pageToApi[page].includes(componentName)) .reduce((acc, href) => { @@ -73,24 +81,24 @@ async function loadMessages (locale: string) { } } -async function createMdFile (component: Record, locale: string) { +async function createMdFile (component: Data, locale: string) { const messages = await loadMessages(locale) let str = '' str += genHeader(component.displayName) str += genApiLinks(component.displayName, messages.links) - for (const section of ['props', 'events', 'slots', 'exposed', 'sass', 'options', 'argument', 'modifiers']) { + for (const section of sections) { if (Object.keys(component[section] ?? {}).length) { str += `## ${messages[section]} {#${section}}\n\n` - str += `\n\n` + str += `\n\n` } } return str } -async function writeFile (componentApi: Record, locale: string) { +async function writeFile (componentApi: Data, locale: string) { if (!componentApi?.fileName) return const folder = resolve(API_PAGES_ROOT, locale, 'api') @@ -99,22 +107,17 @@ async function writeFile (componentApi: Record, locale: string) { fs.mkdirSync(folder, { recursive: true }) } - fs.writeFileSync(resolve(folder, `${sanitize(componentApi.fileName)}.md`), await createMdFile(componentApi, locale)) + fs.writeFileSync(resolve(folder, `${sanitize(componentApi.pathName)}.md`), await createMdFile(componentApi, locale)) } function getApiData () { const files = fs.readdirSync(API_ROOT) - const data: Record[] = [] + const data: Data[] = [] for (const file of files) { - const name = path.basename(file.slice(file.lastIndexOf('/') + 1), '.json') const obj = JSON.parse(fs.readFileSync(resolve(API_ROOT, file), 'utf-8')) - data.push({ - name, - displayName: name, - ...obj, - }) + data.push(obj) } return data diff --git a/packages/docs/build/markdown-it.ts b/packages/docs/build/markdown-it.ts index 0241302f25c..ddeee9b98ab 100644 --- a/packages/docs/build/markdown-it.ts +++ b/packages/docs/build/markdown-it.ts @@ -3,8 +3,8 @@ import path from 'path' import Ajv from 'ajv' import fm from 'front-matter' import MarkdownIt from 'markdown-it' -import { configureMarkdown } from '../src/util/markdown-it' -export { configureMarkdown } from '../src/util/markdown-it' +import { configureMarkdown } from '../src/utils/markdown-it' +export { configureMarkdown } from '../src/utils/markdown-it' export const md = configureMarkdown(new MarkdownIt()) diff --git a/packages/docs/components.d.ts b/packages/docs/components.d.ts new file mode 100644 index 00000000000..876ad3c6deb --- /dev/null +++ b/packages/docs/components.d.ts @@ -0,0 +1,154 @@ +/* eslint-disable */ +/* prettier-ignore */ +// @ts-nocheck +// Generated by unplugin-vue-components +// Read more: https://github.com/vuejs/core/pull/3399 +export {} + +declare module 'vue' { + export interface GlobalComponents { + AboutTeamMember: typeof import('./src/components/about/TeamMember.vue')['default'] + AboutTeamMembers: typeof import('./src/components/about/TeamMembers.vue')['default'] + Alert: typeof import('./src/components/Alert.vue')['default'] + ApiApiTable: typeof import('./src/components/api/ApiTable.vue')['default'] + ApiEventsTable: typeof import('./src/components/api/EventsTable.vue')['default'] + ApiExposedTable: typeof import('./src/components/api/ExposedTable.vue')['default'] + ApiInline: typeof import('./src/components/api/Inline.vue')['default'] + ApiLinks: typeof import('./src/components/api/Links.vue')['default'] + ApiNameCell: typeof import('./src/components/api/NameCell.vue')['default'] + ApiPrismCell: typeof import('./src/components/api/PrismCell.vue')['default'] + ApiPropsTable: typeof import('./src/components/api/PropsTable.vue')['default'] + ApiSassTable: typeof import('./src/components/api/SassTable.vue')['default'] + ApiSearch: typeof import('./src/components/api/Search.vue')['default'] + ApiSection: typeof import('./src/components/api/Section.vue')['default'] + ApiSlotsTable: typeof import('./src/components/api/SlotsTable.vue')['default'] + AppBackToTop: typeof import('./src/components/app/BackToTop.vue')['default'] + AppBarBar: typeof import('./src/components/app/bar/Bar.vue')['default'] + AppBarEcosystemMenu: typeof import('./src/components/app/bar/EcosystemMenu.vue')['default'] + AppBarEnterpriseLink: typeof import('./src/components/app/bar/EnterpriseLink.vue')['default'] + AppBarJobsLink: typeof import('./src/components/app/bar/JobsLink.vue')['default'] + AppBarLanguageMenu: typeof import('./src/components/app/bar/LanguageMenu.vue')['default'] + AppBarLearnMenu: typeof import('./src/components/app/bar/LearnMenu.vue')['default'] + AppBarLogo: typeof import('./src/components/app/bar/Logo.vue')['default'] + AppBarNotificationsMenu: typeof import('./src/components/app/bar/NotificationsMenu.vue')['default'] + AppBarPlaygroundLink: typeof import('./src/components/app/bar/PlaygroundLink.vue')['default'] + AppBarSettingsToggle: typeof import('./src/components/app/bar/SettingsToggle.vue')['default'] + AppBarSponsorLink: typeof import('./src/components/app/bar/SponsorLink.vue')['default'] + AppBarStoreLink: typeof import('./src/components/app/bar/StoreLink.vue')['default'] + AppBarSupportMenu: typeof import('./src/components/app/bar/SupportMenu.vue')['default'] + AppBarTeamLink: typeof import('./src/components/app/bar/TeamLink.vue')['default'] + AppBarThemeToggle: typeof import('./src/components/app/bar/ThemeToggle.vue')['default'] + AppBtn: typeof import('./src/components/app/Btn.vue')['default'] + AppCaption: typeof import('./src/components/app/Caption.vue')['default'] + AppDivider: typeof import('./src/components/app/Divider.vue')['default'] + AppDrawerAppend: typeof import('./src/components/app/drawer/Append.vue')['default'] + AppDrawerDrawer: typeof import('./src/components/app/drawer/Drawer.vue')['default'] + AppDrawerDrawerToggleRail: typeof import('./src/components/app/drawer/DrawerToggleRail.vue')['default'] + AppDrawerPinnedItems: typeof import('./src/components/app/drawer/PinnedItems.vue')['default'] + AppFigure: typeof import('./src/components/app/Figure.vue')['default'] + AppHeading: typeof import('./src/components/app/Heading.vue')['default'] + AppHeadline: typeof import('./src/components/app/Headline.vue')['default'] + AppLink: typeof import('./src/components/app/Link.vue')['default'] + AppListLinkListItem: typeof import('./src/components/app/list/LinkListItem.vue')['default'] + AppListList: typeof import('./src/components/app/list/List.vue')['default'] + AppMarkdown: typeof import('./src/components/app/Markdown.vue')['default'] + AppMarkup: typeof import('./src/components/app/Markup.vue')['default'] + AppMenuMenu: typeof import('./src/components/app/menu/Menu.vue')['default'] + AppSearchSearch: typeof import('./src/components/app/search/Search.vue')['default'] + AppSearchSearchRecent: typeof import('./src/components/app/search/SearchRecent.vue')['default'] + AppSearchSearchResults: typeof import('./src/components/app/search/SearchResults.vue')['default'] + AppSettingsAdvancedOptions: typeof import('./src/components/app/settings/AdvancedOptions.vue')['default'] + AppSettingsAppend: typeof import('./src/components/app/settings/Append.vue')['default'] + AppSettingsDeveloperMode: typeof import('./src/components/app/settings/DeveloperMode.vue')['default'] + AppSettingsDocumentationBuild: typeof import('./src/components/app/settings/DocumentationBuild.vue')['default'] + AppSettingsDrawer: typeof import('./src/components/app/settings/Drawer.vue')['default'] + AppSettingsLatestCommit: typeof import('./src/components/app/settings/LatestCommit.vue')['default'] + AppSettingsLatestRelease: typeof import('./src/components/app/settings/LatestRelease.vue')['default'] + AppSettingsOptions: typeof import('./src/components/app/settings/Options.vue')['default'] + AppSettingsOptionsAdOption: typeof import('./src/components/app/settings/options/AdOption.vue')['default'] + AppSettingsOptionsApiOption: typeof import('./src/components/app/settings/options/ApiOption.vue')['default'] + AppSettingsOptionsAvatarOption: typeof import('./src/components/app/settings/options/AvatarOption.vue')['default'] + AppSettingsOptionsBannerOption: typeof import('./src/components/app/settings/options/BannerOption.vue')['default'] + AppSettingsOptionsCodeOption: typeof import('./src/components/app/settings/options/CodeOption.vue')['default'] + AppSettingsOptionsNotificationsOption: typeof import('./src/components/app/settings/options/NotificationsOption.vue')['default'] + AppSettingsOptionsPinOption: typeof import('./src/components/app/settings/options/PinOption.vue')['default'] + AppSettingsOptionsQuickbarOption: typeof import('./src/components/app/settings/options/QuickbarOption.vue')['default'] + AppSettingsOptionsRailDrawerOption: typeof import('./src/components/app/settings/options/RailDrawerOption.vue')['default'] + AppSettingsOptionsSlashSearchOption: typeof import('./src/components/app/settings/options/SlashSearchOption.vue')['default'] + AppSettingsOptionsThemeOption: typeof import('./src/components/app/settings/options/ThemeOption.vue')['default'] + AppSettingsPerksOptions: typeof import('./src/components/app/settings/PerksOptions.vue')['default'] + AppSettingsSettingsHeader: typeof import('./src/components/app/settings/SettingsHeader.vue')['default'] + AppSheet: typeof import('./src/components/app/Sheet.vue')['default'] + AppSnackbarQueue: typeof import('./src/components/app/SnackbarQueue.vue')['default'] + AppTable: typeof import('./src/components/app/Table.vue')['default'] + AppTextField: typeof import('./src/components/app/TextField.vue')['default'] + AppTitle: typeof import('./src/components/app/Title.vue')['default'] + AppToc: typeof import('./src/components/app/Toc.vue')['default'] + AppTooltipBtn: typeof import('./src/components/app/TooltipBtn.vue')['default'] + AppV2Banner: typeof import('./src/components/app/V2Banner.vue')['default'] + AppVerticalDivider: typeof import('./src/components/app/VerticalDivider.vue')['default'] + Backmatter: typeof import('./src/components/Backmatter.vue')['default'] + ComponentsListItem: typeof import('./src/components/components/ListItem.vue')['default'] + DocContribute: typeof import('./src/components/doc/Contribute.vue')['default'] + DocExplorer: typeof import('./src/components/doc/Explorer.vue')['default'] + DocIconList: typeof import('./src/components/doc/IconList.vue')['default'] + DocIconTable: typeof import('./src/components/doc/IconTable.vue')['default'] + DocMadeWithVueAttribution: typeof import('./src/components/doc/MadeWithVueAttribution.vue')['default'] + DocMadeWithVuetifyGallery: typeof import('./src/components/doc/MadeWithVuetifyGallery.vue')['default'] + DocMadeWithVuetifyLink: typeof import('./src/components/doc/MadeWithVuetifyLink.vue')['default'] + DocReadyForMore: typeof import('./src/components/doc/ReadyForMore.vue')['default'] + DocRelatedPage: typeof import('./src/components/doc/RelatedPage.vue')['default'] + DocRelatedPages: typeof import('./src/components/doc/RelatedPages.vue')['default'] + DocReleases: typeof import('./src/components/doc/Releases.vue')['default'] + DocTabs: typeof import('./src/components/doc/Tabs.vue')['default'] + DocThemeCard: typeof import('./src/components/doc/ThemeCard.vue')['default'] + DocThemeVendor: typeof import('./src/components/doc/ThemeVendor.vue')['default'] + DocUpNext: typeof import('./src/components/doc/UpNext.vue')['default'] + DocVueJobs: typeof import('./src/components/doc/VueJobs.vue')['default'] + ExamplesExample: typeof import('./src/components/examples/Example.vue')['default'] + ExamplesExampleMissing: typeof import('./src/components/examples/ExampleMissing.vue')['default'] + ExamplesUsage: typeof import('./src/components/examples/Usage.vue')['default'] + ExamplesUsageExample: typeof import('./src/components/examples/UsageExample.vue')['default'] + ExamplesVueFile: typeof import('./src/components/examples/VueFile.vue')['default'] + FeaturesBreakpointsTable: typeof import('./src/components/features/BreakpointsTable.vue')['default'] + FeaturesColorPalette: typeof import('./src/components/features/ColorPalette.vue')['default'] + FeaturesSassApi: typeof import('./src/components/features/SassApi.vue')['default'] + GettingStartedWireframeExamples: typeof import('./src/components/getting-started/WireframeExamples.vue')['default'] + HomeActionBtns: typeof import('./src/components/home/ActionBtns.vue')['default'] + HomeEntry: typeof import('./src/components/home/Entry.vue')['default'] + HomeFeatures: typeof import('./src/components/home/Features.vue')['default'] + HomeFooter: typeof import('./src/components/home/Footer.vue')['default'] + HomeLogo: typeof import('./src/components/home/Logo.vue')['default'] + HomeSpecialSponsor: typeof import('./src/components/home/SpecialSponsor.vue')['default'] + HomeSponsors: typeof import('./src/components/home/Sponsors.vue')['default'] + IconsChevronDown: typeof import('./src/components/icons/ChevronDown.vue')['default'] + IntroductionComparison: typeof import('./src/components/introduction/Comparison.vue')['default'] + IntroductionDirectSupport: typeof import('./src/components/introduction/DirectSupport.vue')['default'] + IntroductionDiscordDeck: typeof import('./src/components/introduction/DiscordDeck.vue')['default'] + IntroductionEnterpriseDeck: typeof import('./src/components/introduction/EnterpriseDeck.vue')['default'] + IntroductionEnterpriseForm: typeof import('./src/components/introduction/EnterpriseForm.vue')['default'] + PageFeatures: typeof import('./src/components/PageFeatures.vue')['default'] + PromotedBase: typeof import('./src/components/promoted/Base.vue')['default'] + PromotedCarbon: typeof import('./src/components/promoted/Carbon.vue')['default'] + PromotedDiscovery: typeof import('./src/components/promoted/Discovery.vue')['default'] + PromotedEntry: typeof import('./src/components/promoted/Entry.vue')['default'] + PromotedInline: typeof import('./src/components/promoted/Inline.vue')['default'] + PromotedPromoted: typeof import('./src/components/promoted/Promoted.vue')['default'] + PromotedRandom: typeof import('./src/components/promoted/Random.vue')['default'] + PromotedScript: typeof import('./src/components/promoted/Script.vue')['default'] + PromotedVuetify: typeof import('./src/components/promoted/Vuetify.vue')['default'] + PromotionsPromotionCard: typeof import('./src/components/promotions/PromotionCard.vue')['default'] + ResourcesColorPalette: typeof import('./src/components/resources/ColorPalette.vue')['default'] + ResourcesLogos: typeof import('./src/components/resources/Logos.vue')['default'] + RouterLink: typeof import('vue-router')['RouterLink'] + RouterView: typeof import('vue-router')['RouterView'] + SponsorCard: typeof import('./src/components/sponsor/Card.vue')['default'] + SponsorLink: typeof import('./src/components/sponsor/Link.vue')['default'] + SponsorSponsors: typeof import('./src/components/sponsor/Sponsors.vue')['default'] + UserBadgesUserAdminBadge: typeof import('./src/components/user/badges/UserAdminBadge.vue')['default'] + UserBadgesUserOneBadge: typeof import('./src/components/user/badges/UserOneBadge.vue')['default'] + UserBadgesUserSponsorBadge: typeof import('./src/components/user/badges/UserSponsorBadge.vue')['default'] + UserOneSubCard: typeof import('./src/components/user/OneSubCard.vue')['default'] + UserUserTabs: typeof import('./src/components/user/UserTabs.vue')['default'] + } +} diff --git a/packages/docs/package.json b/packages/docs/package.json index ea466374765..53342dc8b59 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.5.3", + "version": "3.5.8", "repository": { "type": "git", "url": "git+https://github.com/vuetifyjs/vuetify.git", @@ -23,7 +23,7 @@ "@cosmicjs/sdk": "^1.0.11", "@vuelidate/core": "^2.0.3", "@vuelidate/validators": "^2.0.4", - "@vuetify/one": "^0.6.3", + "@vuetify/one": "^1.1.1", "algoliasearch": "^4.20.0", "fflate": "^0.8.1", "isomorphic-fetch": "^3.0.0", @@ -33,12 +33,12 @@ "prismjs": "^1.29.0", "roboto-fontface": "^0.10.0", "vee-validate": "^4.12.4", - "vue": "^3.4.7", + "vue": "^3.4.19", "vue-gtag-next": "^1.14.0", "vue-i18n": "^9.7.1", "vue-instantsearch": "^4.12.1", "vue-prism-component": "^2.0.0", - "vuetify": "^3.5.3" + "vuetify": "^3.5.8" }, "devDependencies": { "@emailjs/browser": "^3.11.0", @@ -49,8 +49,8 @@ "@types/prismjs": "^1.26.3", "@vitejs/plugin-basic-ssl": "^1.0.2", "@vitejs/plugin-vue": "^4.5.2", - "@vue/compiler-sfc": "^3.4.7", - "@vuetify/api-generator": "^3.5.3", + "@vue/compiler-sfc": "^3.4.19", + "@vuetify/api-generator": "^3.5.8", "ajv": "^8.12.0", "async-es": "^3.2.5", "date-fns": "^2.30.0", @@ -69,8 +69,9 @@ "markdown-it-meta": "^0.0.1", "markdown-it-prism": "^2.3.0", "markdownlint-cli": "^0.37.0", + "unplugin-auto-import": "0.17.3", "unplugin-fonts": "1.0.3", - "unplugin-vue-components": "^0.25.2", + "unplugin-vue-components": "^0.26.0", "vite": "^4.5.1", "vite-plugin-md": "^0.21.5", "vite-plugin-pages": "^0.32.0", diff --git a/packages/docs/src/App.vue b/packages/docs/src/App.vue index 4f7d2ff0a3f..dc7b5caf2be 100644 --- a/packages/docs/src/App.vue +++ b/packages/docs/src/App.vue @@ -9,20 +9,6 @@ diff --git a/packages/docs/src/components/PageFeatures.vue b/packages/docs/src/components/PageFeatures.vue index 6efe14d1daf..79ff37e1743 100644 --- a/packages/docs/src/components/PageFeatures.vue +++ b/packages/docs/src/components/PageFeatures.vue @@ -14,10 +14,10 @@ diff --git a/packages/docs/src/components/app/settings/options/SyncOption.vue b/packages/docs/src/components/app/settings/options/SyncOption.vue deleted file mode 100644 index ea8d360002c..00000000000 --- a/packages/docs/src/components/app/settings/options/SyncOption.vue +++ /dev/null @@ -1,28 +0,0 @@ - - - diff --git a/packages/docs/src/components/app/settings/options/ThemeOption.vue b/packages/docs/src/components/app/settings/options/ThemeOption.vue index 1bd189e593e..3ab70509ed3 100644 --- a/packages/docs/src/components/app/settings/options/ThemeOption.vue +++ b/packages/docs/src/components/app/settings/options/ThemeOption.vue @@ -3,8 +3,8 @@ v-model="user.theme" class="mb-2" color="primary" - hide-details true-icon="mdi-check-circle-outline" + hide-details > - diff --git a/packages/docs/src/components/doc/MadeWithVuetify.vue b/packages/docs/src/components/doc/MadeWithVuetifyGallery.vue similarity index 93% rename from packages/docs/src/components/doc/MadeWithVuetify.vue rename to packages/docs/src/components/doc/MadeWithVuetifyGallery.vue index 8fa61b4e5bc..be75beb1399 100644 --- a/packages/docs/src/components/doc/MadeWithVuetify.vue +++ b/packages/docs/src/components/doc/MadeWithVuetifyGallery.vue @@ -20,8 +20,8 @@ diff --git a/packages/docs/src/components/doc/RelatedPage.vue b/packages/docs/src/components/doc/RelatedPage.vue index 102a4c5702f..1e8a52d1cc9 100644 --- a/packages/docs/src/components/doc/RelatedPage.vue +++ b/packages/docs/src/components/doc/RelatedPage.vue @@ -4,8 +4,8 @@ :subtitle="subtitle" :title="item.meta.nav ?? item.meta.title" :to="item.path" - border lines="two" + border rounded > diff --git a/packages/docs/src/components/doc/Releases.vue b/packages/docs/src/components/doc/Releases.vue index 177b228f86f..3093c9d9809 100644 --- a/packages/docs/src/components/doc/Releases.vue +++ b/packages/docs/src/components/doc/Releases.vue @@ -7,13 +7,13 @@ :items="releases" :menu-props="menuProps" :placeholder="tag" - hide-details - hide-no-data density="comfortable" item-title="name" label="Select Release Version" - persistent-placeholder prepend-inner-icon="mdi-text-box-search-outline" + hide-details + hide-no-data + persistent-placeholder return-object > @@ -159,16 +159,10 @@ diff --git a/packages/docs/src/components/doc/ThemeCard.vue b/packages/docs/src/components/doc/ThemeCard.vue index b5024924160..005d2b146bd 100644 --- a/packages/docs/src/components/doc/ThemeCard.vue +++ b/packages/docs/src/components/doc/ThemeCard.vue @@ -5,14 +5,14 @@ rel="noopener" target="_blank" > -
@@ -21,9 +21,9 @@ v-if="product.price === 0" class="text-uppercase px-1 ms-2" color="primary" - label size="x-small" text="Free" + label />
-
+ diff --git a/packages/docs/src/components/doc/ThemeVendor.vue b/packages/docs/src/components/doc/ThemeVendor.vue index e121e5123bf..983939bc8b8 100644 --- a/packages/docs/src/components/doc/ThemeVendor.vue +++ b/packages/docs/src/components/doc/ThemeVendor.vue @@ -6,38 +6,26 @@ cols="12" sm="6" > - + - {{ t('see-more-themes-from', { vendor: vendor.name }) }} - + diff --git a/packages/docs/src/components/features/SassApi.vue b/packages/docs/src/components/features/SassApi.vue index e966c3ef132..befc732aab4 100644 --- a/packages/docs/src/components/features/SassApi.vue +++ b/packages/docs/src/components/features/SassApi.vue @@ -1,31 +1,31 @@ diff --git a/packages/docs/src/components/user/account/ConnectedAccounts.vue b/packages/docs/src/components/user/account/ConnectedAccounts.vue deleted file mode 100644 index 236ec96e8a4..00000000000 --- a/packages/docs/src/components/user/account/ConnectedAccounts.vue +++ /dev/null @@ -1,72 +0,0 @@ - diff --git a/packages/docs/src/components/user/badges/UserOneBadge.vue b/packages/docs/src/components/user/badges/UserOneBadge.vue index adbc4efbf6b..3dce9e70a6e 100644 --- a/packages/docs/src/components/user/badges/UserOneBadge.vue +++ b/packages/docs/src/components/user/badges/UserOneBadge.vue @@ -1,8 +1,8 @@