Signal Field
A pointer-responsive WebGL field with editable colour, motion and grain.
Install the component, then paste your configured usage. Your settings are included in the code below.
npx arclen-ui add signal-field --settings eyJpbnRlcmFjdGlvbiI6ImNsYXNzaWMiLCJhc2NpaVNpemUiOjE0LCJhc2NpaVN0cmVuZ3RoIjoxLCJhc2NpaVNvZnRuZXNzIjowLjY1LCJiYXNlQ29sb3IiOiIjZjRlZmU1Iiwic3VyZmFjZUNvbG9yIjoiI2YyZWVlNiIsImFjY2VudENvbG9yIjoiIzcxODJlOCIsInNlY29uZGFyeUFjY2VudENvbG9yIjoiIzlBNzVFQSIsInNob3dUZXh0Ijp0cnVlLCJ0ZXh0IjoiTW90aW9uLCBtYWRlIHZpc2libGUuIiwiYW5pbWF0ZSI6dHJ1ZSwic3BlZWQiOjAuNDIsImRpc3RvcnRpb24iOjEuMDUsImRldGFpbCI6MywiY29udHJhc3QiOjEsImFjY2VudEludGVuc2l0eSI6MC45LCJhY2NlbnRTcHJlYWQiOjAuNTQsImZsb3dBbmdsZSI6MCwiZ3JhaW4iOjAuMDA1LCJzY2FsZSI6MC41NSwicG9pbnRlclN0cmVuZ3RoIjowLjIsInBvaW50ZXJSYWRpdXMiOjAuMjQsInBvaW50ZXJTbW9vdGhpbmciOjAuNjUsImN1cnNvciI6ImRlZmF1bHQiLCJzaG93R2x5cGhzIjp0cnVlLCJnbHlwaERlbnNpdHkiOjEsImdseXBoQ29sb3IiOiIjNTQ1YTk2IiwiZ2x5cGhBY3RpdmVDb2xvciI6IiM2MjcwZDIiLCJnbHlwaFJlc3BvbnNlIjoiYXR0cmFjdCIsImdseXBoT3BhY2l0eSI6MC4yMiwiZ2x5cGhTaXplIjoyMiwiZ2x5cGhTdHJlbmd0aCI6MC4yNSwiZ2x5cGhSYWRpdXMiOjAuMjQsImZyYW1lUmF0ZSI6NjAsInJlc29sdXRpb25TY2FsZSI6MC44NSwiZ2x5cGhzIjoiIC46KypvTyMifQimport { SignalField } from "@/components/signal-field";
export default function Example() {
return <SignalField {...{
"interaction": "classic",
"asciiSize": 14,
"asciiStrength": 1,
"asciiSoftness": 0.65,
"baseColor": "#f4efe5",
"surfaceColor": "#f2eee6",
"accentColor": "#7182e8",
"secondaryAccentColor": "#9A75EA",
"showText": true,
"text": "Motion, made visible.",
"animate": true,
"speed": 0.42,
"distortion": 1.05,
"detail": 3,
"contrast": 1,
"accentIntensity": 0.9,
"accentSpread": 0.54,
"flowAngle": 0,
"grain": 0.005,
"scale": 0.55,
"pointerStrength": 0.2,
"pointerRadius": 0.24,
"pointerSmoothing": 0.65,
"cursor": "default",
"showGlyphs": true,
"glyphDensity": 1,
"glyphColor": "#545a96",
"glyphActiveColor": "#6270d2",
"glyphResponse": "attract",
"glyphOpacity": 0.22,
"glyphSize": 22,
"glyphStrength": 0.25,
"glyphRadius": 0.24,
"frameRate": 60,
"resolutionScale": 0.85,
"glyphs": " .:+*oO#"
}} />;
}| Property | Type | Default |
|---|---|---|
interactionInteraction Options: classic (Classic), ascii-lens (ASCII lens) | select | "classic" |
asciiSizeASCII cell size 6–32Step 1 | number | 14 |
asciiStrengthASCII strength 0–1Step 0.01 | number | 1 |
asciiSoftnessLens softness 0–1Step 0.01 | number | 0.65 |
baseColorBase colour | color | "#f4efe5" |
surfaceColorSurface colour | color | "#f2eee6" |
accentColorAccent colour | color | "#7182e8" |
secondaryAccentColorSecond accent | color | "#9A75EA" |
showTextShow headline | boolean | true |
textHeadline Up to 120 characters | text | "Motion, made visible." |
animateAnimation | boolean | true |
speedMotion speed 0–0.8Step 0.01 | number | 0.42 |
distortionDistortion 0.4–2Step 0.05 | number | 1.05 |
detailDetail 1–4Step 1 | number | 3 |
contrastContrast 0.7–1.6Step 0.02 | number | 1 |
accentIntensityAccent intensity 0–1Step 0.01 | number | 0.9 |
accentSpreadAccent spread 0–1Step 0.01 | number | 0.54 |
flowAngleFlow direction -3.14–3.14Step 0.02 | number | 0 |
grainGrain 0–0.06Step 0.001 | number | 0.005 |
scaleScale 0.5–2Step 0.01 | number | 0.55 |
pointerStrengthPointer response 0–1Step 0.02 | number | 0.2 |
pointerRadiusPointer radius 0.2–1Step 0.02 | number | 0.24 |
pointerSmoothingCursor smoothing 0–1Step 0.01 | number | 0.65 |
cursorCursor style Options: default (Default), crosshair (Crosshair), hidden (Hidden) | select | "default" |
showGlyphsShow glyphs | boolean | true |
glyphDensityGlyph density 0.1–1Step 0.01 | number | 1 |
glyphColorGlyph colour | color | "#545a96" |
glyphActiveColorActive glyph colour | color | "#6270d2" |
glyphResponseGlyph reaction Options: repel (Repel), attract (Attract), shimmer (Shimmer) | select | "attract" |
glyphOpacityGlyph opacity 0–1Step 0.01 | number | 0.22 |
glyphSizeGlyph size 4–32Step 1 | number | 22 |
glyphStrengthGlyph strength 0–1Step 0.01 | number | 0.25 |
glyphRadiusGlyph radius 0.05–1Step 0.01 | number | 0.24 |
frameRateframeRate 1–60Step 1 | number | 60 |
resolutionScaleresolutionScale 0.25–1Step 0.05 | number | 0.85 |
glyphsglyphs | text | " .:+*oO#" |
Signal Field
A decorative WebGL2 field with pointer distortion and a separate glyph layer. The default includes a sample headline. Set showText={false} when composing your own content, and place meaningful heading copy outside the decorative component.
React
Import the named component from the installed component directory. The entry includes its CSS. Give image and background components a sized container; the wrapper accepts style and className.
import { SignalField } from "./components/signal-field";
<SignalField interaction="ascii-lens" accentColor="#7182e8" style={{height: 480}} />Use regular props for every setting in the generated props table. paused suspends motion without discarding settings. Unmount releases observers, event listeners and animation resources.
HTML and vanilla
Copy the complete HTML bundle, including its assets, to your static host. Use the supplied component.html markup with component.css and component.js. Relative bundle URLs work under a subpath. The bundle initializes each instance independently from its serialized settings.
For a custom integration, import render, mount and resolveSettings from src/core. render(settings) is safe during server rendering. Pass an outer host element to mount(host, settings), then use update(settings), pause(), resume() and destroy() on the returned controller. Always destroy a controller before removing its host.
Accessibility and fallback
The canvas layers and sample headline are decorative. Without WebGL the bundled poster remains visible; JavaScript-free HTML delivery includes a poster. Reduced motion renders a static field. Animation pauses offscreen and when the document is hidden. Touch scrolling does not trigger pointer effects. Context loss switches to the poster and context restoration recreates GPU resources.
Assets and rights
See component.json for the complete asset list and assets/NOTICE.md for provenance. All source is standalone. No Arclen application runtime, authentication, database code, commercial fonts or licensed icon packs are required.
Performance
Hardware GPUs retain the original shader path. Software WebGL renderers use a bounded 50,000-pixel field to keep the CPU rasterizer responsive. The original shader and motion timing are unchanged; the separate glyph layer and headline retain full resolution. Hardware WebGL retains the requested resolution. The component has no npm runtime dependencies. The release gate records the compressed bundle size, startup and interaction timing. Reduced motion and offscreen suspension take priority over continuous effects.
The preview runs the component’s own JavaScript. It respects reduced motion and pauses when off screen. The HTML bundle includes a poster fallback.
Every setting in this panel comes from the component manifest. Preview size, pause and replay stay in the inspector.