No description
  • Emacs Lisp 93.7%
  • Python 5.5%
  • Makefile 0.5%
  • Shell 0.3%
Find a file
Kinneyzhang 9376708862
Some checks are pending
Repository structure / structure (push) Waiting to run
fix(range): move the fill through retained geometry again
The range painted a two-tone flow bar whose share was a flex ratio, so
Ebox could not move the fill in place: a caller's retained `:width`
update was ignored and the player republished the whole view once per
second.

Paint the fill as an absolutely positioned overlay above a flow track.
The track keeps the row's measurable width; the fill accepts
`etaf-runtime-update-host-geometries' width percentages and moves
without a View publication.  The gesture still re-proportions the two
parts through the component's own ref.  Drop the unused `:knob' prop.

Validation: make -C etaf-ui check (98 acceptance, API and structure
checks green); etaf-ncm acceptance 48/48; GUI scenario 49/49 with the
seek and volume fills visible in the wide, medium and narrow captures.
2026-10-02 17:44:50 +08:00
.githooks chore(git): enforce logical commits and structured messages 2026-09-13 11:15:13 +08:00
.github/workflows refactor(api)!: expose the root entry and enforce public contracts 2026-09-13 12:56:00 +08:00
benchmarks fix(etaf-ui): mount the stateful window in the provider resize workload 2026-09-26 11:50:45 +08:00
docs fix(ui): inherit host fonts and preserve standard text rows 2026-09-29 01:56:59 +08:00
examples feat(etaf-ui): add a controlled catalog window resize example 2026-09-26 11:45:56 +08:00
lisp fix(range): move the fill through retained geometry again 2026-10-02 17:44:50 +08:00
scripts feat(ui): add the icon facility and the interactive range component 2026-10-01 21:34:33 +08:00
tests fix(range): move the fill through retained geometry again 2026-10-02 17:44:50 +08:00
.editorconfig chore: establish consistent repository and acceptance policy 2026-09-13 11:10:50 +08:00
.gitignore chore: establish consistent repository and acceptance policy 2026-09-13 11:10:50 +08:00
CHANGELOG.md fix(range): move the fill through retained geometry again 2026-10-02 17:44:50 +08:00
etaf-ui.el feat(ui): add the icon facility and the interactive range component 2026-10-01 21:34:33 +08:00
Makefile feat(ui): add the icon facility and the interactive range component 2026-10-01 21:34:33 +08:00
README.md fix(ui): inherit host fonts and preserve standard text rows 2026-09-29 01:56:59 +08:00
README.zh-CN.md feat(ui): center compact dialogs in their display window 2026-09-23 08:49:25 +08:00

etaf-ui

Source layout: add the repository root to load-path and use (require 'etaf-ui). The supported API and usage notes are in etaf-ui.el; implementation modules live in lisp/.

etaf-ui is the official ETAF Component catalog. It is a normal optional package above etaf; it does not add a second Control or Widget model. Button, Checkbox, Label, Panel, and DataGrid are all ordinary Components with the same View, props, slots, events, and Data contracts. It requires Emacs 29.1+, ETAF 0.2.1+, and Ebox 3.0.0+.

Use the exact registered names etaf-panel, etaf-label, etaf-button, and etaf-checkbox in every View. Evaluate this complete example in a lexical-binding .el file, then switch to *etaf-preferences* to use its controls.

;;; -*- lexical-binding: t; -*-
(require 'etaf-ui)

(etaf-define-component demo-preferences ()
  :bindings ((done (etaf-ref nil))
             (saved (etaf-ref "Unsaved"))
             (rows (etaf-ref 3)))
  :view
  (etaf-panel :title "Account"
    (slot :name 'header
      (etaf-button :label "Save" :ref 'save-button
                   :on-press (lambda () (setf (etaf-value saved) "Saved"))))
    (etaf-label :text (etaf-value saved))
    (etaf-checkbox :bind done :label "Done" :ref 'done-checkbox)
    (etaf-number-input :bind rows :label "Rows" :ref 'rows-input :min 1 :max 10)
    (text (expr (if (etaf-value done) "Complete" "Pending")))))

(etaf-mount "*etaf-preferences*" (etaf-view (demo-preferences)))

Complete usage and interface contracts.

For a complete modern composition, run M-x etaf-ui-gallery-open to inspect the maintained Atelier workspace. It combines the catalog's layout, feedback, navigation, input, data and floating Components in one caller-owned flow.

For in-buffer floating UI, compose etaf-popover, etaf-dropdown-menu and etaf-dialog with ordinary controls and slots. Run M-x etaf-ui-surfaces-open for the menu and preferences example. Placement and occlusion come from Ebox; panel navigation uses its shared focus. Run make gui-check against the existing graphical Emacs server for the maintained keyboard/mouse interaction workflow. Use make gui-check GUI_EXAMPLE=fonts to compare actual physical row heights and an unchanged neighboring row across native control toggles, selection, tabs and dialogs in the current Emacs font configuration. Use make gui-check GUI_EXAMPLE=gallery for the integrated Gallery workflow, including drawer handoff, Chinese input, controlled selection and pagination.

Run make perf-check PERF_ARGS='--diagnose' from the development workspace to measure the existing graphical Emacs. The shared runner uses the registered Gallery callback, keyboard and mouse scenarios, with three sets of ten samples and separate phase, CPU and allocation passes. Budgets remain 50 ms for the checkbox, 100 ms for floating UI and a separate 500 ms hard limit. PERF_TOOL=/path/to/workspace/scripts/performance.py selects the same tool for a separate checkout. The workspace's docs/manual.md documents baseline comparison, source freshness and evidence boundaries.

Gallery Review has separate first-click and repeated-toggle workloads. gallery.review.callback and gallery.review.mouse mount a fresh page for each sample; gallery.review.steady.callback and gallery.review.steady.mouse retain one page within each set and alternate checked/unchecked values. Use both when checking updates: a fast first click does not establish steady interaction cost.

gallery.tabs.steady.callback and gallery.tabs.steady.mouse cycle through Library, Preferences and Workspace on one mount and verify each page's content. Owned Gallery fixtures resolve their viewport after display and before timing; batch fixtures use 120 character widths and 40 lines. Gallery workload version 2 includes this setup and is not comparable with version 1's implicit viewport.

Development

After cloning, run make setup-hooks. Before submitting a change, run make check; make structure-check is the fast organization gate.

make check runs structure checks, compilation and the public acceptance scenarios listed in tests/acceptance.json. make test runs the same public API suite. The inventory covers every maintained Lisp test. GUI and performance checks use separate targets.

Source layout

Add the repository root to load-path and require etaf-ui. The root entry loads the implementation in lisp/ and documents the supported public APIs in its Commentary. Package archives include both the root entry and lisp/.