I1 / A GESTURE, HELD STILL
Imperfection has a cause.
A broad middle suggests a press. Fine tracks suggest separated bristles. Broken ends suggest a lift. Use a stable seed so those marks belong to the object and survive every redraw.
ACRYLICS / DESIGN SYSTEM 0.6
Billboard type. Loaded brushstrokes. Tactile controls.
A visual language built one coat at a time.
01 / CORE CONCEPTS
Acrylics treats an interface as a sequence of material decisions. Pressure gives a mark its silhouette. Coverage lets the ground show through. A new coat changes what came before.
I1 / A GESTURE, HELD STILL
A broad middle suggests a press. Fine tracks suggest separated bristles. Broken ends suggest a lift. Use a stable seed so those marks belong to the object and survive every redraw.
I2 / COLOR HAS A HISTORY
Wet pigments can mute one another; a dry ground remains beneath a new layer. Pigment mixing and transparent overlays are distinct operations with different results.
I3 / EXPRESSION HAS A BOUNDARY
Billboard type establishes the idea. Paint establishes emphasis. Opaque surfaces, aligned labels, and predictable controls carry the information.
Change the palette and it should still feel like Acrylics: directional strokes, overlapping coats, a quiet reading surface, and tactile controls. Color alone cannot carry the system.
02 / OBJECTS & MATHEMATICS
Start with a finite vocabulary, then define the variables within each object. These are reproducible visual models; the examples below expose the choices that shape them.
| Object | Definition | Constraint |
|---|---|---|
| Stroke | A centerline plus a width profile, pigment, and bristle coverage. | Directional emphasis. Pressure changes its silhouette; coverage changes its transparency. |
| Blot | A compact, irregular deposit with a pooled edge. | A small signal. Pair it with a label or symbol. |
| Ground | An opaque surface paired with an ink token. | Supports reading and controls. Its contrast cannot depend on the paint behind it. |
| Layer | An ordered composition of marks around a ground. | Groups related content. Ordering and blend operation are explicit decisions. |
PaintMark = { shape, pressure, color } · shape ∈ { stroke, blot } · pressure ∈ { swell, drag, loaded }. The pressure preset applies to strokes. The component always remains decorative.
01 / THE STROKE
Underlines, selected navigation, and section emphasis. Let the ends break up; keep the label on a legible ground.
<PaintMark shape="stroke" />02 / THE BLOT
Small signals and selected controls. Pair the mark with a word or icon so color never has to explain the state alone.
<PaintMark shape="blot" />03 / THE LAYER
Group related content. Let coats meet around the perimeter while the content sits on an opaque surface.
<SurfaceCard layered />BRUSH GEOMETRY / PRESSURE → WIDTH
A brush spreads as the hand presses, then narrows as it lifts. Shape that gesture first. Add broken coverage and bristle tracks afterward.
Same pigment and texture seed. Only the width profile changes.
w(t) = w₀ + (w₁ − w₀) · e−(t − μ)² / (2σ²)
t: distance along the stroke · μ: where pressure peaks · σ: how broadly it spreads.
Width uses the 640 × 160 SVG coordinate space; w₀ = 8. A Gaussian is a useful gesture approximation. A live pen supplies its own pressure.
<PaintMark pressure="swell" />Swell presses through the middle. Drag presses early and trails off. Use a broad loaded coat over an opaque ground when a label needs a steady reading area.
COLOR BEHAVIOR / PIGMENT MIXING
Vermilion and forest green mute toward brown. Ultramarine and ochre move toward green. A pigment-inspired mix behaves differently from a digital overlay.
The slider compares the current scheme’s two pigments. It changes these examples; semantic UI colors stay legible.
#4B3E34#752019Spectral approximation versus a translucent multiply coat in sRGB. Neither predicts a particular brand of physical paint.
w(t) = w₀ + (w₁ − w₀) · exp(−(t − μ)² / 2σ²)The default swell spans 8–132 SVG units, with μ = 0.44 and σ = 0.20. The live comparison above keeps the pigment and seed fixed so the silhouette is the variable you see.
α(m) = 1 − exp(−2.8m)In the workshop, m is accumulated paint deposit. More deposit hides more ground. Brush load falls with distance; bristle tracks and canvas grain decide where paint lands.
coverage(x, y) = load × bristle mask × grainCoverage varies across a mark. Use a stable seed and keep its texture still; change the coat in response to a deliberate action.
Explore the brush & geometry workshop ↗03 / STYLE GUIDE
The material model describes what paint can do. The style guide chooses where to use it: paired colors, a type hierarchy, measured spacing, and limits on ornament.
03.1 / COLOR & SEMANTIC ROLES
A scheme changes the whole vocabulary: ground, ink, action, focus, and supporting pigments. Components keep their structure.
Warm paper, vermilion, and forest. The original street-poster palette.
Choose a scheme to see it applied to this entire page.
#D63228Raw pigment A#174C3CRaw pigment B--ac-field#F3EEDFThe page canvas. Leave room between marks.
--ac-surface#FFFAF0An opaque, readable ground for content.
--ac-ink#202820Headings, body copy, labels, and boundaries.
--ac-accent#B92820A dense coat for the primary action.
--ac-secondary#174C3CSecondary emphasis and supporting color.
--ac-highlight#E2B72DAn underline, small signal, or annotation.
The action coat is adjusted for its label contrast. Its paired --ac-on-accent token changes with the scheme. Keep decorative mixtures out of text and focus roles.
03.2 / TYPOGRAPHY, GEOMETRY & MOTION
Tall market billboards for display. A human body face for reading. Monospaced captions for the system’s measurements.
DISPLAY / ANTON
Short statements. Tight leading. Let the headline take up space, then give the next element a pause.
--ac-display · 0.99–1.08 line-heightBODY / HIND MADURAI
Use a 16–18px reading size and a generous line height. Avoid putting body copy across changing pigments.
--ac-body · 1.5–1.65 line-heightMETADATA / IBM PLEX MONO
Use for token values and small labels. Essential instructions stay in the body face, at a readable size.
--ac-mono · labels & values48121624324864Use the 4px base unit. Let 24–32px separate component groups; 48–64px give sections breathing room.
Keep hit areas rectangular and controls at least 44px high. Roughness belongs to the painted mask, not the target.
Use a 120ms press and a 180ms settle. A control lifts 2px on hover and sinks 3px on press. Keep texture still. Reduced-motion preferences remove these transitions.
03.3 / USAGE RULES
Acrylics is a system of material roles. Consistency comes from what a mark means and how a component behaves.
Use a stroke for selection, a blot for a discrete mark, and a dry surface for reading. Decoration follows hierarchy.
Overlaps can produce a third color. Keep critical text on an opaque ground or a tested action color.
A mark may look irregular. It must hold its position and texture between renders; interaction must not cause visual noise.
Color supports a label, icon, or pressed state. A red blot alone is not an error message.
04 / COMPONENTS & INTERACTION STATES
Try the controls. These are working components with labels, focus, pressed states, and feedback—not images of an interface.
ButtonOne primary action. A quieter secondary. A clear disabled state.
Apply color previews a local confirmation.
ChoiceChip + blotA stroke marks the active choice. A blot gives a toggle a clear, named state.
Stroke: directional emphasis and selection.
The toggle is unselected.
FieldInset controls sit on a dry surface. Errors explain how to recover.
Status + disclosureState is a color, a symbol, and a sentence. It remains understandable in grayscale.
In long text, dense tables, and error recovery. Keep ornament at the edges and let spacing and labels do the work.
SURFACE / DEFAULT
An opaque fill makes a card readable across every scheme. The body copy gets space; the component boundary stays crisp.
Surface / 4px cornerSURFACE / LAYERED
Brushwork groups and emphasizes. Layers live behind the card, leaving its reading surface and interactive controls clear.
Five reusable Astro primitives:
Button · ChoiceChip · PaintMark · SurfaceCard · DialogFields, status rows, badges, and disclosures use native HTML plus the same tokens.
05 / INFORMATION PATTERNS
A component is a part. A pattern gives those parts a reading order. Use a bold statement to frame a decision; use aligned rows when people need to compare.
PATTERN / EDITORIAL SUMMARY
Market, Cobalt, and After hours share the same material vocabulary and component behavior. Choose a ground before adding a mark.
Compare the schemes ↗Read in sequence: context → headline → explanation → one next action. One painted accent is enough to establish emphasis.
| Scheme | Ground | Shared rules |
|---|---|---|
| Market | Warm paper | ✓ Same components |
| Cobalt | Cool paper | ✓ Same components |
| After hours | Dark green | ✓ Same components |
Rows need stable alignment and clear boundaries. Keep paint at the group level; do not give every cell a competing brushstroke.
Compare across columns: identity → relevant difference → common rule. Labels carry the meaning in every color scheme.
In a hero, let one mark take space. In a card, keep it at the perimeter. In a table, keep the reading surface still. Information density governs how much expression the layout can hold.
06 / BUILD WITH IT
Use the role tokens first. Add a component. Place the paint where it helps establish emphasis or state.
Wrap your interface in .ac-site, load the stylesheet and the three typefaces, then apply the selected scheme’s custom properties. The stylesheet supplies Market as its default.
.ac-site {
--ac-field: #F3EEDF;
--ac-surface: #FFFAF0;
--ac-ink: #202820;
--ac-accent: #B92820;
--ac-on-accent: #FFFAF0;
}The example uses the same components shown above. Keep paint decorative with aria-hidden; expose labels and state on the real control.
<SurfaceCard title="A dry ground" layered>
<p>Let the paint frame the content.</p>
<Button variant="paint">Apply color</Button>
</SurfaceCard>Astro components live in src/components/acrylics/. The workshop is an optional material reference; the component page does not load its canvas engine.
Scheme and component examples reset when you reload. No account, collection, contact form, or visitor storage is involved.