| docs | ||
| examples | ||
| postmortem | ||
| tests | ||
| .gitignore | ||
| DESIGN.md | ||
| DESIGN.zh-CN.md | ||
| etaf-actions.el | ||
| etaf-behavior.el | ||
| etaf-component.el | ||
| etaf-context.el | ||
| etaf-data.el | ||
| etaf-events.el | ||
| etaf-reactive.el | ||
| etaf-renderer.el | ||
| etaf-resource.el | ||
| etaf-runtime.el | ||
| etaf-view.el | ||
| etaf.el | ||
| Makefile | ||
| README.md | ||
| README.zh-CN.md | ||
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.
Executable examples
The examples/ directory contains three core-only best-practice applications: retained state and Actions, Data Controller ownership, and Resource error/cleanup lifecycle. They are byte-compiled and driven through mounted public event paths by make check.
(add-to-list 'load-path "/path/to/github/etaf/examples")
(require 'etaf-counter-example)
(etaf-counter-example-open)
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
ECSS 0.1.0 and TP 1.0.0 are independent packages and may be installed in either order. Install both before Ebox 2.0.0, then install ETAF. ETAF consumes only the Ebox 2.0 public rendering contract.
During development, load the sibling Ebox checkout before ETAF:
(add-to-list 'load-path "/path/to/github/ebox")
(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.