etaf/DESIGN.md
Kinneyzhang 1d0a931583 feat: add executable ETAF best-practice examples
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.
2026-08-05 12:53:58 +08:00

6.3 KiB
Raw Blame History

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, 1012 px horizontal gaps, and 1218 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 680720 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.