Cotis
Cotis is a modular Rust library for building native user interfaces. The core is intentionally split into small, swappable pieces: layout managers, pipes that convert layout output into renderer commands, and render backends that draw those commands. You wire them together through CotisApp, which orchestrates each frame.
Status: Early
0.1.0-alpharelease. APIs are still evolving, especially text, font, and text-measuring integration points incotis-utilsandcotis-defaults.
This repository contains the core traits and orchestration only. It does not open a window or draw pixels by itself. For a runnable desktop app, combine these crates with a layout engine, a pipe, and a renderer backend from the ecosystem below.
Architecture
Each frame flows through five stages:
flowchart LR
UI[UI_closure] --> LayoutMgr[LayoutManager]
LayoutMgr --> LayoutOut[Layout_output]
LayoutOut --> Pipe[LayoutRenderPipe]
Pipe --> Renderer[CotisRenderer]
- A layout manager prepares for the frame.
- UI code builds the element tree through the configurator API.
- The layout manager produces layout output items.
- A pipe transforms those items into renderer commands.
- A renderer draws the command stream.
Workspace crates
| Crate | Role |
|---|---|
cotis |
Core traits: layout, render, pipes, and CotisApp orchestration |
cotis-defaults |
Default ElementConfig and render command types |
cotis-utils |
Shared math, input, font, and renderer context traits |
cotis-macros |
#[cotis_start] / #[cotis_start_async] entry hooks |
Installation
Add the core crates to your Cargo.toml:
= "0.1.0-alpha"
= "0.1.0-alpha"
= "0.1.0-alpha"
= "0.1.0-alpha"
A full desktop application also needs a layout engine, a pipe, and a renderer. See Quick start and Ecosystem.
Quick start
This workspace has no runnable examples on its own. Clone a renderer backend and run its example:
That example opens a resizable window, lays out UI with cotis-layout and cotis-pipes, and renders through wgpu.
Typical app wiring
use CotisApp;
use CotisLayoutManager;
use CotisLayoutToRenderListPipeForGenerics;
use Dimensions;
use *;
let renderer = auto_start;
let manager = new;
let mut app = new;
while !app.render.window_should_close
Swap cotis-wgpu for cotis-raylib or another backend without changing layout or UI code.
Ecosystem
Cotis is split across several repositories. This repo defines the contracts; sibling repos provide concrete implementations.
| Repository | Role |
|---|---|
| cotis (this repo) | Core traits and CotisApp orchestration |
cotis-layout |
Flexbox-style layout engine (CotisLayoutManager) |
cotis-pipes |
Layout output to render commands (CotisLayoutToRenderListPipeForGenerics) |
cotis-wgpu |
Desktop renderer (wgpu + winit + glyphon) |
cotis-raylib |
Desktop renderer (raylib) |
cotis-renderer-template |
Scaffold for authoring a custom render backend |
cotis-cli |
Plugin host for installable build and run routines |
Pick a renderer backend and swap it without changing layout or UI code. Use cotis-renderer-template to implement a new backend.
Features
cotis
app_launch— platform-controlled entry viacotis-macrosandlaunchhooksserialization— serde support for core types
cotis-defaults
serialization— serde support for configs and commands (also enablescotis/serializationandcotis-utils/serialization)complex_color— layered and gradient color supportcomplex_colored_text— extendscomplex_colorto text color fields
cotis-utils
serialization— serde derives for math types (Vector2,Dimensions,BoundingBox)
cotis-macros
Proc-macro attributes for environments where the renderer owns program startup:
use cotis_start;
Enable the app_launch feature on cotis when using this launch path.
Documentation
- API reference:
cargo doc --open -p cotis - Published docs: cotis, cotis-defaults, cotis-utils, cotis-macros