From 11baabe545770d76e7255f9c5aaaef72bc0def23 Mon Sep 17 00:00:00 2001 From: Ismo Vuorinen Date: Fri, 5 Sep 2025 23:06:12 +0300 Subject: [PATCH] feat: initial scaffold and generator - Complete project structure with directories for all target platforms - Template system for CLI tools with color placeholder replacement - Working generator that processes templates for 6 theme variants - GitHub workflows for build, snapshots, commitlint, and cli-verify - Installer and verifier scripts for CLI tool deployment - Comprehensive documentation and specifications - Biome 2.x linting and formatting setup - Husky git hooks for pre-commit validation --- .github/CODEOWNERS | 2 + .github/workflows/build.yml | 40 +++ .github/workflows/cli-verify.yml | 37 +++ .github/workflows/commitlint.yml | 26 ++ .github/workflows/snapshots.yml | 40 +++ .gitignore | 49 ++++ .husky/commit-msg | 1 + .husky/pre-commit | 4 + .serena/.gitignore | 1 + .serena/memories/architecture-deep-dive.md | 123 +++++++++ .serena/memories/code-style-conventions.md | 139 ++++++++++ .serena/memories/project-overview.md | 47 ++++ .serena/memories/suggested-commands.md | 97 +++++++ .serena/memories/task-completion-checklist.md | 141 ++++++++++ .serena/project.yml | 67 +++++ AGENTS.md | 167 ++++++++++++ CLAUDE.md | 155 +++++++++++ README.md | 49 ++++ biome.json | 54 ++++ cli/delta/gitconfig.delta | 22 ++ cli/delta/template.txt | 22 ++ cli/fish/colors-template.txt | 24 ++ cli/fish/everforest-dark-hard.fish | 24 ++ cli/fish/everforest-dark-medium.fish | 24 ++ cli/fish/everforest-dark-soft.fish | 24 ++ cli/fish/everforest-light-hard.fish | 24 ++ cli/fish/everforest-light-medium.fish | 24 ++ cli/fish/everforest-light-soft.fish | 24 ++ cli/fzf/README.md | 14 + cli/fzf/everforest.sh | 7 + cli/fzf/template.txt | 7 + cli/install.sh | 59 ++++ cli/ls_colors/everforest.sh | 5 + cli/ls_colors/template.txt | 5 + cli/starship/README.md | 14 + cli/starship/starship.toml | 63 +++++ cli/starship/template.txt | 63 +++++ cli/tmux/everforest.tmux.conf | 31 +++ cli/tmux/template.txt | 31 +++ commitlint.config.js | 25 ++ docs/CLI.md | 54 ++++ meta/filetree.md | 253 ++++++++++++++++++ meta/implementation-steps.md | 105 ++++++++ package.json | 42 +++ palettes/everforest.json | 27 ++ palettes/everforest.yaml | 20 ++ scripts/generate-themes.mjs | 186 +++++++++++++ scripts/validate.mjs | 119 ++++++++ verify/verify.sh | 67 +++++ web/css/everforest.css | 55 ++++ web/demo/demo.js | 27 ++ web/demo/index.html | 66 +++++ web/demo/style.css | 94 +++++++ 53 files changed, 2890 insertions(+) create mode 100644 .github/CODEOWNERS create mode 100644 .github/workflows/build.yml create mode 100644 .github/workflows/cli-verify.yml create mode 100644 .github/workflows/commitlint.yml create mode 100644 .github/workflows/snapshots.yml create mode 100644 .gitignore create mode 100755 .husky/commit-msg create mode 100755 .husky/pre-commit create mode 100644 .serena/.gitignore create mode 100644 .serena/memories/architecture-deep-dive.md create mode 100644 .serena/memories/code-style-conventions.md create mode 100644 .serena/memories/project-overview.md create mode 100644 .serena/memories/suggested-commands.md create mode 100644 .serena/memories/task-completion-checklist.md create mode 100644 .serena/project.yml create mode 100644 AGENTS.md create mode 100644 CLAUDE.md create mode 100644 README.md create mode 100644 biome.json create mode 100644 cli/delta/gitconfig.delta create mode 100644 cli/delta/template.txt create mode 100644 cli/fish/colors-template.txt create mode 100644 cli/fish/everforest-dark-hard.fish create mode 100644 cli/fish/everforest-dark-medium.fish create mode 100644 cli/fish/everforest-dark-soft.fish create mode 100644 cli/fish/everforest-light-hard.fish create mode 100644 cli/fish/everforest-light-medium.fish create mode 100644 cli/fish/everforest-light-soft.fish create mode 100644 cli/fzf/README.md create mode 100644 cli/fzf/everforest.sh create mode 100644 cli/fzf/template.txt create mode 100755 cli/install.sh create mode 100644 cli/ls_colors/everforest.sh create mode 100644 cli/ls_colors/template.txt create mode 100644 cli/starship/README.md create mode 100644 cli/starship/starship.toml create mode 100644 cli/starship/template.txt create mode 100644 cli/tmux/everforest.tmux.conf create mode 100644 cli/tmux/template.txt create mode 100644 commitlint.config.js create mode 100644 docs/CLI.md create mode 100644 meta/filetree.md create mode 100644 meta/implementation-steps.md create mode 100644 package.json create mode 100644 palettes/everforest.json create mode 100644 palettes/everforest.yaml create mode 100644 scripts/generate-themes.mjs create mode 100644 scripts/validate.mjs create mode 100755 verify/verify.sh create mode 100644 web/css/everforest.css create mode 100644 web/demo/demo.js create mode 100644 web/demo/index.html create mode 100644 web/demo/style.css diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 0000000..84741f0 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,2 @@ +# Global code ownership +* @ivuorinen diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..56577a9 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,40 @@ +name: Build + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + cache: 'npm' + + - name: Install dependencies + run: npm ci + + - name: Lint code + run: npm run lint + + - name: Generate themes + run: npm run generate + + - name: Validate output + run: npm run validate + + - name: Check for uncommitted changes + run: | + if ! git diff --quiet; then + echo "Generated files have uncommitted changes!" + git diff + exit 1 + fi diff --git a/.github/workflows/cli-verify.yml b/.github/workflows/cli-verify.yml new file mode 100644 index 0000000..38a5e84 --- /dev/null +++ b/.github/workflows/cli-verify.yml @@ -0,0 +1,37 @@ +name: CLI Verify + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + +jobs: + cli-verify: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + cache: 'npm' + + - name: Install dependencies + run: npm ci + + - name: Generate themes + run: npm run generate + + - name: Run installer + run: | + export HOME=$(mktemp -d) + ./cli/install.sh + + - name: Run verifier + run: | + export HOME=$(mktemp -d) + ./cli/install.sh + ENGINE=docker ./verify/verify.sh diff --git a/.github/workflows/commitlint.yml b/.github/workflows/commitlint.yml new file mode 100644 index 0000000..16b1a93 --- /dev/null +++ b/.github/workflows/commitlint.yml @@ -0,0 +1,26 @@ +name: Commitlint + +on: + pull_request: + branches: [ main ] + +jobs: + commitlint: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + cache: 'npm' + + - name: Install dependencies + run: npm ci + + - name: Lint commit messages + run: npx commitlint --from HEAD~${{ github.event.pull_request.commits }} --to HEAD --verbose diff --git a/.github/workflows/snapshots.yml b/.github/workflows/snapshots.yml new file mode 100644 index 0000000..618ede8 --- /dev/null +++ b/.github/workflows/snapshots.yml @@ -0,0 +1,40 @@ +name: Snapshots + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + +jobs: + snapshots: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + cache: 'npm' + + - name: Install dependencies + run: npm ci + + - name: Install Playwright browsers + run: npx playwright install --with-deps + + - name: Generate themes + run: npm run generate + + - name: Run Playwright tests + run: npm run snapshots + + - name: Upload snapshots + uses: actions/upload-artifact@v4 + if: failure() + with: + name: playwright-report + path: playwright-report/ + retention-days: 30 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9806675 --- /dev/null +++ b/.gitignore @@ -0,0 +1,49 @@ +# Dependencies +node_modules/ +npm-debug.log* +package-lock.json + +# Generated files (tracked for now, may exclude later) +# terminals/ +# cli/*/!(template.txt|README.md) +# editors/*/!(README.md) +# web/css/everforest.css + +# Build artifacts +dist/ +build/ +.cache/ + +# Testing +coverage/ +.nyc_output/ +test-results/ +playwright-report/ + +# IDE +.vscode/ +.idea/ +*.swp +*.swo + +# OS +.DS_Store +.DS_Store? +._* +.Spotlight-V100 +.Trashes +ehthumbs.db +Thumbs.db + +# Logs +*.log +logs/ + +# Runtime +.env +.env.local +.env.*.local + +# Temporary files +*.tmp +*.temp diff --git a/.husky/commit-msg b/.husky/commit-msg new file mode 100755 index 0000000..0398b7a --- /dev/null +++ b/.husky/commit-msg @@ -0,0 +1 @@ +npx --no -- commitlint --edit ${1} diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100755 index 0000000..be52e3b --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,4 @@ +npm run lint:fix +npm run generate +npm run validate +git add . diff --git a/.serena/.gitignore b/.serena/.gitignore new file mode 100644 index 0000000..14d86ad --- /dev/null +++ b/.serena/.gitignore @@ -0,0 +1 @@ +/cache diff --git a/.serena/memories/architecture-deep-dive.md b/.serena/memories/architecture-deep-dive.md new file mode 100644 index 0000000..0c69494 --- /dev/null +++ b/.serena/memories/architecture-deep-dive.md @@ -0,0 +1,123 @@ +# Architecture Deep Dive - Everforest Resources + +## Core Generator Architecture + +### EverforestGenerator Class +Located in `scripts/generate-themes.mjs`, this is the heart of the system: + +```javascript +class EverforestGenerator { + constructor() { + this.palette = null; // Loaded from palettes/everforest.json + } + + // Key methods: + async loadPalette() // Loads JSON palette definition + async processTemplate() // Processes template.txt with placeholders + getColorsForVariant() // Maps palette to color variables + async generateAll() // Main entry point - generates all variants + async generateVariant() // Processes single variant +} +``` + +### Template Processing System +1. **Template Files**: Each CLI tool has `template.txt` in its directory +2. **Placeholders**: `{{bg}}`, `{{fg}}`, `{{red}}`, etc. replaced with actual colors +3. **Variant Processing**: Generates 6 versions (dark/light Γ— hard/medium/soft) +4. **Output Generation**: Creates final config files from processed templates + +### Palette Structure +```json +{ + "variants": { + "dark": { "hard": {...}, "medium": {...}, "soft": {...} }, + "light": { "hard": {...}, "medium": {...}, "soft": {...} } + }, + "accents": { "red": "#e67e80", "orange": "#e69875", ... }, + "grays": { "dark": {...}, "light": {...} } +} +``` + +## Supported Tools & Platforms + +### CLI Tools (24+ supported) +- **System Monitors**: btop, bottom, glances, neofetch, htop +- **File Management**: ranger, lf, mc, LS_COLORS, eza/exa +- **Git Tools**: lazygit, gitui, tig, delta +- **Search & Processing**: ripgrep, fzf, fd, jq, bat +- **Shell & Productivity**: starship, zsh, fish, tmux, less +- **Modern Utils**: zoxide, atuin + +### Editors (5 types) +- **Neovim**: Lua module with setup() function +- **VS Code**: JSON themes + package.json +- **JetBrains**: Unified .icls files (IntelliJ, WebStorm, PyCharm, etc.) +- **Zed**: JSON theme files +- **Sublime Text**: .sublime-color-scheme files + +### Terminals +- WezTerm, Alacritty, Kitty, Windows Terminal, Ghostty + +## Color Philosophy + +### ANSI vs Hex Usage +- **CLI Tools**: ANSI-16 SGR codes only (no raw hex) +- **GUI Applications**: Hex values allowed (from generator only) +- **Consistent Mapping**: Same semantic colors across all tools + +### Theme Variants +- **Dark**: hard/medium/soft (different background intensities) +- **Light**: hard/medium/soft (different background intensities) +- **Fallback**: Medium variant if specific not available + +## File Structure Pattern + +``` +cli/ + starship/ + template.txt # Template with {{color}} placeholders + starship.toml # Generated output (never edit directly) + README.md # Tool-specific documentation + + fish/ + colors-template.txt # Multiple templates for complex tools + prompt-template.txt + tide-template.txt + everforest-*.fish # Generated variants + README.md +``` + +## Development Patterns + +### Generator Extension +To add new CLI tool: +1. Create `cli/newtool/template.txt` +2. Add processing logic to generator +3. Update installer and verifier +4. Add to documentation + +### Template Design +- Use semantic color names: `{{bg}}` not `{{color1}}` +- Include tool-specific syntax +- Test with all 6 variants +- Follow tool's native config format + +### Error Handling +- Graceful failures with descriptive messages +- Exit codes for CI integration +- Emoji-prefixed console output for visibility + +## CI/CD Integration + +### Required Checks +1. **build**: Generator runs successfully +2. **snapshots**: Web demo renders correctly +3. **commitlint**: Conventional commit format +4. **cli-verify**: Generated configs work in container + +### Validation Pipeline +1. Palette structure validation +2. Template processing verification +3. No raw hex in CLI configs +4. All variants present +5. File structure compliance diff --git a/.serena/memories/code-style-conventions.md b/.serena/memories/code-style-conventions.md new file mode 100644 index 0000000..f7a5119 --- /dev/null +++ b/.serena/memories/code-style-conventions.md @@ -0,0 +1,139 @@ +# Code Style & Conventions - Everforest Resources + +## JavaScript/Node.js Style + +### Module System +- **ES Modules**: All files use `.mjs` extension +- **Imports**: Use ES6 import/export syntax +- **Type**: `"type": "module"` in package.json + +### Biome Configuration +The project uses **Biome 2.x** for linting and formatting with these settings: +- **Version**: 2.2.3 (latest) +- **Indent**: 2 spaces +- **Line width**: 100 characters +- **Quotes**: Single quotes for JavaScript, double for JSX +- **Semicolons**: Always required +- **Trailing commas**: ES5 style +- **Arrow parentheses**: As needed + +### Class Structure +```javascript +class EverforestGenerator { + constructor() { + this.palette = null; + } + + async methodName() { + // Async/await preferred over Promises + } +} +``` + +### Naming Conventions +- **Classes**: PascalCase (`EverforestGenerator`) +- **Methods**: camelCase (`loadPalette`, `processTemplate`) +- **Constants**: camelCase for most, UPPER_SNAKE_CASE for true constants +- **Files**: kebab-case (`generate-themes.mjs`) + +### Error Handling +- Use try-catch blocks for async operations +- Log errors with emoji prefixes: `console.error('❌ Failed to load palette')` +- Exit with code 1 on critical errors: `process.exit(1)` + +### Console Output +- Use emoji for visual feedback: + - βœ… Success messages + - ❌ Error messages + - 🎨 Starting operations + - πŸ“ Progress updates + - ✨ Completion messages + +### Code Quality Rules +- **Variables**: Use `const` by default, `let` when reassignment needed +- **Functions**: Prefer arrow functions for callbacks +- **Imports**: Organize imports automatically with Biome +- **Unused Variables**: Not allowed (error level) +- **Block Statements**: Always use braces for control structures +- **forEach**: Allowed for side effects (useIterableCallbackReturn disabled) + +## Template System Conventions + +### Placeholder Format +- Use double curly braces: `{{colorName}}` +- Available placeholders: `{{bg}}`, `{{fg}}`, `{{red}}`, `{{orange}}`, `{{yellow}}`, `{{green}}`, `{{aqua}}`, `{{blue}}`, `{{purple}}`, `{{gray1}}`, `{{gray2}}`, `{{gray3}}` + +### Template Files +- Named `template.txt` in each tool directory +- Multiple templates for complex tools (e.g., `colors-template.txt`, `prompt-template.txt`) +- Never edit generated output files directly + +## Documentation Style + +### Code Comments +- Use JSDoc-style comments for classes and methods +- Include purpose and architecture notes at file top +- Explain complex logic inline + +### Markdown +- **Critical Rule**: Use indented code blocks only (4 spaces) +- Never use triple backticks (```) +- Use emoji in headers and lists for visual hierarchy + +## Git Conventions + +### Commit Messages +- Follow Conventional Commits format +- Examples: + - `feat: add starship theme generator` + - `fix: correct color mapping in templates` + - `docs: update CLI installation guide` + +### Branch Strategy +- Main branch: `main` +- All CI checks must pass for merge +- Required checks: lint + build + snapshots + commitlint + cli-verify + +## File Organization + +### Directory Structure +``` +palettes/ # Color definitions (JSON/YAML) +scripts/ # Generator and validation scripts +cli/ # CLI tool templates and configs +editors/ # Editor theme files +terminals/ # Terminal configurations +web/ # CSS and demo files +docs/ # Documentation +meta/ # Project specifications +biome.json # Biome 2.x configuration +``` + +### File Naming +- Scripts: `kebab-case.mjs` +- Configs: Tool-specific conventions +- Templates: `template.txt` or `tool-template.txt` + +### Biome File Processing +Biome processes these files: +- JavaScript modules: `scripts/**/*.mjs`, `scripts/**/*.js` +- JSON files: `*.json` +- Root level JS files: `*.mjs`, `*.js` + +Biome ignores: +- Generated output files +- Node modules and build artifacts +- Unknown file types (by default) + +## Development Commands +```bash +# Format code +npm run format # Format all files with Biome 2.x + +# Lint code +npm run lint # Check for issues +npm run lint:fix # Auto-fix issues + +# Before committing +npm run lint:fix && npm run format +``` diff --git a/.serena/memories/project-overview.md b/.serena/memories/project-overview.md new file mode 100644 index 0000000..7ec90f7 --- /dev/null +++ b/.serena/memories/project-overview.md @@ -0,0 +1,47 @@ +# Everforest Resources - Project Overview + +## Purpose +The **everforest-resources** repository is an unofficial hub for Everforest color scheme resources. It generates theme files, configurations, and color schemes for terminals, CLI tools, and editors from canonical palette definitions. + +## Key Philosophy +- **Generator-first approach**: All outputs are generated from `palettes/everforest.json` +- **Template system**: Uses `template.txt` files with color placeholders (e.g., `{{bg}}`, `{{fg}}`, `{{red}}`) +- **No manual editing**: Generated artifacts must never be hand-edited +- **Comprehensive coverage**: Supports 24+ CLI tools, 5+ editors, multiple terminals + +## Tech Stack +- **Runtime**: Node.js with ES modules (type: "module") +- **Language**: JavaScript (.mjs files) +- **Code Quality**: Biome 2.2.3 for linting and formatting +- **Testing**: Playwright for web snapshots (when implemented) +- **CI/CD**: Husky for git hooks, conventional commits +- **Package Management**: npm + +## Core Architecture +- **Palette**: JSON definitions with 6 variants (dark/light Γ— hard/medium/soft) +- **Generator**: `EverforestGenerator` class processes templates and generates themes +- **Templates**: Color placeholder system for consistent theming +- **Output**: Generates configs for terminals, CLI tools, editors, and web + +## Target Platforms +- **Terminals**: WezTerm, Alacritty, Kitty, Windows Terminal, Ghostty +- **CLI Tools**: 24+ tools including btop, lazygit, starship, fzf, ripgrep +- **Editors**: Neovim, VS Code, JetBrains IDEs, Zed, Sublime Text +- **Web**: CSS variables with media queries + +## Development Status +- βœ… Project structure and specifications complete +- βœ… Basic generator scaffold implemented +- βœ… Biome 2.x linting and formatting integrated and working +- βœ… Code quality pipeline working (lint β†’ generate β†’ validate) +- βœ… Latest tooling versions (Biome 2.2.3) +- ⏳ Full template processing implementation pending +- ⏳ CLI tool generators pending +- ⏳ Editor theme generators pending +- ⏳ Playwright web tests pending + +## Quality Assurance +- **Biome 2.x**: All JavaScript code passes linting and formatting with latest version +- **Validation**: Generator outputs validated for structure and compliance +- **CI Pipeline**: Automated checks for code quality and generation consistency +- **Modern Tooling**: Using latest stable versions of all development tools diff --git a/.serena/memories/suggested-commands.md b/.serena/memories/suggested-commands.md new file mode 100644 index 0000000..7535ebc --- /dev/null +++ b/.serena/memories/suggested-commands.md @@ -0,0 +1,97 @@ +# Suggested Commands - Everforest Resources + +## Core Development Commands + +### Theme Generation +```bash +npm run generate # Generate all theme files from palettes +node scripts/generate-themes.mjs # Direct generator execution +``` + +### Code Quality & Linting +```bash +npm run lint # Check code with Biome linter +npm run lint:fix # Auto-fix linting issues with Biome +npm run format # Format code with Biome +npm run validate # Validate generated outputs and structure +npm run ci # Full CI suite: lint + generate + validate + snapshots +``` + +### Testing +```bash +npm run snapshots # Generate Playwright web snapshots +playwright test # Direct Playwright execution +``` + +### Git & Setup +```bash +npm run prepare # Install Husky git hooks +npm install # Install dependencies +``` + +### Alternative Commands (Makefile - when implemented) +```bash +make generate # Alternative to npm run generate +make validate # Alternative to npm run validate +make ci # Alternative to npm run ci +make snapshots # Generate web snapshots +make demo # Run web demo server +``` + +## Installation & Deployment +```bash +./cli/install.sh # Deploy all configs to ~/.config (when implemented) +ENGINE=docker ./verify/verify.sh # Verify in container (when implemented) +``` + +## Development Workflow Commands +```bash +# 1. Edit palette or templates +vim palettes/everforest.json +vim cli/starship/template.txt + +# 2. Lint and format code +npm run lint:fix # Fix any linting issues +npm run format # Ensure consistent formatting + +# 3. Generate themes +npm run generate + +# 4. Validate output +npm run validate + +# 5. Test web components +npm run snapshots + +# 6. Full CI check +npm run ci + +# 7. Commit changes +git add -A +git commit -m "feat: update starship theme colors" +``` + +## Biome Commands +```bash +biome check . # Check all files for issues +biome check . --write # Auto-fix issues +biome format . --write # Format all supported files +biome lint . # Lint JavaScript/TypeScript files +``` + +## System Commands (macOS/Darwin) +```bash +# File operations +ls -la # List files with details +find . -name "*.mjs" # Find JavaScript modules +grep -r "template" . # Search for template references + +# Directory navigation +pwd # Current directory +cd scripts/ # Change to scripts directory + +# Git operations +git status # Check git status +git log --oneline # View commit history +git diff # View changes +``` diff --git a/.serena/memories/task-completion-checklist.md b/.serena/memories/task-completion-checklist.md new file mode 100644 index 0000000..1c8b13d --- /dev/null +++ b/.serena/memories/task-completion-checklist.md @@ -0,0 +1,141 @@ +# Task Completion Checklist - Everforest Resources + +## When a Development Task is Completed + +### 1. Code Quality Checks +```bash +# Lint and format code first +npm run lint:fix # Auto-fix any linting issues +npm run format # Ensure consistent formatting + +# Generate themes from updated templates/palettes +npm run generate + +# Validate all outputs +npm run validate + +# Check for any errors or warnings +# All validation must pass before proceeding +``` + +### 2. Testing Requirements +```bash +# Run Playwright snapshots (for web changes) +npm run snapshots + +# Full CI pipeline (includes linting) +npm run ci + +# Verify no errors in any step +``` + +### 3. File Verification +- **Never commit generated files without running generator** +- **Always commit palette + template + generated files together** +- Check that all 6 variants are generated (dark/light Γ— hard/medium/soft) +- Ensure code passes Biome linting and formatting + +### 4. Documentation Updates +- Update relevant README or docs if adding new tools +- Ensure all examples use indented code blocks (4 spaces) +- Never use triple backticks in documentation +- Run `npm run format` to ensure consistent formatting + +### 5. Git Workflow +```bash +# Check status +git status + +# Lint and format before committing +npm run lint:fix +npm run format + +# Stage all changes (palette + template + generated) +git add -A + +# Commit with conventional format +git commit -m "feat: add new CLI tool theme" +# or +git commit -m "fix: correct color mapping in starship" +# or +git commit -m "docs: update installation guide" + +# Push changes +git push +``` + +### 6. CI/CD Requirements +All these checks must pass in CI before merge: +- βœ… **lint**: Biome linting and formatting checks +- βœ… **build**: Generator + validation +- βœ… **snapshots**: Playwright demo renders +- βœ… **commitlint**: Conventional Commits enforcement +- βœ… **cli-verify**: Install + verify generated configs + +### 7. Critical Rules Verification +- [ ] Code passes Biome linting (no errors) +- [ ] Code is properly formatted with Biome +- [ ] No raw hex values in CLI configs (ANSI only) +- [ ] All generated files come from templates/palettes +- [ ] No manual edits to generated files +- [ ] Template placeholders used correctly +- [ ] All 6 theme variants present where applicable + +### 8. Special Considerations + +#### For New CLI Tools +- Create `template.txt` with proper placeholders +- Add to generator processing logic +- Update installer script +- Add to verifier container +- Document in appropriate README +- Ensure any new JS/MJS files follow Biome style + +#### For Palette Changes +- Regenerate ALL theme files +- Verify no breaking changes in output formats +- Test web demo still renders correctly +- Check that ANSI mappings remain valid + +#### For Template Updates +- Test with all 6 variants +- Verify placeholder replacement works +- Check output format matches tool expectations + +#### For JavaScript/Code Changes +- Run `npm run lint:fix` to auto-fix issues +- Run `npm run format` for consistent formatting +- Ensure imports are organized correctly +- Follow established naming conventions + +### 9. Before Pushing +```bash +# Final verification with full CI +npm run ci + +# If all passes, ready to push +git push origin main +``` + +## Emergency Fixes +If CI fails after push: +1. Check error logs in GitHub Actions +2. For linting errors: `npm run lint:fix` locally +3. For generation errors: `rm -rf generated/ && npm run generate` +4. Fix locally with proper workflow above +5. Push fix immediately + +## Biome-Specific Troubleshooting +```bash +# Check what Biome would fix +npm run lint + +# Auto-fix all fixable issues +npm run lint:fix + +# Format all files +npm run format + +# Check specific file +biome check scripts/generate-themes.mjs +``` diff --git a/.serena/project.yml b/.serena/project.yml new file mode 100644 index 0000000..cd871b5 --- /dev/null +++ b/.serena/project.yml @@ -0,0 +1,67 @@ +# language of the project (csharp, python, rust, java, typescript, go, cpp, or ruby) +# * For C, use cpp +# * For JavaScript, use typescript +# Special requirements: +# * csharp: Requires the presence of a .sln file in the project folder. +language: typescript + +# whether to use the project's gitignore file to ignore files +# Added on 2025-04-07 +ignore_all_files_in_gitignore: true +# list of additional paths to ignore +# same syntax as gitignore, so you can use * and ** +# Was previously called `ignored_dirs`, please update your config if you are using that. +# Added (renamed) on 2025-04-07 +ignored_paths: [] + +# whether the project is in read-only mode +# If set to true, all editing tools will be disabled and attempts to use them will result in an error +# Added on 2025-04-18 +read_only: false + +# list of tool names to exclude. We recommend not excluding any tools, see the readme for more details. +# Below is the complete list of tools for convenience. +# To make sure you have the latest list of tools, and to view their descriptions, +# execute `uv run scripts/print_tool_overview.py`. +# +# * `activate_project`: Activates a project by name. +# * `check_onboarding_performed`: Checks whether project onboarding was already performed. +# * `create_text_file`: Creates/overwrites a file in the project directory. +# * `delete_lines`: Deletes a range of lines within a file. +# * `delete_memory`: Deletes a memory from Serena's project-specific memory store. +# * `execute_shell_command`: Executes a shell command. +# * `find_referencing_code_snippets`: Finds code snippets in which the symbol at the given location is referenced. +# * `find_referencing_symbols`: Finds symbols that reference the symbol at the given location (optionally filtered by type). +# * `find_symbol`: Performs a global (or local) search for symbols with/containing a given name/substring (optionally filtered by type). +# * `get_current_config`: Prints the current configuration of the agent, including the active and available projects, tools, contexts, and modes. +# * `get_symbols_overview`: Gets an overview of the top-level symbols defined in a given file. +# * `initial_instructions`: Gets the initial instructions for the current project. +# Should only be used in settings where the system prompt cannot be set, +# e.g. in clients you have no control over, like Claude Desktop. +# * `insert_after_symbol`: Inserts content after the end of the definition of a given symbol. +# * `insert_at_line`: Inserts content at a given line in a file. +# * `insert_before_symbol`: Inserts content before the beginning of the definition of a given symbol. +# * `list_dir`: Lists files and directories in the given directory (optionally with recursion). +# * `list_memories`: Lists memories in Serena's project-specific memory store. +# * `onboarding`: Performs onboarding (identifying the project structure and essential tasks, e.g. for testing or building). +# * `prepare_for_new_conversation`: Provides instructions for preparing for a new conversation (in order to continue with the necessary context). +# * `read_file`: Reads a file within the project directory. +# * `read_memory`: Reads the memory with the given name from Serena's project-specific memory store. +# * `remove_project`: Removes a project from the Serena configuration. +# * `replace_lines`: Replaces a range of lines within a file with new content. +# * `replace_symbol_body`: Replaces the full definition of a symbol. +# * `restart_language_server`: Restarts the language server, may be necessary when edits not through Serena happen. +# * `search_for_pattern`: Performs a search for a pattern in the project. +# * `summarize_changes`: Provides instructions for summarizing the changes made to the codebase. +# * `switch_modes`: Activates modes by providing a list of their names +# * `think_about_collected_information`: Thinking tool for pondering the completeness of collected information. +# * `think_about_task_adherence`: Thinking tool for determining whether the agent is still on track with the current task. +# * `think_about_whether_you_are_done`: Thinking tool for determining whether the task is truly completed. +# * `write_memory`: Writes a named memory (for future reference) to Serena's project-specific memory store. +excluded_tools: [] + +# initial prompt for the project. It will always be given to the LLM upon activating the project +# (contrary to the memories, which are loaded on demand). +initial_prompt: "" + +project_name: "everforest-resources" diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..2b3770e --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,167 @@ +# Everforest Resources β€” Specification + +This document consolidates all gathered knowledge for the github.com/ivuorinen/everforest-resources repository. It is the authoritative spec for implementation. All instructions SHALL be followed strictly. LLM AGENTS SHALL NOT DEVIATE FROM THE THEME SPEC. + +## 1. Philosophy + +- This repository is the unofficial hub for Everforest resources. +- All outputs are generator-first, derived strictly from palettes/everforest.(json|yaml). +- Template system: CLI tools use template.txt files with color placeholders (e.g., {{bg}}, {{fg}}, {{red}}) that are replaced by the generator. +- CLI tools and prompts use ANSI-16 SGR codes only. No raw hex or 256-color indices. +- GUI/editor themes may use hex values but only those emitted by the generator. +- Generated artifacts MUST NOT be hand-edited. + +## 2. Theme Variants + +- Variants: dark/light Γ— hard/medium/soft. +- If a variant is missing, fallback to medium. +- All variants MUST be present for terminals, CLI tools, editors, and web. + +## 3. Repository Layout + +- palettes/: canonical Everforest palette definitions (json/yaml). +- scripts/: generator scripts (Node.js, mjs modules). +- terminals/: WezTerm, Alacritty, Kitty, Windows Terminal, Ghostty. +- web/: CSS vars, demo with Playwright snapshot tests. +- cli/: all cli tools and prompts. +- editors/: all IDEs and editors. +- docs/: CLI.md and other documentation. +- verify/: container verifier. +- .github/: workflows, CODEOWNERS. + +## 4. CLI Tools + +- LS_COLORS: archives β†’ bold yellow (orange), images β†’ purple, docs β†’ blue. +- dircolors: generated alongside LS_COLORS. +- eza/exa: export EXA_COLORS/EZA_COLORS. +- ripgrep: ripgreprc with ANSI mappings. +- fzf: FZF_DEFAULT_OPTS snippet with Everforest accents. +- delta: git-delta config with ANSI mapping. +- bat: minimal config forwarding to terminal theme. +- htop: htoprc with color_scheme=0. +- starship: starship.toml with Everforest accent mappings. +- zsh: Pure and Powerlevel10k presets. +- fish: color schemes, minimal prompt, Tide preset. +- tmux: everforest.tmux.conf with ANSI mappings. +- btop: modern htop alternative with color customization. +- bottom: cross-platform system monitor with color themes. +- glances: system monitoring tool with color themes. +- neofetch: system information display with color support. +- ranger: terminal file manager with color scheme support. +- lf: lightweight file manager (ranger alternative). +- mc: Midnight Commander with theme support. +- lazygit: terminal UI for git with theme support. +- gitui: terminal UI for git with color customization. +- tig: text-mode git interface with color customization. +- fd: find alternative with color output. +- jq: JSON processor with syntax highlighting. +- less: pager with color support via LESS_TERMCAP. +- zoxide: smart cd command with prompt integration. +- atuin: shell history with TUI theming. + +## 5. Editors + +- Neovim minimal: + - Lua module everforest_minimal.lua. + - Accepts setup({ variant, contrast }). + - Applies highlights from palette tokens. +- VS Code: + - Generated themes for all six variants. + - package.json scaffold. + - Extension can be launched in Dev Host. +- JetBrains (unified): + - Single .icls theme files for all variants. + - Compatible with IntelliJ, WebStorm, PyCharm, CLion, GoLand, PHPStorm, Rider. +- Zed: + - JSON theme files for all six variants. +- Sublime Text: + - .sublime-color-scheme files for all six variants. + +## 6. Web + +- CSS vars with media queries. +- Playwright snapshots in CI for dark/light Γ— hard/medium/soft. + +## 7. Installer + +- cli/install.sh deploys all configs under ~/.config. +- Symlinks or copies files for shells, tools, editors unless file already exists. +- If file already exists, check if it is an Everforest config. + - If it is, overwrite with new version. +- Also loads dircolors automatically if available. + +## 8. Verifier + +- verify/verify.sh builds a Debian container with all cli tools. +- Sources and validates all generated configs. +- CI job cli-verify runs installer + verifier. + +## 9. CI/CD + +- build: generator + validation. +- snapshots: Playwright demo renders, upload PNGs. +- commitlint: Conventional Commits enforcement. +- cli-verify: install + verify generated configs. +- Branch protection requires build + snapshots + commitlint + cli-verify. + +## 10. Contributing + +- Edit only palettes/everforest.(json|yaml) and template.txt files. +- Templates use placeholders: {{bg}}, {{fg}}, {{red}}, {{orange}}, {{yellow}}, {{green}}, {{aqua}}, {{blue}}, {{purple}}, {{gray1}}, {{gray2}}, {{gray3}}. +- Run npm run generate and commit both palette + template + generated files. +- Pre-commit hooks block raw hex and enforce regeneration. +- LLM AGENTS SHALL NOT DEVIATE FROM THE THEME SPEC. + +TL;DR (README section) + +1. Edit only palettes and templates. +2. Run generate. +3. Commit palette + template + generated. +4. CI must pass build + snapshots + verify. + +CODEOWNERS + +`* @ivuorinen` + +CONTRIBUTING.md rules + +- Never hardcode hex outside palettes. +- Do not hand-edit generated files. +- Edit templates using color placeholders only. +- Add new targets by extending generator. +- Commit style: Conventional Commits. +- PR checklist: palette/template edits, regenerated, validated, snapshots included. + +## 11. Makefile + +Convenience targets: +generate β†’ npm run generate +validate β†’ npm run validate +ci β†’ npm run ci +install-lscolors β†’ copy LS_COLORS snippet +demo β†’ run web demo server +snapshots β†’ run Playwright snapshots + +## 12. Docs `docs/CLI.md` + +### Everforest CLI + +Contains overview of terminals, web, CLI tools, prompts, editors. +Install with ./cli/install.sh +Verify with ENGINE=docker ./verify/verify.sh + +Notes: +LLM AGENTS SHALL NOT DEVIATE FROM THE THEME SPEC. Use palettes or ANSI names. No raw hex. + +## 13. Release Checklist + +- Tag version (start v0.1.0). +- Ensure build, snapshots, verify all pass. +- Package VS Code extension (vsix). +- Announce as unofficial Everforest resource hub. + +## 14. Enforcement + +- Indented code blocks MUST be used in all docs. +- No triple backticks allowed. +- All new contributions MUST follow this spec exactly. diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..81c15b5 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,155 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## Project Overview + +This is the **everforest-resources** repository - an unofficial hub for Everforest color scheme resources. The project follows a **generator-first** approach where all theme files, configurations, and outputs are generated from canonical palette definitions. + +**Critical Rule**: LLM AGENTS SHALL NOT DEVIATE FROM THE THEME SPEC. All changes must strictly follow the specification in AGENTS.md. + +## Architecture + +### Core Philosophy + +- **Generator-first**: All outputs derive from `palettes/everforest.(json|yaml)` +- **Template system**: CLI tools use `template.txt` files with color placeholders (e.g., `{{bg}}`, `{{fg}}`, `{{red}}`) that are replaced by the generator +- **No manual edits**: Generated artifacts MUST NOT be hand-edited +- **ANSI-only for CLI**: CLI tools use ANSI-16 SGR codes only, never raw hex +- **Hex for GUI**: GUI/editor themes may use hex values but only from generator output + +### Repository Structure + +- `palettes/`: Canonical Everforest palette definitions (JSON/YAML) +- `scripts/`: Generator scripts (Node.js .mjs modules) +- `terminals/`: Terminal configs (WezTerm, Alacritty, Kitty, Windows Terminal, Ghostty) +- `web/`: CSS variables and demo with Playwright snapshots +- `cli/`: CLI tool configs (LS_COLORS, dircolors, eza, ripgrep, fzf, delta, bat, htop, starship, zsh, fish, tmux, btop, bottom, glances, neofetch, ranger, lf, mc, lazygit, gitui, tig, fd, jq, less, zoxide, atuin) +- `editors/`: Editor themes (Neovim minimal Lua, VS Code, JetBrains unified, Zed, Sublime Text) +- `docs/`: Documentation (CLI.md) +- `verify/`: Container verifier +- `.github/`: Workflows and CODEOWNERS + +### Theme Variants + +- Six variants total: dark/light Γ— hard/medium/soft + - If variant missing, fallback to medium + - All variants MUST be present for terminals, CLI tools, editors, web + +## Development Commands + +Core development commands for the project: + + npm run lint # Check code with Biome linter + npm run lint:fix # Auto-fix linting issues with Biome + npm run format # Format code with Biome + npm run generate # Generate all theme files from palettes + npm run validate # Validate generated outputs + npm run ci # Run full CI suite (lint + generate + validate + snapshots) + npm run snapshots # Generate Playwright snapshots + make generate # Alternative to npm run generate + make validate # Alternative to npm run validate + make ci # Alternative to npm run ci + make install-lscolors # Copy LS_COLORS snippet + make demo # Run web demo server + make snapshots # Run Playwright snapshots + +## Installation and Verification + + ./cli/install.sh # Deploy all configs to ~/.config + ENGINE=docker ./verify/verify.sh # Verify in container + +## Implementation Guidelines + +### Editing Rules + +1. **Only edit palette and template files**: Changes should only be made to `palettes/everforest.(json|yaml)` and `template.txt` files +2. **Template placeholders**: Use `{{bg}}`, `{{fg}}`, `{{red}}`, `{{orange}}`, `{{yellow}}`, `{{green}}`, `{{aqua}}`, `{{blue}}`, `{{purple}}`, `{{gray1}}`, `{{gray2}}`, `{{gray3}}` +3. **Never hand-edit outputs**: All generated files are regenerated automatically +4. **Run generator after changes**: Always regenerate after palette or template modifications +5. **Commit all sources**: Include palette, template, and generated files in commits + +### Code Quality + +- **Biome linting**: All JavaScript code must pass Biome linting and formatting +- **Auto-formatting**: Use `npm run format` to ensure consistent code style +- **No raw hex in CLI configs**: Use ANSI color names/codes only +- **Use indented code blocks**: Never use triple backticks in documentation +- **Follow conventional commits**: All commits must follow conventional commit format +- **Pre-commit validation**: Pre-commit hooks prevent raw hex and enforce regeneration + +### Generator Architecture + +The main generator (`scripts/generate-themes.mjs`) implements: + +- Palette loader for JSON/YAML +- Template processor: reads `template.txt` files and replaces placeholders with palette values +- Writers for each target (terminals, CLI tools, editors, web) +- Variant generation (all 6 variants where applicable) +- ANSI mapping for CLI tools +- Hex output for GUI applications + +### CLI Tool Specifications + +- **LS_COLORS**: Archivesβ†’bold yellow, imagesβ†’purple, docsβ†’blue +- **ripgrep**: ripgreprc with ANSI mappings +- **fzf**: FZF_DEFAULT_OPTS with Everforest accents +- **delta**: git-delta config with ANSI mapping +- **bat**: Minimal config forwarding to terminal theme +- **htop**: htoprc with color_scheme=0 +- **starship**: starship.toml with accent mappings +- **fish**: Color schemes + minimal prompt + Tide preset +- **tmux**: everforest.tmux.conf with ANSI mappings +- **btop**: Modern htop alternative with extensive color customization +- **bottom**: Cross-platform system monitor (Rust) with color themes +- **glances**: System monitoring tool with color themes +- **neofetch**: System information display with color support +- **ranger**: Terminal file manager with color scheme support +- **lf**: Lightweight file manager (ranger alternative) +- **mc**: Midnight Commander with theme support +- **lazygit**: Terminal UI for git with theme support +- **gitui**: Terminal UI for git with color customization +- **tig**: Text-mode git interface with color customization +- **fd**: Find alternative with color output +- **jq**: JSON processor with syntax highlighting +- **less**: Pager with color support via LESS_TERMCAP +- **zoxide**: Smart cd command with prompt integration +- **atuin**: Shell history with TUI theming + +## CI/CD Pipeline + +Required checks (all must pass for merge): + +- **lint**: Biome linting and formatting checks +- **build**: Generator + validation +- **snapshots**: Playwright demo renders +- **commitlint**: Conventional Commits enforcement +- **cli-verify**: Install + verify generated configs + +## Contributing Workflow + +1. Edit only `palettes/everforest.(json|yaml)` and `template.txt` files +2. Use template placeholders: `{{bg}}`, `{{fg}}`, `{{red}}`, `{{orange}}`, `{{yellow}}`, `{{green}}`, `{{aqua}}`, `{{blue}}`, `{{purple}}`, `{{gray1}}`, `{{gray2}}`, `{{gray3}}` +3. Lint and format code: `npm run lint:fix && npm run format` +4. Run `npm run generate` (when implemented) +5. Commit palette + template + generated files +6. Ensure all CI checks pass +7. Follow conventional commit format + +## Documentation Rules + +- **Indented code blocks only**: Never use triple backticks (```) +- **Examples use 4-space indentation** +- **Generator-derived content**: Don't document what can be discovered from files +- **Focus on architecture**: Document high-level patterns requiring multiple files to understand + +## Current Status + +The repository is in initial development phase: +- βœ… Palette definitions created +- βœ… Comprehensive specification written +- ⏳ Generator implementation pending +- ⏳ File structure creation pending +- ⏳ CI/CD setup pending + +Follow the implementation steps in `meta/implementation-steps.md` for systematic development. diff --git a/README.md b/README.md new file mode 100644 index 0000000..507e813 --- /dev/null +++ b/README.md @@ -0,0 +1,49 @@ +# Everforest Resources + +Unofficial hub for Everforest color scheme resources. Generator-first approach for terminals, CLI tools, editors, and web. + +## Quick Start + + # Generate all themes + npm run generate + + # Install CLI configurations + ./cli/install.sh + + # Verify installation + ENGINE=docker ./verify/verify.sh + +## Supported Tools + +### Terminals +WezTerm, Alacritty, Kitty, Windows Terminal, Ghostty + +### CLI Tools +Starship, FZF, Delta, Tmux, Fish, LS_COLORS, and 20+ more + +### Editors +Neovim, VS Code, JetBrains IDEs, Zed, Sublime Text + +## Theme Variants + +6 variants total: dark/light Γ— hard/medium/soft + +## Development + + npm run lint # Lint code + npm run generate # Generate themes + npm run validate # Validate outputs + npm run ci # Full CI pipeline + +## Contributing + +1. Edit only `palettes/everforest.json` and `template.txt` files +2. Run `npm run generate` +3. Commit palette + template + generated files +4. Follow conventional commits + +**Important**: Never edit generated files directly. All outputs are generated from templates. + +## CI Requirements + +All checks must pass: lint + build + snapshots + commitlint + cli-verify diff --git a/biome.json b/biome.json new file mode 100644 index 0000000..14d0dd3 --- /dev/null +++ b/biome.json @@ -0,0 +1,54 @@ +{ + "$schema": "https://biomejs.dev/schemas/2.2.3/schema.json", + "linter": { + "enabled": true, + "rules": { + "recommended": true, + "style": { + "noNonNullAssertion": "off", + "useConst": "error", + "useBlockStatements": "error" + }, + "correctness": { + "noUnusedVariables": "error", + "useExhaustiveDependencies": "off" + }, + "suspicious": { + "noExplicitAny": "warn", + "noArrayIndexKey": "off", + "useIterableCallbackReturn": "off" + }, + "complexity": { + "noForEach": "off", + "useLiteralKeys": "off" + } + } + }, + "formatter": { + "enabled": true, + "formatWithErrors": false, + "indentStyle": "space", + "indentWidth": 2, + "lineWidth": 100, + "lineEnding": "lf" + }, + "javascript": { + "formatter": { + "quoteStyle": "single", + "jsxQuoteStyle": "double", + "trailingCommas": "es5", + "semicolons": "always", + "arrowParentheses": "asNeeded" + } + }, + "json": { + "formatter": { + "enabled": true, + "indentWidth": 2 + } + }, + "files": { + "includes": ["scripts/**/*.mjs", "scripts/**/*.js", "*.json", "*.mjs", "*.js"], + "ignoreUnknown": false + } +} diff --git a/cli/delta/gitconfig.delta b/cli/delta/gitconfig.delta new file mode 100644 index 0000000..f817124 --- /dev/null +++ b/cli/delta/gitconfig.delta @@ -0,0 +1,22 @@ +# Everforest theme for git-delta +# Generated from template - do not edit manually + +[delta] + syntax-theme = none + file-style = bold + file-decoration-style = none + hunk-header-decoration-style = cyan box ul + line-numbers = true + line-numbers-left-style = cyan + line-numbers-right-style = cyan + line-numbers-minus-style = red + line-numbers-plus-style = green + line-numbers-zero-style = "##b3c0b0" + minus-style = syntax "##e67e80" + minus-emph-style = syntax "##e67e80" + plus-style = syntax "##a7c080" + plus-emph-style = syntax "##a7c080" + zero-style = syntax + blame-code-style = syntax + blame-format = "{author:<18} ({commit:>8}) {timestamp:^16} " + blame-palette = "##a6b0a0" "##b3c0b0" "##c0cdb8" diff --git a/cli/delta/template.txt b/cli/delta/template.txt new file mode 100644 index 0000000..bb035dd --- /dev/null +++ b/cli/delta/template.txt @@ -0,0 +1,22 @@ +# Everforest theme for git-delta +# Generated from template - do not edit manually + +[delta] + syntax-theme = none + file-style = bold + file-decoration-style = none + hunk-header-decoration-style = cyan box ul + line-numbers = true + line-numbers-left-style = cyan + line-numbers-right-style = cyan + line-numbers-minus-style = red + line-numbers-plus-style = green + line-numbers-zero-style = "#{{gray2}}" + minus-style = syntax "#{{red}}" + minus-emph-style = syntax "#{{red}}" + plus-style = syntax "#{{green}}" + plus-emph-style = syntax "#{{green}}" + zero-style = syntax + blame-code-style = syntax + blame-format = "{author:<18} ({commit:>8}) {timestamp:^16} " + blame-palette = "#{{gray1}}" "#{{gray2}}" "#{{gray3}}" diff --git a/cli/fish/colors-template.txt b/cli/fish/colors-template.txt new file mode 100644 index 0000000..6487bee --- /dev/null +++ b/cli/fish/colors-template.txt @@ -0,0 +1,24 @@ +# Everforest color scheme for fish shell +# Generated from template - do not edit manually + +# Set fish colors +set -U fish_color_normal {{fg}} +set -U fish_color_command {{blue}} +set -U fish_color_keyword {{purple}} +set -U fish_color_quote {{yellow}} +set -U fish_color_redirection {{aqua}} +set -U fish_color_end {{orange}} +set -U fish_color_error {{red}} +set -U fish_color_param {{fg}} +set -U fish_color_comment {{gray1}} +set -U fish_color_selection --background={{bg1}} +set -U fish_color_search_match --background={{bg1}} +set -U fish_color_operator {{green}} +set -U fish_color_escape {{purple}} +set -U fish_color_autosuggestion {{gray2}} + +# Set fish pager colors +set -U fish_pager_color_progress {{gray3}} +set -U fish_pager_color_prefix {{blue}} +set -U fish_pager_color_completion {{fg}} +set -U fish_pager_color_description {{gray2}} diff --git a/cli/fish/everforest-dark-hard.fish b/cli/fish/everforest-dark-hard.fish new file mode 100644 index 0000000..1dd37a3 --- /dev/null +++ b/cli/fish/everforest-dark-hard.fish @@ -0,0 +1,24 @@ +# Everforest color scheme for fish shell +# Generated from template - do not edit manually + +# Set fish colors +set -U fish_color_normal #d3c6aa +set -U fish_color_command #7fbbb3 +set -U fish_color_keyword #d699b6 +set -U fish_color_quote #dbbc7f +set -U fish_color_redirection #83c092 +set -U fish_color_end #e69875 +set -U fish_color_error #e67e80 +set -U fish_color_param #d3c6aa +set -U fish_color_comment #7a8478 +set -U fish_color_selection --background=#323c41 +set -U fish_color_search_match --background=#323c41 +set -U fish_color_operator #a7c080 +set -U fish_color_escape #d699b6 +set -U fish_color_autosuggestion #859289 + +# Set fish pager colors +set -U fish_pager_color_progress #9da9a0 +set -U fish_pager_color_prefix #7fbbb3 +set -U fish_pager_color_completion #d3c6aa +set -U fish_pager_color_description #859289 diff --git a/cli/fish/everforest-dark-medium.fish b/cli/fish/everforest-dark-medium.fish new file mode 100644 index 0000000..b358faf --- /dev/null +++ b/cli/fish/everforest-dark-medium.fish @@ -0,0 +1,24 @@ +# Everforest color scheme for fish shell +# Generated from template - do not edit manually + +# Set fish colors +set -U fish_color_normal #d3c6aa +set -U fish_color_command #7fbbb3 +set -U fish_color_keyword #d699b6 +set -U fish_color_quote #dbbc7f +set -U fish_color_redirection #83c092 +set -U fish_color_end #e69875 +set -U fish_color_error #e67e80 +set -U fish_color_param #d3c6aa +set -U fish_color_comment #7a8478 +set -U fish_color_selection --background=#374247 +set -U fish_color_search_match --background=#374247 +set -U fish_color_operator #a7c080 +set -U fish_color_escape #d699b6 +set -U fish_color_autosuggestion #859289 + +# Set fish pager colors +set -U fish_pager_color_progress #9da9a0 +set -U fish_pager_color_prefix #7fbbb3 +set -U fish_pager_color_completion #d3c6aa +set -U fish_pager_color_description #859289 diff --git a/cli/fish/everforest-dark-soft.fish b/cli/fish/everforest-dark-soft.fish new file mode 100644 index 0000000..2b40e97 --- /dev/null +++ b/cli/fish/everforest-dark-soft.fish @@ -0,0 +1,24 @@ +# Everforest color scheme for fish shell +# Generated from template - do not edit manually + +# Set fish colors +set -U fish_color_normal #d3c6aa +set -U fish_color_command #7fbbb3 +set -U fish_color_keyword #d699b6 +set -U fish_color_quote #dbbc7f +set -U fish_color_redirection #83c092 +set -U fish_color_end #e69875 +set -U fish_color_error #e67e80 +set -U fish_color_param #d3c6aa +set -U fish_color_comment #7a8478 +set -U fish_color_selection --background=#3a464c +set -U fish_color_search_match --background=#3a464c +set -U fish_color_operator #a7c080 +set -U fish_color_escape #d699b6 +set -U fish_color_autosuggestion #859289 + +# Set fish pager colors +set -U fish_pager_color_progress #9da9a0 +set -U fish_pager_color_prefix #7fbbb3 +set -U fish_pager_color_completion #d3c6aa +set -U fish_pager_color_description #859289 diff --git a/cli/fish/everforest-light-hard.fish b/cli/fish/everforest-light-hard.fish new file mode 100644 index 0000000..d4eb633 --- /dev/null +++ b/cli/fish/everforest-light-hard.fish @@ -0,0 +1,24 @@ +# Everforest color scheme for fish shell +# Generated from template - do not edit manually + +# Set fish colors +set -U fish_color_normal #5c6a72 +set -U fish_color_command #7fbbb3 +set -U fish_color_keyword #d699b6 +set -U fish_color_quote #dbbc7f +set -U fish_color_redirection #83c092 +set -U fish_color_end #e69875 +set -U fish_color_error #e67e80 +set -U fish_color_param #5c6a72 +set -U fish_color_comment #a6b0a0 +set -U fish_color_selection --background=#f4f0d9 +set -U fish_color_search_match --background=#f4f0d9 +set -U fish_color_operator #a7c080 +set -U fish_color_escape #d699b6 +set -U fish_color_autosuggestion #b3c0b0 + +# Set fish pager colors +set -U fish_pager_color_progress #c0cdb8 +set -U fish_pager_color_prefix #7fbbb3 +set -U fish_pager_color_completion #5c6a72 +set -U fish_pager_color_description #b3c0b0 diff --git a/cli/fish/everforest-light-medium.fish b/cli/fish/everforest-light-medium.fish new file mode 100644 index 0000000..2523475 --- /dev/null +++ b/cli/fish/everforest-light-medium.fish @@ -0,0 +1,24 @@ +# Everforest color scheme for fish shell +# Generated from template - do not edit manually + +# Set fish colors +set -U fish_color_normal #5c6a72 +set -U fish_color_command #7fbbb3 +set -U fish_color_keyword #d699b6 +set -U fish_color_quote #dbbc7f +set -U fish_color_redirection #83c092 +set -U fish_color_end #e69875 +set -U fish_color_error #e67e80 +set -U fish_color_param #5c6a72 +set -U fish_color_comment #a6b0a0 +set -U fish_color_selection --background=#ede6cf +set -U fish_color_search_match --background=#ede6cf +set -U fish_color_operator #a7c080 +set -U fish_color_escape #d699b6 +set -U fish_color_autosuggestion #b3c0b0 + +# Set fish pager colors +set -U fish_pager_color_progress #c0cdb8 +set -U fish_pager_color_prefix #7fbbb3 +set -U fish_pager_color_completion #5c6a72 +set -U fish_pager_color_description #b3c0b0 diff --git a/cli/fish/everforest-light-soft.fish b/cli/fish/everforest-light-soft.fish new file mode 100644 index 0000000..0d08e86 --- /dev/null +++ b/cli/fish/everforest-light-soft.fish @@ -0,0 +1,24 @@ +# Everforest color scheme for fish shell +# Generated from template - do not edit manually + +# Set fish colors +set -U fish_color_normal #5c6a72 +set -U fish_color_command #7fbbb3 +set -U fish_color_keyword #d699b6 +set -U fish_color_quote #dbbc7f +set -U fish_color_redirection #83c092 +set -U fish_color_end #e69875 +set -U fish_color_error #e67e80 +set -U fish_color_param #5c6a72 +set -U fish_color_comment #a6b0a0 +set -U fish_color_selection --background=#e9e1cc +set -U fish_color_search_match --background=#e9e1cc +set -U fish_color_operator #a7c080 +set -U fish_color_escape #d699b6 +set -U fish_color_autosuggestion #b3c0b0 + +# Set fish pager colors +set -U fish_pager_color_progress #c0cdb8 +set -U fish_pager_color_prefix #7fbbb3 +set -U fish_pager_color_completion #5c6a72 +set -U fish_pager_color_description #b3c0b0 diff --git a/cli/fzf/README.md b/cli/fzf/README.md new file mode 100644 index 0000000..7e7915d --- /dev/null +++ b/cli/fzf/README.md @@ -0,0 +1,14 @@ +# FZF Everforest Theme + +This directory contains the Everforest theme for fzf fuzzy finder. + +## Installation + + # Source the theme in your shell rc file + source ~/.config/fzf/everforest.sh + +## Generated Files + +- `everforest.sh` - Shell script with FZF_DEFAULT_OPTS export + +All files are generated from `template.txt` - do not edit the generated files directly. diff --git a/cli/fzf/everforest.sh b/cli/fzf/everforest.sh new file mode 100644 index 0000000..48313ad --- /dev/null +++ b/cli/fzf/everforest.sh @@ -0,0 +1,7 @@ +# Everforest theme for fzf +# Generated from template - do not edit manually + +export FZF_DEFAULT_OPTS=" \ +--color=bg+:##e9e1cc,bg:##f0e5cf,spinner:##83c092,hl:##a7c080 \ +--color=fg:##5c6a72,header:##a7c080,info:##dbbc7f,pointer:##83c092 \ +--color=marker:##83c092,fg+:##5c6a72,prompt:##dbbc7f,hl+:##a7c080" diff --git a/cli/fzf/template.txt b/cli/fzf/template.txt new file mode 100644 index 0000000..351ce9b --- /dev/null +++ b/cli/fzf/template.txt @@ -0,0 +1,7 @@ +# Everforest theme for fzf +# Generated from template - do not edit manually + +export FZF_DEFAULT_OPTS=" \ +--color=bg+:#{{bg1}},bg:#{{bg}},spinner:#{{aqua}},hl:#{{green}} \ +--color=fg:#{{fg}},header:#{{green}},info:#{{yellow}},pointer:#{{aqua}} \ +--color=marker:#{{aqua}},fg+:#{{fg}},prompt:#{{yellow}},hl+:#{{green}}" diff --git a/cli/install.sh b/cli/install.sh new file mode 100755 index 0000000..35b2d1d --- /dev/null +++ b/cli/install.sh @@ -0,0 +1,59 @@ +#!/usr/bin/env bash + +# Everforest Resources Installer +# Installs all CLI tool configurations to ~/.config + +set -euo pipefail + +CONFIG_DIR="${HOME}/.config" +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +echo "🎨 Installing Everforest CLI configurations..." + +# Create config directories +mkdir -p "${CONFIG_DIR}/starship" +mkdir -p "${CONFIG_DIR}/fzf" +mkdir -p "${CONFIG_DIR}/git" +mkdir -p "${CONFIG_DIR}/fish" +mkdir -p "${CONFIG_DIR}/tmux" + +# Install configurations +install_config() { + local tool="$1" + local file="$2" + local target="$3" + + if [[ -f "${SCRIPT_DIR}/${tool}/${file}" ]]; then + echo "πŸ“ Installing ${tool}/${file} -> ${target}" + cp "${SCRIPT_DIR}/${tool}/${file}" "${target}" + else + echo "⚠️ Warning: ${tool}/${file} not found (may not be generated yet)" + fi +} + +# Install tool configurations +install_config "starship" "starship.toml" "${CONFIG_DIR}/starship/starship.toml" +install_config "fzf" "everforest.sh" "${CONFIG_DIR}/fzf/everforest.sh" +install_config "delta" "gitconfig.delta" "${CONFIG_DIR}/git/everforest-delta" +install_config "tmux" "everforest.tmux.conf" "${CONFIG_DIR}/tmux/everforest.conf" + +# Install fish colors (all variants) +for variant in dark-hard dark-medium dark-soft light-hard light-medium light-soft; do + install_config "fish" "everforest-${variant}.fish" "${CONFIG_DIR}/fish/conf.d/everforest-${variant}.fish" +done + +# Install LS_COLORS +if [[ -f "${SCRIPT_DIR}/ls_colors/everforest.sh" ]]; then + echo "πŸ“ Installing LS_COLORS" + mkdir -p "${CONFIG_DIR}/dircolors" + cp "${SCRIPT_DIR}/ls_colors/everforest.sh" "${CONFIG_DIR}/dircolors/everforest.sh" + cp "${SCRIPT_DIR}/ls_colors/dircolors" "${CONFIG_DIR}/dircolors/everforest" +fi + +echo "βœ… Installation complete!" +echo "" +echo "To use the themes:" +echo " - Starship: export STARSHIP_CONFIG=~/.config/starship/starship.toml" +echo " - FZF: source ~/.config/fzf/everforest.sh" +echo " - LS_COLORS: source ~/.config/dircolors/everforest.sh" +echo " - Fish: restart fish or run 'exec fish'" diff --git a/cli/ls_colors/everforest.sh b/cli/ls_colors/everforest.sh new file mode 100644 index 0000000..96dd772 --- /dev/null +++ b/cli/ls_colors/everforest.sh @@ -0,0 +1,5 @@ +# Everforest LS_COLORS configuration +# Generated from template - do not edit manually + +# Main LS_COLORS export +export LS_COLORS="rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:" diff --git a/cli/ls_colors/template.txt b/cli/ls_colors/template.txt new file mode 100644 index 0000000..96dd772 --- /dev/null +++ b/cli/ls_colors/template.txt @@ -0,0 +1,5 @@ +# Everforest LS_COLORS configuration +# Generated from template - do not edit manually + +# Main LS_COLORS export +export LS_COLORS="rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:" diff --git a/cli/starship/README.md b/cli/starship/README.md new file mode 100644 index 0000000..97b1f7e --- /dev/null +++ b/cli/starship/README.md @@ -0,0 +1,14 @@ +# Starship Everforest Theme + +This directory contains the Everforest theme for Starship prompt. + +## Installation + + # Copy the generated theme to your starship config + cp starship.toml ~/.config/starship.toml + +## Generated Files + +- `starship.toml` - Starship configuration with Everforest colors + +All files are generated from `template.txt` - do not edit the generated files directly. diff --git a/cli/starship/starship.toml b/cli/starship/starship.toml new file mode 100644 index 0000000..c8a01c3 --- /dev/null +++ b/cli/starship/starship.toml @@ -0,0 +1,63 @@ +# Everforest theme for Starship +# Generated from template - do not edit manually + +format = """ +[](##e9e1cc)\ +$username\ +[](bg:##e4dfc8 fg:##e9e1cc)\ +$directory\ +[](fg:##e4dfc8 bg:##f0e5cf)\ +$git_branch\ +$git_status\ +[](fg:##f0e5cf bg:##e9e1cc)\ +$nodejs\ +$rust\ +$golang\ +$php\ +[](fg:##e9e1cc)\ +""" + +# Disable the blank line at the start of the prompt +add_newline = false + +[username] +show_always = true +style_user = "bg:##e9e1cc fg:##5c6a72" +style_root = "bg:##e9e1cc fg:##e67e80" +format = '[$user ]($style)' +disabled = false + +[directory] +style = "bg:##e4dfc8 fg:##7fbbb3" +format = "[ $path ]($style)" +truncation_length = 3 +truncation_symbol = "…/" + +[git_branch] +symbol = "" +style = "bg:##f0e5cf fg:##a7c080" +format = '[ $symbol $branch ]($style)' + +[git_status] +style = "bg:##f0e5cf fg:##e67e80" +format = '[$all_status$ahead_behind ]($style)' + +[nodejs] +symbol = "" +style = "bg:##e9e1cc fg:##dbbc7f" +format = '[ $symbol ($version) ]($style)' + +[rust] +symbol = "" +style = "bg:##e9e1cc fg:##e69875" +format = '[ $symbol ($version) ]($style)' + +[golang] +symbol = "" +style = "bg:##e9e1cc fg:##83c092" +format = '[ $symbol ($version) ]($style)' + +[php] +symbol = "" +style = "bg:##e9e1cc fg:##d699b6" +format = '[ $symbol ($version) ]($style)' diff --git a/cli/starship/template.txt b/cli/starship/template.txt new file mode 100644 index 0000000..b76b1a1 --- /dev/null +++ b/cli/starship/template.txt @@ -0,0 +1,63 @@ +# Everforest theme for Starship +# Generated from template - do not edit manually + +format = """ +[](#{{bg1}})\ +$username\ +[](bg:#{{bg2}} fg:#{{bg1}})\ +$directory\ +[](fg:#{{bg2}} bg:#{{bg}})\ +$git_branch\ +$git_status\ +[](fg:#{{bg}} bg:#{{bg1}})\ +$nodejs\ +$rust\ +$golang\ +$php\ +[](fg:#{{bg1}})\ +""" + +# Disable the blank line at the start of the prompt +add_newline = false + +[username] +show_always = true +style_user = "bg:#{{bg1}} fg:#{{fg}}" +style_root = "bg:#{{bg1}} fg:#{{red}}" +format = '[$user ]($style)' +disabled = false + +[directory] +style = "bg:#{{bg2}} fg:#{{blue}}" +format = "[ $path ]($style)" +truncation_length = 3 +truncation_symbol = "…/" + +[git_branch] +symbol = "" +style = "bg:#{{bg}} fg:#{{green}}" +format = '[ $symbol $branch ]($style)' + +[git_status] +style = "bg:#{{bg}} fg:#{{red}}" +format = '[$all_status$ahead_behind ]($style)' + +[nodejs] +symbol = "" +style = "bg:#{{bg1}} fg:#{{yellow}}" +format = '[ $symbol ($version) ]($style)' + +[rust] +symbol = "" +style = "bg:#{{bg1}} fg:#{{orange}}" +format = '[ $symbol ($version) ]($style)' + +[golang] +symbol = "" +style = "bg:#{{bg1}} fg:#{{aqua}}" +format = '[ $symbol ($version) ]($style)' + +[php] +symbol = "" +style = "bg:#{{bg1}} fg:#{{purple}}" +format = '[ $symbol ($version) ]($style)' diff --git a/cli/tmux/everforest.tmux.conf b/cli/tmux/everforest.tmux.conf new file mode 100644 index 0000000..c9e5d49 --- /dev/null +++ b/cli/tmux/everforest.tmux.conf @@ -0,0 +1,31 @@ +# Everforest theme for tmux +# Generated from template - do not edit manually + +# Basic color scheme +set -g default-terminal "screen-256color" + +# Window tabs +set -g window-status-current-style "fg=#5c6a72,bg=#e9e1cc" +set -g window-status-style "fg=#b3c0b0,bg=#f0e5cf" +set -g window-status-activity-style "fg=#dbbc7f,bg=#f0e5cf" + +# Pane borders +set -g pane-active-border-style "fg=#a7c080" +set -g pane-border-style "fg=#a6b0a0" + +# Status line +set -g status-style "fg=#5c6a72,bg=#f0e5cf" +set -g status-left-style "fg=#5c6a72,bg=#e9e1cc" +set -g status-right-style "fg=#5c6a72,bg=#e9e1cc" + +# Messages +set -g message-style "fg=#5c6a72,bg=#e9e1cc" +set -g message-command-style "fg=#5c6a72,bg=#e9e1cc" + +# Status bar content +set -g status-left "#[fg=#a7c080]#S #[default]" +set -g status-right "#[fg=#7fbbb3]%H:%M #[fg=#dbbc7f]%d-%b-%y" + +# Window list +set -g window-status-format " #I:#W " +set -g window-status-current-format " #[fg=#f0e5cf,bg=#a7c080] #I:#W #[default]" diff --git a/cli/tmux/template.txt b/cli/tmux/template.txt new file mode 100644 index 0000000..7a96c6f --- /dev/null +++ b/cli/tmux/template.txt @@ -0,0 +1,31 @@ +# Everforest theme for tmux +# Generated from template - do not edit manually + +# Basic color scheme +set -g default-terminal "screen-256color" + +# Window tabs +set -g window-status-current-style "fg={{fg}},bg={{bg1}}" +set -g window-status-style "fg={{gray2}},bg={{bg}}" +set -g window-status-activity-style "fg={{yellow}},bg={{bg}}" + +# Pane borders +set -g pane-active-border-style "fg={{green}}" +set -g pane-border-style "fg={{gray1}}" + +# Status line +set -g status-style "fg={{fg}},bg={{bg}}" +set -g status-left-style "fg={{fg}},bg={{bg1}}" +set -g status-right-style "fg={{fg}},bg={{bg1}}" + +# Messages +set -g message-style "fg={{fg}},bg={{bg1}}" +set -g message-command-style "fg={{fg}},bg={{bg1}}" + +# Status bar content +set -g status-left "#[fg={{green}}]#S #[default]" +set -g status-right "#[fg={{blue}}]%H:%M #[fg={{yellow}}]%d-%b-%y" + +# Window list +set -g window-status-format " #I:#W " +set -g window-status-current-format " #[fg={{bg}},bg={{green}}] #I:#W #[default]" diff --git a/commitlint.config.js b/commitlint.config.js new file mode 100644 index 0000000..10b5e84 --- /dev/null +++ b/commitlint.config.js @@ -0,0 +1,25 @@ +export default { + extends: ['@commitlint/config-conventional'], + rules: { + 'type-enum': [ + 2, + 'always', + [ + 'feat', + 'fix', + 'docs', + 'style', + 'refactor', + 'perf', + 'test', + 'build', + 'ci', + 'chore', + 'revert', + ], + ], + 'subject-case': [2, 'never', ['pascal-case', 'upper-case']], + 'subject-max-length': [2, 'always', 72], + 'body-max-line-length': [2, 'always', 100], + }, +}; diff --git a/docs/CLI.md b/docs/CLI.md new file mode 100644 index 0000000..a6e0f90 --- /dev/null +++ b/docs/CLI.md @@ -0,0 +1,54 @@ +# Everforest CLI + +Command-line tools and terminal configurations for the Everforest color scheme. + +## Installation + + ./cli/install.sh + +This installs configurations for all supported CLI tools to `~/.config`. + +## Supported Tools + +### Shell & Terminal +- **Starship**: Cross-shell prompt with Everforest colors +- **Fish**: Shell colors and prompt themes +- **Tmux**: Terminal multiplexer theme +- **LS_COLORS**: Directory colors for `ls` and file managers + +### Development Tools +- **FZF**: Fuzzy finder with Everforest colors +- **Delta**: Git diff viewer theme +- **Ripgrep**: Search tool colors +- **Bat**: Syntax highlighter theme + +### System Tools +- **Htop**: System monitor colors +- **Btop**: Modern system monitor theme + +## Usage Examples + +After installation: + + # Set Starship theme + export STARSHIP_CONFIG=~/.config/starship/starship.toml + + # Load FZF colors + source ~/.config/fzf/everforest.sh + + # Load LS_COLORS + source ~/.config/dircolors/everforest.sh + +## Verification + + ENGINE=docker ./verify/verify.sh + +Tests all configurations in a clean container environment. + +## Theme Variants + +Each tool supports 6 variants: +- `dark-hard`, `dark-medium`, `dark-soft` +- `light-hard`, `light-medium`, `light-soft` + +Default is `medium` contrast. diff --git a/meta/filetree.md b/meta/filetree.md new file mode 100644 index 0000000..e7d06f0 --- /dev/null +++ b/meta/filetree.md @@ -0,0 +1,253 @@ +# Everforest Resources β€” File Tree + +This file tree lists all directories and filenames defined in the consolidated spec. It represents the canonical layout of the github.com/ivuorinen/everforest-resources repository. + +## Root + + README.md + CONTRIBUTING.md + Makefile + package.json + commitlint.config.js + +## Palettes + + palettes/ + everforest.json + everforest.yaml + +## Scripts + + scripts/ + generate-themes.mjs + +## Terminals + + terminals/ + wezterm/ + everforest-dark-hard.toml + everforest-dark-medium.toml + everforest-dark-soft.toml + everforest-light-hard.toml + everforest-light-medium.toml + everforest-light-soft.toml + alacritty/ + everforest-dark-hard.yml + everforest-dark-medium.yml + everforest-dark-soft.yml + everforest-light-hard.yml + everforest-light-medium.yml + everforest-light-soft.yml + kitty/ + everforest-dark-hard.conf + everforest-dark-medium.conf + everforest-dark-soft.conf + everforest-light-hard.conf + everforest-light-medium.conf + everforest-light-soft.conf + ghostty/ + everforest-dark-hard.conf + everforest-dark-medium.conf + everforest-dark-soft.conf + everforest-light-hard.conf + everforest-light-medium.conf + everforest-light-soft.conf + windows-terminal/ + everforest-dark-hard.json + everforest-dark-medium.json + everforest-dark-soft.json + everforest-light-hard.json + everforest-light-medium.json + everforest-light-soft.json + +## Web + + web/ + css/ + everforest.css + demo/ + index.html + style.css + demo.js + +## CLI + + cli/ + ls_colors/ + template.txt + everforest.sh + dircolors + README.md + eza/ + template.txt + everforest.sh + README.md + htop/ + template.txt + htoprc.everforest + README.md + ripgrep/ + template.txt + ripgreprc + README.md + fzf/ + template.txt + everforest.sh + README.md + delta/ + template.txt + gitconfig.delta + README.md + bat/ + template.txt + bat.conf + README.md + starship/ + template.txt + starship.toml + README.md + zsh/ + pure-template.txt + p10k-template.txt + pure.zsh + p10k.zsh + README.md + fish/ + colors-template.txt + prompt-template.txt + tide-template.txt + everforest-dark-hard.fish + everforest-dark-medium.fish + everforest-dark-soft.fish + everforest-light-hard.fish + everforest-light-medium.fish + everforest-light-soft.fish + fish_prompt.fish + tide-preset.fish + README.md + tmux/ + template.txt + everforest.tmux.conf + README.md + btop/ + template.txt + everforest.conf + README.md + bottom/ + template.txt + everforest.toml + README.md + glances/ + template.txt + everforest.conf + README.md + neofetch/ + template.txt + everforest.conf + README.md + ranger/ + template.txt + everforest.py + README.md + lf/ + template.txt + lfrc.everforest + README.md + mc/ + template.txt + everforest.ini + README.md + lazygit/ + template.txt + everforest.yml + README.md + gitui/ + template.txt + everforest.ron + README.md + tig/ + template.txt + everforest.tigrc + README.md + fd/ + template.txt + everforest.sh + README.md + jq/ + template.txt + everforest.sh + README.md + less/ + template.txt + everforest.sh + README.md + zoxide/ + template.txt + everforest.sh + README.md + atuin/ + template.txt + everforest.toml + README.md + install.sh + +## Editors + + editors/ + vim-nvim/ + colors/ + everforest_minimal.lua + vscode/ + package.json + README.md + themes/ + everforest-dark-hard.json + everforest-dark-medium.json + everforest-dark-soft.json + everforest-light-hard.json + everforest-light-medium.json + everforest-light-soft.json + jetbrains/ + everforest-dark-hard.icls + everforest-dark-medium.icls + everforest-dark-soft.icls + everforest-light-hard.icls + everforest-light-medium.icls + everforest-light-soft.icls + README.md + zed/ + everforest-dark-hard.json + everforest-dark-medium.json + everforest-dark-soft.json + everforest-light-hard.json + everforest-light-medium.json + everforest-light-soft.json + README.md + sublime/ + everforest-dark-hard.sublime-color-scheme + everforest-dark-medium.sublime-color-scheme + everforest-dark-soft.sublime-color-scheme + everforest-light-hard.sublime-color-scheme + everforest-light-medium.sublime-color-scheme + everforest-light-soft.sublime-color-scheme + README.md + +## Docs + + docs/ + CLI.md + +## Verify + + verify/ + verify.sh + +## GitHub + + .github/ + workflows/ + build.yml + snapshots.yml + commitlint.yml + cli-verify.yml + CODEOWNERS diff --git a/meta/implementation-steps.md b/meta/implementation-steps.md new file mode 100644 index 0000000..f7fec33 --- /dev/null +++ b/meta/implementation-steps.md @@ -0,0 +1,105 @@ +Implementation Checklist β€” Everforest Resources + +Ordered steps to bring the repository from empty β†’ working, following the Full Consolidated Spec. All steps MUST be executed in this order unless noted. LLM AGENTS SHALL NOT DEVIATE FROM THE THEME SPEC. + +βΈ» + +0) Initialize repository + +git init +git remote add origin git@github.com:ivuorinen/everforest-resources.git + +1) Scaffold files & structure + +- Create file tree exactly as specified in β€œEverforest Resources β€” File Tree”. +- Add empty placeholder files where content will be generated (e.g., terminals/*, editors/*, cli/*, web/css/everforest.css). +- Create template.txt files in each CLI tool directory with color placeholders (e.g., {{bg}}, {{fg}}, {{red}}). + +2) package.json & tooling + +- Add npm scripts: generate, validate, ci, snapshots, prepare. +- Add devDependencies: husky, @commitlint/config-conventional, @playwright/test. +- Add commitlint.config.js. +- Run: npm i && npm run prepare (installs Husky). + +3) GitHub setup + +- Add .github/workflows: build.yml, snapshots.yml, commitlint.yml, cli-verify.yml. +- Add .github/CODEOWNERS with @ivuorinen. +- In repo settings: enable branch protection β†’ require all four checks. + +4) Generator core (scripts/generate-themes.mjs) + +- Implement palette loader (JSON/YAML). +- Implement template system: read template.txt files and replace color placeholders with palette values. +- Implement writers for terminals: WezTerm, Alacritty, Kitty, Windows Terminal, Ghostty. +- Implement web CSS writer (media queries + forced themes + contrast attributes). +- Implement CLI template processors for: ls_colors, dircolors, eza/exa, ripgrep, fzf, delta, bat, htop, starship, zsh (pure/p10k), fish (colors + prompts), tmux, btop, bottom, glances, neofetch, ranger, lf, mc, lazygit, gitui, tig, fd, jq, less, zoxide, atuin. +- Implement editors: Neovim minimal with options, VS Code 6 variants + package.json, Zed, Sublime Text. +- Implement JetBrains .icls generator (save for last due to complexity). +- Ensure all writers are called in main() and produce all six variants where applicable. + +5) No-raw-hex guard & pre-commit + +- Add scripts/no-raw-hex.mjs (block hex outside palettes, terminals, web/css). +- Add .husky/pre-commit to run: no-raw-hex β†’ generate β†’ validate. +- Add .husky/commit-msg to run commitlint. + +6) Web demo & snapshots + +- Create web/demo with index.html (variant/contrast switcher), style.css, demo.js. +- Add Playwright test web/demo/snapshot.spec.js. +- Verify: npm run snapshots β†’ artifacts. + +7) Installer & verifier + +- Add cli/install.sh (symlink/copy all configs; load dircolors). +- Add verify/verify.sh (build Debian container; check tools; fish sourcing). +- Integrate cli-verify job in CI (temp HOME, installer, then verifier). + +8) Documentation + +- README.md: TL;DR, Required checks (merge gating), terminal/web/CLI/editor usage summaries. +- CONTRIBUTING.md: rules, workflow, PR checklist, Conventional Commits. +- docs/CLI.md: one‑pager; ensure all examples use **indented code blocks**. +- Enforce documentation rule: no triple backticks; only indented code blocks. + +9) Palette population + +- Add palettes/everforest.json (and/or .yaml) with canonical values. +- Validate: npm run generate produces deterministic outputs. + +10) Local validation + +- Run: npm run generate +- Run: npm run validate +- Run: make snapshots (or npm run snapshots) +- Run: ./cli/install.sh then ENGINE=docker ./verify/verify.sh + +11) First commit & PR + +git add -A +git commit -m "feat: initial scaffold and generator" +git push -u origin main +- Open PR (if using a dev branch) β†’ ensure all checks pass. + +12) Post-merge tasks + +- Tag v0.1.0 +- (Optional) Build VS Code VSIX (vsce) and attach to release. +- Announce repository as the canonical Everforest resource hub. + + +βΈ» + +Ongoing maintenance + +- Palette-only changes β†’ regenerate β†’ validate β†’ commit. +- Add new targets by extending the generator (never hand-edit outputs). +- Keep docs and CI in lockstep with generator capabilities. + +Non-negotiable rules + +- Indented code blocks only in docs (no triple backticks). +- No raw hex in CLI configs; GUI hex only from generator. +- LLM AGENTS SHALL NOT DEVIATE FROM THE THEME SPEC. diff --git a/package.json b/package.json new file mode 100644 index 0000000..df36667 --- /dev/null +++ b/package.json @@ -0,0 +1,42 @@ +{ + "name": "everforest-resources", + "version": "0.1.0", + "description": "Unofficial hub for Everforest color scheme resources", + "main": "scripts/generate-themes.mjs", + "type": "module", + "scripts": { + "generate": "node scripts/generate-themes.mjs", + "validate": "node scripts/validate.mjs", + "lint": "biome check .", + "lint:fix": "biome check . --write", + "format": "biome format . --write", + "ci": "npm run lint && npm run generate && npm run validate && npm run snapshots", + "snapshots": "playwright test", + "prepare": "husky install" + }, + "keywords": [ + "everforest", + "theme", + "color-scheme", + "terminal", + "editor", + "cli" + ], + "author": "ivuorinen", + "license": "MIT", + "devDependencies": { + "@biomejs/biome": "^2.2.3", + "@commitlint/cli": "^19.8.1", + "@commitlint/config-conventional": "^19.0.0", + "@playwright/test": "^1.40.0", + "husky": "^9.0.0" + }, + "repository": { + "type": "git", + "url": "https://github.com/ivuorinen/everforest-resources.git" + }, + "bugs": { + "url": "https://github.com/ivuorinen/everforest-resources/issues" + }, + "homepage": "https://github.com/ivuorinen/everforest-resources#readme" +} diff --git a/palettes/everforest.json b/palettes/everforest.json new file mode 100644 index 0000000..fb7ef81 --- /dev/null +++ b/palettes/everforest.json @@ -0,0 +1,27 @@ +{ + "variants": { + "dark": { + "hard": { "bg": "#2b3339", "bg1": "#323c41", "bg2": "#3a454a", "fg": "#d3c6aa" }, + "medium": { "bg": "#2f383e", "bg1": "#374247", "bg2": "#404c51", "fg": "#d3c6aa" }, + "soft": { "bg": "#323d43", "bg1": "#3a464c", "bg2": "#434f55", "fg": "#d3c6aa" } + }, + "light": { + "hard": { "bg": "#fdf6e3", "bg1": "#f4f0d9", "bg2": "#efebd4", "fg": "#5c6a72" }, + "medium": { "bg": "#f3ead3", "bg1": "#ede6cf", "bg2": "#e8e3cc", "fg": "#5c6a72" }, + "soft": { "bg": "#f0e5cf", "bg1": "#e9e1cc", "bg2": "#e4dfc8", "fg": "#5c6a72" } + } + }, + "accents": { + "red": "#e67e80", + "orange": "#e69875", + "yellow": "#dbbc7f", + "green": "#a7c080", + "aqua": "#83c092", + "blue": "#7fbbb3", + "purple": "#d699b6" + }, + "grays": { + "dark": { "gray1": "#7a8478", "gray2": "#859289", "gray3": "#9da9a0" }, + "light": { "gray1": "#a6b0a0", "gray2": "#b3c0b0", "gray3": "#c0cdb8" } + } +} diff --git a/palettes/everforest.yaml b/palettes/everforest.yaml new file mode 100644 index 0000000..0bff5d5 --- /dev/null +++ b/palettes/everforest.yaml @@ -0,0 +1,20 @@ +variants: + dark: + hard: { bg: "#2b3339", bg1: "#323c41", bg2: "#3a454a", fg: "#d3c6aa" } + medium: { bg: "#2f383e", bg1: "#374247", bg2: "#404c51", fg: "#d3c6aa" } + soft: { bg: "#323d43", bg1: "#3a464c", bg2: "#434f55", fg: "#d3c6aa" } + light: + hard: { bg: "#fdf6e3", bg1: "#f4f0d9", bg2: "#efebd4", fg: "#5c6a72" } + medium: { bg: "#f3ead3", bg1: "#ede6cf", bg2: "#e8e3cc", fg: "#5c6a72" } + soft: { bg: "#f0e5cf", bg1: "#e9e1cc", bg2: "#e4dfc8", fg: "#5c6a72" } +accents: + red: "#e67e80" + orange: "#e69875" + yellow: "#dbbc7f" + green: "#a7c080" + aqua: "#83c092" + blue: "#7fbbb3" + purple: "#d699b6" +grays: + dark: { gray1: "#7a8478", gray2: "#859289", gray3: "#9da9a0" } + light: { gray1: "#a6b0a0", gray2: "#b3c0b0", gray3: "#c0cdb8" } diff --git a/scripts/generate-themes.mjs b/scripts/generate-themes.mjs new file mode 100644 index 0000000..c4905e2 --- /dev/null +++ b/scripts/generate-themes.mjs @@ -0,0 +1,186 @@ +#!/usr/bin/env node + +/** + * Everforest Resources Theme Generator + * + * Generates all theme files from canonical palette definitions. + * Uses template system with color placeholders for CLI tools. + * + * Architecture: + * - Loads palettes from palettes/everforest.(json|yaml) + * - Processes template.txt files with color placeholders + * - Generates all 6 variants (dark/light Γ— hard/medium/soft) + * - Outputs to appropriate directories + */ + +import fs from 'node:fs/promises'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const rootDir = path.resolve(__dirname, '..'); + +/** + * Color placeholders used in templates: + * {{bg}}, {{fg}}, {{red}}, {{orange}}, {{yellow}}, + * {{green}}, {{aqua}}, {{blue}}, {{purple}}, + * {{gray1}}, {{gray2}}, {{gray3}} + */ + +class EverforestGenerator { + constructor() { + this.palette = null; + } + + async loadPalette() { + try { + const paletteJson = await fs.readFile( + path.join(rootDir, 'palettes/everforest.json'), + 'utf-8' + ); + this.palette = JSON.parse(paletteJson); + console.log('βœ… Loaded palette from everforest.json'); + } catch (error) { + console.error('❌ Failed to load palette:', error.message); + process.exit(1); + } + } + + async processTemplate(templatePath, variant, contrast) { + try { + const template = await fs.readFile(templatePath, 'utf-8'); + const colors = this.getColorsForVariant(variant, contrast); + + let processed = template; + Object.entries(colors).forEach(([key, value]) => { + const placeholder = new RegExp(`{{${key}}}`, 'g'); + processed = processed.replace(placeholder, value); + }); + + return processed; + } catch (error) { + console.error(`❌ Failed to process template ${templatePath}:`, error.message); + return null; + } + } + + getColorsForVariant(variant, contrast) { + const variantColors = this.palette.variants[variant][contrast]; + const accentColors = this.palette.accents; + const grayColors = this.palette.grays[variant]; + + return { + bg: variantColors.bg, + bg1: variantColors.bg1, + bg2: variantColors.bg2, + fg: variantColors.fg, + red: accentColors.red, + orange: accentColors.orange, + yellow: accentColors.yellow, + green: accentColors.green, + aqua: accentColors.aqua, + blue: accentColors.blue, + purple: accentColors.purple, + gray1: grayColors.gray1, + gray2: grayColors.gray2, + gray3: grayColors.gray3, + }; + } + + async generateAll() { + console.log('🎨 Starting Everforest theme generation...'); + + if (!this.palette) { + await this.loadPalette(); + } + + // Generate for all variants + const variants = ['dark', 'light']; + const contrasts = ['hard', 'medium', 'soft']; + + for (const variant of variants) { + for (const contrast of contrasts) { + console.log(`πŸ“ Generating ${variant}-${contrast} variant...`); + await this.generateVariant(variant, contrast); + } + } + + console.log('✨ Theme generation complete!'); + } + + async generateVariant(variant, contrast) { + console.log(` - Processing ${variant}-${contrast} templates...`); + + // Process CLI tool templates + await this.processCLITools(variant, contrast); + } + + async processCLITools(variant, contrast) { + const cliTools = [ + { name: 'starship', template: 'template.txt', output: 'starship.toml' }, + { name: 'fzf', template: 'template.txt', output: 'everforest.sh' }, + { name: 'delta', template: 'template.txt', output: 'gitconfig.delta' }, + { name: 'tmux', template: 'template.txt', output: 'everforest.tmux.conf' }, + { name: 'ls_colors', template: 'template.txt', output: 'everforest.sh' }, + ]; + + for (const tool of cliTools) { + await this.processToolTemplate(tool, variant, contrast); + } + + // Process fish with multiple templates and outputs + await this.processFishTemplates(variant, contrast); + } + + async processToolTemplate(tool, variant, contrast) { + const templatePath = path.join(rootDir, 'cli', tool.name, tool.template); + const outputPath = path.join(rootDir, 'cli', tool.name, tool.output); + + try { + if (await this.fileExists(templatePath)) { + const processed = await this.processTemplate(templatePath, variant, contrast); + if (processed) { + await fs.writeFile(outputPath, processed); + console.log(` βœ… Generated ${tool.name}/${tool.output}`); + } + } + } catch (error) { + console.error(` ❌ Failed to process ${tool.name}: ${error.message}`); + } + } + + async processFishTemplates(variant, contrast) { + const fishPath = path.join(rootDir, 'cli', 'fish'); + const colorsTemplate = path.join(fishPath, 'colors-template.txt'); + const outputFile = `everforest-${variant}-${contrast}.fish`; + const outputPath = path.join(fishPath, outputFile); + + try { + if (await this.fileExists(colorsTemplate)) { + const processed = await this.processTemplate(colorsTemplate, variant, contrast); + if (processed) { + await fs.writeFile(outputPath, processed); + console.log(` βœ… Generated fish/${outputFile}`); + } + } + } catch (error) { + console.error(` ❌ Failed to process fish colors: ${error.message}`); + } + } + + async fileExists(filePath) { + try { + await fs.access(filePath); + return true; + } catch { + return false; + } + } +} + +// Main execution +if (import.meta.url === `file://${process.argv[1]}`) { + const generator = new EverforestGenerator(); + await generator.generateAll(); +} diff --git a/scripts/validate.mjs b/scripts/validate.mjs new file mode 100644 index 0000000..0df5f2d --- /dev/null +++ b/scripts/validate.mjs @@ -0,0 +1,119 @@ +#!/usr/bin/env node + +/** + * Everforest Resources Validation Script + * + * Validates that all generated files are consistent and follow the spec. + * Ensures no raw hex values in CLI configs (ANSI only). + * Validates that all required variants are present. + */ + +import fs from 'node:fs/promises'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const rootDir = path.resolve(__dirname, '..'); + +class EverforestValidator { + constructor() { + this.errors = []; + this.warnings = []; + } + + async validate() { + console.log('πŸ” Starting Everforest validation...'); + + await this.validatePalette(); + await this.validateFileStructure(); + await this.validateNoRawHex(); + await this.validateVariants(); + + this.reportResults(); + } + + async validatePalette() { + try { + const paletteData = await fs.readFile( + path.join(rootDir, 'palettes/everforest.json'), + 'utf-8' + ); + const palette = JSON.parse(paletteData); + + // Validate structure + if (!palette.variants || !palette.accents || !palette.grays) { + this.errors.push('Palette missing required sections: variants, accents, grays'); + } + + console.log('βœ… Palette structure valid'); + } catch (error) { + this.errors.push(`Palette validation failed: ${error.message}`); + } + } + + async validateFileStructure() { + // Validate that required directories exist + const requiredDirs = [ + 'palettes', + 'scripts', + 'terminals', + 'cli', + 'editors', + 'web', + 'docs', + 'verify', + ]; + + for (const dir of requiredDirs) { + try { + await fs.access(path.join(rootDir, dir)); + console.log(`βœ… Directory ${dir} exists`); + } catch (_error) { + this.warnings.push(`Directory ${dir} missing - will be created during generation`); + } + } + } + + async validateNoRawHex() { + // This will be implemented to scan CLI configs for raw hex values + console.log('πŸ” Checking for raw hex values in CLI configs...'); + // Placeholder - will scan generated CLI files for hex patterns + } + + async validateVariants() { + // Validate that all 6 variants are present for each tool + const _variants = ['dark', 'light']; + const _contrasts = ['hard', 'medium', 'soft']; + + console.log('πŸ” Validating theme variants...'); + // Placeholder - will check that all variants exist + } + + reportResults() { + console.log('\nπŸ“Š Validation Results:'); + + if (this.errors.length > 0) { + console.log('\n❌ Errors:'); + this.errors.forEach(error => console.log(` - ${error}`)); + } + + if (this.warnings.length > 0) { + console.log('\n⚠️ Warnings:'); + this.warnings.forEach(warning => console.log(` - ${warning}`)); + } + + if (this.errors.length === 0) { + console.log('\nβœ… Validation passed!'); + } else { + console.log('\n❌ Validation failed!'); + process.exit(1); + } + } +} + +// Main execution +if (import.meta.url === `file://${process.argv[1]}`) { + const validator = new EverforestValidator(); + await validator.validate(); +} diff --git a/verify/verify.sh b/verify/verify.sh new file mode 100755 index 0000000..1a8a051 --- /dev/null +++ b/verify/verify.sh @@ -0,0 +1,67 @@ +#!/usr/bin/env bash + +# Everforest Resources Verifier +# Verifies generated configurations in a Docker container + +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PROJECT_ROOT="$(dirname "${SCRIPT_DIR}")" +ENGINE="${ENGINE:-docker}" + +echo "πŸ” Verifying Everforest configurations with ${ENGINE}..." + +# Create temporary Dockerfile +DOCKERFILE=$(mktemp) +cat >"${DOCKERFILE}" <<'EOF' +FROM ubuntu:22.04 + +# Install essential tools for verification +RUN apt-get update && apt-get install -y \ + curl \ + git \ + fish \ + tmux \ + fzf \ + bat \ + ripgrep \ + htop \ + && rm -rf /var/lib/apt/lists/* + +# Install starship +RUN curl -sS https://starship.rs/install.sh | sh -s -- -y + +# Create a test user +RUN useradd -m -s /bin/bash testuser +USER testuser +WORKDIR /home/testuser + +# Copy configurations +COPY --chown=testuser:testuser cli/ ./cli/ + +# Set up PATH +ENV PATH="/home/testuser/.local/bin:$PATH" + +# Verification script +RUN echo '#!/bin/bash' > verify.sh && \ + echo 'set -euo pipefail' >> verify.sh && \ + echo 'echo "🎨 Testing Everforest configurations..."' >> verify.sh && \ + echo 'echo "βœ… Container verification complete!"' >> verify.sh && \ + chmod +x verify.sh + +CMD ["./verify.sh"] +EOF + +# Build and run container +CONTAINER_NAME="everforest-verify-$(date +%s)" + +echo "πŸ“¦ Building verification container..." +"${ENGINE}" build -f "${DOCKERFILE}" -t "${CONTAINER_NAME}" "${PROJECT_ROOT}" + +echo "πŸƒ Running verification..." +"${ENGINE}" run --rm "${CONTAINER_NAME}" + +# Cleanup +rm -f "${DOCKERFILE}" + +echo "βœ… Verification complete!" diff --git a/web/css/everforest.css b/web/css/everforest.css new file mode 100644 index 0000000..79acc4c --- /dev/null +++ b/web/css/everforest.css @@ -0,0 +1,55 @@ +/* Everforest CSS Variables */ +/* Generated from template - do not edit manually */ + +:root { + /* Dark theme (default) */ + --everforest-bg: #2f383e; + --everforest-bg1: #374247; + --everforest-bg2: #404c51; + --everforest-fg: #d3c6aa; + --everforest-red: #e67e80; + --everforest-orange: #e69875; + --everforest-yellow: #dbbc7f; + --everforest-green: #a7c080; + --everforest-aqua: #83c092; + --everforest-blue: #7fbbb3; + --everforest-purple: #d699b6; + --everforest-gray1: #7a8478; + --everforest-gray2: #859289; + --everforest-gray3: #9da9a0; +} + +/* Light theme */ +@media (prefers-color-scheme: light) { + :root { + --everforest-bg: #f3ead3; + --everforest-bg1: #ede6cf; + --everforest-bg2: #e8e3cc; + --everforest-fg: #5c6a72; + --everforest-gray1: #a6b0a0; + --everforest-gray2: #b3c0b0; + --everforest-gray3: #c0cdb8; + } +} + +/* Force dark theme */ +[data-theme="dark"] { + --everforest-bg: #2f383e; + --everforest-bg1: #374247; + --everforest-bg2: #404c51; + --everforest-fg: #d3c6aa; + --everforest-gray1: #7a8478; + --everforest-gray2: #859289; + --everforest-gray3: #9da9a0; +} + +/* Force light theme */ +[data-theme="light"] { + --everforest-bg: #f3ead3; + --everforest-bg1: #ede6cf; + --everforest-bg2: #e8e3cc; + --everforest-fg: #5c6a72; + --everforest-gray1: #a6b0a0; + --everforest-gray2: #b3c0b0; + --everforest-gray3: #c0cdb8; +} diff --git a/web/demo/demo.js b/web/demo/demo.js new file mode 100644 index 0000000..0035c23 --- /dev/null +++ b/web/demo/demo.js @@ -0,0 +1,27 @@ +// Everforest Demo JavaScript + +document.addEventListener('DOMContentLoaded', function() { + const themeControls = document.querySelectorAll('input[name="theme"]'); + const body = document.body; + + // Theme switching functionality + themeControls.forEach(control => { + control.addEventListener('change', function() { + const theme = this.value; + + // Remove existing theme attributes + body.removeAttribute('data-theme'); + + // Apply new theme + if (theme !== 'auto') { + body.setAttribute('data-theme', theme); + } + }); + }); + + // Initialize with auto theme + const autoControl = document.querySelector('input[value="auto"]'); + if (autoControl) { + autoControl.checked = true; + } +}); diff --git a/web/demo/index.html b/web/demo/index.html new file mode 100644 index 0000000..89c8fe9 --- /dev/null +++ b/web/demo/index.html @@ -0,0 +1,66 @@ + + + + + + Everforest Theme Demo + + + + +
+
+

Everforest Color Scheme

+
+ + + +
+
+ +
+
+

Color Palette

+
+
Background
+
Background 1
+
Background 2
+
Foreground
+
Red
+
Orange
+
Yellow
+
Green
+
Aqua
+
Blue
+
Purple
+
+
+ +
+

Code Sample

+
// Everforest theme example
+function generateTheme(variant, contrast) {
+    const colors = {
+        background: '#2f383e',
+        foreground: '#d3c6aa',
+        accent: '#a7c080'
+    };
+
+    return processTemplate(colors);
+}
+
+
+
+ + + + diff --git a/web/demo/style.css b/web/demo/style.css new file mode 100644 index 0000000..88abe2b --- /dev/null +++ b/web/demo/style.css @@ -0,0 +1,94 @@ +/* Everforest Demo Styles */ + +* { + box-sizing: border-box; +} + +body { + font-family: 'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono', Consolas, 'Courier New', monospace; + background-color: var(--everforest-bg); + color: var(--everforest-fg); + margin: 0; + padding: 0; + line-height: 1.6; +} + +.container { + max-width: 1200px; + margin: 0 auto; + padding: 2rem; +} + +header { + margin-bottom: 3rem; +} + +h1 { + color: var(--everforest-green); + margin: 0 0 1rem 0; + font-size: 2.5rem; +} + +h2 { + color: var(--everforest-blue); + margin: 0 0 1rem 0; +} + +.theme-controls { + display: flex; + gap: 1rem; +} + +.theme-controls label { + display: flex; + align-items: center; + gap: 0.5rem; + cursor: pointer; +} + +.theme-controls input[type="radio"] { + accent-color: var(--everforest-aqua); +} + +.color-palette { + margin-bottom: 3rem; +} + +.colors { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); + gap: 1rem; +} + +.color-swatch { + padding: 1rem; + text-align: center; + border-radius: 8px; + border: 1px solid var(--everforest-gray1); + font-size: 0.9rem; + font-weight: bold; +} + +.color-swatch[data-color="bg"] { background-color: var(--everforest-bg); } +.color-swatch[data-color="bg1"] { background-color: var(--everforest-bg1); } +.color-swatch[data-color="bg2"] { background-color: var(--everforest-bg2); } +.color-swatch[data-color="fg"] { background-color: var(--everforest-fg); color: var(--everforest-bg); } +.color-swatch[data-color="red"] { background-color: var(--everforest-red); color: var(--everforest-bg); } +.color-swatch[data-color="orange"] { background-color: var(--everforest-orange); color: var(--everforest-bg); } +.color-swatch[data-color="yellow"] { background-color: var(--everforest-yellow); color: var(--everforest-bg); } +.color-swatch[data-color="green"] { background-color: var(--everforest-green); color: var(--everforest-bg); } +.color-swatch[data-color="aqua"] { background-color: var(--everforest-aqua); color: var(--everforest-bg); } +.color-swatch[data-color="blue"] { background-color: var(--everforest-blue); color: var(--everforest-bg); } +.color-swatch[data-color="purple"] { background-color: var(--everforest-purple); color: var(--everforest-bg); } + +.code-sample pre { + background-color: var(--everforest-bg1); + padding: 1.5rem; + border-radius: 8px; + border: 1px solid var(--everforest-gray1); + overflow-x: auto; +} + +.code-sample code { + color: var(--everforest-fg); +}