etaf/README.md
Kinneyzhang 904ac451a4 feat(etaf): complete unified core package boundary
Keep View, Component, Runtime, reactive, Context, Resource, Behavior, Action, and Data in one core package; add the Grid Host lowering path; remove bundled UI and Playground copies; and document the independent package graph.
2026-08-05 06:59:22 +08:00

2.7 KiB

ETAF

ETAF is a small text-application framework built above the independent Ebox layout and rendering engine.

Its complete public model is:

Component(props, Scope) → View → Renderer → Ebox Node → Emacs buffer

Every visible structure uses one form:

(name :property value ... child ...)

The only child computation bridge is expr :value; attribute values are ordinary Elisp expressions.

(etaf-view
 (column
  (text :face 'bold "Hello")
  (text
   :color "#687386"
   (expr :value (if ready "Ready" "Waiting")))))

Define a Component:

(etaf-define-component status-label (&key label)
  "Render a status label."
  :view
  (text :face 'bold (expr :value label)))

(etaf-mount
 "*etaf-demo*"
 (etaf-view (status-label :label "Connected")))

etaf-view is the single public View constructor. Structural forms do not use quote; quote remains ordinary Elisp data syntax, such as 'bold. A View returned from ordinary Elisp is explicitly constructed with (etaf-view ...) inside expr.

Documentation

Independent packages

Package Role
etaf-ui Official Component catalog: Button, Checkbox, Label, Panel, and DataGrid.
etaf-sqlite Concrete SQLite Data Source; the Data Controller remains in ETAF core.
etaf-playground ETAF examples, with the UI catalog loaded only when requested.
ebox-playground Ebox-only layout examples, independent from ETAF.

There is no separate etaf-data install: Data is a core ETAF capability. There is no generic etaf-adapters package: other databases, services, files, or ORMs should provide concrete Data Source packages with explicit names.

Load and verify

During development, load the sibling Ebox checkout before ETAF:

(add-to-list 'load-path "/path/to/github/emacs-box")
(add-to-list 'load-path "/path/to/github/etaf")
(require 'etaf)

Run the complete local gate:

make check EMACS=/Applications/Emacs.app/Contents/MacOS/Emacs

The core gate byte-compiles the implementation, runs the core/Data/Resource tests, and checks documentation/API boundaries. Run make check in the sibling etaf-ui, etaf-sqlite, etaf-playground, and ebox-playground repositories for their independent gates; none is loaded by the core facade.