Format: Keep a Changelog · SemVer.
Six more shaders (51 → 57), taking Shaders & Light from 6 to 12. The set is now a materials library: every entry is a different optical family rather than another noise field.
refracted-glass— a thick bevelled slab. The view ray is refracted with a separate index per RGB channel (Cauchy-ordered, blue bent hardest), so the bevel carries genuine chromatic dispersion; a Schlick Fresnel term lifts the rim and a Beer–Lambert body tint darkens with depth.brushed-metal— anisotropic GGX with Smith-correlated shadowing over a brush-direction field: roughness stays low along the grain and is pushed hard across it, so the highlight stretches perpendicular to the brushing.pattern: "linear" | "radial"for engine-turned.moire-weave— two rigid lattices whose beat is the actual difference frequency. Every cosine is band-limited by an exact box filter (sinc(w),w = fwidth(φ)in cycles per pixel), so amplitude reaches zero at a two-pixel period and the pattern dissolves into its own mean instead of boiling.velvet-sheen— an Ashikhmin velvet lobe gated by an inverted Fresnel, so the cloth is brightest at grazing angles and dark facing the viewer. Drape comes from wandering the phase and amplitude of a gather train; adding noise to the height read as stone, not cloth.translucent-wax— light through a solid: the interior light path is marched to accumulate thickness, then attenuated by Beer–Lambert with wrapped diffuse and a forward-scatter lobe. The ground edge glows and the body goes deep, which is the cue that sells the translucency.diffraction-grating— the grating equation solved for wavelength per order (d·sinθ = mλ) rather than integrated over sampled wavelengths, which is what keeps the spectral lines continuous instead of beading. Blaze falloff dims higher orders andsharpnessacts as resolving power, so they wash toward white rather than simply fading.
Twenty new components (31 → 51) and a second primitive. The theme is surfaces you can touch: light on a material, the pointer itself, and the page as it scrolls.
useShader()primitive — a raw WebGL2 runtime for full-screen fragment shaders in ~290 lines and still zero runtime dependencies (noogl, nothree). Draws a single full-screen triangle fromgl_VertexID(no buffers to allocate or leak) and owns the whole lifecycle: DPR-clamped sizing viaResizeObserver, anIntersectionObserverthat suspends the loop off-screen, pause on tab blur, context-loss recovery, eased pointer input, uniform declarations generated from the values you pass, and a single still frame for reduced-motion users. Reportssupported: falsewhen WebGL2 is missing so components fall back to CSS instead of a blank box.- Shaders & Light (6) —
liquid-metal(domain-warped FBM height field, normals from finite differences, swept polish bands),thin-film(two-beam interference evaluated at three wavelengths — real fringe order, not a hue rotation),caustics(folded coordinates accumulating reciprocal distance),halftone-gradient(angled per-channel dot screens with √-corrected dot area, or a computed 4×4 Bayer matrix),volumetric-rays(radial scattering integral with decay normalised by sample count),curl-flow(FBM as a stream function; the velocity is the perpendicular of its gradient, so the field is divergence-free by construction). - Cursor & Pointer (5) —
inertia-cursor,elastic-cursor(stretches along its velocity vector with conserved area),image-trail(distance-thresholded emission, so spacing is even at any speed),pixel-trail(sub-cell path walking, so a fast flick still lights a continuous line),crosshair(point-to-rectangle snapping with a live coordinate readout). - Scroll-Driven (4) —
scroll-stack,scroll-velocity,parallax-layers,scroll-scene(pins a section and exposes scrub progress via render prop, a CSS custom property, and a per-frame callback). - Components (5) —
card-swap,gooey-nav,bento-grid(one pointer listener for the whole grid, published to tiles as inherited custom properties),elastic-slider(exponentially damped overshoot, fullrole="slider"keyboard contract),circular-gallery(drag converted through arc length, so tracking is 1:1 at any radius).
BentoGridgains arowHeightprop; the row height was previously hardcoded at 140px, which made the component unusable in any frame shorter than two rows.- The reduced-motion test is now transitive: a component satisfies the contract either
directly or through a primitive that does, so the shaders inherit the guarantee from
useShaderrather than restating it. - The playground gives scroll-driven components a full-height section of their own — a 200px preview tile can't demonstrate something driven by the page scroller.
- The CLI's
listcommand iterated a hardcoded array of four categories, so components in any newer category were silently omitted from its output. Both the CLI and the MCP server now derive the category set from the registry. - The MCP integration test asserted a literal component count, which fails on every addition and
trains you to bump the number instead of reading the failure. Expected counts now come from
registry/meta.json.
A ground-up rebuild. ReactOmega is now an AI-native React component registry focused on motion & interaction UI, deliberately distinct from the cosmic, vanilla-JS GalaxyJS.
- Registry architecture (shadcn-compatible):
registry/meta.json+ component sources →registry.json+public/r/*.json+llms.txt, generated deterministically byscripts/build-registry.mjs(one source of truth — the CLI, shadcn, and MCP can't drift). - 31 components, all self-contained, Tailwind-styled, screen-reader aware, and
reduced-motion safe by contract:
- Text (10) — novel, deeply customizable kinetic typography:
split-text,shiny-text,gradient-text,count-up,variable-proximity(per-letter variable-font axes by pointer distance),magnetic-text(per-letter spring to pointer),gravity-text(real gravity fall + bounce + reassemble),elastic-text(jelly squash/stretch),scramble-text(configurable decode),text-reveal(scroll-linked word-by-word brightening) - Interaction (6):
magnetic,spotlight-card,tilt-card,holographic-card(iridescent foil + 3D tilt),click-spark,dot-grid - Components (3):
star-border,dock,marquee - Physics & Art (12) — real verlet/spring/field physics, a distinct lane from GalaxyJS:
spring-mesh,cloth,metaballs,rope,pendulum-wave,newtons-cradle,water-ripple,gravity-wells,magnetic-field,soft-body,plucked-string,falling-sand - Primitives:
cn()util +usePrefersReducedMotion()hook (added automatically as deps).
- Text (10) — novel, deeply customizable kinetic typography:
- Next.js playground (
web/) — every component rendered live, deployed to GitHub Pages (https://edwson.github.io/ReactOmega/) and as a static export for any static host. - ReactOmega CLI (
reactomega) —add/list, zero runtime dependencies, resolves a component plus its primitives and writes them into your project. - MCP server (
reactomega-mcp) —list_components,get_component,add_component, over a pureregistry-core.mjsengine; end-to-end tested via the SDK client. llms.txtfor AI agents;scripts/test-registry.mjs(dependency-free CI test that verifies sync, dependency resolution, and the reduced-motion contract).
- Identity reset from "cosmic React animation library" (which overlapped GalaxyJS) to
"AI-native motion & interaction registry." Root
package.jsonexposes thereactomegaandreactomega-mcpbins; CI runs syntax + esbuild + registry-drift + a live MCP test.