Files
mcalc/AGENTS.md

3.2 KiB

MCALC Agent Guidelines

Project Overview

A simple Dioxus calculator application. Uses Dioxus 0.7 for UI with static CSS styling.

Build Commands

# Development
cargo run                    # Run desktop app (default feature)
cargo run --features web     # Run web version

# Build
cargo build                  # Debug build
cargo build --release        # Release build

# Testing
cargo test                   # Run all tests
cargo test <test_name>       # Run specific test

# Linting & Formatting
cargo fmt                    # Format code
cargo fmt -- --check         # Check formatting without changes
cargo clippy                 # Run linter
cargo clippy -- -D warnings  # Lint with deny warnings

Code Style

Formatting

  • Use cargo fmt with default rustfmt settings
  • 4-space indentation
  • Maximum line length: 100 characters

Naming Conventions

  • Components: PascalCase (e.g., Calculator, DisplayArea)
  • Functions/Methods: snake_case (e.g., calculate_result, input_digit)
  • Signals: snake_case with _ suffix convention (e.g., first_num, operator)
  • Types/Enums: PascalCase

Imports

  • Group 1: use dioxus::prelude::* (Dioxus core)
  • Group 2: use crate:: (local modules)
  • Standard library imports last

Components (Dioxus 0.7)

  • Prefix with #[allow(non_snake_case)] if needed
  • Props must be owned values (use String not &str)
  • Use Signal<T> for reactive state
  • Components return Element
#[component]
fn MyComponent(mut value: Signal<String>) -> Element {
    rsx! { div { "{value}" } }
}

State Management

  • Use use_signal(|| initial_value) for local state
  • Use .write() for mutable access, .read() for references
  • Prefer *signal.write() = value over signal.set(value) for direct mutation

Error Handling

  • Prefer early returns with return or ? operator
  • Use Result<T, E> for fallible operations
  • Silent failures acceptable for user input parsing (graceful degradation)

CSS Guidelines

  • CSS files in /assets/main.css
  • Use CSS custom properties (variables) for theming
  • Follow BYTEMALTE design system colors when applicable
  • Class naming: kebab-case (e.g., btn-number, display-area)

File Structure

src/
  main.rs        # App entry point
  ui.rs          # UI components
  logic.rs       # Business logic
assets/
  main.css       # Global styles
public/          # Static assets served at root

Design System (BYTEMALTE)

When modifying CSS, follow these conventions:

Element Border Radius
Buttons 8px
Cards 16px
Inputs 8px

Colors:

  • Primary: #8888FF
  • Secondary: #3DDC84
  • Background: #0F172A
  • Surface: #1E293B
  • Error: #EF4444

Dioxus 0.7 Reference

Components

#[component]
fn App() -> Element {
    let mut count = use_signal(|| 0);
    rsx! {
        button { onclick: move |_| *count.write() += 1, "{count}" }
    }
}

Signals

let mut value = use_signal(|| String::new());
value();           // clone value
value.read();      // &T reference
value.write();     // &mut T

RSX Patterns

rsx! {
    div {
        for item in items { span { "{item}" } }
        if condition { p { "Shown" } }
    }
}