Skip to content

Define TinyVectors field-based feel contract #40

@Jesssullivan

Description

Problem

The Phase A gel-physics rewrite made the background feel over-engineered: too coherent under input, too noisy/flashy in rendering, and then too still after coefficient tuning. TinyVectors needs a product-level feel contract before more physics changes.

TinyVectors is an expressive Svelte/SvelteKit background system, not a physics demo. Inputs should bias an already-pleasant ambient flow; they should not seize control of the blobs.

Linear: TIN-853

Feel Contract

  • Pleasant by default: idle blobs always drift/breathe subtly, never freeze and never jitter.
  • Inputs are bias fields: device gravity, pointer, and scroll influence the existing flow instead of replacing it.
  • Gravity is a slow directional bias: tilt should make blobs lean/pool/drift, not behave like marbles falling.
  • Pointer is local and soft: nearby blobs should react more than distant blobs, with no event capture by the visual layer.
  • Scroll is transient: scroll should create a decaying impulse/stickiness, not permanent acceleration.
  • Gel/fluid is visual language: use low-cost inertia, soft repulsion/attraction, and shape deformation rather than a heavyweight fluid simulation.
  • App-safe by default: SSR-safe, reduced-motion aware, listener-clean, no layout jank, and small enough for in-house SvelteKit backgrounds.

Scope

  • Keep PR Integrate motion, pointer, gel, and package validation #39 on the restored pre-Phase-A physics/rendering baseline plus the useful harness/lifecycle/package work.
  • Add repo-local architecture docs for the feel contract and field model.
  • Introduce a small internal field/force seam that can be tested without changing visible behavior first.
  • Add behavior tests in tolerant terms: idle drift bounded, gravity directional bias, pointer locality, scroll impulse decay, listener lifecycle, and bundle budget.
  • Only then add direct pointer/gravity fields incrementally behind the existing public flags/config.

Non-Goals

  • Do not revive the Phase A XSPH/soft-wall/Gaussian rewrite as-is.
  • Do not ship a coefficient-only tuning patch without a contract and harness coverage.
  • Do not introduce a large physics dependency or heavy fluid solver.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions