This commit is contained in:
me
2026-01-26 21:37:09 +08:00
parent 2c22685b68
commit 2b8f0892f4
5 changed files with 234 additions and 452 deletions

164
CLAUDE.md Normal file
View File

@@ -0,0 +1,164 @@
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## Project Overview
This is a Slint UI component library inspired by shadcn/ui, implementing a comprehensive set of reusable UI components with theme support (light/dark mode), smooth animations, and a modern design system. The project is written in Rust with Slint for the UI layer.
## Build and Development Commands
### Building and Running
```bash
# Build and run the application
cargo run
# Build in release mode
cargo run --release
# Build only (without running)
cargo build
# Clean build artifacts
cargo clean
```
### Development Workflow
- The build process uses `slint-build` (configured in `build.rs`) to compile `.slint` files
- Entry point: `ui/demo.slint` (specified in `build.rs:2`)
- Rust entry point: `src/main.rs`
- Changes to `.slint` files require a rebuild to take effect
## Architecture
### Project Structure
```
ui/
├── demo.slint # Main application entry point
├── appwindow.slint # Basic window component (not used in demo)
├── components/ # Reusable UI components
│ ├── badge.slint
│ ├── button.slint
│ ├── card.slint
│ ├── dialog.slint
│ ├── input.slint
│ ├── item.slint
│ ├── sidebar.slint
│ └── toast.slint
├── theme/ # Design system
│ ├── colors.slint # Color palettes (light/dark)
│ ├── spacing.slint # Spacing and sizing system
│ ├── theme.slint # Global theme manager
│ └── typography.slint # Font system
└── utils/
└── animations.slint # Animation utilities
src/
└── main.rs # Rust application logic
```
### Theme System
The theme system is centralized through a global `Theme` singleton (`ui/theme/theme.slint`):
- **Theme Manager**: `Theme` global provides reactive theme state
- `Theme.is-dark-mode`: Boolean controlling current theme
- `Theme.colors`: Reactive color palette that switches between light/dark
- `Theme.toggle-theme()`: Callback to switch themes
- **Color Palettes**: Defined in `ui/theme/colors.slint`
- `LightColors.palette`: Light mode colors (shadcn zinc theme)
- `DarkColors.palette`: Dark mode colors
- All colors follow the `ColorPalette` struct with semantic naming (primary, secondary, destructive, muted, etc.)
- **Design Tokens**:
- `Typography`: Font sizes, weights, and line heights
- `SpacingSystem`: Consistent spacing scale and border radii
- `Animations`: Duration and easing presets
### Component Architecture
All components follow shadcn/ui design patterns:
1. **Variant-based styling**: Components accept `variant` property (e.g., "default", "destructive", "outline", "secondary", "ghost")
2. **Size variants**: Most components support `size` property ("sm", "md", "lg")
3. **State management**: Visual states (hover, pressed, disabled) use Slint's `states` blocks with sm transitions
4. **Theming**: All components reference `Theme.colors` for reactive theme switching
### Rust-Slint Integration
The Rust code (`src/main.rs`) handles:
- **Component instantiation**: `Demo::new()` creates the UI
- **Callback handlers**: Rust implements callbacks defined in Slint (e.g., `on_add_task`, `on_show_toast`)
- **State management**: Complex state like toast notifications managed via `VecModel` and `ModelRc`
- **Timers**: Auto-dismiss functionality for toasts using `slint::Timer::single_shot()`
Key pattern: Use weak references (`ui.as_weak()`) in callbacks to avoid circular references.
## Component Development Guidelines
### Creating New Components
1. Create `.slint` file in `ui/components/`
2. Import theme system: `import { Theme, Typography, SpacingSystem } from "../theme/theme.slint";`
3. Define component with:
- Public properties (`in property`, `in-out property`)
- Callbacks for interactions
- Private properties for computed values
- Main container with theme-aware styling
- State blocks for interactive feedback
4. Use consistent patterns:
- Border radius: `SpacingSystem.radius.md`
- Spacing: `SpacingSystem.spacing.s2`, `s3`, `s4`, etc.
- Colors: Always reference `Theme.colors.*`
- Animations: Use `Animations.durations.*` and `Animations.ease-*`
### Visual Feedback Pattern
Components use overlay rectangles for hover/press states (see `ui/components/button.slint:59-78`):
- `hover-overlay`: Light overlay (#ffffff15) on hover
- `press-overlay`: Dark overlay (#00000040) on press
- Animate with `Animations.durations.fast` for smooth transitions
### Adding Rust Callbacks
1. Define callback in Slint: `callback my-action(string);`
2. Implement in Rust:
```rust
let ui_weak = ui.as_weak();
ui.on_my_action(move |param| {
let ui = ui_weak.unwrap();
// Handle action
});
```
## Design System Values
### Color Semantic Naming
- `background` / `foreground`: Base colors
- `primary` / `primary-foreground`: Primary actions
- `secondary` / `secondary-foreground`: Secondary actions
- `destructive` / `destructive-foreground`: Dangerous actions
- `muted` / `muted-foreground`: Subtle/disabled states
- `border`, `input`, `ring`: UI element colors
### Spacing Scale
- `s1` through `s12`: Incremental spacing (s1 = 4px, s2 = 8px, etc.)
- `radius`: Border radius variants (sm, md, lg, full)
### Typography Scale
- Sizes: `xs`, `sm`, `base`, `lg`, `xl`, `2xl`, `3xl`
- Weights: `normal`, `medium`, `semibold`, `bold`
## Current Demo Application
The demo (`ui/demo.slint`) showcases a task manager with three views:
- **Tasks**: Add/manage tasks with cards, badges, and toasts
- **Components**: Visual showcase of all component variants
- **Settings**: Theme toggle and app information
The sidebar navigation uses a collapsible pattern with icon + label layout.

410
Cargo.lock generated
View File

@@ -18,96 +18,6 @@ version = "0.1.10"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "366ffbaa4442f4684d91e2cd7c5ea7c4ed8add41959a31447066e279e432b618" checksum = "366ffbaa4442f4684d91e2cd7c5ea7c4ed8add41959a31447066e279e432b618"
[[package]]
name = "accesskit"
version = "0.21.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cf203f9d3bd8f29f98833d1fbef628df18f759248a547e7e01cfbf63cda36a99"
[[package]]
name = "accesskit_atspi_common"
version = "0.14.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "890d241cf51fc784f0ac5ac34dfc847421f8d39da6c7c91a0fcc987db62a8267"
dependencies = [
"accesskit",
"accesskit_consumer",
"atspi-common",
"serde",
"thiserror 1.0.69",
"zvariant",
]
[[package]]
name = "accesskit_consumer"
version = "0.31.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "db81010a6895d8707f9072e6ce98070579b43b717193d2614014abd5cb17dd43"
dependencies = [
"accesskit",
"hashbrown 0.15.5",
]
[[package]]
name = "accesskit_macos"
version = "0.22.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a0089e5c0ac0ca281e13ea374773898d9354cc28d15af9f0f7394d44a495b575"
dependencies = [
"accesskit",
"accesskit_consumer",
"hashbrown 0.15.5",
"objc2 0.5.2",
"objc2-app-kit 0.2.2",
"objc2-foundation 0.2.2",
]
[[package]]
name = "accesskit_unix"
version = "0.17.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "301e55b39cfc15d9c48943ce5f572204a551646700d0e8efa424585f94fec528"
dependencies = [
"accesskit",
"accesskit_atspi_common",
"async-channel",
"async-executor",
"async-task",
"atspi",
"futures-lite",
"futures-util",
"serde",
"zbus",
]
[[package]]
name = "accesskit_windows"
version = "0.29.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d2d63dd5041e49c363d83f5419a896ecb074d309c414036f616dc0b04faca971"
dependencies = [
"accesskit",
"accesskit_consumer",
"hashbrown 0.15.5",
"static_assertions",
"windows 0.61.3",
"windows-core 0.61.2",
]
[[package]]
name = "accesskit_winit"
version = "0.29.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c8cfabe59d0eaca7412bfb1f70198dd31e3b0496fee7e15b066f9c36a1a140a0"
dependencies = [
"accesskit",
"accesskit_macos",
"accesskit_unix",
"accesskit_windows",
"raw-window-handle",
"winit",
]
[[package]] [[package]]
name = "adler2" name = "adler2"
version = "2.0.1" version = "2.0.1"
@@ -383,56 +293,6 @@ version = "1.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0"
[[package]]
name = "atspi"
version = "0.25.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c83247582e7508838caf5f316c00791eee0e15c0bf743e6880585b867e16815c"
dependencies = [
"atspi-common",
"atspi-connection",
"atspi-proxies",
]
[[package]]
name = "atspi-common"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "33dfc05e7cdf90988a197803bf24f5788f94f7c94a69efa95683e8ffe76cfdfb"
dependencies = [
"enumflags2",
"serde",
"static_assertions",
"zbus",
"zbus-lockstep",
"zbus-lockstep-macros",
"zbus_names",
"zvariant",
]
[[package]]
name = "atspi-connection"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4193d51303d8332304056ae0004714256b46b6635a5c556109b319c0d3784938"
dependencies = [
"atspi-common",
"atspi-proxies",
"futures-lite",
"zbus",
]
[[package]]
name = "atspi-proxies"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d2eebcb9e7e76f26d0bcfd6f0295e1cd1e6f33bedbc5698a971db8dc43d7751c"
dependencies = [
"atspi-common",
"serde",
"zbus",
]
[[package]] [[package]]
name = "auto_enums" name = "auto_enums"
version = "0.8.7" version = "0.8.7"
@@ -638,12 +498,6 @@ dependencies = [
"syn", "syn",
] ]
[[package]]
name = "byteorder"
version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
[[package]] [[package]]
name = "byteorder-lite" name = "byteorder-lite"
version = "0.1.0" version = "0.1.0"
@@ -765,7 +619,7 @@ dependencies = [
"js-sys", "js-sys",
"num-traits", "num-traits",
"wasm-bindgen", "wasm-bindgen",
"windows-link 0.2.1", "windows-link",
] ]
[[package]] [[package]]
@@ -943,56 +797,6 @@ version = "3.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7704b5fdd17b18ae31c4c1da5a2e0305a2bf17b5249300a9ee9ed7b72114c636" checksum = "7704b5fdd17b18ae31c4c1da5a2e0305a2bf17b5249300a9ee9ed7b72114c636"
[[package]]
name = "cpp"
version = "0.5.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f36bcac3d8234c1fb813358e83d1bb6b0290a3d2b3b5efc6b88bfeaf9d8eec17"
dependencies = [
"cpp_macros",
]
[[package]]
name = "cpp_build"
version = "0.5.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "27f8638c97fbd79cc6fc80b616e0e74b49bac21014faed590bbc89b7e2676c90"
dependencies = [
"cc",
"cpp_common",
"lazy_static",
"proc-macro2",
"regex",
"syn",
"unicode-xid",
]
[[package]]
name = "cpp_common"
version = "0.5.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "25fcfea2ee05889597d35e986c2ad0169694320ae5cc8f6d2640a4bb8a884560"
dependencies = [
"lazy_static",
"proc-macro2",
"syn",
]
[[package]]
name = "cpp_macros"
version = "0.5.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d156158fe86e274820f5a53bc9edb0885a6e7113909497aa8d883b69dd171871"
dependencies = [
"aho-corasick",
"byteorder",
"cpp_common",
"lazy_static",
"proc-macro2",
"quote",
"syn",
]
[[package]] [[package]]
name = "crc32fast" name = "crc32fast"
version = "1.5.0" version = "1.5.0"
@@ -1641,7 +1445,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1bd49230192a3797a9a4d6abe9b3eed6f7fa4c8a8a4947977c6f80025f92cbd8" checksum = "1bd49230192a3797a9a4d6abe9b3eed6f7fa4c8a8a4947977c6f80025f92cbd8"
dependencies = [ dependencies = [
"rustix 1.1.3", "rustix 1.1.3",
"windows-link 0.2.1", "windows-link",
] ]
[[package]] [[package]]
@@ -1849,7 +1653,6 @@ version = "1.14.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d8fd06c00fbdac3dd490cf5c10da7daad3820d775060a19ea277d8ab944a160b" checksum = "d8fd06c00fbdac3dd490cf5c10da7daad3820d775060a19ea277d8ab944a160b"
dependencies = [ dependencies = [
"bytemuck",
"calloop 0.14.3", "calloop 0.14.3",
"drm", "drm",
"gbm", "gbm",
@@ -1858,31 +1661,11 @@ dependencies = [
"i-slint-core", "i-slint-core",
"i-slint-renderer-femtovg", "i-slint-renderer-femtovg",
"input", "input",
"memmap2",
"nix", "nix",
"raw-window-handle", "raw-window-handle",
"xkbcommon", "xkbcommon",
] ]
[[package]]
name = "i-slint-backend-qt"
version = "1.14.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c946891ff0bfa95a5944c7cfc18828b8e123edea1168301f1e1b5505aa82933e"
dependencies = [
"const-field-offset",
"cpp",
"cpp_build",
"i-slint-common",
"i-slint-core",
"i-slint-core-macros",
"lyon_path",
"pin-project",
"pin-weak",
"qttypes",
"vtable",
]
[[package]] [[package]]
name = "i-slint-backend-selector" name = "i-slint-backend-selector"
version = "1.14.1" version = "1.14.1"
@@ -1891,7 +1674,6 @@ checksum = "e138660c634d6bbdf98bb2d0cfa487cda28e032e133a2a2c974f1cc494198765"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"i-slint-backend-linuxkms", "i-slint-backend-linuxkms",
"i-slint-backend-qt",
"i-slint-backend-winit", "i-slint-backend-winit",
"i-slint-common", "i-slint-common",
"i-slint-core", "i-slint-core",
@@ -1904,9 +1686,6 @@ version = "1.14.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "69bf9167fb1165942ef1f034e039645b60b07b23c0c76069cb83595f979243a4" checksum = "69bf9167fb1165942ef1f034e039645b60b07b23c0c76069cb83595f979243a4"
dependencies = [ dependencies = [
"accesskit",
"accesskit_winit",
"bytemuck",
"cfg-if", "cfg-if",
"cfg_aliases", "cfg_aliases",
"copypasta", "copypasta",
@@ -1919,13 +1698,11 @@ dependencies = [
"i-slint-core-macros", "i-slint-core-macros",
"i-slint-renderer-femtovg", "i-slint-renderer-femtovg",
"i-slint-renderer-skia", "i-slint-renderer-skia",
"imgref",
"lyon_path", "lyon_path",
"muda", "muda",
"objc2-app-kit 0.3.2", "objc2-app-kit 0.3.2",
"pin-weak", "pin-weak",
"raw-window-handle", "raw-window-handle",
"rgb",
"scoped-tls-hkt", "scoped-tls-hkt",
"scopeguard", "scopeguard",
"softbuffer", "softbuffer",
@@ -1986,14 +1763,12 @@ checksum = "dc140f1218cfc4451b9e8753306c42afbcaf0386cc888e53664c1a5f5330ae19"
dependencies = [ dependencies = [
"auto_enums", "auto_enums",
"bitflags 2.10.0", "bitflags 2.10.0",
"bytemuck",
"cfg-if", "cfg-if",
"chrono", "chrono",
"clru", "clru",
"const-field-offset", "const-field-offset",
"derive_more", "derive_more",
"euclid", "euclid",
"fontdue",
"i-slint-common", "i-slint-common",
"i-slint-core-macros", "i-slint-core-macros",
"image", "image",
@@ -2013,7 +1788,6 @@ dependencies = [
"rgb", "rgb",
"scoped-tls-hkt", "scoped-tls-hkt",
"scopeguard", "scopeguard",
"skrifa",
"slab", "slab",
"strum", "strum",
"sys-locale", "sys-locale",
@@ -2434,12 +2208,6 @@ dependencies = [
"smallvec", "smallvec",
] ]
[[package]]
name = "lazy_static"
version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
[[package]] [[package]]
name = "lebe" name = "lebe"
version = "0.5.3" version = "0.5.3"
@@ -2469,7 +2237,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"windows-link 0.2.1", "windows-link",
] ]
[[package]] [[package]]
@@ -3473,17 +3241,6 @@ dependencies = [
"bytemuck", "bytemuck",
] ]
[[package]]
name = "qttypes"
version = "0.2.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c7edf5b38c97ad8900ad2a8418ee44b4adceaa866a4a3405e2f1c909871d7ebd"
dependencies = [
"cpp",
"cpp_build",
"semver",
]
[[package]] [[package]]
name = "quick-error" name = "quick-error"
version = "2.0.1" version = "2.0.1"
@@ -3497,7 +3254,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b66c2058c55a409d601666cffe35f04333cf1013010882cec174a7467cd4e21c" checksum = "b66c2058c55a409d601666cffe35f04333cf1013010882cec174a7467cd4e21c"
dependencies = [ dependencies = [
"memchr", "memchr",
"serde",
] ]
[[package]] [[package]]
@@ -4020,7 +3776,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9c35c4bdca2c42c69b21ceb416aa4ba76c3f54df30e9ce85dcad0742229422a6" checksum = "9c35c4bdca2c42c69b21ceb416aa4ba76c3f54df30e9ce85dcad0742229422a6"
dependencies = [ dependencies = [
"const-field-offset", "const-field-offset",
"i-slint-backend-qt",
"i-slint-backend-selector", "i-slint-backend-selector",
"i-slint-core", "i-slint-core",
"i-slint-core-macros", "i-slint-core-macros",
@@ -4208,12 +3963,6 @@ version = "1.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596"
[[package]]
name = "static_assertions"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
[[package]] [[package]]
name = "strict-num" name = "strict-num"
version = "0.1.1" version = "0.1.1"
@@ -4699,9 +4448,9 @@ checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"
[[package]] [[package]]
name = "uuid" name = "uuid"
version = "1.19.0" version = "1.20.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e2e054861b4bd027cd373e18e8d8d8e6548085000e41290d95ce0c373a654b4a" checksum = "ee48d38b119b0cd71fe4141b30f5ba9c7c5d9f4e7a3a8b4a674e4b6ef789976f"
dependencies = [ dependencies = [
"js-sys", "js-sys",
"serde_core", "serde_core",
@@ -5028,38 +4777,16 @@ dependencies = [
"windows-targets 0.52.6", "windows-targets 0.52.6",
] ]
[[package]]
name = "windows"
version = "0.61.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893"
dependencies = [
"windows-collections 0.2.0",
"windows-core 0.61.2",
"windows-future 0.2.1",
"windows-link 0.1.3",
"windows-numerics 0.2.0",
]
[[package]] [[package]]
name = "windows" name = "windows"
version = "0.62.2" version = "0.62.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "527fadee13e0c05939a6a05d5bd6eec6cd2e3dbd648b9f8e447c6518133d8580" checksum = "527fadee13e0c05939a6a05d5bd6eec6cd2e3dbd648b9f8e447c6518133d8580"
dependencies = [ dependencies = [
"windows-collections 0.3.2", "windows-collections",
"windows-core 0.62.2", "windows-core 0.62.2",
"windows-future 0.3.2", "windows-future",
"windows-numerics 0.3.1", "windows-numerics",
]
[[package]]
name = "windows-collections"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8"
dependencies = [
"windows-core 0.61.2",
] ]
[[package]] [[package]]
@@ -5084,19 +4811,6 @@ dependencies = [
"windows-targets 0.52.6", "windows-targets 0.52.6",
] ]
[[package]]
name = "windows-core"
version = "0.61.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3"
dependencies = [
"windows-implement 0.60.2",
"windows-interface 0.59.3",
"windows-link 0.1.3",
"windows-result 0.3.4",
"windows-strings 0.4.2",
]
[[package]] [[package]]
name = "windows-core" name = "windows-core"
version = "0.62.2" version = "0.62.2"
@@ -5105,22 +4819,11 @@ checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb"
dependencies = [ dependencies = [
"windows-implement 0.60.2", "windows-implement 0.60.2",
"windows-interface 0.59.3", "windows-interface 0.59.3",
"windows-link 0.2.1", "windows-link",
"windows-result 0.4.1", "windows-result 0.4.1",
"windows-strings 0.5.1", "windows-strings 0.5.1",
] ]
[[package]]
name = "windows-future"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e"
dependencies = [
"windows-core 0.61.2",
"windows-link 0.1.3",
"windows-threading 0.1.0",
]
[[package]] [[package]]
name = "windows-future" name = "windows-future"
version = "0.3.2" version = "0.3.2"
@@ -5128,8 +4831,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e1d6f90251fe18a279739e78025bd6ddc52a7e22f921070ccdc67dde84c605cb" checksum = "e1d6f90251fe18a279739e78025bd6ddc52a7e22f921070ccdc67dde84c605cb"
dependencies = [ dependencies = [
"windows-core 0.62.2", "windows-core 0.62.2",
"windows-link 0.2.1", "windows-link",
"windows-threading 0.2.1", "windows-threading",
] ]
[[package]] [[package]]
@@ -5176,28 +4879,12 @@ dependencies = [
"syn", "syn",
] ]
[[package]]
name = "windows-link"
version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a"
[[package]] [[package]]
name = "windows-link" name = "windows-link"
version = "0.2.1" version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5"
[[package]]
name = "windows-numerics"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1"
dependencies = [
"windows-core 0.61.2",
"windows-link 0.1.3",
]
[[package]] [[package]]
name = "windows-numerics" name = "windows-numerics"
version = "0.3.1" version = "0.3.1"
@@ -5205,7 +4892,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6e2e40844ac143cdb44aead537bbf727de9b044e107a0f1220392177d15b0f26" checksum = "6e2e40844ac143cdb44aead537bbf727de9b044e107a0f1220392177d15b0f26"
dependencies = [ dependencies = [
"windows-core 0.62.2", "windows-core 0.62.2",
"windows-link 0.2.1", "windows-link",
] ]
[[package]] [[package]]
@@ -5217,22 +4904,13 @@ dependencies = [
"windows-targets 0.52.6", "windows-targets 0.52.6",
] ]
[[package]]
name = "windows-result"
version = "0.3.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6"
dependencies = [
"windows-link 0.1.3",
]
[[package]] [[package]]
name = "windows-result" name = "windows-result"
version = "0.4.1" version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5"
dependencies = [ dependencies = [
"windows-link 0.2.1", "windows-link",
] ]
[[package]] [[package]]
@@ -5245,22 +4923,13 @@ dependencies = [
"windows-targets 0.52.6", "windows-targets 0.52.6",
] ]
[[package]]
name = "windows-strings"
version = "0.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57"
dependencies = [
"windows-link 0.1.3",
]
[[package]] [[package]]
name = "windows-strings" name = "windows-strings"
version = "0.5.1" version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091"
dependencies = [ dependencies = [
"windows-link 0.2.1", "windows-link",
] ]
[[package]] [[package]]
@@ -5314,7 +4983,7 @@ version = "0.61.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc"
dependencies = [ dependencies = [
"windows-link 0.2.1", "windows-link",
] ]
[[package]] [[package]]
@@ -5369,7 +5038,7 @@ version = "0.53.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3"
dependencies = [ dependencies = [
"windows-link 0.2.1", "windows-link",
"windows_aarch64_gnullvm 0.53.1", "windows_aarch64_gnullvm 0.53.1",
"windows_aarch64_msvc 0.53.1", "windows_aarch64_msvc 0.53.1",
"windows_i686_gnu 0.53.1", "windows_i686_gnu 0.53.1",
@@ -5380,22 +5049,13 @@ dependencies = [
"windows_x86_64_msvc 0.53.1", "windows_x86_64_msvc 0.53.1",
] ]
[[package]]
name = "windows-threading"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6"
dependencies = [
"windows-link 0.1.3",
]
[[package]] [[package]]
name = "windows-threading" name = "windows-threading"
version = "0.2.1" version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3949bd5b99cafdf1c7ca86b43ca564028dfe27d66958f2470940f73d86d75b37" checksum = "3949bd5b99cafdf1c7ca86b43ca564028dfe27d66958f2470940f73d86d75b37"
dependencies = [ dependencies = [
"windows-link 0.2.1", "windows-link",
] ]
[[package]] [[package]]
@@ -5845,30 +5505,6 @@ dependencies = [
"zvariant", "zvariant",
] ]
[[package]]
name = "zbus-lockstep"
version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6998de05217a084b7578728a9443d04ea4cd80f2a0839b8d78770b76ccd45863"
dependencies = [
"zbus_xml",
"zvariant",
]
[[package]]
name = "zbus-lockstep-macros"
version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "10da05367f3a7b7553c8cdf8fa91aee6b64afebe32b51c95177957efc47ca3a0"
dependencies = [
"proc-macro2",
"quote",
"syn",
"zbus-lockstep",
"zbus_xml",
"zvariant",
]
[[package]] [[package]]
name = "zbus_macros" name = "zbus_macros"
version = "5.13.2" version = "5.13.2"
@@ -5895,18 +5531,6 @@ dependencies = [
"zvariant", "zvariant",
] ]
[[package]]
name = "zbus_xml"
version = "5.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "441a0064125265655bccc3a6af6bef56814d9277ac83fce48b1cd7e160b80eac"
dependencies = [
"quick-xml",
"serde",
"zbus_names",
"zvariant",
]
[[package]] [[package]]
name = "zeno" name = "zeno"
version = "0.3.3" version = "0.3.3"

View File

@@ -4,7 +4,14 @@ version = "0.0.1"
edition = "2024" edition = "2024"
[dependencies] [dependencies]
slint = { version = "1.14" } slint = { version = "1.14", default-features = false, features = ["backend-winit", "renderer-femtovg", "compat-1-2"] }
[build-dependencies] [build-dependencies]
slint-build = "1.14" slint-build = "1.14"
[profile.release]
opt-level = 'z' # 优化代码体积
lto = true # 开启链接时优化
codegen-units = 1 # 牺牲编译速度换取更好的代码质量
strip = true # 自动移除调试符号

View File

@@ -10,7 +10,7 @@ export component Button {
in property <string> variant: "default"; // default | destructive | outline | secondary | ghost in property <string> variant: "default"; // default | destructive | outline | secondary | ghost
in property <string> size: "md"; // sm | md | lg in property <string> size: "md"; // sm | md | lg
in property <bool> disabled: false; in property <bool> disabled: false;
// Callbacks // Callbacks
callback clicked(); callback clicked();
@@ -48,42 +48,20 @@ export component Button {
border-radius: SpacingSystem.radius.md; border-radius: SpacingSystem.radius.md;
border-width: variant == "outline" ? 1px : 0px; border-width: variant == "outline" ? 1px : 0px;
border-color: Theme.colors.border; border-color: Theme.colors.border;
// Smooth transitions // Smooth transitions
animate background { animate background {
duration: Animations.durations.fast; duration: Animations.durations.fast;
easing: Animations.ease-in-out; easing: Animations.ease-in-out;
} }
// Hover overlay - light mask
hover-overlay := Rectangle {
background: Colors.transparent;
border-radius: SpacingSystem.radius.md;
animate background {
duration: Animations.durations.fast;
easing: Animations.ease-in-out;
}
}
// Press overlay - darker mask
press-overlay := Rectangle {
background: Colors.transparent;
border-radius: SpacingSystem.radius.md;
animate background {
duration: 100ms;
easing: Animations.ease-out;
}
}
// Content layout // Content layout
HorizontalLayout { HorizontalLayout {
padding-left: btn-padding-x; padding-left: btn-padding-x;
padding-right: btn-padding-x; padding-right: btn-padding-x;
spacing: SpacingSystem.spacing.s2; spacing: SpacingSystem.spacing.s2;
alignment: center; alignment: center;
// Button text // Button text
Text { Text {
text: root.text; text: root.text;
@@ -94,32 +72,39 @@ export component Button {
horizontal-alignment: center; horizontal-alignment: center;
} }
} }
// Touch interaction area // Touch interaction area
touch := TouchArea { touch := TouchArea {
enabled: !disabled; enabled: !disabled;
clicked => { clicked => {
root.clicked(); root.clicked();
} }
} }
// States for visual feedback with color overlays // Combined overlay for both hover and press effects
states [ overlay := Rectangle {
pressed when touch.pressed && !disabled: { width: 100%;
press-overlay.background: #00000040; // Dark overlay for press height: 100%;
border-radius: SpacingSystem.radius.md;
// 直接根据状态设置背景色,不使用 states 块
background: {
if disabled {
Colors.transparent
} else if touch.pressed {
#00000030 // 按压时深色
} else if touch.has-hover {
#ffffff10 // 悬停时浅色
} else {
Colors.transparent
}
};
animate background {
duration: 200ms;
easing: ease-in-out;
} }
hovered when touch.has-hover && !disabled && !touch.pressed: { }
hover-overlay.background: #ffffff15; // Light overlay for hover
}
normal when !disabled: {
hover-overlay.background: Colors.transparent;
press-overlay.background: Colors.transparent;
}
disabled-state when disabled: {
hover-overlay.background: Colors.transparent;
press-overlay.background: Colors.transparent;
}
]
} }
} }

View File

@@ -14,12 +14,12 @@ import { ToastContainer, ToastMessage } from "components/toast.slint";
export component Demo inherits Window { export component Demo inherits Window {
title: "Slint Shadcn UI - Task Manager Demo"; title: "Slint Shadcn UI - Task Manager Demo";
background: Theme.colors.background; background: Theme.colors.background;
// Window size settings - now resizable // Window size settings - reduced for lower memory usage
min-width: 800px; min-width: 800px;
min-height: 600px; min-height: 600px;
preferred-width: 1400px; preferred-width: 1000px;
preferred-height: 900px; preferred-height: 700px;
// Application state // Application state
in-out property <string> new-task-title: ""; in-out property <string> new-task-title: "";
@@ -95,25 +95,27 @@ export component Demo inherits Window {
Sidebar { Sidebar {
items: nav-items; items: nav-items;
collapsed: sidebar-collapsed; collapsed: sidebar-collapsed;
item-clicked(index) => { item-clicked(index) => {
if index == 0 { current-view = "tasks"; } if index == 0 { current-view = "tasks"; }
else if index == 1 { current-view = "components"; } else if index == 1 { current-view = "components"; }
else if index == 2 { current-view = "settings"; } else if index == 2 { current-view = "settings"; }
} }
toggle-collapsed => { toggle-collapsed => {
sidebar-collapsed = !sidebar-collapsed; sidebar-collapsed = !sidebar-collapsed;
} }
} }
// Main content area - fixed height // Main content area
Rectangle { Rectangle {
background: Theme.colors.background; background: Theme.colors.background;
horizontal-stretch: 1;
vertical-stretch: 1;
Flickable { Flickable {
width: 100%; width: 100%;
height: parent.height; height: 100%;
viewport-height: content-layout.preferred-height; viewport-height: content-layout.preferred-height;
content-layout := VerticalLayout { content-layout := VerticalLayout {