feat: Initial release v0.1.0 - 52 Leptos ShadCN UI components

This commit is contained in:
Peter Hanssens
2025-09-02 20:52:45 +10:00
commit d90684d6dc
618 changed files with 54196 additions and 0 deletions

66
.github/workflows/ci.yml vendored Normal file
View File

@@ -0,0 +1,66 @@
name: CI
on:
pull_request: {}
push:
branches:
- main
permissions:
contents: read
jobs:
lint:
name: Lint
runs-on: ubuntu-latest
env:
RUSTFLAGS: '-Dwarnings'
steps:
- name: Checkout
uses: actions/checkout@v5
- name: Set up Rust toolchain
uses: actions-rust-lang/setup-rust-toolchain@v1
with:
components: clippy, rustfmt
target: wasm32-unknown-unknown
- name: Install Cargo Binary Install
uses: cargo-bins/cargo-binstall@main
- name: Install crates
run: cargo binstall -y --force cargo-deny cargo-machete cargo-sort
- name: Lint
run: cargo clippy --all-features --locked
- name: Check dependencies
run: cargo deny check
- name: Check unused dependencies
run: cargo machete
- name: Check manifest formatting
run: cargo sort --workspace --check
- name: Check formatting
run: cargo fmt --all --check
test:
name: Test
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v5
- name: Set up Rust toolchain
uses: actions-rust-lang/setup-rust-toolchain@v1
with:
components: clippy, rustfmt
target: wasm32-unknown-unknown
- name: Test
run: cargo test --all-features --locked --release

20
.github/workflows/labels.yml vendored Normal file
View File

@@ -0,0 +1,20 @@
name: Labels
on:
workflow_dispatch:
permissions:
issues: write
jobs:
sync-labels:
name: Sync Labels
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
with:
sparse-checkout: .github/labels.yml
- uses: EndBug/label-sync@v2
with:
config-file: .github/labels.yml

241
.github/workflows/test-radio-group.yml vendored Normal file
View File

@@ -0,0 +1,241 @@
name: Test RadioGroup Component
on:
push:
branches: [ main, develop ]
paths:
- 'packages/yew/radio-group/**'
- 'packages/leptos/radio-group/**'
- 'packages/test-utils/**'
- 'tests/radio_group_integration_test.rs'
- 'scripts/test_radio_group.sh'
pull_request:
branches: [ main, develop ]
paths:
- 'packages/yew/radio-group/**'
- 'packages/leptos/radio-group/**'
- 'packages/test-utils/**'
- 'tests/radio_group_integration_test.rs'
- 'scripts/test_radio_group.sh'
jobs:
test-radio-group:
name: RadioGroup Component Tests
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Rust toolchain
uses: actions-rs/toolchain@v1
with:
toolchain: stable
target: wasm32-unknown-unknown
override: true
- name: Cache Rust dependencies
uses: actions/cache@v3
with:
path: |
~/.cargo/registry
~/.cargo/git
target
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
restore-keys: |
${{ runner.os }}-cargo-
- name: Install wasm-pack
run: cargo install wasm-pack
- name: Install Node.js
uses: actions/setup-node@v3
with:
node-version: '18'
cache: 'npm'
- name: Install test dependencies
run: |
npm install -g wasm-bindgen-cli
npm install -g wasm-bindgen-test-runner
- name: Build test utilities
run: cargo build -p shadcn-ui-test-utils
- name: Run Yew RadioGroup tests
run: cargo test -p shadcn-ui-yew-radio-group --lib
- name: Run Leptos RadioGroup tests
run: cargo test -p shadcn-ui-leptos-radio-group --lib
- name: Run integration tests
run: cargo test --test radio_group_integration_test
- name: Run cross-framework parity tests
run: cargo test test_radio_group_cross_framework_parity
- name: Run theme consistency tests
run: cargo test test_radio_group_theme_consistency
- name: Run accessibility tests
run: cargo test test_radio_group_accessibility_features
- name: Run registry integration tests
run: cargo test test_radio_group_registry_integration
- name: Run property validation tests
run: cargo test test_radio_group_property_validation
- name: Build components
run: |
cargo build -p shadcn-ui-yew-radio-group
cargo build -p shadcn-ui-leptos-radio-group
- name: Generate documentation
run: |
cargo doc -p shadcn-ui-yew-radio-group --no-deps
cargo doc -p shadcn-ui-leptos-radio-group --no-deps
- name: Run comprehensive test script
run: ./scripts/test_radio_group.sh
- name: Upload test results
uses: actions/upload-artifact@v3
if: always()
with:
name: radio-group-test-results
path: |
target/test-results/
target/doc/
retention-days: 7
test-browser:
name: Browser Tests
runs-on: ubuntu-latest
needs: test-radio-group
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Rust toolchain
uses: actions-rs/toolchain@v1
with:
toolchain: stable
target: wasm32-unknown-unknown
override: true
- name: Install wasm-pack
run: cargo install wasm-pack
- name: Install Node.js
uses: actions/setup-node@v3
with:
node-version: '18'
cache: 'npm'
- name: Install browser test dependencies
run: |
npm install -g wasm-bindgen-cli
npm install -g wasm-bindgen-test-runner
npm install -g playwright
npx playwright install
- name: Run Yew browser tests
run: |
wasm-pack test --headless --firefox packages/yew/radio-group
wasm-pack test --headless --chrome packages/yew/radio-group
- name: Run Leptos browser tests
run: |
wasm-pack test --headless --firefox packages/leptos/radio-group
wasm-pack test --headless --chrome packages/leptos/radio-group
test-examples:
name: Example Tests
runs-on: ubuntu-latest
needs: test-radio-group
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Rust toolchain
uses: actions-rs/toolchain@v1
with:
toolchain: stable
target: wasm32-unknown-unknown
override: true
- name: Install wasm-pack
run: cargo install wasm-pack
- name: Install Node.js
uses: actions/setup-node@v3
with:
node-version: '18'
cache: 'npm'
- name: Build Leptos examples
run: |
cd book-examples/leptos
cargo build --features radio-group
- name: Build Yew examples
run: |
cd book-examples/yew
cargo build --features radio-group
- name: Test example components
run: |
cargo test -p book-examples-leptos --features radio-group
cargo test -p book-examples-yew --features radio-group
lint-and-format:
name: Lint and Format
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Rust toolchain
uses: actions-rs/toolchain@v1
with:
toolchain: stable
override: true
- name: Install clippy
run: rustup component add clippy
- name: Run clippy
run: |
cargo clippy -p shadcn-ui-yew-radio-group
cargo clippy -p shadcn-ui-leptos-radio-group
cargo clippy -p shadcn-ui-test-utils
- name: Check formatting
run: |
cargo fmt --check -p shadcn-ui-yew-radio-group
cargo fmt --check -p shadcn-ui-leptos-radio-group
cargo fmt --check -p shadcn-ui-test-utils
security-audit:
name: Security Audit
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Rust toolchain
uses: actions-rs/toolchain@v1
with:
toolchain: stable
override: true
- name: Install cargo-audit
run: cargo install cargo-audit
- name: Run security audit
run: cargo audit

305
.github/workflows/test-tooltip.yml vendored Normal file
View File

@@ -0,0 +1,305 @@
name: Test Tooltip Component
on:
push:
branches: [ main, develop ]
paths:
- 'packages/*/tooltip/**'
- 'tests/tooltip_integration_test.rs'
- 'scripts/test_tooltip.sh'
- '.github/workflows/test-tooltip.yml'
pull_request:
branches: [ main ]
paths:
- 'packages/*/tooltip/**'
- 'tests/tooltip_integration_test.rs'
- 'scripts/test_tooltip.sh'
- '.github/workflows/test-tooltip.yml'
env:
CARGO_TERM_COLOR: always
RUST_BACKTRACE: 1
jobs:
test-tooltip:
name: Test Tooltip Component
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
with:
targets: wasm32-unknown-unknown
components: clippy, rustfmt
- name: Install wasm-pack
uses: jetli/wasm-pack-action@v0.4.0
with:
version: 'latest'
- name: Cache cargo registry
uses: actions/cache@v4
with:
path: |
~/.cargo/registry
~/.cargo/git
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
- name: Cache cargo build
uses: actions/cache@v4
with:
path: target
key: ${{ runner.os }}-cargo-build-target-${{ hashFiles('**/Cargo.lock') }}
- name: Install Node.js
uses: actions/setup-node@v4
with:
node-version: '18'
- name: Run comprehensive tooltip tests
run: ./scripts/test_tooltip.sh
test-browser:
name: Browser Compatibility Tests
runs-on: ubuntu-latest
strategy:
matrix:
browser: [firefox, chrome]
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
with:
targets: wasm32-unknown-unknown
- name: Install wasm-pack
uses: jetli/wasm-pack-action@v0.4.0
with:
version: 'latest'
- name: Install Chrome
if: matrix.browser == 'chrome'
uses: browser-actions/setup-chrome@latest
- name: Install Firefox
if: matrix.browser == 'firefox'
uses: browser-actions/setup-firefox@latest
- name: Cache cargo registry
uses: actions/cache@v4
with:
path: |
~/.cargo/registry
~/.cargo/git
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
- name: Test Yew Tooltip in ${{ matrix.browser }}
working-directory: packages/yew/tooltip
run: |
if [ "${{ matrix.browser }}" == "chrome" ]; then
wasm-pack test --headless --chrome
else
wasm-pack test --headless --firefox
fi
- name: Test Leptos Tooltip in ${{ matrix.browser }}
working-directory: packages/leptos/tooltip
run: |
if [ "${{ matrix.browser }}" == "chrome" ]; then
wasm-pack test --headless --chrome
else
wasm-pack test --headless --firefox
fi
test-examples:
name: Example Applications
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
- name: Cache cargo registry
uses: actions/cache@v4
with:
path: |
~/.cargo/registry
~/.cargo/git
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
- name: Test Leptos examples
if: hashFiles('book-examples/leptos/Cargo.toml') != ''
working-directory: book-examples/leptos
run: cargo check
- name: Test Yew examples
if: hashFiles('book-examples/yew/Cargo.toml') != ''
working-directory: book-examples/yew
run: cargo check
- name: Build example documentation
run: |
if [ -d book-examples ]; then
cargo doc --no-deps --workspace
fi
lint-and-format:
name: Code Quality Checks
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
with:
components: clippy, rustfmt
- name: Cache cargo registry
uses: actions/cache@v4
with:
path: |
~/.cargo/registry
~/.cargo/git
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
- name: Check formatting
run: |
cargo fmt --check -p shadcn-ui-yew-tooltip -p shadcn-ui-leptos-tooltip
- name: Run Clippy
run: |
cargo clippy -p shadcn-ui-yew-tooltip -p shadcn-ui-leptos-tooltip -- -D warnings
- name: Check documentation
run: |
cargo doc --no-deps -p shadcn-ui-yew-tooltip -p shadcn-ui-leptos-tooltip
security-audit:
name: Security Vulnerability Scan
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
- name: Install cargo-audit
run: cargo install cargo-audit
- name: Run security audit
run: cargo audit
- name: Check for known security vulnerabilities
run: |
# Check for vulnerable dependencies
cargo audit --deny warnings
performance-benchmark:
name: Performance Benchmarks
runs-on: ubuntu-latest
if: github.event_name == 'pull_request'
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
with:
targets: wasm32-unknown-unknown
- name: Install wasm-pack
uses: jetli/wasm-pack-action@v0.4.0
with:
version: 'latest'
- name: Cache cargo registry
uses: actions/cache@v4
with:
path: |
~/.cargo/registry
~/.cargo/git
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
- name: Build optimized WASM bundles
run: |
cd packages/yew/tooltip
wasm-pack build --target web --out-dir ../../../dist/yew-tooltip
cd ../../leptos/tooltip
wasm-pack build --target web --out-dir ../../../dist/leptos-tooltip
- name: Measure bundle sizes
run: |
echo "Bundle size analysis:"
if [ -d dist ]; then
find dist -name "*.wasm" -exec ls -lh {} \;
find dist -name "*.js" -exec ls -lh {} \;
fi
- name: Comment PR with bundle sizes
if: github.event_name == 'pull_request'
uses: actions/github-script@v7
with:
script: |
const fs = require('fs');
const path = require('path');
// This would analyze bundle sizes and comment on PR
// Implementation depends on specific bundle analysis needs
console.log('Bundle size analysis completed');
accessibility-audit:
name: Accessibility Compliance
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
with:
targets: wasm32-unknown-unknown
- name: Install wasm-pack
uses: jetli/wasm-pack-action@v0.4.0
with:
version: 'latest'
- name: Install Node.js
uses: actions/setup-node@v4
with:
node-version: '18'
- name: Install accessibility testing tools
run: |
npm install -g @axe-core/cli
npm install -g lighthouse
- name: Build test applications
run: |
# This would build test applications for accessibility testing
echo "Building accessibility test applications..."
- name: Run accessibility tests
run: |
# This would run axe-core and other accessibility tests
echo "Running accessibility compliance tests..."
- name: Generate accessibility report
run: |
echo "Generating accessibility compliance report..."

135
.github/workflows/website.yml vendored Normal file
View File

@@ -0,0 +1,135 @@
name: Website
on:
pull_request: {}
push:
branches:
- main
permissions:
contents: read
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: false
jobs:
book-test:
name: Test Book
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- name: Set up Rust toolchain
uses: actions-rust-lang/setup-rust-toolchain@v1
with:
target: wasm32-unknown-unknown
- name: Install Cargo Binary Install
uses: cargo-bins/cargo-binstall@main
- name: Install mdBook
run: cargo binstall --force -y mdbook mdbook-tabs mdbook-trunk
- name: Run tests
run: mdbook test
working-directory: book
book-build:
name: Build Book
needs: book-test
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
with:
fetch-depth: 0
- name: Set up Rust toolchain
uses: actions-rust-lang/setup-rust-toolchain@v1
with:
target: wasm32-unknown-unknown
- name: Install Cargo Binary Install
uses: cargo-bins/cargo-binstall@main
- name: Install mdBook and Trunk
run: cargo binstall --force -y mdbook mdbook-tabs mdbook-trunk trunk
- name: Install Node.js dependencies
run: npm ci
- name: Build Book
run: mdbook build
working-directory: book
- name: Combine Book Outputs
run: mdbook-trunk combine
working-directory: book
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: book
path: book/dist
retention-days: 1
if-no-files-found: error
registry-build:
name: Build Registry
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
with:
fetch-depth: 0
- name: Set up Rust toolchain
uses: actions-rust-lang/setup-rust-toolchain@v1
with:
target: wasm32-unknown-unknown
- name: Build Registry
run: cargo run -p scripts --bin build_registry
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: registry
path: dist
retention-days: 1
if-no-files-found: error
deploy:
name: Deploy
needs: [book-build, registry-build]
if: github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
permissions:
contents: read
pages: write
id-token: write
steps:
- uses: actions/checkout@v5
with:
fetch-depth: 0
- name: Download artifacts
uses: actions/download-artifact@v5
with:
path: dist
merge-multiple: true
- name: Setup Pages
uses: actions/configure-pages@v5
- name: Upload artifact
uses: actions/upload-pages-artifact@v3
with:
path: dist
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4