# Composure – Non-Goals

These are things Composure deliberately does not do. They are not deferred features waiting for prioritization. They are architectural refusals that protect the core model.

Every item here exists because doing it would violate a core invariant or pull the project toward a shape it should not have.

## Layout

**No global constraint solving.**
Layout is local. A parent sees its direct children. There is no system that propagates constraints across unrelated subtrees. If a layout problem cannot be solved locally, it is the wrong problem for this runtime.

**No child-to-child negotiation.**
Children do not influence sibling placement. If two children compete for space, the parent decides. Children never talk to each other.

**No unbounded iteration.**
Layout converges in at most two passes: one measure/place pass and one optional refinement. There are no convergence loops, no "keep going until stable" strategies.

**No CSS layout delegation.**
The browser is not asked to solve layout beyond intrinsic measurement of leaves. No flexbox, no grid, no float, no position:relative tricks. The runtime owns placement. CSS owns painting.

## Authoring

**No JSX.**
The API is plain ECMAScript: functions, method calls, closures, objects. No transpiler, no template syntax, no compile step required.

**No DSL or schema language.**
Layout is expressed in code, not in a declarative configuration format. There is no layout language to learn beyond JavaScript itself.

**No component framework.**
Composure is not React. It does not manage application state, provide lifecycle hooks, handle data binding, or own the update cycle beyond layout invalidation. It is a layout runtime, not an application framework.

## Text

**No fine text geometry.**
v1 treats text as a block-measured leaf. The browser wraps and shapes text internally. The runtime does not expose line boxes, baselines, glyph positions, or contour extraction.

**No shape-aware text flow.**
Text does not flow around shapes, follow paths, or respond to non-rectangular constraints. If this is ever needed, it belongs in a specialized extension, not in the core.

## Rendering

**No canvas or WebGL rendering.**
Output is real DOM. This preserves accessibility, native text rendering, focus handling, selection, and browser event behavior. These are not negotiable.

**No immediate-mode rendering.**
The tree is retained. Nodes persist between updates. The runtime does not redraw the world every frame.

## Styling

**No CSS replacement language.**
`style()` passes visual properties to the DOM. It is not a styling system, a theme engine, or a design token resolver. It is a thin pass-through that actively rejects layout-owned properties (position, width, height, margin, display) — those belong to `size()` and the frame.

**No implicit style inheritance.**
A child does not inherit visual properties from its parent through the runtime. If the browser inherits (e.g., font-family via CSS inheritance), that is the browser's business. The runtime does not add its own inheritance.

## Dependencies

**No cross-parent spatial relations.**
A node in one subtree cannot reference or depend on a node in another subtree. Anchoring, alignment-to-foreign-node, and cross-tree measurement are not supported.

**No selector system.**
There are no CSS-like selectors, no query-by-type, no pattern matching across the tree. If a parent needs to treat children differently, it does so explicitly in its layout function.

## Scope

**No large standard library.**
The built-in container vocabulary is intentionally small: vstack, hstack, zstack, box, text. The goal is to validate the model, not to ship a widget catalog.

**No plugin or extension architecture.**
v1 has no formal extension points beyond custom layout functions. If the core model is right, extensions can be designed later with confidence. Premature extension architecture creates the wrong abstractions.

---

## How to use this document

When considering a new feature, check it against this list.

If the feature contradicts a non-goal, it does not belong — or the non-goal must be explicitly revisited and justified before proceeding.

Non-goals are not permanent. But changing one requires understanding why it was here in the first place.
