Vue
Table of Contents
Quick start#
To build a Vue application using the Porsche Design System, follow these
steps. This guide is based on the following dependencies:
vue@3tailwindcss@4@porsche-design-system/components-vue@3
npm create vue@latest
✔ Project name (target directory): "./my-app"
✔ Select features to include in your project:
◼ TypeScript "Yes"
◼ JSX Support "Yes"
◼ Router (SPA development) "Yes"
◼ Pinia (state management) "Yes"
◼ Vitest (unit testing) "Yes"
◼ End-to-End Testing "Yes"
◼ ESLint (error prevention) "Yes"
◼ Prettier (code formatting) "Yes"
✔ Select an End-to-End testing framework: "Playwright"
✔ Select experimental features to include in your project:
◻ Oxlint (experimental) "No"
◻ rolldown-vite "No"
✔ Skip all example code and start with a blank Vue project? "No"
You're all set! Start building your own application now.
Integration#
Step 1
Install the Porsche Design System within your project directory.
npm install @porsche-design-system/components-vue
Step 2
Wrap your app with the <PorscheDesignSystemProvider />
.
<script setup lang="ts">
import { RouterView } from 'vue-router';
import { PorscheDesignSystemProvider } from '@porsche-design-system/components-vue';
</script>
<template>
<PorscheDesignSystemProvider>
<header>…</header>
<RouterView />
</PorscheDesignSystemProvider>
</template>
<style scoped>
…
</style>
Step 3 (recommended)
To boost your web application's performance and minimize issues like FOUC (Flash of Unstyled Content) and FOUT (Flash of
Unstyled Text), you can integrate Partials from the Porsche Design System into the <head>
section of your HTML.
import …
import { defineConfig } from 'vite';
import {
getComponentChunkLinks,
getFontFaceStyles,
getFontLinks,
getIconLinks,
getInitialStyles,
getMetaTagsAndIconLinks,
} from '@porsche-design-system/components-vue/partials';
const transformIndexHtmlPlugin = () => {
return {
name: 'html-transform',
transformIndexHtml(html: string) {
const headPartials = [
getInitialStyles(),
getFontFaceStyles(),
getFontLinks(),
getComponentChunkLinks(),
getIconLinks(),
getMetaTagsAndIconLinks({ appTitle: 'Porsche' }),
].join('');
return html.replace(/<\/head>/, `${headPartials}$&`);
},
};
};
export default defineConfig({
plugins: [vue(), vueJsx(), vueDevTools(), transformIndexHtmlPlugin()],
resolve: {
alias: {
'@': fileURLToPath(new URL('./src', import.meta.url)),
},
},
});
Step 4 (recommended)
Setting up Tailwind CSS with the Porsche Design System
Tailwind CSS Theme allows you to leverage a utility-first CSS framework while maintaining
seamless styling consistency with Porsche's design principles. This integration enables you to use the provided
Patterns and Templates, all written in Tailwind CSS, to build your application quickly and
efficiently.
Install Tailwind CSS within your project directory.
npm install tailwindcss @tailwindcss/vite
Configure the Vite Tailwind CSS plugin.
import …
import { defineConfig } from 'vite';
import tailwindcss from '@tailwindcss/vite';
const transformIndexHtmlPlugin = () => { … }
export default defineConfig({
plugins: [vue(), vueJsx(), vueDevTools(), transformIndexHtmlPlugin(), tailwindcss()],
resolve: {
alias: {
'@': fileURLToPath(new URL('./src', import.meta.url)),
},
},
});
Import Tailwind CSS and the Porsche Design System Tailwind CSS Theme.
@import 'tailwindcss';
@import '@porsche-design-system/components-vue/tailwindcss';
Step 5
Add a Porsche Design System component (e.g., <PWordmark />
) with some Tailwind CSS styles. Then, run npm run dev
and
verify that the component and styles display correctly.
<script setup lang="ts">
import { RouterView } from 'vue-router'
import { PorscheDesignSystemProvider } from '@porsche-design-system/components-vue';
import { PWordmark } from '@porsche-design-system/components-vue';
</script>
<template>
<PorscheDesignSystemProvider>
<div class="grid justify-items-center col-span-full gap-fluid-md m-static-lg p-fluid-lg bg-surface rounded-lg">
<PWordmark />
<h1 class="prose-display-md">Porsche Design System</h1>
</div>
<header>…</header>
<RouterView />
</PorscheDesignSystemProvider>
</template>
<style scoped>
…
</style>