Utilities & Layout
Utility classes, responsive breakpoints, container, grid system, and common layout patterns.
Breakpoints
Mobile-first breakpoints used across all responsive utilities and grid columns.
| Name | Min Width | CSS Prefix | Description |
|---|---|---|---|
| sm | 640px | vt-col-sm-* / vt-sm: | Small phones (landscape) and up |
| md | 768px | vt-col-md-* / vt-md: | Tablets and up |
| lg | 1024px | vt-col-lg-* / vt-lg: | Laptops and up |
| xl | 1280px | vt-col-xl-* / vt-xl: | Desktops and up |
Responsive Variants
Mobile-first breakpoint prefixes. Classes without a prefix apply to all screen sizes.
| Prefix | Min Width | Description |
|---|---|---|
| vt-sm: | 640px | Small screens and up |
| vt-md: | 768px | Medium screens and up |
| vt-lg: | 1024px | Large screens and up |
State Variants
Apply styles conditionally based on element state.
| Prefix | Description | Example |
|---|---|---|
| vt-hover: | On mouse hover | vt-hover:bg-surfaces-subtle |
| vt-focus: | On focus | vt-focus:ring-2 vt-focus:ring-info-primary |
| vt-focus-visible: | Keyboard focus only | vt-focus-visible:ring-2 |
| vt-disabled: | When disabled | vt-disabled:opacity-50 vt-disabled:cursor-not-allowed |
| vt-group-hover: | When parent .group is hovered | group vt-group-hover:text-mains-primary |
| vt-placeholder: | Placeholder text style | vt-placeholder:text-mains-quaternary |
Dark Mode Variants
Prefix classes with vt-dark: to apply only when .dark is on <html>.
| Class | Description |
|---|---|
| vt-dark:hidden | Hide in dark mode |
| vt-dark:block | Show in dark mode |
| vt-dark:bg-generic-black/50 | Dark overlay |
Container
Centered wrapper with responsive padding. Max-width 1280px.
<!-- Centered container (max-width: 1280px) -->
<div class="vt-container">
Content here
</div>
<!-- Full-width container -->
<div class="vt-container-fluid">
Full width content
</div>
12-Column Grid
Flex-based row/column system. Use vt-col-{n} for fixed widths, vt-col for auto-equal.
<!-- 12-column grid -->
<div class="vt-row">
<div class="vt-col-4">4 cols</div>
<div class="vt-col-4">4 cols</div>
<div class="vt-col-4">4 cols</div>
</div>
<!-- Responsive: full width on mobile, 2 cols on md+ -->
<div class="vt-row">
<div class="vt-col-md-6">Half on md+</div>
<div class="vt-col-md-6">Half on md+</div>
</div>
Auto Columns
Use vt-col for equal-width auto columns without specifying a number.
<!-- Auto equal columns -->
<div class="vt-row">
<div class="vt-col">Auto</div>
<div class="vt-col">Auto</div>
<div class="vt-col">Auto</div>
</div>
Responsive Grid
Columns adapt at each breakpoint. Full-width on mobile, multi-column on larger screens.
CSS Grid Utilities
For simpler equal-column layouts, use vt-grid with vt-grid-cols-{n}.
<div class="vt-grid vt-grid-cols-1 vt-sm:grid-cols-2 vt-lg:grid-cols-3 vt-gap-4">
<div class="vt-card">Card 1</div>
<div class="vt-card">Card 2</div>
<div class="vt-card">Card 3</div>
</div>
Common Layouts
Patterns built with flex and grid utilities.
Sidebar + Content
<div class="vt-flex vt-min-h-screen">
<aside class="vt-w-64 vt-shrink-0 vt-border-r vt-border-border-default">
Sidebar
</aside>
<main class="vt-flex-1 vt-min-w-0">
Main content
</main>
</div>
Holy Grail (Header + Sidebar + Content + Footer)
<div class="vt-flex vt-flex-col vt-min-h-screen">
<header class="vt-border-b vt-border-border-default vt-p-4">
Header
</header>
<div class="vt-flex vt-flex-1">
<aside class="vt-w-48 vt-border-r vt-border-border-default vt-p-4">
Sidebar
</aside>
<main class="vt-flex-1 vt-p-6">
Main content
</main>
</div>
<footer class="vt-border-t vt-border-border-default vt-p-4">
Footer
</footer>
</div>
Grid vs Row/Col
When to use which layout system.
- Equal-width columns
- Card grids, galleries
- Simple responsive layouts
- Fixed column count
- Asymmetric columns (3+9, 4+8)
- Sidebar layouts
- Complex responsive breakpoints
- Bootstrap-style grid
Display
10 classes
| Class | CSS |
|---|---|
| vt-block | display: block |
| vt-inline-block | display: inline-block |
| vt-inline | display: inline |
| vt-flex | display: flex |
| vt-inline-flex | display: inline-flex |
| vt-grid | display: grid |
| vt-hidden | display: none |
| vt-table | display: table |
| vt-table-row | display: table-row |
| vt-table-cell | display: table-cell |
Position
10 classes
| Class | CSS |
|---|---|
| vt-static | position: static |
| vt-relative | position: relative |
| vt-absolute | position: absolute |
| vt-fixed | position: fixed |
| vt-sticky | position: sticky |
| vt-inset-0 | inset: 0 |
| vt-top-0 | top: 0 |
| vt-right-0 | right: 0 |
| vt-bottom-0 | bottom: 0 |
| vt-left-0 | left: 0 |
Flexbox
19 classes
| Class | CSS |
|---|---|
| vt-flex-row | flex-direction: row |
| vt-flex-col | flex-direction: column |
| vt-flex-wrap | flex-wrap: wrap |
| vt-flex-nowrap | flex-wrap: nowrap |
| vt-flex-1 | flex: 1 1 0% |
| vt-shrink-0 | flex-shrink: 0 |
| vt-grow | flex-grow: 1 |
| vt-items-start | align-items: flex-start |
| vt-items-center | align-items: center |
| vt-items-end | align-items: flex-end |
| vt-items-stretch | align-items: stretch |
| vt-items-baseline | align-items: baseline |
| vt-justify-start | justify-content: flex-start |
| vt-justify-center | justify-content: center |
| vt-justify-end | justify-content: flex-end |
| vt-justify-between | justify-content: space-between |
| vt-self-start | align-self: flex-start |
| vt-self-center | align-self: center |
| vt-self-end | align-self: flex-end |
Grid
9 classes
| Class | CSS |
|---|---|
| vt-grid-cols-1 | grid-template-columns: repeat(1, 1fr) |
| vt-grid-cols-2 | grid-template-columns: repeat(2, 1fr) |
| vt-grid-cols-3 | grid-template-columns: repeat(3, 1fr) |
| vt-grid-cols-4 | grid-template-columns: repeat(4, 1fr) |
| vt-grid-cols-6 | grid-template-columns: repeat(6, 1fr) |
| vt-grid-cols-12 | grid-template-columns: repeat(12, 1fr) |
| vt-col-span-2 | grid-column: span 2 / span 2 |
| vt-col-span-3 | grid-column: span 3 / span 3 |
| vt-col-span-full | grid-column: 1 / -1 |
Spacing (Padding)
11 classes
| Class | CSS |
|---|---|
| vt-p-0 | padding: 0 |
| vt-p-1 | padding: 0.25rem |
| vt-p-2 | padding: 0.5rem |
| vt-p-3 | padding: 0.75rem |
| vt-p-4 | padding: 1rem |
| vt-p-6 | padding: 1.5rem |
| vt-p-8 | padding: 2rem |
| vt-px-4 | padding-left/right: 1rem |
| vt-py-4 | padding-top/bottom: 1rem |
| vt-pt-4 | padding-top: 1rem |
| vt-pb-4 | padding-bottom: 1rem |
Spacing (Margin)
8 classes
| Class | CSS |
|---|---|
| vt-m-0 | margin: 0 |
| vt-m-auto | margin: auto |
| vt-mx-auto | margin-left/right: auto |
| vt-mt-4 | margin-top: 1rem |
| vt-mb-4 | margin-bottom: 1rem |
| vt-ml-2 | margin-left: 0.5rem |
| vt-mr-2 | margin-right: 0.5rem |
| vt--mt-1 | margin-top: -0.25rem |
Spacing (Gap)
8 classes
| Class | CSS |
|---|---|
| vt-gap-1 | gap: 0.25rem |
| vt-gap-2 | gap: 0.5rem |
| vt-gap-3 | gap: 0.75rem |
| vt-gap-4 | gap: 1rem |
| vt-gap-6 | gap: 1.5rem |
| vt-gap-8 | gap: 2rem |
| vt-gap-x-4 | column-gap: 1rem |
| vt-gap-y-4 | row-gap: 1rem |
Sizing
13 classes
| Class | CSS |
|---|---|
| vt-w-full | width: 100% |
| vt-w-auto | width: auto |
| vt-w-screen | width: 100vw |
| vt-h-full | height: 100% |
| vt-h-screen | height: 100vh |
| vt-min-h-screen | min-height: 100vh |
| vt-min-w-0 | min-width: 0 |
| vt-max-w-sm | max-width: 24rem |
| vt-max-w-md | max-width: 28rem |
| vt-max-w-lg | max-width: 32rem |
| vt-max-w-5xl | max-width: 64rem |
| vt-w-8 | width: 2rem |
| vt-h-8 | height: 2rem |
Typography
29 classes
| Class | CSS |
|---|---|
| vt-text-xs | font-size: 0.75rem |
| vt-text-sm | font-size: 0.875rem |
| vt-text-base | font-size: 1rem |
| vt-text-lg | font-size: 1.125rem |
| vt-text-xl | font-size: 1.25rem |
| vt-text-2xl | font-size: 1.5rem |
| vt-text-3xl | font-size: 1.875rem |
| vt-font-normal | font-weight: 400 |
| vt-font-medium | font-weight: 500 |
| vt-font-semibold | font-weight: 600 |
| vt-font-bold | font-weight: 700 |
| vt-text-left | text-align: left |
| vt-text-center | text-align: center |
| vt-text-right | text-align: right |
| vt-uppercase | text-transform: uppercase |
| vt-lowercase | text-transform: lowercase |
| vt-capitalize | text-transform: capitalize |
| vt-tracking-tight | letter-spacing: -0.025em |
| vt-tracking-wider | letter-spacing: 0.05em |
| vt-leading-none | line-height: 1 |
| vt-leading-tight | line-height: 1.25 |
| vt-leading-normal | line-height: 1.5 |
| vt-leading-relaxed | line-height: 1.625 |
| vt-font-mono | font-family: monospace |
| vt-truncate | overflow: hidden; text-overflow: ellipsis; white-space: nowrap |
| vt-line-clamp-2 | -webkit-line-clamp: 2 |
| vt-whitespace-nowrap | white-space: nowrap |
| vt-no-underline | text-decoration: none |
| vt-underline | text-decoration: underline |
Colors (Text)
10 classes
| Class | CSS |
|---|---|
| vt-text-mains-primary | color: hsl(var(--mains-primary)) |
| vt-text-mains-secondary | color: hsl(var(--mains-secondary)) |
| vt-text-mains-tertiary | color: hsl(var(--mains-tertiary)) |
| vt-text-mains-quaternary | color: hsl(var(--mains-quaternary)) |
| vt-text-info-primary | color: hsl(var(--info-primary)) |
| vt-text-success-primary | color: hsl(var(--success-primary)) |
| vt-text-error-primary | color: hsl(var(--error-primary)) |
| vt-text-warning-primary | color: hsl(var(--warning-primary)) |
| vt-text-generic-white | color: hsl(var(--generic-white)) |
| vt-text-generic-black | color: hsl(var(--generic-black)) |
Colors (Background)
16 classes
| Class | CSS |
|---|---|
| vt-bg-surfaces-background | background: hsl(var(--surfaces-background)) |
| vt-bg-surfaces-surface | background: hsl(var(--surfaces-surface)) |
| vt-bg-surfaces-subtle | background: hsl(var(--surfaces-subtle)) |
| vt-bg-surfaces-moderate | background: hsl(var(--surfaces-moderate)) |
| vt-bg-surfaces-contrast | background: hsl(var(--surfaces-contrast)) |
| vt-bg-info-primary | background: hsl(var(--info-primary)) |
| vt-bg-success-primary | background: hsl(var(--success-primary)) |
| vt-bg-error-primary | background: hsl(var(--error-primary)) |
| vt-bg-warning-primary | background: hsl(var(--warning-primary)) |
| vt-bg-info-background | background: hsl(var(--info-background)) |
| vt-bg-success-background | background: hsl(var(--success-background)) |
| vt-bg-error-background | background: hsl(var(--error-background)) |
| vt-bg-warning-background | background: hsl(var(--warning-background)) |
| vt-bg-generic-white | background: hsl(var(--generic-white)) |
| vt-bg-generic-black | background: hsl(var(--generic-black)) |
| vt-bg-transparent | background: transparent |
Borders
15 classes
| Class | CSS |
|---|---|
| vt-border | border-width: 1px |
| vt-border-0 | border-width: 0 |
| vt-border-2 | border-width: 2px |
| vt-border-t | border-top-width: 1px |
| vt-border-b | border-bottom-width: 1px |
| vt-border-border-default | border-color: hsl(var(--border-default)) |
| vt-border-border-strong | border-color: hsl(var(--border-strong)) |
| vt-border-transparent | border-color: transparent |
| vt-rounded-sm | border-radius: var(--radius-sm) |
| vt-rounded-lg | border-radius: var(--radius-lg) |
| vt-rounded-xl | border-radius: var(--radius-xl) |
| vt-rounded-2xl | border-radius: var(--radius-2xl) |
| vt-rounded-full | border-radius: 9999px |
| vt-divide-y | border-top on children |
| vt-divide-border-default | divide color: hsl(var(--border-default)) |
Shadows
6 classes
| Class | CSS |
|---|---|
| vt-shadow-sm | box-shadow: var(--shadow-sm) |
| vt-shadow | box-shadow: var(--shadow) |
| vt-shadow-md | box-shadow: var(--shadow-md) |
| vt-shadow-lg | box-shadow: var(--shadow-lg) |
| vt-shadow-xl | box-shadow: var(--shadow-xl) |
| vt-shadow-none | box-shadow: none |
Ring (Focus)
5 classes
| Class | CSS |
|---|---|
| vt-ring-1 | box-shadow ring: 1px |
| vt-ring-2 | box-shadow ring: 2px |
| vt-ring-info-primary | ring color: blue |
| vt-ring-error-primary | ring color: red |
| vt-ring-offset-2 | ring offset: 2px |
Opacity
6 classes
| Class | CSS |
|---|---|
| vt-opacity-0 | opacity: 0 |
| vt-opacity-25 | opacity: 0.25 |
| vt-opacity-50 | opacity: 0.5 |
| vt-opacity-75 | opacity: 0.75 |
| vt-opacity-90 | opacity: 0.9 |
| vt-opacity-100 | opacity: 1 |
Transforms
9 classes
| Class | CSS |
|---|---|
| vt-translate-x-0 | --vt-translate-x: 0 |
| vt-translate-x-full | --vt-translate-x: 100% |
| vt--translate-x-full | --vt-translate-x: -100% |
| vt--translate-y-1/2 | --vt-translate-y: -50% |
| vt-rotate-90 | --vt-rotate: 90deg |
| vt-rotate-180 | --vt-rotate: 180deg |
| vt-scale-95 | --vt-scale-x/y: 0.95 |
| vt-scale-100 | --vt-scale-x/y: 1 |
| vt-scale-105 | --vt-scale-x/y: 1.05 |
Transitions & Animation
12 classes
| Class | CSS |
|---|---|
| vt-transition-colors | transition: color, background, border |
| vt-transition-opacity | transition: opacity |
| vt-transition-transform | transition: transform |
| vt-transition-shadow | transition: box-shadow |
| vt-transition-all | transition: all |
| vt-duration-150 | transition-duration: 150ms |
| vt-duration-200 | transition-duration: 200ms |
| vt-duration-300 | transition-duration: 300ms |
| vt-ease-in-out | transition-timing: ease-in-out |
| vt-animate-spin | animation: spin 1s linear infinite |
| vt-animate-pulse | animation: pulse 2s ease infinite |
| vt-animate-ping | animation: ping 1s ease infinite |
Overflow & Cursor
9 classes
| Class | CSS |
|---|---|
| vt-overflow-hidden | overflow: hidden |
| vt-overflow-auto | overflow: auto |
| vt-overflow-x-auto | overflow-x: auto |
| vt-overflow-y-auto | overflow-y: auto |
| vt-cursor-pointer | cursor: pointer |
| vt-cursor-not-allowed | cursor: not-allowed |
| vt-cursor-default | cursor: default |
| vt-select-none | user-select: none |
| vt-pointer-events-none | pointer-events: none |
Z-Index
7 classes
| Class | CSS |
|---|---|
| vt-z-0 | z-index: 0 |
| vt-z-10 | z-index: 10 |
| vt-z-20 | z-index: 20 |
| vt-z-30 | z-index: 30 |
| vt-z-40 | z-index: 40 |
| vt-z-50 | z-index: 50 |
| vt-z-100 | z-index: 100 |
Backdrop Blur
6 classes
| Class | CSS |
|---|---|
| vt-backdrop-blur-none | backdrop-filter: blur(0) |
| vt-backdrop-blur-sm | backdrop-filter: blur(4px) |
| vt-backdrop-blur | backdrop-filter: blur(8px) |
| vt-backdrop-blur-md | backdrop-filter: blur(12px) |
| vt-backdrop-blur-lg | backdrop-filter: blur(16px) |
| vt-backdrop-blur-xl | backdrop-filter: blur(24px) |