diff --git a/.cursor/hooks/state/continual-learning-index.json b/.cursor/hooks/state/continual-learning-index.json new file mode 100644 index 0000000..34b2117 --- /dev/null +++ b/.cursor/hooks/state/continual-learning-index.json @@ -0,0 +1,93 @@ +{ + "version": 1, + "transcripts": { + "/Users/erikassiscardoso/.cursor/projects/Users-erikassiscardoso-Local-Sites-velora/agent-transcripts/18618295-bdf2-46e6-b561-c3a2775071d4/18618295-bdf2-46e6-b561-c3a2775071d4.jsonl": { + "mtimeMs": 1778184725699, + "mtimeSec": 1778184725 + }, + "/Users/erikassiscardoso/.cursor/projects/Users-erikassiscardoso-Local-Sites-velora/agent-transcripts/18618295-bdf2-46e6-b561-c3a2775071d4/subagents/0f44cf87-7461-4845-9f03-338f5dc902fa.jsonl": { + "mtimeMs": 1778184539161, + "mtimeSec": 1778184539 + }, + "/Users/erikassiscardoso/.cursor/projects/Users-erikassiscardoso-Local-Sites-velora/agent-transcripts/18618295-bdf2-46e6-b561-c3a2775071d4/subagents/3a538d77-2c55-4b14-9d9e-7cc1bc4a3e78.jsonl": { + "mtimeMs": 1778184550203, + "mtimeSec": 1778184550 + }, + "/Users/erikassiscardoso/.cursor/projects/Users-erikassiscardoso-Local-Sites-velora/agent-transcripts/18618295-bdf2-46e6-b561-c3a2775071d4/subagents/e7c111ca-606d-4a7c-b6ed-6f15fd594ad7.jsonl": { + "mtimeMs": 1778184530873, + "mtimeSec": 1778184530 + }, + "/Users/erikassiscardoso/.cursor/projects/Users-erikassiscardoso-Local-Sites-velora/agent-transcripts/1a0acb75-2678-41d9-a434-61d34aa5db6e/1a0acb75-2678-41d9-a434-61d34aa5db6e.jsonl": { + "mtimeMs": 1777455389418, + "mtimeSec": 1777455389 + }, + "/Users/erikassiscardoso/.cursor/projects/Users-erikassiscardoso-Local-Sites-velora/agent-transcripts/4784ec19-7f3e-4ce7-84bb-485c708340f8/4784ec19-7f3e-4ce7-84bb-485c708340f8.jsonl": { + "mtimeMs": 1778189613797, + "mtimeSec": 1778189613 + }, + "/Users/erikassiscardoso/.cursor/projects/Users-erikassiscardoso-Local-Sites-velora/agent-transcripts/558abbbe-b072-48ec-82e2-2b80941fbe18/558abbbe-b072-48ec-82e2-2b80941fbe18.jsonl": { + "mtimeMs": 1777456066747, + "mtimeSec": 1777456066 + }, + "/Users/erikassiscardoso/.cursor/projects/Users-erikassiscardoso-Local-Sites-velora/agent-transcripts/6607f714-8ca0-4f9c-8438-37e472087f00/6607f714-8ca0-4f9c-8438-37e472087f00.jsonl": { + "mtimeMs": 1778186899932, + "mtimeSec": 1778186899 + }, + "/Users/erikassiscardoso/.cursor/projects/Users-erikassiscardoso-Local-Sites-velora/agent-transcripts/6607f714-8ca0-4f9c-8438-37e472087f00/subagents/3421c42d-30dc-4c0a-8862-3e7bef09293c.jsonl": { + "mtimeMs": 1778185139365, + "mtimeSec": 1778185139 + }, + "/Users/erikassiscardoso/.cursor/projects/Users-erikassiscardoso-Local-Sites-velora/agent-transcripts/6607f714-8ca0-4f9c-8438-37e472087f00/subagents/5257044c-1ee3-4a8a-8bcc-e832c1098b75.jsonl": { + "mtimeMs": 1778186072210, + "mtimeSec": 1778186072 + }, + "/Users/erikassiscardoso/.cursor/projects/Users-erikassiscardoso-Local-Sites-velora/agent-transcripts/6607f714-8ca0-4f9c-8438-37e472087f00/subagents/5f1fbb68-c2a6-4653-bc18-39fd65714456.jsonl": { + "mtimeMs": 1778185807372, + "mtimeSec": 1778185807 + }, + "/Users/erikassiscardoso/.cursor/projects/Users-erikassiscardoso-Local-Sites-velora/agent-transcripts/6607f714-8ca0-4f9c-8438-37e472087f00/subagents/71601be8-1824-4ff6-bff6-10979b3b9d1c.jsonl": { + "mtimeMs": 1778185707953, + "mtimeSec": 1778185707 + }, + "/Users/erikassiscardoso/.cursor/projects/Users-erikassiscardoso-Local-Sites-velora/agent-transcripts/6607f714-8ca0-4f9c-8438-37e472087f00/subagents/8cdb1bbe-17af-4e99-99d4-753cd306a954.jsonl": { + "mtimeMs": 1778185806433, + "mtimeSec": 1778185806 + }, + "/Users/erikassiscardoso/.cursor/projects/Users-erikassiscardoso-Local-Sites-velora/agent-transcripts/6a780cd3-579a-44fb-8723-104e3be1c936/6a780cd3-579a-44fb-8723-104e3be1c936.jsonl": { + "mtimeMs": 1777826388114, + "mtimeSec": 1777826388 + }, + "/Users/erikassiscardoso/.cursor/projects/Users-erikassiscardoso-Local-Sites-velora/agent-transcripts/70831a21-356c-4321-aab2-c64a327f61b0/70831a21-356c-4321-aab2-c64a327f61b0.jsonl": { + "mtimeMs": 1787600611440, + "mtimeSec": 1787600611 + }, + "/Users/erikassiscardoso/.cursor/projects/Users-erikassiscardoso-Local-Sites-velora/agent-transcripts/70831a21-356c-4321-aab2-c64a327f61b0/subagents/4392098b-6f8c-46d5-8890-ba2c6014af90.jsonl": { + "mtimeMs": 1787600620087, + "mtimeSec": 1787600620 + }, + "/Users/erikassiscardoso/.cursor/projects/Users-erikassiscardoso-Local-Sites-velora/agent-transcripts/70831a21-356c-4321-aab2-c64a327f61b0/subagents/43e4de2c-1f21-4226-92bf-d7a8a53125ed.jsonl": { + "mtimeMs": 1787582184721, + "mtimeSec": 1787582184 + }, + "/Users/erikassiscardoso/.cursor/projects/Users-erikassiscardoso-Local-Sites-velora/agent-transcripts/70831a21-356c-4321-aab2-c64a327f61b0/subagents/cd35309d-843b-4b29-b69d-cd2ac29eee1e.jsonl": { + "mtimeMs": 1787572666994, + "mtimeSec": 1787572666 + }, + "/Users/erikassiscardoso/.cursor/projects/Users-erikassiscardoso-Local-Sites-velora/agent-transcripts/9dbf47df-d1ff-4804-94ec-bcd6cc7a408f/9dbf47df-d1ff-4804-94ec-bcd6cc7a408f.jsonl": { + "mtimeMs": 1778167194799, + "mtimeSec": 1778167194 + }, + "/Users/erikassiscardoso/.cursor/projects/Users-erikassiscardoso-Local-Sites-velora/agent-transcripts/e4897ba2-a6c9-4962-a6eb-182c160d18da/e4897ba2-a6c9-4962-a6eb-182c160d18da.jsonl": { + "mtimeMs": 1787316784737, + "mtimeSec": 1787316784 + }, + "/Users/erikassiscardoso/.cursor/projects/Users-erikassiscardoso-Local-Sites-velora/agent-transcripts/ed1cd72f-1fd4-49a1-92ef-18325437cf3e/ed1cd72f-1fd4-49a1-92ef-18325437cf3e.jsonl": { + "mtimeMs": 1777753610368, + "mtimeSec": 1777753610 + }, + "/Users/erikassiscardoso/.cursor/projects/Users-erikassiscardoso-Local-Sites-velora/agent-transcripts/f903c4dc-dba1-4bb0-bbc0-2916acc9cfb3/f903c4dc-dba1-4bb0-bbc0-2916acc9cfb3.jsonl": { + "mtimeMs": 1777633041954, + "mtimeSec": 1777633041 + } + } +} diff --git a/.cursor/hooks/state/continual-learning.json b/.cursor/hooks/state/continual-learning.json new file mode 100644 index 0000000..b53db30 --- /dev/null +++ b/.cursor/hooks/state/continual-learning.json @@ -0,0 +1,8 @@ +{ + "version": 1, + "lastRunAtMs": 1787600605625, + "turnsSinceLastRun": 1, + "lastTranscriptMtimeMs": 1787600605478.6738, + "lastProcessedGenerationId": "0851e63a-0490-413f-8bf7-d36a295dfdfc", + "trialStartedAtMs": null +} diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..20adbb5 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,25 @@ +## 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. +- 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. +- 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. +- 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. +- 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. + +## 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). +- 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). +- 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. diff --git a/CHANGELOG.md b/CHANGELOG.md index 8f806d6..62c9273 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Changed +- Public Showcase reduced to six routes (Home, Timeline, Skins, Catalog, Hosts, Archive). Pre-lean pages snapshotted in `archive/showcase-2026-08/` (not Vite/CI). +- **Skins** is the product name for named editorial models (`data-editorial-theme`). Home is didactic: engine vs Skins. +- Motion Catalog: `#pin` teaching replaced by `#scene-engine` (numeric pin + stage/acts live demo); Engine vs Skins lanes; DX toolbar framed as optional CSS-only helper. +- Catalog Phase C (P1): channel-first cards for CONTRACT `vl-enter` / `vl-scroll` / `vl-hover` extensions; scene-engine overlap + auto-clock demos. +- Catalog DX runtime: toolbar covers full CONTRACT attr set, scene-engine targets, CSS var duration/speed, stagger-aware replay. + --- ## [1.0.0] — 2025-01-01 diff --git a/README.md b/README.md index 420e9ce..93504ae 100644 --- a/README.md +++ b/README.md @@ -4,9 +4,9 @@ ![License: ISC](https://img.shields.io/badge/license-ISC-blue.svg) -Velora is a CSS-first design system for building premium, cinematic web interfaces using nothing but modern browser APIs. No JavaScript frameworks. No runtime animation libraries. Just HTML and CSS that move. +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. -Built for developers and agencies who want production-ready motion without the weight. +The cinematic **Showcase** is the optional Velora design-system skin — not a requirement to turn motion on. ## Features @@ -32,26 +32,28 @@ pnpm add @velora/css ### 2. Import +Host-agnostic (any UI — Tailwind, etc.): + ```css -@import "@velora/css"; +@import "@velora/css/motion-core"; +@import "@velora/css/transitions"; /* optional */ ``` -Or consume only the bundles you need: +Full Velora look (theme + components + motion): ```css -@import "@velora/css/base"; -@import "@velora/css/motion-core"; -@import "@velora/css/components-core"; -@import "@velora/css/transitions"; +@import "@velora/css"; ``` ### 3. Use ```html -
-

Zero-JS motion

-

Pure CSS. Pure performance.

-
+
+
+

Zero-JS motion

+

Same attributes on Tailwind or Velora UI.

+
+
``` That's it. No build config. No framework bindings. Works with any stack. @@ -71,18 +73,19 @@ It includes: ## Modular Entry Points -Velora now ships stable modular entry points in addition to the full bundle: - -- `@velora/css` or `@velora/css/full` — full framework bundle (default) -- `@velora/css/base` — reset, tokens, layout, utilities -- `@velora/css/motion-core` — core declarative motion grammar -- `@velora/css/motion-extended` — extended motion effects -- `@velora/css/components-core` — components, forms, dialogs, structures +- `@velora/css` or `@velora/css/full` — convenience bundle (theme + components + motion) +- `@velora/css/motion-core` — host-agnostic motion grammar + scene engine +- `@velora/css/motion-extended` — extra effect presets +- `@velora/css/theme` — visual tokens + editorial + scene look recipes +- `@velora/css/base` — reset, motion tokens, structural layout, utilities +- `@velora/css/components-core` — optional UI primitives - `@velora/css/transitions` — view transition presets - `@velora/css/premium` — premium components - `@velora/css/overrides` — last-mile override layer -All bundles keep the same `@layer` contract to avoid cascade drift between pages. +Proofs: `examples/tailwind-host/` (motion-core + Tailwind) · `apps/showcase` (six-page reference UI: Home, Timeline, Skins, Catalog, Hosts, Archive). Older Showcase pages: `archive/showcase-2026-08/`. + +**Skins** are named design-system models (`html[data-editorial-theme]`). They are optional; motion works without them. ## Motion Channels (v2) diff --git a/apps/docs/src/layouts/Base.astro b/apps/docs/src/layouts/Base.astro index 56e1b3d..47f17f5 100644 --- a/apps/docs/src/layouts/Base.astro +++ b/apps/docs/src/layouts/Base.astro @@ -417,24 +417,17 @@ function isActive(href: string): boolean {
diff --git a/apps/docs/src/pages/hosts.astro b/apps/docs/src/pages/hosts.astro new file mode 100644 index 0000000..20d0125 --- /dev/null +++ b/apps/docs/src/pages/hosts.astro @@ -0,0 +1,43 @@ +--- +import Base from "../layouts/Base.astro"; +--- + + + Interoperability + +

Hosts (Tailwind & others)

+

+ Velora is a motion engine. Your host owns layout and visual styling. +

+ +

Minimal import

+
@import "@velora/css/motion-core";
+/* optional page transitions */
+@import "@velora/css/transitions";
+ +

Do not require @velora/css/theme or component classes for scenes to work.

+ +

Tailwind example

+
<section vl-scene vl-timeline="view" vl-pin="3" vl-scrub>
+  <div vl-stage class="min-h-svh grid place-items-center gap-6 px-6">
+    <p class="text-sm uppercase tracking-widest" vl-enter="fade-up" vl-act="1">Kicker</p>
+    <h1 class="text-5xl font-semibold" vl-enter="clip-rise" vl-act="1">Title</h1>
+    <img class="w-full max-w-3xl rounded-2xl" vl-scroll="media-zoom" vl-act="2" vl-span="2" alt="" />
+  </div>
+</section>
+ +

+ Repo proof: examples/tailwind-host/. Showcase proves the Velora cinematic UI; + examples prove the host-agnostic path. +

+ +

Layers

+

+ Velora uses @layer velora.*. Keep host utilities outside or after those layers so + Tailwind wins on appearance while vl-* attributes still drive animation. +

+ +

Optional skin

+
@import "@velora/css/motion-core";
+@import "@velora/css/theme"; /* brand tokens + scene recipes */
+ diff --git a/apps/docs/src/pages/index.astro b/apps/docs/src/pages/index.astro index 5059dd9..661a47a 100644 --- a/apps/docs/src/pages/index.astro +++ b/apps/docs/src/pages/index.astro @@ -2,12 +2,16 @@ import Base from "../layouts/Base.astro"; --- - + Documentation

Getting Started

- A motion-native design system. Declarative HTML attributes. Zero JavaScript for animation. Modern CSS only. + A declarative motion language for HTML. Attributes describe intent; CSS executes it. + Works with Tailwind, Relume, or any UI. Showcase is the optional Velora look + (Skins — named models via data-editorial-theme). + The public Showcase is six pages; the previous demos live in + archive/showcase-2026-08/.

Installation

@@ -16,133 +20,53 @@ import Base from "../layouts/Base.astro"; # or npm install @velora/css -

Then import it once at the root of your app:

-
@import "@velora/css";
- -

Or in a bundler entrypoint:

-
import "@velora/css";
- -

Quick Start

-

Add motion to any element with two attributes:

-
<!-- Fade up when scrolled into view -->
-<div vl-effect="fade-up" vl-timeline="view">
-  Reveals on scroll
-</div>
-
-<!-- Staggered children entrance -->
-<section vl-children="stagger" vl-stagger="100ms">
-  <div>Child 1</div>
-  <div>Child 2</div>
-  <div>Child 3</div>
-</section>
-
-<!-- Full scene orchestration -->
-<section
-  vl-scene="hero"
-  vl-effect="scene-hero-reveal"
-  vl-timeline="view"
-  vl-range="entry 0% cover 70%"
-  vl-pin>
-  <h1>Heading fades up</h1>
-  <img src="hero.jpg" alt="" />
-  <p>Copy blurs in</p>
-  <a href="#" class="vl-cta">Get started</a>
-</section>
- -

Page Transitions

-

Enable MPA cross-document view transitions with one attribute:

-
<!-- In your root layout -->
-<html vl-page-transition="cinema">
-

- Requires @view-transition { navigation: auto; } in your CSS (already included with Velora). - Supported in Chrome 111+, Edge 111+. -

- -

Philosophy

-

- Velora is a declarative motion system for HTML — not a UI kit, not a JavaScript animation library. -

-

The core idea is a three-step contract:

-
    -
  1. Write semantic HTML
  2. -
  3. Add vl-* attributes to declare intent
  4. -
  5. Velora maps those to CSS-based motion, layout, and transitions
  6. -
-

- The framework proves that modern HTML and CSS are sufficient to build premium motion systems when the - architecture is designed correctly. -

- -

CSS Layer Stack

-

Velora organizes CSS into 8 cascade layers, making it safe to override at any point:

-
@layer velora.reset,
-       velora.tokens,
-       velora.layout,
-       velora.motion,
-       velora.components,
-       velora.transitions,
-       velora.utilities,
-       velora.overrides;
- +

Choose an import

- - - - + - - - - - - - - + + + + + + + + + + + +
LayerContents
ImportUse when
velora.resetBrowser normalization and base adjustments
velora.tokensColors, spacing, typography, motion tokens
velora.layoutContainer, stack, grid, and scene wrappers
velora.motionEffect presets, timelines, stagger, reveals
velora.componentsCards, buttons, navbars, accordions, badges
velora.transitionsPage transitions and shared element rules
velora.utilitiesLow-level opt-in utility classes
velora.overridesLast-mile overrides; highest specificity
@velora/css/motion-coreHost UI already provides look (Tailwind, custom DS). Motion + scene engine only.
@velora/css/themeOptional Velora visual tokens + named scene recipes.
@velora/css / fullConvenience: theme + components + motion (Showcase / docs style).
-

Accessibility

+
/* Host-agnostic (recommended for Tailwind projects) */
+@import "@velora/css/motion-core";
+@import "@velora/css/transitions"; /* optional */
+
+/* Or full Velora skin */
+@import "@velora/css";
+ +

Quick Start — scene engine

+

Track + stage + acts: one shared clock, pin, scrub — no JavaScript.

+
<section vl-scene vl-timeline="view" vl-pin="3" vl-scrub>
+  <div vl-stage>
+    <p vl-enter="fade-up" vl-act="1">Kicker</p>
+    <h1 vl-enter="clip-rise" vl-act="1">Title</h1>
+    <img vl-scroll="media-zoom" vl-act="2" vl-span="2" alt="" />
+  </div>
+</section>
+

- All Velora motion is prefers-reduced-motion aware. Users who have requested reduced motion - see instant transitions with no animation. + Style with your own classes. Motion does not require .vl-card or brand tokens. + See Hosts (Tailwind) and Scenes.

-
/* Built into every Velora effect */
-@media (prefers-reduced-motion: reduce) {
-  [vl-effect],
-  [vl-scene],
-  [vl-page-transition] {
-    animation: none !important;
-    transition-duration: 0ms !important;
-  }
-}
-

Explore the Docs

-
- -
Design Tokens
-

CSS custom properties for color, typography, spacing, and motion.

-
- -
Motion Effects
-

All vl-effect values — entrance, interaction, continuous, text, cinema.

-
- -
Scenes
-

Multi-element orchestrations with vl-scene and vl-children.

-
- -
Page Transitions
-

MPA view transitions with shared element morphing.

-
- -
Attribute Reference
-

Complete reference for every vl-* attribute.

-
- -
Agent Handbook
-

Rules, patterns, and safe prompts for AI coding agents.

-
-
+

What Velora is

+ diff --git a/apps/docs/src/pages/motion-conditions.astro b/apps/docs/src/pages/motion-conditions.astro new file mode 100644 index 0000000..2173c80 --- /dev/null +++ b/apps/docs/src/pages/motion-conditions.astro @@ -0,0 +1,149 @@ +--- +import Base from "../layouts/Base.astro"; +--- + + + Motion + +

Conditional Motion Engine

+

+ 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. +

+ +

The Modes

+

+ Add vl-motion to any element. Descendant vl-effect / vl-enter + reveals inherit the mode automatically. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
ValueIntentEngine effect
standardBalanced default feelNeutral scale (1×), cinematic easing
subtleQuiet, fast, short travelFaster duration, reduced travel & depth, soft easing
cinematicGrand, slow, deep, blurred entrancesSlower duration, larger travel & depth, entrance blur
stillAuthor-driven reduced motionResting/composed state, no movement (independent of OS setting)
+ +
<!-- One attribute governs the whole subtree -->
+<section vl-motion="cinematic">
+  <h2 vl-enter="reveal-cinematic" vl-timeline="view">Grand & deep</h2>
+  <p vl-effect="fade-up" vl-timeline="view">Slower, deeper, blurred entrance.</p>
+</section>
+
+<section vl-motion="subtle">...quieter, faster motion...</section>
+<section vl-motion="still">...reduced-motion-safe resting state...</section>
+ +

Engine Tokens

+

+ Modes work by assigning central --vl-* knobs (declared in 01-tokens.css). + Presets consume these instead of hardcoding per-selector values, which keeps adaptation in one place. +

+ + + + + + + + + + + + + +
TokenRoleNeutral default
--vl-motion-modeActive mode (queried by if(style()))standard
--vl-motion-speed-scaleDuration multiplier1
--vl-motion-intensityTravel-distance multiplier1
--vl-motion-depthParallax / z-depth multiplier1
--vl-motion-blurAdditive entrance blur0px
--vl-motion-preferenceReflects reduced-motion intentauto
--vl-motion-mode-easeEasing selected by the mode--vl-ease-cinematic
+

+ Because the defaults are neutral (scale 1, offset 0), motion behaves exactly + as before when no vl-motion mode is present. Explicit per-element modifiers such as + vl-speed and vl-depth still win over the mode. +

+ +

Progressive Enhancement with CSS if()

+

+ The engine is CSS-first progressive enhancement. There are two layers: +

+ +
@supports (width: if(style(--vl-probe: 1): 1px; else: 2px)) {
+  [vl-motion] {
+    --vl-motion-intensity: if(
+      media(prefers-reduced-motion: reduce): 0;
+      style(--vl-motion-mode: cinematic): if(media(pointer: coarse): 1.2; else: 1.6);
+      style(--vl-motion-mode: subtle): 0.45;
+      else: 1
+    );
+    --vl-motion-depth: if(
+      supports(animation-timeline: view()): 1.8;   /* only where scroll timelines exist */
+      else: 0
+    );
+  }
+}
+ +

Fallback for browsers without if()

+

+ If a browser does not support CSS if(), the entire @supports block is + ignored and the baseline [vl-motion="…"] values remain in effect. Modes still work — + they simply do not receive the extra live pointer/support-aware refinements. Nothing breaks, and no + JavaScript fallback is introduced. +

+ +

Accessibility

+

+ Reduced motion is always respected: +

+ + +

Browser Support

+

+ The vl-motion modes themselves work in all modern browsers. The if()-based + refinement requires a browser with CSS if() support; everywhere else the baseline modes + are used. See the live comparison on the + Zero-JS Motion showcase page. +

+ diff --git a/apps/docs/src/pages/scenes.astro b/apps/docs/src/pages/scenes.astro index 1ac1d7f..7f1bfca 100644 --- a/apps/docs/src/pages/scenes.astro +++ b/apps/docs/src/pages/scenes.astro @@ -2,253 +2,57 @@ import Base from "../layouts/Base.astro"; --- - + Orchestration

Scenes

- Scenes coordinate the motion of an element and all its descendants as a single - choreographed unit. This is the difference between a primitive effect and a scene. + A scene is a shared clock for children — not a look. Layout and chrome come from the host UI + (or optional Velora theme recipes).

-

Primitive vs Scene

-

- A primitive effect animates one element: -

-
<div vl-effect="fade-up" vl-timeline="view">
-  Just this element fades up
-</div>
-

- A scene preset coordinates the element and its children with distinct timings - per child slot: -

-
<section
-  vl-scene="hero"
-  vl-effect="scene-hero-reveal"
-  vl-timeline="view">
-  <h1>1st child — fades up (slowest)</h1>
-  <img src="hero.jpg" alt="" />  <!-- 2nd child — scales in after 120ms -->
-  <p>3rd child — blurs in after 240ms</p>
-  <a href="#" class="vl-cta">4th+ children — staggered fade</a>
-</section>
- -

The vl-scene Attribute

-

- Add vl-scene to a container to mark it as a scene host. This applies CSS containment - (contain: layout style) so the scene is self-contained. -

-
<section vl-scene="hero">...</section>
-<section vl-scene="story">...</section>
-<section vl-scene="features">...</section>
-

- The value is a semantic label — it doesn't change behavior today but documents intent and allows - future CSS hooks via [vl-scene="hero"] selectors. -

- -

Scene Presets

-

- Scene presets are set via vl-effect on the scene host. They define child-specific - animation sequences: -

- - - - - - - - - - - - - - - - - - - - - - -
ValueChildren behavior
scene-hero-reveal - 1st → fade-up (800ms, cinematic)
- 2nd → scale-in (800ms, spring, 120ms delay)
- 3rd → blur-in (800ms, soft, 240ms delay)
- 4th+ → fade-up (staggered) -
scene-feature-flow - Each child gets a flow-in animation tied to view(block) scroll timeline, - with cascading animation ranges (1st enters earliest, later children enter progressively later). - Requires vl-timeline="view". -
scene-story-pin - Container becomes sticky (position: sticky; min-height: 100vh). Children use - fade-up tied to the block scroll timeline. -
scene-layer-stack - Container gets perspective: 1200px. Children use 3d-entry with - increasing translation depth per child (1rem → 4rem). -
- -

Hero Reveal — Full Example

-
<section
-  vl-scene="hero"
-  vl-effect="scene-hero-reveal"
-  vl-timeline="view"
-  vl-range="entry 0% cover 70%"
-  vl-pin>
-
-  <h1 class="vl-vt-shared-hero">
-    Build motion-rich interfaces
-  </h1>
-
-  <img
-    src="/hero.jpg"
-    alt="Motion design system preview"
-    class="vl-vt-shared-media"
-    width="1200"
-    height="675"
-  />
-
-  <p>
-    Velora proves that HTML and CSS are enough to build premium motion.
-  </p>
-
-  <a href="/docs" class="vl-cta" vl-effect="icon-shift">
-    Get started
-    <svg aria-hidden="true" width="16" height="16">...</svg>
-  </a>
-</section>
- -

Feature Flow — Full Example

-
<section
-  vl-scene="features"
-  vl-effect="scene-feature-flow"
-  vl-timeline="view">
-
-  <!-- Each direct child flows in with cascading scroll-driven ranges -->
-  <div class="vl-card">
-    <div class="vl-card__title">Feature One</div>
-    <p class="vl-card__body">Description</p>
+  

Track + stage + acts

+
<section vl-scene vl-timeline="view" vl-pin="3" vl-scrub>
+  <div vl-stage>
+    <p vl-enter="fade-up" vl-act="1">Kicker</p>
+    <h1 vl-enter="clip-rise" vl-act="1">Title</h1>
+    <img vl-scroll="media-zoom" vl-act="2" vl-span="2" alt="" />
+    <a vl-enter="fade-up" vl-act="5">CTA</a>
   </div>
-  <div class="vl-card">...</div>
-  <div class="vl-card">...</div>
-  <div class="vl-card">...</div>
 </section>
-

Story Pin — Full Example

-
<!-- Wrap in a tall outer container to create scroll space -->
-<div style="height: 300vh;">
-  <section
-    vl-scene="story"
-    vl-effect="scene-story-pin">
-    <h2>Chapter One</h2>
-    <p>This section stays fixed while you scroll.</p>
-  </section>
-</div>
- -

Child Choreography — vl-children

-

- For custom compositions that don't use a named scene preset, use vl-children to - choreograph direct children: -

- + - - - - - - - - - - - - - - - + + + + + + + +
ValueEffect on childrenEasing
AttributeRole
staggerfade-up with incremental delays (n × stagger-step)--vl-ease-cinematic
cascadeflow-in (blur + translate + scale) with incremental delays--vl-ease-out-soft
sequencefade-up with delays based on full animation duration (one-after-another)--vl-ease-cinematic
vl-sceneTrack — owns --vl-scene view-timeline and optional pin height
vl-stageSticky viewport stage (required for pin+scrub)
vl-timelineview (scroll film) or auto (time film)
vl-pinTrack height in viewport multiples (e.g. 3)
vl-scrubLinear fill — progress glued to scroll
vl-actBeat index (same act = overlap / GSAP <)
vl-spanHow many beats the tween spans
vl-rangeEscape hatch — overrides act-derived ranges
-

Supports up to 12 children for stagger and cascade, 6 for sequence.

-
<!-- Staggered grid of cards -->
-<div
-  vl-children="stagger"
-  vl-stagger="80ms"
-  vl-timeline="view"
-  style="display: grid; grid-template-columns: repeat(3, 1fr); gap: 1rem;">
-  <div class="vl-card">Card 1</div>
-  <div class="vl-card">Card 2</div>
-  <div class="vl-card">Card 3</div>
-</div>
-
-<!-- Sequential one-after-another reveal -->
-<ol vl-children="sequence" vl-timeline="view">
-  <li>Step 1 — plays first</li>
-  <li>Step 2 — plays after step 1 finishes</li>
-  <li>Step 3 — plays after step 2 finishes</li>
-</ol>
- -

Stagger Interval — vl-stagger

+

Why track ≠ stage

- Override the default --vl-stagger-step (45ms) with one of the preset values: + A sticky element freezes its own anonymous view() progress. Children bind to the + named track timeline (--vl-scene) while the stage stays pinned.

- - - - - - - - - - - - -
ValueDelay per childFeel
60ms60msQuick, snappy
80ms80msBalanced
100ms100msComfortable
120ms120msSlightly cinematic
150ms150msDeliberate pacing
200ms200msDramatic, slow cascade
-
<div vl-children="stagger" vl-stagger="120ms">
-  <div>Plays at 0ms</div>
-  <div>Plays at 120ms</div>
-  <div>Plays at 240ms</div>
-  <div>Plays at 360ms</div>
-</div>
- -

Live Demo

-
-
-
Child 1
-

Fades up immediately.

-
-
-
Child 2
-

100ms after child 1.

-
-
-
Child 3
-

200ms after child 1.

-
-
-

Accessibility

+

Named presets (skin recipes)

- Scene presets and vl-children choreography all disable under - prefers-reduced-motion: reduce — children appear in their final state instantly. - Semantic structure (heading hierarchy, landmark roles) should be maintained regardless of motion. + Values like vl-scene="cinematic-hero" remain for compatibility. They ship in + scene-recipes.css via @velora/css/theme / full — they mix look + motion. + Prefer track/stage/acts for portable hosts.

-

Browser Support

+

Channels on children

- scene-hero-reveal, scene-layer-stack, and vl-children - orchestrations use time-based delays and work in all modern browsers. - scene-feature-flow and scene-story-pin use scroll-driven timelines and - require Chrome 115+ / Edge 115+. Unsupported browsers see a static layout. + Use existing channels on stage children: vl-enter, vl-scroll, + vl-exit, etc. The scene clock drives when they play.

diff --git a/apps/docs/src/pages/timelines.astro b/apps/docs/src/pages/timelines.astro index 7973c1d..c789373 100644 --- a/apps/docs/src/pages/timelines.astro +++ b/apps/docs/src/pages/timelines.astro @@ -2,67 +2,49 @@ import Base from "../layouts/Base.astro"; --- - - Motion + + Progress model

Timelines

-

- Control when and how animations progress via vl-timeline. - See also: Attribute Reference → vl-timeline. +

+ Timelines decide what drives progress. Effects decide what moves. + The scene engine shares one clock across stage children.

-

Timeline Modes

+

vl-timeline values

- - - - + - - - - + + + +
ValueBehavior
ValueBehavior
viewScroll-driven via view(block) — element's viewport entry controls progress
scrollScroll-driven via scroll(root) — page scroll position controls progress
autoStandard time-based (document timeline)
hoverAnimation paused until hover
viewProgress from element / scene visibility (view() or named --vl-scene)
scrollProgress from root scroll
autoTime-based CSS animation
hoverPaused until hover
-

Range Presets

-

Pair vl-timeline="view" with vl-range to control the animation window:

- - - - - - - - - - - - - - - -
ValueRange
entryentry 0% entry 100%
entry-shortentry 15% cover 35%
entry-longentry 0% cover 70%
covercover 0% cover 100%
containcontain 0% contain 100%
customUses --vl-range custom property
+

Scene clock

+

+ On [vl-scene][vl-timeline="view"], stage children use + animation-timeline: --vl-scene and ranges derived from + vl-act / vl-span / --vl-beats (default 8). +

+

+ With vl-timeline="auto", the same acts map to + animation-delay: (act - 1) * --vl-beat. Pin/scrub are no-ops. +

-

Boolean Modifiers

- - - - - - - - - - - - -
AttributeBehavior
vl-pinSticky positioning for scroll-driven scenes
vl-scrubContinuous linked motion (linear timing)
vl-oncePlay animation only once (forwards fill)
+

Ranges

+

+ Presets via vl-range (entry, entry-short, cover, …) + still apply to standalone elements. Inside a pinned scene, prefer acts; use + vl-range only as an escape hatch. +

-

Example

-
<div vl-effect="fade-up" vl-timeline="view" vl-range="entry-short" vl-once>
-  Appears quickly as it enters the viewport, then stays visible.
-</div>
+

Scrub

+
<section vl-scene vl-timeline="view" vl-pin="3" vl-scrub>
+  …
+</section>
+

vl-scrub forces linear timing and fill both on scene-driven children.

diff --git a/apps/showcase/config/template-registry.mjs b/apps/showcase/config/template-registry.mjs index 19412d1..dc90bf4 100644 --- a/apps/showcase/config/template-registry.mjs +++ b/apps/showcase/config/template-registry.mjs @@ -1,4 +1,3 @@ -import fs from "node:fs"; import path from "node:path"; import { fileURLToPath } from "node:url"; @@ -10,68 +9,16 @@ export const DEFAULT_TEMPLATE_NAME = "default"; export const TEMPLATE_REGISTRY = { [DEFAULT_TEMPLATE_NAME]: { name: "Velora Default Template", - description: "Baseline multi-page template for Velora showcase surfaces.", + description: "Lean public Showcase: Home, Timeline, Skins, Catalog, Hosts, Archive.", rootFile: "index.html", sections: { - core: [ + live: [ "index.html", - "pages/core/about.html", - "pages/core/landing.html", - ], - demo: [ - "pages/demo/impossible.html", - ], - scenes: [ - "pages/scenes/scene-hero.html", - "pages/scenes/scene-features.html", - "pages/scenes/scene-story.html", - "pages/scenes/scene-creator.html", - "pages/scenes/scroll-reveal.html", - ], - components: [ - "pages/components/buttons.html", - "pages/components/forms.html", - "pages/components/component-lab.html", - "pages/components/component-wizard.html", - "pages/components/icons.html", - ], - motion: [ - "pages/motion/zero-js-motion.html", - "pages/motion/motion-extended.html", - "pages/motion/motion-compiler-demo.html", - "pages/motion/motion-principles.html", - "pages/motion/kinetic-motion.html", - "pages/motion/kinetic-cards.html", - "pages/motion/scale-shift.html", - "pages/motion/interactions.html", + "pages/scenes/scene-timeline.html", + "pages/core/skins.html", "pages/motion/api-motion-catalog.html", - "pages/motion/3d-explorer.html", - "pages/motion/3d-rotation.html", - ], - color: [ - "pages/color/design-tokens.html", - "pages/color/color-system.html", - "pages/color/color-palette.html", - "pages/color/tonal-stacking.html", - "pages/color/tonal-tiers.html", - "pages/color/token-spotlight.html", - "pages/color/ambient-shadows.html", - ], - typography: [ - "pages/typography/typography.html", - "pages/typography/typography-composition.html", - "pages/typography/typography-spec.html", - ], - tools: [ - "pages/tools/system-modules.html", - "pages/tools/architecture.html", - "pages/tools/brand-voice.html", - "pages/tools/accessibility.html", - "pages/tools/contrast-tool.html", - "pages/tools/converter.html", - ], - integrations: [ - "pages/integrations/gsap-anime.html", + "pages/core/hosts.html", + "pages/core/archive.html", ], }, }, @@ -94,15 +41,6 @@ export function resolveTemplateInputs(templateName = DEFAULT_TEMPLATE_NAME) { inputs[toRollupKey(relPath)] = path.resolve(APP_ROOT, relPath); } - const libraryDir = path.join(APP_ROOT, "pages", "library"); - if (fs.existsSync(libraryDir)) { - for (const fileName of fs.readdirSync(libraryDir)) { - if (!fileName.endsWith(".html")) continue; - const key = `lib-${fileName.replace(/\.html$/i, "").replace(/[^a-z0-9]+/gi, "-")}`; - inputs[key] = path.resolve(libraryDir, fileName); - } - } - return inputs; } diff --git a/apps/showcase/index.html b/apps/showcase/index.html index e7be810..d5cf3d2 100644 --- a/apps/showcase/index.html +++ b/apps/showcase/index.html @@ -5,9 +5,9 @@ - Velora CSS - Motion Design System for the Web + Velora — Motion engine + Skins @@ -74,13 +74,13 @@ - @@ -1059,50 +1080,15 @@

Choose the part of the sequence you want to - - - - diff --git a/apps/showcase/output/contract-checklist.md b/apps/showcase/output/contract-checklist.md index bedbf31..8352148 100644 --- a/apps/showcase/output/contract-checklist.md +++ b/apps/showcase/output/contract-checklist.md @@ -1,9 +1,11 @@ # Showcase Contract Checklist -- Pages scanned: **49** +- Pages scanned: **6** - Unknown vl-* attrs: **0** - Deprecated vl-* attrs: **0** - Broken #anchors: **0** +- Home anchor motion violations: **0** +- Home scene frame motion violations: **0** ## Per-page status @@ -11,244 +13,41 @@ - Unknown vl-* attrs: none - Deprecated vl-* attrs: none - Broken #anchors: none +- Home anchor motion: none +- Home scene frame motion: none -### OK - `pages/color/ambient-shadows.html` +### OK - `pages/core/archive.html` - Unknown vl-* attrs: none - Deprecated vl-* attrs: none - Broken #anchors: none +- Home anchor motion: none +- Home scene frame motion: none -### OK - `pages/color/color-palette.html` +### OK - `pages/core/hosts.html` - Unknown vl-* attrs: none - Deprecated vl-* attrs: none - Broken #anchors: none +- Home anchor motion: none +- Home scene frame motion: none -### OK - `pages/color/color-system.html` -- Unknown vl-* attrs: none -- Deprecated vl-* attrs: none -- Broken #anchors: none - -### OK - `pages/color/design-tokens.html` -- Unknown vl-* attrs: none -- Deprecated vl-* attrs: none -- Broken #anchors: none - -### OK - `pages/color/token-spotlight.html` -- Unknown vl-* attrs: none -- Deprecated vl-* attrs: none -- Broken #anchors: none - -### OK - `pages/color/tonal-stacking.html` -- Unknown vl-* attrs: none -- Deprecated vl-* attrs: none -- Broken #anchors: none - -### OK - `pages/color/tonal-tiers.html` -- Unknown vl-* attrs: none -- Deprecated vl-* attrs: none -- Broken #anchors: none - -### OK - `pages/components/api-design-catalog.html` -- Unknown vl-* attrs: none -- Deprecated vl-* attrs: none -- Broken #anchors: none - -### OK - `pages/components/buttons.html` -- Unknown vl-* attrs: none -- Deprecated vl-* attrs: none -- Broken #anchors: none - -### OK - `pages/components/component-lab.html` -- Unknown vl-* attrs: none -- Deprecated vl-* attrs: none -- Broken #anchors: none - -### OK - `pages/components/component-wizard.html` -- Unknown vl-* attrs: none -- Deprecated vl-* attrs: none -- Broken #anchors: none - -### OK - `pages/components/design-playground.html` -- Unknown vl-* attrs: none -- Deprecated vl-* attrs: none -- Broken #anchors: none - -### OK - `pages/components/forms.html` -- Unknown vl-* attrs: none -- Deprecated vl-* attrs: none -- Broken #anchors: none - -### OK - `pages/components/icons.html` -- Unknown vl-* attrs: none -- Deprecated vl-* attrs: none -- Broken #anchors: none - -### OK - `pages/core/about.html` -- Unknown vl-* attrs: none -- Deprecated vl-* attrs: none -- Broken #anchors: none - -### OK - `pages/core/landing.html` -- Unknown vl-* attrs: none -- Deprecated vl-* attrs: none -- Broken #anchors: none - -### OK - `pages/demo/impossible.html` -- Unknown vl-* attrs: none -- Deprecated vl-* attrs: none -- Broken #anchors: none - -### OK - `pages/integrations/gsap-anime.html` -- Unknown vl-* attrs: none -- Deprecated vl-* attrs: none -- Broken #anchors: none - -### OK - `pages/library/gallery.html` -- Unknown vl-* attrs: none -- Deprecated vl-* attrs: none -- Broken #anchors: none - -### OK - `pages/library/index.html` -- Unknown vl-* attrs: none -- Deprecated vl-* attrs: none -- Broken #anchors: none - -### OK - `pages/motion/3d-explorer.html` -- Unknown vl-* attrs: none -- Deprecated vl-* attrs: none -- Broken #anchors: none - -### OK - `pages/motion/3d-rotation.html` +### OK - `pages/core/skins.html` - Unknown vl-* attrs: none - Deprecated vl-* attrs: none - Broken #anchors: none +- Home anchor motion: none +- Home scene frame motion: none ### OK - `pages/motion/api-motion-catalog.html` - Unknown vl-* attrs: none - Deprecated vl-* attrs: none - Broken #anchors: none +- Home anchor motion: none +- Home scene frame motion: none -### OK - `pages/motion/interactions.html` -- Unknown vl-* attrs: none -- Deprecated vl-* attrs: none -- Broken #anchors: none - -### OK - `pages/motion/kinetic-cards.html` -- Unknown vl-* attrs: none -- Deprecated vl-* attrs: none -- Broken #anchors: none - -### OK - `pages/motion/kinetic-motion.html` -- Unknown vl-* attrs: none -- Deprecated vl-* attrs: none -- Broken #anchors: none - -### OK - `pages/motion/motion-compiler-demo.html` -- Unknown vl-* attrs: none -- Deprecated vl-* attrs: none -- Broken #anchors: none - -### OK - `pages/motion/motion-extended.html` -- Unknown vl-* attrs: none -- Deprecated vl-* attrs: none -- Broken #anchors: none - -### OK - `pages/motion/motion-playground.html` -- Unknown vl-* attrs: none -- Deprecated vl-* attrs: none -- Broken #anchors: none - -### OK - `pages/motion/motion-principles.html` -- Unknown vl-* attrs: none -- Deprecated vl-* attrs: none -- Broken #anchors: none - -### OK - `pages/motion/scale-shift.html` -- Unknown vl-* attrs: none -- Deprecated vl-* attrs: none -- Broken #anchors: none - -### OK - `pages/motion/scroll-driven-demos.html` -- Unknown vl-* attrs: none -- Deprecated vl-* attrs: none -- Broken #anchors: none - -### OK - `pages/motion/zero-js-motion.html` -- Unknown vl-* attrs: none -- Deprecated vl-* attrs: none -- Broken #anchors: none - -### OK - `pages/scenes/scene-creator.html` -- Unknown vl-* attrs: none -- Deprecated vl-* attrs: none -- Broken #anchors: none - -### OK - `pages/scenes/scene-features.html` -- Unknown vl-* attrs: none -- Deprecated vl-* attrs: none -- Broken #anchors: none - -### OK - `pages/scenes/scene-hero.html` -- Unknown vl-* attrs: none -- Deprecated vl-* attrs: none -- Broken #anchors: none - -### OK - `pages/scenes/scene-story.html` -- Unknown vl-* attrs: none -- Deprecated vl-* attrs: none -- Broken #anchors: none - -### OK - `pages/scenes/scroll-reveal.html` -- Unknown vl-* attrs: none -- Deprecated vl-* attrs: none -- Broken #anchors: none - -### OK - `pages/tools/accessibility.html` -- Unknown vl-* attrs: none -- Deprecated vl-* attrs: none -- Broken #anchors: none - -### OK - `pages/tools/architecture.html` -- Unknown vl-* attrs: none -- Deprecated vl-* attrs: none -- Broken #anchors: none - -### OK - `pages/tools/brand-voice.html` -- Unknown vl-* attrs: none -- Deprecated vl-* attrs: none -- Broken #anchors: none - -### OK - `pages/tools/contrast-tool.html` -- Unknown vl-* attrs: none -- Deprecated vl-* attrs: none -- Broken #anchors: none - -### OK - `pages/tools/converter.html` -- Unknown vl-* attrs: none -- Deprecated vl-* attrs: none -- Broken #anchors: none - -### OK - `pages/tools/index.html` -- Unknown vl-* attrs: none -- Deprecated vl-* attrs: none -- Broken #anchors: none - -### OK - `pages/tools/system-modules.html` -- Unknown vl-* attrs: none -- Deprecated vl-* attrs: none -- Broken #anchors: none - -### OK - `pages/typography/typography-composition.html` -- Unknown vl-* attrs: none -- Deprecated vl-* attrs: none -- Broken #anchors: none - -### OK - `pages/typography/typography-spec.html` -- Unknown vl-* attrs: none -- Deprecated vl-* attrs: none -- Broken #anchors: none - -### OK - `pages/typography/typography.html` +### OK - `pages/scenes/scene-timeline.html` - Unknown vl-* attrs: none - Deprecated vl-* attrs: none - Broken #anchors: none +- Home anchor motion: none +- Home scene frame motion: none diff --git a/apps/showcase/pages/core/archive.html b/apps/showcase/pages/core/archive.html new file mode 100644 index 0000000..8da6000 --- /dev/null +++ b/apps/showcase/pages/core/archive.html @@ -0,0 +1,258 @@ + + + + + + Archive | Velora + + + + + + + + + + + + + + Skip to content + + +
+
+ + + + +
+ + +
+ + + +
+ + + + Get Started +
+ +
+ +
+
+
+
+
+

Archive // frozen Showcase

+

The previous ~50 pages are kept, not served.

+

+ Snapshot: archive/showcase-2026-08/ in the repo (outside Vite and verify:contract). + Restore a page by copying it into apps/showcase/pages/ and adding it to the template registry. +

+

Paths below are archive-relative. They are not live routes.

+
    +
  • index.html — cinematic home (pre-lean)
  • +
  • pages/scenes/scene-hero.html — hero scene recipe
  • +
  • pages/scenes/scene-story.html — pinned story
  • +
  • pages/scenes/scene-features.html — feature flow
  • +
  • pages/scenes/scene-creator.html — scene creator
  • +
  • pages/components/buttons.html — button kit
  • +
  • pages/components/forms.html — forms
  • +
  • pages/color/design-tokens.html — token reference
  • +
  • pages/typography/typography.html — type samples
  • +
  • pages/tools/architecture.html — architecture
  • +
  • pages/library/gallery.html — library gallery
  • +
  • pages/motion/3d-explorer.html — 3D explorer
  • +
  • Full list: archive/showcase-2026-08/MANIFEST.md
  • +
+
+
+
+
+ + + + + + + + diff --git a/apps/showcase/pages/core/hosts.html b/apps/showcase/pages/core/hosts.html new file mode 100644 index 0000000..5a74e50 --- /dev/null +++ b/apps/showcase/pages/core/hosts.html @@ -0,0 +1,252 @@ + + + + + + Hosts | Velora + + + + + + + + + + + + + + Skip to content + + +
+
+ + + + +
+ + +
+ + + +
+ + + + Get Started +
+ +
+ +
+
+
+
+
+

Hosts // motion without Skins

+

Same vl-*. Your UI.

+

+ Import @velora/css/motion-core (optional transitions). Style with Tailwind or any host. + Do not require .vl-card or Skins tokens for scenes to run. +

+ +

Repo example: examples/tailwind-host/ (serve from repo root). Vite Showcase does not mount that folder.

+
<section vl-scene vl-timeline="view" vl-pin="3" vl-scrub>
+  <div vl-stage class="min-h-svh grid place-items-center">
+    <h1 vl-enter="clip-rise" vl-act="1">Host classes + Velora clock</h1>
+  </div>
+</section>
+
+
+
+
+ + + + + + + + diff --git a/apps/showcase/pages/core/skins.html b/apps/showcase/pages/core/skins.html new file mode 100644 index 0000000..2937210 --- /dev/null +++ b/apps/showcase/pages/core/skins.html @@ -0,0 +1,274 @@ + + + + + + Skins | Velora + + + + + + + + + + + + + + Skip to content + + +
+
+ + + + +
+ + +
+ + + +
+ + + + Get Started +
+ +
+ +
+
+
+
+
+

Skins // named design-system models

+

One kit. Four models. Change the whole project.

+

+ Skins are the Velora visual system — not the motion grammar. + Set html[data-editorial-theme] (Noir, Earth, Aethel, Meridian) and + data-theme (dark / light). Tokens restyle header, type, cards, and controls together. +

+

Use the editorial select in the header. Import @velora/css/theme (or full). Motion does not require Skins — see Hosts.

+
+
+
+
+

Named models

+
+

noir

Noir

Dark kinetic base. Default Showcase skin.

+

earth

Earth

Warm light laboratory. Light theme pack.

+

aethel

Aethel

Architectural concepts. Dark geometry.

+

meridian

Meridian

Terrain intelligence. Cartographic dark.

+
+
+
+
+
+

Replicable kit

+

Same components; the skin retokens them.

+
+ Primary + Ghost + +
+
+

Look of a Skin

+

.vl-card is visual chrome — not a motion requirement.

+
+
<html data-editorial-theme="noir" data-theme="dark">
+@import "@velora/css/theme";
+
+
+
+
+ + + + + + + + diff --git a/apps/showcase/pages/motion/api-motion-catalog.html b/apps/showcase/pages/motion/api-motion-catalog.html index 0f93428..71b7de9 100644 --- a/apps/showcase/pages/motion/api-motion-catalog.html +++ b/apps/showcase/pages/motion/api-motion-catalog.html @@ -23,6 +23,7 @@ Stage 3D Interaction Scroll + Scene Transitions Runtime @@ -50,13 +51,13 @@ -