Vize

Aspect Ratio

Headless Aspect Ratio; covers CSS aspect-ratio, Radix UI AspectRatio, Reka UI AspectRatio.

Package @vizejs/ui/aspect-ratio
Maturity stable
Own the source vize lib pull aspect-ratio
Requires —
Aliases aspect ratio, intrinsic ratio, responsive media box
Covers CSS aspect-ratio, Radix UI AspectRatio, Reka UI AspectRatio

Usage

import { AspectRatio } from "@vizejs/ui/aspect-ratio";

Or copy the source into your project with vize lib pull aspect-ratio (see Source Distribution).

API

AspectRatio

Source: src/families/layout/aspect-ratio/aspect-ratio.vue

Props

Prop Type Default Description
as PrimitiveAs "div" Native element, custom element, or component to render.
ratio number 1 Positive finite width divided by height. Invalid values fall back to 1.

Slots

Slot Slot props Description
default AspectRatioSlotState Renders the box contents with the normalized ratio state.

Exposed

Member Type Description
element AspectRatioElement | null Rendered host element or component instance.
ratio number Ratio used for the rendered box after validation.
invalid boolean Whether the provided ratio fell back to the default square ratio.

Behavior

Normative state x input -> outcome table for aspect-ratio.vue (@vizejs/ui/aspect-ratio). Every row is proven by the named mounted-DOM test, SSR test, runtime conformance check, or validation script. A row without a passing test or check is a contract violation.

# State Input Outcome Proven by
A1 default render renders <div data-vize-ui="aspect-ratio">, data-state="valid", and a square ratio renders a square headless host by default
A2 valid ratio render publishes the normalized ratio to data-vize-aspect-ratio and --vize-ui-aspect-ratio publishes the requested ratio through stable data and style hooks
A3 invalid ratio render falls back to ratio 1 and data-state="fallback" for non-positive or non-finite values falls back deliberately for non-positive and non-finite ratios
A4 as="section" render renders the requested semantic host and passes normalized ratio and invalid to the slot renders a semantic host and exposes normalized slot state
A5 any expose exposes element, normalized ratio, and invalid exposes the rendered element and live normalized ratio state
A6 SSR valid ratio isolated requests renders byte-identical intrinsic-ratio markup with the same data and style hooks renders byte-identical intrinsic ratio markup across isolated SSR requests
A7 SSR invalid ratio render renders fallback ratio markup without request-global state renders fallback ratio markup for invalid server input
A8 DOM/SSR/Vapor compile authored SFC compiles in every renderer lane without warnings or fallback scripts/check-renderers.ts
A9 root/subpath consumer bundle root and subpath consumers retain only AspectRatio, emit no CSS, and stay within gzip budget scripts/check-tree-shaking.mjs

Props

Prop Type Purpose Default
as PrimitiveAs Native element, custom element, or component rendered as host. "div"
ratio number Positive finite width divided by height. Invalid values use 1. 1

Slots

Slot Props Purpose Default
default { ratio: number; invalid: boolean } Render content inside the ratio host. none

Expose

Name Type Purpose Default
element AspectRatioElement | null Rendered host element or component instance. null
ratio number Ratio used for the rendered box after validation. 1
invalid boolean Whether the provided ratio fell back to the default. false

Data Attributes

Attribute Values Purpose Default
data-vize-ui "aspect-ratio" Stable family selector. always
data-state "valid", "fallback" Ratio validation state. "valid"
data-vize-aspect-ratio positive number string Normalized ratio used by the host style. "1"

CSS Custom Properties

Custom property Purpose Default
--vize-ui-aspect-ratio Value read by the inline aspect-ratio declaration. "1"

Styling Contract

AspectRatio is headless: it emits no stylesheet and no visual preset. The host receives only the inline aspect-ratio: var(--vize-ui-aspect-ratio) declaration and matching custom property required for intrinsic layout.