diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
index b6be7f74..cc320661 100644
--- a/.github/ISSUE_TEMPLATE/bug_report.md
+++ b/.github/ISSUE_TEMPLATE/bug_report.md
@@ -9,8 +9,8 @@ assignees: ''
### Environment
-* **OS**:
-* **Version**:
+* **OS**:
+* **Version**:
### Problem
diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md
index 809b7b05..83826c66 100644
--- a/.github/ISSUE_TEMPLATE/feature_request.md
+++ b/.github/ISSUE_TEMPLATE/feature_request.md
@@ -6,5 +6,3 @@ labels: enhancement
assignees: ''
---
-
-
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
index 7b05aecc..7cdd3e30 100644
--- a/.github/PULL_REQUEST_TEMPLATE.md
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -6,7 +6,7 @@
--
+-
-
-
-
@@ -21,5 +21,3 @@
Closes # Fixes #
-
-
diff --git a/.github/workflows/bun.yml b/.github/workflows/bun.yml
deleted file mode 100644
index c0dda24a..00000000
--- a/.github/workflows/bun.yml
+++ /dev/null
@@ -1,41 +0,0 @@
-name: Bun CI
-
-on:
- push:
- branches: [main, master]
- pull_request:
- branches: [main, master]
- workflow_dispatch:
-
-concurrency:
- group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
- cancel-in-progress: true
-
-jobs:
- check:
- name: check format, types, and lint
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v4
-
- - name: Setup Bun
- uses: oven-sh/setup-bun@v2
- with:
- bun-version: latest
-
- - name: Cache Bun dependencies
- uses: actions/cache@v4
- with:
- path: ~/.bun/install/cache
- key: ${{ runner.os }}-bun-${{ hashFiles('**/bun.lock') }}
- restore-keys: |
- ${{ runner.os }}-bun-
-
- - name: Install dependencies
- run: bun install
-
- - name: Run typecheck
- run: bun typecheck
-
- - name: Run biome check
- run: bun check
diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml
new file mode 100644
index 00000000..75e7f112
--- /dev/null
+++ b/.github/workflows/pre-commit.yml
@@ -0,0 +1,43 @@
+name: Pre-commit
+
+on:
+ push:
+ branches: [main, master]
+ pull_request:
+ branches: [main, master]
+ workflow_dispatch: {}
+
+jobs:
+ pre-commit:
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v4
+
+ - name: Set up Python
+ uses: actions/setup-python@v5
+ with:
+ python-version: '3.13'
+
+ - name: Set up Rust
+ uses: actions-rs/toolchain@v1
+ with:
+ toolchain: stable
+ components: rustfmt
+ override: true
+
+ - name: Set up Bun
+ uses: oven-sh/setup-bun@v2
+
+ - name: Install dependencies
+ run: bun install
+
+ - name: Install pre-commit
+ run: |
+ pip install pre-commit
+ pre-commit install -f
+ pre-commit install --hook-type commit-msg
+
+ - name: Run pre-commit on all files
+ run: pre-commit run --all-files
diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml
deleted file mode 100644
index 166a94bf..00000000
--- a/.github/workflows/rust.yml
+++ /dev/null
@@ -1,42 +0,0 @@
-name: Rust CI
-
-on:
- push:
- branches: [main, master]
- pull_request:
- branches: [main, master]
- workflow_dispatch:
-
-concurrency:
- group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
- cancel-in-progress: true
-
-env:
- CARGO_TERM_COLOR: always
-
-jobs:
- check:
- name: check format and cargo check
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v4
-
- - name: Setup Rust
- uses: dtolnay/rust-toolchain@nightly
- with:
- components: rustfmt
-
- - name: Cache Rust dependencies
- uses: Swatinem/rust-cache@v2
-
- - name: Cache APT packages
- uses: awalsh128/cache-apt-pkgs-action@latest
- with:
- packages: libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf
- version: 1.0
-
- - name: Check formatting
- run: cargo fmt --check --all
-
- - name: Check
- run: cargo check --workspace
diff --git a/.gitignore b/.gitignore
index 66671dad..4ad90bd7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,6 @@
# dependency directories
node_modules/
+.venv/
# Build output
dist/
@@ -58,7 +59,7 @@ TODO.md
# claude local settings
.claude/settings.local.json
-# Tauri gen files
+# Tauri gen files
src-tauri/gen/
apps/desktop/src-tauri/gen/
**/src-tauri/gen/
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
new file mode 100644
index 00000000..512b1178
--- /dev/null
+++ b/.pre-commit-config.yaml
@@ -0,0 +1,52 @@
+# Pre-commit hooks configuration for Rust + TypeScript/React project
+# See https://pre-commit.com for more information
+
+repos:
+ # Rust hooks
+ - repo: https://github.com/pre-commit/pre-commit-hooks
+ rev: v4.6.0
+ hooks:
+ - id: trailing-whitespace
+ - id: end-of-file-fixer
+ - id: check-yaml
+ - id: check-toml
+ - id: check-json
+ exclude: 'tsconfig.*\.json$'
+ - id: check-merge-conflict
+
+ # Rust formatting only (clippy/check too heavy for CI)
+ - repo: local
+ hooks:
+ - id: rust-fmt-workspace
+ name: Rust format (workspace)
+ entry: cargo fmt
+ args: ['--all', '--check']
+ language: system
+ files: '\.rs$'
+ pass_filenames: false
+
+ # TypeScript/JavaScript with Biome and type checking
+ - repo: local
+ hooks:
+ - id: typescript-check
+ name: TypeScript check
+ entry: bun
+ args: ['typecheck']
+ language: system
+ files: \.(ts|tsx)$
+ pass_filenames: false
+ - id: biome-check
+ name: Biome check
+ entry: bun
+ args: ['check', '--write']
+ language: system
+ files: \.(js|jsx|ts|tsx|json)$
+ pass_filenames: false
+
+ # Commit message validation
+ - repo: https://github.com/alessandrojcm/commitlint-pre-commit-hook
+ rev: v9.18.0
+ hooks:
+ - id: commitlint
+ stages: [commit-msg]
+ additional_dependencies: ['@commitlint/cli']
diff --git a/.tool-versions b/.tool-versions
index 20212cb6..99d721d3 100644
--- a/.tool-versions
+++ b/.tool-versions
@@ -1,2 +1,3 @@
bun 1.1.29
-nodejs 22.11.0
\ No newline at end of file
+nodejs 22.11.0
+python 3.8
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 7fc8df2b..471ade86 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -4,7 +4,7 @@ Welcome! We're happy to have you here. Thank you in advance for your contributio
Note: Please check existing issues and pull requests before creating a new one.
-# The Basics
+## The Basics
Athas welcomes contributions in the form of pull requests.
@@ -14,20 +14,35 @@ For larger changes (e.g., new lint rules, new functionality, new configuration o
If you have suggestions on how we might improve the contributing documentation, let us know!
-# Prerequisites
+## Prerequisites
Athas is a Tauri project using Bun as package manager and Biome for linting/formatting.
- [Rust](https://rustup.rs) with `cargo`, `rustfmt`, and `clippy`
- [Tauri CLI](https://tauri.app) → `cargo install tauri-cli`
- [Bun](https://bun.sh) as package manager
-- [Node.js ≥ 18](https://nodejs.org)
+- [Node.js ≥ 20.19.0](https://nodejs.org)
+- [Python 3.8+](https://www.python.org/downloads/) for `pre-commit` hooks
Check with: `node -v`, `cargo --version`, `tauri --version`, `bun --version`
-# Development
+## Development
-After cloning the repository, run Athas locally from the repository root with:
+After cloning the repository, install `pre-commit` hooks. It's really important to ensure code quality and consistency across contributions.
+
+```bash
+pip install pre-commit
+pre-commit install -f
+pre-commit install --hook-type commit-msg
+```
+
+Test the hooks to ensure they are working correctly:
+
+```bash
+pre-commit run --all-files
+```
+
+Then, install project dependencies, and run development server:
```bash
bun install
@@ -51,18 +66,20 @@ Available commands:
- `bun run check` - Run both typecheck and biome check
- `bun run fix` - Auto-fix formatting and linting issues
-# Pull Request Guidelines
+## Pull Request Guidelines
-## Commit History
+### Commit History
To maintain a clean commit history:
1. **Squash commits** into logical, compact commits before opening your PR
2. **Rebase on origin/master** to avoid merge conflicts:
+
```bash
git fetch origin
git rebase origin/master
```
+
3. Each commit should represent a single logical change
4. Use descriptive commit messages following conventional commits format
diff --git a/LICENSE b/LICENSE
index 7d7f531c..7c84e371 100644
--- a/LICENSE
+++ b/LICENSE
@@ -676,4 +676,4 @@ specific requirements.
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU AGPL, see
-.
\ No newline at end of file
+.
diff --git a/bun.lock b/bun.lock
index cca6eeb8..053a0c11 100644
--- a/bun.lock
+++ b/bun.lock
@@ -43,7 +43,6 @@
"@types/react-dom": "^19.1.6",
"@vitejs/plugin-react": "^4.7.0",
"concurrently": "^9.2.0",
- "simple-git-hooks": "^2.13.0",
"typescript": "^5.8.3",
"typescript-language-server": "^4.3.4",
"vite": "^7.0.5",
@@ -681,8 +680,6 @@
"shell-quote": ["shell-quote@1.8.3", "", {}, "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw=="],
- "simple-git-hooks": ["simple-git-hooks@2.13.0", "", { "bin": { "simple-git-hooks": "cli.js" } }, "sha512-N+goiLxlkHJlyaYEglFypzVNMaNplPAk5syu0+OPp/Bk6dwVoXF6FfOw2vO0Dp+JHsBaI+w6cm8TnFl2Hw6tDA=="],
-
"simple-swizzle": ["simple-swizzle@0.2.2", "", { "dependencies": { "is-arrayish": "^0.3.1" } }, "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg=="],
"sisteransi": ["sisteransi@1.0.5", "", {}, "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="],
diff --git a/docs/develop/linux.md b/docs/develop/linux.md
index 8e7f29d4..94b6fc96 100644
--- a/docs/develop/linux.md
+++ b/docs/develop/linux.md
@@ -23,4 +23,4 @@ bun install
# Start development server
bun run tauri dev
-```
\ No newline at end of file
+```
diff --git a/docs/develop/macos.md b/docs/develop/macos.md
index 3ff02e60..34320a9e 100644
--- a/docs/develop/macos.md
+++ b/docs/develop/macos.md
@@ -13,4 +13,4 @@ bun install
# Start development server
bun run tauri dev
-```
\ No newline at end of file
+```
diff --git a/package.json b/package.json
index fd8e4eae..f13be1c9 100644
--- a/package.json
+++ b/package.json
@@ -14,8 +14,6 @@
"check:all": "bun typecheck && bun lint",
"check:fix": "biome check --write --unsafe",
"clean": "concurrently --names \"node,rust\" --prefix-colors \"cyan,yellow\" \"rimraf dist build node_modules bun.lockb && bun install\" \"cargo clean && cargo build\"",
- "prepare": "simple-git-hooks",
- "commitlint": "commitlint --edit",
"setup": "chmod +x scripts/linux/setup.sh && ./scripts/linux/setup.sh",
"setup:linux": "chmod +x scripts/linux/setup.sh && ./scripts/linux/setup.sh",
"setup-win": "./scripts/windows/setup.ps1",
@@ -61,15 +59,10 @@
"@types/react-dom": "^19.1.6",
"@vitejs/plugin-react": "^4.7.0",
"concurrently": "^9.2.0",
- "simple-git-hooks": "^2.13.0",
"typescript": "^5.8.3",
"typescript-language-server": "^4.3.4",
"vite": "^7.0.5"
},
- "simple-git-hooks": {
- "pre-commit": "bun check:all",
- "commit-msg": "bun commitlint --edit $1"
- },
"lint-staged": {
"*.{ts,tsx,js,jsx,json}": [
"biome check --no-errors-on-unmatched"
diff --git a/src-tauri/src/commands/terminal.rs b/src-tauri/src/commands/terminal.rs
index 8b137891..500aeade 100644
--- a/src-tauri/src/commands/terminal.rs
+++ b/src-tauri/src/commands/terminal.rs
@@ -1 +1 @@
-
+// Terminal-related commands
diff --git a/src-tauri/src/commands/tokens.rs b/src-tauri/src/commands/tokens.rs
index 2a14ca4c..3f36c583 100644
--- a/src-tauri/src/commands/tokens.rs
+++ b/src-tauri/src/commands/tokens.rs
@@ -476,15 +476,15 @@ std = []"#;
fn test_tokenize_java() {
let code = r#"public class HelloWorld {
private String message;
-
+
public HelloWorld(String message) {
this.message = message;
}
-
+
public void greet() {
System.out.println("Hello, " + message + "!");
}
-
+
public static void main(String[] args) {
HelloWorld app = new HelloWorld("World");
app.greet();
@@ -495,10 +495,19 @@ std = []"#;
println!("Found {} Java tokens", tokens.len());
let token_types: Vec<&str> = tokens.iter().map(|t| t.token_type.as_str()).collect();
- assert!(token_types.contains(&"keyword"), "Should have keyword tokens");
+ assert!(
+ token_types.contains(&"keyword"),
+ "Should have keyword tokens"
+ );
assert!(token_types.contains(&"string"), "Should have string tokens");
- assert!(token_types.contains(&"identifier"), "Should have identifier tokens");
- assert!(token_types.contains(&"function"), "Should have function tokens");
+ assert!(
+ token_types.contains(&"identifier"),
+ "Should have identifier tokens"
+ );
+ assert!(
+ token_types.contains(&"function"),
+ "Should have function tokens"
+ );
}
#[test]
@@ -515,9 +524,15 @@ int main() {
println!("Found {} C tokens", tokens.len());
let token_types: Vec<&str> = tokens.iter().map(|t| t.token_type.as_str()).collect();
- assert!(token_types.contains(&"keyword"), "Should have keyword tokens");
+ assert!(
+ token_types.contains(&"keyword"),
+ "Should have keyword tokens"
+ );
assert!(token_types.contains(&"string"), "Should have string tokens");
- assert!(token_types.contains(&"identifier"), "Should have identifier tokens");
+ assert!(
+ token_types.contains(&"identifier"),
+ "Should have identifier tokens"
+ );
assert!(token_types.contains(&"number"), "Should have number tokens");
}
@@ -529,10 +544,10 @@ int main() {
class Greeter {
private:
std::string name;
-
+
public:
Greeter(const std::string& n) : name(n) {}
-
+
void greet() const {
std::cout << "Hello, " << name << "!" << std::endl;
}
@@ -549,8 +564,14 @@ int main() {
let token_types: Vec<&str> = tokens.iter().map(|t| t.token_type.as_str()).collect();
assert!(!tokens.is_empty(), "Should have tokens");
- assert!(token_types.contains(&"keyword"), "Should have keyword tokens");
- assert!(token_types.contains(&"function") || token_types.contains(&"identifier"), "Should have function or identifier tokens");
+ assert!(
+ token_types.contains(&"keyword"),
+ "Should have keyword tokens"
+ );
+ assert!(
+ token_types.contains(&"function") || token_types.contains(&"identifier"),
+ "Should have function or identifier tokens"
+ );
}
#[test]
@@ -559,12 +580,12 @@ int main() {
class User {
private $name;
private $email;
-
+
public function __construct($name, $email) {
$this->name = $name;
$this->email = $email;
}
-
+
public function greet() {
echo "Hello, {$this->name}! Your email is {$this->email}";
}
@@ -578,10 +599,19 @@ $user->greet();
println!("Found {} PHP tokens", tokens.len());
let token_types: Vec<&str> = tokens.iter().map(|t| t.token_type.as_str()).collect();
- assert!(token_types.contains(&"keyword"), "Should have keyword tokens");
+ assert!(
+ token_types.contains(&"keyword"),
+ "Should have keyword tokens"
+ );
assert!(token_types.contains(&"string"), "Should have string tokens");
- assert!(token_types.contains(&"identifier"), "Should have identifier tokens");
- assert!(token_types.contains(&"function"), "Should have function tokens");
+ assert!(
+ token_types.contains(&"identifier"),
+ "Should have identifier tokens"
+ );
+ assert!(
+ token_types.contains(&"function"),
+ "Should have function tokens"
+ );
}
#[test]
diff --git a/src/components/ai-chat/tool-call-display.css b/src/components/ai-chat/tool-call-display.css
index 50386063..6d149aeb 100644
--- a/src/components/ai-chat/tool-call-display.css
+++ b/src/components/ai-chat/tool-call-display.css
@@ -83,4 +83,4 @@
opacity: 1;
transform: translateY(0);
}
-}
\ No newline at end of file
+}
diff --git a/src/components/editor/editor-stylesheet.tsx b/src/components/editor/editor-stylesheet.tsx
index d00c4561..02c8ab62 100644
--- a/src/components/editor/editor-stylesheet.tsx
+++ b/src/components/editor/editor-stylesheet.tsx
@@ -45,12 +45,12 @@ export function EditorStylesheet() {
font-family: 'Noto Sans Mono';
font-display: swap;
}
-
+
/* Force font override class */
.code-editor-font-override {
font-family: var(--editor-font-family) !important;
}
-
+
.code-editor-content {
font-family: inherit;
background: transparent;
@@ -98,19 +98,19 @@ export function EditorStylesheet() {
.line-numbers-container::-webkit-scrollbar {
display: none;
}
-
+
/* Ensure line numbers use tabular figures for consistent width */
.line-numbers-container {
font-variant-numeric: tabular-nums;
-webkit-font-feature-settings: "tnum";
font-feature-settings: "tnum";
}
-
+
/* Force line numbers font override */
.line-numbers-container.font-override {
font-family: var(--editor-font-family) !important;
}
-
+
/* Disable selection on breadcrumbs */
.breadcrumb,
.breadcrumb-container,
@@ -120,24 +120,24 @@ export function EditorStylesheet() {
-webkit-user-select: none;
-moz-user-select: none;
}
-
+
/* Search highlighting */
.search-highlight {
background-color: rgba(255, 255, 0, 0.3);
}
-
+
.search-highlight-current {
background-color: rgba(255, 165, 0, 0.5);
outline: 1px solid rgba(255, 165, 0, 0.8);
}
-
+
/* Remove focus rings on all inputs in find bar */
input[type="text"]:focus {
outline: none !important;
box-shadow: none !important;
border: none !important;
}
-
+
/* Specifically target find bar input */
.find-bar input:focus {
outline: none !important;
@@ -145,16 +145,16 @@ export function EditorStylesheet() {
border: none !important;
ring: none !important;
}
-
+
/* Remove border radius from find bar */
.find-bar {
border-radius: 0 !important;
}
-
+
.find-bar input {
border-radius: 0 !important;
}
-
+
.find-bar button {
border-radius: 0 !important;
}
diff --git a/src/components/resizable-sidebar/resizable-sidebar.css b/src/components/resizable-sidebar/resizable-sidebar.css
index b75a28e6..300dc590 100644
--- a/src/components/resizable-sidebar/resizable-sidebar.css
+++ b/src/components/resizable-sidebar/resizable-sidebar.css
@@ -25,4 +25,4 @@
.resize-handle:hover .resize-handle__indicator {
@apply opacity-100;
-}
\ No newline at end of file
+}
diff --git a/src/extensions/themes/builtin/README.md b/src/extensions/themes/builtin/README.md
index 4871ee95..38d8e2ca 100644
--- a/src/extensions/themes/builtin/README.md
+++ b/src/extensions/themes/builtin/README.md
@@ -83,7 +83,7 @@ See `example-custom-theme.toml` for a complete example of how to create custom t
The following themes are included with Athas:
- **GitHub**: Light, Dark, and Dark Dimmed variants
-- **VS Code**: Light and Dark variants
+- **VS Code**: Light and Dark variants
- **One Dark**: Original and Pro variants
- **Tokyo Night**: Original, Storm, and Moon variants
- **Dracula**: Original and Soft variants
@@ -118,7 +118,7 @@ name = "Theme One"
# ... theme configuration
[[themes]]
-id = "theme-two"
+id = "theme-two"
name = "Theme Two"
# ... theme configuration
-```
\ No newline at end of file
+```
diff --git a/src/extensions/themes/builtin/catppuccin.toml b/src/extensions/themes/builtin/catppuccin.toml
index c7c60f67..081c8199 100644
--- a/src/extensions/themes/builtin/catppuccin.toml
+++ b/src/extensions/themes/builtin/catppuccin.toml
@@ -104,4 +104,4 @@ is_dark = true
"--color-syntax-null" = "#f5a97f"
"--color-syntax-regex" = "#a6da95"
"--color-syntax-jsx" = "#f5bde6"
-"--color-syntax-jsx-attribute" = "#c6a0f6"
\ No newline at end of file
+"--color-syntax-jsx-attribute" = "#c6a0f6"
diff --git a/src/extensions/themes/builtin/contrast-themes.toml b/src/extensions/themes/builtin/contrast-themes.toml
index f3d5e323..2fe0d388 100644
--- a/src/extensions/themes/builtin/contrast-themes.toml
+++ b/src/extensions/themes/builtin/contrast-themes.toml
@@ -104,4 +104,4 @@ is_dark = true
"--color-syntax-null" = "#aaaaaa"
"--color-syntax-regex" = "#cccccc"
"--color-syntax-jsx" = "#ffffff"
-"--color-syntax-jsx-attribute" = "#ffffff"
\ No newline at end of file
+"--color-syntax-jsx-attribute" = "#ffffff"
diff --git a/src/extensions/themes/builtin/dracula.toml b/src/extensions/themes/builtin/dracula.toml
index 30bc6759..3622f003 100644
--- a/src/extensions/themes/builtin/dracula.toml
+++ b/src/extensions/themes/builtin/dracula.toml
@@ -68,4 +68,4 @@ is_dark = true
"--color-syntax-null" = "#bd93f9"
"--color-syntax-regex" = "#f1fa8c"
"--color-syntax-jsx" = "#ff79c6"
-"--color-syntax-jsx-attribute" = "#50fa7b"
\ No newline at end of file
+"--color-syntax-jsx-attribute" = "#50fa7b"
diff --git a/src/extensions/themes/builtin/example-custom-theme.toml b/src/extensions/themes/builtin/example-custom-theme.toml
index 5df282dd..0696ceaa 100644
--- a/src/extensions/themes/builtin/example-custom-theme.toml
+++ b/src/extensions/themes/builtin/example-custom-theme.toml
@@ -71,4 +71,4 @@ is_dark = true
"--color-syntax-null" = "#06b6d4"
"--color-syntax-regex" = "#22d3ee"
"--color-syntax-jsx" = "#0ea5e9"
-"--color-syntax-jsx-attribute" = "#06b6d4"
\ No newline at end of file
+"--color-syntax-jsx-attribute" = "#06b6d4"
diff --git a/src/extensions/themes/builtin/github.toml b/src/extensions/themes/builtin/github.toml
index 5ddc264f..51a10eb0 100644
--- a/src/extensions/themes/builtin/github.toml
+++ b/src/extensions/themes/builtin/github.toml
@@ -104,4 +104,4 @@ is_dark = true
"--color-syntax-null" = "#6cb6ff"
"--color-syntax-regex" = "#96d0ff"
"--color-syntax-jsx" = "#8ddb8c"
-"--color-syntax-jsx-attribute" = "#dcbdfb"
\ No newline at end of file
+"--color-syntax-jsx-attribute" = "#dcbdfb"
diff --git a/src/extensions/themes/builtin/nord.toml b/src/extensions/themes/builtin/nord.toml
index b9742da9..c6e772fd 100644
--- a/src/extensions/themes/builtin/nord.toml
+++ b/src/extensions/themes/builtin/nord.toml
@@ -68,4 +68,4 @@ is_dark = true
"--color-syntax-null" = "#d08770"
"--color-syntax-regex" = "#a3be8c"
"--color-syntax-jsx" = "#bf616a"
-"--color-syntax-jsx-attribute" = "#5e81ac"
\ No newline at end of file
+"--color-syntax-jsx-attribute" = "#5e81ac"
diff --git a/src/extensions/themes/builtin/one-dark.toml b/src/extensions/themes/builtin/one-dark.toml
index 41fae45c..27a77950 100644
--- a/src/extensions/themes/builtin/one-dark.toml
+++ b/src/extensions/themes/builtin/one-dark.toml
@@ -68,4 +68,4 @@ is_dark = true
"--color-syntax-null" = "#d19a66"
"--color-syntax-regex" = "#98c379"
"--color-syntax-jsx" = "#e06c75"
-"--color-syntax-jsx-attribute" = "#d19a66"
\ No newline at end of file
+"--color-syntax-jsx-attribute" = "#d19a66"
diff --git a/src/extensions/themes/builtin/solarized.toml b/src/extensions/themes/builtin/solarized.toml
index 61b49e11..81a5d844 100644
--- a/src/extensions/themes/builtin/solarized.toml
+++ b/src/extensions/themes/builtin/solarized.toml
@@ -68,4 +68,4 @@ is_dark = true
"--color-syntax-null" = "#d33682"
"--color-syntax-regex" = "#2aa198"
"--color-syntax-jsx" = "#859900"
-"--color-syntax-jsx-attribute" = "#268bd2"
\ No newline at end of file
+"--color-syntax-jsx-attribute" = "#268bd2"
diff --git a/src/extensions/themes/builtin/tokyo-night.toml b/src/extensions/themes/builtin/tokyo-night.toml
index 037a3529..9dcff20d 100644
--- a/src/extensions/themes/builtin/tokyo-night.toml
+++ b/src/extensions/themes/builtin/tokyo-night.toml
@@ -104,4 +104,4 @@ is_dark = true
"--color-syntax-null" = "#ff966c"
"--color-syntax-regex" = "#c3e88d"
"--color-syntax-jsx" = "#ff757f"
-"--color-syntax-jsx-attribute" = "#fca7ea"
\ No newline at end of file
+"--color-syntax-jsx-attribute" = "#fca7ea"
diff --git a/src/extensions/themes/builtin/vscode.toml b/src/extensions/themes/builtin/vscode.toml
index 02eaa50f..d4367dfb 100644
--- a/src/extensions/themes/builtin/vscode.toml
+++ b/src/extensions/themes/builtin/vscode.toml
@@ -68,4 +68,4 @@ is_dark = true
"--color-syntax-null" = "#569cd6"
"--color-syntax-regex" = "#d16969"
"--color-syntax-jsx" = "#569cd6"
-"--color-syntax-jsx-attribute" = "#92c5f8"
\ No newline at end of file
+"--color-syntax-jsx-attribute" = "#92c5f8"
diff --git a/src/styles.css b/src/styles.css
index ac8ac0a6..bc4c4814 100644
--- a/src/styles.css
+++ b/src/styles.css
@@ -37,7 +37,7 @@
/* Accent color */
--tw-accent: #3b82f6;
-
+
/* Cursor color */
--tw-cursor: #1a1a1a;
@@ -112,7 +112,7 @@
/* Accent color - Dark */
--tw-accent: #60a5fa;
-
+
/* Cursor color - Dark */
--tw-cursor: #e5e5e5;
@@ -189,7 +189,7 @@
/* Accent color */
--color-accent: var(--tw-accent);
-
+
/* Cursor color */
--color-cursor: var(--tw-cursor);
@@ -309,7 +309,7 @@ button {
/* Font defaults */
--app-font-family: "JetBrains Mono", monospace;
--editor-font-family: "JetBrains Mono", monospace;
-
+
/* Default light theme colors */
--tw-primary-bg: #ffffff;
--tw-secondary-bg: #f8f8f8;
@@ -337,7 +337,7 @@ button {
/* Accent color */
--tw-accent: #3b82f6;
-
+
/* Cursor color */
--tw-cursor: #1a1a1a;
@@ -414,7 +414,7 @@ button {
/* Accent color - Dark */
--tw-accent: #60a5fa;
-
+
/* Cursor color - Dark */
--tw-cursor: #e5e5e5;
diff --git a/src/styles/editor-line-based.css b/src/styles/editor-line-based.css
index 8522cff6..8203ecc8 100644
--- a/src/styles/editor-line-based.css
+++ b/src/styles/editor-line-based.css
@@ -221,4 +221,4 @@
.token-class {
color: #267f99;
font-weight: bold;
-}
\ No newline at end of file
+}
diff --git a/src/styles/token-theme.css b/src/styles/token-theme.css
index 4a724580..bde108e1 100644
--- a/src/styles/token-theme.css
+++ b/src/styles/token-theme.css
@@ -93,4 +93,4 @@
.token-jsx-text {
color: var(--color-text);
-}
\ No newline at end of file
+}
diff --git a/src/styles/utils.css b/src/styles/utils.css
index fe5b07d1..e8982f39 100644
--- a/src/styles/utils.css
+++ b/src/styles/utils.css
@@ -39,4 +39,3 @@
transform: translateY(0);
}
}
-