{"id":50449300,"url":"https://github.com/maratik123/quartzite","last_synced_at":"2026-05-31T23:30:24.780Z","repository":{"id":355075416,"uuid":"1226726534","full_name":"maratik123/quartzite","owner":"maratik123","description":"GUI and object framework for Rust: signals/slots, properties, reflective object model","archived":false,"fork":false,"pushed_at":"2026-05-30T10:31:34.000Z","size":6350,"stargazers_count":0,"open_issues_count":112,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-05-30T12:12:09.749Z","etag":null,"topics":["gui","gui-framework","no-std","object-model","proc-macros","reflection","rust","signals-slots"],"latest_commit_sha":null,"homepage":"https://maratik123.github.io/quartzite/","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/maratik123.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE-APACHE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":"ROADMAP.md","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-05-01T19:01:35.000Z","updated_at":"2026-05-30T10:31:37.000Z","dependencies_parsed_at":null,"dependency_job_id":"cdd0a1ab-9147-4535-86d0-426889c4b5a9","html_url":"https://github.com/maratik123/quartzite","commit_stats":null,"previous_names":["maratik123/quartzite"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/maratik123/quartzite","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maratik123%2Fquartzite","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maratik123%2Fquartzite/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maratik123%2Fquartzite/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maratik123%2Fquartzite/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/maratik123","download_url":"https://codeload.github.com/maratik123/quartzite/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maratik123%2Fquartzite/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33753923,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-31T02:00:06.040Z","response_time":95,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["gui","gui-framework","no-std","object-model","proc-macros","reflection","rust","signals-slots"],"created_at":"2026-05-31T23:30:23.669Z","updated_at":"2026-05-31T23:30:24.768Z","avatar_url":"https://github.com/maratik123.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# quartzite\n\n[![CI](https://github.com/maratik123/quartzite/actions/workflows/ci.yml/badge.svg)](https://github.com/maratik123/quartzite/actions/workflows/ci.yml)\n[![docs](https://img.shields.io/badge/docs-master-blue)](https://maratik123.github.io/quartzite/)\n[![codecov](https://codecov.io/gh/maratik123/quartzite/branch/master/graph/badge.svg)](https://codecov.io/gh/maratik123/quartzite)\n[![license](https://img.shields.io/badge/license-MIT_OR_Apache--2.0-blue)](#license)\n\nA GUI and object framework for Rust drawing on Qt's signals/slots and\nproperty/reflection model — implemented in idiomatic Rust with no native\ndependencies, no foreign ABI, and no codegen outside proc-macros.\n\n## Current scope\n\n- **Object model:** `ObjectBase`, parent/child trees, named lookup, reflection metadata.\n- **Signals/slots:** typed `Signal\u003cArgs\u003e`, dynamic dispatch via `Object::invoke_method`, cross-thread queued connections.\n- **Event loop:** `Application` singleton (builder via `ApplicationBuilder`; Object-ified with `quit` slot), per-thread `EventLoop` (Object-ified; tickless by default, configurable `Option\u003cDuration\u003e` tick), queued dispatcher.\n- **Timers:** `Timer` object with `AppDriver` / `PoolDriver` / `ThreadDriver` execution contexts.\n- **Painting API** (`quartzite-paint-api`) — 11-method `Painter` trait (rect/line/text/image/path/transform/state), `Color`, `Pen`, `Brush`/`BrushKind` (solid + 2-stop linear/radial gradient + `Custom(peniko::Gradient)` escape hatch), `Font`, `Image`, `Path` — `no_std`-compatible.\n- **Renderer** (`quartzite-renderer`) — `WindowedApplication` (multi-window, configurable last-window-quit policy, proxy-based `AppEvent::Exit`) + `WindowRegistry` (per-window event fan-out via `WindowedAppHandler`) + `VelloPainter` (full 11-method `Painter` impl — rect/line/path/image/text via parley+skrifa; transform/clip stack; vello + wgpu + winit) + `RenderHarness` / `RenderHarnessBuilder` offscreen test harness for snapshot testing.\n- **Widgets** (`quartzite-widgets`) — `WidgetBase`, `WidgetExt`, layouts (`BoxLayout`, `GridLayout`), and built-in widgets (`Label`, `Button`, `LineEdit`, `TextEdit`, `ScrollArea`, `Container`).\n- **Snapshot / save-restore** (`serde` feature) — `capture_object` / `restore_object` / `capture_tree` / `restore_tree` with JSON and bincode support; `Value::Custom` round-trips via `typetag`.\n\n## Forward scope\n\n- **Style system** (`quartzite-style`) — declarative styling on top of widgets.\n\n## Non-goals\n\n- Not a Qt port or a Qt binding — Qt is design lineage, not API surface.\n- No FFI / native dependencies — pure-Rust toolchain.\n\n## Status\n\nEarly development. Core crates and the widget system are implemented; full painting and theming layers are next.\n\n| Crate | Status |\n|---|---|\n| `quartzite` (facade) | ✅ implemented |\n| `quartzite-core` | ✅ implemented |\n| `quartzite-macros` | ✅ implemented |\n| `quartzite-runtime` | ✅ implemented (tickless `EventLoop` + `ApplicationBuilder` + Object-ification of `EventLoop`/`Application` with `stop`/`quit` slots #561) |\n| `examples/` | ✅ runnable examples: `hello_object`, `signals_slots`, `object_tree`, `timer` |\n| `quartzite-geometry` / `quartzite-events` / `quartzite-event-types` | ✅ implemented |\n| `quartzite-paint-api` | ✅ implemented (Color, Pen, Brush/BrushKind incl. LinearGradient/RadialGradient/Custom gradient, Font, Image, Path, 13-method Painter trait; TextCaretCursor/TextVisualLineCursor/TextVisualLine cursor types #317; `draw_text_in` `h_align + v_align: Alignment` two-axis extension #555) |\n| `quartzite-paint` | ✅ implemented (re-export shell over paint-api + Alignment from geometry + peniko gradient re-exports) |\n| `quartzite-paint-util` | ✅ implemented (#410, `TranslateGuard` RAII wrapper for `save`/`translate`/`restore` triplet; `no_std` + panic-safe) |\n| `quartzite-renderer` | ✅ implemented (WindowedApplication + multi-window WindowRegistry + WindowedAppHandler + VelloPainter full 11-method impl with parley/skrifa text; RenderHarness/RenderHarnessBuilder snapshot harness) |\n| `quartzite-widgets` | ✅ implemented (#46) |\n| `quartzite-style-types` | ✅ implemented (#47, leaf: Palette, ColorRole; #488 DARK_PALETTE; #402 ColorGroup axis + FocusRing) |\n| `quartzite-style` | ✅ implemented (#47, downstream: Style trait, StyleRegistry; #290 DefaultStyle concrete impl; #297 GPU snapshot tests; #318 Container+LineEdit arms; #458 read-only overlay fix; #402 ColorGroup palette migration; #317 StyleClock + caret/selection rendering for TextEdit; #555 design-system conformance audit + Button/Label vertical centring) |\n| `quartzite-style-dispatch` | ✅ implemented (#312, widget-tree paint dispatcher: `dispatch_paint` + `WidgetResolver`; #393 facade `style-dispatch` feature; #395 `WidgetResolver` moved to `quartzite-hit-test`, re-exported here) |\n| `quartzite-hit-test` | ✅ implemented (#395, paint-free reverse-z-order `hit_test(root, point, resolver) -\u003e Option\u003c(ObjectId, Point)\u003e`; owns the immutable `WidgetResolver` trait) |\n\n## Usage\n\nAdd `quartzite` to your `Cargo.toml` — no sub-crate deps required:\n\n```toml\n[dependencies]\nquartzite = { git = \"https://github.com/maratik123/quartzite\" }\n```\n\nImport the prelude for typical usage, or use explicit module paths:\n\n```rust\n// one glob covers the object model, signals, derive macros, and runtime\nuse quartzite::prelude::*;\n\n// explicit paths when you want legibility\nuse quartzite::core::ObjectBase;\nuse quartzite::macros::MetaEnum;   // requires `derive` feature (on by default)\nuse quartzite::runtime::Application;\n```\n\nDisable the `derive` feature to skip proc-macro compilation:\n\n```toml\nquartzite = { git = \"...\", default-features = false, features = [\"std\"] }\n```\n\n## Prerequisites\n\n- Rust stable (≥ 1.96)\n- Cargo (comes with Rust)\n\n## Build\n\n```bash\ncargo build --workspace\n```\n\n## Test\n\n```bash\ncargo test --workspace\n```\n\n## Lint\n\n```bash\ncargo clippy --workspace --all-targets -- -D warnings\n```\n\n## Format\n\n```bash\ncargo fmt --all              # apply\ncargo fmt --all -- --check   # verify (CI gate)\n```\n\n## Docs\n\n```bash\nRUSTDOCFLAGS=\"-D warnings -D missing-docs\" cargo doc --no-deps --workspace\n```\n\n## License\n\nDual-licensed under either of:\n\n- [MIT License](LICENSE-MIT) ([https://opensource.org/licenses/MIT](https://opensource.org/licenses/MIT))\n- [Apache License, Version 2.0](LICENSE-APACHE) ([https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0))\n\nat your option. This is the standard Rust ecosystem dual-license.\n\n### Contribution\n\nUnless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual-licensed as above, without any additional terms or conditions.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmaratik123%2Fquartzite","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmaratik123%2Fquartzite","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmaratik123%2Fquartzite/lists"}