├── .editorconfig ├── .github ├── release-please-config.json ├── release-please-manifest.json └── workflows │ ├── build.yml │ └── release.yml ├── .gitignore ├── CHANGELOG.md ├── LICENSE ├── README.md ├── assets ├── bordered │ ├── frappe_bordered.webp │ ├── latte_bordered.webp │ ├── macchiato_bordered.webp │ ├── mocha_bordered.webp │ └── preview_bordered.webp └── borderless │ ├── frappe_borderless.webp │ ├── latte_borderless.webp │ ├── macchiato_borderless.webp │ ├── mocha_borderless.webp │ └── preview_borderless.webp ├── extension.json ├── florisboard.tera ├── justfile └── renovate.json /.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig helps developers define and maintain consistent 2 | # coding styles between different editors and IDEs 3 | # EditorConfig is awesome: https://EditorConfig.org 4 | 5 | root = true 6 | 7 | [*] 8 | charset = utf-8 9 | indent_size = 2 10 | indent_style = space 11 | end_of_line = lf 12 | insert_final_newline = true 13 | trim_trailing_whitespace = true 14 | 15 | # go 16 | [*.go] 17 | indent_style = tab 18 | indent_size = 4 19 | 20 | # python 21 | [*.{ini,py,py.tpl,rst}] 22 | indent_size = 4 23 | 24 | # rust 25 | [*.rs] 26 | indent_size = 4 27 | 28 | # documentation, utils 29 | [*.{md,mdx,diff}] 30 | trim_trailing_whitespace = false 31 | 32 | # windows shell scripts 33 | [*.{cmd,bat,ps1}] 34 | end_of_line = crlf 35 | -------------------------------------------------------------------------------- /.github/release-please-config.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json", 3 | "packages": { 4 | ".": { 5 | "package-name": "", 6 | "release-type": "simple", 7 | "extra-files": [ 8 | { 9 | "type": "json", 10 | "path": "extension.json", 11 | "jsonpath": "$.meta.version" 12 | } 13 | ] 14 | } 15 | } 16 | } -------------------------------------------------------------------------------- /.github/release-please-manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | ".": "1.0.1" 3 | } -------------------------------------------------------------------------------- /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: build 2 | 3 | on: 4 | pull_request: 5 | branches: [main] 6 | 7 | jobs: 8 | build: 9 | runs-on: ubuntu-latest 10 | steps: 11 | - uses: actions/checkout@v4 12 | - uses: extractions/setup-just@v3 13 | - uses: catppuccin/setup-whiskers@v2 14 | 15 | - name: Build 16 | run: just build 17 | 18 | - name: Create Archive 19 | run: just zip 20 | 21 | - name: Upload Archive 22 | uses: actions/upload-artifact@v4 23 | with: 24 | name: "catppuccin-snapshot.flex" 25 | path: catppuccin*.flex 26 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: release-please 2 | 3 | on: 4 | workflow_dispatch: 5 | push: 6 | branches: [main] 7 | 8 | permissions: 9 | contents: write 10 | id-token: write 11 | pull-requests: write 12 | 13 | jobs: 14 | release-please: 15 | runs-on: ubuntu-latest 16 | steps: 17 | - uses: googleapis/release-please-action@v4 18 | id: release 19 | with: 20 | config-file: .github/release-please-config.json 21 | manifest-file: .github/release-please-manifest.json 22 | outputs: 23 | release_created: ${{ steps.release.outputs.release_created }} 24 | tag_name: ${{ steps.release.outputs.tag_name }} 25 | 26 | release: 27 | runs-on: ubuntu-latest 28 | needs: release-please 29 | if: ${{ needs.release-please.outputs.release_created }} 30 | steps: 31 | - uses: actions/checkout@v4 32 | - uses: extractions/setup-just@v3 33 | - uses: catppuccin/setup-whiskers@v2 34 | 35 | - name: Build 36 | run: just build 37 | 38 | - name: Create Archive 39 | run: just zip 40 | 41 | - name: Upload Zip 42 | env: 43 | GH_TOKEN: ${{ github.token }} 44 | run: gh release upload ${{ needs.release-please.outputs.tag_name }} catppuccin*.flex --clobber 45 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.flex 2 | dist 3 | .vscode -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | ## [1.0.1](https://github.com/catppuccin/florisboard/compare/v1.0.0...v1.0.1) (2025-05-04) 4 | 5 | 6 | ### Bug Fixes 7 | 8 | * make sure disabled keys are visible ([#19](https://github.com/catppuccin/florisboard/issues/19)) ([a4945f3](https://github.com/catppuccin/florisboard/commit/a4945f360095d5716e32db6a0d9ef4aab21b8fdc)) 9 | 10 | ## [1.0.0](https://github.com/catppuccin/florisboard/compare/v0.1.0...v1.0.0) (2025-03-02) 11 | 12 | 13 | ### ⚠ BREAKING CHANGES 14 | 15 | * use `mauve` as primary accent colour across all flavours 16 | 17 | ### Features 18 | 19 | * use `mauve` as primary accent colour across all flavours ([5219b85](https://github.com/catppuccin/florisboard/commit/5219b85803e72414cc188ead6941ae198266bfa2)) 20 | 21 | 22 | ### Bug Fixes 23 | 24 | * generate `--primary-variant` from `--primary` ([5219b85](https://github.com/catppuccin/florisboard/commit/5219b85803e72414cc188ead6941ae198266bfa2)) 25 | * remove `key-popup` hardcoded colours ([5219b85](https://github.com/catppuccin/florisboard/commit/5219b85803e72414cc188ead6941ae198266bfa2)) 26 | 27 | ## [0.1.0](https://github.com/catppuccin/florisboard/compare/0.0.1...v0.1.0) (2024-08-11) 28 | 29 | 30 | ### Features 31 | 32 | * publish to the addons store ([87bb5e2](https://github.com/catppuccin/florisboard/commit/87bb5e2b6a4f9c9909feda5c6035a9abdc2b57b7)) 33 | 34 | 35 | ### Bug Fixes 36 | 37 | * enter key fg is now `crust` on dark flavours ([87bb5e2](https://github.com/catppuccin/florisboard/commit/87bb5e2b6a4f9c9909feda5c6035a9abdc2b57b7)) 38 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Catppuccin 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
15 |
16 |
17 |
Copyright © 2021-present Catppuccin Org 79 |
80 | -------------------------------------------------------------------------------- /assets/bordered/frappe_bordered.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/catppuccin/florisboard/944820edf616429116e3227aa7c3e43d9831fd40/assets/bordered/frappe_bordered.webp -------------------------------------------------------------------------------- /assets/bordered/latte_bordered.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/catppuccin/florisboard/944820edf616429116e3227aa7c3e43d9831fd40/assets/bordered/latte_bordered.webp -------------------------------------------------------------------------------- /assets/bordered/macchiato_bordered.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/catppuccin/florisboard/944820edf616429116e3227aa7c3e43d9831fd40/assets/bordered/macchiato_bordered.webp -------------------------------------------------------------------------------- /assets/bordered/mocha_bordered.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/catppuccin/florisboard/944820edf616429116e3227aa7c3e43d9831fd40/assets/bordered/mocha_bordered.webp -------------------------------------------------------------------------------- /assets/bordered/preview_bordered.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/catppuccin/florisboard/944820edf616429116e3227aa7c3e43d9831fd40/assets/bordered/preview_bordered.webp -------------------------------------------------------------------------------- /assets/borderless/frappe_borderless.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/catppuccin/florisboard/944820edf616429116e3227aa7c3e43d9831fd40/assets/borderless/frappe_borderless.webp -------------------------------------------------------------------------------- /assets/borderless/latte_borderless.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/catppuccin/florisboard/944820edf616429116e3227aa7c3e43d9831fd40/assets/borderless/latte_borderless.webp -------------------------------------------------------------------------------- /assets/borderless/macchiato_borderless.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/catppuccin/florisboard/944820edf616429116e3227aa7c3e43d9831fd40/assets/borderless/macchiato_borderless.webp -------------------------------------------------------------------------------- /assets/borderless/mocha_borderless.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/catppuccin/florisboard/944820edf616429116e3227aa7c3e43d9831fd40/assets/borderless/mocha_borderless.webp -------------------------------------------------------------------------------- /assets/borderless/preview_borderless.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/catppuccin/florisboard/944820edf616429116e3227aa7c3e43d9831fd40/assets/borderless/preview_borderless.webp -------------------------------------------------------------------------------- /extension.json: -------------------------------------------------------------------------------- 1 | { 2 | "$": "ime.extension.theme", 3 | "meta": { 4 | "id": "com.catppuccin.florisboard", 5 | "version": "1.0.1", 6 | "title": "Catppuccin", 7 | "description": "🥀 Soothing pastel theme for FlorisBoard", 8 | "keywords": [ 9 | "pastel catppuccin mocha latte frappe macchiato" 10 | ], 11 | "homepage": "https://github.com/catppuccin/florisboard", 12 | "issueTracker": "https://github.com/catppuccin/florisboard/issues", 13 | "maintainers": [ 14 | "skinatro", 15 | "sgoudham" 16 | ], 17 | "license": "MIT" 18 | }, 19 | "themes": [ 20 | { 21 | "id": "catppuccin_latte", 22 | "label": "Catppuccin Latte", 23 | "authors": [ 24 | "skinatro", 25 | "sgoudham" 26 | ], 27 | "isNight": false 28 | }, 29 | { 30 | "id": "catppuccin_latte_borderless", 31 | "label": "Catppuccin Latte (Borderless)", 32 | "authors": [ 33 | "skinatro", 34 | "sgoudham" 35 | ], 36 | "isNight": false, 37 | "isBorderless": true 38 | }, 39 | { 40 | "id": "catppuccin_frappe", 41 | "label": "Catppuccin Frappe", 42 | "authors": [ 43 | "skinatro", 44 | "sgoudham" 45 | ] 46 | }, 47 | { 48 | "id": "catppuccin_frappe_borderless", 49 | "label": "Catppuccin Frappe (Borderless)", 50 | "authors": [ 51 | "skinatro", 52 | "sgoudham" 53 | ], 54 | "isBorderless": true 55 | }, 56 | { 57 | "id": "catppuccin_macchiato", 58 | "label": "Catppuccin Macchiato", 59 | "authors": [ 60 | "skinatro", 61 | "sgoudham" 62 | ] 63 | }, 64 | { 65 | "id": "catppuccin_macchiato_borderless", 66 | "label": "Catppuccin Macchiato (Borderless)", 67 | "authors": [ 68 | "skinatro", 69 | "sgoudham" 70 | ], 71 | "isBorderless": true 72 | }, 73 | { 74 | "id": "catppuccin_mocha", 75 | "label": "Catppuccin Mocha", 76 | "authors": [ 77 | "skinatro", 78 | "sgoudham" 79 | ] 80 | }, 81 | { 82 | "id": "catppuccin_mocha_borderless", 83 | "label": "Catppuccin Mocha (Borderless)", 84 | "authors": [ 85 | "skinatro", 86 | "sgoudham" 87 | ], 88 | "isBorderless": true 89 | } 90 | ] 91 | } -------------------------------------------------------------------------------- /florisboard.tera: -------------------------------------------------------------------------------- 1 | --- 2 | whiskers: 3 | version: ^2.5.1 4 | matrix: 5 | - flavor 6 | - variant: ["", "_borderless"] 7 | filename: "dist/stylesheets/catppuccin_{{flavor.identifier}}{{variant}}.json" 8 | primary: "mauve" 9 | secondary: "lavender" 10 | --- 11 | { 12 | "@defines": { 13 | "--primary": "#{{flavor.colors[primary].hex}}", 14 | "--primary-variant": "#{{flavor.colors[primary] | add(lightness=5) | get(key="hex") }}", 15 | "--secondary": "#{{flavor.colors[secondary].hex}}", 16 | "--background": "#{{crust.hex}}", 17 | "--surface": "#{{base.hex}}", 18 | "--surface-variant": "#{{surface0.hex}}", 19 | "--disabled": "#{{surface0.hex}}", 20 | 21 | "--on-background": "#{{subtext1.hex}}", 22 | "--on-surface": "#{{text.hex}}", 23 | "--on-surface-variant": "#{{subtext0.hex}}", 24 | 25 | "--shape": "rounded-corner(8dp, 8dp, 8dp, 8dp)", 26 | "--shape-variant": "rounded-corner(12dp, 12dp, 12dp, 12dp)" 27 | }, 28 | 29 | "keyboard": { 30 | "background": "var(--background)" 31 | }, 32 | 33 | "key": { 34 | "background": "var(--{% if variant == "_borderless" %}background{% else %}surface{% endif %})", 35 | "foreground": "var(--on-surface)", 36 | "font-size": "22sp", 37 | {% if variant == "" %}"shadow-elevation": "2dp",{% endif %} 38 | "shape": "var(--shape)" 39 | }, 40 | "key:pressed": { 41 | "background": "var(--surface-variant)", 42 | "foreground": "var(--on-surface)" 43 | }, 44 | "key[code={c:enter}]": { 45 | "background": "var(--primary)", 46 | "foreground": "var(--background)" 47 | }, 48 | "key[code={c:enter}]:pressed": { 49 | "background": "var(--primary-variant)", 50 | "foreground": "var(--background)" 51 | }, 52 | "key[code={c:space}]": { 53 | "background": "var(--{% if variant == "_borderless" %}background{% else %}surface{% endif %})", 54 | "foreground": "var(--on-surface-variant)", 55 | "font-size": "12sp" 56 | }, 57 | "key[code={c:shift}][shiftstate={sh:caps_lock}]": { 58 | "foreground": "var(--secondary)" 59 | }, 60 | "key-hint": { 61 | "background": "transparent", 62 | "foreground": "var(--on-surface-variant)", 63 | "font-size": "12sp" 64 | }, 65 | "key-popup": { 66 | "background": "var(--surface)", 67 | "foreground": "var(--on-surface)", 68 | "font-size": "22sp", 69 | "shape": "var(--shape)", 70 | "shadow-elevation": "2dp" 71 | }, 72 | "key-popup:focus": { 73 | "background": "var(--surface-variant)", 74 | "foreground": "var(--on-surface)" 75 | }, 76 | 77 | "smartbar-shared-actions-toggle": { 78 | "background": "var(--surface)", 79 | "foreground": "var(--on-surface)", 80 | "shape": "circle()", 81 | "shadow-elevation": "2dp" 82 | }, 83 | "smartbar-extended-actions-toggle": { 84 | "background": "transparent", 85 | "foreground": "var(--on-surface-variant)", 86 | "shape": "circle()" 87 | }, 88 | "smartbar-action-key": { 89 | "background": "transparent", 90 | "foreground": "var(--on-background)", 91 | "font-size": "18sp", 92 | "shape": "var(--shape)" 93 | }, 94 | "smartbar-action-key:pressed": { 95 | "background": "var(--surface)", 96 | "foreground": "var(--on-surface)" 97 | }, 98 | "smartbar-action-key:disabled": { 99 | "background": "transparent", 100 | "foreground": "var(--disabled)" 101 | }, 102 | "smartbar-action-tile": { 103 | "background": "transparent", 104 | "foreground": "var(--on-background)", 105 | "font-size": "18sp", 106 | "shape": "var(--shape)" 107 | }, 108 | "smartbar-action-tile:pressed": { 109 | "background": "var(--surface)", 110 | "foreground": "var(--on-surface)" 111 | }, 112 | "smartbar-action-tile:disabled": { 113 | "background": "transparent", 114 | "foreground": "var(--disabled)" 115 | }, 116 | "smartbar-actions-overflow-customize-button": { 117 | "background": "var(--surface)", 118 | "foreground": "var(--on-surface)", 119 | "font-size": "14sp", 120 | "shape": "circle()", 121 | "shadow-elevation": "2dp" 122 | }, 123 | "smartbar-actions-editor": { 124 | "background": "var(--background)", 125 | "shape": "rounded-corner(24dp, 24dp, 0dp, 0dp)" 126 | }, 127 | "smartbar-actions-editor-header": { 128 | "background": "var(--surface)", 129 | "foreground": "var(--on-surface)", 130 | "font-size": "16sp" 131 | }, 132 | "smartbar-actions-editor-subheader": { 133 | "foreground": "var(--on-background)", 134 | "font-size": "16sp" 135 | }, 136 | "smartbar-candidate-word": { 137 | "background": "transparent", 138 | "foreground": "var(--on-background)", 139 | "font-size": "14sp", 140 | "shape": "rectangle()" 141 | }, 142 | "smartbar-candidate-word:pressed": { 143 | "background": "var(--surface)", 144 | "foreground": "var(--on-background)" 145 | }, 146 | "smartbar-candidate-clip": { 147 | "background": "transparent", 148 | "foreground": "var(--on-background)", 149 | "font-size": "14sp", 150 | "shape": "rounded-corner(8%, 8%, 8%, 8%)" 151 | }, 152 | "smartbar-candidate-clip:pressed": { 153 | "background": "var(--surface)", 154 | "foreground": "var(--on-background)" 155 | }, 156 | "smartbar-candidate-spacer": { 157 | "foreground": "var(--surface)" 158 | }, 159 | 160 | "clipboard-header": { 161 | "background": "transparent", 162 | "foreground": "var(--on-surface)", 163 | "font-size": "16sp" 164 | }, 165 | "clipboard-item": { 166 | "background": "var(--surface)", 167 | "foreground": "var(--on-surface)", 168 | "font-size": "14sp", 169 | "shape": "var(--shape-variant)", 170 | "shadow-elevation": "2dp" 171 | }, 172 | "clipboard-item-popup": { 173 | "background": "var(--surface-variant)", 174 | "foreground": "var(--on-surface)", 175 | "font-size": "14sp", 176 | "shape": "var(--shape-variant)", 177 | "shadow-elevation": "2dp" 178 | }, 179 | 180 | "emoji-key": { 181 | "background": "transparent", 182 | "foreground": "var(--on-background)", 183 | "font-size": "22sp", 184 | "shape": "var(--shape)" 185 | }, 186 | "emoji-key:pressed": { 187 | "background": "var(--surface)", 188 | "foreground": "var(--on-surface)" 189 | }, 190 | "emoji-key-popup": { 191 | "background": "var(--surface)", 192 | "foreground": "var(--on-surface)", 193 | "font-size": "22sp", 194 | "shape": "var(--shape)", 195 | "shadow-elevation": "2dp" 196 | }, 197 | "emoji-key-popup:focus": { 198 | "background": "var(--surface-variant)", 199 | "foreground": "var(--on-surface)" 200 | }, 201 | "emoji-tab": { 202 | "foreground": "var(--on-background)" 203 | }, 204 | "emoji-tab:focus": { 205 | "foreground": "var(--primary)" 206 | }, 207 | 208 | "extracted-landscape-input-action": { 209 | "background": "var(--surface)", 210 | "foreground": "var(--on-surface)", 211 | "shape": "rounded-corner(4dp,4dp,4dp,4dp)" 212 | }, 213 | "extracted-landscape-input-field": { 214 | "background": "transparent", 215 | "foreground": "var(--on-background)", 216 | "font-size": "16sp", 217 | "shape": "rounded-corner(12dp,12dp,12dp,12dp)", 218 | "border-color": "var(--secondary)", 219 | "border-width": "1dp" 220 | }, 221 | "extracted-landscape-input-layout": { 222 | "background": "var(--background)" 223 | }, 224 | 225 | "glide-trail": { 226 | "foreground": "var(--secondary)" 227 | }, 228 | 229 | "one-handed-panel": { 230 | "background": "var(--background)", 231 | "foreground": "var(--on-surface)" 232 | }, 233 | 234 | "system-nav-bar": { 235 | "background": "var(--background)" 236 | } 237 | } 238 | -------------------------------------------------------------------------------- /justfile: -------------------------------------------------------------------------------- 1 | set export 2 | 3 | _default: 4 | @just --list 5 | 6 | version := `jq '.meta.version' extension.json | tr -d '"'` 7 | 8 | # Remove the './dist' directory 9 | clean: 10 | rm -rfv ./dist 11 | 12 | # Minify JSON files and put source files into "./dist" 13 | build: clean 14 | whiskers florisboard.tera 15 | cat extension.json | jq -c > dist/extension.json 16 | for file in `ls dist/stylesheets`; do \ 17 | cat dist/stylesheets/$file | jq -c > dist/stylesheets/minify_$file; \ 18 | mv -v dist/stylesheets/minify_$file dist/stylesheets/$file; \ 19 | done 20 | 21 | # Zip "./dist" into the "./flex" format 22 | zip: build 23 | rm -v catppuccin-{{version}}.flex || true 24 | cd dist && zip -r ../catppuccin-{{version}}.flex . 25 | -------------------------------------------------------------------------------- /renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://docs.renovatebot.com/renovate-schema.json", 3 | "extends": [ 4 | "local>catppuccin/renovate-config" 5 | ] 6 | } 7 | --------------------------------------------------------------------------------