Add retained state, Data Controller, and Resource lifecycle applications under examples, with paired guidance and public-path interaction tests. Verified with make check (57 behavior tests and 5 docs tests), make load, byte compilation, checkdoc, and GUI width checks at 784px body width.
83 lines
6.3 KiB
Markdown
83 lines
6.3 KiB
Markdown
# Design
|
||
|
||
## Source of truth
|
||
- Status: Active
|
||
- Last refreshed: 2026-08-05
|
||
- Primary product surfaces: Executable applications under `examples/`, especially the buffers opened by the three `etaf-*-example-open` commands.
|
||
- Evidence reviewed: ETAF public source and user guide, core/Data/Resource tests, `../etaf-playground/DESIGN.md`, the polished ETAF Showcase, and the original Ebox Flex reference.
|
||
|
||
## Brand
|
||
- Personality: Precise, calm, modern, technical, and intentionally composed.
|
||
- Trust signals: Stable geometry, readable contrast, explicit state ownership, public-only construction, and visible success/error/selection states.
|
||
- Avoid: Bare fixture text, low-contrast pastel text, decorative emoji, fake browser chrome, huge empty surfaces, and controls indistinguishable from copy.
|
||
|
||
## Product goals
|
||
- Goals: Make core ETAF practices copyable from small executable files; prove the installed Runtime interaction path; keep examples visually consistent with the Flex reference and ETAF Showcase.
|
||
- Non-goals: Replacing `etaf-playground`, simulating the missing `etaf-ui` catalog, introducing a second theme system, or demonstrating every public symbol in one application.
|
||
- Success signals: Each example teaches one ownership boundary, opens without side effects at load time, reacts through public events, cleans up its resources, and remains unclipped in a compact GUI frame.
|
||
|
||
## Personas and jobs
|
||
- Primary personas: ETAF application authors and framework maintainers.
|
||
- User jobs: Copy a correct state/data/resource pattern, inspect a real mounted application, and verify the visible result of an event.
|
||
- Key contexts of use: Source reading, GUI Emacs exploration, automated ERT, and framework regression review.
|
||
|
||
## Information architecture
|
||
- Primary navigation: No shared launcher; every file owns one explicit open and close command.
|
||
- Core routes/screens: Retained counter, task Data Controller, and Resource health.
|
||
- Content hierarchy: Capability eyebrow, application title and explanation, primary state surface, actions, then an ownership rule footer.
|
||
|
||
## Design principles
|
||
- Principle 1: One example teaches one lifecycle owner; avoid a mega-demo that hides where state and cleanup belong.
|
||
- Principle 2: Writes happen at Event, Action, lifecycle, Data, or Resource boundaries; render functions remain read-only.
|
||
- Principle 3: Use warm restrained semantic color families and one-pixel borders to make structure obvious without adding a design-system dependency.
|
||
- Tradeoffs: Prefer a fixed compact teaching canvas over viewport arithmetic in each standalone example; keep the responsive full-application showcase in `etaf-playground`.
|
||
|
||
## Visual language
|
||
- Color: Warm canvas `#F8F5EE`, paper `#FFFDF8`, ink `#252A2E`, muted ink `#66706A`, terracotta `#F1D4C9`, sage `#DCEBDD`, blue `#D9EAF2`, and violet `#E7E2F1`, always with explicit dark text.
|
||
- Typography: The configured Emacs monospace face; bold only for titles, actions, statuses, and important values.
|
||
- Spacing/layout rhythm: One-line vertical gaps, 10–12 px horizontal gaps, and 12–18 px surface padding.
|
||
- Shape/radius/elevation: Square text-native blocks and one-pixel borders; no shadows or fake radius.
|
||
- Motion: None; synchronous commits must settle without geometry shifts.
|
||
- Imagery/iconography: Text and restrained semantic marks such as selection circles only.
|
||
|
||
## Components
|
||
- Existing components to reuse: Core Hosts, retained Components, refs, computed values, Actions, focusable Behaviors, Data Controllers, Resources, and Runtime lifecycle callbacks.
|
||
- New/changed components: Example-specific shell, metric, action, row, status, and footer Components/Hosts.
|
||
- Variants and states: Ready/active counter, selected/unselected task, open/done filter, idle/loading/success/error Resource.
|
||
- Token/component ownership: Each example owns its small static palette and composition; ETAF/Ebox own semantics, layout, and rendering.
|
||
|
||
## Accessibility
|
||
- Target standard: High-contrast, keyboard-addressable text UI.
|
||
- Keyboard/focus behavior: Every action has a stable ref, button role, and `etaf-focusable` Behavior.
|
||
- Contrast/readability: Tinted surfaces always set explicit foregrounds; status is expressed in text as well as color.
|
||
- Screen-reader semantics: Preserve textual labels and semantic roles; do not encode meaning only in decoration.
|
||
- Reduced motion and sensory considerations: No animation or flashing state.
|
||
|
||
## Responsive behavior
|
||
- Supported breakpoints/devices: GUI Emacs body widths of approximately 760 px and above.
|
||
- Layout adaptations: Examples use 680–720 px teaching canvases; action groups use wrapping Flex; the full viewport-responsive pattern remains in `etaf-playground`.
|
||
- Touch/hover differences: None; interaction uses the Runtime event boundary.
|
||
|
||
## Interaction states
|
||
- Loading: Explicit Resource/Data status rather than an invented fallback.
|
||
- Empty: Bounded explanatory row with no hidden placeholder data.
|
||
- Error: High-contrast visible error message that persists until the next action.
|
||
- Success: Explicit status text on a sage surface.
|
||
- Disabled: Remove the event/tab stop instead of presenting a misleading active control.
|
||
- Offline/slow network, if applicable: Not applicable to the synchronous core examples.
|
||
|
||
## Content voice
|
||
- Tone: Direct, technical, concise, and instructional.
|
||
- Terminology: Use the canonical names View, Component, Host, Runtime, Data Controller, Resource, Event, Action, Scope, and public API.
|
||
- Microcopy rules: Name the demonstrated ownership boundary and describe the visible effect; avoid promotional filler.
|
||
|
||
## Implementation constraints
|
||
- Framework/styling system: Emacs 29.1+, the public `etaf` facade, and public Ebox properties lowered through ETAF Hosts.
|
||
- Design-token constraints: Reuse the established warm palette directly; do not add a token framework for three examples.
|
||
- Performance constraints: Synchronous bounded data only; no timers, background work, or hidden repeated mounts.
|
||
- Compatibility constraints: Core examples must not require `etaf-ui`, `etaf-sqlite`, `etaf-playground`, or private `etaf--*` / `ebox--*` APIs.
|
||
- Test/screenshot expectations: `make check` byte-compiles examples and drives their mounted public event paths; GUI verification uses one target buffer window and rejects clipping or continuation indicators.
|
||
|
||
## Open questions
|
||
- [ ] Add an asynchronous Resource example only after ETAF defines a public asynchronous completion contract / maintainer / avoids teaching a speculative API.
|