Compare commits
33 Commits
v1.0.0-rc2
...
fix/casing
Author | SHA1 | Date | |
---|---|---|---|
|
23647dfd10 | ||
|
b5eda7aba8 | ||
|
54633c0f72 | ||
|
4173b70b91 | ||
|
006c148f10 | ||
|
409628ed32 | ||
|
22a62eab04 | ||
|
b421b50380 | ||
|
cae57c80f8 | ||
|
e7b8bb2c4a | ||
|
e11c9b71f0 | ||
|
09b1cd28d4 | ||
|
8b54c05ff5 | ||
|
03fd2c9b7e | ||
|
8b459944c4 | ||
|
124944fc5b | ||
|
641f692dd8 | ||
|
a36e8a3b91 | ||
|
327d02c0ec | ||
|
495589d9f8 | ||
|
455dd7b403 | ||
|
b40c355ba3 | ||
|
001ba5bf12 | ||
|
1c336f20ad | ||
|
14cee4c1f5 | ||
|
febd32f208 | ||
|
663f6c61f8 | ||
|
b2f3d267e4 | ||
|
e72416ae5e | ||
|
87a5f92f4b | ||
|
b508c0ff2d | ||
|
44be6bb595 | ||
|
6eeda71fb7 |
20
.github/ISSUE_TEMPLATE/bug.yml
vendored
@@ -25,18 +25,24 @@ body:
|
|||||||
attributes:
|
attributes:
|
||||||
label: How did you install the theme?
|
label: How did you install the theme?
|
||||||
options:
|
options:
|
||||||
- GitHub Release
|
- From release (install.py)
|
||||||
- AUR Package
|
- From release (manual installation)
|
||||||
- catppuccin/nix
|
- From source (build.py)
|
||||||
- Nixpkgs
|
- Nix (nixpkgs / catppuccin/nix)
|
||||||
- Flatpak
|
- AUR package
|
||||||
- From source (Python script)
|
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
|
- type: checkboxes
|
||||||
|
attributes:
|
||||||
|
label: Are you running the latest release, and if not does the issue persist there?
|
||||||
|
description: "Our latest release can be found under the [GitHub releases](https://github.com/catppuccin/gtk/releases/latest)"
|
||||||
|
options:
|
||||||
|
- label: I am running on the latest release & the issue persists there
|
||||||
|
required: true
|
||||||
- type: checkboxes
|
- type: checkboxes
|
||||||
attributes:
|
attributes:
|
||||||
label: If using GTK4, have you symlinked the "gtk-4.0" folder?
|
label: If using GTK4, have you symlinked the "gtk-4.0" folder?
|
||||||
description: "The instructions for symlinking are described in the [README](https://github.com/catppuccin/gtk/tree/877e75568c9bb0d57c7ddda85b246fa17af45e57?tab=readme-ov-file#for-gtk-4-users)."
|
description: "The instructions for symlinking are described at the bottom of the [Manual Installation guide](https://github.com/catppuccin/gtk/tree/663f6c61f8cf1fcbbeb72110bf6b0a0214755245?tab=readme-ov-file#manual-installation)."
|
||||||
options:
|
options:
|
||||||
- label: I have symlinked the `gtk-4.0` folder.
|
- label: I have symlinked the `gtk-4.0` folder.
|
||||||
required: false
|
required: false
|
||||||
|
35
.github/workflows/build.yml
vendored
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
name: "Generate test artifacts"
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
types: [opened, reopened, synchronize]
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
submodules: true
|
||||||
|
- uses: actions/setup-python@v5
|
||||||
|
with:
|
||||||
|
python-version: "3.11"
|
||||||
|
cache: "pip"
|
||||||
|
- name: Install dependencies
|
||||||
|
run: pip install -r requirements.txt
|
||||||
|
- name: Install colloid specific dependencies
|
||||||
|
run: sudo apt update && sudo apt install -y sassc inkscape optipng
|
||||||
|
- name: Generate themes
|
||||||
|
run: |
|
||||||
|
python patches/xfwm4/generate_assets.py
|
||||||
|
|
||||||
|
python ./build.py mocha --all-accents --zip -d $PWD/releases &&
|
||||||
|
python ./build.py macchiato --all-accents --zip -d $PWD/releases &&
|
||||||
|
python ./build.py frappe --all-accents --zip -d $PWD/releases &&
|
||||||
|
python ./build.py latte --all-accents --zip -d $PWD/releases
|
||||||
|
- name: Upload artifacts
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: '${{ github.sha }}-artifacts'
|
||||||
|
path: ./releases/*.zip
|
||||||
|
|
31
.github/workflows/release.yml
vendored
@@ -1,12 +1,28 @@
|
|||||||
name: "Release"
|
name: release
|
||||||
|
|
||||||
on:
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
push:
|
push:
|
||||||
tags:
|
branches: [main]
|
||||||
- "v*"
|
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
pull-requests: write
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
release-please:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: googleapis/release-please-action@v4
|
||||||
|
id: release
|
||||||
|
outputs:
|
||||||
|
release_created: ${{ steps.release.outputs.release_created }}
|
||||||
|
tag_name: ${{ steps.release.outputs.tag_name }}
|
||||||
|
|
||||||
release:
|
release:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
needs: release-please
|
||||||
|
if: ${{ needs.release-please.outputs.release_created }}
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
@@ -22,12 +38,13 @@ jobs:
|
|||||||
run: sudo apt update && sudo apt install -y sassc inkscape optipng
|
run: sudo apt update && sudo apt install -y sassc inkscape optipng
|
||||||
- name: Generate themes
|
- name: Generate themes
|
||||||
run: |
|
run: |
|
||||||
|
python patches/xfwm4/generate_assets.py
|
||||||
|
|
||||||
python ./build.py mocha --all-accents --zip -d $PWD/releases &&
|
python ./build.py mocha --all-accents --zip -d $PWD/releases &&
|
||||||
python ./build.py macchiato --all-accents --zip -d $PWD/releases &&
|
python ./build.py macchiato --all-accents --zip -d $PWD/releases &&
|
||||||
python ./build.py frappe --all-accents --zip -d $PWD/releases &&
|
python ./build.py frappe --all-accents --zip -d $PWD/releases &&
|
||||||
python ./build.py latte --all-accents --zip -d $PWD/releases
|
python ./build.py latte --all-accents --zip -d $PWD/releases
|
||||||
- name: Add zips to release
|
- name: Add zips to release
|
||||||
uses: softprops/action-gh-release@v2
|
run: gh release upload ${{ needs.release-please.outputs.tag_name }} releases/*.zip
|
||||||
with:
|
env:
|
||||||
draft: true
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
files: ./releases/*.zip
|
|
||||||
|
3
.release-please-manifest.json
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
".": "1.0.2"
|
||||||
|
}
|
74
ARCHITECTURE.md
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
## Build pipeline
|
||||||
|
|
||||||
|
The GTK port has a fairly complicated build pipeline / system, chiefly stemming from our use of Colloid as a base theme.
|
||||||
|
We use Colloid as a base to reduce development overhead of creating our own theme from scratch, we look to replace this in the future
|
||||||
|
to give us more flexibility and control over the theme (see https://github.com/catppuccin/gtk/issues/164).
|
||||||
|
|
||||||
|
We have reimplemented Colloid's build system (previously implemented in Shell) in Python to make it easier to maintain, extend, and iterate on.
|
||||||
|
With this re-implementation, we have several distinct components in the system, described below:
|
||||||
|
1) Patching
|
||||||
|
2) SCSS
|
||||||
|
2) Assets
|
||||||
|
|
||||||
|
## Patching
|
||||||
|
|
||||||
|
We patch our colloid submodule to add additional functionality and (temporarily) fix bugs found in Colloid.
|
||||||
|
We do this through `.patch` files, applied with `git apply` when the build script boots up.
|
||||||
|
The build script will store some state in the submodule to ensure it does not get needlessly patched.
|
||||||
|
|
||||||
|
The patches are stored in `patches/colloid`, and currently have our palette, the Plank theme, and a modification to Colloid
|
||||||
|
to allow all of our accents to load. When we find issues in Colloid, they will be patched through this system before being submitted upstream.
|
||||||
|
|
||||||
|
## SCSS
|
||||||
|
|
||||||
|
[This section assumes the directory root is at `colliod/src/sass`]
|
||||||
|
|
||||||
|
The bulk of the theme is implemented here, in SCSS. This is by far the most modular part of Colloid out of the box, requiring minimal patching from our end to function.
|
||||||
|
To start, we move the Colloid submodule into its own temporary copy. This is to allow us to run multiple builds in parallel, which would be otherwise impossible due to the
|
||||||
|
file changes necessitated by each build, described below.
|
||||||
|
|
||||||
|
With our temporary copy established, we generate the 'tweaks' for the build. This sets up a file (`_tweaks-temp.scss`) which describes the various knobs and dials for the build:
|
||||||
|
```scss
|
||||||
|
@import 'color-palette-catppuccin-mocha';
|
||||||
|
|
||||||
|
$colorscheme: 'catppuccin';
|
||||||
|
$colortype: 'system';
|
||||||
|
$opacity: 'default';
|
||||||
|
$theme: 'mauve';
|
||||||
|
$compact: 'false';
|
||||||
|
$translucent: 'false';
|
||||||
|
$panel_opacity: 1.0;
|
||||||
|
$blackness: 'false';
|
||||||
|
$rimless: 'false';
|
||||||
|
$window_button: 'mac';
|
||||||
|
$float: 'false';
|
||||||
|
```
|
||||||
|
We edit in the correct palette import for the flavour we're building, and set the other variables based on user / build state input.
|
||||||
|
|
||||||
|
With the tweaks setup, we can now invoke `sassc` (the SCSS compiler) to build all of our CSS files. We run all of the SCSS builds in parallel, for performance.
|
||||||
|
With the SCSS complete, we have now finished most of the work required for the build.
|
||||||
|
|
||||||
|
|
||||||
|
## Assets
|
||||||
|
|
||||||
|
We build our own assets to ship with the theme, based on the processes used in Colloid.
|
||||||
|
|
||||||
|
We build assets for GTK, to include UI elements such as buttons, checkboxes,
|
||||||
|
etc. This is done through standard find-and-replace, as these assets are just SVGs. We do not support GTK2, so do not have to support the older PNG assets used there.
|
||||||
|
|
||||||
|
We also build assets for Xfce's Xfwm4, which are first patched from a source SVG, and then rendered through the `inkscape` CLI.
|
||||||
|
This operation is done once, at the start of a build process (e.g CI, to be reused for every subsequent build), or once until they change in the future for local development.
|
||||||
|
The script to generate these assets can be found at [`patches/xfwm4/generate_assets.py`](./patches/xfwm4/generate_assets.py)
|
||||||
|
|
||||||
|
|
||||||
|
## CI integration
|
||||||
|
|
||||||
|
The CI system utilizes the build system, as described above, but with some unique parallelization elements to improve performance.
|
||||||
|
We have chosen to only build a limited subset of possible tweaks in CI, to constrain the time it takes to run.
|
||||||
|
|
||||||
|
Currently, we build a matrix of:
|
||||||
|
- Flavor
|
||||||
|
- Accent
|
||||||
|
|
||||||
|
The CI will run all 4 flavours in parallel (see above for precautions taken to ensure this functions correctly), and build each accent serially.
|
||||||
|
We collate the logs for these runs into files so that they can be shown neatly at the end of the run.
|
15
CHANGELOG.md
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
# Changelog
|
||||||
|
|
||||||
|
## [1.0.2](https://github.com/catppuccin/gtk/compare/v1.0.1...v1.0.2) (2024-05-27)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* alt tab menu ([#209](https://github.com/catppuccin/gtk/issues/209)) ([cae57c8](https://github.com/catppuccin/gtk/commit/cae57c80f81fd1cc40fab2655109b09fa97103b9))
|
||||||
|
|
||||||
|
## [1.0.1](https://github.com/catppuccin/gtk/compare/v1.0.0...v1.0.1) (2024-05-27)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* alt tab menu ([#209](https://github.com/catppuccin/gtk/issues/209)) ([cae57c8](https://github.com/catppuccin/gtk/commit/cae57c80f81fd1cc40fab2655109b09fa97103b9))
|
@@ -1,5 +1,7 @@
|
|||||||
## Development
|
## Development
|
||||||
|
|
||||||
|
Information regarding the architecture of the project can be found [in the ARCHITECTURE.md](./ARCHITECTURE.md) document.
|
||||||
|
|
||||||
### Requirements
|
### Requirements
|
||||||
- All the [requirements for building](#building)
|
- All the [requirements for building](#building)
|
||||||
- `whiskers`, optionally, from [catppuccin/toolbox](https://github.com/catppuccin/toolbox/tree/main/whiskers#installation)
|
- `whiskers`, optionally, from [catppuccin/toolbox](https://github.com/catppuccin/toolbox/tree/main/whiskers#installation)
|
||||||
@@ -17,4 +19,52 @@ Once the build script patches the submodule, it will write a file into
|
|||||||
The palette patches are generated through `whiskers`,
|
The palette patches are generated through `whiskers`,
|
||||||
so if you're changing them, they will need regenerated. Simply run `whiskers palette.tera` to rebuild them.
|
so if you're changing them, they will need regenerated. Simply run `whiskers palette.tera` to rebuild them.
|
||||||
|
|
||||||
The process for building the theme is [documented in the README](./README.md#building).
|
The process for building the theme is [documented in the README](./README.md#building).
|
||||||
|
|
||||||
|
### Upstreaming procedure
|
||||||
|
|
||||||
|
Now and again, Colloid will have bugs upstream that impacts our theme. With our patching system we can easily fix these problems,
|
||||||
|
but we still want to contribute the fixes upstream to benefit all users & forks of Colloid.
|
||||||
|
|
||||||
|
To avoid stalling unnecessarily, our procedure for the above is as follows:
|
||||||
|
1) Open a PR to fix the issue, by adding a patch file to our theme, add `upstream:intended`
|
||||||
|
to signal these changes are to be sent to Colloid eventually.
|
||||||
|
2) Merge the PR & close the issue in our theme pertaining to the issue, once reviewed and approved
|
||||||
|
3) Open a PR in Colloid with the patch
|
||||||
|
4) Open a new issue in our theme, with these details:
|
||||||
|
- The initial issue in our theme
|
||||||
|
- The PR in Colloid that fixes the issue there
|
||||||
|
- The PR that fixed the issue in our theme
|
||||||
|
|
||||||
|
Add the `upstream:open` label
|
||||||
|
5) Once the PR is merged in Colloid:
|
||||||
|
1) Test that the issue no longer persists, without our patch
|
||||||
|
2) Open a PR to remove the patch file in our theme, with these details:
|
||||||
|
- The tracking issue
|
||||||
|
- The commit that fixed the issue in Colloid
|
||||||
|
3) Close the tracking issue & merge the PR to remove the patch file
|
||||||
|
|
||||||
|
|
||||||
|
### Running test builds
|
||||||
|
We support building and publishing test builds from PRs. When you open PRs, the CI will automatically build with your changes and push an artifact
|
||||||
|
which bundles all of the produced themes.
|
||||||
|
|
||||||
|
You can then download the artifacts as a zip (result should look similar to 7bff2448a81e36bf3b0e03bfbd649bebe6973ec7-artifacts.zip) and
|
||||||
|
pass the path into `install.py` under the `--from-artifact` option:
|
||||||
|
```bash
|
||||||
|
python3 install.py mocha blue --dest ./build --from-artifact ~/downloads/7bff2448a81e36bf3b0e03bfbd649bebe6973ec7-artifacts.zip
|
||||||
|
```
|
||||||
|
|
||||||
|
This will take the target flavor / accent out of the zip, and install it using the regular install process.
|
||||||
|
|
||||||
|
It is advised to pass a `--dest` when running in this mode, because the released zips follow the exact same naming scheme as regular builds.
|
||||||
|
This wil cause conflicts when you install, if you already had that theme installed. Passing a different destination allows you to move the
|
||||||
|
extracted folders to `~/.local/share/themes` yourself, adding a suffix as appropriate to avoid conflicts.
|
||||||
|
|
||||||
|
> [!WARNING]
|
||||||
|
> If you pass `--link` to the install script when working from a PR, it will forcibly overwrite your `~/.config/gtk-4.0/` symlinks.
|
||||||
|
> You will have to reinstall / relink to revert this.
|
||||||
|
|
||||||
|
### Useful resources
|
||||||
|
- GNOME-shell sources: https://gitlab.gnome.org/GNOME/gnome-shell/-/tree/gnome-46/data/theme
|
||||||
|
- GTK inspector guide: https://developer.gnome.org/documentation/tools/inspector.html
|
31
README.md
@@ -28,8 +28,10 @@ This GTK theme requires:
|
|||||||
|
|
||||||
We provide a Python script to automate the process of installing the theme:
|
We provide a Python script to automate the process of installing the theme:
|
||||||
|
|
||||||
|
<!-- x-release-please-start-version -->
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
curl -LsS "https://raw.githubusercontent.com/catppuccin/gtk/main/install.py" -o install.py
|
curl -LsSO "https://raw.githubusercontent.com/catppuccin/gtk/v1.0.2/install.py"
|
||||||
python3 install.py <flavor> <accent>
|
python3 install.py <flavor> <accent>
|
||||||
[catppuccin-gtk] [INFO] - Installation info:
|
[catppuccin-gtk] [INFO] - Installation info:
|
||||||
flavor: mocha
|
flavor: mocha
|
||||||
@@ -37,7 +39,7 @@ python3 install.py <flavor> <accent>
|
|||||||
dest: /home/<user>/.local/share/themes
|
dest: /home/<user>/.local/share/themes
|
||||||
link: False
|
link: False
|
||||||
|
|
||||||
remote_url: https://github.com/catppuccin/gtk/releases/download/v1.0.0-alpha/catppuccin-mocha-blue-standard+default.zip
|
remote_url: https://github.com/catppuccin/gtk/releases/download/v1.0.2/catppuccin-mocha-blue-standard+default.zip
|
||||||
[catppuccin-gtk] [INFO] - Starting download...
|
[catppuccin-gtk] [INFO] - Starting download...
|
||||||
[catppuccin-gtk] [INFO] - Response status: 200
|
[catppuccin-gtk] [INFO] - Response status: 200
|
||||||
[catppuccin-gtk] [INFO] - Download finished, zip is valid
|
[catppuccin-gtk] [INFO] - Download finished, zip is valid
|
||||||
@@ -83,9 +85,25 @@ You can set up our Nix module for GTK with the following config:
|
|||||||
|
|
||||||
Alternatively, if you are not using our Nix module, you can grab the theme from [nixpkgs/catppuccin-gtk](https://github.com/NixOS/nixpkgs/blob/master/pkgs/data/themes/catppuccin-gtk/default.nix)
|
Alternatively, if you are not using our Nix module, you can grab the theme from [nixpkgs/catppuccin-gtk](https://github.com/NixOS/nixpkgs/blob/master/pkgs/data/themes/catppuccin-gtk/default.nix)
|
||||||
|
|
||||||
|
## Flatpak
|
||||||
|
Flatpak by default restricts access to themes, to allow access, use the following:
|
||||||
|
```bash
|
||||||
|
sudo flatpak override --filesystem=$HOME/.local/share/themes
|
||||||
|
```
|
||||||
|
|
||||||
|
After you've allowed access, set the theme, using the following:
|
||||||
|
```bash
|
||||||
|
# Change to suite your flavor / accent combination
|
||||||
|
export FLAVOR="mocha"
|
||||||
|
export ACCENT="mauve"
|
||||||
|
|
||||||
|
# Set the theme
|
||||||
|
sudo flatpak override --env=GTK_THEME="catppuccin-${FLAVOR}-${ACCENT}-standard+default"
|
||||||
|
```
|
||||||
|
|
||||||
### Manual installation
|
### Manual installation
|
||||||
|
|
||||||
If your distro does not package our theme, and the installation script will not work for your use case, you can pull down releases and extract them yourself. You can find the [latest release on GitHub](https://github.com/catppuccin/gtk/releases/latest).
|
If your distro does not package our theme, and the installation script will not work for your use case, you can pull down releases and extract them yourself. You can find the [latest release on GitHub](https://github.com/catppuccin/gtk/releases/tag/v1.0.2).
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cd ~/.local/share/themes
|
cd ~/.local/share/themes
|
||||||
@@ -94,7 +112,7 @@ cd ~/.local/share/themes
|
|||||||
export ROOT_URL="https://https://github.com/catppuccin/gtk/releases/download"
|
export ROOT_URL="https://https://github.com/catppuccin/gtk/releases/download"
|
||||||
|
|
||||||
# Change to the tag you want to download
|
# Change to the tag you want to download
|
||||||
export RELEASE="v1.0.0"
|
export RELEASE="v1.0.2"
|
||||||
|
|
||||||
# Change to suite your flavor / accent combination
|
# Change to suite your flavor / accent combination
|
||||||
export FLAVOR="mocha"
|
export FLAVOR="mocha"
|
||||||
@@ -105,7 +123,7 @@ curl -LsS "${ROOT_URL}/${RELEASE}/catppuccin-${FLAVOR}-${ACCENT}-standard+defaul
|
|||||||
unzip catppuccin-${FLAVOR}-${ACCENT}-standard+default.zip
|
unzip catppuccin-${FLAVOR}-${ACCENT}-standard+default.zip
|
||||||
|
|
||||||
# Set the catppuccin theme directory
|
# Set the catppuccin theme directory
|
||||||
export THEME_DIR="~/.local/share/themes/catppuccin-${FLAVOR}-${ACCENT}-standard+default"
|
export THEME_DIR="$HOME/.local/share/themes/catppuccin-${FLAVOR}-${ACCENT}-standard+default"
|
||||||
|
|
||||||
# Optionally, add support for libadwaita
|
# Optionally, add support for libadwaita
|
||||||
mkdir -p "${HOME}/.config/gtk-4.0" &&
|
mkdir -p "${HOME}/.config/gtk-4.0" &&
|
||||||
@@ -114,6 +132,8 @@ ln -sf "${THEME_DIR}/gtk-4.0/gtk.css" "${HOME}/.config/gtk-4.0/gtk.css" &&
|
|||||||
ln -sf "${THEME_DIR}/gtk-4.0/gtk-dark.css" "${HOME}/.config/gtk-4.0/gtk-dark.css"
|
ln -sf "${THEME_DIR}/gtk-4.0/gtk-dark.css" "${HOME}/.config/gtk-4.0/gtk-dark.css"
|
||||||
```
|
```
|
||||||
|
|
||||||
|
<!-- x-release-please-end -->
|
||||||
|
|
||||||
## Building
|
## Building
|
||||||
|
|
||||||
If our prebuilt offerings do not match your requirements, you will have to build the theme from source.
|
If our prebuilt offerings do not match your requirements, you will have to build the theme from source.
|
||||||
@@ -122,6 +142,7 @@ If our prebuilt offerings do not match your requirements, you will have to build
|
|||||||
|
|
||||||
- Python 3+
|
- Python 3+
|
||||||
- `sassc`, the Sass compiler
|
- `sassc`, the Sass compiler
|
||||||
|
- `inkscape`, `optipng`, for rendering PNGs
|
||||||
|
|
||||||
> [!WARNING]
|
> [!WARNING]
|
||||||
> We use a submodule to bring in colloid, the theme this theme is based on. You will need to clone
|
> We use a submodule to bring in colloid, the theme this theme is based on. You will need to clone
|
||||||
|
57
build.py
@@ -1,5 +1,5 @@
|
|||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
import os, re, shutil, subprocess, argparse, glob, logging, zipfile
|
import os, re, shutil, subprocess, argparse, glob, logging, zipfile, sys
|
||||||
|
|
||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
from typing import Any, Literal, List
|
from typing import Any, Literal, List
|
||||||
@@ -115,8 +115,7 @@ def build(ctx: BuildContext):
|
|||||||
[
|
[
|
||||||
"sassc",
|
"sassc",
|
||||||
*SASSC_OPT,
|
*SASSC_OPT,
|
||||||
# NOTE: This uses 'Dark' for the source, but 'dark' for the destination. This is intentional. Do !!NOT!! change it without consultation
|
f"{SRC_DIR}/main/gtk-3.0/gtk{ctx.apply_suffix(DARK_LIGHT)}.scss",
|
||||||
f"{SRC_DIR}/main/gtk-3.0/gtk-Dark.scss",
|
|
||||||
f"{output_dir}/gtk-3.0/gtk-dark.css",
|
f"{output_dir}/gtk-3.0/gtk-dark.css",
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
@@ -134,8 +133,7 @@ def build(ctx: BuildContext):
|
|||||||
[
|
[
|
||||||
"sassc",
|
"sassc",
|
||||||
*SASSC_OPT,
|
*SASSC_OPT,
|
||||||
# NOTE: This uses 'Dark' for the source, but 'dark' for the destination. This is intentional. Do !!NOT!! change it without consultation
|
f"{SRC_DIR}/main/gtk-4.0/gtk{ctx.apply_suffix(DARK_LIGHT)}.scss",
|
||||||
f"{SRC_DIR}/main/gtk-4.0/gtk-Dark.scss",
|
|
||||||
f"{output_dir}/gtk-4.0/gtk-dark.css",
|
f"{output_dir}/gtk-4.0/gtk-dark.css",
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
@@ -190,11 +188,11 @@ def build(ctx: BuildContext):
|
|||||||
|
|
||||||
if not ctx.flavor.dark:
|
if not ctx.flavor.dark:
|
||||||
shutil.copytree(
|
shutil.copytree(
|
||||||
f"{SRC_DIR}/main/plank/theme-Light-Catppuccin/", f"{output_dir}/plank"
|
f"{SRC_DIR}/main/plank/theme-Light-Catppuccin/", f"{output_dir}/plank", dirs_exist_ok=True
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
shutil.copytree(
|
shutil.copytree(
|
||||||
f"{SRC_DIR}/main/plank/theme-Dark-Catppuccin/", f"{output_dir}/plank"
|
f"{SRC_DIR}/main/plank/theme-Dark-Catppuccin/", f"{output_dir}/plank", dirs_exist_ok=True
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@@ -212,7 +210,6 @@ def subst_text(path, _from, to):
|
|||||||
|
|
||||||
GS_VERSION = "46-0"
|
GS_VERSION = "46-0"
|
||||||
|
|
||||||
|
|
||||||
def gnome_shell_version():
|
def gnome_shell_version():
|
||||||
shutil.copyfile(
|
shutil.copyfile(
|
||||||
f"{SRC_DIR}/sass/gnome-shell/_common.scss",
|
f"{SRC_DIR}/sass/gnome-shell/_common.scss",
|
||||||
@@ -231,38 +228,13 @@ def gnome_shell_version():
|
|||||||
f"@import 'extensions-{GS_VERSION}';",
|
f"@import 'extensions-{GS_VERSION}';",
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
# Accent translation
|
|
||||||
ctp_to_colloid = {
|
|
||||||
"rosewater": "pink",
|
|
||||||
"flamingo": "pink",
|
|
||||||
"pink": "pink",
|
|
||||||
"mauve": "purple",
|
|
||||||
"red": "red",
|
|
||||||
"maroon": "red",
|
|
||||||
"peach": "orange",
|
|
||||||
"yellow": "yellow",
|
|
||||||
"green": "green",
|
|
||||||
"teal": "teal",
|
|
||||||
"sky": "teal",
|
|
||||||
"sapphire": "default",
|
|
||||||
"blue": "default",
|
|
||||||
"lavender": "default",
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
def translate_accent(ctp_accent: Color):
|
|
||||||
return ctp_to_colloid[ctp_accent.identifier]
|
|
||||||
|
|
||||||
|
|
||||||
def write_tweak(key, default, value):
|
def write_tweak(key, default, value):
|
||||||
subst_text(
|
subst_text(
|
||||||
f"{SRC_DIR}/sass/_tweaks-temp.scss", f"\\${key}: {default}", f"${key}: {value}"
|
f"{SRC_DIR}/sass/_tweaks-temp.scss", f"\\${key}: {default}", f"${key}: {value}"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def apply_tweaks(ctx: BuildContext):
|
def apply_tweaks(ctx: BuildContext):
|
||||||
write_tweak("theme", "'default'", f"'{translate_accent(ctx.accent)}'")
|
write_tweak("theme", "'default'", f"'{ctx.accent.identifier}'")
|
||||||
|
|
||||||
if ctx.size == "compact":
|
if ctx.size == "compact":
|
||||||
write_tweak("compact", "'false'", "'true'")
|
write_tweak("compact", "'false'", "'true'")
|
||||||
@@ -393,17 +365,16 @@ def make_assets(ctx: BuildContext):
|
|||||||
f"{output_dir}/metacity-1/thumbnail.png",
|
f"{output_dir}/metacity-1/thumbnail.png",
|
||||||
)
|
)
|
||||||
|
|
||||||
# TODO: Make our own assets for this and patch them in with the patch system, then code it to be
|
xfwm4_assets_root = f"{THIS_DIR}/patches/xfwm4/generated/assets-catppuccin-{ctx.flavor.identifier}"
|
||||||
# {src_dir}/assets/xfwm4/assets{light_suffix}-Catppuccin/
|
for file in glob.glob(xfwm4_assets_root + '/*'):
|
||||||
# where assets-Light-Catppuccin will have latte
|
|
||||||
# nad assets-Catppuccin will have mocha or something
|
|
||||||
for file in glob.glob(f"{SRC_DIR}/assets/xfwm4/assets{ctx.apply_suffix(IS_LIGHT)}/*.png"):
|
|
||||||
shutil.copy(file, f"{output_dir}/xfwm4")
|
shutil.copy(file, f"{output_dir}/xfwm4")
|
||||||
|
|
||||||
for file in glob.glob(f"{SRC_DIR}/assets/xfwm4/assets{ctx.apply_suffix(IS_LIGHT)}-hdpi/*.png"):
|
xfwm4_assets = xfwm4_assets_root + "-hdpi/*"
|
||||||
|
for file in glob.glob(xfwm4_assets):
|
||||||
shutil.copy(file, f"{output_dir}-hdpi/xfwm4")
|
shutil.copy(file, f"{output_dir}-hdpi/xfwm4")
|
||||||
|
|
||||||
for file in glob.glob(f"{SRC_DIR}/assets/xfwm4/assets{ctx.apply_suffix(IS_LIGHT)}-xhdpi/*.png"):
|
xfwm4_assets = xfwm4_assets_root + "-xhdpi/*"
|
||||||
|
for file in glob.glob(xfwm4_assets):
|
||||||
shutil.copy(file, f"{output_dir}-xhdpi/xfwm4")
|
shutil.copy(file, f"{output_dir}-xhdpi/xfwm4")
|
||||||
|
|
||||||
|
|
||||||
@@ -477,10 +448,12 @@ def apply_colloid_patches():
|
|||||||
for patch in [
|
for patch in [
|
||||||
"plank-dark.patch",
|
"plank-dark.patch",
|
||||||
"plank-light.patch",
|
"plank-light.patch",
|
||||||
|
"theme-func.patch",
|
||||||
"sass-palette-frappe.patch",
|
"sass-palette-frappe.patch",
|
||||||
"sass-palette-mocha.patch",
|
"sass-palette-mocha.patch",
|
||||||
"sass-palette-latte.patch",
|
"sass-palette-latte.patch",
|
||||||
"sass-palette-macchiato.patch",
|
"sass-palette-macchiato.patch",
|
||||||
|
"fixes/alt-tab-background-color.patch"
|
||||||
]:
|
]:
|
||||||
path = f"./patches/colloid/{patch}"
|
path = f"./patches/colloid/{patch}"
|
||||||
logger.info(f"Applying patch '{patch}', located at '{path}'")
|
logger.info(f"Applying patch '{patch}', located at '{path}'")
|
||||||
@@ -491,7 +464,6 @@ def apply_colloid_patches():
|
|||||||
|
|
||||||
logger.info("Patching finished.")
|
logger.info("Patching finished.")
|
||||||
|
|
||||||
|
|
||||||
def parse_args():
|
def parse_args():
|
||||||
parser = argparse.ArgumentParser()
|
parser = argparse.ArgumentParser()
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
@@ -656,3 +628,4 @@ try:
|
|||||||
main()
|
main()
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error("Something went wrong when building the theme:", exc_info=e)
|
logger.error("Something went wrong when building the theme:", exc_info=e)
|
||||||
|
sys.exit(1)
|
||||||
|
121
install.py
@@ -1,9 +1,11 @@
|
|||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
import os, zipfile, argparse, logging, io
|
import os, zipfile, argparse, logging, io
|
||||||
|
from typing import Optional
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
from urllib.request import urlopen, Request
|
from urllib.request import urlopen, Request
|
||||||
|
from urllib.parse import urlparse
|
||||||
|
|
||||||
logger = logging.getLogger("catppuccin-gtk")
|
logger = logging.getLogger("catppuccin-gtk")
|
||||||
logger.setLevel(logging.DEBUG)
|
logger.setLevel(logging.DEBUG)
|
||||||
@@ -20,6 +22,17 @@ class InstallContext:
|
|||||||
dest: Path
|
dest: Path
|
||||||
link: bool
|
link: bool
|
||||||
|
|
||||||
|
def build_info(self, include_url=True) -> str:
|
||||||
|
url = build_release_url(self)
|
||||||
|
info = f"""Installation info:
|
||||||
|
flavor: {self.flavor}
|
||||||
|
accent: {self.accent}
|
||||||
|
dest: {self.dest.absolute()}
|
||||||
|
link: {self.link}"""
|
||||||
|
if include_url:
|
||||||
|
info += f"\nremote_url: {url}"
|
||||||
|
return info
|
||||||
|
|
||||||
|
|
||||||
def parse_args():
|
def parse_args():
|
||||||
parser = argparse.ArgumentParser()
|
parser = argparse.ArgumentParser()
|
||||||
@@ -49,11 +62,17 @@ def parse_args():
|
|||||||
"sapphire",
|
"sapphire",
|
||||||
"blue",
|
"blue",
|
||||||
"lavender",
|
"lavender",
|
||||||
"all",
|
|
||||||
],
|
],
|
||||||
help="Accent of the theme.",
|
help="Accent of the theme.",
|
||||||
)
|
)
|
||||||
|
|
||||||
|
parser.add_argument(
|
||||||
|
"--from-artifact",
|
||||||
|
type=Path,
|
||||||
|
dest="from_artifact",
|
||||||
|
help="Install from an artifact instead of a mainline release, pass the artifact path (e.g 7bff2448a81e36bf3b0e03bfbd649bebe6973ec7-artifacts.zip)",
|
||||||
|
)
|
||||||
|
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
"--dest",
|
"--dest",
|
||||||
"-d",
|
"-d",
|
||||||
@@ -75,27 +94,18 @@ def parse_args():
|
|||||||
|
|
||||||
def build_release_url(ctx: InstallContext) -> str:
|
def build_release_url(ctx: InstallContext) -> str:
|
||||||
repo_root = "https://github.com/catppuccin/gtk/releases/download"
|
repo_root = "https://github.com/catppuccin/gtk/releases/download"
|
||||||
release = "v1.0.0-rc2"
|
release = "v1.0.2" # x-release-please-version
|
||||||
zip_name = f"catppuccin-{ctx.flavor}-{ctx.accent}-standard+default.zip"
|
zip_name = f"catppuccin-{ctx.flavor}-{ctx.accent}-standard+default.zip"
|
||||||
|
|
||||||
return f"{repo_root}/{release}/{zip_name}"
|
return f"{repo_root}/{release}/{zip_name}"
|
||||||
|
|
||||||
|
|
||||||
def install(ctx: InstallContext):
|
def fetch_zip(url: str) -> Optional[zipfile.ZipFile]:
|
||||||
url = build_release_url(ctx)
|
req = Request(url)
|
||||||
build_info = f"""Installation info:
|
|
||||||
flavor: {ctx.flavor}
|
|
||||||
accent: {ctx.accent}
|
|
||||||
dest: {ctx.dest.absolute()}
|
|
||||||
link: {ctx.link}
|
|
||||||
|
|
||||||
remote_url: {url}"""
|
|
||||||
logger.info(build_info)
|
|
||||||
httprequest = Request(url)
|
|
||||||
|
|
||||||
zip_file = None
|
zip_file = None
|
||||||
logger.info("Starting download...")
|
logger.info("Starting download...")
|
||||||
with urlopen(httprequest) as response:
|
with urlopen(req) as response:
|
||||||
logger.info(f"Response status: {response.status}")
|
logger.info(f"Response status: {response.status}")
|
||||||
zip_file = zipfile.ZipFile(io.BytesIO(response.read()))
|
zip_file = zipfile.ZipFile(io.BytesIO(response.read()))
|
||||||
logger.info("Download finished, zip is valid")
|
logger.info("Download finished, zip is valid")
|
||||||
@@ -104,28 +114,84 @@ def install(ctx: InstallContext):
|
|||||||
first_bad_file = zip_file.testzip()
|
first_bad_file = zip_file.testzip()
|
||||||
if first_bad_file is not None:
|
if first_bad_file is not None:
|
||||||
logger.error(f'Zip appears to be corrupt, first bad file is "{first_bad_file}"')
|
logger.error(f'Zip appears to be corrupt, first bad file is "{first_bad_file}"')
|
||||||
return
|
return None
|
||||||
logger.info("Download verified")
|
logger.info("Download verified")
|
||||||
|
return zip_file
|
||||||
|
|
||||||
|
|
||||||
|
def add_libadwaita_links(ctx: InstallContext, rewrite: bool = False):
|
||||||
|
suffix = "light"
|
||||||
|
if ctx.flavor != "latte":
|
||||||
|
suffix = "dark"
|
||||||
|
dir_name = (
|
||||||
|
ctx.dest / f"catppuccin-{ctx.flavor}-{ctx.accent}-standard+default-{suffix}" / "gtk-4.0"
|
||||||
|
).absolute()
|
||||||
|
gtk4_dir = (Path(os.path.expanduser("~")) / ".config" / "gtk-4.0").absolute()
|
||||||
|
os.makedirs(gtk4_dir, exist_ok=True)
|
||||||
|
|
||||||
|
logger.info("Adding symlinks for libadwaita")
|
||||||
|
logger.info(f"Root: {dir_name}")
|
||||||
|
logger.info(f"Target: {gtk4_dir}")
|
||||||
|
try:
|
||||||
|
if rewrite:
|
||||||
|
os.remove(gtk4_dir / "assets")
|
||||||
|
os.remove(gtk4_dir / "gtk.css")
|
||||||
|
os.remove(gtk4_dir / "gtk-dark.css")
|
||||||
|
except FileNotFoundError:
|
||||||
|
logger.debug("Ignoring FileNotFound in symlink rewrite")
|
||||||
|
|
||||||
|
os.symlink(dir_name / "assets", gtk4_dir / "assets")
|
||||||
|
os.symlink(dir_name / "gtk.css", gtk4_dir / "gtk.css")
|
||||||
|
os.symlink(dir_name / "gtk-dark.css", gtk4_dir / "gtk-dark.css")
|
||||||
|
|
||||||
|
|
||||||
|
def install(ctx: InstallContext):
|
||||||
|
url = build_release_url(ctx)
|
||||||
|
logger.info(ctx.build_info())
|
||||||
|
|
||||||
|
zip_file = fetch_zip(url)
|
||||||
|
if zip_file is None:
|
||||||
|
return
|
||||||
|
|
||||||
logger.info("Extracting...")
|
logger.info("Extracting...")
|
||||||
zip_file.extractall(ctx.dest)
|
zip_file.extractall(ctx.dest)
|
||||||
logger.info("Extraction complete")
|
logger.info("Extraction complete")
|
||||||
|
|
||||||
if ctx.link:
|
if ctx.link:
|
||||||
dir_name = (ctx.dest / f"catppuccin-{ctx.flavor}-{ctx.accent}-standard+default" / 'gtk-4.0').absolute()
|
add_libadwaita_links(ctx)
|
||||||
gtk4_dir = (Path(os.path.expanduser('~')) / '.config' / 'gtk-4.0').absolute()
|
|
||||||
os.makedirs(gtk4_dir, exist_ok=True)
|
|
||||||
|
|
||||||
logger.info("Adding symlinks for libadwaita")
|
def install_from_artifact(ctx: InstallContext, artifact_path: Path):
|
||||||
logger.info(f'Root: {dir_name}')
|
# Working from a pull request, special case it
|
||||||
logger.info(f'Target: {gtk4_dir}')
|
logger.info(f"Extracting artifact from '{artifact_path}'")
|
||||||
os.symlink(dir_name / 'assets', gtk4_dir / 'assets')
|
artifacts = zipfile.ZipFile(artifact_path)
|
||||||
os.symlink(dir_name / 'gtk.css', gtk4_dir / 'gtk.css')
|
|
||||||
os.symlink(dir_name / 'gtk-dark.css', gtk4_dir / 'gtk-dark.css')
|
|
||||||
|
|
||||||
|
logger.info("Verifying artifact...")
|
||||||
|
first_bad_file = artifacts.testzip()
|
||||||
|
if first_bad_file is not None:
|
||||||
|
logger.error(f'Zip appears to be corrupt, first bad file is "{first_bad_file}"')
|
||||||
|
return None
|
||||||
|
logger.info("Artifact verified")
|
||||||
|
|
||||||
|
logger.info(ctx.build_info(False))
|
||||||
|
|
||||||
|
# The zip, inside the artifacts, that we want to pull out
|
||||||
|
zip_name = f"catppuccin-{ctx.flavor}-{ctx.accent}-standard+default.zip"
|
||||||
|
logger.info(f"Pulling '{zip_name}' from the artifacts")
|
||||||
|
info = artifacts.getinfo(zip_name)
|
||||||
|
|
||||||
|
logger.info("Extracting the artifact...")
|
||||||
|
artifact = zipfile.ZipFile(io.BytesIO(artifacts.read(info)))
|
||||||
|
artifact.extractall(ctx.dest)
|
||||||
|
logger.info("Extraction complete")
|
||||||
|
|
||||||
|
if ctx.link:
|
||||||
|
logger.info("Adding links (with rewrite)")
|
||||||
|
add_libadwaita_links(ctx, True)
|
||||||
|
logger.info("Links added")
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
args = parse_args()
|
args = parse_args()
|
||||||
|
|
||||||
dest = Path(os.path.expanduser("~")) / ".local" / "share" / "themes"
|
dest = Path(os.path.expanduser("~")) / ".local" / "share" / "themes"
|
||||||
os.makedirs(dest, exist_ok=True)
|
os.makedirs(dest, exist_ok=True)
|
||||||
|
|
||||||
@@ -136,9 +202,12 @@ def main():
|
|||||||
flavor=args.flavor, accent=args.accent, dest=dest, link=args.link
|
flavor=args.flavor, accent=args.accent, dest=dest, link=args.link
|
||||||
)
|
)
|
||||||
|
|
||||||
install(ctx)
|
if args.from_artifact:
|
||||||
|
install_from_artifact(ctx, args.from_artifact)
|
||||||
|
return
|
||||||
|
|
||||||
logger.info('Theme installation complete!')
|
install(ctx)
|
||||||
|
logger.info("Theme installation complete!")
|
||||||
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
13
patches/colloid/fixes/alt-tab-background-color.patch
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
diff --git a/src/sass/gnome-shell/common/_switcher-popup.scss b/src/sass/gnome-shell/common/_switcher-popup.scss
|
||||||
|
index 90b51ab4..408662fb 100644
|
||||||
|
--- a/src/sass/gnome-shell/common/_switcher-popup.scss
|
||||||
|
+++ b/src/sass/gnome-shell/common/_switcher-popup.scss
|
||||||
|
@@ -14,6 +14,8 @@
|
||||||
|
border-radius: $base_radius;
|
||||||
|
border: 1px solid transparent;
|
||||||
|
|
||||||
|
+ background-color: $osd;
|
||||||
|
+
|
||||||
|
&:outlined {
|
||||||
|
background-color: $divider;
|
||||||
|
color: $text; // for Ubuntu session
|
@@ -8,10 +8,25 @@ whiskers:
|
|||||||
{%- set palette = flavor.colors -%}
|
{%- set palette = flavor.colors -%}
|
||||||
diff --git a/src/sass/_color-palette-catppuccin-{{ flavor.identifier }}.scss b/src/sass/_color-palette-catppuccin-{{ flavor.identifier }}.scss
|
diff --git a/src/sass/_color-palette-catppuccin-{{ flavor.identifier }}.scss b/src/sass/_color-palette-catppuccin-{{ flavor.identifier }}.scss
|
||||||
new file mode 100644
|
new file mode 100644
|
||||||
index 00000000..8a905942
|
index 00000000..4ff0da0d
|
||||||
--- /dev/null
|
--- /dev/null
|
||||||
+++ b/src/sass/_color-palette-catppuccin-{{ flavor.identifier }}.scss
|
+++ b/src/sass/_color-palette-catppuccin-{{ flavor.identifier }}.scss
|
||||||
@@ -0,0 +1,72 @@
|
@@ -0,0 +1,87 @@
|
||||||
|
+ // Our accents
|
||||||
|
+ $rosewater: #{{ palette.rosewater.hex }};
|
||||||
|
+ $flamingo: #{{ palette.flamingo.hex }};
|
||||||
|
+ $pink: #{{ palette.pink.hex }};
|
||||||
|
+ $mauve: #{{ palette.mauve.hex }};
|
||||||
|
+ $red: #{{ palette.red.hex }};
|
||||||
|
+ $maroon: #{{ palette.maroon.hex }};
|
||||||
|
+ $peach: #{{ palette.peach.hex }};
|
||||||
|
+ $yellow: #{{ palette.yellow.hex }};
|
||||||
|
+ $green: #{{ palette.green.hex }};
|
||||||
|
+ $teal: #{{ palette.teal.hex }};
|
||||||
|
+ $sky: #{{ palette.sky.hex }};
|
||||||
|
+ $sapphire: #{{ palette.sapphire.hex }};
|
||||||
|
+ $blue: #{{ palette.blue.hex }};
|
||||||
|
+ $lavender: #{{ palette.lavender.hex }};
|
||||||
+// Default Theme Color Palette
|
+// Default Theme Color Palette
|
||||||
+
|
+
|
||||||
+// Red
|
+// Red
|
||||||
@@ -47,31 +62,53 @@ index 00000000..8a905942
|
|||||||
+$orange-dark: #{{ palette.peach.hex }};
|
+$orange-dark: #{{ palette.peach.hex }};
|
||||||
+
|
+
|
||||||
+// Grey
|
+// Grey
|
||||||
+$grey-050: #{{ palette.text.hex }};
|
{% if flavor.dark -%} {#- https://github.com/catppuccin/gtk/blob/0c3e8817da94769887c690b2211e006b287b27b1/scripts/recolor.py#L153-L176 -#}
|
||||||
+$grey-100: #{{ palette.subtext1.hex }};
|
+$grey-050: #{{ palette.overlay2.hex }};
|
||||||
+$grey-150: #{{ palette.subtext1.hex }};
|
+$grey-100: #{{ palette.overlay1.hex }};
|
||||||
+$grey-200: #{{ palette.subtext0.hex }};
|
+$grey-150: #{{ palette.overlay0.hex }};
|
||||||
+$grey-250: #{{ palette.subtext0.hex }};
|
+$grey-200: #{{ palette.surface2.hex }};
|
||||||
+$grey-300: #{{ palette.overlay1.hex }};
|
+$grey-250: #{{ palette.surface1.hex }};
|
||||||
+$grey-350: #{{ palette.overlay1.hex }};
|
+$grey-300: red;
|
||||||
+$grey-400: #{{ palette.overlay0.hex }};
|
+$grey-350: red;
|
||||||
+$grey-450: #{{ palette.overlay0.hex }};
|
+$grey-400: red;
|
||||||
+$grey-500: #{{ palette.surface2.hex }};
|
+$grey-450: red;
|
||||||
+$grey-550: #{{ palette.surface2.hex }};
|
+$grey-500: red;
|
||||||
+$grey-600: #{{ palette.surface1.hex }};
|
+$grey-550: red;
|
||||||
+$grey-650: #{{ palette.surface1.hex }};
|
+$grey-600: red;
|
||||||
+$grey-700: #{{ palette.surface0.hex }};
|
+$grey-650: #{{ palette.surface0.hex }};
|
||||||
+$grey-750: #{{ palette.surface0.hex }};
|
+$grey-700: #{{ palette.base.hex }};
|
||||||
+$grey-800: #{{ palette.base.hex }};
|
+$grey-750: #{{ palette.mantle.hex }};
|
||||||
+$grey-850: #{{ palette.base.hex }};
|
+$grey-800: #{{ palette.crust.hex }};
|
||||||
+$grey-900: #{{ palette.crust.hex }};
|
+$grey-850: #020202;
|
||||||
+$grey-950: #{{ palette.crust.hex }};
|
+$grey-900: #010101;
|
||||||
|
+$grey-950: #000000;
|
||||||
|
{%- else -%} {#- Light mode https://github.com/catppuccin/gtk/blob/0c3e8817da94769887c690b2211e006b287b27b1/scripts/recolor.py#L128-L151 -#}
|
||||||
|
+$grey-050: #{{ palette.crust.hex }};
|
||||||
|
+$grey-100: #{{ palette.mantle.hex }};
|
||||||
|
+$grey-150: #{{ palette.base.hex }};
|
||||||
|
+$grey-200: #{{ palette.surface0.hex }};
|
||||||
|
+$grey-250: #{{ palette.surface1.hex }};
|
||||||
|
+$grey-300: red;
|
||||||
|
+$grey-350: red;
|
||||||
|
+$grey-400: red;
|
||||||
|
+$grey-450: red;
|
||||||
|
+$grey-500: red;
|
||||||
|
+$grey-550: red;
|
||||||
|
+$grey-600: red;
|
||||||
|
+$grey-650: #{{ palette.base.hex }};
|
||||||
|
+$grey-700: #{{ palette.base.hex }};
|
||||||
|
+$grey-750: #{{ palette.mantle.hex }};
|
||||||
|
+$grey-800: #{{ palette.text.hex }};
|
||||||
|
+$grey-850: #020202;
|
||||||
|
+$grey-900: #010101;
|
||||||
|
+$grey-950: #000000;
|
||||||
|
{%- endif %}
|
||||||
+
|
+
|
||||||
+// White
|
+// White
|
||||||
+$white: #FFFFFF;
|
+$white: #eff1f5;
|
||||||
+
|
+
|
||||||
+// Black
|
+// Black
|
||||||
+$black: #000000;
|
+$black: #11111b;
|
||||||
+
|
+
|
||||||
+// Button
|
+// Button
|
||||||
+$button-close: #{{ palette.red.hex }};
|
+$button-close: #{{ palette.red.hex }};
|
||||||
@@ -84,4 +121,3 @@ index 00000000..8a905942
|
|||||||
+// Theme
|
+// Theme
|
||||||
+$default-light: $purple-light;
|
+$default-light: $purple-light;
|
||||||
+$default-dark: $purple-dark;
|
+$default-dark: $purple-dark;
|
||||||
{{ '' }}
|
|
@@ -1,9 +1,24 @@
|
|||||||
diff --git a/src/sass/_color-palette-catppuccin-frappe.scss b/src/sass/_color-palette-catppuccin-frappe.scss
|
diff --git a/src/sass/_color-palette-catppuccin-frappe.scss b/src/sass/_color-palette-catppuccin-frappe.scss
|
||||||
new file mode 100644
|
new file mode 100644
|
||||||
index 00000000..8a905942
|
index 00000000..4ff0da0d
|
||||||
--- /dev/null
|
--- /dev/null
|
||||||
+++ b/src/sass/_color-palette-catppuccin-frappe.scss
|
+++ b/src/sass/_color-palette-catppuccin-frappe.scss
|
||||||
@@ -0,0 +1,72 @@
|
@@ -0,0 +1,87 @@
|
||||||
|
+ // Our accents
|
||||||
|
+ $rosewater: #f2d5cf;
|
||||||
|
+ $flamingo: #eebebe;
|
||||||
|
+ $pink: #f4b8e4;
|
||||||
|
+ $mauve: #ca9ee6;
|
||||||
|
+ $red: #e78284;
|
||||||
|
+ $maroon: #ea999c;
|
||||||
|
+ $peach: #ef9f76;
|
||||||
|
+ $yellow: #e5c890;
|
||||||
|
+ $green: #a6d189;
|
||||||
|
+ $teal: #81c8be;
|
||||||
|
+ $sky: #99d1db;
|
||||||
|
+ $sapphire: #85c1dc;
|
||||||
|
+ $blue: #8caaee;
|
||||||
|
+ $lavender: #babbf1;
|
||||||
+// Default Theme Color Palette
|
+// Default Theme Color Palette
|
||||||
+
|
+
|
||||||
+// Red
|
+// Red
|
||||||
@@ -39,31 +54,31 @@ index 00000000..8a905942
|
|||||||
+$orange-dark: #ef9f76;
|
+$orange-dark: #ef9f76;
|
||||||
+
|
+
|
||||||
+// Grey
|
+// Grey
|
||||||
+$grey-050: #c6d0f5;
|
+$grey-050: #949cbb;
|
||||||
+$grey-100: #b5bfe2;
|
+$grey-100: #838ba7;
|
||||||
+$grey-150: #b5bfe2;
|
+$grey-150: #737994;
|
||||||
+$grey-200: #a5adce;
|
+$grey-200: #626880;
|
||||||
+$grey-250: #a5adce;
|
+$grey-250: #51576d;
|
||||||
+$grey-300: #838ba7;
|
+$grey-300: red;
|
||||||
+$grey-350: #838ba7;
|
+$grey-350: red;
|
||||||
+$grey-400: #737994;
|
+$grey-400: red;
|
||||||
+$grey-450: #737994;
|
+$grey-450: red;
|
||||||
+$grey-500: #626880;
|
+$grey-500: red;
|
||||||
+$grey-550: #626880;
|
+$grey-550: red;
|
||||||
+$grey-600: #51576d;
|
+$grey-600: red;
|
||||||
+$grey-650: #51576d;
|
+$grey-650: #414559;
|
||||||
+$grey-700: #414559;
|
+$grey-700: #303446;
|
||||||
+$grey-750: #414559;
|
+$grey-750: #292c3c;
|
||||||
+$grey-800: #303446;
|
+$grey-800: #232634;
|
||||||
+$grey-850: #303446;
|
+$grey-850: #020202;
|
||||||
+$grey-900: #232634;
|
+$grey-900: #010101;
|
||||||
+$grey-950: #232634;
|
+$grey-950: #000000;
|
||||||
+
|
+
|
||||||
+// White
|
+// White
|
||||||
+$white: #FFFFFF;
|
+$white: #eff1f5;
|
||||||
+
|
+
|
||||||
+// Black
|
+// Black
|
||||||
+$black: #000000;
|
+$black: #11111b;
|
||||||
+
|
+
|
||||||
+// Button
|
+// Button
|
||||||
+$button-close: #e78284;
|
+$button-close: #e78284;
|
||||||
|
@@ -1,9 +1,24 @@
|
|||||||
diff --git a/src/sass/_color-palette-catppuccin-latte.scss b/src/sass/_color-palette-catppuccin-latte.scss
|
diff --git a/src/sass/_color-palette-catppuccin-latte.scss b/src/sass/_color-palette-catppuccin-latte.scss
|
||||||
new file mode 100644
|
new file mode 100644
|
||||||
index 00000000..8a905942
|
index 00000000..4ff0da0d
|
||||||
--- /dev/null
|
--- /dev/null
|
||||||
+++ b/src/sass/_color-palette-catppuccin-latte.scss
|
+++ b/src/sass/_color-palette-catppuccin-latte.scss
|
||||||
@@ -0,0 +1,72 @@
|
@@ -0,0 +1,87 @@
|
||||||
|
+ // Our accents
|
||||||
|
+ $rosewater: #dc8a78;
|
||||||
|
+ $flamingo: #dd7878;
|
||||||
|
+ $pink: #ea76cb;
|
||||||
|
+ $mauve: #8839ef;
|
||||||
|
+ $red: #d20f39;
|
||||||
|
+ $maroon: #e64553;
|
||||||
|
+ $peach: #fe640b;
|
||||||
|
+ $yellow: #df8e1d;
|
||||||
|
+ $green: #40a02b;
|
||||||
|
+ $teal: #179299;
|
||||||
|
+ $sky: #04a5e5;
|
||||||
|
+ $sapphire: #209fb5;
|
||||||
|
+ $blue: #1e66f5;
|
||||||
|
+ $lavender: #7287fd;
|
||||||
+// Default Theme Color Palette
|
+// Default Theme Color Palette
|
||||||
+
|
+
|
||||||
+// Red
|
+// Red
|
||||||
@@ -39,31 +54,31 @@ index 00000000..8a905942
|
|||||||
+$orange-dark: #fe640b;
|
+$orange-dark: #fe640b;
|
||||||
+
|
+
|
||||||
+// Grey
|
+// Grey
|
||||||
+$grey-050: #4c4f69;
|
+$grey-050: #dce0e8;
|
||||||
+$grey-100: #5c5f77;
|
+$grey-100: #e6e9ef;
|
||||||
+$grey-150: #5c5f77;
|
+$grey-150: #eff1f5;
|
||||||
+$grey-200: #6c6f85;
|
+$grey-200: #ccd0da;
|
||||||
+$grey-250: #6c6f85;
|
+$grey-250: #bcc0cc;
|
||||||
+$grey-300: #8c8fa1;
|
+$grey-300: red;
|
||||||
+$grey-350: #8c8fa1;
|
+$grey-350: red;
|
||||||
+$grey-400: #9ca0b0;
|
+$grey-400: red;
|
||||||
+$grey-450: #9ca0b0;
|
+$grey-450: red;
|
||||||
+$grey-500: #acb0be;
|
+$grey-500: red;
|
||||||
+$grey-550: #acb0be;
|
+$grey-550: red;
|
||||||
+$grey-600: #bcc0cc;
|
+$grey-600: red;
|
||||||
+$grey-650: #bcc0cc;
|
+$grey-650: #eff1f5;
|
||||||
+$grey-700: #ccd0da;
|
+$grey-700: #eff1f5;
|
||||||
+$grey-750: #ccd0da;
|
+$grey-750: #e6e9ef;
|
||||||
+$grey-800: #eff1f5;
|
+$grey-800: #4c4f69;
|
||||||
+$grey-850: #eff1f5;
|
+$grey-850: #020202;
|
||||||
+$grey-900: #dce0e8;
|
+$grey-900: #010101;
|
||||||
+$grey-950: #dce0e8;
|
+$grey-950: #000000;
|
||||||
+
|
+
|
||||||
+// White
|
+// White
|
||||||
+$white: #FFFFFF;
|
+$white: #eff1f5;
|
||||||
+
|
+
|
||||||
+// Black
|
+// Black
|
||||||
+$black: #000000;
|
+$black: #11111b;
|
||||||
+
|
+
|
||||||
+// Button
|
+// Button
|
||||||
+$button-close: #d20f39;
|
+$button-close: #d20f39;
|
||||||
|
@@ -1,9 +1,24 @@
|
|||||||
diff --git a/src/sass/_color-palette-catppuccin-macchiato.scss b/src/sass/_color-palette-catppuccin-macchiato.scss
|
diff --git a/src/sass/_color-palette-catppuccin-macchiato.scss b/src/sass/_color-palette-catppuccin-macchiato.scss
|
||||||
new file mode 100644
|
new file mode 100644
|
||||||
index 00000000..8a905942
|
index 00000000..4ff0da0d
|
||||||
--- /dev/null
|
--- /dev/null
|
||||||
+++ b/src/sass/_color-palette-catppuccin-macchiato.scss
|
+++ b/src/sass/_color-palette-catppuccin-macchiato.scss
|
||||||
@@ -0,0 +1,72 @@
|
@@ -0,0 +1,87 @@
|
||||||
|
+ // Our accents
|
||||||
|
+ $rosewater: #f4dbd6;
|
||||||
|
+ $flamingo: #f0c6c6;
|
||||||
|
+ $pink: #f5bde6;
|
||||||
|
+ $mauve: #c6a0f6;
|
||||||
|
+ $red: #ed8796;
|
||||||
|
+ $maroon: #ee99a0;
|
||||||
|
+ $peach: #f5a97f;
|
||||||
|
+ $yellow: #eed49f;
|
||||||
|
+ $green: #a6da95;
|
||||||
|
+ $teal: #8bd5ca;
|
||||||
|
+ $sky: #91d7e3;
|
||||||
|
+ $sapphire: #7dc4e4;
|
||||||
|
+ $blue: #8aadf4;
|
||||||
|
+ $lavender: #b7bdf8;
|
||||||
+// Default Theme Color Palette
|
+// Default Theme Color Palette
|
||||||
+
|
+
|
||||||
+// Red
|
+// Red
|
||||||
@@ -39,31 +54,31 @@ index 00000000..8a905942
|
|||||||
+$orange-dark: #f5a97f;
|
+$orange-dark: #f5a97f;
|
||||||
+
|
+
|
||||||
+// Grey
|
+// Grey
|
||||||
+$grey-050: #cad3f5;
|
+$grey-050: #939ab7;
|
||||||
+$grey-100: #b8c0e0;
|
+$grey-100: #8087a2;
|
||||||
+$grey-150: #b8c0e0;
|
+$grey-150: #6e738d;
|
||||||
+$grey-200: #a5adcb;
|
+$grey-200: #5b6078;
|
||||||
+$grey-250: #a5adcb;
|
+$grey-250: #494d64;
|
||||||
+$grey-300: #8087a2;
|
+$grey-300: red;
|
||||||
+$grey-350: #8087a2;
|
+$grey-350: red;
|
||||||
+$grey-400: #6e738d;
|
+$grey-400: red;
|
||||||
+$grey-450: #6e738d;
|
+$grey-450: red;
|
||||||
+$grey-500: #5b6078;
|
+$grey-500: red;
|
||||||
+$grey-550: #5b6078;
|
+$grey-550: red;
|
||||||
+$grey-600: #494d64;
|
+$grey-600: red;
|
||||||
+$grey-650: #494d64;
|
+$grey-650: #363a4f;
|
||||||
+$grey-700: #363a4f;
|
+$grey-700: #24273a;
|
||||||
+$grey-750: #363a4f;
|
+$grey-750: #1e2030;
|
||||||
+$grey-800: #24273a;
|
+$grey-800: #181926;
|
||||||
+$grey-850: #24273a;
|
+$grey-850: #020202;
|
||||||
+$grey-900: #181926;
|
+$grey-900: #010101;
|
||||||
+$grey-950: #181926;
|
+$grey-950: #000000;
|
||||||
+
|
+
|
||||||
+// White
|
+// White
|
||||||
+$white: #FFFFFF;
|
+$white: #eff1f5;
|
||||||
+
|
+
|
||||||
+// Black
|
+// Black
|
||||||
+$black: #000000;
|
+$black: #11111b;
|
||||||
+
|
+
|
||||||
+// Button
|
+// Button
|
||||||
+$button-close: #ed8796;
|
+$button-close: #ed8796;
|
||||||
|
@@ -1,9 +1,24 @@
|
|||||||
diff --git a/src/sass/_color-palette-catppuccin-mocha.scss b/src/sass/_color-palette-catppuccin-mocha.scss
|
diff --git a/src/sass/_color-palette-catppuccin-mocha.scss b/src/sass/_color-palette-catppuccin-mocha.scss
|
||||||
new file mode 100644
|
new file mode 100644
|
||||||
index 00000000..8a905942
|
index 00000000..4ff0da0d
|
||||||
--- /dev/null
|
--- /dev/null
|
||||||
+++ b/src/sass/_color-palette-catppuccin-mocha.scss
|
+++ b/src/sass/_color-palette-catppuccin-mocha.scss
|
||||||
@@ -0,0 +1,72 @@
|
@@ -0,0 +1,87 @@
|
||||||
|
+ // Our accents
|
||||||
|
+ $rosewater: #f5e0dc;
|
||||||
|
+ $flamingo: #f2cdcd;
|
||||||
|
+ $pink: #f5c2e7;
|
||||||
|
+ $mauve: #cba6f7;
|
||||||
|
+ $red: #f38ba8;
|
||||||
|
+ $maroon: #eba0ac;
|
||||||
|
+ $peach: #fab387;
|
||||||
|
+ $yellow: #f9e2af;
|
||||||
|
+ $green: #a6e3a1;
|
||||||
|
+ $teal: #94e2d5;
|
||||||
|
+ $sky: #89dceb;
|
||||||
|
+ $sapphire: #74c7ec;
|
||||||
|
+ $blue: #89b4fa;
|
||||||
|
+ $lavender: #b4befe;
|
||||||
+// Default Theme Color Palette
|
+// Default Theme Color Palette
|
||||||
+
|
+
|
||||||
+// Red
|
+// Red
|
||||||
@@ -39,31 +54,31 @@ index 00000000..8a905942
|
|||||||
+$orange-dark: #fab387;
|
+$orange-dark: #fab387;
|
||||||
+
|
+
|
||||||
+// Grey
|
+// Grey
|
||||||
+$grey-050: #cdd6f4;
|
+$grey-050: #9399b2;
|
||||||
+$grey-100: #bac2de;
|
+$grey-100: #7f849c;
|
||||||
+$grey-150: #bac2de;
|
+$grey-150: #6c7086;
|
||||||
+$grey-200: #a6adc8;
|
+$grey-200: #585b70;
|
||||||
+$grey-250: #a6adc8;
|
+$grey-250: #45475a;
|
||||||
+$grey-300: #7f849c;
|
+$grey-300: red;
|
||||||
+$grey-350: #7f849c;
|
+$grey-350: red;
|
||||||
+$grey-400: #6c7086;
|
+$grey-400: red;
|
||||||
+$grey-450: #6c7086;
|
+$grey-450: red;
|
||||||
+$grey-500: #585b70;
|
+$grey-500: red;
|
||||||
+$grey-550: #585b70;
|
+$grey-550: red;
|
||||||
+$grey-600: #45475a;
|
+$grey-600: red;
|
||||||
+$grey-650: #45475a;
|
+$grey-650: #313244;
|
||||||
+$grey-700: #313244;
|
+$grey-700: #1e1e2e;
|
||||||
+$grey-750: #313244;
|
+$grey-750: #181825;
|
||||||
+$grey-800: #1e1e2e;
|
+$grey-800: #11111b;
|
||||||
+$grey-850: #1e1e2e;
|
+$grey-850: #020202;
|
||||||
+$grey-900: #11111b;
|
+$grey-900: #010101;
|
||||||
+$grey-950: #11111b;
|
+$grey-950: #000000;
|
||||||
+
|
+
|
||||||
+// White
|
+// White
|
||||||
+$white: #FFFFFF;
|
+$white: #eff1f5;
|
||||||
+
|
+
|
||||||
+// Black
|
+// Black
|
||||||
+$black: #000000;
|
+$black: #11111b;
|
||||||
+
|
+
|
||||||
+// Button
|
+// Button
|
||||||
+$button-close: #f38ba8;
|
+$button-close: #f38ba8;
|
||||||
|
46
patches/colloid/theme-func.patch
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
diff --git a/src/sass/_colors.scss b/src/sass/_colors.scss
|
||||||
|
index 8738bf37..71797c6d 100644
|
||||||
|
--- a/src/sass/_colors.scss
|
||||||
|
+++ b/src/sass/_colors.scss
|
||||||
|
@@ -58,27 +58,20 @@
|
||||||
|
}
|
||||||
|
|
||||||
|
@function theme($color) {
|
||||||
|
- @if ($variant == 'light') {
|
||||||
|
- @if ($theme == 'default') { @return $default-dark; }
|
||||||
|
- @if ($theme == 'purple') { @return $purple-dark; }
|
||||||
|
- @if ($theme == 'pink') { @return $pink-dark; }
|
||||||
|
- @if ($theme == 'red') { @return $red-dark; }
|
||||||
|
- @if ($theme == 'orange') { @return $orange-dark; }
|
||||||
|
- @if ($theme == 'yellow') { @return $yellow-dark; }
|
||||||
|
- @if ($theme == 'green') { @return $green-dark; }
|
||||||
|
- @if ($theme == 'teal') { @return $teal-dark; }
|
||||||
|
- @if ($theme == 'grey') { @return $grey-600; }
|
||||||
|
- } @else {
|
||||||
|
- @if ($theme == 'default') { @return $default-light; }
|
||||||
|
- @if ($theme == 'purple') { @return $purple-light; }
|
||||||
|
- @if ($theme == 'pink') { @return $pink-light; }
|
||||||
|
- @if ($theme == 'red') { @return $red-light; }
|
||||||
|
- @if ($theme == 'orange') { @return $orange-light; }
|
||||||
|
- @if ($theme == 'yellow') { @return $yellow-light; }
|
||||||
|
- @if ($theme == 'green') { @return $green-light; }
|
||||||
|
- @if ($theme == 'teal') { @return $teal-light; }
|
||||||
|
- @if ($theme == 'grey') { @return $grey-200; }
|
||||||
|
- }
|
||||||
|
+ @if ($theme == 'rosewater') { @return $rosewater; }
|
||||||
|
+ @if ($theme == 'flamingo') { @return $flamingo; }
|
||||||
|
+ @if ($theme == 'pink') { @return $pink; }
|
||||||
|
+ @if ($theme == 'mauve') { @return $mauve; }
|
||||||
|
+ @if ($theme == 'red') { @return $red; }
|
||||||
|
+ @if ($theme == 'maroon') { @return $maroon; }
|
||||||
|
+ @if ($theme == 'peach') { @return $peach; }
|
||||||
|
+ @if ($theme == 'yellow') { @return $yellow; }
|
||||||
|
+ @if ($theme == 'green') { @return $green; }
|
||||||
|
+ @if ($theme == 'teal') { @return $teal; }
|
||||||
|
+ @if ($theme == 'sky') { @return $sky; }
|
||||||
|
+ @if ($theme == 'sapphire') { @return $sapphire; }
|
||||||
|
+ @if ($theme == 'blue') { @return $blue; }
|
||||||
|
+ @if ($theme == 'lavender') { @return $lavender; }
|
||||||
|
}
|
||||||
|
|
||||||
|
@function background($type) {
|
2
patches/xfwm4/.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
generated/
|
||||||
|
patched/
|
Before Width: | Height: | Size: 49 KiB |
Before Width: | Height: | Size: 60 KiB |
Before Width: | Height: | Size: 49 KiB |
Before Width: | Height: | Size: 60 KiB |
Before Width: | Height: | Size: 60 KiB |
Before Width: | Height: | Size: 49 KiB |
Before Width: | Height: | Size: 60 KiB |
Before Width: | Height: | Size: 60 KiB |
Before Width: | Height: | Size: 49 KiB |
Before Width: | Height: | Size: 49 KiB |
Before Width: | Height: | Size: 60 KiB |
Before Width: | Height: | Size: 49 KiB |
Before Width: | Height: | Size: 60 KiB After Width: | Height: | Size: 57 KiB |
Before Width: | Height: | Size: 49 KiB After Width: | Height: | Size: 47 KiB |
Before Width: | Height: | Size: 60 KiB After Width: | Height: | Size: 57 KiB |
Before Width: | Height: | Size: 49 KiB After Width: | Height: | Size: 46 KiB |
247
patches/xfwm4/generate_assets.py
Normal file
@@ -0,0 +1,247 @@
|
|||||||
|
from typing import List
|
||||||
|
from catppuccin import PALETTE
|
||||||
|
from catppuccin.models import Flavor
|
||||||
|
|
||||||
|
import re, os, shutil, subprocess, time
|
||||||
|
from dataclasses import dataclass
|
||||||
|
|
||||||
|
THIS_DIR = os.path.dirname(os.path.realpath(__file__))
|
||||||
|
|
||||||
|
INDEX = [
|
||||||
|
"close-active",
|
||||||
|
"close-inactive",
|
||||||
|
"close-prelight",
|
||||||
|
"close-pressed",
|
||||||
|
"hide-active",
|
||||||
|
"hide-inactive",
|
||||||
|
"hide-prelight",
|
||||||
|
"hide-pressed",
|
||||||
|
"maximize-active",
|
||||||
|
"maximize-inactive",
|
||||||
|
"maximize-prelight",
|
||||||
|
"maximize-pressed",
|
||||||
|
"maximize-toggled-active",
|
||||||
|
"maximize-toggled-inactive",
|
||||||
|
"maximize-toggled-prelight",
|
||||||
|
"maximize-toggled-pressed",
|
||||||
|
"menu-active",
|
||||||
|
"menu-inactive",
|
||||||
|
"menu-prelight",
|
||||||
|
"menu-pressed",
|
||||||
|
"shade-active",
|
||||||
|
"shade-inactive",
|
||||||
|
"shade-prelight",
|
||||||
|
"shade-pressed",
|
||||||
|
"shade-toggled-active",
|
||||||
|
"shade-toggled-inactive",
|
||||||
|
"shade-toggled-prelight",
|
||||||
|
"shade-toggled-pressed",
|
||||||
|
"stick-active",
|
||||||
|
"stick-inactive",
|
||||||
|
"stick-prelight",
|
||||||
|
"stick-pressed",
|
||||||
|
"stick-toggled-active",
|
||||||
|
"stick-toggled-inactive",
|
||||||
|
"stick-toggled-prelight",
|
||||||
|
"stick-toggled-pressed",
|
||||||
|
"title-1-active",
|
||||||
|
"title-1-inactive",
|
||||||
|
"title-2-active",
|
||||||
|
"title-2-inactive",
|
||||||
|
"title-3-active",
|
||||||
|
"title-3-inactive",
|
||||||
|
"title-4-active",
|
||||||
|
"title-4-inactive",
|
||||||
|
"title-5-active",
|
||||||
|
"title-5-inactive",
|
||||||
|
"top-left-active",
|
||||||
|
"top-left-inactive",
|
||||||
|
"top-right-active",
|
||||||
|
"top-right-inactive",
|
||||||
|
"left-active",
|
||||||
|
"left-inactive",
|
||||||
|
"right-active",
|
||||||
|
"right-inactive",
|
||||||
|
"bottom-active",
|
||||||
|
"bottom-inactive",
|
||||||
|
"bottom-left-active",
|
||||||
|
"bottom-left-inactive",
|
||||||
|
"bottom-right-active",
|
||||||
|
"bottom-right-inactive",
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
def subst_text(path, _from, to):
|
||||||
|
with open(path, "r+") as f:
|
||||||
|
content = f.read()
|
||||||
|
f.seek(0)
|
||||||
|
f.truncate()
|
||||||
|
f.write(re.sub(_from, to, content))
|
||||||
|
|
||||||
|
|
||||||
|
def generate_for_flavor(flavor: Flavor):
|
||||||
|
# Setup the palette
|
||||||
|
palette = flavor.colors
|
||||||
|
|
||||||
|
close_color=f'#{palette.red.hex}'
|
||||||
|
max_color=f'#{palette.green.hex}'
|
||||||
|
min_color=f'#{palette.yellow.hex}'
|
||||||
|
|
||||||
|
# We expand the source assets into the 4 flavors, but need to map between
|
||||||
|
# Their definition of dark and ours. This means that latte will get the -light assets
|
||||||
|
# and the rest get the -dark assets to work from
|
||||||
|
color = "-dark"
|
||||||
|
if not flavor.dark:
|
||||||
|
color = "-light"
|
||||||
|
|
||||||
|
# Make a directory for our patched SVGs to live in before compilation
|
||||||
|
odir = f"{THIS_DIR}/patched"
|
||||||
|
os.makedirs(odir, exist_ok=True)
|
||||||
|
|
||||||
|
# Copy the base assets into the output
|
||||||
|
shutil.copy(
|
||||||
|
f"{THIS_DIR}/assets{color}.svg",
|
||||||
|
f"{odir}/assets-catppuccin-{flavor.identifier}.svg",
|
||||||
|
)
|
||||||
|
shutil.copy(
|
||||||
|
f"{THIS_DIR}/assets{color}-normal.svg",
|
||||||
|
f"{odir}/assets-catppuccin-{flavor.identifier}-normal.svg",
|
||||||
|
)
|
||||||
|
|
||||||
|
# Patch all the SVGs
|
||||||
|
path = f"{odir}/assets-catppuccin-{flavor.identifier}-normal.svg"
|
||||||
|
subst_text(path, "#fd5f51", close_color)
|
||||||
|
subst_text(path, "#38c76a", max_color)
|
||||||
|
subst_text(path, "#fdbe04", min_color)
|
||||||
|
|
||||||
|
headerbar = palette.base.hex
|
||||||
|
headerbar_backdrop = palette.mantle.hex
|
||||||
|
|
||||||
|
if flavor.dark:
|
||||||
|
path = f"{odir}/assets-catppuccin-{flavor.identifier}.svg"
|
||||||
|
subst_text(path, "#242424", headerbar)
|
||||||
|
subst_text(path, "#2c2c2c", headerbar_backdrop)
|
||||||
|
|
||||||
|
path = f"{odir}/assets-catppuccin-{flavor.identifier}-normal.svg"
|
||||||
|
subst_text(path, "#242424", headerbar)
|
||||||
|
subst_text(path, "#2c2c2c", headerbar_backdrop)
|
||||||
|
else:
|
||||||
|
path = f"{odir}/assets-catppuccin-{flavor.identifier}.svg"
|
||||||
|
subst_text(path, "#f2f2f2", headerbar)
|
||||||
|
subst_text(path, "#fafafa", headerbar_backdrop)
|
||||||
|
|
||||||
|
path = f"{odir}/assets-catppuccin-{flavor.identifier}-normal.svg"
|
||||||
|
subst_text(path, "#f2f2f2", headerbar)
|
||||||
|
subst_text(path, "#fafafa", headerbar_backdrop)
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class WorkerInput:
|
||||||
|
output_path: str
|
||||||
|
output_dir: str
|
||||||
|
input_path: str
|
||||||
|
dpi: str
|
||||||
|
ident: str
|
||||||
|
|
||||||
|
|
||||||
|
def call_subprocesses(inp: WorkerInput):
|
||||||
|
inkscape = "inkscape"
|
||||||
|
optipng = "optipng"
|
||||||
|
|
||||||
|
return [
|
||||||
|
subprocess.Popen(
|
||||||
|
[
|
||||||
|
# FIXME: https://gitlab.com/inkscape/inkscape/-/issues/4716#note_1882967469Z
|
||||||
|
"unshare",
|
||||||
|
"--user",
|
||||||
|
inkscape,
|
||||||
|
"--export-id",
|
||||||
|
inp.ident,
|
||||||
|
"--export-id-only",
|
||||||
|
"--export-dpi",
|
||||||
|
inp.dpi,
|
||||||
|
"--export-filename",
|
||||||
|
inp.output_path,
|
||||||
|
inp.input_path,
|
||||||
|
],
|
||||||
|
stdout=subprocess.DEVNULL,
|
||||||
|
stderr=subprocess.STDOUT,
|
||||||
|
),
|
||||||
|
subprocess.Popen(
|
||||||
|
[optipng, "-o7", "--quiet", inp.output_path],
|
||||||
|
stdout=subprocess.DEVNULL,
|
||||||
|
stderr=subprocess.STDOUT,
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class RenderState:
|
||||||
|
tasks: List[subprocess.Popen]
|
||||||
|
input_root: str
|
||||||
|
output_root: str
|
||||||
|
|
||||||
|
|
||||||
|
screen_to_dpi = {
|
||||||
|
"-hdpi": "144",
|
||||||
|
"-xhdpi": "192",
|
||||||
|
}
|
||||||
|
|
||||||
|
def render_for_screen(state: RenderState, flavor: Flavor, screen: str, ident: str):
|
||||||
|
# NOTE: We do not generate for the -normal variant currently, that would just be
|
||||||
|
# a stupid amount of compute and time for little benefit
|
||||||
|
src_file = f"{state.input_root}/assets-catppuccin-{flavor.identifier}.svg"
|
||||||
|
|
||||||
|
output_dir = f"{state.output_root}/assets-catppuccin-{flavor.identifier}{screen}"
|
||||||
|
output_path = f"{output_dir}/{ident}.png"
|
||||||
|
|
||||||
|
dpi = screen_to_dpi.get(screen, "96")
|
||||||
|
|
||||||
|
os.makedirs(output_dir, exist_ok=True)
|
||||||
|
|
||||||
|
if os.path.exists(output_path):
|
||||||
|
print(f"Skipping '{output_path}', already generated")
|
||||||
|
else:
|
||||||
|
new_tasks = call_subprocesses(
|
||||||
|
WorkerInput(
|
||||||
|
output_path=output_path,
|
||||||
|
output_dir=output_dir,
|
||||||
|
input_path=src_file,
|
||||||
|
dpi=dpi,
|
||||||
|
ident=ident,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
state.tasks.extend(new_tasks)
|
||||||
|
|
||||||
|
|
||||||
|
def render_for_flavor(flavor: Flavor, state: RenderState):
|
||||||
|
print(
|
||||||
|
f"Starting render tasks for {flavor.identifier}"
|
||||||
|
)
|
||||||
|
for ident in INDEX:
|
||||||
|
render_for_screen(state=state, flavor=flavor, screen="", ident=ident)
|
||||||
|
render_for_screen(state=state, flavor=flavor, screen="-hdpi", ident=ident)
|
||||||
|
render_for_screen(state=state, flavor=flavor, screen="-xhdpi", ident=ident)
|
||||||
|
|
||||||
|
|
||||||
|
generate_for_flavor(PALETTE.mocha)
|
||||||
|
generate_for_flavor(PALETTE.latte)
|
||||||
|
generate_for_flavor(PALETTE.macchiato)
|
||||||
|
generate_for_flavor(PALETTE.frappe)
|
||||||
|
|
||||||
|
state = RenderState(
|
||||||
|
tasks=[], input_root=f"{THIS_DIR}/patched", output_root=f"{THIS_DIR}/generated"
|
||||||
|
)
|
||||||
|
start_time = time.time()
|
||||||
|
|
||||||
|
render_for_flavor(PALETTE.mocha, state)
|
||||||
|
render_for_flavor(PALETTE.latte, state)
|
||||||
|
render_for_flavor(PALETTE.macchiato, state)
|
||||||
|
render_for_flavor(PALETTE.frappe, state)
|
||||||
|
|
||||||
|
for task in state.tasks:
|
||||||
|
task.wait()
|
||||||
|
|
||||||
|
end_time = time.time() - start_time
|
||||||
|
print(f"Generation complete in {end_time} seconds")
|
||||||
|
shutil.rmtree(state.input_root)
|
15
release-please-config.json
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
{
|
||||||
|
"last-release-sha": "8b54c05ff5de6c7fabc68fab410cfd093a91193c",
|
||||||
|
"draft": true,
|
||||||
|
"packages": {
|
||||||
|
".": {
|
||||||
|
"package-name": "",
|
||||||
|
"release-type": "simple",
|
||||||
|
"extra-files": [
|
||||||
|
{ "type": "generic", "path": "README.md" },
|
||||||
|
{ "type": "generic", "path": "install.py" }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json"
|
||||||
|
}
|