|
morph 0.1.0
Asynchronous bridge between GUI thread and business models
|
| morph | |
| client | |
| args.hpp | The generic client's command line: which source it opens and how it starts. Spec 4 §3 |
| shell.hpp | What the generic client mounts once its source is open: the library's ShellFrame (the sidebar with the navigator, the top bar, the page) with a Workspace of tabs in its page, each a screen mounted through the library's DocumentScreenHost; and the application host a shell of an application's own mounts with |
| source.hpp | Where the generic client's screens and models come from: a server (remote) or an application linked in-process (local). Spec 4 §3 |
| transport.hpp | The transport a remote client connects with, chosen by the frontend it runs under (spec 4 §3) |
| core | |
| detail | |
| change_coalescer.hpp | What RemoteServer has queued for one connection's next changes event |
| completion_awaiter.hpp | The awaiter behind Completion<T>::operator co_await |
| instance_directory.hpp | |
| owned_state.hpp | OwnedState: a component's state, and the one executor it is touched on |
| owner_affinity.hpp | "Am I on my owner?" for a component that belongs to one executor |
| owner_probe.hpp | The check every loop-owned body makes on entry: "am I on my owner?" |
| reply_router.hpp | The callId-multiplexed execute reply router, shared by every backend that talks to a RemoteServer over a real (or simulated) connection |
| result_walker.hpp | Where an action's result holds which reflected types |
| subscription_registry.hpp | A Bridge's instance subscriptions: at most one callback per (binding, result type), matched at publish time on the binding's current instance, so a re-pointed handler's subscriptions follow it; entries whose binding is gone are pruned |
| task_handler.hpp | What drives a model's Task handler: the driver coroutine that starts and finishes it, the per-instance gate that keeps actions from overlapping, and the trait that tells a Task handler from an ordinary one. The resumer its resumptions go through is strand.hpp's |
| watch_table.hpp | The topics each connection watches, as RemoteServer keeps them |
| async.hpp | The asynchronous primitives, on their own — the cheap include |
| backend.hpp | |
| bridge.hpp | |
| callback_scope.hpp | |
| change_types.hpp | |
| changes.hpp | |
| completion.hpp | |
| connection_writer.hpp | What a transport hands RemoteServer to write to one connection, and the backlog bounds both sides apply |
| coroutine.hpp | Coroutines on core::async::Task: awaiting a Completion, starting a detached flow on a morph executor, and waiting on a timer |
| effects.hpp | |
| envelope_transport.hpp | IEnvelopeTransport: a transport that sends a request envelope of a kind its backend verbs do not build, such as the UI service's ui-* kinds, and settles with the peer's reply |
| executor.hpp | |
| file_io_ops.hpp | |
| io_loop.hpp | |
| logger.hpp | |
| model.hpp | |
| model_key.hpp | |
| observability.hpp | |
| owner_strand.hpp | OwnerStrand: one core-cpp strand over a morph executor, which is itself a morph executor — the owner a component's state belongs to |
| payload_schema.hpp | Structural fingerprint of an action payload's JSON shape |
| payload_shape_tag.hpp | Opt-in, compiler-independent shape tag for a type with a custom Glaze codec |
| profiler.hpp | Compile-time profiler instrumentation: Tracy zones, plots, messages and thread names, behind morph's own macro names |
| records.hpp | |
| registry.hpp | |
| remote.hpp | |
| strand.hpp | Morph's strands: one per model instance, from core-cpp's core::async::KeyedStrands, over a morph executor |
| timeout_scheduler.hpp | |
| wire.hpp | |
| detail | |
| fixed_string.hpp | Shared compile-time, NTTP-capable fixed string |
| quantity_equation.hpp | Quantity::equation() renderer (provenance builds only) |
| reflected_member.hpp | The value glaze reads and writes under a reflected key |
| forms | |
| detail | |
| schema_name.hpp | Compile-time $defs keys for the forms layer's field wrappers |
| session_common.hpp | Machinery shared by the two form session types: morph::flows::FlowSession (ordered wizard steps) and morph::forms::SectionSet (unordered sections) |
| engine | |
| detail | |
| text.hpp | Exact text helpers the forms engine shares: JSON quoting and reading, canonical decimal comparison and digit arithmetic, decimal rendering of a Rational, and ISO-8601 wall-clock conversion |
| collection.hpp | Collections, headless: a v-* view document as a reactive list of rows, the table source the table engine sorts and filters, row and collection actions, the confirm step and the row editor |
| collection_view.hpp | collectionView: a CollectionSession rendered as a view tree (ui::Node): the title and collection actions, a table of the rows with their actions, the confirm dialog and the row editor, as a dialog or beside the table |
| field_layout.hpp | morph::forms::FieldLayout: where a form's cell puts a field's caption. The forms engine and the authoring API share it. Specified in docs/spec/forms/engine.md, "Rendering" |
| field_model.hpp | FormModel: the immutable runtime model of one action's form, read from the schema JSON schemaJson<A>() emits (or any document in that vocabulary) |
| form_session.hpp | FormSession: the reactive state of one form over a FormModel — drafts, encoded values, readiness, presentation rules, Choice options and submission. A controller in the sense of docs/spec/reactive/control.md: no toolkit, testable headless |
| form_view.hpp | formView: a FormSession rendered as a view tree (ui::Node), so one form draws on every frontend |
| handler_submitter.hpp | Submitters and choice fetchers bound to an application's own BridgeHandlers |
| overrides.hpp | Overrides: an application's replacements for the control formView draws for a field, chosen by field path, widget hint, unit or kind; FieldView, what a replacement is handed |
| rules.hpp | x-rules read into RuleExpr trees, translated into the UI document's expression language (expr/1) and evaluated by its one evaluator, three-valued and exactly |
| typed_form.hpp | Form<A>: a FormSession over schemaJson<A>(), with typed access at the edges |
| values.hpp | The forms engine's encoders and decoders: a field's draft text to its exact wire literal, a wire value back to the draft a control shows, exact unit conversion, and Choice option rows |
| wizard.hpp | Wizards, headless: a w-* document as one FormSession per step, sequenced by successful submissions, with each step's prefill taken from what earlier steps resolved |
| wizard_view.hpp | wizardView: a WizardSession rendered as a view tree (ui::Node): the title and step indicator, the current step's form, and Back and Next |
| app.hpp | App-shell descriptor: menu -> screens (form / wizard / view refs) |
| blank_as.hpp | morph::forms::BlankAs: what a blank string field submits |
| choice.hpp | Fields whose value is picked from a list served by another action |
| field_errors.hpp | |
| flows.hpp | Multi-step wizards: an ordered sequence of registered actions that share a "flow draft" spanning the whole sequence |
| forms.hpp | JSON-Forms-style schema generation for morph actions |
| i18n.hpp | Stable, schema-derived message-key vocabulary for renderer i18n |
| instance_constraints.hpp | Per-*instance* constraints on a form field: the seam by which data that lives in a database row — not in a template parameter — reaches the framework-meaningful keys of a served schema, and is checked against a submitted value by the same declaration that served it |
| layout.hpp | Visual structure (sections, tabs, accordions, column spans) layered over an action's flat field list |
| sections.hpp | Unordered sections: N independently editable action drafts on one screen, each with its own readiness gate and no sequencing |
| views.hpp | View-schema generation: composes a registered query action's result rows with an optional row-opener action and row/collection action buttons into a list/table or master-detail screen descriptor |
| widget_hints.hpp | Typed wrappers that carry rendering-control intent for a form field |
| journal | |
| action_log.hpp | |
| action_log_json.hpp | The LogEntry JSON codec, kept apart from action_log.hpp |
| file_action_log.hpp | |
| journal.hpp | |
| outbox.hpp | |
| net | |
| detail | |
| sha1.hpp | |
| tcp_socket.hpp | |
| ws_connection.hpp | One WebSocket connection on an I/O loop: its socket, the frames waiting to be written, and the two flows that move bytes |
| ws_frame.hpp | |
| ws_handshake.hpp | |
| socket_backend.hpp | |
| socket_server.hpp | |
| offline | |
| file_offline_queue.hpp | |
| network_monitor.hpp | |
| offline_queue.hpp | |
| reconnect_coordinator.hpp | |
| replay_ledger.hpp | |
| sqlite_offline_queue.hpp | |
| sync_worker.hpp | |
| qt | |
| detail | |
| outbound_ledger.hpp | Which frames handed to a socket it has written, told from the socket's own byte counts |
| qt_executor.hpp | |
| qt_tls.hpp | |
| qt_websocket_backend.hpp | |
| qt_websocket_server.hpp | |
| qt_quick | |
| backend.hpp | morph::qt_quick::Backend: the view tree's widgets as Qt Quick items |
| browser_history.hpp | BrowserHistory: the browser's session history as an ui::IHistory, on WebAssembly only (spec 3 §10) |
| components.hpp | morph::qt_quick::Components: the application's own QML components, by name, and the restyle map |
| frontend.hpp | morph::qt_quick::Frontend: a morph application in a Qt Quick window |
| inspector.hpp | morph::qt_quick::InspectorWindow: the development inspector's window (spec 6 §21), opened with Ctrl+Shift+I over the focused screen |
| scheduler.hpp | morph::qt_quick::QtScheduler: reactive::Scheduler on Qt's timers |
| theme.hpp | applyTheme: the ui-theme/1 token values set on an engine's MorphUi Theme singleton, which every built-in component and every host component in that engine reads |
| reactive | |
| detail | |
| graph.hpp | The reactive graph's internals: node colours and links, the tracking frame, batching and the flush queue |
| testing | |
| manual_scheduler.hpp | morph::reactive::testing::ManualScheduler: a scheduler whose time moves only when a test says so |
| control.hpp | Declarative control: Query, Mutation and Subscription turn server interaction into reactive state, so a controller states what it depends on and what a write invalidates instead of sequencing calls by hand |
| runtime.hpp | morph::reactive::Runtime: the owner, batching and flush scheduling of a signal graph |
| scheduler.hpp | morph::reactive::Scheduler: timers a frontend runs on the runtime's owner executor |
| scope.hpp | morph::reactive::Scope: owns reactive nodes and objects, and destroys them in reverse |
| signal.hpp | Signal<T>, Computed<T> and Effect: the nodes of a reactive graph |
| store.hpp | morph::reactive::Store: user-intent view state, changed only by exhaustive messages |
| render | |
| i18n.hpp | The renderer-side translation-catalog seam over morph's derived message keys (morph::forms::i18n, forms/i18n.hpp) |
| locale_format.hpp | Locale numeric-entry normalisation for the control edge |
| session | |
| session.hpp | |
| session_auth.hpp | Opt-in authenticated sessions: signed bearer tokens and a verifying IAuthorizer so a RemoteServer can trust the caller's identity |
| table | |
| data_source.hpp | The rows a table engine reads, and the services it is given |
| edits.hpp | Committing edited cells: one row's edits in order, stale and error state per cell, and the row patched with the server's reply |
| engine.hpp | The table engine: sort, filter and view mapping, on and off the owner |
| filter.hpp | Filter specs as data, compiled once and evaluated column at a time |
| query.hpp | TableQuery, Page and table::apply: a table's sort, filter and page as a request body, and the server's reference implementation |
| selection.hpp | A table's selection and activation, kept by row key |
| sort.hpp | Typed sort keys and the chunked, stoppable merge sort over them |
| view_change.hpp | What changed between two view orders, as list-model operations |
| testing | |
| owner_probe_recorder.hpp | morph::testing::OwnerProbeRecorder: observes the owner checks a test's code makes, instead of letting a debug build assert on them |
| step_executor.hpp | morph::testing::StepExecutor: an executor whose posted tasks run only when a test steps it |
| tui | |
| backend.hpp | morph::tui::Backend: the terminal implementation of ui::IViewBackend |
| frontend.hpp | morph::tui::Frontend: a morph application in a terminal |
| loop_executor.hpp | morph::tui::LoopExecutor: a morph executor whose tasks run in turns of a core-cpp event loop |
| ui | |
| testing | |
| backend_conformance.hpp | The scripted cases every IViewBackend must pass, and the probe a backend author implements to run them |
| memory_history.hpp | MemoryHistory: an IHistory held in memory, which a test moves through as a user moves through a browser's history |
| recording_backend.hpp | morph::ui::testing::RecordingBackend: a headless widget tree with an operation log, a golden dump and user-interaction helpers — the test double and the reference for every real backend |
| agent.hpp | |
| alignment.hpp | morph::ui::Align and morph::ui::Justify: where a container places its children across its axis and along it. The view tree, the authoring API and the backends share them. Specified in docs/spec/ui/backend_contract.md, "The cross axis" |
| author.hpp | Server-side authoring of UI documents (spec 5 §11): typed builders that write a screen's JSON, and the registration that validates it once — loadDocument with the builders' catalog facts, then the accessibility rules |
| author_forms.hpp | |
| backend.hpp | The backend contract: the retained widgets a mount drives, and the factory that makes them |
| bundle.hpp | What the UI service's client and server share (spec 5 §12): content hashes, the bundle's manifest, and the bodies of the ui-hello, ui-catalog and ui-fetch envelopes, with their bounds and their parsers |
| button_emphasis.hpp | morph::ui::ButtonEmphasis: how much a button stands out. The view tree, the authoring API and the backends share it. Specified in docs/spec/ui/backend_contract.md |
| button_style.hpp | morph::ui::ButtonStyle: whether a button is drawn as a push button or as an entry of a list. The view tree, the authoring API and the backends share it. Specified in docs/spec/ui/backend_contract.md |
| catalogue.hpp | Message catalogues (spec 6 §19): a bundle's messages files read into a TranslationProvider that t resolves through, and the search that matches a title in every locale the bundle has |
| dev_reload.hpp | Development reload (spec 5 §12): which documents a changed bundle changed, and remounting the mounted screens that show them, keeping their state |
| dev_tools.hpp | morph::ui::DevelopmentTools: whether a client runs in development mode (spec 6 §21). The tools are in every build; this decides at run time whether they are on. Specified in docs/spec/ui/inspector.md |
| document.hpp | The UI document (spec 5 §3): its model — declarations, commands, view nodes, components and customization points — and loadDocument, which parses a document and runs its load-time validation |
| explorer.hpp | The app explorer: what a morph application is made of — its screens, the models they use with every action, and for one action its facts, its fields, the places that use it and the widget the framework builds for it, mounted live |
| expression.hpp | The expr/1 expression language of the UI document: parsing a JSON expression into an Expr tree, checking it against the names a document declares, and evaluating it |
| file_store.hpp | The file side channel's store (files/1, spec 6 §18): uploads in chunks, and files a principal may read by a capability reference |
| frontend.hpp | The frontend seam: main picks a frontend at runtime, and the frontend runs whatever an AppSource opens |
| host.hpp | The host contract (spec 6 §4): how a host mounts UI documents and closes them, whether it owns its own shell or is the framework's workspace shell, and DocumentScreenHost, the framework's host over documents |
| host_vocabulary.hpp | HostVocabulary: the commands and values only the client application has (host/1, spec 6 §14), registered with their types and versions, run with checked arguments behind a trust gate, and declared to the server in ui-hello |
| inspector.hpp | morph::ui::Inspector: the development inspector's read-only view of a mounted screen (spec 6 §21) |
| interpreter.hpp | The UI document interpreter: Interpreter::mount turns a loaded Document into reactive state and a view tree, mounts it through Mounted on any IViewBackend, and runs its queries, mutations, relations and commands. Model calls go through a Dispatcher (the bridge's model-free seams in an application, a scripted fake in a test); what only the application can do goes through an InterpreterHost; what screens share — the query cache, the principal's permissions, the formatting facts — is a Session |
| message.hpp | The MessageFormat 2 subset ui/1 accepts for t(key, fallback, args), and the CLDR plural rules its .match on a :number selects by |
| mount.hpp | morph::ui::Mounted: builds a view tree's widgets through a backend once, and keeps them current through reactive bindings |
| navigator.hpp | The workspace's navigator and pins (spec 6 §7): the catalog listed by module and group, searched by title, with the person's pinned shortcuts |
| preference_sync.hpp | PreferenceSync: the client side of the preferences model. It loads a mounted screen's stored choices into Screen::setPreference, and writes what InterpreterHost::preferenceChanged and resetPrefs report |
| preferences.hpp | Per-person storage of customization choices (spec 5 §12b, spec 6 §8): the IPreferencesStore seam, the framework's in-memory store, and the server's preferences model, which keys every entry by the person the verified session names |
| queueing_dispatcher.hpp | |
| route.hpp | Routes (spec 6 §20): the string form of a screen instance, <screen id>?<param>=<value>&…, written from a screen's declared params and read back against them |
| route_history.hpp | Route history (spec 3 §10, spec 6 §20): the route of the screen a shell shows, kept in a history the user moves through with back and forward, such as a browser's |
| service.hpp | The server side of the UI service (spec 5 §12, §12b, §13): UiRegistry collects an application's screens and files and builds a ServedBundle; UiService answers ui-hello, ui-catalog and ui-fetch from it as a RemoteServer envelope service |
| service_client.hpp | The client side of the UI service (spec 5 §12, "Content addressing"): UiClient runs ui-hello, ui-catalog and ui-fetch over a transport the caller supplies, verifies every file against the manifest and the manifest against the ui-hello digest, and keeps what it verified in a VerifiedCache |
| shell_frame.hpp | morph::ui::ShellFrame: the frame a client shows its screens in — a sidebar with the navigator, a top bar, and the page the workspace's tabs sit on. Built from backend widgets, so every frontend shows it |
| theme.hpp | Theme tokens (ui-theme/1, spec 6 §6): DTCG 2025.10 token files read and checked, layered into a variant, their aliases resolved, and the closed ui-theme/1 set filled from them with its defaults. No toolkit: the Qt Quick renderer applies the result (qt_quick::applyTheme) |
| value.hpp | The UI document's typed values (ui::Value), its types (ui::Type), their JSON form, and ui::Refusal, the error every load-time check of the document layer returns |
| view.hpp | The toolkit-agnostic view tree: props, node kinds and their builders |
| workspace.hpp | The workspace shell (spec 6 §7, §15): tabs over screens, mounted through a DocumentScreenHost |
| workspace_model.hpp | The workspace's tab logic with no widgets (spec 6 §7, §15): what an application's own tab strip binds to, and what ui::Workspace draws as a tab bar |
| util | |
| datetime.hpp | UTC timestamps for morph actions |
| quantity.hpp | Unit-tagged, optionally-empty exact values with a derivation trail |
| rational.hpp | Exact rational arithmetic for morph model/action values |
| tagged.hpp | Tagged<T, "Name"> — an opaque, type-safe newtype for protocol scalars that serializes transparently as its underlying T |
| attributes.hpp | |
| version.hpp |