{"id":51168382,"url":"https://github.com/yhyzgn/liora","last_synced_at":"2026-06-26T22:01:45.216Z","repository":{"id":355380577,"uuid":"1227855035","full_name":"yhyzgn/liora","owner":"yhyzgn","description":"Pure Rust + GPUI native enterprise UI component library for desktop apps — Element Plus-inspired components, charts, docs, tray integration, and installer packaging.","archived":false,"fork":false,"pushed_at":"2026-06-26T03:00:51.000Z","size":22474,"stargazers_count":2,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-26T03:12:35.639Z","etag":null,"topics":["charts","code-editor","component-library","cross-platform","dark-theme","desktop-app","element-plus","enterprise-ui","gpui","gui","installer","markdown-renderer","native-desktop","native-ui","packaging","rust","rust-desktop","rust-ui","system-tray","ui-components"],"latest_commit_sha":null,"homepage":"https://github.com/yhyzgn/liora","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/yhyzgn.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"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-03T09:03:36.000Z","updated_at":"2026-06-26T03:00:49.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/yhyzgn/liora","commit_stats":null,"previous_names":["yhyzgn/aura","yhyzgn/liora"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/yhyzgn/liora","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yhyzgn%2Fliora","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yhyzgn%2Fliora/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yhyzgn%2Fliora/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yhyzgn%2Fliora/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/yhyzgn","download_url":"https://codeload.github.com/yhyzgn/liora/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yhyzgn%2Fliora/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34834415,"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-06-26T02:00:06.560Z","response_time":106,"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":["charts","code-editor","component-library","cross-platform","dark-theme","desktop-app","element-plus","enterprise-ui","gpui","gui","installer","markdown-renderer","native-desktop","native-ui","packaging","rust","rust-desktop","rust-ui","system-tray","ui-components"],"created_at":"2026-06-26T22:01:41.066Z","updated_at":"2026-06-26T22:01:45.208Z","avatar_url":"https://github.com/yhyzgn.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n  \u003cpicture\u003e\n    \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"assets/liora-logo.svg\"\u003e\n    \u003cimg src=\"assets/liora-logo.svg\" alt=\"Liora — pure Rust + GPUI native UI component library\" width=\"220\"\u003e\n  \u003c/picture\u003e\n\n  \u003cp\u003e\u003cstrong\u003eEnterprise-grade native UI components for Rust desktop applications.\u003c/strong\u003e\u003c/p\u003e\n  \u003cp\u003ePure Rust. GPUI native. Element Plus-inspired APIs. No Tauri, no WebView, no browser runtime.\u003c/p\u003e\n\n  \u003cp\u003e\n    \u003ca href=\"README.zh-CN.md\"\u003e简体中文\u003c/a\u003e\n    ·\n    \u003ca href=\"CONTRIBUTING.md\"\u003eContributing\u003c/a\u003e\n    ·\n    \u003ca href=\"CHANGELOG.md\"\u003eChangelog\u003c/a\u003e\n  \u003c/p\u003e\n\n  \u003cp\u003e\n    \u003cimg alt=\"Rust 2024\" src=\"https://img.shields.io/badge/Rust-2024-dea584?logo=rust\u0026logoColor=white\"\u003e\n    \u003cimg alt=\"GPUI native\" src=\"https://img.shields.io/badge/GPUI-native-7c3aed\"\u003e\n    \u003cimg alt=\"Pure Rust\" src=\"https://img.shields.io/badge/runtime-pure%20rust%20native-10b981\"\u003e\n    \u003cimg alt=\"LicenseRef-Liora\" src=\"https://img.shields.io/badge/license-LicenseRef--Liora-64748b\"\u003e\n    \u003cimg alt=\"Native packaging\" src=\"https://img.shields.io/badge/packaging-native-0ea5e9\"\u003e\n  \u003c/p\u003e\n\u003c/div\u003e\n\n---\n\n## What is Liora?\n\n**Liora** is a monorepo for building polished, enterprise-style **Rust native desktop UI** with [GPUI](https://github.com/zed-industries/zed). It brings a broad Element Plus-inspired component taxonomy to native Rust applications: basic elements, forms, overlays, navigation, data display, advanced inputs, native charts, virtualized data views, code display/editing, tray integration, and installer packaging infrastructure.\n\nLiora is intentionally not a web shell. Applications built with Liora stay on the **pure Rust + GPUI native** path:\n\n- no Tauri runtime;\n- no WebView, HTML/CSS/DOM, or browser application shell;\n- no web chart runtime, SVG DOM charting layer, or frontend build pipeline;\n- Gallery and Docs are native GPUI applications that demonstrate the library in real app shells.\n\n## Why Liora?\n\nRust desktop teams often need more than a handful of primitives. Liora focuses on the missing middle between low-level GPUI layout code and real product screens:\n\n| Need | Liora answer |\n|---|---|\n| Native desktop UI | GPUI element trees, native windows, native text/layout/paint paths. |\n| Enterprise component coverage | Element Plus-style categories and APIs across forms, feedback, data, navigation, charts, and advanced controls. |\n| Real app surfaces | `liora-gallery` and `liora-docs` show complete native application setup, theme switching, search/filtering, tray behavior, docs rendering, and dashboard-style composition. |\n| Theming | Light, Dark, and System theme modes with semantic tokens and component-level variants. |\n| One dependency for apps | `cargo add liora` exposes the maintained SDK facade: core, theme, components, icons, tray, packaging, and generic updater helpers. |\n| Native distribution | `liora-packager` + `xtask package` validate installer information, manifests, checksums, signing policy, and package generation plans. |\n| Clear architecture boundary | Reusable components stay in `liora-components`; product-specific data models and screen composition stay in applications. |\n\n## Feature highlights\n\n- **One-stop SDK facade**: depend on `liora` for application development, or use focused crates such as `liora-components`, `liora-theme`, and `liora-packager` when you need narrower surfaces.\n- **70+ native UI components** across Basic, Form, Feedback, Data, Navigation, and Others categories.\n- **Element Plus-inspired API style** adapted for Rust builders and GPUI rendering.\n- **Native charting**: Line, Area, Bar, Pie, Ring, Sparkline, scales, grids, legends, downsampling, and hover hit testing.\n- **Advanced controls**: CodeEditor, CodeBlock, QR code, Timer, SignalMeter, HeatBar, SegmentRatioBar, draggable lists, Tour, TreeSelect, Mention, InputTag, Watermark, virtualized table/tree.\n- **Overlay and interaction systems**: Tooltip, Popover, Popconfirm, Dialog, Drawer, Dropdown, Message, Notification, MessageBox, Loading, Preview, Tour.\n- **Native docs renderer**: Markdown is parsed as input and rendered into Liora/GPUI native nodes; code snippets live outside Markdown and are compile-checked.\n- **System tray facade**: `liora-tray` wraps `tray-icon` + `muda` for dynamic icons, nested menus, checkbox items, stable commands, and process-resident GPUI apps.\n- **Installer pipeline**: package information validation, `cargo-packager` config generation, RPM supplemental config, portable `.tar.gz`, manifests, checksums, release notes, and CI validation gates.\n- **Reusable updater pipeline**: `liora-updater` checks GitHub Releases for any configured repository, selects assets with app/platform naming rules, downloads into a cache, verifies SHA-256 manifests, and returns an explicit install plan. Liora Gallery/Docs use small built-in presets on top of the generic API.\n- **Quality gates**: workspace fmt/check/test, docs snippet checks, package validation, release-readiness checks, and GUI startup smoke commands.\n\n## Component coverage\n\n| Category | Components and capabilities |\n|---|---|\n| Basic | Button, ButtonGroup, Icon, Link, Text, Title, Paragraph, Space, Divider, Row, Col, Container, Scrollbar, Splitter, CodeBlock |\n| Form | Input, InputNumber, Textarea, Checkbox, CheckboxGroup, Radio, RadioGroup, Switch, Select, Slider, Form, FormItem, Rate, DatePicker, TimePicker, DateTimePicker, Upload, Cascader, Transfer, ColorPicker, Autocomplete, InputTag, Mention, TreeSelect |\n| Feedback / Overlay | Tooltip, Popover, Popconfirm, Dialog, Drawer, Message, Notification, Alert, Loading, MessageBox, Dropdown, Card, Collapse, Preview, Tour |\n| Navigation | Menu, Tabs, Breadcrumb, Steps, PageHeader, Affix, Backtop, Anchor |\n| Data display | Table, VirtualizedTable, VirtualizedTree, VirtualizedList, Progress, Skeleton, Empty, Result, Descriptions, Timeline, Tree, Pagination, Statistic, Segmented, Tag, Avatar, Badge, Calendar, Carousel, Image, Watermark |\n| Charts / Metrics | LineChart, AreaChart, BarChart, PieChart, RingChart, Sparkline, SignalMeter, HeatBar, SegmentRatioBar |\n| Editing / Utility | CodeEditor, QrCode, Timer, Label, Operation, draggable horizontal and vertical list patterns |\n| Platform / App shell | `liora-tray`, custom window frame, Gallery shell composition, Docs adoption pages, packaging helpers |\n\n## Repository layout\n\n```text\nliora/\n├── crates/\n│   ├── liora/                 # one-stop SDK facade for application dependencies\n│   ├── liora-core/            # global config, theme setup, popper/portal state, unique IDs\n│   ├── liora-theme/           # semantic tokens, light/dark/system theme support\n│   ├── liora-components/      # reusable GPUI components\n│   ├── liora-icons/           # native icon trait and helpers\n│   ├── liora-icons-lucide/    # generated Lucide icon names and paths\n│   ├── liora-tray/            # tray-icon + muda facade for GPUI apps\n│   ├── liora-packager/        # package info, manifests, checksums, backend config\n│   └── liora-updater/         # GitHub Release checks, downloads, checksums, install plans\n├── apps/\n│   ├── liora-gallery/         # native component gallery and showcase application\n│   └── liora-docs/            # native documentation app and Markdown renderer\n├── xtask/                     # cargo run -p xtask -- package ...\n├── packaging/                 # icons, desktop/metainfo, macOS/Windows/Linux package resources\n└── Cargo.toml                 # workspace root\n```\n\n## Quick start\n\n### 1. Install prerequisites\n\nInstall Rust stable and the native dependencies required by GPUI on your platform. On Linux, common development packages include GTK3, Wayland/X11, xkbcommon, fontconfig/freetype, Vulkan, ALSA, and `pkg-config`. The repository also includes `scripts/install-fedora-deps.sh` for Fedora-oriented setup.\n\n### 2. Add Liora to an app\n\n```bash\ncargo add liora\n```\n\nUse lower-level crates such as `liora-components` or `liora-packager` only when a workspace needs a narrower dependency surface.\n\n### Updater module\n\n`liora-updater` is included in the default `liora` facade and can also be used directly:\n\n```bash\ncargo add liora-updater\n```\n\nIt provides a reusable GitHub Release update layer for your own applications: configure the owner/repo, current tag, app name, platform selector, cache directory, checksum asset name, and installer preference. Gallery and Docs use Liora presets, but those presets are not required for other products.\n\n```rust\nuse liora_updater::{\n    AssetKind, AssetSelector, Platform, UpdateRequest, Updater,\n};\n\nlet platform = Platform::current().expect(\"supported desktop platform\");\nlet request = UpdateRequest::new(\n    \"acme-notes\",\n    \"v0.3.0\",\n    platform,\n    std::env::temp_dir().join(\"acme-notes-updates\"),\n)\n.selector(\n    AssetSelector::for_platform(platform)\n        .matching_prefix(\"acme-notes\")\n        .kind_priority([AssetKind::Installer, AssetKind::RawExecutable]),\n);\n\nif let Some(update) = Updater::new(\"acme\", \"acme-notes\")\n    .with_checksum_asset_name(\"SHA256SUMS.txt\")\n    .prepare_update(\u0026request)?\n{\n    // Show update.release_tag(), update.asset.name, and update.install_plan in your UI.\n    // Run update.install_plan.install() only from an explicit user action.\n}\n# Ok::\u003c(), liora_updater::UpdaterError\u003e(())\n```\n\nThe updater can automatically check, download, and verify assets, while installation remains a visible user action because some installer formats require OS elevation or replacing a running executable.\n\n### 3. Run the native Gallery\n\n```bash\ncargo run -p liora-gallery\n```\n\nThe Gallery presents component demos, theme switching, search/filtering, tray controls, toasts, and product-style composition in a native GPUI window.\n\n### 4. Run the native Docs app\n\n```bash\ncargo run -p liora-docs\n```\n\nThe Docs app explains adoption and component usage. It renders Markdown content into native Liora/GPUI elements and shows compile-checked snippets from `apps/liora-docs/content/snippets/`.\n\n### 5. Check the workspace\n\n```bash\ncargo fmt --all --check\ncargo check --workspace --all-targets\ncargo test --workspace\ncargo check -p liora-docs --bin check_snippets\ncargo doc --workspace --no-deps\n```\n\n## Minimal application shape\n\nA Liora-powered GPUI app should initialize theme/config, initialize global services used by selected components, register component key bindings, and then open a GPUI window.\n\n```rust\nuse gpui::{App, Application};\nuse liora::init_liora;\n\nfn main() {\n    Application::new().run(|cx: \u0026mut App| {\n        // Initializes Liora core/theme state, component services, and key bindings.\n        init_liora(cx);\n\n        // cx.open_window(...)\n    });\n}\n```\n\n`liora::init_liora(cx)` follows the operating system by default and also initializes component services plus key bindings. Use `liora::init_liora_with_mode(cx, ThemeMode::Light | ThemeMode::Dark | ThemeMode::System)` when a product wants to choose the startup mode explicitly. The lower-level `liora_components::init_liora(...)` entry point remains available for users who depend on individual crates instead of the facade. Use `Entity\u003cT\u003e` for stateful controls such as `Input`, `Switch`, `Select`, and `CodeEditor` so focus and internal state survive re-rendering. Gallery and Docs are compile-checked references for app shell setup, key binding registration, theme switching, tray behavior, toasts, and composition patterns.\n\n## Component API example\n\nLiora components follow a builder style and render through GPUI-native elements:\n\n```rust\nuse gpui::{div, IntoElement, RenderOnce};\nuse liora::components::{Button, Space, Tag, Text, Title};\n\nstruct WelcomePanel;\n\nimpl RenderOnce for WelcomePanel {\n    fn render(self, _window: \u0026mut gpui::Window, _cx: \u0026mut gpui::App) -\u003e impl IntoElement {\n        div()\n            .child(Title::new(\"Native Rust UI\").level(2))\n            .child(Text::new(\"Build enterprise desktop screens with GPUI and Liora.\"))\n            .child(\n                Space::new()\n                    .child(Button::new(\"Open Gallery\").primary())\n                    .child(Tag::new(\"Pure Rust\").success()),\n            )\n    }\n}\n```\n\nThemes are read from Liora global config inside render paths. Avoid passing theme objects through `.build(theme)`-style APIs.\n\n## Technical differentiators\n\nLiora is more than a component catalog:\n\n- **One-dependency adoption**: `liora` re-exports the maintained public SDK modules so app manifests stay compact while focused crates remain independently usable.\n- **One-call application setup**: `init_liora(cx)` centralizes core configuration, component services, and keyboard bindings so applications do not repeat per-widget setup.\n- **Native Markdown documentation**: Markdown stays as authored content, while the running Docs app renders it into Liora/GPUI nodes and verifies external Rust snippets.\n- **Native charts without a browser layer**: chart primitives use Rust data structures, GPUI paint paths, hit testing, and downsampling instead of a WebView chart runtime.\n- **Application-shell coverage**: tray residency, toasts, theme switching, searchable component navigation, and dashboard-style layouts are exercised in real native apps.\n- **Packaging-aware from the workspace**: installer information, manifests, checksums, backend configs, and dry-run install plans are validated alongside code.\n\n## Documentation map\n\n| Resource | Purpose |\n|---|---|\n| `apps/liora-docs` | Native documentation app, adoption guide, component pages, and compile-checked snippets. |\n| `apps/liora-gallery` | Native component Gallery and app-shell reference surface. |\n| `apps/liora-docs/content/pages/` | Markdown source pages rendered by the native Docs app. |\n| `apps/liora-docs/content/snippets/` | External code snippets referenced by Markdown and checked by `check_snippets`. |\n\n## GPUI dependency and local patch policy\n\nPublished Liora SDK crates depend directly on the official Zed crates.io package `gpui = \"0.2.2\"` (`repository = \"https://github.com/zed-industries/zed\"`). They must not use renamed or community forks, and they must not vendor, publish, or force the local `third_party/zed` patch.\n\nGallery and Docs build the same way by default: official crates.io `gpui`, with platform features enabled only in the final app crates. The repository keeps `third_party/zed` only as non-published upstream-source reference material for the Linux startup-window patch discussion. If you need to verify that local patch, do it on a throwaway branch and apply it only at an application root:\n\n```toml\n[patch.crates-io]\ngpui = { path = \"third_party/zed/crates/gpui\" }\n```\n\nDo not commit that override to publishable Liora crate manifests, and do not publish Liora crates with any `[patch]` section or path GPUI dependency. Downstream products should also stay on official Zed `gpui` unless they deliberately own an application-level upstream-source verification branch.\n\n## Native packaging\n\nRepository-owned packaging readiness is implemented through the published `liora-packager` library plus the repository-local `xtask` command wrapper:\n\n```bash\ncargo run -p xtask -- package validate\ncargo run -p xtask -- package release-readiness\ncargo run -p xtask -- package ci --all-apps --format platform-defaults --dry-run --skip-build\ncargo run -p xtask -- package install-smoke --all-apps --format platform-defaults --dry-run\n```\n\nThe packaging pipeline can generate backend config for AppImage, `.deb`, `.rpm`, macOS `.app` / `.dmg`, Windows NSIS / MSI, and Liora portable `.tar.gz` archives. Signing, notarization, installer smoke tests, and publication are intentionally separated from everyday development commands so application code remains pure Rust + GPUI native.\n\n## Quality gates\n\nBefore publishing or submitting changes, run the same local checks used by the project:\n\n```bash\ncargo fmt --all --check\ncargo check --workspace --all-targets\ncargo test --workspace\ncargo check -p liora-docs --bin check_snippets\ncargo doc --workspace --no-deps\ncargo run -p xtask -- package validate\ncargo run -p xtask -- package ci --all-apps --format platform-defaults --dry-run --skip-build\n```\n\nComponent changes should include the reusable component API, Gallery coverage, native Docs content, external snippets, and focused tests for calculations or interaction behavior.\n\n## Design principles\n\nLiora is designed around a few product-facing rules:\n\n- **Native first**: every component renders through GPUI element trees, native text, native input, and native paint paths.\n- **Application-ready defaults**: theme, overlay, message, keyboard, and selection behavior should work from one setup call.\n- **Composable over prescriptive**: components expose builder-style APIs and stay reusable; product screens and data models belong in applications.\n- **Token-driven visuals**: light/dark/system themes use semantic tokens for surfaces, text, borders, masks, and interaction states.\n- **Performance-aware data UI**: charts and virtualized views include downsampling, hit testing, cache limits, and visible-area rendering patterns.\n\n## Runtime model\n\n`liora::init_liora(cx)` is the recommended application entry point when using the facade crate. `liora_components::init_liora(cx)` provides the same setup for users of the focused components crate. It initializes Liora core/theme state, global component services, and key bindings for interactive controls.\n\nUse `liora::init_liora_with_mode(cx, ThemeMode::Light | ThemeMode::Dark | ThemeMode::System)` when the product needs to choose an explicit startup theme mode. Runtime theme switches still use `apply_theme_mode(window, cx, mode)` from `liora_core`.\n\nStateful controls such as `Input`, `Switch`, `Select`, and `CodeEditor` should live in `gpui::Entity\u003cT\u003e` fields so focus, open state, selections, and text values survive re-rendering.\n\n## Contributing\n\nRead `CONTRIBUTING.md` before opening a pull request. Important boundaries:\n\n- Keep Liora pure Rust + GPUI native.\n- Do not introduce Tauri, WebView, HTML/CSS/DOM, browser runtime, or web chart shells.\n- Do not re-add standalone `examples/minimal-app` or `examples/dashboard-app`.\n- Keep product-specific data models and screen-level helper code out of `liora-components`.\n\n## License\n\nLiora currently uses `LicenseRef-Liora`; see `LICENSE.md`. Do not assume an OSS license until the project maintainer replaces that policy with explicit OSS or commercial terms.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyhyzgn%2Fliora","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fyhyzgn%2Fliora","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyhyzgn%2Fliora/lists"}