From b48262660eb5b4e58f8978e93d99493ce4251e68 Mon Sep 17 00:00:00 2001
From: Erik Cardoso
Date: Sun, 30 Aug 2026 13:13:27 -0300
Subject: [PATCH 1/2] =?UTF-8?q?feat:=20public-readiness=20infrastructure?=
=?UTF-8?q?=20=E2=80=94=20catalog,=20E2E,=20honest=20messaging?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Adds observable truth layer (attribute grammar, generated catalog, compatibility/benchmarks pages), Playwright E2E in CI, docs alignment to channels v2, WordPress examples, CSS dist publish prep, and honest showcase footer copy (zero animation runtime JS).
Co-authored-by: Cursor
---
.github/workflows/ci.yml | 26 +
.gitignore | 2 +
AGENTS.md | 22 +-
README.md | 32 +-
apps/docs/src/pages/agents.astro | 5 +-
apps/docs/src/pages/attributes.astro | 351 +-
apps/docs/src/pages/effects.astro | 37 +-
apps/docs/src/pages/index.astro | 15 +-
apps/docs/src/pages/motion-conditions.astro | 6 +-
apps/docs/src/pages/skills.astro | 6 +-
apps/docs/src/pages/tokens.astro | 2 +-
apps/showcase/config/showcase-coverage.mjs | 17 +-
apps/showcase/config/template-registry.mjs | 3 +
apps/showcase/index.html | 4 +-
apps/showcase/output/contract-checklist.md | 23 +-
apps/showcase/pages/core/archive.html | 4 +-
apps/showcase/pages/core/benchmarks.html | 294 ++
apps/showcase/pages/core/compatibility.html | 302 ++
apps/showcase/pages/core/core.html | 276 +-
apps/showcase/pages/core/elements.html | 4 +-
apps/showcase/pages/core/hosts.html | 51 +-
apps/showcase/pages/core/skins.html | 4 +-
.../pages/motion/api-motion-catalog.html | 29 +-
apps/showcase/pages/motion/motion-lab.html | 38 +-
apps/showcase/pages/motion/playground.html | 304 ++
.../showcase/pages/scenes/scene-timeline.html | 4 +-
apps/showcase/public/css/01-motion-tokens.css | 53 +-
apps/showcase/public/css/03-motion.css | 120 +-
.../public/css/03b-motion-extended.css | 4500 ++++++++---------
apps/showcase/public/css/03c-scene-engine.css | 94 +-
apps/showcase/public/css/scene-recipes.css | 583 ++-
.../public/css/showcase-reference-pages.css | 1370 ++++-
.../showcase/public/css/showcase-tw-demos.css | 2 +-
apps/showcase/public/data/benchmarks.json | 88 +
.../showcase/public/data/catalog-summary.json | 21 +
.../public/data/compatibility-matrix.json | 130 +
apps/showcase/public/data/presets-full.json | 2396 +++++++++
apps/showcase/public/data/presets-index.json | 943 ++++
.../public/js/showcase-api-motion-catalog.js | 62 +-
.../showcase/public/js/showcase-benchmarks.js | 50 +
.../public/js/showcase-catalog-registry.js | 99 +
.../public/js/showcase-compatibility.js | 53 +
.../js/showcase-motion-lab-inspector.js | 239 +
.../showcase/public/js/showcase-playground.js | 211 +
.../scripts/validate-showcase-contract.mjs | 3 +-
docs/AGENTS-VELORA.md | 941 ++++
docs/README.md | 4 +
docs/audits/showcase-readiness-2026.md | 363 ++
docs/project/CONTRACT.md | 31 +-
docs/project/PUBLISH.md | 57 +
docs/project/SCENE_SYSTEM.md | 12 +-
docs/project/SHOWCASE_PAGE_PLAYBOOK.md | 112 +-
docs/project/TIMELINE_ENGINE.md | 4 +-
docs/spec/attribute-grammar.md | 570 +++
.../plans/2026-08-27-core-continuous-track.md | 52 +
.../plans/2026-08-27-core-release-desk.md | 35 +
...2026-08-27-core-continuous-track-design.md | 49 +
.../2026-08-27-core-opera-scenes-design.md | 22 +
.../2026-08-27-core-release-desk-design.md | 129 +
docs/validation/reduced-motion-checklist.md | 68 +
examples/README.md | 1 +
examples/wordpress/README.md | 28 +
examples/wordpress/elementor/README.md | 36 +
.../wordpress/gutenberg/block-pattern.php | 27 +
.../php-template/functions-snippet.php | 36 +
package.json | 9 +-
packages/catalog/README.md | 27 +
packages/catalog/attributes.json | 91 +
packages/catalog/catalog-summary.json | 21 +
packages/catalog/package.json | 17 +
packages/catalog/presets.json | 2398 +++++++++
packages/catalog/scripts/generate-catalog.mjs | 447 ++
.../compiler/output/motion-compiler-report.md | 191 +-
packages/css/README.md | 56 +
packages/css/package.json | 10 +-
packages/css/scripts/build-dist.mjs | 168 +
packages/css/scripts/check-dist.mjs | 26 +
packages/css/src/01-motion-tokens.css | 53 +-
packages/css/src/03-motion.css | 120 +-
packages/css/src/03b-motion-extended.css | 4500 ++++++++---------
packages/css/src/03c-scene-engine.css | 94 +-
packages/css/src/scene-recipes.css | 583 ++-
pnpm-lock.yaml | 40 +
tests/README.md | 41 +
tests/e2e/catalog-data.spec.mjs | 35 +
tests/e2e/playwright.config.mjs | 36 +
tests/e2e/showcase.reduced-motion.spec.mjs | 38 +
tests/e2e/showcase.smoke.spec.mjs | 67 +
88 files changed, 18743 insertions(+), 5780 deletions(-)
create mode 100644 apps/showcase/pages/core/benchmarks.html
create mode 100644 apps/showcase/pages/core/compatibility.html
create mode 100644 apps/showcase/pages/motion/playground.html
create mode 100644 apps/showcase/public/data/benchmarks.json
create mode 100644 apps/showcase/public/data/catalog-summary.json
create mode 100644 apps/showcase/public/data/compatibility-matrix.json
create mode 100644 apps/showcase/public/data/presets-full.json
create mode 100644 apps/showcase/public/data/presets-index.json
create mode 100644 apps/showcase/public/js/showcase-benchmarks.js
create mode 100644 apps/showcase/public/js/showcase-catalog-registry.js
create mode 100644 apps/showcase/public/js/showcase-compatibility.js
create mode 100644 apps/showcase/public/js/showcase-motion-lab-inspector.js
create mode 100644 apps/showcase/public/js/showcase-playground.js
create mode 100644 docs/AGENTS-VELORA.md
create mode 100644 docs/audits/showcase-readiness-2026.md
create mode 100644 docs/project/PUBLISH.md
create mode 100644 docs/spec/attribute-grammar.md
create mode 100644 docs/superpowers/plans/2026-08-27-core-continuous-track.md
create mode 100644 docs/superpowers/plans/2026-08-27-core-release-desk.md
create mode 100644 docs/superpowers/specs/2026-08-27-core-continuous-track-design.md
create mode 100644 docs/superpowers/specs/2026-08-27-core-opera-scenes-design.md
create mode 100644 docs/superpowers/specs/2026-08-27-core-release-desk-design.md
create mode 100644 docs/validation/reduced-motion-checklist.md
create mode 100644 examples/wordpress/README.md
create mode 100644 examples/wordpress/elementor/README.md
create mode 100644 examples/wordpress/gutenberg/block-pattern.php
create mode 100644 examples/wordpress/php-template/functions-snippet.php
create mode 100644 packages/catalog/README.md
create mode 100644 packages/catalog/attributes.json
create mode 100644 packages/catalog/catalog-summary.json
create mode 100644 packages/catalog/package.json
create mode 100644 packages/catalog/presets.json
create mode 100644 packages/catalog/scripts/generate-catalog.mjs
create mode 100644 packages/css/README.md
create mode 100644 packages/css/scripts/build-dist.mjs
create mode 100644 packages/css/scripts/check-dist.mjs
create mode 100644 tests/README.md
create mode 100644 tests/e2e/catalog-data.spec.mjs
create mode 100644 tests/e2e/playwright.config.mjs
create mode 100644 tests/e2e/showcase.reduced-motion.spec.mjs
create mode 100644 tests/e2e/showcase.smoke.spec.mjs
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index a02b258..348d07b 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -37,3 +37,29 @@ jobs:
- name: Build
run: pnpm build
+
+ e2e:
+ runs-on: ubuntu-latest
+ needs: build
+
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+
+ - name: Setup pnpm
+ uses: pnpm/action-setup@v4
+
+ - name: Setup Node.js
+ uses: actions/setup-node@v4
+ with:
+ node-version: 22.13
+ cache: pnpm
+
+ - name: Install dependencies
+ run: pnpm install --frozen-lockfile
+
+ - name: Install Playwright browsers
+ run: pnpm exec playwright install --with-deps chromium firefox webkit
+
+ - name: E2E tests
+ run: pnpm test:e2e
diff --git a/.gitignore b/.gitignore
index 915e73b..3e21577 100644
--- a/.gitignore
+++ b/.gitignore
@@ -12,6 +12,8 @@ packages/css/dist/
**/.turbo/
**/.playwright-cli/
**/output/playwright/
+test-results/
+playwright-report/
pnpm-debug.log*
# Astro
diff --git a/AGENTS.md b/AGENTS.md
index 20adbb5..234c6bc 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -1,25 +1,27 @@
## Learned User Preferences
- Prefer communication in Portuguese.
-- Zero-JS motion is non-negotiable: never introduce JS animation runtimes; keep the CSS-only / HTML+CSS path.
+- Zero animation runtime JavaScript is non-negotiable (not absolute “Zero JavaScript”); never introduce JS animation runtimes; keep the CSS-only / HTML+CSS path.
- Treat Velora as a declarative CSS motion runtime and modern reference—not a utility framework; prioritize positioning, consistency, technical demos, and perceived value over feature volume.
-- Prefer evaluate-then-plan against the execution roadmap before large changes; often wants page-by-page reformulation using Velora CSS and the Showcase template.
+- Prefer evaluate-then-plan against `docs/AGENTS-VELORA.md` (P0/P1 public-readiness roadmap) and the showcase-readiness audit before large feature work; often wants page-by-page reformulation using Velora CSS and the Showcase template.
- Showcase pages should feel cinematic and exercise the design system plus motion catalog resources, not generic or simplistic layouts.
-- Prefer complex, coordinated scenes (3D stages, large type, enter/exit choreography, horizontal/stacked sections) over sparse section layouts.
-- Keep showcase UI patterns consistent across pages; avoid exaggerated glow and one-off chrome that breaks the shared look.
+- Prefer complex, coordinated scenes (3D stages, large type, enter/exit choreography, continuous pin+scrub opera tracks, horizontal/stacked sections) over sparse section layouts or product-form “release desk” teaching UIs.
+- Keep showcase UI patterns consistent across pages; avoid exaggerated glow and one-off chrome that breaks the shared look; motion catalog should use compact DX controls covering the full contract and varied demo visuals (not repetitive chrome).
- Stage 3D should be a reusable CSS-only stage contract (perspective/preserve-3d on the container; positional transforms via CSS vars on items; motion on inner content), not cube-triad-specific demos; preserve text-ring-orbit and circle-text-scroll.
-- Aim for GSAP-like scene authorship in HTML/CSS (shared scene clock, relative timing, pin+scrub)—preferred product direction for the scene engine.
+- Aim for GSAP-like scene authorship in HTML/CSS (shared scene clock, relative timing, pin+scrub); use `vl-in-view` for temporal viewport-gated enters and `vl-timeline="view"` (+ `vl-range`) for scrub—often hybrid on teaching pages; inside pinned scenes use chapter gates on the scene clock (`vl-act`/`vl-span`), not nested `vl-in-view` on `[vl-stage]`.
- Core motion must stay host-agnostic and work with any UI (Tailwind and others); **Skins** is the product name for the Velora design-system layer (named themes via `data-editorial-theme`); Showcase is the cinematic reference UI, not the motion contract.
- Prefer modern CSS capabilities (e.g. `if()`, typed `attr()`, `sibling-index()`) as progressive enhancement for scene choreography.
-- Prefer fixing contract/consistency before expanding demos; prefer a lean public Showcase that archives surplus pages in-repo rather than deleting Skins/DS work; reuse existing motion examples rather than inventing parallel systems.
+- Prefer hardening Scene Engine + `vl-in-view` contract/consistency before expanding demos; expand motion inventory before freezing core/catalog; prefer a lean public Showcase that archives surplus pages in-repo rather than deleting Skins/DS work; reuse existing motion examples rather than inventing parallel systems.
## Learned Workspace Facts
- Monorepo layout: canonical CSS in `packages/css/src/`; Vite playground in `apps/showcase/`; Astro docs app in `apps/docs/`; markdown source of truth in repo-root `docs/`; plus `design-system/`, `examples/`, `experiments/`, and `starters/html-css-minimal/`.
- Always edit CSS in `packages/css/src/` and sync to showcase (`pnpm sync:showcase-css`); `apps/showcase/public/css/` is derived and must not be edited as source.
-- Motion is attribute-driven (`vl-effect`, `vl-timeline`, `vl-range`, `vl-scene`, related `vl-*`); rules live in ordered `@layer velora.*` (reset → tokens → layout → motion → components → transitions → utilities → overrides).
+- Motion is attribute-driven (`vl-effect`, `vl-timeline`, `vl-range`, `vl-scene`, `vl-in-view`, related `vl-*`); `vl-in-view` is a temporal viewport gate (not scrub) that replays descendant motion on re-entry and must not pause scroll-driven timelines; do not nest `vl-in-view` on `[vl-scene][vl-timeline="view"] [vl-stage]`—use chapter gates on the scene clock for in-view-like enter/replay/exit inside pin; view-clock stages compose via named `--vl-scene` / `--vl-scroll-timeline`; rules live in ordered `@layer velora.*` (reset → tokens → layout → motion → components → transitions → utilities → overrides).
- Product surfaces split: Velora core = scene/motion engine; Showcase = cinematic reference UI/DS; docs site documents the framework once the API is stable.
-- `@velora/css` ships separable entrypoints: `motion-core` (host-agnostic engine) vs `theme` / full bundle (visual Skins); editorial skins use `html[data-editorial-theme]` (e.g. noir, earth, aethel, meridian).
+- `@velora/css` ships separable entrypoints: `motion-core` (host-agnostic engine) vs `theme` / full bundle (visual Skins); editorial skins use `html[data-editorial-theme]` (e.g. noir, earth, aethel, meridian); cube-triad demos live in `scene-recipes.css`, not the core 3D stage contract; package is monorepo-local—not yet published to npm (document honestly until P1.4).
- Lean Showcase restarts should snapshot retired pages under a dated in-repo `archive/` (outside live Vite registry and contract checks), not delete recoverable DS/skin work.
-- Workspace tooling is pnpm + Turborepo; common checks include `pnpm verify:contract` and showcase CSS drift checks.
-- Root `AGENTS.md` holds learned memory only; agent operating instructions live under `docs/agents/AGENTS.md` and must not be mixed into the learned-memory file.
+- Workspace tooling is pnpm + Turborepo; local Showcase via `pnpm dev` (or `pnpm --filter showcase dev`); common checks include `pnpm verify:contract`, showcase CSS drift checks, and `pnpm generate:catalog` / `pnpm check:catalog`.
+- Root `AGENTS.md` holds learned memory only; agent operating instructions live under `docs/agents/AGENTS.md`; `docs/AGENTS-VELORA.md` is the product/public-readiness roadmap (P0/P1)—keep all three distinct.
+- Canonical public spec chain: `docs/spec/attribute-grammar.md` + generated `packages/catalog/` (`pnpm generate:catalog`) + operational matrix in `docs/project/CONTRACT.md`.
+- Showcase motion authorship (gate vs scrub vs scene, anti-patterns) lives in `docs/project/SHOWCASE_PAGE_PLAYBOOK.md` §4; bussola section IDs must compose `view-timeline-name` with `--vl-scene` (e.g. `--vl-scene, --tl-N`), and unlayered `.scene-tl-stage { position: relative }` breaks sticky pin on `[vl-stage]`.
diff --git a/README.md b/README.md
index f00fd59..cc01ae5 100644
--- a/README.md
+++ b/README.md
@@ -1,12 +1,12 @@
# Velora
-**Motion-native CSS. Zero JavaScript. Cinematic interfaces.**
+**Motion-native CSS. Zero animation runtime JavaScript. Cinematic interfaces.**

Velora is a **declarative CSS motion engine**. HTML attributes describe intent; the browser executes it. No JavaScript animation runtime. Works with Tailwind, Relume, or any UI.
-The optional **Skins** layer provides complete design-system models. The cinematic **Showcase** proves how Core behavior and Skin DNA combine; neither is required to turn motion on.
+The optional **Skins** layer provides complete design-system models. The cinematic **Showcase** proves how Core behavior and Skin DNA combine; neither is required to turn motion on.
## Features
@@ -16,9 +16,9 @@ The optional **Skins** layer provides complete design-system models. The cinemat
📐 **8-Layer Cascade Architecture** — Structured specificity via CSS `@layer` (reset → tokens → layout → motion → components → transitions → utilities → overrides)
-🔄 **Element + Scroll Motion** — Native entry/exit, intrinsic-size, top-layer, path and scroll-driven motion
+🔄 **Element + Scroll Motion** — Native entry/exit, intrinsic-size, top-layer, path and scroll-driven motion
-📦 **Declarative Attribute Grammar** — Motion via HTML attributes (`vl-effect`, `vl-timeline`, `vl-children`, `vl-scene`) instead of CSS classes
+📦 **Declarative Attribute Grammar** — Motion via HTML attributes (`vl-enter`, `vl-scroll`, `vl-scene`, `vl-timeline`, …) instead of CSS classes
⚡ **Container Queries & Density Modes** — Responsive components with default, compact, and presentation layout modes
@@ -30,6 +30,14 @@ The optional **Skins** layer provides complete design-system models. The cinemat
pnpm add @velora/css
```
+> **Note:** `@velora/css` is **publish-ready** (`dist/` + manifest) but **not yet on npm**. Use workspace, `pnpm pack:css`, or CDN URLs from [PUBLISH.md](docs/project/PUBLISH.md) after release.
+
+### CDN (after publish)
+
+```html
+
+```
+
### 2. Import
Host-agnostic (any UI — Tailwind, etc.):
@@ -50,7 +58,7 @@ Full Velora look (theme + components + motion):
```html
-
Zero-JS motion
+
Declarative motion
Same attributes on Tailwind or Velora UI.
@@ -83,9 +91,9 @@ It includes:
- `@velora/css/premium` — premium components
- `@velora/css/overrides` — last-mile override layer
-Proofs: `examples/tailwind-host/` (motion-core + Tailwind) · `apps/showcase` (six primary areas: Home, Core, Elements, Scenes, Skins, Catalog). Hosts and Archive remain secondary references. Older Showcase pages: `archive/showcase-2026-08/`.
-
-**Skins** are named design-system models (`html[data-editorial-theme]`) covering typography, grid, density, geometry, materials, media and motion voice—not only color. They are optional; motion works without them.
+Proofs: `examples/tailwind-host/` (motion-core + Tailwind) · `apps/showcase` (six primary areas: Home, Core, Elements, Scenes, Skins, Catalog). Hosts and Archive remain secondary references. Older Showcase pages: `archive/showcase-2026-08/`.
+
+**Skins** are named design-system models (`html[data-editorial-theme]`) covering typography, grid, density, geometry, materials, media and motion voice—not only color. They are optional; motion works without them.
## Motion Channels (v2)
@@ -147,7 +155,9 @@ Apply a preset with a single attribute:
```
-No JavaScript required.
+No animation runtime JavaScript required for cross-document MPA transitions.
+
+**Spec:** [`docs/spec/attribute-grammar.md`](docs/spec/attribute-grammar.md) · **Preset registry:** `packages/catalog/` (136 presets, `pnpm generate:catalog`)
## Workspace Layout
@@ -158,8 +168,8 @@ velora/
├── docs/ # Markdown source of truth (contract, workspace, agents)
├── packages/
│ ├── css/ # @velora/css — canonical framework source
-│ ├── pages/ # legacy/reference HTML pages used by showcase tooling
-│ └── velora-components/ # component HTML catalog and source material
+│ ├── catalog/ # Generated preset registry (pnpm generate:catalog)
+│ └── compiler/ # Grammar validator and motion scanner
├── apps/
│ ├── showcase/ # Vite showcase (primary interactive app + API catalogs)
│ └── docs/ # Astro documentation site (published guides)
diff --git a/apps/docs/src/pages/agents.astro b/apps/docs/src/pages/agents.astro
index 2c41b5f..d709078 100644
--- a/apps/docs/src/pages/agents.astro
+++ b/apps/docs/src/pages/agents.astro
@@ -28,11 +28,10 @@ import Base from "../layouts/Base.astro";
<section
vl-scene="hero"
vl-timeline="view"
- vl-effect="scene-hero-reveal"
vl-range="entry 0% cover 70%"
vl-pin>
- <h1>Build motion-rich interfaces with HTML and CSS</h1>
- <p>No animation libraries. No framework runtime.</p>
+ <h1 vl-enter="fade-up">Build motion-rich interfaces with HTML and CSS</h1>
+ <p vl-enter="fade-up" vl-delay="120ms">No animation libraries. No animation runtime JS.</p>
</section>
diff --git a/apps/docs/src/pages/attributes.astro b/apps/docs/src/pages/attributes.astro
index 5d4a779..e4d32ee 100644
--- a/apps/docs/src/pages/attributes.astro
+++ b/apps/docs/src/pages/attributes.astro
@@ -2,13 +2,14 @@
import Base from "../layouts/Base.astro";
---
-
+Reference
Attribute Reference
- Complete reference for every vl-* HTML attribute. Attributes are Velora's
- declarative grammar — they express intent, not implementation.
+ Velora motion is declared with vl-* HTML attributes. Prefer channels
+ (vl-enter, vl-scroll, …) for new work. Canonical spec:
+ attribute-grammar.md.
Quick Reference
@@ -17,328 +18,94 @@ import Base from "../layouts/Base.astro";
- Overrides the default stagger step (--vl-stagger-step: 45ms) for vl-children.
+ Each channel owns one behavior. See the
+ Motion Catalog
+ and generated registry (pnpm generate:catalog) for the full preset list.
- Multiplies the translation distance (--vl-motion-distance) for entrance effects.
- Affects fade-up, fade-down, slide-left, slide-right,
- flow-in, and other translate-based effects.
+ Place channel attributes on direct[vl-stage] children.
+ Do not nest vl-in-view inside a pin+scrub stage — use vl-act / vl-span instead.
- Boolean attribute. Makes the element sticky (position: sticky; top: 0) at
- z-index: 200. Use on scene sections that should remain fixed during scroll.
+ Temporal viewport gate: descendant enter/exit/loop/hover/state motion replays on re-entry.
+ Does not pause vl-scroll. Use outside pin+scrub scenes.
-
<section vl-scene="hero" vl-pin>
- <!-- Stays at top of viewport while parent scrolls -->
-</section>
-
-
-
-
vl-scrub
-
- Boolean attribute. Switches timing to linear (animation-timing-function: linear) and
- sets animation-fill-mode: both. Use with scroll-driven effects where you want
- direct scroll-to-animation scrubbing without easing curves.
-
- A CSS selector string that hints which descendants should be targeted by the scene or children
- system. CSS-only support is limited — primary use is for documentation and future runtime hooks.
-
diff --git a/apps/docs/src/pages/effects.astro b/apps/docs/src/pages/effects.astro
index 6c51924..464165f 100644
--- a/apps/docs/src/pages/effects.astro
+++ b/apps/docs/src/pages/effects.astro
@@ -2,38 +2,35 @@
import Base from "../layouts/Base.astro";
---
-
+Motion
Motion Effects
- Named motion presets applied via the vl-effect attribute. All effects are pure CSS —
- no JavaScript involved.
+ Prefer channels v2: vl-enter, vl-scroll, vl-hover, etc.
+ vl-effect remains a legacy/composite escape hatch. All motion is CSS-only — zero animation runtime JavaScript.
+ See Attribute Reference.
-
How Effects Work
+
How channels work
- Add vl-effect to any element to apply a preset. Combine with
- vl-timeline to control when the animation plays:
+ Pick the channel that owns the behavior, then add vl-timeline when you need a progress model:
-
<!-- Plays immediately on page load -->
-<h1 vl-effect="fade-up">Heading</h1>
+
<!-- Entrance (preferred) -->
+<h1 vl-enter="fade-up">Heading</h1>
-<!-- Plays when element enters the viewport -->
-<div vl-effect="blur-in" vl-timeline="view">Content</div>
+<!-- Viewport-gated enter -->
+<div vl-in-view>
+ <p vl-enter="fade-up" vl-timeline="view">Content</p>
+</div>
-<!-- Plays once, stays visible after -->
-<div vl-effect="clip-rise" vl-timeline="view" vl-once>One-shot reveal</div>
+<!-- Scroll-linked -->
+<img vl-scroll="media-zoom" vl-timeline="view" alt="" />
-<!-- Custom depth and speed -->
-<div
- vl-effect="fade-up"
- vl-timeline="view"
- style="--vl-motion-distance: 2.5rem; --vl-motion-duration: 700ms;">
- Deep, slow reveal
-</div>
+<!-- Legacy composite (avoid for new work) -->
+<div vl-effect="blur-in" vl-timeline="view">…</div>
-
Entrance Primitives
+
Entrance presets (vl-enter)
Affect the element itself. Best combined with vl-timeline="view" for scroll-driven reveals.
diff --git a/apps/docs/src/pages/index.astro b/apps/docs/src/pages/index.astro
index 661a47a..2bb4dc9 100644
--- a/apps/docs/src/pages/index.astro
+++ b/apps/docs/src/pages/index.astro
@@ -15,10 +15,21 @@ import Base from "../layouts/Base.astro";
Installation
-
Install the package from the npm registry:
+
+ @velora/css is developed in this monorepo. It is not yet published to npm.
+ Use workspace:*, a path import, or pnpm pack from packages/css after pnpm build.
+
Motion language — not a utility framework requirement
-
Zero JS for animation — scroll timelines, view transitions, CSS only
+
Zero animation runtime JavaScript — scroll timelines, view transitions, CSS only (Showcase tooling JS is separate)
Showcase — cinematic reference UI / design system skin
diff --git a/apps/docs/src/pages/motion-conditions.astro b/apps/docs/src/pages/motion-conditions.astro
index 2173c80..705279e 100644
--- a/apps/docs/src/pages/motion-conditions.astro
+++ b/apps/docs/src/pages/motion-conditions.astro
@@ -13,12 +13,12 @@ import Base from "../layouts/Base.astro";
A single declarative attribute — vl-motion — selects a motion mode for an
element and its subtree. It does not name a preset; instead it re-scales the shared engine tokens
that every preset already reads, so one attribute adapts timing, travel, depth, blur and easing
- across the whole subtree. Zero JavaScript.
+ across the whole subtree. Zero animation runtime JavaScript.
The Modes
- Add vl-motion to any element. Descendant vl-effect / vl-enter
+ Add vl-motion to any element. Descendant vl-enter / vl-scroll
reveals inherit the mode automatically.
@@ -52,7 +52,7 @@ import Base from "../layouts/Base.astro";
Allowed: add new motion presets, refactor motion declarations into variables/tokens, create scroll-linked CSS patterns, define primitive vs scene motion distinctions.
Forbidden: using JS to drive animations that modern CSS can handle, mixing scene orchestration into primitive effect definitions without need, introducing unregistered effect names casually.
Ideal prompt
-
Implement vl-effect="flow-in" and vl-timeline="view" using layered CSS only. No JS. Use tokenized values and reduced-motion support.
+
Implement vl-enter="flow-in" and vl-timeline="view" using layered CSS only. No animation runtime JS. Use tokenized values and reduced-motion support.
diff --git a/apps/docs/src/pages/tokens.astro b/apps/docs/src/pages/tokens.astro
index 4193a24..58f2d81 100644
--- a/apps/docs/src/pages/tokens.astro
+++ b/apps/docs/src/pages/tokens.astro
@@ -279,7 +279,7 @@ import Base from "../layouts/Base.astro";
<!-- Override per element -->
<div
- vl-effect="fade-up"
+ vl-enter="fade-up"
vl-timeline="view"
style="--vl-motion-distance: 2rem; --vl-motion-duration: 600ms;">
Custom depth and speed
diff --git a/apps/showcase/config/showcase-coverage.mjs b/apps/showcase/config/showcase-coverage.mjs
index 4d29ff2..b37d568 100644
--- a/apps/showcase/config/showcase-coverage.mjs
+++ b/apps/showcase/config/showcase-coverage.mjs
@@ -28,7 +28,22 @@ export const SHOWCASE_COVERAGE = {
"pages/motion/api-motion-catalog.html": {
name: "Catalog",
role: "Provide a concise public decision guide for channels, scenes, timelines, support and fallbacks.",
- signature: "Intent-first reference with canonical recipes and a separate exhaustive Motion Lab",
+ signature: "Intent-first reference with canonical recipes, generated preset registry and a separate exhaustive Motion Lab",
+ },
+ "pages/core/compatibility.html": {
+ name: "Compatibility",
+ role: "Document primitive support tiers, browser matrix, fallbacks and reduced-motion policy.",
+ signature: "Generated compatibility matrix linked to packages/catalog",
+ },
+ "pages/core/benchmarks.html": {
+ name: "Benchmarks",
+ role: "Publish reproducible integration evidence — not unverified FPS marketing.",
+ signature: "Objective metrics table, methodology draft and automated bench roadmap",
+ },
+ "pages/motion/playground.html": {
+ name: "Playground",
+ role: "Compose public vl-* attributes from the registry, preview CSS-only motion, copy markup.",
+ signature: "Playground UI uses JavaScript; preview motion uses Velora/CSS",
},
},
componentGroups: {
diff --git a/apps/showcase/config/template-registry.mjs b/apps/showcase/config/template-registry.mjs
index 0d1e6e6..a74476d 100644
--- a/apps/showcase/config/template-registry.mjs
+++ b/apps/showcase/config/template-registry.mjs
@@ -22,8 +22,11 @@ export const TEMPLATE_REGISTRY = {
],
secondary: [
"pages/core/hosts.html",
+ "pages/core/compatibility.html",
+ "pages/core/benchmarks.html",
"pages/core/archive.html",
"pages/motion/motion-lab.html",
+ "pages/motion/playground.html",
],
},
},
diff --git a/apps/showcase/index.html b/apps/showcase/index.html
index 68fda6a..c98a17a 100644
--- a/apps/showcase/index.html
+++ b/apps/showcase/index.html
@@ -1174,7 +1174,7 @@
Six focused areas. One engine for the whole
-
Motion-native CSS framework. Browser-first. Zero JavaScript. 120fps.
+
Motion-native CSS. Browser-first. Zero animation runtime JavaScript.