LEARN / VUE

RevaCSS for Vue

Optional Vue 3.5 components for the RevaCSS 2.0 release preparation. The stable-version @revacss/vue package is not published. It is distributed separately from the CSS package and does not modify core styles or inject stylesheets. Vue provides the application runtime; RevaCSS core remains CSS-only. Automated fixture coverage is recorded below; the core release record gives manual acceptance and remaining publication steps.

Install from source

From a matching RevaCSS checkout:

npm ci
npm run build:css
npm pack --ignore-scripts
npm pack ./integrations/vue --ignore-scripts

Inside a Vue 3.5 project configured to compile Vue single-file components:

npm install /path/to/revacss-2.0.0.tgz /path/to/revacss-vue-2.0.0.tgz

The version numbers describe source candidates, not published or accepted releases. The package ships typed .vue source. Vite applications need their ordinary Vue plugin; Nuxt supplies Vue compilation. No adapter registration plugin is needed.

Create a component

<script setup lang="ts">
import { ref } from 'vue';
import 'revacss';
import Card from '@revacss/vue/Card.vue';
import Input from '@revacss/vue/Input.vue';
import Button from '@revacss/vue/Button.vue';
const email = ref('');
</script>

<template>
  <Card>
    <template #header><h1>Contact us</h1></template>
    <form action="/contact" method="post">
      <Input v-model="email" id="contact-email" name="email"
        label="Email" type="email" required />
      <Button type="submit">Send</Button>
    </form>
  </Card>
</template>

Load CSS once at the application entry or shared layout. Native HTML can be used in every slot. Implement the form endpoint, server validation, authorization and CSRF protection in the application. Vue models are application state, not server validation. Pass safe validation text through error; never restore passwords from prior input. Text is rendered through escaped Vue interpolation.

Components

Component Contract
Layout Application wrapper with header/footer slots, skip link and container main. Optional mainId and translated skipLabel. Generated main IDs use Vue useId. It does not render html/head/body or manage document metadata.
Button Native button; defaults to type=button. Native type, disabled, events and attributes pass through.
Link Native anchor with button class; required href. Use native links for navigation; use NuxtLink/RouterLink with class=button when client routing is needed.
Card Article with card class; optional header/footer slots. Supply a heading of the appropriate level.
Alert Div with alert class; use data-variant. Add role=status/alert only when appropriate for dynamic announcements.
Disclosure Native details/summary; required summary; native open/name attributes pass through.
Input Text-like native input; required v-model, unique id and label; optional hint/error.
Select Native select; required v-model, unique id and label; option/optgroup slots. Use an array model with multiple and scalar models otherwise.
Textarea Native textarea; required string v-model, unique id and label; optional hint/error.
Field Low-level labelled form group for application controls. Wire control IDs and hint/error associations yourself.

Input, Select and Textarea merge aria-describedby with generated hint/error IDs and set aria-invalid=true when an error is present. Attributes, native event listeners, class/style bindings and data attributes reach the actual control, rather than its form-group wrapper. IDs and their generated -hint/-error IDs must be unique per page. Model changes use Vue’s native form directives. Use plain v-model; component model modifiers are not part of this candidate API. Use native checkbox/radio/file controls with Field instead of Input. For read-only static forms, native HTML is also available without component model bindings.

Appearance and rendering

Set page attributes such as data-theme="auto" and data-font="system" on the application’s document root. In Nuxt, manage those attributes through application head configuration. Layout attributes reach its div wrapper and affect supported nested targets; they do not set the document/body background.

For scoped CSS, import revacss/dist/reva.scoped.css instead of the global build and put class="reva" on the application wrapper. Load optional modules explicitly, for example revacss/dist/reva.glass.css for Glass. Default font needs revacss/dist/reva-fonts.css and data-font="manrope"; System needs no font asset. Load application override CSS after framework CSS. Vue scoped overrides that target child internals may require :deep().

No browser globals, theme persistence, automatic CSS injection, component effects or scripted disclosure handling are added. Server rendering emits native HTML; client hydration and reactivity belong to the consuming Vue application. Nuxt build and server-rendering coverage is recorded in the Nuxt reference. Laravel/Inertia remains an integration route without dedicated platform checks. Hydrated value changes are covered by the opt-in browser checks; client-navigation head updates and manual acceptance remain unverified.

Automated browser review

The requested 14 October 2026 review checks this candidate in Chromium, Firefox and WebKit. It covers native control activation, applicable hydrated value changes, DOM focus through applicable ref/element bindings, disclosure toggles, disabled controls, axe assertions and page reflow at 320/375/768/1280px. These checks are limited to the reference fixtures, not all possible application combinations. Physical devices, screen readers, actual zoom/print and visual approval remain manual release requirements. Set REVA_BROWSER_CHECKS=1 and optionally REVA_TEST_ENGINE=chromium|firefox|webkit when running the maintainer check. Without the flag, checks remain compilation/SSR only.

Maintainer checks

npm --prefix integrations/vue ci --ignore-scripts --legacy-peer-deps
npm --prefix integrations/vue run check

The isolated tooling manifest/lockfile pins the Vue compiler, type checker and build tools. --legacy-peer-deps allows source development before revacss@2 is published; actual consumers install both local tarballs. The check validates strict component types, compiles a packed Vue application and inspects server-rendered markup, field associations, initial models, escaping and missing-ID failures. The opt-in flag adds the browser checks described above. Neither phase certifies manual interaction/accessibility acceptance.